|
1 function test() { |
|
2 waitForExplicitFinish(); |
|
3 |
|
4 let secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"] |
|
5 .getService(Components.interfaces |
|
6 .nsIScriptSecurityManager); |
|
7 |
|
8 let fm = Components.classes["@mozilla.org/focus-manager;1"] |
|
9 .getService(Components.interfaces.nsIFocusManager); |
|
10 |
|
11 let tabs = [ gBrowser.addTab(), gBrowser.addTab() ]; |
|
12 gBrowser.selectedTab = tabs[0]; |
|
13 |
|
14 let testingList = [ |
|
15 { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').focus(); }, 10);\"><input id='target'></body>", |
|
16 tagName: "INPUT", methodName: "focus" }, |
|
17 { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').select(); }, 10);\"><input id='target'></body>", |
|
18 tagName: "INPUT", methodName: "select" }, |
|
19 { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').focus(); }, 10);\"><a href='about:blank' id='target'>anchor</a></body>", |
|
20 tagName: "A", methodName: "focus" }, |
|
21 { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').focus(); }, 10);\"><button id='target'>button</button></body>", |
|
22 tagName: "BUTTON", methodName: "focus" }, |
|
23 { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').focus(); }, 10);\"><select id='target'><option>item1</option></select></body>", |
|
24 tagName: "SELECT", methodName: "focus" }, |
|
25 { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').focus(); }, 10);\"><textarea id='target'>textarea</textarea></body>", |
|
26 tagName: "TEXTAREA", methodName: "focus" }, |
|
27 { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').select(); }, 10);\"><textarea id='target'>textarea</textarea></body>", |
|
28 tagName: "TEXTAREA", methodName: "select" }, |
|
29 { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').focus(); }, 10);\"><label id='target'><input></label></body>", |
|
30 tagName: "INPUT", methodName: "focus of label element" }, |
|
31 { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').focus(); }, 10);\"><fieldset><legend id='target'>legend</legend><input></fieldset></body>", |
|
32 tagName: "INPUT", methodName: "focus of legend element" }, |
|
33 { uri: "data:text/html,<body onload=\"setTimeout(function () {" + |
|
34 " var element = document.getElementById('target');" + |
|
35 " var event = document.createEvent('MouseEvent');" + |
|
36 " event.initMouseEvent('click', true, true, window," + |
|
37 " 1, 0, 0, 0, 0, false, false, false, false, 0, element);" + |
|
38 " element.dispatchEvent(event); }, 10);\">" + |
|
39 "<label id='target'><input></label></body>", |
|
40 tagName: "INPUT", methodName: "click event on the label element" }, |
|
41 ]; |
|
42 |
|
43 if (navigator.platform.indexOf("Mac") == -1) { |
|
44 // clicking buttons doesn't focus on mac, so skip this test |
|
45 testingList.push( |
|
46 { uri: "data:text/html,<body onload=\"setTimeout(function () {" + |
|
47 " var element = document.getElementById('target');" + |
|
48 " var event = document.createEvent('MouseEvent');" + |
|
49 " event.initMouseEvent('mousedown', true, true, window," + |
|
50 " 0, 0, 0, 0, 0, false, false, false, false, 0, element);" + |
|
51 " element.dispatchEvent(event); }, 10);\">" + |
|
52 "<button id='target'>button</button></body>", |
|
53 tagName: "BUTTON", methodName: "mousedown event on the button element" }); |
|
54 } |
|
55 |
|
56 let testingIndex = -1; |
|
57 let canRetry; |
|
58 let callback; |
|
59 let loadedCount; |
|
60 let setFocusToChrome; |
|
61 |
|
62 function runNextTest() { |
|
63 if (++testingIndex >= testingList.length) { |
|
64 // cleaning-up... |
|
65 for (let i = 0; i < tabs.length; i++) { |
|
66 gBrowser.removeTab(tabs[i]); |
|
67 } |
|
68 finish(); |
|
69 return; |
|
70 } |
|
71 callback = doTest1; |
|
72 loadTestPage(false); |
|
73 } |
|
74 |
|
75 function loadTestPage(aSetFocusToChrome) { |
|
76 loadedCount = 0; |
|
77 canRetry = 10; |
|
78 setFocusToChrome = aSetFocusToChrome; |
|
79 // Set the focus to the contents. |
|
80 tabs[0].linkedBrowser.focus(); |
|
81 // Load on the tabs |
|
82 tabs[0].linkedBrowser.addEventListener("load", onLoadForegroundTab, true); |
|
83 tabs[0].linkedBrowser.loadURI(testingList[testingIndex].uri); |
|
84 tabs[1].linkedBrowser.addEventListener("load", onLoadBackgroundTab, true); |
|
85 tabs[1].linkedBrowser.loadURI(testingList[testingIndex].uri); |
|
86 } |
|
87 |
|
88 function onLoadForegroundTab() { |
|
89 tabs[0].linkedBrowser.removeEventListener("load", onLoadForegroundTab, true); |
|
90 if (setFocusToChrome) { |
|
91 // Set focus to a chrome element before the loaded content tries to move |
|
92 // focus. |
|
93 document.getElementById("urlbar").focus(); |
|
94 } |
|
95 onLoadComplete(); |
|
96 } |
|
97 |
|
98 function onLoadBackgroundTab() { |
|
99 tabs[1].linkedBrowser.removeEventListener("load", onLoadBackgroundTab, true); |
|
100 onLoadComplete(); |
|
101 } |
|
102 |
|
103 function onLoadComplete() { |
|
104 if (++loadedCount == tabs.length) { |
|
105 setTimeout(callback, 20); |
|
106 } |
|
107 } |
|
108 |
|
109 function isPrepared() { |
|
110 for (let i = 0; i < tabs.length; i++) { |
|
111 if (tabs[i].linkedBrowser.contentDocument.activeElement.tagName != |
|
112 testingList[testingIndex].tagName) { |
|
113 return false; |
|
114 } |
|
115 } |
|
116 return true; |
|
117 } |
|
118 |
|
119 function doTest1() { |
|
120 if (canRetry-- > 0 && !isPrepared()) { |
|
121 setTimeout(callback, 10); // retry |
|
122 return; |
|
123 } |
|
124 |
|
125 // The contents should be able to steal the focus from content. |
|
126 |
|
127 // in foreground tab |
|
128 let e = tabs[0].linkedBrowser.contentDocument.activeElement; |
|
129 is(e.tagName, testingList[testingIndex].tagName, |
|
130 "the foreground tab's " + testingList[testingIndex].tagName + |
|
131 " element is not active by the " + testingList[testingIndex].methodName + |
|
132 " (Test1: content can steal focus)"); |
|
133 is(fm.focusedElement, e, |
|
134 "the " + testingList[testingIndex].tagName + |
|
135 " element isn't focused by the " + testingList[testingIndex].methodName + |
|
136 " (Test1: content can steal focus)"); |
|
137 |
|
138 // in background tab |
|
139 e = tabs[1].linkedBrowser.contentDocument.activeElement; |
|
140 is(e.tagName, testingList[testingIndex].tagName, |
|
141 "the background tab's " + testingList[testingIndex].tagName + |
|
142 " element is not active by the " + testingList[testingIndex].methodName + |
|
143 " (Test1: content can steal focus)"); |
|
144 isnot(fm.focusedElement, e, |
|
145 "the " + testingList[testingIndex].tagName + |
|
146 " element is focused by the " + testingList[testingIndex].methodName + |
|
147 " (Test1: content can steal focus)"); |
|
148 |
|
149 callback = doTest2; |
|
150 loadTestPage(true); |
|
151 } |
|
152 |
|
153 |
|
154 function doTest2() { |
|
155 if (canRetry-- > 0 && !isPrepared()) { |
|
156 setTimeout(callback, 10); // retry |
|
157 return; |
|
158 } |
|
159 |
|
160 // The contents shouldn't be able to steal the focus from chrome. |
|
161 |
|
162 // in foreground tab |
|
163 let e = tabs[0].linkedBrowser.contentDocument.activeElement; |
|
164 is(e.tagName, testingList[testingIndex].tagName, |
|
165 "the foreground tab's " + testingList[testingIndex].tagName + |
|
166 " element is not active by the " + testingList[testingIndex].methodName + |
|
167 " (Test2: content can NOT steal focus)"); |
|
168 isnot(fm.focusedElement, e, |
|
169 "the " + testingList[testingIndex].tagName + |
|
170 " element is focused by the " + testingList[testingIndex].methodName + |
|
171 " (Test2: content can NOT steal focus)"); |
|
172 |
|
173 // in background tab |
|
174 e = tabs[1].linkedBrowser.contentDocument.activeElement; |
|
175 is(e.tagName, testingList[testingIndex].tagName, |
|
176 "the background tab's " + testingList[testingIndex].tagName + |
|
177 " element is not active by the " + testingList[testingIndex].methodName + |
|
178 " (Test2: content can NOT steal focus)"); |
|
179 isnot(fm.focusedElement, e, |
|
180 "the " + testingList[testingIndex].tagName + |
|
181 " element is focused by the " + testingList[testingIndex].methodName + |
|
182 " (Test2: content can NOT steal focus)"); |
|
183 |
|
184 runNextTest(); |
|
185 } |
|
186 |
|
187 runNextTest(); |
|
188 } |