Left: | ||
Right: |
OLD | NEW |
---|---|
(Empty) | |
1 QUnit.module("Element hiding emulation", | |
2 { | |
3 before: function() | |
4 { | |
5 // The URL object in PhantomJS 2.1.7 does not implement any properties, so | |
6 // we need a polyfill. | |
7 if (!URL || !("origin" in URL)) | |
8 { | |
9 var doc = document.implementation.createHTMLDocument(); | |
10 var anchor = doc.createElement("a"); | |
11 doc.body.appendChild(anchor); | |
12 URL = function(url) | |
13 { | |
14 if (!url) | |
15 throw "Invalid URL"; | |
16 anchor.href = url; | |
17 this.origin = anchor.origin; | |
18 }; | |
19 } | |
20 }, | |
21 afterEach: function() | |
22 { | |
23 var styleElements = document.head.getElementsByTagName("style"); | |
24 for (var i = 0; i < styleElements.length; i++) | |
kzar
2017/01/09 08:28:43
Can we not use more modern JavaScript features wit
Felix Dahlke
2017/01/10 09:16:49
Unfortunately not with version 2.1.7, that one sti
kzar
2017/01/10 11:05:33
Damn, this could be a problem in the near future s
kzar
2017/01/11 04:25:28
You missed this one? (Some other smaller ones in t
Felix Dahlke
2017/01/11 10:06:02
No, it rather sounded like you thought this could
kzar
2017/01/11 11:19:18
Please at least put a comment / note in relevant p
Felix Dahlke
2017/01/12 09:24:06
Sure! This affects chrome/content/elemHideEmulatio
kzar
2017/01/12 09:42:13
Cool, sounds good. (IMO an issue is overkill since
Felix Dahlke
2017/01/17 19:41:08
Done.
| |
25 document.head.removeChild(styleElements[0]); | |
26 } | |
27 }); | |
28 | |
29 QUnit.assert.hidden = function(element) | |
kzar
2017/01/09 08:28:43
I wonder if the URL polyfill and these utility fun
Felix Dahlke
2017/01/10 09:16:49
I personally prefer to share code once it needs to
kzar
2017/01/10 11:05:33
Fair enough.
| |
30 { | |
31 this.equal(getComputedStyle(element).display, "none", | |
32 "The element's display property should be set to 'none'"); | |
33 }; | |
34 | |
35 QUnit.assert.visible = function(element) | |
36 { | |
37 this.notEqual(getComputedStyle(element).display, "none", | |
38 "The element's display property should not be set to 'none'"); | |
39 }; | |
40 | |
41 function findUniqueId() | |
42 { | |
43 var id = "elemHideEmulationTest-" + Math.floor(Math.random() * 10000); | |
44 if (!document.getElementById(id)) | |
45 return id; | |
46 return findUniqueId(); | |
47 } | |
48 | |
49 function insertStyleRule(rule) | |
50 { | |
51 var styleElement; | |
kzar
2017/01/09 08:28:43
Nit: `let` rather than `var` throughout?
Felix Dahlke
2017/01/10 09:16:48
See above.
| |
52 var styleElements = document.head.getElementsByTagName("style"); | |
53 if (styleElements.length) | |
54 styleElement = styleElements[0]; | |
kzar
2017/01/09 08:28:43
Nit: Since the else clause has braces the if claus
Felix Dahlke
2017/01/10 09:16:48
Why? I personally prefer it this way.
kzar
2017/01/10 11:05:33
I've been told to do that on codereviews before by
Felix Dahlke
2017/01/10 13:27:32
IIRC he actually prefers it that way, but since we
kzar
2017/01/11 04:25:29
OK well how's this? I have been asked to use consi
Felix Dahlke
2017/01/11 10:06:02
What others have asked in other places is not part
kzar
2017/01/11 11:19:19
I think it is relevant what Wladimir has told me i
Felix Dahlke
2017/01/17 19:41:07
You're not reviewing it for him, you're reviewing
| |
55 else | |
56 { | |
57 styleElement = document.createElement("style"); | |
58 document.head.appendChild(styleElement); | |
59 } | |
60 styleElement.sheet.insertRule(rule, styleElement.sheet.cssRules.length); | |
61 } | |
62 | |
63 function createElementWithStyle(styleBlock) | |
64 { | |
65 var element = document.createElement("div"); | |
66 element.id = findUniqueId(); | |
67 document.body.appendChild(element); | |
68 insertStyleRule("#" + element.id + " " + styleBlock); | |
69 return element; | |
70 } | |
71 | |
72 function applyElemHideEmulation(selectors, callback) | |
73 { | |
74 var elemHideEmulation = new ElemHideEmulation( | |
75 window, | |
76 function(callback) | |
kzar
2017/01/09 08:28:43
Nit: Mind using arrow functions here and for the o
Felix Dahlke
2017/01/10 09:16:48
See above.
| |
77 { | |
78 var patterns = []; | |
79 selectors.forEach(function(selector) | |
80 { | |
81 patterns.push({selector: selector}); | |
82 }); | |
83 callback(patterns); | |
84 }, | |
85 function(selectors) | |
86 { | |
87 if (!selectors.length) | |
88 return; | |
89 var selector = selectors.join(", "); | |
90 insertStyleRule(selector + "{display: none !important;}"); | |
91 } | |
92 ); | |
93 | |
94 elemHideEmulation.load(function() | |
95 { | |
96 elemHideEmulation.apply(); | |
97 callback(); | |
98 }); | |
99 } | |
100 | |
101 QUnit.test("Verbatim property selector", function(assert) | |
102 { | |
103 var done = assert.async(); | |
104 var toHide = createElementWithStyle("{background-color: #000}"); | |
105 applyElemHideEmulation(["[-abp-properties='background-color: rgb(0, 0, 0)']"], | |
kzar
2017/01/09 08:28:43
Nit: This indentation looks weird. How about somet
Felix Dahlke
2017/01/10 09:16:49
Yeah I know, I did some research in our code base
kzar
2017/01/10 11:05:33
Well I'm pretty sure we've done it the way I've su
Felix Dahlke
2017/01/10 13:27:32
Then I figure we should leave it as-is for the sak
kzar
2017/01/11 04:25:29
Or alternatively you could just improve the indent
Felix Dahlke
2017/01/11 10:06:02
I don't find it very beautiful, but it does look l
kzar
2017/01/11 11:19:18
Well we "indent the function body" all the time, f
Felix Dahlke
2017/01/12 09:24:06
No, I mean the opening brace of an anonymous funct
kzar
2017/01/12 09:42:13
I really think that you're overthinking this and s
Sebastian Noack
2017/01/12 23:12:58
I agree that putting the function header on a line
Felix Dahlke
2017/01/17 19:41:07
Thanks Sebastian, done.
(On a related note: I thi
| |
106 function() | |
107 { | |
108 assert.hidden(toHide); | |
109 done(); | |
110 }); | |
111 }); | |
112 | |
113 QUnit.test("Property selector with wildcard", function(assert) | |
114 { | |
115 var done = assert.async(); | |
116 var toHide = createElementWithStyle("{background-color: #000}"); | |
117 applyElemHideEmulation(["[-abp-properties='*color: rgb(0, 0, 0)']"], | |
118 function() | |
119 { | |
120 assert.hidden(toHide); | |
121 done(); | |
122 }); | |
123 }); | |
124 | |
125 QUnit.test("Property selector with regular expression", function(assert) | |
126 { | |
127 var done = assert.async(); | |
128 var toHide = createElementWithStyle("{background-color: #000}"); | |
129 applyElemHideEmulation(["[-abp-properties='/.*color: rgb\\(0, 0, 0\\)/']"], | |
130 function() | |
131 { | |
132 assert.hidden(toHide); | |
133 done(); | |
134 }); | |
135 }); | |
136 | |
137 QUnit.test("Property selector with regular expression containing escaped brace", | |
138 function(assert) | |
139 { | |
140 var done = assert.async(); | |
141 var toHide = createElementWithStyle("{background-color: #000}"); | |
142 applyElemHideEmulation( | |
143 ["[-abp-properties='/background.\\x7B 0,6\\x7D : rgb\\(0, 0, 0\\)/']"], | |
144 function() | |
145 { | |
146 assert.hidden(toHide); | |
147 done(); | |
148 }); | |
149 }); | |
150 | |
151 QUnit.test("Property selector with regular expression containing improperly \ | |
152 escaped brace", | |
153 function(assert) | |
154 { | |
155 var done = assert.async(); | |
156 var toHide = createElementWithStyle("{background-color: #000}"); | |
157 applyElemHideEmulation( | |
158 ["[-abp-properties='/background.\\x7B0,6\\x7D: rgb\\(0, 0, 0\\)/']"], | |
159 function() | |
160 { | |
161 assert.visible(toHide); | |
162 done(); | |
163 }); | |
164 }); | |
165 | |
166 QUnit.test("Property selector works for dynamically changed property", | |
167 function(assert) | |
168 { | |
169 var done = assert.async(); | |
170 var toHide = createElementWithStyle("{}"); | |
171 applyElemHideEmulation(["[-abp-properties='background-color: rgb(0, 0, 0)']"], | |
172 function() | |
173 { | |
174 assert.visible(toHide); | |
175 insertStyleRule("#" + toHide.id + " {background-color: #000}"); | |
176 setTimeout(function() | |
177 { | |
178 assert.hidden(toHide); | |
179 done(); | |
180 }); | |
181 }); | |
182 }); | |
OLD | NEW |