| Index: lib/abp2blocklist.js |
| =================================================================== |
| --- a/lib/abp2blocklist.js |
| +++ b/lib/abp2blocklist.js |
| @@ -19,30 +19,38 @@ |
| "use strict"; |
| let filterClasses = require("filterClasses"); |
| let punycode = require("punycode"); |
| const selectorLimit = 5000; |
| const typeMap = filterClasses.RegExpFilter.typeMap; |
| -const whitelistableRequestTypes = (typeMap.IMAGE |
| - | typeMap.STYLESHEET |
| - | typeMap.SCRIPT |
| - | typeMap.FONT |
| - | typeMap.MEDIA |
| - | typeMap.POPUP |
| - | typeMap.OBJECT |
| - | typeMap.OBJECT_SUBREQUEST |
| - | typeMap.XMLHTTPREQUEST |
| - | typeMap.WEBSOCKET |
| - | typeMap.WEBRTC |
| - | typeMap.PING |
| - | typeMap.SUBDOCUMENT |
| - | typeMap.OTHER); |
| + |
| +const httpRequestTypes = typeMap.IMAGE | |
| + typeMap.STYLESHEET | |
| + typeMap.SCRIPT | |
| + typeMap.FONT | |
| + typeMap.MEDIA | |
| + typeMap.POPUP | |
| + typeMap.OBJECT | |
| + typeMap.OBJECT_SUBREQUEST | |
| + typeMap.XMLHTTPREQUEST | |
| + typeMap.PING | |
| + typeMap.SUBDOCUMENT | |
| + typeMap.OTHER; |
| +const rawRequestTypes = typeMap.XMLHTTPREQUEST | |
| + typeMap.WEBSOCKET | |
| + typeMap.WEBRTC | |
| + typeMap.OBJECT_SUBREQUEST | |
| + typeMap.PING | |
| + typeMap.OTHER; |
| +const whitelistableRequestTypes = httpRequestTypes | |
| + typeMap.WEBSOCKET | |
| + typeMap.WEBRTC; |
| function parseDomains(domains, included, excluded) |
| { |
| for (let domain in domains) |
| { |
| if (domain != "") |
| { |
| let enabled = domains[domain]; |
| @@ -69,28 +77,28 @@ |
| function getURLSchemes(contentType) |
| { |
| // If the given content type includes all supported URL schemes, simply |
| // return a single generic URL scheme pattern. This minimizes the size of the |
| // generated rule set. The downside to this is that it will also match |
| // schemes that we do not want to match (e.g. "ftp://"), but this can be |
| // mitigated by adding exceptions for those schemes. |
| if (contentType & typeMap.WEBSOCKET && contentType & typeMap.WEBRTC && |
| - contentType & ~(typeMap.WEBSOCKET | typeMap.WEBRTC)) |
| + contentType & httpRequestTypes) |
| return ["[^:]+:(//)?"]; |
| let urlSchemes = []; |
| if (contentType & typeMap.WEBSOCKET) |
| urlSchemes.push("wss?://"); |
| if (contentType & typeMap.WEBRTC) |
| urlSchemes.push("stuns?:", "turns?:"); |
| - if (contentType & ~(typeMap.WEBSOCKET | typeMap.WEBRTC)) |
| + if (contentType & httpRequestTypes) |
| urlSchemes.push("https?://"); |
| return urlSchemes; |
| } |
| function findSubdomainsInList(domain, list) |
| { |
| let subdomains = []; |
| @@ -283,25 +291,18 @@ |
| if (contentType & typeMap.SCRIPT) |
| types.push("script"); |
| if (contentType & typeMap.FONT) |
| types.push("font"); |
| if (contentType & (typeMap.MEDIA | typeMap.OBJECT)) |
| types.push("media"); |
| if (contentType & typeMap.POPUP) |
| types.push("popup"); |
| - if (contentType & (typeMap.XMLHTTPREQUEST | |
| - typeMap.WEBSOCKET | |
| - typeMap.WEBRTC | |
| - typeMap.OBJECT_SUBREQUEST | |
| - typeMap.PING | |
| - typeMap.OTHER)) |
| - { |
| + if (contentType & rawRequestTypes) |
| types.push("raw"); |
| - } |
| if (contentType & typeMap.SUBDOCUMENT) |
| types.push("document"); |
| return types; |
| } |
| function makeRuleCopies(trigger, action, urlSchemes) |
| { |
| @@ -346,27 +347,28 @@ |
| function convertFilterAddRules(rules, filter, action, withResourceTypes, |
| exceptionDomains, contentType) |
| { |
| if (!contentType) |
| contentType = filter.contentType; |
| // If WebSocket or WebRTC are given along with other options but not |
| - // including all three of WebSocket, WebRTC, and XMLHttpRequest, we must |
| - // generate multiple rules. For example, for the filter |
| + // including all three of WebSocket, WebRTC, and at least one HTTP raw type, |
| + // we must generate multiple rules. For example, for the filter |
| // "foo$websocket,image", we must generate one rule with "^wss?://" and "raw" |
| // and another rule with "^https?://" and "image". If we merge the two, we |
| - // end up blocking requests of type XMLHttpRequest inadvertently. |
| + // end up blocking requests of all HTTP raw types (e.g. XMLHttpRequest) |
| + // inadvertently. |
| if ((contentType & typeMap.WEBSOCKET && contentType != typeMap.WEBSOCKET && |
| !(contentType & typeMap.WEBRTC && |
| - contentType & typeMap.XMLHTTPREQUEST)) || |
| + contentType & rawRequestTypes & httpRequestTypes)) || |
| (contentType & typeMap.WEBRTC && contentType != typeMap.WEBRTC && |
| !(contentType & typeMap.WEBSOCKET && |
| - contentType & typeMap.XMLHTTPREQUEST))) |
| + contentType & rawRequestTypes & httpRequestTypes))) |
| { |
| if (contentType & typeMap.WEBSOCKET) |
| { |
| convertFilterAddRules(rules, filter, action, withResourceTypes, |
| exceptionDomains, typeMap.WEBSOCKET); |
| } |
| if (contentType & typeMap.WEBRTC) |