Index: lib/popupBlocker.js |
=================================================================== |
--- a/lib/popupBlocker.js |
+++ b/lib/popupBlocker.js |
@@ -1,6 +1,6 @@ |
/* |
* This file is part of Adblock Plus <https://adblockplus.org/>, |
- * Copyright (C) 2006-2016 Eyeo GmbH |
+ * Copyright (C) 2006-2017 eyeo GmbH |
* |
* Adblock Plus is free software: you can redistribute it and/or modify |
* it under the terms of the GNU General Public License version 3 as |
@@ -20,25 +20,21 @@ |
"use strict"; |
const {defaultMatcher} = require("matcher"); |
-const {BlockingFilter} = require("filterClasses"); |
+const {BlockingFilter, RegExpFilter} = require("filterClasses"); |
const {stringifyURL, isThirdParty, extractHostFromFrame} = require("url"); |
const {checkWhitelisted} = require("whitelisting"); |
const {logRequest} = require("devtools"); |
-let loadingPopups = Object.create(null); |
- |
-function hasLoadingPopups() |
-{ |
- return Object.keys(loadingPopups).length > 0; |
-} |
+let loadingPopups = new Map(); |
function forgetPopup(tabId) |
{ |
- delete loadingPopups[tabId]; |
+ loadingPopups.delete(tabId); |
- if (!hasLoadingPopups()) |
+ if (loadingPopups.size == 0) |
{ |
- chrome.webRequest.onBeforeRequest.removeListener(onBeforeRequest); |
+ chrome.webRequest.onBeforeRequest.removeListener(onPopupURLChanged); |
+ chrome.webNavigation.onCommitted.removeListener(onPopupURLChanged); |
chrome.webNavigation.onCompleted.removeListener(onCompleted); |
chrome.tabs.onRemoved.removeListener(forgetPopup); |
} |
@@ -71,9 +67,13 @@ |
); |
} |
-function onBeforeRequest(details) |
+function onPopupURLChanged(details) |
{ |
- let popup = loadingPopups[details.tabId]; |
+ // Ignore frames inside the popup window. |
+ if (details.frameId != 0) |
+ return; |
+ |
+ let popup = loadingPopups.get(details.tabId); |
if (popup) |
{ |
popup.url = details.url; |
@@ -90,35 +90,37 @@ |
chrome.webNavigation.onCreatedNavigationTarget.addListener(details => |
{ |
- if (!hasLoadingPopups()) |
+ if (loadingPopups.size == 0) |
{ |
chrome.webRequest.onBeforeRequest.addListener( |
- onBeforeRequest, |
+ onPopupURLChanged, |
{ |
- urls: ["<all_urls>"], |
+ urls: ["http://*/*", "https://*/*"], |
types: ["main_frame"] |
} |
); |
- |
+ chrome.webNavigation.onCommitted.addListener(onPopupURLChanged); |
chrome.webNavigation.onCompleted.addListener(onCompleted); |
chrome.tabs.onRemoved.addListener(forgetPopup); |
} |
- let tabId = details.tabId; |
- let popup = loadingPopups[tabId] = { |
+ let popup = { |
url: details.url, |
sourcePage: new ext.Page({id: details.sourceTabId}), |
sourceFrame: null |
}; |
+ |
+ loadingPopups.set(details.tabId, popup); |
+ |
let frame = ext.getFrame(details.sourceTabId, details.sourceFrameId); |
if (checkWhitelisted(popup.sourcePage, frame)) |
{ |
- forgetPopup(tabId); |
+ forgetPopup(details.tabId); |
} |
else |
{ |
popup.sourceFrame = frame; |
- checkPotentialPopup(tabId, popup); |
+ checkPotentialPopup(details.tabId, popup); |
} |
}); |