diff --git a/addon-sdk/source/lib/sdk/addon/window.js b/addon-sdk/source/lib/sdk/addon/window.js index 4c163a6ead15..557397411cbb 100644 --- a/addon-sdk/source/lib/sdk/addon/window.js +++ b/addon-sdk/source/lib/sdk/addon/window.js @@ -7,59 +7,75 @@ module.metadata = { "stability": "experimental" }; -const { Ci, Cc } = require("chrome"); -const { make: makeWindow, getHiddenWindow } = require("../window/utils"); -const { create: makeFrame, getDocShell } = require("../frame/utils"); -const { defer } = require("../core/promise"); +const { Ci, Cc, Cu } = require("chrome"); const { when: unload } = require("../system/unload"); -const cfxArgs = require("../test/options"); +const prefs = require("../preferences/service"); -var addonPrincipal = Cc["@mozilla.org/systemprincipal;1"]. - createInstance(Ci.nsIPrincipal); +if (!prefs.get("extensions.usehiddenwindow", false)) { + const {HiddenFrame} = require("resource:///modules/HiddenFrame.jsm", {}); + let hiddenFrame = new HiddenFrame(); + exports.window = hiddenFrame.getWindow(); + exports.ready = hiddenFrame.get(); -var hiddenWindow = getHiddenWindow(); + // Still destroy frame on unload to claim memory back early. + // NOTE: this doesn't seem to work and just doesn't get called. :-\ + unload(function() { + hiddenFrame.destroy(); + hiddenFrame = null; + }); +} else { + const { make: makeWindow, getHiddenWindow } = require("../window/utils"); + const { create: makeFrame, getDocShell } = require("../frame/utils"); + const { defer } = require("../core/promise"); + const cfxArgs = require("../test/options"); -if (cfxArgs.parseable) { - console.info("hiddenWindow document.documentURI:" + - hiddenWindow.document.documentURI); - console.info("hiddenWindow document.readyState:" + - hiddenWindow.document.readyState); + var addonPrincipal = Cc["@mozilla.org/systemprincipal;1"]. + createInstance(Ci.nsIPrincipal); + + var hiddenWindow = getHiddenWindow(); + + if (cfxArgs.parseable) { + console.info("hiddenWindow document.documentURI:" + + hiddenWindow.document.documentURI); + console.info("hiddenWindow document.readyState:" + + hiddenWindow.document.readyState); + } + + // Once Bug 565388 is fixed and shipped we'll be able to make invisible, + // permanent docShells. Meanwhile we create hidden top level window and + // use it's docShell. + var frame = makeFrame(hiddenWindow.document, { + nodeName: "iframe", + namespaceURI: "http://www.w3.org/1999/xhtml", + allowJavascript: true, + allowPlugins: true + }) + var docShell = getDocShell(frame); + var eventTarget = docShell.chromeEventHandler; + + // We need to grant docShell system principals in order to load XUL document + // from data URI into it. + docShell.createAboutBlankContentViewer(addonPrincipal); + + // Get a reference to the DOM window of the given docShell and load + // such document into that would allow us to create XUL iframes, that + // are necessary for hidden frames etc.. + var window = docShell.contentViewer.DOMDocument.defaultView; + window.location = "data:application/vnd.mozilla.xul+xml;charset=utf-8,"; + + // Create a promise that is delivered once add-on window is interactive, + // used by add-on runner to defer add-on loading until window is ready. + var { promise, resolve } = defer(); + eventTarget.addEventListener("DOMContentLoaded", function(event) { + resolve(); + }, {once: true}); + + exports.ready = promise; + exports.window = window; + + // Still close window on unload to claim memory back early. + unload(function() { + window.close() + frame.remove(); + }); } - -// Once Bug 565388 is fixed and shipped we'll be able to make invisible, -// permanent docShells. Meanwhile we create hidden top level window and -// use it's docShell. -var frame = makeFrame(hiddenWindow.document, { - nodeName: "iframe", - namespaceURI: "http://www.w3.org/1999/xhtml", - allowJavascript: true, - allowPlugins: true -}) -var docShell = getDocShell(frame); -var eventTarget = docShell.chromeEventHandler; - -// We need to grant docShell system principals in order to load XUL document -// from data URI into it. -docShell.createAboutBlankContentViewer(addonPrincipal); - -// Get a reference to the DOM window of the given docShell and load -// such document into that would allow us to create XUL iframes, that -// are necessary for hidden frames etc.. -var window = docShell.contentViewer.DOMDocument.defaultView; -window.location = "data:application/vnd.mozilla.xul+xml;charset=utf-8,"; - -// Create a promise that is delivered once add-on window is interactive, -// used by add-on runner to defer add-on loading until window is ready. -var { promise, resolve } = defer(); -eventTarget.addEventListener("DOMContentLoaded", function(event) { - resolve(); -}, {once: true}); - -exports.ready = promise; -exports.window = window; - -// Still close window on unload to claim memory back early. -unload(function() { - window.close() - frame.remove(); -}); diff --git a/addon-sdk/source/lib/sdk/net/xhr.js b/addon-sdk/source/lib/sdk/net/xhr.js index 415b9cbf44de..fd4fcd62915d 100644 --- a/addon-sdk/source/lib/sdk/net/xhr.js +++ b/addon-sdk/source/lib/sdk/net/xhr.js @@ -8,8 +8,9 @@ module.metadata = { }; const { deprecateFunction } = require("../util/deprecate"); -const { Cc, Ci } = require("chrome"); -const XMLHttpRequest = require("../addon/window").window.XMLHttpRequest; +const { Ci, Cu } = require("chrome"); + +Cu.importGlobalProperties(["XMLHttpRequest"]); Object.defineProperties(XMLHttpRequest.prototype, { mozBackgroundRequest: { diff --git a/addon-sdk/source/lib/sdk/panel/utils.js b/addon-sdk/source/lib/sdk/panel/utils.js index 2f92a9ff9841..5a39ff68f362 100644 --- a/addon-sdk/source/lib/sdk/panel/utils.js +++ b/addon-sdk/source/lib/sdk/panel/utils.js @@ -13,7 +13,7 @@ const { Services } = require("resource://gre/modules/Services.jsm"); const { setTimeout } = require("../timers"); const { platform } = require("../system"); const { getMostRecentBrowserWindow, getOwnerBrowserWindow, - getHiddenWindow, getScreenPixelsPerCSSPixel } = require("../window/utils"); + getScreenPixelsPerCSSPixel } = require("../window/utils"); const { create: createFrame, swapFrameLoaders, getDocShell } = require("../frame/utils"); const { window: addonWindow } = require("../addon/window"); diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index 7ca5d3e888b3..b46b62bc80d0 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -426,6 +426,8 @@ pref("browser.link.open_newwindow.disabled_in_fullscreen", true); pref("browser.link.open_newwindow.disabled_in_fullscreen", false); #endif +pref("browser.photon.structure.enabled", false); + // Tabbed browser pref("browser.tabs.closeWindowWithLastTab", true); pref("browser.tabs.insertRelatedAfterCurrent", true); diff --git a/browser/base/content/aboutDialog.js b/browser/base/content/aboutDialog.js index b6177715c8b4..e1eec77053f1 100644 --- a/browser/base/content/aboutDialog.js +++ b/browser/base/content/aboutDialog.js @@ -52,6 +52,17 @@ function init(aEvent) { let arch = bundle.GetStringFromName(archResource); versionField.textContent += ` (${arch})`; + // Show a release notes link if we have a URL. + let relNotesLink = document.getElementById("releasenotes"); + let relNotesPrefType = Services.prefs.getPrefType("app.releaseNotesURL"); + if (relNotesPrefType != Services.prefs.PREF_INVALID) { + let relNotesURL = Services.urlFormatter.formatURLPref("app.releaseNotesURL"); + if (relNotesURL != "about:blank") { + relNotesLink.href = relNotesURL; + relNotesLink.hidden = false; + } + } + if (AppConstants.MOZ_UPDATER) { gAppUpdater = new appUpdater(); diff --git a/browser/base/content/aboutDialog.xul b/browser/base/content/aboutDialog.xul index cbb07a5e11af..661f2c6419ac 100644 --- a/browser/base/content/aboutDialog.xul +++ b/browser/base/content/aboutDialog.xul @@ -45,10 +45,8 @@ -#expand -#ifndef NIGHTLY_BUILD -#expand -#endif +#expand +