Skip to content

Commit

Permalink
Cancel requests received before Badger is ready
Browse files Browse the repository at this point in the history
Once Badged is finished initializing, reload any tabs with cancelled
requests.
  • Loading branch information
ghostwords committed Mar 9, 2020
1 parent 1e969eb commit 0f408ef
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 9 deletions.
20 changes: 18 additions & 2 deletions src/js/background.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,19 @@ var incognito = require("incognito");

/**
* Privacy Badger initializer.
*
* @param {Boolean} from_qunit don't intercept requests when run by unit tests
*/
function Badger() {
function Badger(from_qunit) {
let self = this;

// important: must be executed synchronously
// to register a "persistent" onBeforeRequest listener in Firefox
// https://github.com/mdn/sprints/issues/1015
if (!from_qunit) {
webrequest.startBeforeReadyListener();
}

self.webRTCAvailable = checkWebRTCBrowserSupport();
self.firstPartyDomainPotentiallyRequired = testCookiesFirstPartyDomain();

Expand Down Expand Up @@ -81,13 +90,20 @@ function Badger() {
await dntHashesPromise;
await tabDataPromise;

if (from_qunit) {
self.INITIALIZED = true;
return;
}

// start the listeners
incognito.startListeners();
webrequest.startListeners();
HeuristicBlocking.startListeners();
FirefoxAndroid.startListeners();
startBackgroundListeners();

webrequest.stopBeforeReadyListener();

console.log("Privacy Badger is ready to rock!");
console.log("Set DEBUG=1 to view console messages.");
self.INITIALIZED = true;
Expand Down Expand Up @@ -987,4 +1003,4 @@ function startBackgroundListeners() {
});
}

var badger = window.badger = new Badger();
let badger = window.badger = new Badger(document.location.pathname == "/tests/index.html");
54 changes: 49 additions & 5 deletions src/js/webrequest.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ var incognito = require("incognito");
var utils = require("utils");

/************ Local Variables *****************/
var temporaryWidgetUnblock = {};
let temporaryWidgetUnblock = {};
let pendingTabs = new Set();

/***************** Blocking Listener Functions **************/

Expand Down Expand Up @@ -1059,17 +1060,57 @@ function dispatcher(request, sender, sendResponse) {
}
}


/**
* Cancels all requests, populates list of pending tabs to be reloaded later,
* when Privacy Badger is ready.
*
* @param {Object} details chrome.webRequest request details
* @returns {Object}
*/
function onBeforeReady(details) {
if (!pendingTabs || details.tabId < 0) {
return;
}

pendingTabs.add(details.tabId);

return {
cancel: true
};
}

/**
* Reloads all tabs that loaded before Privacy Badger was ready.
*/
function reloadPendingTabs() {
for (let tab_id of pendingTabs) {
chrome.tabs.reload(tab_id);
}
pendingTabs = null;
}


/*************** Event Listeners *********************/
function startBeforeReadyListener() {
chrome.webRequest.onBeforeRequest.addListener(onBeforeReady, {urls: ["<all_urls>"]}, ["blocking"]);
}

function stopBeforeReadyListener() {
chrome.webRequest.onBeforeRequest.removeListener(onBeforeReady);
reloadPendingTabs();
}

function startListeners() {
chrome.webNavigation.onBeforeNavigate.addListener(onNavigate);

chrome.webRequest.onBeforeRequest.addListener(onBeforeRequest, {urls: ["http://*/*", "https://*/*"]}, ["blocking"]);
chrome.webRequest.onBeforeRequest.addListener(onBeforeRequest, {urls: ["<all_urls>"]}, ["blocking"]);

let extraInfoSpec = ['requestHeaders', 'blocking'];
if (chrome.webRequest.OnBeforeSendHeadersOptions.hasOwnProperty('EXTRA_HEADERS')) {
extraInfoSpec.push('extraHeaders');
}
chrome.webRequest.onBeforeSendHeaders.addListener(onBeforeSendHeaders, {urls: ["http://*/*", "https://*/*"]}, extraInfoSpec);
chrome.webRequest.onBeforeSendHeaders.addListener(onBeforeSendHeaders, {urls: ["<all_urls>"]}, extraInfoSpec);

extraInfoSpec = ['responseHeaders', 'blocking'];
if (chrome.webRequest.OnHeadersReceivedOptions.hasOwnProperty('EXTRA_HEADERS')) {
Expand All @@ -1083,8 +1124,11 @@ function startListeners() {
}

/************************************** exports */
var exports = {};
exports.startListeners = startListeners;
let exports = {
startBeforeReadyListener,
startListeners,
stopBeforeReadyListener,
};
return exports;
/************************************** exports */
})();
6 changes: 4 additions & 2 deletions tests/selenium/pbtest.py
Original file line number Diff line number Diff line change
Expand Up @@ -320,8 +320,10 @@ def run(self, result=None):
# wait for Badger's storage, listeners, ...
self.load_url(self.options_url)
self.wait_for_script(
"return chrome.extension.getBackgroundPage()."
"badger.INITIALIZED"
"return ("
" chrome.extension &&"
" chrome.extension.getBackgroundPage().badger.INITIALIZED"
");"
)
driver.close()
if driver.window_handles:
Expand Down

0 comments on commit 0f408ef

Please sign in to comment.