| Index: lib/requestBlocker.js |
| =================================================================== |
| --- a/lib/requestBlocker.js |
| +++ b/lib/requestBlocker.js |
| @@ -90,19 +90,53 @@ |
| } |
| } |
| -ext.webRequest.onBeforeRequest.addListener((url, type, page, frame) => |
| +browser.webRequest.onBeforeRequest.addListener(details => |
| { |
| + // Never block top-level documents. |
| + if (details.type == "main_frame") |
| + return; |
| + |
| + // Filter out requests from non web protocols. Ideally, we'd explicitly |
| + // specify the protocols we are interested in (i.e. http://, https://, |
| + // ws:// and wss://) with the url patterns, given below, when adding this |
| + // listener. But unfortunately, Chrome <=57 doesn't support the WebSocket |
| + // protocol and is causing an error if it is given. |
| + let url = new URL(details.url); |
| + if (url.protocol != "http:" && url.protocol != "https:" && |
| + url.protocol != "ws:" && url.protocol != "wss:") |
| + return; |
|
kzar
2018/04/05 11:26:26
Please could you add the braces here, to be consis
Sebastian Noack
2018/04/05 16:04:09
See below.
|
| + |
| + // Firefox (only) allows to intercept requests sent by the browser |
| + // and other extensions. We don't want to block these. |
| + if (details.originUrl) |
| + { |
| + let originUrl = new URL(details.originUrl); |
| + if (originUrl.protocol == "chrome:" || |
| + originUrl.protocol == "moz-extension:") |
| + return; |
|
kzar
2018/04/05 11:26:26
Please can you add the braces back, since the rule
Sebastian Noack
2018/04/05 16:04:09
Since when is this the rule? This is the first tim
Manish Jethani
2018/04/06 14:12:48
As far back as I can remember (which is not too fa
|
| + } |
| + |
| + let frame = ext.getFrame( |
|
kzar
2018/04/05 11:26:26
Seems like previously we didn't call getFrame if d
Sebastian Noack
2018/04/05 16:04:09
getFrame() just returns undefined if there is not
|
| + details.tabId, |
| + // We are looking for the frame that contains the element which |
| + // has triggered this request. For most requests (e.g. images) we |
| + // can just use the request's frame ID, but for subdocument requests |
| + // (e.g. iframes) we must instead use the request's parent frame ID. |
| + details.type == "sub_frame" ? details.parentFrameId : details.frameId |
| + ); |
| + |
| + let page = null; |
| let docDomain = null; |
| let sitekey = null; |
| + let thirdParty = false; |
| let specificOnly = false; |
| - let thirdParty = false; |
| - let urlString = stringifyURL(url); |
| + if (frame) |
| + { |
| + page = new ext.Page({id: details.tabId}); |
| - if (frame && page) |
| - { |
| if (checkWhitelisted(page, frame)) |
| - return true; |
| + return; |
| docDomain = extractHostFromFrame(frame); |
| sitekey = getKey(page, frame); |
| @@ -111,20 +145,21 @@ |
| RegExpFilter.typeMap.GENERICBLOCK); |
| } |
| - let mappedType = resourceTypes.get(type) || "OTHER"; |
| - |
| + let urlString = stringifyURL(url); |
| + let type = resourceTypes.get(details.type) || "OTHER"; |
| let filter = defaultMatcher.matchesAny( |
| - urlString, RegExpFilter.typeMap[mappedType], |
| + urlString, RegExpFilter.typeMap[type], |
| docDomain, thirdParty, sitekey, specificOnly |
| ); |
| setTimeout(onBeforeRequestAsync, 0, page, urlString, |
| - mappedType, docDomain, |
| + type, docDomain, |
| thirdParty, sitekey, |
| specificOnly, filter); |
| - return !(filter instanceof BlockingFilter); |
| -}); |
| + if (filter instanceof BlockingFilter) |
| + return {cancel: true}; |
| +}, {urls: ["<all_urls>"]}, ["blocking"]); |
| port.on("filters.collapse", (message, sender) => |
| { |