OLD | NEW |
1 /* | 1 /* |
2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
3 * Copyright (C) 2006-2016 Eyeo GmbH | 3 * Copyright (C) 2006-2016 Eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 * GNU General Public License for more details. | 12 * GNU General Public License for more details. |
13 * | 13 * |
14 * You should have received a copy of the GNU General Public License | 14 * You should have received a copy of the GNU General Public License |
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
16 */ | 16 */ |
17 | 17 |
18 "use strict"; | 18 "use strict"; |
19 | 19 |
20 var lastFilterQuery = null; | 20 let lastFilterQuery = null; |
21 | 21 |
22 function generateFilter(request, domainSpecific) | 22 function generateFilter(request, domainSpecific) |
23 { | 23 { |
24 var filter = request.url.replace(/^[\w\-]+:\/+(?:www\.)?/, "||"); | 24 let filter = request.url.replace(/^[\w-]+:\/+(?:www\.)?/, "||"); |
25 var options = []; | 25 let options = []; |
26 | 26 |
27 if (request.type == "POPUP") | 27 if (request.type == "POPUP") |
28 { | 28 { |
29 options.push("popup"); | 29 options.push("popup"); |
30 | 30 |
31 if (request.url == "about:blank") | 31 if (request.url == "about:blank") |
32 domainSpecific = true; | 32 domainSpecific = true; |
33 } | 33 } |
34 | 34 |
35 if (domainSpecific) | 35 if (domainSpecific) |
36 options.push("domain=" + request.docDomain); | 36 options.push("domain=" + request.docDomain); |
37 | 37 |
38 if (options.length > 0) | 38 if (options.length > 0) |
39 filter += "$" + options.join(","); | 39 filter += "$" + options.join(","); |
40 | 40 |
41 return filter; | 41 return filter; |
42 } | 42 } |
43 | 43 |
44 function createActionButton(action, label, filter) | 44 function createActionButton(action, label, filter) |
45 { | 45 { |
46 var button = document.createElement("span"); | 46 let button = document.createElement("span"); |
47 | 47 |
48 button.textContent = label; | 48 button.textContent = label; |
49 button.classList.add("action"); | 49 button.classList.add("action"); |
50 | 50 |
51 button.addEventListener("click", function() | 51 button.addEventListener("click", () => |
52 { | 52 { |
53 ext.backgroundPage.sendMessage({ | 53 ext.backgroundPage.sendMessage({ |
54 type: "filters." + action, | 54 type: "filters." + action, |
55 text: filter | 55 text: filter |
56 }); | 56 }); |
57 }, false); | 57 }, false); |
58 | 58 |
59 return button; | 59 return button; |
60 } | 60 } |
61 | 61 |
62 function createRecord(request, filter, template) | 62 function createRecord(request, filter, template) |
63 { | 63 { |
64 var row = document.importNode(template, true); | 64 let row = document.importNode(template, true); |
65 row.dataset.type = request.type; | 65 row.dataset.type = request.type; |
66 | 66 |
67 row.querySelector(".domain").textContent = request.docDomain; | 67 row.querySelector(".domain").textContent = request.docDomain; |
68 row.querySelector(".type").textContent = request.type; | 68 row.querySelector(".type").textContent = request.type; |
69 | 69 |
70 var urlElement = row.querySelector(".url"); | 70 let urlElement = row.querySelector(".url"); |
71 var actionWrapper = row.querySelector(".action-wrapper"); | 71 let actionWrapper = row.querySelector(".action-wrapper"); |
72 | 72 |
73 if (request.url) | 73 if (request.url) |
74 { | 74 { |
75 urlElement.textContent = request.url; | 75 urlElement.textContent = request.url; |
76 | 76 |
77 if (request.type != "POPUP") | 77 if (request.type != "POPUP") |
78 { | 78 { |
79 urlElement.classList.add("resourceLink"); | 79 urlElement.classList.add("resourceLink"); |
80 urlElement.addEventListener("click", function() | 80 urlElement.addEventListener("click", () => |
81 { | 81 { |
82 ext.devtools.panels.openResource(request.url); | 82 ext.devtools.panels.openResource(request.url); |
83 }, false); | 83 }, false); |
84 } | 84 } |
85 } | 85 } |
86 | 86 |
87 if (filter) | 87 if (filter) |
88 { | 88 { |
89 var filterElement = row.querySelector(".filter"); | 89 let filterElement = row.querySelector(".filter"); |
90 var originElement = row.querySelector(".origin"); | 90 let originElement = row.querySelector(".origin"); |
91 | 91 |
92 filterElement.textContent = filter.text; | 92 filterElement.textContent = filter.text; |
93 row.dataset.state = filter.whitelisted ? "whitelisted" : "blocked"; | 93 row.dataset.state = filter.whitelisted ? "whitelisted" : "blocked"; |
94 | 94 |
95 if (filter.subscription) | 95 if (filter.subscription) |
96 originElement.textContent = filter.subscription; | 96 originElement.textContent = filter.subscription; |
97 else | 97 else |
98 { | 98 { |
99 if (filter.userDefined) | 99 if (filter.userDefined) |
100 originElement.textContent = "user-defined"; | 100 originElement.textContent = "user-defined"; |
101 else | 101 else |
102 originElement.textContent = "unnamed subscription"; | 102 originElement.textContent = "unnamed subscription"; |
103 | 103 |
104 originElement.classList.add("unnamed"); | 104 originElement.classList.add("unnamed"); |
105 } | 105 } |
106 | 106 |
107 if (!filter.whitelisted && request.type != "ELEMHIDE") | 107 if (!filter.whitelisted && request.type != "ELEMHIDE") |
| 108 { |
108 actionWrapper.appendChild(createActionButton( | 109 actionWrapper.appendChild(createActionButton( |
109 "add", "Add exception", "@@" + generateFilter(request, false) | 110 "add", "Add exception", "@@" + generateFilter(request, false) |
110 )); | 111 )); |
| 112 } |
111 | 113 |
112 if (filter.userDefined) | 114 if (filter.userDefined) |
| 115 { |
113 actionWrapper.appendChild(createActionButton( | 116 actionWrapper.appendChild(createActionButton( |
114 "remove", "Remove rule", filter.text | 117 "remove", "Remove rule", filter.text |
115 )); | 118 )); |
| 119 } |
116 } | 120 } |
117 else | 121 else |
| 122 { |
118 actionWrapper.appendChild(createActionButton( | 123 actionWrapper.appendChild(createActionButton( |
119 "add", "Block item", generateFilter(request, request.specificOnly) | 124 "add", "Block item", generateFilter(request, request.specificOnly) |
120 )); | 125 )); |
| 126 } |
121 | 127 |
122 if (lastFilterQuery && shouldFilterRow(row, lastFilterQuery)) | 128 if (lastFilterQuery && shouldFilterRow(row, lastFilterQuery)) |
123 row.classList.add("filtered-by-search"); | 129 row.classList.add("filtered-by-search"); |
124 | 130 |
125 return row; | 131 return row; |
126 } | 132 } |
127 | 133 |
128 function shouldFilterRow(row, query) | 134 function shouldFilterRow(row, query) |
129 { | 135 { |
130 var elementsToSearch = [ | 136 let elementsToSearch = [ |
131 row.getElementsByClassName("url"), | 137 row.getElementsByClassName("url"), |
132 row.getElementsByClassName("filter"), | 138 row.getElementsByClassName("filter"), |
133 row.getElementsByClassName("origin"), | 139 row.getElementsByClassName("origin"), |
134 row.getElementsByClassName("type") | 140 row.getElementsByClassName("type") |
135 ]; | 141 ]; |
136 | 142 |
137 for (var elements of elementsToSearch) | 143 for (let elements of elementsToSearch) |
138 { | 144 { |
139 for (var element of elements) | 145 for (let element of elements) |
140 { | 146 { |
141 if (element.innerText.search(query) != -1) | 147 if (element.innerText.search(query) != -1) |
142 return false; | 148 return false; |
143 } | 149 } |
144 } | 150 } |
145 return true; | 151 return true; |
146 } | 152 } |
147 | 153 |
148 function performSearch(table, query) | 154 function performSearch(table, query) |
149 { | 155 { |
150 for (var row of table.rows) | 156 for (let row of table.rows) |
151 { | 157 { |
152 if (shouldFilterRow(row, query)) | 158 if (shouldFilterRow(row, query)) |
153 row.classList.add("filtered-by-search"); | 159 row.classList.add("filtered-by-search"); |
154 else | 160 else |
155 row.classList.remove("filtered-by-search"); | 161 row.classList.remove("filtered-by-search"); |
156 } | 162 } |
157 } | 163 } |
158 | 164 |
159 function cancelSearch(table) | 165 function cancelSearch(table) |
160 { | 166 { |
161 for (var row of table.rows) | 167 for (let row of table.rows) |
162 row.classList.remove("filtered-by-search"); | 168 row.classList.remove("filtered-by-search"); |
163 } | 169 } |
164 | 170 |
165 document.addEventListener("DOMContentLoaded", function() | 171 document.addEventListener("DOMContentLoaded", () => |
166 { | 172 { |
167 var container = document.getElementById("items"); | 173 let container = document.getElementById("items"); |
168 var table = container.querySelector("tbody"); | 174 let table = container.querySelector("tbody"); |
169 var template = document.querySelector("template").content.firstElementChild; | 175 let template = document.querySelector("template").content.firstElementChild; |
170 | 176 |
171 document.getElementById("reload").addEventListener("click", function() | 177 document.getElementById("reload").addEventListener("click", () => |
172 { | 178 { |
173 ext.devtools.inspectedWindow.reload(); | 179 ext.devtools.inspectedWindow.reload(); |
174 }, false); | 180 }, false); |
175 | 181 |
176 document.getElementById("filter-state").addEventListener("change", function(ev
ent) | 182 document.getElementById("filter-state").addEventListener("change", event => |
177 { | 183 { |
178 container.dataset.filterState = event.target.value; | 184 container.dataset.filterState = event.target.value; |
179 }, false); | 185 }, false); |
180 | 186 |
181 document.getElementById("filter-type").addEventListener("change", function(eve
nt) | 187 document.getElementById("filter-type").addEventListener("change", event => |
182 { | 188 { |
183 container.dataset.filterType = event.target.value; | 189 container.dataset.filterType = event.target.value; |
184 }, false); | 190 }, false); |
185 | 191 |
186 ext.onMessage.addListener(function(message) | 192 ext.onMessage.addListener(message => |
187 { | 193 { |
188 switch (message.type) | 194 switch (message.type) |
189 { | 195 { |
190 case "add-record": | 196 case "add-record": |
191 table.appendChild(createRecord(message.request, message.filter, template
)); | 197 table.appendChild(createRecord(message.request, message.filter, |
| 198 template)); |
192 break; | 199 break; |
193 | 200 |
194 case "update-record": | 201 case "update-record": |
195 var oldRow = table.getElementsByTagName("tr")[message.index]; | 202 let oldRow = table.getElementsByTagName("tr")[message.index]; |
196 var newRow = createRecord(message.request, message.filter, template); | 203 let newRow = createRecord(message.request, message.filter, template); |
197 oldRow.parentNode.replaceChild(newRow, oldRow); | 204 oldRow.parentNode.replaceChild(newRow, oldRow); |
198 newRow.classList.add("changed"); | 205 newRow.classList.add("changed"); |
199 container.classList.add("has-changes"); | 206 container.classList.add("has-changes"); |
200 break; | 207 break; |
201 | 208 |
202 case "remove-record": | 209 case "remove-record": |
203 var row = table.getElementsByTagName("tr")[message.index]; | 210 let row = table.getElementsByTagName("tr")[message.index]; |
204 row.parentNode.removeChild(row); | 211 row.parentNode.removeChild(row); |
205 container.classList.add("has-changes"); | 212 container.classList.add("has-changes"); |
206 break; | 213 break; |
207 | 214 |
208 case "reset": | 215 case "reset": |
209 table.innerHTML = ""; | 216 table.innerHTML = ""; |
210 container.classList.remove("has-changes"); | 217 container.classList.remove("has-changes"); |
211 break; | 218 break; |
212 } | 219 } |
213 }); | 220 }); |
214 | 221 |
215 window.addEventListener("message", function(event) | 222 window.addEventListener("message", event => |
216 { | 223 { |
217 switch(event.data.type) | 224 switch (event.data.type) |
218 { | 225 { |
219 case "performSearch": | 226 case "performSearch": |
220 performSearch(table, event.data.queryString); | 227 performSearch(table, event.data.queryString); |
221 lastFilterQuery = event.data.queryString; | 228 lastFilterQuery = event.data.queryString; |
222 break; | 229 break; |
223 case "cancelSearch": | 230 case "cancelSearch": |
224 cancelSearch(table); | 231 cancelSearch(table); |
225 lastFilterQuery = null; | 232 lastFilterQuery = null; |
226 break; | 233 break; |
227 } | 234 } |
228 }); | 235 }); |
229 | 236 |
230 // Since Chrome 54 the themeName is accessible, for earlier versions we must | 237 // Since Chrome 54 the themeName is accessible, for earlier versions we must |
231 // assume the default theme is being used. | 238 // assume the default theme is being used. |
232 // https://bugs.chromium.org/p/chromium/issues/detail?id=608869 | 239 // https://bugs.chromium.org/p/chromium/issues/detail?id=608869 |
233 let theme = chrome.devtools.panels.themeName || "default"; | 240 let theme = chrome.devtools.panels.themeName || "default"; |
234 document.body.classList.add(theme); | 241 document.body.classList.add(theme); |
235 }, false); | 242 }, false); |
OLD | NEW |