Index: lib/requestBlocker.js |
=================================================================== |
--- a/lib/requestBlocker.js |
+++ b/lib/requestBlocker.js |
@@ -76,6 +76,29 @@ |
yield "CSP"; |
}()); |
+function getDocumentInfo(page, frame, originUrl) |
+{ |
+ return [ |
+ extractHostFromFrame(frame, originUrl), |
+ getKey(page, frame, originUrl), |
+ !!checkWhitelisted(page, frame, originUrl, |
+ RegExpFilter.typeMap.GENERICBLOCK) |
+ ]; |
+} |
+ |
+function matchRequest(url, type, docDomain, sitekey, specificOnly) |
+{ |
+ let urlString = stringifyURL(url); |
+ let thirdParty = isThirdParty(url, docDomain); |
+ |
+ return [ |
+ defaultMatcher.matchesAny(urlString, RegExpFilter.typeMap[type], |
+ docDomain, thirdParty, sitekey, specificOnly), |
+ urlString, |
+ thirdParty |
+ ]; |
+} |
+ |
function getRelatedTabIds(details) |
{ |
// This is the common case, the request is associated with a single tab. |
@@ -99,20 +122,17 @@ |
return browser.tabs.query({url}).then(tabs => tabs.map(tab => tab.id)); |
} |
-function logRequest(details, url, type, docDomain, thirdParty, |
+function logRequest(tabIds, url, type, docDomain, thirdParty, |
sitekey, specificOnly, filter) |
{ |
- getRelatedTabIds(details).then(tabIds => |
- { |
- if (filter) |
- FilterNotifier.emit("filter.hitCount", filter, 0, 0, tabIds); |
+ if (filter) |
+ FilterNotifier.emit("filter.hitCount", filter, 0, 0, tabIds); |
- devtools.logRequest( |
- tabIds, url, type, docDomain, |
- thirdParty, sitekey, |
- specificOnly, filter |
- ); |
- }); |
+ devtools.logRequest( |
+ tabIds, url, type, docDomain, |
+ thirdParty, sitekey, |
+ specificOnly, filter |
+ ); |
} |
browser.webRequest.onBeforeRequest.addListener(details => |
@@ -174,21 +194,17 @@ |
if (checkWhitelisted(page, frame, originUrl)) |
return; |
- let urlString = stringifyURL(url); |
let type = resourceTypes.get(details.type) || "OTHER"; |
- let docDomain = extractHostFromFrame(frame, originUrl); |
- let thirdParty = isThirdParty(url, docDomain); |
- let sitekey = getKey(page, frame, originUrl); |
- let specificOnly = !!checkWhitelisted(page, frame, originUrl, |
- RegExpFilter.typeMap.GENERICBLOCK); |
+ let [docDomain, sitekey, specificOnly] = getDocumentInfo(page, frame, |
kzar
2018/04/17 12:46:39
Perhaps it would be a nicer abstraction to have a
Sebastian Noack
2018/04/17 12:56:47
FWIW, I'm not too happy with this abstraction (jus
kzar
2018/04/17 13:54:06
Yea, fair enough.
|
+ originUrl); |
+ let [filter, urlString, thirdParty] = matchRequest(url, type, docDomain, |
+ sitekey, specificOnly); |
- let filter = defaultMatcher.matchesAny( |
- urlString, RegExpFilter.typeMap[type], |
- docDomain, thirdParty, sitekey, specificOnly |
- ); |
- |
- logRequest(details, urlString, type, docDomain, |
- thirdParty, sitekey, specificOnly, filter); |
+ getRelatedTabIds(details).then(tabIds => |
+ { |
+ logRequest(tabIds, urlString, type, docDomain, |
+ thirdParty, sitekey, specificOnly, filter); |
+ }); |
if (filter instanceof BlockingFilter) |
return {cancel: true}; |
@@ -196,28 +212,19 @@ |
port.on("filters.collapse", (message, sender) => |
{ |
- if (checkWhitelisted(sender.page, sender.frame)) |
+ let {page, frame} = sender; |
+ |
+ if (checkWhitelisted(page, frame)) |
return false; |
- let typeMask = RegExpFilter.typeMap[message.mediatype]; |
- let documentHost = extractHostFromFrame(sender.frame); |
- let sitekey = getKey(sender.page, sender.frame); |
let blocked = false; |
- |
- let specificOnly = checkWhitelisted( |
- sender.page, sender.frame, null, |
- RegExpFilter.typeMap.GENERICBLOCK |
- ); |
+ let [docDomain, sitekey, specificOnly] = getDocumentInfo(page, frame); |
for (let url of message.urls) |
{ |
- let urlObj = new URL(url, message.baseURL); |
- let filter = defaultMatcher.matchesAny( |
- stringifyURL(urlObj), |
- typeMask, documentHost, |
- isThirdParty(urlObj, documentHost), |
- sitekey, specificOnly |
- ); |
+ let [filter] = matchRequest(new URL(url, message.baseURL), |
+ message.mediatype, docDomain, |
+ sitekey, specificOnly); |
if (filter instanceof BlockingFilter) |
{ |
@@ -230,6 +237,24 @@ |
return blocked && Prefs.hidePlaceholders; |
}); |
+port.on("request.blockedByRTCWrapper", (msg, sender) => |
+{ |
+ let {page, frame} = sender; |
+ |
+ if (checkWhitelisted(page, frame)) |
+ return false; |
+ |
+ let [docDomain, sitekey, specificOnly] = getDocumentInfo(page, frame); |
+ let [filter, url, thirdParty] = matchRequest(new URL(msg.url), |
+ "WEBRTC", docDomain, |
+ sitekey, specificOnly); |
+ |
+ logRequest([sender.page.id], url, "WEBRTC", docDomain, |
+ thirdParty, sitekey, specificOnly, filter); |
+ |
+ return filter instanceof BlockingFilter; |
+}); |
+ |
let ignoreFilterNotifications = false; |
function onFilterChange(arg, isDisabledAction) |
@@ -271,13 +296,3 @@ |
FilterNotifier.on("filter.removed", onFilterChange); |
FilterNotifier.on("filter.disabled", arg => onFilterChange(arg, true)); |
FilterNotifier.on("load", onFilterChange); |
- |
-port.on("request.blockedByRTCWrapper", (msg, sender) => |
-{ |
- return ext.webRequest.onBeforeRequest._dispatch( |
- new URL(msg.url), |
- "webrtc", |
- sender.page, |
- sender.frame |
- ).includes(false); |
-}); |