# HG changeset patch # Parent 28681d252003e3110105473754da2f4097cb83a6 Bug 1273138 fix WebRequest for background pages, r?billm diff --git a/browser/components/extensions/ext-tabs.js b/browser/components/extensions/ext-tabs.js --- a/browser/components/extensions/ext-tabs.js +++ b/browser/components/extensions/ext-tabs.js @@ -90,24 +90,18 @@ extensions.on("page-shutdown", (type, co if (context.type == "tab") { let {xulWindow, tab} = getDocShellOwner(context.docShell); if (tab) { xulWindow.gBrowser.removeTab(tab); } } }); -extensions.on("fill-browser-data", (type, browser, data, result) => { - let tabId = TabManager.getBrowserId(browser); - if (tabId == -1) { - result.cancel = true; - return; - } - - data.tabId = tabId; +extensions.on("fill-browser-data", (type, browser, data) => { + data.tabId = browser ? TabManager.getBrowserId(browser) : -1; }); /* eslint-enable mozilla/balanced-listeners */ global.currentWindow = function(context) { let {xulWindow} = getDocShellOwner(context.docShell); if (xulWindow) { return xulWindow; } diff --git a/toolkit/components/extensions/ext-webNavigation.js b/toolkit/components/extensions/ext-webNavigation.js --- a/toolkit/components/extensions/ext-webNavigation.js +++ b/toolkit/components/extensions/ext-webNavigation.js @@ -104,36 +104,30 @@ function WebNavigationEventManager(conte let filters = urlFilters ? new MatchURLFilters(urlFilters.url) : null; let listener = data => { if (!data.browser) { return; } - let tabId = TabManager.getBrowserId(data.browser); - if (tabId == -1) { - return; - } - let data2 = { url: data.url, timeStamp: Date.now(), frameId: ExtensionManagement.getFrameId(data.windowId), parentFrameId: ExtensionManagement.getParentFrameId(data.parentWindowId, data.windowId), }; if (eventName == "onErrorOccurred") { data2.error = data.error; } // Fills in tabId typically. - let result = {}; - extensions.emit("fill-browser-data", data.browser, data2, result); - if (result.cancel) { + extensions.emit("fill-browser-data", data.browser, data2); + if (data2.tabId < 0) { return; } fillTransitionProperties(eventName, data, data2); runSafe(context, callback, data2); }; diff --git a/toolkit/components/extensions/ext-webRequest.js b/toolkit/components/extensions/ext-webRequest.js --- a/toolkit/components/extensions/ext-webRequest.js +++ b/toolkit/components/extensions/ext-webRequest.js @@ -1,13 +1,14 @@ "use strict"; var {classes: Cc, interfaces: Ci, utils: Cu} = Components; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "MatchPattern", "resource://gre/modules/MatchPattern.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "WebRequest", "resource://gre/modules/WebRequest.jsm"); Cu.import("resource://gre/modules/ExtensionManagement.jsm"); Cu.import("resource://gre/modules/ExtensionUtils.jsm"); @@ -18,22 +19,21 @@ var { // EventManager-like class specifically for WebRequest. Inherits from // SingletonEventManager. Takes care of converting |details| parameter // when invoking listeners. function WebRequestEventManager(context, eventName) { let name = `webRequest.${eventName}`; let register = (callback, filter, info) => { let listener = data => { - if (!data.browser) { - return; - } - - let tabId = TabManager.getBrowserId(data.browser); - if (tabId == -1) { + // Prevent listening in on requests originating from system principal to + // prevent tinkering with OCSP, app and addon updates, etc. + let URI = Services.io.newURI(data.originUrl, null, null); + let principal = Services.scriptSecurityManager.createCodebasePrincipal(URI, {}); + if (Services.scriptSecurityManager.isSystemPrincipal(principal)) { return; } let data2 = { requestId: data.requestId, url: data.url, originUrl: data.originUrl, method: data.method, @@ -47,22 +47,17 @@ function WebRequestEventManager(context, if (maybeCached.includes(eventName)) { data2.fromCache = !!data.fromCache; } if ("ip" in data) { data2.ip = data.ip; } - // Fills in tabId typically. - let result = {}; - extensions.emit("fill-browser-data", data.browser, data2, result); - if (result.cancel) { - return; - } + extensions.emit("fill-browser-data", data.browser, data2); let optional = ["requestHeaders", "responseHeaders", "statusCode", "statusLine", "error", "redirectUrl", "requestBody"]; for (let opt of optional) { if (opt in data) { data2[opt] = data[opt]; } } diff --git a/toolkit/components/extensions/test/mochitest/mochitest.ini b/toolkit/components/extensions/test/mochitest/mochitest.ini --- a/toolkit/components/extensions/test/mochitest/mochitest.ini +++ b/toolkit/components/extensions/test/mochitest/mochitest.ini @@ -29,16 +29,17 @@ support-files = file_script_redirect.js file_script_xhr.js file_sample.html redirection.sjs file_privilege_escalation.html file_ext_test_api_injection.js file_permission_xhr.html file_teardown_test.js + webrequest_worker.js tags = webextensions [test_clipboard.html] # skip-if = # disabled test case with_permission_allow_copy, see inline comment. [test_ext_inIncognitoContext_window.html] skip-if = os == 'android' # Android does not currently support windows. [test_ext_geturl.html] [test_ext_background_canvas.html] @@ -85,15 +86,17 @@ skip-if = (os == 'android' || buildapp = skip-if = (os == 'android') # Android does not support tabs API. Bug 1260250 [test_ext_unload_frame.html] [test_ext_i18n.html] skip-if = (os == 'android') # Bug 1258975 on android. [test_ext_web_accessible_resources.html] skip-if = (os == 'android') # Bug 1258975 on android. [test_ext_webrequest.html] skip-if = os == 'android' # webrequest api unsupported (bug 1258975). +[test_ext_webrequest_background_events.html] +skip-if = os == 'android' # webrequest api unsupported (bug 1258975). [test_ext_webnavigation.html] skip-if = os == 'android' # port.sender.tab is undefined on Android (bug 1258975). [test_ext_webnavigation_filters.html] skip-if = os == 'android' # port.sender.tab is undefined on Android (bug 1258975). [test_ext_subframes_privileges.html] skip-if = os == 'android' # port.sender.tab is undefined on Android (bug 1258975). [test_ext_xhr_capabilities.html] diff --git a/toolkit/components/extensions/test/mochitest/test_ext_webrequest_background_events.html b/toolkit/components/extensions/test/mochitest/test_ext_webrequest_background_events.html new file mode 100644 --- /dev/null +++ b/toolkit/components/extensions/test/mochitest/test_ext_webrequest_background_events.html @@ -0,0 +1,112 @@ + + + + Test for simple WebExtension + + + + + + + + + + + + diff --git a/toolkit/components/extensions/test/mochitest/webrequest_worker.js b/toolkit/components/extensions/test/mochitest/webrequest_worker.js new file mode 100644 --- /dev/null +++ b/toolkit/components/extensions/test/mochitest/webrequest_worker.js @@ -0,0 +1,4 @@ + +fetch("https://example.com/example.txt").then(() => { + +});