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-present eyeo GmbH | 3 * Copyright (C) 2006-present 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 |
(...skipping 24 matching lines...) Expand all Loading... |
35 // See https://crbug.com/608854 | 35 // See https://crbug.com/608854 |
36 const styleSheetRemovalSupported = info.platform == "gecko"; | 36 const styleSheetRemovalSupported = info.platform == "gecko"; |
37 | 37 |
38 const selectorGroupSize = 1024; | 38 const selectorGroupSize = 1024; |
39 | 39 |
40 let userStyleSheetsSupported = true; | 40 let userStyleSheetsSupported = true; |
41 | 41 |
42 let snippetsLibrarySource = ""; | 42 let snippetsLibrarySource = ""; |
43 let executableCode = new Map(); | 43 let executableCode = new Map(); |
44 | 44 |
| 45 let registeredContentScripts = new Map(); |
| 46 |
45 function* splitSelectors(selectors) | 47 function* splitSelectors(selectors) |
46 { | 48 { |
47 // Chromium's Blink engine supports only up to 8,192 simple selectors, and | 49 // Chromium's Blink engine supports only up to 8,192 simple selectors, and |
48 // even fewer compound selectors, in a rule. The exact number of selectors | 50 // even fewer compound selectors, in a rule. The exact number of selectors |
49 // that would work depends on their sizes (e.g. "#foo .bar" has a size of 2). | 51 // that would work depends on their sizes (e.g. "#foo .bar" has a size of 2). |
50 // Since we don't know the sizes of the selectors here, we simply split them | 52 // Since we don't know the sizes of the selectors here, we simply split them |
51 // into groups of 1,024, based on the reasonable assumption that the average | 53 // into groups of 1,024, based on the reasonable assumption that the average |
52 // selector won't have a size greater than 8. The alternative would be to | 54 // selector won't have a size greater than 8. The alternative would be to |
53 // calculate the sizes of the selectors and divide them up accordingly, but | 55 // calculate the sizes of the selectors and divide them up accordingly, but |
54 // this approach is more efficient and has worked well in practice. In theory | 56 // this approach is more efficient and has worked well in practice. In theory |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 let inline = !userStyleSheetsSupported; | 224 let inline = !userStyleSheetsSupported; |
223 | 225 |
224 let {elemhide, snippets} = message.filterTypes || | 226 let {elemhide, snippets} = message.filterTypes || |
225 {elemhide: true, snippets: true}; | 227 {elemhide: true, snippets: true}; |
226 | 228 |
227 if (!checkWhitelisted(sender.page, sender.frame, null, | 229 if (!checkWhitelisted(sender.page, sender.frame, null, |
228 RegExpFilter.typeMap.DOCUMENT)) | 230 RegExpFilter.typeMap.DOCUMENT)) |
229 { | 231 { |
230 let hostname = extractHostFromFrame(sender.frame); | 232 let hostname = extractHostFromFrame(sender.frame); |
231 | 233 |
232 if (snippets) | 234 if (snippets && !browser.contentScripts) |
233 { | 235 { |
234 for (let script of Snippets.getScriptsForDomain(hostname)) | 236 for (let script of Snippets.getScriptsForDomain(hostname)) |
235 executeScript(script, sender.page.id, sender.frame.id); | 237 executeScript(script, sender.page.id, sender.frame.id); |
236 } | 238 } |
237 | 239 |
238 if (elemhide && !checkWhitelisted(sender.page, sender.frame, null, | 240 if (elemhide && !checkWhitelisted(sender.page, sender.frame, null, |
239 RegExpFilter.typeMap.ELEMHIDE)) | 241 RegExpFilter.typeMap.ELEMHIDE)) |
240 { | 242 { |
241 let specificOnly = checkWhitelisted(sender.page, sender.frame, null, | 243 let specificOnly = checkWhitelisted(sender.page, sender.frame, null, |
242 RegExpFilter.typeMap.GENERICHIDE); | 244 RegExpFilter.typeMap.GENERICHIDE); |
(...skipping 29 matching lines...) Expand all Loading... |
272 updateFrameStyles(sender.page.id, sender.frame.id, message.selectors, | 274 updateFrameStyles(sender.page.id, sender.frame.id, message.selectors, |
273 message.groupName, message.appendOnly); | 275 message.groupName, message.appendOnly); |
274 }); | 276 }); |
275 | 277 |
276 fetch(browser.extension.getURL("/snippets.js"), {cache: "no-cache"}) | 278 fetch(browser.extension.getURL("/snippets.js"), {cache: "no-cache"}) |
277 .then(response => response.ok ? response.text() : "") | 279 .then(response => response.ok ? response.text() : "") |
278 .then(text => | 280 .then(text => |
279 { | 281 { |
280 snippetsLibrarySource = text; | 282 snippetsLibrarySource = text; |
281 }); | 283 }); |
| 284 |
| 285 if (browser.contentScripts) |
| 286 { |
| 287 Snippets.on("snippets.filterAdded", ({script, domains, text}) => |
| 288 { |
| 289 let details = { |
| 290 js: [{code: getExecutableCode(script)}], |
| 291 allFrames: true, |
| 292 matchAboutBlank: true, |
| 293 runAt: "document_start", |
| 294 matches: [] |
| 295 }; |
| 296 |
| 297 for (let [domain, include] of domains) |
| 298 { |
| 299 if (domain == "") |
| 300 continue; |
| 301 |
| 302 if (!include && !details.excludeMatches) |
| 303 details.excludeMatches = []; |
| 304 |
| 305 let matches = include ? details.matches : details.excludeMatches; |
| 306 |
| 307 matches.push(`http://*.${domain}/*`); |
| 308 matches.push(`https://*.${domain}/*`); |
| 309 } |
| 310 |
| 311 browser.contentScripts.register(details).then(contentScript => |
| 312 { |
| 313 registeredContentScripts.set(text, contentScript); |
| 314 }); |
| 315 }); |
| 316 |
| 317 Snippets.on("snippets.filterRemoved", ({text}) => |
| 318 { |
| 319 let contentScript = registeredContentScripts.get(text); |
| 320 if (contentScript) |
| 321 { |
| 322 contentScript.unregister(); |
| 323 registeredContentScripts.delete(text); |
| 324 } |
| 325 }); |
| 326 |
| 327 Snippets.on("snippets.filtersCleared", () => |
| 328 { |
| 329 for (let contentScript of registeredContentScripts.values()) |
| 330 contentScript.unregister(); |
| 331 |
| 332 registeredContentScripts.clear(); |
| 333 }); |
| 334 } |
OLD | NEW |