| LEFT | RIGHT | 
|---|
| 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-2017 eyeo GmbH | 3  * Copyright (C) 2006-2017 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 const {RegExpFilter} = require("filterClasses"); |  | 
| 21 const {ElemHide} = require("elemHide"); |  | 
| 22 const {checkWhitelisted} = require("whitelisting"); |  | 
| 23 const {extractHostFromFrame} = require("url"); |  | 
| 24 const {hideElements} = require("css"); |  | 
| 25 const {port} = require("messaging"); | 20 const {port} = require("messaging"); | 
| 26 const devtools = require("devtools"); |  | 
| 27 |  | 
| 28 let tryInsertCSS = true; |  | 
| 29 |  | 
| 30 port.on("get-selectors", (msg, sender) => |  | 
| 31 { |  | 
| 32   let selectors; |  | 
| 33   let trace = devtools && devtools.hasPanel(sender.page); |  | 
| 34 |  | 
| 35   if (!checkWhitelisted(sender.page, sender.frame, |  | 
| 36                         RegExpFilter.typeMap.DOCUMENT | |  | 
| 37                         RegExpFilter.typeMap.ELEMHIDE)) |  | 
| 38   { |  | 
| 39     let specificOnly = checkWhitelisted(sender.page, sender.frame, |  | 
| 40                                         RegExpFilter.typeMap.GENERICHIDE); |  | 
| 41     selectors = ElemHide.getSelectorsForDomain( |  | 
| 42       extractHostFromFrame(sender.frame), |  | 
| 43       specificOnly ? ElemHide.SPECIFIC_ONLY : ElemHide.ALL_MATCHING |  | 
| 44     ); |  | 
| 45   } |  | 
| 46   else |  | 
| 47   { |  | 
| 48     selectors = []; |  | 
| 49   } |  | 
| 50 |  | 
| 51   if (!tryInsertCSS) |  | 
| 52     return {selectors, trace, inject: true}; |  | 
| 53 |  | 
| 54   return new Promise(resolve => |  | 
| 55   { |  | 
| 56     hideElements(sender.page.id, sender.frame.id, selectors, error => |  | 
| 57     { |  | 
| 58       if (error && /\bError processing cssOrigin\b/.test(error.message) != -1) |  | 
| 59         tryInsertCSS = false; |  | 
| 60 |  | 
| 61       let response = {trace, inject: !!error}; |  | 
| 62 |  | 
| 63       if (trace || error) |  | 
| 64         response.selectors = selectors; |  | 
| 65 |  | 
| 66       resolve(response); |  | 
| 67     }); |  | 
| 68   }); |  | 
| 69 }); |  | 
| 70 |  | 
| 71 port.on("hide-elements", (msg, sender) => |  | 
| 72 { |  | 
| 73   return new Promise(resolve => |  | 
| 74   { |  | 
| 75     hideElements(sender.page.id, sender.frame.id, msg.selectors, error => |  | 
| 76     { |  | 
| 77       resolve({success: !error}); |  | 
| 78     }); |  | 
| 79   }); |  | 
| 80 }); |  | 
| 81 | 21 | 
| 82 port.on("forward", (msg, sender) => | 22 port.on("forward", (msg, sender) => | 
| 83 { | 23 { | 
| 84   let targetPage; | 24   let targetPage; | 
| 85   if (msg.targetPageId) | 25   if (msg.targetPageId) | 
| 86     targetPage = ext.getPage(msg.targetPageId); | 26     targetPage = ext.getPage(msg.targetPageId); | 
| 87   else | 27   else | 
| 88     targetPage = sender.page; | 28     targetPage = sender.page; | 
| 89 | 29 | 
| 90   if (targetPage) | 30   if (targetPage) | 
| 91   { | 31   { | 
| 92     msg.payload.sender = sender.page.id; | 32     msg.payload.sender = sender.page.id; | 
| 93     if (msg.expectsResponse) | 33     if (msg.expectsResponse) | 
| 94       return new Promise(targetPage.sendMessage.bind(targetPage, msg.payload)); | 34       return new Promise(targetPage.sendMessage.bind(targetPage, msg.payload)); | 
| 95     targetPage.sendMessage(msg.payload); | 35     targetPage.sendMessage(msg.payload); | 
| 96   } | 36   } | 
| 97 }); | 37 }); | 
| LEFT | RIGHT | 
|---|