| Index: lib/requestBlocker.js |
| =================================================================== |
| --- a/lib/requestBlocker.js |
| +++ b/lib/requestBlocker.js |
| @@ -24,19 +24,37 @@ |
| const {defaultMatcher} = require("matcher"); |
| const {FilterNotifier} = require("filterNotifier"); |
| const {Prefs} = require("prefs"); |
| const {checkWhitelisted, getKey} = require("whitelisting"); |
| const {stringifyURL, extractHostFromFrame, isThirdParty} = require("url"); |
| const {port} = require("messaging"); |
| const devtools = require("devtools"); |
| -// Chrome can't distinguish between OBJECT_SUBREQUEST and OBJECT requests. |
| +// Chrome and Firefox (WebExtensions) can't distinguish between |
| +// OBJECT_SUBREQUEST and OBJECT requests. |
| RegExpFilter.typeMap.OBJECT_SUBREQUEST = RegExpFilter.typeMap.OBJECT; |
| +// Map of content types reported by the browser to the respecitve content types |
| +// used by Adblock Plus. Other content types are simply mapped to OTHER. |
| +let resourceTypes = new Map(function*() |
| +{ |
| + for (let type in RegExpFilter.typeMap) |
| + yield [type.toLowerCase(), type]; |
| + |
| + yield ["sub_frame", "SUBDOCUMENT"]; |
| + |
| + // Treat navigator.sendBeacon() the same as <a ping>, it's essentially the |
| + // same concept - merely generalized. |
| + yield ["beacon", "PING"]; |
| + |
| + // Treat <img srcset> and <picture> the same as other images. |
| + yield ["imageset", "IMAGE"]; |
| +}()); |
| + |
| function onBeforeRequestAsync(page, url, type, docDomain, |
| thirdParty, sitekey, |
| specificOnly, filter) |
| { |
| if (filter) |
| FilterNotifier.emit("filter.hitCount", filter, 0, 0, page); |
| if (devtools) |
| @@ -58,23 +76,25 @@ |
| let docDomain = extractHostFromFrame(frame); |
| let thirdParty = isThirdParty(url, docDomain); |
| let sitekey = getKey(page, frame); |
| let specificOnly = !!checkWhitelisted( |
| page, frame, RegExpFilter.typeMap.GENERICBLOCK |
| ); |
| + let mappedType = resourceTypes.get(type) || "OTHER"; |
| + |
| let filter = defaultMatcher.matchesAny( |
| - urlString, RegExpFilter.typeMap[type], |
| + urlString, RegExpFilter.typeMap[mappedType], |
| docDomain, thirdParty, sitekey, specificOnly |
| ); |
| setTimeout(onBeforeRequestAsync, 0, page, urlString, |
| - type, docDomain, |
| + mappedType, docDomain, |
| thirdParty, sitekey, |
| specificOnly, filter); |
| return !(filter instanceof BlockingFilter); |
| }); |
| port.on("filters.collapse", (message, sender) => |
| { |