| 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-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 /* globals checkCollapse, elemhide, getURLsFromElement, typeMap */ | 
 |   19  | 
|   18 "use strict"; |   20 "use strict"; | 
|   19  |   21  | 
|   20 // The page ID for the popup filter selection dialog (top frame only). |   22 // The page ID for the popup filter selection dialog (top frame only). | 
|   21 let blockelementPopupId = null; |   23 let blockelementPopupId = null; | 
|   22  |   24  | 
|   23 // Element picking state (top frame only). |   25 // Element picking state (top frame only). | 
|   24 let currentlyPickingElement = false; |   26 let currentlyPickingElement = false; | 
|   25 let lastMouseOverEvent = null; |   27 let lastMouseOverEvent = null; | 
|   26  |   28  | 
|   27 // During element picking this is the currently highlighted element. When |   29 // During element picking this is the currently highlighted element. When | 
|   28 // element has been picked this is the element that is due to be blocked. |   30 // element has been picked this is the element that is due to be blocked. | 
|   29 let currentElement = null; |   31 let currentElement = null; | 
|   30  |   32  | 
|   31 // Highlighting state, used by the top frame during element picking and all |   33 // Highlighting state, used by the top frame during element picking and all | 
|   32 // frames when the chosen element is highlighted red. |   34 // frames when the chosen element is highlighted red. | 
|   33 let highlightedElementsSelector = null; |   35 let highlightedElementsSelector = null; | 
|   34 let highlightedElementsInterval = null; |   36 let highlightedElementsInterval = null; | 
|   35  |   37  | 
|   36 // Last right click state stored for element blocking via the context menu. |   38 // Last right click state stored for element blocking via the context menu. | 
|   37 let lastRightClickEvent = null; |   39 let lastRightClickEvent = null; | 
|   38 let lastRightClickEventIsMostRecent = false; |   40 let lastRightClickEventIsMostRecent = false; | 
|   39  |   41  | 
|   40  |   42  | 
|   41 /* Utilities */ |   43 /* Utilities */ | 
|   42  |   44  | 
|   43 function getFiltersForElement(element, callback) |   45 function getFiltersForElement(element, callback) | 
|   44 { |   46 { | 
|   45   let src = element.getAttribute("src"); |   47   let src = element.getAttribute("src"); | 
|   46   ext.backgroundPage.sendMessage( |   48   ext.backgroundPage.sendMessage({ | 
|   47   { |  | 
|   48     type: "composer.getFilters", |   49     type: "composer.getFilters", | 
|   49     tagName: element.localName, |   50     tagName: element.localName, | 
|   50     id: element.id, |   51     id: element.id, | 
|   51     src: src && src.length <= 1000 ? src : null, |   52     src: src && src.length <= 1000 ? src : null, | 
|   52     style: element.getAttribute("style"), |   53     style: element.getAttribute("style"), | 
|   53     classes: Array.prototype.slice.call(element.classList), |   54     classes: Array.prototype.slice.call(element.classList), | 
|   54     urls: getURLsFromElement(element), |   55     urls: getURLsFromElement(element), | 
|   55     mediatype: typeMap[element.localName], |   56     mediatype: typeMap.get(element.localName), | 
|   56     baseURL: document.location.href |   57     baseURL: document.location.href | 
|   57   }, |   58   }, | 
|   58   response => |   59   response => | 
|   59   { |   60   { | 
|   60     callback(response.filters, response.selectors); |   61     callback(response.filters, response.selectors); | 
|   61   }); |   62   }); | 
|   62 } |   63 } | 
|   63  |   64  | 
|   64 function getBlockableElementOrAncestor(element, callback) |   65 function getBlockableElementOrAncestor(element, callback) | 
|   65 { |   66 { | 
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  381 { |  382 { | 
|  382   if (!currentElement) |  383   if (!currentElement) | 
|  383     return; |  384     return; | 
|  384  |  385  | 
|  385   let element = currentElement.prisoner || currentElement; |  386   let element = currentElement.prisoner || currentElement; | 
|  386   getFiltersForElement(element, (filters, selectors) => |  387   getFiltersForElement(element, (filters, selectors) => | 
|  387   { |  388   { | 
|  388     if (currentlyPickingElement) |  389     if (currentlyPickingElement) | 
|  389       stopPickingElement(); |  390       stopPickingElement(); | 
|  390  |  391  | 
|  391     ext.backgroundPage.sendMessage( |  392     ext.backgroundPage.sendMessage({ | 
|  392     { |  | 
|  393       type: "composer.openDialog" |  393       type: "composer.openDialog" | 
|  394     }, |  394     }, | 
|  395     popupId => |  395     popupId => | 
|  396     { |  396     { | 
|  397       ext.backgroundPage.sendMessage( |  397       ext.backgroundPage.sendMessage({ | 
|  398       { |  | 
|  399         type: "forward", |  398         type: "forward", | 
|  400         targetPageId: popupId, |  399         targetPageId: popupId, | 
|  401         payload: |  400         payload: {type: "composer.dialog.init", filters} | 
|  402         { |  | 
|  403           type: "composer.dialog.init", |  | 
|  404           filters: filters |  | 
|  405         } |  | 
|  406       }); |  401       }); | 
|  407  |  402  | 
|  408       // Only the top frame keeps a record of the popup window's ID, |  403       // Only the top frame keeps a record of the popup window's ID, | 
|  409       // so if this isn't the top frame we need to pass the ID on. |  404       // so if this isn't the top frame we need to pass the ID on. | 
|  410       if (window == window.top) |  405       if (window == window.top) | 
|  411       { |  406       { | 
|  412         blockelementPopupId = popupId; |  407         blockelementPopupId = popupId; | 
|  413       } |  408       } | 
|  414       else |  409       else | 
|  415       { |  410       { | 
|  416         ext.backgroundPage.sendMessage( |  411         ext.backgroundPage.sendMessage({ | 
|  417         { |  | 
|  418           type: "forward", |  412           type: "forward", | 
|  419           payload: |  413           payload: {type: "composer.content.dialogOpened", popupId} | 
|  420           { |  | 
|  421             type: "composer.content.dialogOpened", |  | 
|  422             popupId: popupId |  | 
|  423           } |  | 
|  424         }); |  414         }); | 
|  425       } |  415       } | 
|  426     }); |  416     }); | 
|  427  |  417  | 
|  428     if (selectors.length > 0) |  418     if (selectors.length > 0) | 
|  429       highlightElements(selectors.join(",")); |  419       highlightElements(selectors.join(",")); | 
|  430  |  420  | 
|  431     highlightElement(currentElement, "#fd1708", "#f6a1b5"); |  421     highlightElement(currentElement, "#fd1708", "#f6a1b5"); | 
|  432   }); |  422   }); | 
|  433  |  423  | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
|  454 /* Core logic */ |  444 /* Core logic */ | 
|  455  |  445  | 
|  456 // We're done with the block element feature for now, tidy everything up. |  446 // We're done with the block element feature for now, tidy everything up. | 
|  457 function deactivateBlockElement() |  447 function deactivateBlockElement() | 
|  458 { |  448 { | 
|  459   if (currentlyPickingElement) |  449   if (currentlyPickingElement) | 
|  460     stopPickingElement(); |  450     stopPickingElement(); | 
|  461  |  451  | 
|  462   if (blockelementPopupId != null) |  452   if (blockelementPopupId != null) | 
|  463   { |  453   { | 
|  464     ext.backgroundPage.sendMessage( |  454     ext.backgroundPage.sendMessage({ | 
|  465     { |  | 
|  466       type: "forward", |  455       type: "forward", | 
|  467       targetPageId: blockelementPopupId, |  456       targetPageId: blockelementPopupId, | 
|  468       payload: |  457       payload: | 
|  469       { |  458       { | 
|  470         type: "composer.dialog.close" |  459         type: "composer.dialog.close" | 
|  471       } |  460       } | 
|  472     }); |  461     }); | 
|  473  |  462  | 
|  474     blockelementPopupId = null; |  463     blockelementPopupId = null; | 
|  475   } |  464   } | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
|  497   // this because the contextMenu API only provides a URL, not the actual DOM |  486   // this because the contextMenu API only provides a URL, not the actual DOM | 
|  498   // element. |  487   // element. | 
|  499   //   We also need to make sure that the previous right click event, |  488   //   We also need to make sure that the previous right click event, | 
|  500   // if there is one, is removed. We don't know which frame it is in so we must |  489   // if there is one, is removed. We don't know which frame it is in so we must | 
|  501   // send a message to the other frames to clear their old right click events. |  490   // send a message to the other frames to clear their old right click events. | 
|  502   document.addEventListener("contextmenu", event => |  491   document.addEventListener("contextmenu", event => | 
|  503   { |  492   { | 
|  504     lastRightClickEvent = event; |  493     lastRightClickEvent = event; | 
|  505     lastRightClickEventIsMostRecent = true; |  494     lastRightClickEventIsMostRecent = true; | 
|  506  |  495  | 
|  507     ext.backgroundPage.sendMessage( |  496     ext.backgroundPage.sendMessage({ | 
|  508     { |  | 
|  509       type: "forward", |  497       type: "forward", | 
|  510       payload: |  498       payload: | 
|  511       { |  499       { | 
|  512         type: "composer.content.clearPreviousRightClickEvent" |  500         type: "composer.content.clearPreviousRightClickEvent" | 
|  513       } |  501       } | 
|  514     }); |  502     }); | 
|  515   }, true); |  503   }, true); | 
|  516  |  504  | 
|  517   ext.onMessage.addListener((msg, sender, sendResponse) => |  505   ext.onMessage.addListener((msg, sender, sendResponse) => | 
|  518   { |  506   { | 
|  519     switch (msg.type) |  507     switch (msg.type) | 
|  520     { |  508     { | 
|  521       case "composer.content.getState": |  509       case "composer.content.getState": | 
|  522         if (window == window.top) |  510         if (window == window.top) | 
 |  511         { | 
|  523           sendResponse({ |  512           sendResponse({ | 
|  524             active: currentlyPickingElement || blockelementPopupId != null |  513             active: currentlyPickingElement || blockelementPopupId != null | 
|  525           }); |  514           }); | 
 |  515         } | 
|  526         break; |  516         break; | 
|  527       case "composer.content.startPickingElement": |  517       case "composer.content.startPickingElement": | 
|  528         if (window == window.top) |  518         if (window == window.top) | 
|  529           startPickingElement(); |  519           startPickingElement(); | 
|  530         break; |  520         break; | 
|  531       case "composer.content.contextMenuClicked": |  521       case "composer.content.contextMenuClicked": | 
|  532         let event = lastRightClickEvent; |  522         let event = lastRightClickEvent; | 
|  533         deactivateBlockElement(); |  523         deactivateBlockElement(); | 
|  534         if (event) |  524         if (event) | 
|  535         { |  525         { | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
|  565         break; |  555         break; | 
|  566       case "composer.content.dialogOpened": |  556       case "composer.content.dialogOpened": | 
|  567         if (window == window.top) |  557         if (window == window.top) | 
|  568           blockelementPopupId = msg.popupId; |  558           blockelementPopupId = msg.popupId; | 
|  569         break; |  559         break; | 
|  570       case "composer.content.dialogClosed": |  560       case "composer.content.dialogClosed": | 
|  571         // The onRemoved hook for the popup can create a race condition, so we |  561         // The onRemoved hook for the popup can create a race condition, so we | 
|  572         // to be careful here. (This is not perfect, but best we can do.) |  562         // to be careful here. (This is not perfect, but best we can do.) | 
|  573         if (window == window.top && blockelementPopupId == msg.popupId) |  563         if (window == window.top && blockelementPopupId == msg.popupId) | 
|  574         { |  564         { | 
|  575           ext.backgroundPage.sendMessage( |  565           ext.backgroundPage.sendMessage({ | 
|  576           { |  | 
|  577             type: "forward", |  566             type: "forward", | 
|  578             payload: |  567             payload: | 
|  579             { |  568             { | 
|  580               type: "composer.content.finished" |  569               type: "composer.content.finished" | 
|  581             } |  570             } | 
|  582           }); |  571           }); | 
|  583         } |  572         } | 
|  584         break; |  573         break; | 
|  585     } |  574     } | 
|  586   }); |  575   }); | 
|  587  |  576  | 
|  588   if (window == window.top) |  577   if (window == window.top) | 
|  589     ext.backgroundPage.sendMessage({type: "composer.ready"}); |  578     ext.backgroundPage.sendMessage({type: "composer.ready"}); | 
|  590 } |  579 } | 
| OLD | NEW |