Index: lib/requestBlocker.js |
=================================================================== |
--- a/lib/requestBlocker.js |
+++ b/lib/requestBlocker.js |
@@ -29,6 +29,8 @@ |
const {port} = require("messaging"); |
const devtools = require("devtools"); |
+const extensionProtocol = new URL(browser.extension.getURL("")).protocol; |
+ |
// Chrome can't distinguish between OBJECT_SUBREQUEST and OBJECT requests. |
if (!browser.webRequest.ResourceType || |
!("OBJECT_SUBREQUEST" in browser.webRequest.ResourceType)) |
@@ -128,23 +130,25 @@ |
url.protocol != "ws:" && url.protocol != "wss:") |
return; |
- let originUrl = null; |
- if (details.originUrl) |
- { |
- originUrl = new URL(details.originUrl); |
+ // Firefox provides us with the full origin URL, while Chromium (>=63) |
+ // provides only the protocol + host of the (top-level) document which |
+ // the request originates from through the "initiator" property. |
+ let originUrl = details.originUrl ? new URL(details.originUrl) : |
+ details.initiator ? new URL(details.initiator) : null; |
- // Firefox (only) allows to intercept requests sent by the browser |
- // and other extensions. We don't want to block these. |
- if (originUrl.protocol == "chrome:" || |
- originUrl.protocol == "moz-extension:") |
- return; |
- } |
- // Fallback to "initiator" on Chrome >=63. It doesn't include the |
- // path (unlike "originUrl" on Firefox), but is still good enough |
- // (in case the tab/frame is unknown) for the $domain filter option |
- // and most document exception rules which only match the domain part. |
- else if (details.initiator) |
- originUrl = new URL(details.initiator); |
+ // Ignore requests sent by extensions or by the browser itself: |
+ // * Firefox intercepts requests sent by any extensions, indicated with |
+ // an "originURL" starting with "moz-extension:". |
+ // * Chromium intercepts requests sent by this extension only, indicated |
+ // on Chromium >=63 with an "initiator" starting with "chrome-extension:". |
+ // * On Firefox, requests that don't relate to any document or extension are |
+ // indicated with an "originUrl" starting with "chrome:". |
+ // * On Chromium >=63, requests that don't relate to any document or extension |
+ // have no "initiator". But since on older Chromium versions, no request |
+ // has an "initiator", we have to check for the tabId as well. |
+ if (originUrl ? originUrl.protocol == extensionProtocol || |
+ originUrl.protocol == "chrome:" : details.tabId == -1) |
+ return; |
let page = null; |
let frame = null; |