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