| 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 |