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 /** @module filterComposer */ | 18 /** @module filterComposer */ |
19 | 19 |
| 20 "use strict"; |
| 21 |
20 let {extractHostFromFrame, stringifyURL, isThirdParty} = require("url"); | 22 let {extractHostFromFrame, stringifyURL, isThirdParty} = require("url"); |
21 let {getKey, checkWhitelisted} = require("whitelisting"); | 23 let {getKey, checkWhitelisted} = require("whitelisting"); |
22 let {defaultMatcher} = require("matcher"); | 24 let {defaultMatcher} = require("matcher"); |
23 let {RegExpFilter} = require("filterClasses"); | 25 let {RegExpFilter} = require("filterClasses"); |
| 26 let {port} = require("messaging"); |
24 | 27 |
25 function isValidString(s) { | 28 function isValidString(s) { |
26 return s && s.indexOf("\0") == -1; | 29 return s && s.indexOf("\0") == -1; |
27 } | 30 } |
28 | 31 |
29 function escapeChar(chr) | 32 function escapeChar(chr) |
30 { | 33 { |
31 let code = chr.charCodeAt(0); | 34 let code = chr.charCodeAt(0); |
32 | 35 |
33 // Control characters and leading digits must be escaped based on | 36 // Control characters and leading digits must be escaped based on |
(...skipping 25 matching lines...) Expand all Loading... |
59 * | 62 * |
60 * @param {string} value | 63 * @param {string} value |
61 * @return {string} | 64 * @return {string} |
62 * @static | 65 * @static |
63 */ | 66 */ |
64 exports.quoteCSS = function(value) | 67 exports.quoteCSS = function(value) |
65 { | 68 { |
66 return '"' + value.replace(/["\\\{\}\x00-\x1F\x7F]/g, escapeChar) + '"'; | 69 return '"' + value.replace(/["\\\{\}\x00-\x1F\x7F]/g, escapeChar) + '"'; |
67 }; | 70 }; |
68 | 71 |
69 /** | 72 function composeFilters(details) |
70 * Generates filters to block an element. | |
71 * @param {Object} details | |
72 * @param {string} details.tagName The element's tag name | |
73 * @param {string} details.id The element's "id" attribute | |
74 * @param {string} details.src The element's "src" attribute | |
75 * @param {string} details.style The element's "style" attribute | |
76 * @param {string[]} details.classes The classes given by the element's "class"
attribute | |
77 * @param {string[]} details.urls The URLs considered when loading the eleme
nt | |
78 * @param {string} details.type The request type (will be ignored if there
are no URLs) | |
79 * @param {string} details.baseURL The URL of the document containing the ele
ment | |
80 * @param {Page} details.page The page containing the element | |
81 * @param {Frame} details.frame The frame containing the element | |
82 * | |
83 * @return {object} An object holding the list of generated filters and | |
84 * the list of CSS selectors for the included element | |
85 * hiding filters: {filters: [...], selectors: [...]} | |
86 */ | |
87 exports.composeFilters = function(details) | |
88 { | 73 { |
89 let filters = []; | 74 let filters = []; |
90 let selectors = []; | 75 let selectors = []; |
91 | 76 |
92 let page = details.page; | 77 let page = details.page; |
93 let frame = details.frame; | 78 let frame = details.frame; |
94 | 79 |
95 if (!checkWhitelisted(page, frame)) | 80 if (!checkWhitelisted(page, frame)) |
96 { | 81 { |
97 let typeMask = RegExpFilter.typeMap[details.type]; | 82 let typeMask = RegExpFilter.typeMap[details.type]; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 if (isValidString(details.style) && selectors.length == 0 && filters.lengt
h == 0) | 129 if (isValidString(details.style) && selectors.length == 0 && filters.lengt
h == 0) |
145 selectors.push(escapeCSS(details.tagName) + "[style=" + quoteCSS(details
.style) + "]"); | 130 selectors.push(escapeCSS(details.tagName) + "[style=" + quoteCSS(details
.style) + "]"); |
146 | 131 |
147 // Add an element hiding filter for each generated CSS selector | 132 // Add an element hiding filter for each generated CSS selector |
148 for (let selector of selectors) | 133 for (let selector of selectors) |
149 filters.push(docDomain.replace(/^www\./, "") + "##" + selector); | 134 filters.push(docDomain.replace(/^www\./, "") + "##" + selector); |
150 } | 135 } |
151 } | 136 } |
152 | 137 |
153 return {filters: filters, selectors: selectors}; | 138 return {filters: filters, selectors: selectors}; |
154 }; | 139 } |
| 140 |
| 141 port.on("composer.ready", (message, sender) => |
| 142 { |
| 143 htmlPages.set(sender.page, null); |
| 144 refreshIconAndContextMenu(sender.page); |
| 145 }); |
| 146 |
| 147 port.on("composer.openDialog", (message, sender) => |
| 148 { |
| 149 return new Promise(resolve => |
| 150 { |
| 151 ext.windows.create({ |
| 152 url: ext.getURL("block.html"), |
| 153 left: 50, |
| 154 top: 50, |
| 155 width: 420, |
| 156 height: 200, |
| 157 focused: true, |
| 158 type: "popup" |
| 159 }, |
| 160 popupPage => |
| 161 { |
| 162 let popupPageId = popupPage.id; |
| 163 function onRemoved(removedPageId) |
| 164 { |
| 165 if (popupPageId == removedPageId) |
| 166 { |
| 167 sender.page.sendMessage({ |
| 168 type: "blockelement-popup-closed", |
| 169 popupId: popupPageId |
| 170 }); |
| 171 ext.pages.onRemoved.removeListener(onRemoved); |
| 172 } |
| 173 } |
| 174 ext.pages.onRemoved.addListener(onRemoved); |
| 175 resolve(popupPageId); |
| 176 }); |
| 177 }); |
| 178 }); |
| 179 |
| 180 port.on("composer.getFilters", (message, sender) => |
| 181 { |
| 182 return composeFilters({ |
| 183 tagName: message.tagName, |
| 184 id: message.id, |
| 185 src: message.src, |
| 186 style: message.style, |
| 187 classes: message.classes, |
| 188 urls: message.urls, |
| 189 type: message.mediatype, |
| 190 baseURL: message.baseURL, |
| 191 page: sender.page, |
| 192 frame: sender.frame |
| 193 }); |
| 194 }); |
OLD | NEW |