UNPKG

6.14 kBJavaScriptView Raw
1/*syn@0.14.0#mouse*/
2var syn = require('./synthetic.js');
3var h = syn.helpers, getWin = h.getWindow;
4syn.mouse = {};
5h.extend(syn.defaults, {
6 mousedown: function (options) {
7 syn.trigger(this, 'focus', {});
8 },
9 click: function () {
10 var element = this, href, type, createChange, radioChanged, nodeName, scope;
11 try {
12 href = element.href;
13 type = element.type;
14 createChange = syn.data(element, 'createChange');
15 radioChanged = syn.data(element, 'radioChanged');
16 scope = getWin(element);
17 nodeName = element.nodeName.toLowerCase();
18 } catch (e) {
19 return;
20 }
21 if (!syn.support.linkHrefJS && /^\s*javascript:/.test(href)) {
22 var code = href.replace(/^\s*javascript:/, '');
23 if (code !== '//' && code.indexOf('void(0)') === -1) {
24 if (window.selenium) {
25 eval('with(selenium.browserbot.getCurrentWindow()){' + code + '}');
26 } else {
27 eval('with(scope){' + code + '}');
28 }
29 }
30 }
31 if (!syn.support.clickSubmits && ((nodeName === 'input' || nodeName === 'button') && type === 'submit')) {
32 var form = syn.closest(element, 'form');
33 if (form) {
34 syn.trigger(form, 'submit', {});
35 }
36 }
37 if (nodeName === 'a' && element.href && !/^\s*javascript:/.test(href)) {
38 scope.location.href = href;
39 }
40 if (nodeName === 'input' && type === 'checkbox') {
41 if (!syn.support.clickChanges) {
42 syn.trigger(element, 'change', {});
43 }
44 }
45 if (nodeName === 'input' && type === 'radio') {
46 if (radioChanged && !syn.support.radioClickChanges) {
47 syn.trigger(element, 'change', {});
48 }
49 }
50 if (nodeName === 'option' && createChange) {
51 syn.trigger(element.parentNode, 'change', {});
52 syn.data(element, 'createChange', false);
53 }
54 }
55});
56h.extend(syn.create, {
57 mouse: {
58 options: function (type, options, element) {
59 var doc = document.documentElement, body = document.body, center = [
60 options.pageX || 0,
61 options.pageY || 0
62 ], left = syn.mouse.browser && syn.mouse.browser.left[type], right = syn.mouse.browser && syn.mouse.browser.right[type];
63 return h.extend({
64 bubbles: true,
65 cancelable: true,
66 view: window,
67 detail: 1,
68 screenX: 1,
69 screenY: 1,
70 clientX: options.clientX || center[0] - (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0),
71 clientY: options.clientY || center[1] - (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0),
72 ctrlKey: !!syn.key.ctrlKey,
73 altKey: !!syn.key.altKey,
74 shiftKey: !!syn.key.shiftKey,
75 metaKey: !!syn.key.metaKey,
76 button: left && left.button !== null ? left.button : right && right.button || (type === 'contextmenu' ? 2 : 0),
77 relatedTarget: document.documentElement
78 }, options);
79 },
80 event: function (type, defaults, element) {
81 var doc = getWin(element).document || document, event;
82 if (doc.createEvent) {
83 try {
84 event = doc.createEvent('MouseEvents');
85 event.initMouseEvent(type, defaults.bubbles, defaults.cancelable, defaults.view, defaults.detail, defaults.screenX, defaults.screenY, defaults.clientX, defaults.clientY, defaults.ctrlKey, defaults.altKey, defaults.shiftKey, defaults.metaKey, defaults.button, defaults.relatedTarget);
86 } catch (e) {
87 event = h.createBasicStandardEvent(type, defaults, doc);
88 }
89 event.synthetic = true;
90 return event;
91 } else {
92 try {
93 event = h.createEventObject(type, defaults, element);
94 } catch (e) {
95 }
96 return event;
97 }
98 }
99 },
100 click: {
101 setup: function (type, options, element) {
102 var nodeName = element.nodeName.toLowerCase();
103 if (!syn.support.clickChecks && !syn.support.changeChecks && nodeName === 'input') {
104 type = element.type.toLowerCase();
105 if (type === 'checkbox') {
106 element.checked = !element.checked;
107 }
108 if (type === 'radio') {
109 if (!element.checked) {
110 try {
111 syn.data(element, 'radioChanged', true);
112 } catch (e) {
113 }
114 element.checked = true;
115 }
116 }
117 }
118 if (nodeName === 'a' && element.href && !/^\s*javascript:/.test(element.href)) {
119 syn.data(element, 'href', element.href);
120 }
121 if (/option/i.test(element.nodeName)) {
122 var child = element.parentNode.firstChild, i = -1;
123 while (child) {
124 if (child.nodeType === 1) {
125 i++;
126 if (child === element) {
127 break;
128 }
129 }
130 child = child.nextSibling;
131 }
132 if (i !== element.parentNode.selectedIndex) {
133 element.parentNode.selectedIndex = i;
134 syn.data(element, 'createChange', true);
135 }
136 }
137 }
138 },
139 mousedown: {
140 setup: function (type, options, element) {
141 var nn = element.nodeName.toLowerCase();
142 if (syn.browser.safari && (nn === 'select' || nn === 'option')) {
143 options._autoPrevent = true;
144 }
145 }
146 }
147});
\No newline at end of file