OLD | NEW |
1 /* | 1 /* |
2 * This Source Code is subject to the terms of the Mozilla Public License | 2 * This Source Code is subject to the terms of the Mozilla Public License |
3 * version 2.0 (the "License"). You can obtain a copy of the License at | 3 * version 2.0 (the "License"). You can obtain a copy of the License at |
4 * http://mozilla.org/MPL/2.0/. | 4 * http://mozilla.org/MPL/2.0/. |
5 */ | 5 */ |
6 | 6 |
7 let {Prefs} = require("prefs"); | 7 let {Prefs} = require("prefs"); |
8 | 8 |
9 let domainData; | 9 let domainData; |
10 let nodeData; | 10 let nodeData; |
11 let selectedNode = null; | 11 let selectedNode = null; |
12 let advancedMode = false; | 12 let advancedMode = false; |
13 let treeView = null; | 13 let treeView = null; |
14 let stylesheetData; | 14 let stylesheetData; |
15 let previewStyle = null; | 15 let previewStyle = null; |
16 let doc; | 16 let doc; |
17 | 17 |
18 let abpURL = Cc["@adblockplus.org/abp/public;1"].getService(Ci.nsIURI); | 18 let abpURL = Cc["@adblockplus.org/abp/public;1"].getService(Ci.nsIURI); |
19 Cu.import(abpURL.spec); | 19 Cu.import(abpURL.spec); |
20 | 20 |
21 /******************* | 21 /******************* |
22 * NodeData object * | |
23 *******************/ | |
24 | |
25 function NodeData(node, parentNode) { | |
26 this.tagName = {value: node.tagName, checked: false}; | |
27 | |
28 if (typeof parentNode == "undefined") | |
29 parentNode = (node.parentNode && node.parentNode.nodeType == node.ELEMENT_NO
DE ? new NodeData(node.parentNode) : null); | |
30 this.parentNode = parentNode; | |
31 | |
32 var prevSibling = node.previousSibling; | |
33 while (prevSibling && prevSibling.nodeType != node.ELEMENT_NODE) | |
34 prevSibling = prevSibling.previousSibling; | |
35 this.prevSibling = (prevSibling ? new NodeData(prevSibling, this.parentNode) :
null); | |
36 | |
37 if (parentNode && !prevSibling) | |
38 this.firstChild = {checked: false}; | |
39 | |
40 var nextSibling = node.nextSibling; | |
41 while (nextSibling && nextSibling.nodeType != node.ELEMENT_NODE) | |
42 nextSibling = nextSibling.nextSibling; | |
43 if (parentNode && !nextSibling) | |
44 this.lastChild = {checked: false}; | |
45 | |
46 this.attributes = []; | |
47 for (var i = 0; i < node.attributes.length; i++) { | |
48 var attribute = node.attributes[i]; | |
49 var data = {name: attribute.name, value: attribute.value, selected: attribut
e.value, checked: false}; | |
50 if (data.name == "id" || data.name == "class") | |
51 this.attributes.unshift(data); | |
52 else | |
53 this.attributes.push(data); | |
54 } | |
55 | |
56 if (this.attributes.length >= 2 && this.attributes[1].name == "id") { | |
57 // Make sure ID attribute comes first | |
58 var tmp = this.attributes[1]; | |
59 this.attributes[1] = this.attributes[0]; | |
60 this.attributes[0] = tmp; | |
61 } | |
62 | |
63 this.customCSS = {selected: "", checked: false}; | |
64 } | |
65 | |
66 /******************* | |
67 * TreeView object * | 22 * TreeView object * |
68 *******************/ | 23 *******************/ |
69 | 24 |
70 function TreeView(tree) { | 25 function TreeView(tree) { |
71 var origView = tree.view; | 26 var origView = tree.view; |
72 this.getRowProperties = TreeView_getRowProperties; | 27 this.getRowProperties = TreeView_getRowProperties; |
73 this.getCellProperties = TreeView_getCellProperties; | 28 this.getCellProperties = TreeView_getCellProperties; |
74 | 29 |
75 createQIProxy(this, origView); | 30 createQIProxy(this, origView); |
76 | 31 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 } | 75 } |
121 | 76 |
122 function TreeView_getCellProperties(row, col) { | 77 function TreeView_getCellProperties(row, col) { |
123 this.getRowProperties(row); | 78 this.getRowProperties(row); |
124 } | 79 } |
125 | 80 |
126 /********************* | 81 /********************* |
127 * General functions * | 82 * General functions * |
128 *********************/ | 83 *********************/ |
129 | 84 |
130 function init() { | 85 function init() |
131 var element = window.arguments[0]; | 86 { |
132 doc = element.ownerDocument; | 87 nodeData = window.arguments[0]; |
133 var wnd = doc.defaultView; | 88 let host = window.arguments[1]; |
134 | 89 |
135 // Check whether element hiding group is disabled | 90 // Check whether element hiding group is disabled |
136 let subscription = AdblockPlus.getSubscription("~eh~"); | 91 let subscription = AdblockPlus.getSubscription("~eh~"); |
137 if (subscription && subscription.disabled) | 92 if (subscription && subscription.disabled) |
138 { | 93 { |
139 let warning = document.getElementById("groupDisabledWarning"); | 94 let warning = document.getElementById("groupDisabledWarning"); |
140 if (/\?1\?/.test(warning.textContent)) | 95 if (/\?1\?/.test(warning.textContent)) |
141 warning.textContent = warning.textContent.replace(/\?1\?/g, subscription.t
itle); | 96 warning.textContent = warning.textContent.replace(/\?1\?/g, subscription.t
itle); |
142 warning.hidden = false; | 97 warning.hidden = false; |
143 } | 98 } |
144 | 99 |
145 nodeData = new NodeData(element); | |
146 nodeData.tagName.checked = true; | 100 nodeData.tagName.checked = true; |
147 if (nodeData.attributes.length > 0) | 101 if (nodeData.attributes.length > 0) |
148 { | 102 { |
149 let maxLen = 0; | 103 let maxLen = 0; |
150 let bestAttr = null; | 104 let bestAttr = null; |
151 for (let i = 0; i < nodeData.attributes.length; i++) | 105 for (let i = 0; i < nodeData.attributes.length; i++) |
152 { | 106 { |
153 let len = nodeData.attributes[i].value.length; | 107 let len = nodeData.attributes[i].value.length; |
154 if ((nodeData.attributes[i].name == "id" || nodeData.attributes[i].name ==
"class") && len) | 108 if ((nodeData.attributes[i].name == "id" || nodeData.attributes[i].name ==
"class") && len) |
155 { | 109 { |
156 len = 0x7FFFFFFF; | 110 len = 0x7FFFFFFF; |
157 nodeData.tagName.checked = false; | 111 nodeData.tagName.checked = false; |
158 } | 112 } |
159 if (len > maxLen) | 113 if (len > maxLen) |
160 { | 114 { |
161 maxLen = len; | 115 maxLen = len; |
162 bestAttr = nodeData.attributes[i]; | 116 bestAttr = nodeData.attributes[i]; |
163 } | 117 } |
164 } | 118 } |
165 if (bestAttr) | 119 if (bestAttr) |
166 { | 120 { |
167 bestAttr.selected = bestAttr.value; | 121 bestAttr.selected = bestAttr.value; |
168 bestAttr.checked = true; | 122 bestAttr.checked = true; |
169 } | 123 } |
170 } | 124 } |
171 | 125 |
172 let domain = wnd.location.hostname; | |
173 let selectedDomain; | 126 let selectedDomain; |
174 switch (Prefs.composer_defaultDomain) | 127 switch (Prefs.composer_defaultDomain) |
175 { | 128 { |
176 case 0: | 129 case 0: |
177 selectedDomain = ""; | 130 selectedDomain = ""; |
178 break; | 131 break; |
179 case 1: | 132 case 1: |
180 try | 133 try |
181 { | 134 { |
182 // EffectiveTLDService will throw for IP addresses, just go to the next
case then | 135 // EffectiveTLDService will throw for IP addresses, just go to the next
case then |
183 let effectiveTLD = Cc["@mozilla.org/network/effective-tld-service;1"].ge
tService(Ci.nsIEffectiveTLDService); | 136 let effectiveTLD = Cc["@mozilla.org/network/effective-tld-service;1"].ge
tService(Ci.nsIEffectiveTLDService); |
184 selectedDomain = effectiveTLD.getPublicSuffixFromHost(domain); | 137 selectedDomain = effectiveTLD.getPublicSuffixFromHost(host); |
185 break; | 138 break; |
186 } catch (e) {} | 139 } catch (e) {} |
187 case 2: | 140 case 2: |
188 try | 141 try |
189 { | 142 { |
190 // EffectiveTLDService will throw for IP addresses, just go to the next
case then | 143 // EffectiveTLDService will throw for IP addresses, just go to the next
case then |
191 let effectiveTLD = Cc["@mozilla.org/network/effective-tld-service;1"].ge
tService(Ci.nsIEffectiveTLDService); | 144 let effectiveTLD = Cc["@mozilla.org/network/effective-tld-service;1"].ge
tService(Ci.nsIEffectiveTLDService); |
192 selectedDomain = effectiveTLD.getBaseDomainFromHost(domain); | 145 selectedDomain = effectiveTLD.getBaseDomainFromHost(host); |
193 break; | 146 break; |
194 } catch (e) {} | 147 } catch (e) {} |
195 case 3: | 148 case 3: |
196 selectedDomain = domain.replace(/^www\./, ""); | 149 selectedDomain = host.replace(/^www\./, ""); |
197 break; | 150 break; |
198 default: | 151 default: |
199 selectedDomain = domain; | 152 selectedDomain = host; |
200 break; | 153 break; |
201 } | 154 } |
202 domainData = {value: domain, selected: selectedDomain}; | 155 domainData = {value: host, selected: selectedDomain}; |
203 | 156 |
204 fillDomains(domainData); | 157 fillDomains(domainData); |
205 fillNodes(nodeData); | 158 fillNodes(nodeData); |
206 setAdvancedMode(document.documentElement.getAttribute("advancedMode") == "true
"); | 159 setAdvancedMode(document.documentElement.getAttribute("advancedMode") == "true
"); |
207 updateExpression(); | 160 updateExpression(); |
208 | 161 |
209 setTimeout(function() { | 162 setTimeout(function() { |
210 document.getElementById("domainGroup").selectedItem.focus(); | 163 document.getElementById("domainGroup").selectedItem.focus(); |
211 if (document.getElementById("preview").checked) | 164 if (document.getElementById("preview").checked) |
212 togglePreview(true); | 165 togglePreview(true); |
(...skipping 22 matching lines...) Expand all Loading... |
235 var escapedName = escapeName(attr.name); | 188 var escapedName = escapeName(attr.name); |
236 if (attr.selected != "") | 189 if (attr.selected != "") |
237 { | 190 { |
238 var op = "*="; | 191 var op = "*="; |
239 if (attr.selected == attr.value) | 192 if (attr.selected == attr.value) |
240 op = "="; | 193 op = "="; |
241 else if (attr.value.substr(0, attr.selected.length) == attr.selected) | 194 else if (attr.value.substr(0, attr.selected.length) == attr.selected) |
242 op = "^="; | 195 op = "^="; |
243 else if (attr.value.substr(attr.value.length - attr.selected.length) =
= attr.selected) | 196 else if (attr.value.substr(attr.value.length - attr.selected.length) =
= attr.selected) |
244 op = "$="; | 197 op = "$="; |
245 | 198 |
246 let useFallback = false; | 199 let useFallback = false; |
247 if (attr.name == "id" && op == "=") | 200 if (attr.name == "id" && op == "=") |
248 expression += "#" + escapeName(attr.selected).replace(/^([^a-zA-Z\\]
)/, escapeChar).replace(/\\(\s)$/, escapeChar); | 201 expression += "#" + escapeName(attr.selected).replace(/^([^a-zA-Z\\]
)/, escapeChar).replace(/\\(\s)$/, escapeChar); |
249 else if (attr.name == "class" && /\S/.test(attr.selected)) | 202 else if (attr.name == "class" && /\S/.test(attr.selected)) |
250 { | 203 { |
251 let knownClasses = new Set(attr.value.split(/\s+/)); | 204 let knownClasses = new Set(attr.value.split(/\s+/)); |
252 let classes = attr.selected.split(/\s+/).filter(cls => cls != ""); | 205 let classes = attr.selected.split(/\s+/).filter(cls => cls != ""); |
253 if (classes.every(cls => knownClasses.has(cls))) | 206 if (classes.every(cls => knownClasses.has(cls))) |
254 expression += "." + classes.map(escapeName).join("."); | 207 expression += "." + classes.map(escapeName).join("."); |
255 else | 208 else |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
628 | 581 |
629 fillAttributes(item.nodeData); | 582 fillAttributes(item.nodeData); |
630 } | 583 } |
631 | 584 |
632 function addExpression() | 585 function addExpression() |
633 { | 586 { |
634 AdblockPlus.addPatterns([document.getElementById("expression").value]); | 587 AdblockPlus.addPatterns([document.getElementById("expression").value]); |
635 | 588 |
636 togglePreview(false); | 589 togglePreview(false); |
637 } | 590 } |
OLD | NEW |