diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index 150d06eb6cb6..68271e4ca190 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -999,6 +999,13 @@ pref("security.sandbox.content.level", 1); // allow stack tracing. This does not require a restart to take effect. pref("security.sandbox.windows.log.stackTraceDepth", 0); #endif + +// This controls the strength of the Windows GPU process sandbox. Changes +// will require restart. +// For information on what the level number means, see +// SetSecurityLevelForGPUProcess() in +// security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp +pref("security.sandbox.gpu.level", 1); #endif #if defined(XP_MACOSX) && defined(MOZ_SANDBOX) && defined(MOZ_CONTENT_SANDBOX) diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index d741251cf00e..c963fd73e286 100755 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -5103,7 +5103,8 @@ nsBrowserAccess.prototype = { _openURIInNewTab(aURI, aReferrer, aReferrerPolicy, aIsPrivate, aIsExternal, aForceNotRemote = false, aUserContextId = Ci.nsIScriptSecurityManager.DEFAULT_USER_CONTEXT_ID, - aOpener = null, aTriggeringPrincipal = null) { + aOpener = null, aTriggeringPrincipal = null, + aNextTabParentId = 0) { let win, needToFocusWin; // try the current window. if we're in a popup, fall back on the most recent browser window @@ -5136,6 +5137,7 @@ nsBrowserAccess.prototype = { inBackground: loadInBackground, forceNotRemote: aForceNotRemote, opener: aOpener, + nextTabParentId: aNextTabParentId, }); let browser = win.gBrowser.getBrowserForTab(tab); @@ -5238,7 +5240,8 @@ nsBrowserAccess.prototype = { return newWindow; }, - openURIInFrame: function browser_openURIInFrame(aURI, aParams, aWhere, aFlags) { + openURIInFrame: function browser_openURIInFrame(aURI, aParams, aWhere, aFlags, + aNextTabParentId) { if (aWhere != Ci.nsIBrowserDOMWindow.OPEN_NEWTAB) { dump("Error: openURIInFrame can only open in new tabs"); return null; @@ -5257,7 +5260,8 @@ nsBrowserAccess.prototype = { aParams.isPrivate, isExternal, false, userContextId, null, - aParams.triggeringPrincipal); + aParams.triggeringPrincipal, + aNextTabParentId); if (browser) return browser.QueryInterface(Ci.nsIFrameLoaderOwner); diff --git a/browser/base/content/browser.xul b/browser/base/content/browser.xul index 1748ac7eaa31..077e64c49f5a 100644 --- a/browser/base/content/browser.xul +++ b/browser/base/content/browser.xul @@ -165,6 +165,7 @@ hidden="true" orient="vertical" noautofocus="true" + noautohide="true" consumeoutsideclicks="false" level="parent" tabspecific="true"> @@ -1071,6 +1072,17 @@ #include ../../components/customizableui/content/customizeMode.inc.xul diff --git a/browser/base/content/tabbrowser.xml b/browser/base/content/tabbrowser.xml index 698477750755..6b2df38d16b1 100644 --- a/browser/base/content/tabbrowser.xml +++ b/browser/base/content/tabbrowser.xml @@ -1488,6 +1488,7 @@ var aOriginPrincipal; var aOpener; var aCreateLazyBrowser; + var aNextTabParentId; if (arguments.length == 2 && typeof arguments[1] == "object" && !(arguments[1] instanceof Ci.nsIURI)) { @@ -1512,6 +1513,7 @@ aOpener = params.opener; aIsPrerendered = params.isPrerendered; aCreateLazyBrowser = params.createLazyBrowser; + aNextTabParentId = params.nextTabParentId; } var bgLoad = (aLoadInBackground != null) ? aLoadInBackground : @@ -1538,7 +1540,8 @@ originPrincipal: aOriginPrincipal, sameProcessAsFrameLoader: aSameProcessAsFrameLoader, opener: aOpener, - isPrerendered: aIsPrerendered }); + isPrerendered: aIsPrerendered, + nextTabParentId: aNextTabParentId }); if (!bgLoad) this.selectedTab = tab; @@ -1974,6 +1977,11 @@ b.setAttribute("autoscrollpopup", this._autoScrollPopup.id); + if (aParams.nextTabParentId) { + // Gecko is going to read this attribute and use it. + b.setAttribute("nextTabParentId", aParams.nextTabParentId.toString()); + } + if (aParams.sameProcessAsFrameLoader) { b.sameProcessAsFrameLoader = aParams.sameProcessAsFrameLoader; } @@ -2218,6 +2226,7 @@ var aOpener; var aCreateLazyBrowser; var aSkipBackgroundNotify; + var aNextTabParentId; if (arguments.length == 2 && typeof arguments[1] == "object" && !(arguments[1] instanceof Ci.nsIURI)) { @@ -2245,6 +2254,7 @@ aIsPrerendered = params.isPrerendered; aCreateLazyBrowser = params.createLazyBrowser; aSkipBackgroundNotify = params.skipBackgroundNotify; + aNextTabParentId = params.nextTabParentId; } // if we're adding tabs, we're past interrupt mode, ditch the owner @@ -2353,7 +2363,8 @@ userContextId: aUserContextId, sameProcessAsFrameLoader: aSameProcessAsFrameLoader, opener: aOpener, - isPrerendered: aIsPrerendered }); + isPrerendered: aIsPrerendered, + nextTabParentId: aNextTabParentId }); } t.linkedBrowser = b; diff --git a/browser/base/content/test/general/browser_documentnavigation.js b/browser/base/content/test/general/browser_documentnavigation.js index 81dcce0a4cfa..fd10068ab0b7 100644 --- a/browser/base/content/test/general/browser_documentnavigation.js +++ b/browser/base/content/test/general/browser_documentnavigation.js @@ -145,27 +145,25 @@ add_task(function* () { let sidebar = document.getElementById("sidebar"); let loadPromise = BrowserTestUtils.waitForEvent(sidebar, "load", true); - let focusPromise = BrowserTestUtils.waitForEvent(sidebar, "focus", true); SidebarUI.toggle("viewBookmarksSidebar"); yield loadPromise; - yield focusPromise; + gURLBar.focus(); - - yield* expectFocusOnF6(false, "html1", "html1", - true, "focus with sidebar open content"); yield* expectFocusOnF6(false, "bookmarksPanel", sidebar.contentDocument.getElementById("search-box").inputField, false, "focus with sidebar open sidebar"); + yield* expectFocusOnF6(false, "html1", "html1", + true, "focus with sidebar open content"); yield* expectFocusOnF6(false, "main-window", gURLBar.inputField, false, "focus with sidebar urlbar"); // Now go backwards + yield* expectFocusOnF6(true, "html1", "html1", + true, "back focus with sidebar open content"); yield* expectFocusOnF6(true, "bookmarksPanel", sidebar.contentDocument.getElementById("search-box").inputField, false, "back focus with sidebar open sidebar"); - yield* expectFocusOnF6(true, "html1", "html1", - true, "back focus with sidebar open content"); yield* expectFocusOnF6(true, "main-window", gURLBar.inputField, false, "back focus with sidebar urlbar"); diff --git a/browser/base/content/test/popupNotifications/browser_popupNotification_keyboard.js b/browser/base/content/test/popupNotifications/browser_popupNotification_keyboard.js index e1156adebf62..1723c0ae1fbb 100644 --- a/browser/base/content/test/popupNotifications/browser_popupNotification_keyboard.js +++ b/browser/base/content/test/popupNotifications/browser_popupNotification_keyboard.js @@ -201,8 +201,8 @@ var tests = [ }); notification.remove(); - goNext(); }); + goNext(); }, }, ]; diff --git a/browser/components/extensions/test/browser/browser_ext_omnibox.js b/browser/components/extensions/test/browser/browser_ext_omnibox.js index e81f885a5589..5a0323b8ca74 100644 --- a/browser/components/extensions/test/browser/browser_ext_omnibox.js +++ b/browser/components/extensions/test/browser/browser_ext_omnibox.js @@ -118,6 +118,26 @@ add_task(function* () { EventUtils.synthesizeKey(" ", {}); yield expectEvent("on-input-started-fired"); + // Test canceling the input before any changed events fire. + EventUtils.synthesizeKey("VK_BACK_SPACE", {}); + yield expectEvent("on-input-cancelled-fired"); + + EventUtils.synthesizeKey(" ", {}); + yield expectEvent("on-input-started-fired"); + + // Test submitting the input before any changed events fire. + EventUtils.synthesizeKey("VK_RETURN", {}); + yield expectEvent("on-input-entered-fired"); + + gURLBar.focus(); + + // Start an input session by typing in . + for (let letter of keyword) { + EventUtils.synthesizeKey(letter, {}); + } + EventUtils.synthesizeKey(" ", {}); + yield expectEvent("on-input-started-fired"); + // We should expect input changed events now that the keyword is active. EventUtils.synthesizeKey("b", {}); yield expectEvent("on-input-changed-fired", {text: "b"}); diff --git a/browser/components/nsBrowserGlue.js b/browser/components/nsBrowserGlue.js index 867149d6444e..5ee8f38a2fce 100644 --- a/browser/components/nsBrowserGlue.js +++ b/browser/components/nsBrowserGlue.js @@ -780,24 +780,10 @@ BrowserGlue.prototype = { }, _firstWindowTelemetry(aWindow) { - let SCALING_PROBE_NAME = ""; - switch (AppConstants.platform) { - case "win": - SCALING_PROBE_NAME = "DISPLAY_SCALING_MSWIN"; - break; - case "macosx": - SCALING_PROBE_NAME = "DISPLAY_SCALING_OSX"; - break; - case "linux": - SCALING_PROBE_NAME = "DISPLAY_SCALING_LINUX"; - break; - } - if (SCALING_PROBE_NAME) { - let scaling = aWindow.devicePixelRatio * 100; - try { - Services.telemetry.getHistogramById(SCALING_PROBE_NAME).add(scaling); - } catch (ex) {} - } + let scaling = aWindow.devicePixelRatio * 100; + try { + Services.telemetry.getHistogramById("DISPLAY_SCALING").add(scaling); + } catch (ex) {} }, // the first browser window has finished initializing diff --git a/browser/components/originattributes/test/browser/browser.ini b/browser/components/originattributes/test/browser/browser.ini index fb56e877af95..1093c841c21e 100644 --- a/browser/components/originattributes/test/browser/browser.ini +++ b/browser/components/originattributes/test/browser/browser.ini @@ -65,6 +65,7 @@ support-files = [browser_favicon_userContextId.js] [browser_firstPartyIsolation.js] [browser_firstPartyIsolation_aboutPages.js] +[browser_firstPartyIsolation_blobURI.js] [browser_firstPartyIsolation_js_uri.js] [browser_localStorageIsolation.js] [browser_blobURLIsolation.js] diff --git a/browser/components/originattributes/test/browser/browser_firstPartyIsolation.js b/browser/components/originattributes/test/browser/browser_firstPartyIsolation.js index 1f2e82263003..3f9fce56eca7 100644 --- a/browser/components/originattributes/test/browser/browser_firstPartyIsolation.js +++ b/browser/components/originattributes/test/browser/browser_firstPartyIsolation.js @@ -5,6 +5,7 @@ add_task(function* setup() { Services.prefs.setBoolPref("privacy.firstparty.isolate", true); registerCleanupFunction(function() { Services.prefs.clearUserPref("privacy.firstparty.isolate"); + Services.cookies.removeAll(); }); }); diff --git a/browser/components/originattributes/test/browser/browser_firstPartyIsolation_blobURI.js b/browser/components/originattributes/test/browser/browser_firstPartyIsolation_blobURI.js new file mode 100644 index 000000000000..79abc9067e93 --- /dev/null +++ b/browser/components/originattributes/test/browser/browser_firstPartyIsolation_blobURI.js @@ -0,0 +1,76 @@ +add_task(function* setup() { + Services.prefs.setBoolPref("privacy.firstparty.isolate", true); + + registerCleanupFunction(function() { + Services.prefs.clearUserPref("privacy.firstparty.isolate"); + Services.cookies.removeAll(); + }); +}); + +/** + * First we generate a Blob URI by using URL.createObjectURL(new Blob(..)); + * then we navigate to this Blob URI, hence to make the top-level document URI + * is Blob URI. + * Later we create an iframe on this Blob: document, and we test that the iframe + * has correct firstPartyDomain. + */ +add_task(function* test_blob_uri_inherit_oa_from_content() { + const BASE_URI = "http://mochi.test:8888/browser/browser/components/" + + "originattributes/test/browser/dummy.html"; + const BASE_DOMAIN = "mochi.test"; + + // First we load a normal web page. + let win = yield BrowserTestUtils.openNewBrowserWindow({ remote: true }); + let browser = win.gBrowser.selectedBrowser; + browser.loadURI(BASE_URI); + yield BrowserTestUtils.browserLoaded(browser); + + // Then navigate to the blob: URI. + yield ContentTask.spawn(browser, { firstPartyDomain: BASE_DOMAIN }, function* (attrs) { + info("origin " + content.document.nodePrincipal.origin); + Assert.equal(content.document.nodePrincipal.originAttributes.firstPartyDomain, + attrs.firstPartyDomain, "The document should have firstPartyDomain"); + + // Now we use createObjectURL to generate a blob URI and navigate to it. + let url = content.window.URL.createObjectURL(new content.window.Blob([ + ``], + {"type": "text/html"})); + content.document.location = url; + }); + + // Wait for the Blob: URI to be loaded. + yield BrowserTestUtils.browserLoaded(browser, false, function(url) { + info("BrowserTestUtils.browserLoaded url=" + url); + return url.startsWith("blob:http://mochi.test:8888/"); + }); + + // We verify the blob document has correct origin attributes. + // Then we inject an iframe to it. + yield ContentTask.spawn(browser, { firstPartyDomain: BASE_DOMAIN }, function* (attrs) { + Assert.ok(content.document.documentURI.startsWith("blob:http://mochi.test:8888/"), + "the document URI should be a blob URI."); + info("origin " + content.document.nodePrincipal.origin); + Assert.equal(content.document.nodePrincipal.originAttributes.firstPartyDomain, + attrs.firstPartyDomain, "The document should have firstPartyDomain"); + + let iframe = content.document.createElement("iframe"); + iframe.src = "http://example.com"; + iframe.id = "iframe1"; + content.document.body.appendChild(iframe); + }); + + // Wait for the iframe to be loaded. +// yield BrowserTestUtils.browserLoaded(browser, true, function(url) { +// info("BrowserTestUtils.browserLoaded iframe url=" + url); +// return url == "http://example.com/"; +// }); + + // Finally we verify the iframe has correct origin attributes. + yield ContentTask.spawn(browser, { firstPartyDomain: BASE_DOMAIN }, function* (attrs) { + let iframe = content.document.getElementById("iframe1"); + Assert.equal(iframe.contentDocument.nodePrincipal.originAttributes.firstPartyDomain, + attrs.firstPartyDomain, "iframe should inherit firstPartyDomain from blob: URI"); + }); + + win.close(); +}); diff --git a/browser/components/preferences/in-content/privacy.xul b/browser/components/preferences/in-content/privacy.xul index 82cf4723c621..de442c41c42b 100644 --- a/browser/components/preferences/in-content/privacy.xul +++ b/browser/components/preferences/in-content/privacy.xul @@ -750,6 +750,9 @@ #ifdef MOZ_DATA_REPORTING #ifdef MOZ_CRASHREPORTER