Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
1 <?xml version="1.0"?>
2 <?xml-stylesheet type="text/css" href="chrome://global/skin"?>
3 <?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
4 <?xml-stylesheet type="text/css" href="test_bug708874.css"?>
5 <!--
6 https://bugzilla.mozilla.org/show_bug.cgi?id=708874
7 -->
8 <window title="Mozilla Bug 708874"
9 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
10 onload="RunTests();">
11 <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
12 <script type="application/javascript">
13 <![CDATA[
15 /** Test for Bug 708874 - API for locking pseudo-class state of an element **/
17 var DOMUtils = Components.classes["@mozilla.org/inspector/dom-utils;1"]
18 .getService(Components.interfaces.inIDOMUtils);
19 var DOMWindowUtils = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
20 .getInterface(Components.interfaces.nsIDOMWindowUtils);
22 var defaultColor = "rgb(0, 0, 0)";
23 var disabledColor = "rgb(40, 0, 0)";
25 function RunTests() {
26 testLockEnabled();
27 testLockDisabled();
28 testVisited();
29 testMultiple();
30 testInvalid();
31 testNotElement();
32 }
34 function testLockEnabled() {
35 var button = document.getElementById("test-button");
37 /* starting state is enabled */
38 button.removeAttribute("disabled");
40 is(DOMUtils.hasPseudoClassLock(button, ":disabled"), false,
41 "doesn't have lock at start");
43 is(window.getComputedStyle(button).color, defaultColor,
44 "color is default color before locking on");
46 is(button.mozMatchesSelector(":disabled"), false,
47 "doesn't match selector at start");
49 /* lock */
50 DOMUtils.addPseudoClassLock(button, ":disabled");
52 is(DOMUtils.hasPseudoClassLock(button, ":disabled"), true,
53 "hasPseudoClassLock is true after locking");
55 is(window.getComputedStyle(button).color, disabledColor,
56 ":disabled style applied after adding lock");
58 is(button.mozMatchesSelector(":disabled"), true,
59 "matches selector after adding lock");
61 /* change state to disabled */
62 button.setAttribute("disabled", "disabled");
64 is(window.getComputedStyle(button).color, disabledColor,
65 ":disabled style still applied after really disabling");
67 is(button.mozMatchesSelector(":disabled"), true,
68 "matches selector after adding lock");
70 /* remove lock */
71 DOMUtils.removePseudoClassLock(button, ":disabled");
73 is(DOMUtils.hasPseudoClassLock(button, ":disabled"), false,
74 "hasPseudoClassLock is false after removing on lock");
76 is(window.getComputedStyle(button).color, disabledColor,
77 ":disabled style still applied after removing lock");
79 is(button.mozMatchesSelector(":disabled"), true,
80 "matches selector after removing lock");
82 /* change state to enabled */
83 button.removeAttribute("disabled");
85 is(window.getComputedStyle(button).color, defaultColor,
86 "back to default style after un-disabling");
88 is(button.mozMatchesSelector(":disabled"), false,
89 "doesn't match selector after enabling");
90 }
93 function testLockDisabled() {
94 var button = document.getElementById("test-button");
96 /* starting state is disabled */
97 button.setAttribute("disabled", "disabled");
99 is(DOMUtils.hasPseudoClassLock(button, ":disabled"), false,
100 "doesn't have lock at start");
102 is(window.getComputedStyle(button).color, disabledColor,
103 "color is :disabled color before locking");
105 is(button.mozMatchesSelector(":disabled"), true,
106 "matches selector before locking");
108 /* lock */
109 DOMUtils.addPseudoClassLock(button, ":disabled");
111 is(DOMUtils.hasPseudoClassLock(button, ":disabled"), true,
112 "hasPseudoClassLock is true after locking");
114 is(window.getComputedStyle(button).color, disabledColor,
115 ":disabled style still applied after adding on lock");
117 is(button.mozMatchesSelector(":disabled"), true,
118 "matches selector after locking");
120 /* change state to enabled */
121 button.removeAttribute("disabled");
123 is(window.getComputedStyle(button).color, disabledColor,
124 ":disabled style applied after enabling");
126 is(button.mozMatchesSelector(":disabled"), true,
127 "matches selector after enabling with lock on");
129 /* remove lock */
130 DOMUtils.removePseudoClassLock(button, ":disabled");
132 is(DOMUtils.hasPseudoClassLock(button, ":disabled"), false,
133 "hasPseudoClassLock is false after removing on lock");
135 is(window.getComputedStyle(button).color, defaultColor,
136 "default style applied after removing lock");
138 is(button.mozMatchesSelector(":disabled"), false,
139 "doesn't match selector after unlocking");
141 /* change state to disabled */
142 button.setAttribute("disabled", "disabled");
144 is(window.getComputedStyle(button).color, disabledColor,
145 ":disabled style applied after disabling after unlocking");
147 is(button.mozMatchesSelector(":disabled"), true,
148 "matches selector again after disabling");
149 }
151 function testVisited() {
152 var link = document.getElementById("test-link");
153 var visitedColor = "rgb(20, 0, 0)";
154 var unvisitedColor = "rgb(30, 0, 0)";
156 /* lock visited */
157 DOMUtils.addPseudoClassLock(link, ":visited");
159 is(DOMUtils.hasPseudoClassLock(link, ":visited"), true,
160 "hasPseudoClassLock is true after adding lock");
162 var color = DOMWindowUtils.getVisitedDependentComputedStyle(link,
163 null, "color");
164 is(color, visitedColor, "color is :visited color after locking");
166 /* lock unvisited */
167 DOMUtils.addPseudoClassLock(link, ":link");
169 is(DOMUtils.hasPseudoClassLock(link, ":link"), true,
170 "hasPseudoClassLock is true after adding :link lock");
172 is(DOMUtils.hasPseudoClassLock(link, ":visited"), false,
173 "hasPseudoClassLock is false for :visited after adding :link lock");
175 var color = DOMWindowUtils.getVisitedDependentComputedStyle(link,
176 null, "color");
177 is(color, unvisitedColor, "color is :link color after locking :link");
179 /* lock visited back on */
180 DOMUtils.addPseudoClassLock(link, ":visited");
182 is(DOMUtils.hasPseudoClassLock(link, ":visited"), true,
183 "hasPseudoClassLock is true after adding :visited lock");
185 is(DOMUtils.hasPseudoClassLock(link, ":link"), false,
186 "hasPseudoClassLock is false for :link after adding :visited lock");
188 var color = DOMWindowUtils.getVisitedDependentComputedStyle(link,
189 null, "color");
190 is(color, visitedColor, "color is :visited color after locking back on");
191 }
193 function testMultiple() {
194 var div = document.getElementById("test-div");
196 var styles = {
197 ":hover": {
198 property: "color",
199 value: "rgb(10, 0, 0)",
200 defaultValue: "rgb(0, 0, 0)"
201 },
202 ":active": {
203 property: "font-family",
204 value: "Arial",
205 defaultValue: "serif"
206 },
207 ":focus": {
208 property: "font-weight",
209 value: "800",
210 defaultValue: "400"
211 }
212 };
214 for (var pseudo in styles) {
215 DOMUtils.addPseudoClassLock(div, pseudo);
216 }
218 for (var pseudo in styles) {
219 is(DOMUtils.hasPseudoClassLock(div, pseudo), true,
220 "hasPseudoClassLock is true after locking");
222 var style = styles[pseudo];
223 is(window.getComputedStyle(div).getPropertyValue(style.property),
224 style.value, "style for pseudo-class is applied after locking");
226 is(div.mozMatchesSelector(pseudo), true,
227 "matches selector after locking");
228 }
230 DOMUtils.clearPseudoClassLocks(div);
232 for (var pseudo in styles) {
233 is(DOMUtils.hasPseudoClassLock(div, pseudo), false,
234 "hasPseudoClassLock is false after clearing");
236 is(window.getComputedStyle(div).getPropertyValue(style.property),
237 style.defaultValue, "style is back to default after clearing");
239 is(div.mozMatchesSelector(pseudo), false,
240 "doesn't match selector after unlocking");
241 }
242 }
244 function testInvalid() {
245 var div = document.getElementById("test-div");
246 var pseudos = ["not a valid pseudo-class", ":moz-any-link", ":first-child"];
248 for (var i = 0; i < pseudos.length; i++) {
249 var pseudo = pseudos[i];
251 // basically make sure these don't crash the browser.
252 DOMUtils.addPseudoClassLock(div, pseudo);
254 is(DOMUtils.hasPseudoClassLock(div, pseudo), false);
256 DOMUtils.removePseudoClassLock(div, pseudo);
257 }
258 }
260 function testNotElement() {
261 var values = [null, undefined, {}];
262 try {
263 for each (value in values); {
264 DOMUtils.hasPseudoClassLock(value, ":hover");
265 DOMUtils.addPseudoClassLock(value, ":hover");
266 DOMUtils.removePseudoClassLock(value, ":hover");
267 DOMUtils.clearPseudoClassLocks(value);
268 }
269 } catch(e) {
270 // just make sure we don't crash on non-elements
271 }
272 }
273 ]]>
274 </script>
276 <body xmlns="http://www.w3.org/1999/xhtml">
277 <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=708874"
278 target="_blank">Mozilla Bug 708874</a>
280 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=708874">
281 Mozilla Bug 708874 - API for locking pseudo-class state of an element
282 </a>
284 <a id="test-link" href="http://notavisitedwebsite.com">
285 test link
286 </a>
288 <div id="test-div">
289 test div
290 </div>
292 <button id="test-button">
293 test button
294 </button>
295 </body>
297 </window>