Browse Source

Some backports for m-r and new patches for c-r

Ian Neal 2 months ago
parent
commit
8518ad9fea

+ 72 - 0
comm-release/patches/1478168-63a1.patch

@@ -0,0 +1,72 @@
+# HG changeset patch
+# User Jorg K <jorgk@jorgk.com>
+# Date 1532473048 -7200
+# Node ID 3d1872a693cf87538d50c35eda62183497e18e26
+# Parent  c8be28fbe8108a16be336e58cbf044d2a763c4ac
+Bug 1478168 - Port 1476333: Replace use of pref browser.chromeURL. rs=bustage-fix, f=bgrins DONTBUILD
+
+diff --git a/mail/app/profile/all-thunderbird.js b/mail/app/profile/all-thunderbird.js
+--- a/mail/app/profile/all-thunderbird.js
++++ b/mail/app/profile/all-thunderbird.js
+@@ -9,17 +9,16 @@
+ #ifndef XP_MACOSX
+ #define UNIX_BUT_NOT_MAC
+ #endif
+ #endif
+ 
+ pref("general.skins.selectedSkin", "classic/1.0");
+ 
+ #ifdef XP_MACOSX
+-pref("browser.chromeURL", "chrome://messenger/content/messengercompose/messengercompose.xul");
+ pref("mail.biff.animate_dock_icon", false);
+ #endif
+ 
+ pref("mail.rights.version", 0);
+ 
+ // Don't show the about:rights notification in debug or non-official builds.
+ #ifdef DEBUG
+ pref("mail.rights.override", true);
+diff --git a/mail/base/content/utilityOverlay.js b/mail/base/content/utilityOverlay.js
+--- a/mail/base/content/utilityOverlay.js
++++ b/mail/base/content/utilityOverlay.js
+@@ -3,17 +3,17 @@
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+ ChromeUtils.import("resource://gre/modules/PlacesUtils.jsm");
+ ChromeUtils.import("resource://gre/modules/Services.jsm");
+ 
+ var gShowBiDi = false;
+ 
+ function getBrowserURL() {
+-  return Services.prefs.getCharPref("browser.chromeURL");
++  return AppConstants.BROWSER_CHROME_URL;
+ }
+ 
+ // update menu items that rely on focus
+ function goUpdateGlobalEditMenuItems()
+ {
+   goUpdateCommand('cmd_undo');
+   goUpdateCommand('cmd_redo');
+   goUpdateCommand('cmd_cut');
+diff --git a/mail/confvars.sh b/mail/confvars.sh
+--- a/mail/confvars.sh
++++ b/mail/confvars.sh
+@@ -17,16 +17,18 @@ if test "$OS_ARCH" = "WINNT"; then
+   if ! test "$HAVE_64BIT_BUILD"; then
+     MOZ_VERIFY_MAR_SIGNATURE=1
+   fi
+ fi
+ 
+ MOZ_APP_VERSION=$THUNDERBIRD_VERSION
+ MOZ_APP_VERSION_DISPLAY=$THUNDERBIRD_VERSION_DISPLAY
+ 
++BROWSER_CHROME_URL=chrome://messenger/content/messengercompose/messengercompose.xul
++
+ MOZ_BRANDING_DIRECTORY=$commreltopsrcdir/mail/branding/thunderbird
+ MOZ_OFFICIAL_BRANDING_DIRECTORY=$commreltopsrcdir/mail/branding/thunderbird
+ 
+ MOZ_APP_ID={3550f703-e582-4d05-9a08-453d09bdfdc6}
+ # This should usually be the same as the value MAR_CHANNEL_ID.
+ # If more than one ID is needed, then you should use a comma separated list
+ # of values.
+ ACCEPTED_MAR_CHANNEL_IDS=thunderbird-comm-release

+ 65 - 0
comm-release/patches/1911830-helpInfo-25320.patch

@@ -0,0 +1,65 @@
+# HG changeset patch
+# User Ian Neal <iann_cvs@blueyonder.co.uk>
+# Date 1722958008 -3600
+# Parent  fa4d9d4f6f3df3fc545d7409fb9819fae7de93bd
+Bug 1911830 - helpInfo should reflect correct name of Preferences or Options for platform. r=frg a=frg
+
+diff --git a/suite/browser/nsBrowserContentHandler.js b/suite/browser/nsBrowserContentHandler.js
+--- a/suite/browser/nsBrowserContentHandler.js
++++ b/suite/browser/nsBrowserContentHandler.js
+@@ -1,13 +1,14 @@
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+  * License, v. 2.0. If a copy of the MPL was not distributed with this
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+ ChromeUtils.import("resource://gre/modules/Services.jsm");
++ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
+ 
+ const nsISupports             = Ci.nsISupports;
+ const nsIBrowserDOMWindow     = Ci.nsIBrowserDOMWindow;
+ const nsIBrowserHistory       = Ci.nsIBrowserHistory;
+ const nsIBrowserSearchService = Ci.nsIBrowserSearchService;
+ const nsIChannel              = Ci.nsIChannel;
+ const nsICommandLine          = Ci.nsICommandLine;
+ const nsICommandLineHandler   = Ci.nsICommandLineHandler;
+@@ -524,24 +525,32 @@ var nsBrowserContentHandler = {
+         if (cmdLine.length != flagIdx + 2 ||
+             testExpr.test(cmdLine.getArgument(flagIdx + 1)))
+           throw Cr.NS_ERROR_ABORT;
+         cmdLine.handleFlag("osint", false);
+       }
+     });
+   },
+ 
+-  helpInfo: "  -browser <url>     Open a browser window.\n" +
+-            "  -private <url>     Open a private window.\n" +
+-            "  -new-window <url>  Open <url> in a new browser window.\n" +
+-            "  -new-tab <url>     Open <url> in a new browser tab.\n" +
+-            "  -url <url>         Open the specified url.\n" +
+-            "  -chrome <url>      Open the specified chrome.\n" +
+-            "  -search <term>     Search <term> with your default search engine.\n" +
+-            "  -preferences       Open Preferences dialog.\n",
++  get helpInfo() {
++    let info =
++              "  -browser <url>     Open a browser window.\n" +
++              "  -private <url>     Open a private window.\n" +
++              "  -new-window <url>  Open <url> in a new browser window.\n" +
++              "  -new-tab <url>     Open <url> in a new browser tab.\n" +
++              "  -url <url>         Open the specified url.\n" +
++              "  -chrome <url>      Open the specified chrome.\n" +
++              "  -search <term>     Search <term> with your default search engine.\n";
++    if (AppConstants.platform == "win") {
++      info += "  --preferences      Open Options dialog.\n";
++    } else {
++      info += "  --preferences      Open Preferences dialog.\n";
++    }
++    return info;
++  },
+ 
+   /* nsICommandLine */
+   length: 1,
+ 
+   getArgument: function getArgument(index) {
+     if (index == 0)
+       return this.currentArgument;
+ 

+ 262 - 0
comm-release/patches/1911841-browserChromeURL-25320.patch

@@ -0,0 +1,262 @@
+# HG changeset patch
+# User Ian Neal <iann_cvs@blueyonder.co.uk>
+# Date 1722958930 -3600
+# Parent  10570b925d980dda342217912d387f232748e153
+Bug 1911841 - Port changes needed from |Bug 1476333 - Consolidate the ways that we reference "browser.xul" across the tree| to SeaMonkey. r=frg a=frg
+
+diff --git a/suite/app/profile/suite-prefs.js b/suite/app/profile/suite-prefs.js
+--- a/suite/app/profile/suite-prefs.js
++++ b/suite/app/profile/suite-prefs.js
+@@ -14,17 +14,16 @@
+  *  - Dashes are delimiters; use underscores instead.
+  *  - The first character after a period must be alphabetic.
+  *  - Computed values (e.g. 50 * 1024) don't work.
+  */
+ 
+ pref("startup.homepage_override_url","chrome://navigator-region/locale/region.properties");
+ pref("general.skins.selectedSkin", "classic/1.0");
+ 
+-pref("browser.chromeURL","chrome://navigator/content/navigator.xul");
+ pref("browser.hiddenWindowChromeURL", "chrome://navigator/content/hiddenWindow.xul");
+ 
+ // prompt for Master Password on startup
+ pref("signon.startup.prompt",               true);
+ 
+ pref("general.startup.browser",             true);
+ pref("general.startup.mail",                false);
+ pref("general.startup.news",                false);
+diff --git a/suite/base/content/utilityOverlay.js b/suite/base/content/utilityOverlay.js
+--- a/suite/base/content/utilityOverlay.js
++++ b/suite/base/content/utilityOverlay.js
+@@ -209,24 +209,17 @@ function setOfflineUI(offline)
+       broadcaster.removeAttribute("offline");
+       broadcaster.removeAttribute("checked");
+       panel.setAttribute("context", "networkProperties");
+       setProxyTypeUI();
+     }
+ }
+ 
+ function getBrowserURL() {
+-
+-  try {
+-    var url = Services.prefs.getCharPref("browser.chromeURL");
+-    if (url)
+-      return url;
+-  } catch(e) {
+-  }
+-  return "chrome://navigator/content/navigator.xul";
++  return AppConstants.BROWSER_CHROME_URL;
+ }
+ 
+ function goPreferences(paneID)
+ {
+   //check for an existing pref window and focus it; it's not application modal
+   var lastPrefWindow = Services.wm.getMostRecentWindow("mozilla:preferences");
+   if (lastPrefWindow)
+     lastPrefWindow.focus();
+diff --git a/suite/browser/nsBrowserContentHandler.js b/suite/browser/nsBrowserContentHandler.js
+--- a/suite/browser/nsBrowserContentHandler.js
++++ b/suite/browser/nsBrowserContentHandler.js
+@@ -165,21 +165,17 @@ function openPreferences()
+     win.focus();
+   else
+     openWindow(null, "chrome://communicator/content/pref/preferences.xul",
+                "chrome,titlebar,dialog=no,resizable", "");
+ }
+ 
+ function getBrowserURL()
+ {
+-  try {
+-    return Services.prefs.getCharPref("browser.chromeURL");
+-  } catch (e) {
+-  }
+-  return "chrome://navigator/content/navigator.xul";
++  return AppConstants.BROWSER_CHROME_URL;
+ }
+ 
+ function handURIToExistingBrowser(aUri, aLocation, aFeatures, aTriggeringPrincipal)
+ {
+   if (!shouldLoadURI(aUri))
+     return;
+ 
+   var navWin =  Services.wm.getMostRecentWindow("navigator:browser");
+diff --git a/suite/components/bindings/notification.xml b/suite/components/bindings/notification.xml
+--- a/suite/components/bindings/notification.xml
++++ b/suite/components/bindings/notification.xml
+@@ -500,22 +500,17 @@
+             var browserWin;
+             var whereToOpen = Services.prefs.getIntPref("browser.link.open_external");
+ 
+             if (whereToOpen != nsIBrowserDOMWindow.OPEN_NEWWINDOW) {
+               browserWin = Services.wm.getMostRecentWindow("navigator:browser");
+             }
+ 
+             if (!browserWin) {
+-              var browserURL = "chrome://navigator/content/navigator.xul";
+-              try {
+-                browserURL = Services.prefs.getCharPref("browser.chromeURL");
+-              } catch (ex) {}
+-
+-              window.openDialog(browserURL, "_blank", "chrome,all,dialog=no", url);
++              window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", "chrome,all,dialog=no", url);
+             } else {
+               if (whereToOpen == nsIBrowserDOMWindow.OPEN_CURRENTWINDOW)
+                 browserWin.loadURI(url);
+               else {
+                 // new tab
+                 var browser = browserWin.getBrowser();
+                 var newTab = browser.addTab(url);
+                 browser.selectedTab = newTab;
+diff --git a/suite/components/nsSuiteGlue.js b/suite/components/nsSuiteGlue.js
+--- a/suite/components/nsSuiteGlue.js
++++ b/suite/components/nsSuiteGlue.js
+@@ -1507,18 +1507,17 @@ SuiteGlue.prototype = {
+       var mostRecentBrowserWindow = Services.wm.getMostRecentWindow("navigator:browser");
+       if (mostRecentBrowserWindow) {
+         mostRecentBrowserWindow.getBrowser().addTab(url, { focusNewTab: true });
+         mostRecentBrowserWindow.content.focus();
+       } else {
+         var args = Cc["@mozilla.org/supports-string;1"]
+                      .createInstance(Ci.nsISupportsString);
+         args.data = url;
+-        var chromeURL = Services.prefs.getCharPref("browser.chromeURL");
+-        Services.ww.openWindow(null, chromeURL, "_blank", "chrome,all,dialog=no", args);
++        Services.ww.openWindow(null, AppConstants.BROWSER_CHROME_URL, "_blank", "chrome,all,dialog=no", args);
+       }
+     } catch (e) {
+       Cu.reportError("Error displaying tab received by Sync: " + e);
+     }
+   },
+ 
+   // for XPCOM
+   classID: Components.ID("{bbbbe845-5a1b-40ee-813c-f84b8faaa07c}"),
+diff --git a/suite/components/places/PlacesUIUtils.jsm b/suite/components/places/PlacesUIUtils.jsm
+--- a/suite/components/places/PlacesUIUtils.jsm
++++ b/suite/components/places/PlacesUIUtils.jsm
+@@ -914,17 +914,17 @@ var PlacesUIUtils = {
+                 browserWindow.whereToOpenLink(aEvent, false, true) : "window";
+     if (where == "window") {
+       // There is no browser window open, thus open a new one.
+       var uriList = PlacesUtils.toISupportsString(urls.join("|"));
+       var args = Cc["@mozilla.org/array;1"].
+                   createInstance(Ci.nsIMutableArray);
+       args.appendElement(uriList);
+       browserWindow = Services.ww.openWindow(aWindow,
+-                                             "chrome://navigator/content/navigator.xul",
++                                             AppConstants.BROWSER_CHROME_URL,
+                                              null, "chrome,dialog=no,all", args);
+       return;
+     }
+ 
+     var loadInBackground = where == "tabshifted";
+     // For consistency, we want all the bookmarks to open in new tabs, instead
+     // of having one of them replace the currently focused tab.  Hence we call
+     // loadTabs with aReplace set to false.
+diff --git a/suite/components/sessionstore/nsSessionStore.js b/suite/components/sessionstore/nsSessionStore.js
+--- a/suite/components/sessionstore/nsSessionStore.js
++++ b/suite/components/sessionstore/nsSessionStore.js
+@@ -3507,17 +3507,17 @@ SessionStoreService.prototype = {
+     var winState = aState.windows[0];
+     for (var aAttr in WINDOW_ATTRIBUTES) {
+       // Use !isNaN as an easy way to ignore sizemode and check for numbers
+       if (aAttr in winState && !isNaN(winState[aAttr]))
+         features += "," + WINDOW_ATTRIBUTES[aAttr] + "=" + winState[aAttr];
+     }
+ 
+     var window =
+-      Services.ww.openWindow(null, this._prefBranch.getCharPref("chromeURL"),
++      Services.ww.openWindow(null, AppConstants.BROWSER_CHROME_URL,
+                              "_blank", features, argString);
+ 
+     do {
+       var ID = "window" + Math.random();
+     } while (ID in this._statesToRestore);
+     this._statesToRestore[(window.__SS_restoreID = ID)] = aState;
+ 
+     return window;
+diff --git a/suite/components/sidebar/content/customize.js b/suite/components/sidebar/content/customize.js
+--- a/suite/components/sidebar/content/customize.js
++++ b/suite/components/sidebar/content/customize.js
+@@ -420,27 +420,23 @@ function CustomizePanel()
+                       sidebarObj.datasource_uri,
+                       sidebarObj.resource);
+   }
+ }
+ 
+ function BrowseMorePanels()
+ {
+   var url = '';
+-  var browser_url = "chrome://navigator/content/navigator.xul";
+   var locale;
+   try {
+     url = Services.prefs.getCharPref("sidebar.customize.more_panels.url");
+-    var temp = Services.prefs.getCharPref("browser.chromeURL");
+-    if (temp)
+-      browser_url = temp;
+   } catch(ex) {
+     debug("Unable to get prefs: "+ex);
+   }
+-  window.openDialog(browser_url, "_blank", "chrome,all,dialog=no", url);
++  window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", "chrome,all,dialog=no", url);
+ }
+ 
+ function customize_getBrowserURL()
+ {
+   return url;
+ }
+ 
+ // Serialize the new list of panels.
+diff --git a/suite/components/sidebar/content/sidebarOverlay.js b/suite/components/sidebar/content/sidebarOverlay.js
+--- a/suite/components/sidebar/content/sidebarOverlay.js
++++ b/suite/components/sidebar/content/sidebarOverlay.js
+@@ -1071,27 +1071,23 @@ function SidebarCustomize() {
+       setTimeout(enable_customize, 2000);
+     }
+   }
+ }
+ 
+ function BrowseMorePanels()
+ {
+   var url = '';
+-  var browser_url = "chrome://navigator/content/navigator.xul";
+   var locale;
+   try {
+     url = Services.prefs.getCharPref("sidebar.customize.directory.url");
+-    var temp = Services.prefs.getCharPref("browser.chromeURL");
+-    if (temp)
+-      browser_url = temp;
+   } catch(ex) {
+     debug("Unable to get prefs: "+ex);
+   }
+-  window.openDialog(browser_url, "_blank", "chrome,all,dialog=no", url);
++  window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", "chrome,all,dialog=no", url);
+ }
+ 
+ 
+ 
+ function sidebar_is_collapsed() {
+   var sidebar_splitter = document.getElementById('sidebar-splitter');
+   return (sidebar_splitter &&
+           sidebar_splitter.getAttribute('state') == 'collapsed');
+diff --git a/suite/confvars.sh b/suite/confvars.sh
+--- a/suite/confvars.sh
++++ b/suite/confvars.sh
+@@ -7,16 +7,18 @@ MOZ_APP_BASENAME=SeaMonkey
+ MOZ_APP_VENDOR=Mozilla
+ MOZ_APP_NAME=seamonkey
+ MOZ_APP_DISPLAYNAME=SeaMonkey
+ 
+ MOZ_APP_VERSION=$SEAMONKEY_VERSION
+ MOZ_APP_VERSION_DISPLAY=$SEAMONKEY_VERSION_DISPLAY
+ MOZ_PKG_VERSION=$SEAMONKEY_VERSION_PACKAGE
+ 
++BROWSER_CHROME_URL=chrome://navigator/content/navigator.xul
++
+ MOZ_BRANDING_DIRECTORY=comm/suite/branding/seamonkey
+ MOZ_OFFICIAL_BRANDING_DIRECTORY=comm/suite/branding/seamonkey
+ 
+ MOZ_UPDATER=1
+ # This should usually be the same as the value MAR_CHANNEL_ID.
+ # If more than one ID is needed, then you should use a comma separated list
+ # of values.
+ ACCEPTED_MAR_CHANNEL_IDS=seamonkey-comm-central

+ 30 - 0
comm-release/patches/1911844-boxObject-utilityOverlay-25320.patch

@@ -0,0 +1,30 @@
+# HG changeset patch
+# User Ian Neal <iann_cvs@blueyonder.co.uk>
+# Date 1722959418 -3600
+# Parent  e165f204a6f0e76c57468ad2a1d442a6a393acca
+Bug 1911844 - Switch from boxObject to getBoundingClientRect in utilityOverlay. r=frg a=frg
+
+diff --git a/suite/base/content/utilityOverlay.js b/suite/base/content/utilityOverlay.js
+--- a/suite/base/content/utilityOverlay.js
++++ b/suite/base/content/utilityOverlay.js
+@@ -934,18 +934,18 @@ function focusElement(aElement)
+ 
+ function isElementVisible(aElement)
+ {
+   if (!aElement)
+     return false;
+ 
+   // If aElement or a direct or indirect parent is hidden or collapsed,
+   // height, width or both will be 0.
+-  var bo = aElement.boxObject;
+-  return (bo.height > 0 && bo.width > 0);
++  var rect = aElement.getBoundingClientRect();
++  return rect.height > 0 && rect.width > 0;
+ }
+ 
+ function makeURLAbsolute(aBase, aUrl, aCharset)
+ {
+   // Construct nsIURL.
+   return Services.io.newURI(aUrl, aCharset,
+                             Services.io.newURI(aBase, aCharset)).spec;
+ }

+ 125 - 0
comm-release/patches/1911845-tabbrowser-dragOver-25320.patch

@@ -0,0 +1,125 @@
+# HG changeset patch
+# User Ian Neal <iann_cvs@blueyonder.co.uk>
+# Date 1722959953 -3600
+# Parent  143620d490549d94ba7254799d8b1c022dc6baf9
+Bug 1911845 - Adjust dragOver method of tabbrowser.xml to be closer to Firefox version. r=frg a=frg
+
+diff --git a/suite/browser/tabbrowser.xml b/suite/browser/tabbrowser.xml
+--- a/suite/browser/tabbrowser.xml
++++ b/suite/browser/tabbrowser.xml
+@@ -2474,63 +2474,70 @@
+               }
+               if (pixelsToScroll)
+                 tabStrip.scrollByPixels((ltr ? 1 : -1) * pixelsToScroll);
+             }
+ 
+             var ind = document.getAnonymousElementByAttribute(this, "class", "tab-drop-indicator");
+ 
+             var draggedTab = aEvent.dataTransfer.mozSourceNode;
+-            var within = draggedTab &&
+-                         draggedTab.parentNode == this.tabContainer;
+-            var newIndexOn = within ? -1 : this.getDropOnIndex(aEvent);
+-
+-            var ltr = window.getComputedStyle(this, null).direction == "ltr";
+-            var arrowX, tabBoxObject;
+-            if (newIndexOn != -1) {
+-              tabBoxObject = this.tabs[newIndexOn].boxObject;
+-              arrowX = tabBoxObject.screenX + tabBoxObject.width / 2;
+-            }
+-            else {
+-              var newIndexBetween = this.getDropIndex(aEvent);
+-              if (within) {
+-                var tabIndex = this.getTabIndex(draggedTab);
+-                if (newIndexBetween == tabIndex ||
+-                    newIndexBetween == tabIndex + 1) {
+-                  ib.collapsed = true;
+-                  return;
+-                }
++            var newIndex = this.getDropIndex(aEvent);
++            if (draggedTab && draggedTab.parentNode == this.tabContainer) {
++              let tabIndex = this.getTabIndex(draggedTab);
++              if (newIndex == tabIndex || newIndex == tabIndex + 1) {
++                ib.collapsed = true;
++                return;
+               }
+-
+-              if (newIndexBetween == this.tabs.length) {
+-                tabBoxObject = this.tabs[this.tabs.length - 1].boxObject;
+-                arrowX = tabBoxObject.x;
+-                arrowX = tabBoxObject.screenX;
+-                if (ltr) // for LTR "after" is on the right-hand side of the tab
+-                  arrowX += tabBoxObject.width;
++            }
++
++            var tabStripBoxObject = tabStrip.scrollBoxObject;
++            var minMargin = tabStripBoxObject.x - this.boxObject.x;
++            // make sure we don't place the tab drop indicator past the
++            // edge, or the containing box will flex and stretch
++            // the tab drop indicator bar, which will flex the url bar.
++            // XXX todo
++            // just use first value if you can figure out how to get
++            // the tab drop indicator to crop instead of flex and stretch
++            // the tab drop indicator bar.
++            var maxMargin = Math.min(minMargin + tabStripBoxObject.width,
++                                     ib.boxObject.x + ib.boxObject.width -
++                                     ind.boxObject.width);
++            if (!ltr)
++              [minMargin, maxMargin] = [this.boxObject.width - maxMargin,
++                                        this.boxObject.width - minMargin];
++            var newMargin, tabBoxObject;
++            if (pixelsToScroll) {
++              // if we are scrolling, put the drop indicator at the edge
++              // so that it doesn't jump while scrolling
++              newMargin = (pixelsToScroll > 0) ? maxMargin : minMargin;
++            } else {
++              if (newIndex == this.tabs.length) {
++                tabBoxObject =  this.tabs[newIndex - 1].boxObject;
++                if (ltr)
++                  newMargin = tabBoxObject.screenX - this.boxObject.screenX
++                              + tabBoxObject.width;
++                else
++                  newMargin = this.boxObject.screenX - tabBoxObject.screenX
++                              + this.boxObject.width;
++              } else {
++                tabBoxObject =  this.tabs[newIndex].boxObject;
++                if (ltr)
++                  newMargin = tabBoxObject.screenX - this.boxObject.screenX;
++                else
++                  newMargin = this.boxObject.screenX - tabBoxObject.screenX
++                              + this.boxObject.width - tabBoxObject.width;
+               }
+-              else {
+-                tabBoxObject = this.tabs[newIndexBetween].boxObject;
+-                arrowX = tabBoxObject.screenX;
+-                if (!ltr) // for RTL "before" is on the right-hand side of the tab
+-                  arrowX += tabBoxObject.width;
+-              }
+-            }
+-
+-            var boxObject = tabStrip.scrollBoxObject;
+-            // Check pixelsToScroll as well to prevent noticable judder.
+-            if (pixelsToScroll > 0 || arrowX >= boxObject.screenX + boxObject.width)
+-              arrowX = boxObject.screenX + boxObject.width;
+-            else if (pixelsToScroll < 0 || arrowX < boxObject.screenX)
+-              arrowX = boxObject.screenX;
+-
+-            if (ltr)
+-              ind.style.marginLeft = (arrowX - this.boxObject.screenX) + "px";
+-            else
+-              ind.style.marginRight = (this.boxObject.screenX + this.boxObject.width - arrowX) + "px";
++              // ensure we never place the drop indicator beyond our limits
++              if (newMargin < minMargin)
++                newMargin = minMargin;
++              else if (newMargin > maxMargin)
++                newMargin = maxMargin;
++            }
++
++            ind.style.marginInlineStart = newMargin + "px";
+ 
+             ib.collapsed = false;
+           ]]>
+         </body>
+       </method>
+ 
+       <method name="_onDrop">
+         <parameter name="aEvent"/>

+ 106 - 0
comm-release/patches/1911847-tabbrowser-boxObject-25320.patch

@@ -0,0 +1,106 @@
+# HG changeset patch
+# User Ian Neal <iann_cvs@blueyonder.co.uk>
+# Date 1722960149 -3600
+# Parent  561b9897393488b0a34f97835e4b9f98621a974b
+Bug 1911847 - Avoid boxObject where appropriate in tabbrowser. r=frg a=frg
+
+diff --git a/suite/browser/tabbrowser.xml b/suite/browser/tabbrowser.xml
+--- a/suite/browser/tabbrowser.xml
++++ b/suite/browser/tabbrowser.xml
+@@ -2483,52 +2483,50 @@
+             if (draggedTab && draggedTab.parentNode == this.tabContainer) {
+               let tabIndex = this.getTabIndex(draggedTab);
+               if (newIndex == tabIndex || newIndex == tabIndex + 1) {
+                 ib.collapsed = true;
+                 return;
+               }
+             }
+ 
+-            var tabStripBoxObject = tabStrip.scrollBoxObject;
+-            var minMargin = tabStripBoxObject.x - this.boxObject.x;
++            var scrollRect = tabStrip.scrollClientRect;
++            var rect = this.getBoundingClientRect();
++            var minMargin = scrollRect.left - rect.left;
+             // make sure we don't place the tab drop indicator past the
+             // edge, or the containing box will flex and stretch
+             // the tab drop indicator bar, which will flex the url bar.
+             // XXX todo
+             // just use first value if you can figure out how to get
+             // the tab drop indicator to crop instead of flex and stretch
+             // the tab drop indicator bar.
+-            var maxMargin = Math.min(minMargin + tabStripBoxObject.width,
+-                                     ib.boxObject.x + ib.boxObject.width -
+-                                     ind.boxObject.width);
++            var maxMargin = Math.min(minMargin + scrollRect.width,
++                                     ib.getBoundingClientRect().right -
++                                     ind.clientWidth);
+             if (!ltr)
+-              [minMargin, maxMargin] = [this.boxObject.width - maxMargin,
+-                                        this.boxObject.width - minMargin];
+-            var newMargin, tabBoxObject;
++              [minMargin, maxMargin] = [this.clientWidth - maxMargin,
++                                        this.clientWidth - minMargin];
++            var newMargin;
+             if (pixelsToScroll) {
+               // if we are scrolling, put the drop indicator at the edge
+               // so that it doesn't jump while scrolling
+               newMargin = (pixelsToScroll > 0) ? maxMargin : minMargin;
+             } else {
+               if (newIndex == this.tabs.length) {
+-                tabBoxObject =  this.tabs[newIndex - 1].boxObject;
++                let tabRect = this.mTabs[newIndex - 1].getBoundingClientRect();
+                 if (ltr)
+-                  newMargin = tabBoxObject.screenX - this.boxObject.screenX
+-                              + tabBoxObject.width;
++                  newMargin = tabRect.right - rect.left;
+                 else
+-                  newMargin = this.boxObject.screenX - tabBoxObject.screenX
+-                              + this.boxObject.width;
++                  newMargin = rect.right - tabRect.left;
+               } else {
+-                tabBoxObject =  this.tabs[newIndex].boxObject;
++                let tabRect = this.mTabs[newIndex].getBoundingClientRect();
+                 if (ltr)
+-                  newMargin = tabBoxObject.screenX - this.boxObject.screenX;
++                  newMargin = tabRect.left - rect.left;
+                 else
+-                  newMargin = this.boxObject.screenX - tabBoxObject.screenX
+-                              + this.boxObject.width - tabBoxObject.width;
++                  newMargin = rect.right - tabRect.right;
+               }
+               // ensure we never place the drop indicator beyond our limits
+               if (newMargin < minMargin)
+                 newMargin = minMargin;
+               else if (newMargin > maxMargin)
+                 newMargin = maxMargin;
+             }
+ 
+@@ -3590,23 +3588,21 @@
+           ]]>
+         </body>
+       </method>
+ 
+       <method name="_updateTabsVisibilityStatus">
+         <body>
+           <![CDATA[
+             let tabContainer = document.getBindingParent(this);
+-            let tabstripBO = tabContainer.mTabstrip.scrollBoxObject;
+-
+-            for (let i = 0; i < this.childNodes.length; i++)
+-            {
+-              let curTabBO = this.childNodes[i].tab.boxObject;
+-              if (curTabBO.screenX >= tabstripBO.screenX &&
+-                  curTabBO.screenX + curTabBO.width <= tabstripBO.screenX + tabstripBO.width)
++            let scrollRect = tabContainer.mTabstrip.scrollClientRect;
++
++            for (let i = 0; i < this.childNodes.length; i++) {
++              let tab = this.childNodes[i].tab.getBoundingClientRect();
++              if (scrollRect.left <= tab.left && tab.right <= scrollRect.right)
+                 this.childNodes[i].removeAttribute("tabIsScrolled");
+               else
+                 this.childNodes[i].setAttribute("tabIsScrolled", "true");
+             }
+           ]]>
+         </body>
+       </method>
+ 

+ 279 - 0
comm-release/patches/1911848-tabbrowser-tabDrop-25320.patch

@@ -0,0 +1,279 @@
+# HG changeset patch
+# User Ian Neal <iann_cvs@blueyonder.co.uk>
+# Date 1722960557 -3600
+# Parent  36107126f15af09dedc28ebecdcfbb28bf08172c
+Bug 1911848 - Simplify tab drop indicator code and styling. r=frg a=frg
+
+diff --git a/suite/browser/tabbrowser.xml b/suite/browser/tabbrowser.xml
+--- a/suite/browser/tabbrowser.xml
++++ b/suite/browser/tabbrowser.xml
+@@ -18,25 +18,25 @@
+   <binding id="tabbrowser">
+     <resources>
+       <stylesheet src="chrome://navigator/skin/tabbrowser.css"/>
+     </resources>
+ 
+     <content>
+       <xul:stringbundle anonid="tbstringbundle" src="chrome://navigator/locale/tabbrowser.properties"/>
+       <xul:tabbox anonid="tabbox" flex="1" eventnode="document">
+-        <xul:hbox class="tab-drop-indicator-bar" collapsed="true">
+-          <xul:image class="tab-drop-indicator" mousethrough="always"/>
+-        </xul:hbox>
+         <xul:hbox class="tabbrowser-strip" collapsed="true" tooltip="_child" context="_child"
+                   anonid="strip"
+                   ondragstart="this.parentNode.parentNode._onDragStart(event);"
+                   ondragover="this.parentNode.parentNode._onDragOver(event);"
+                   ondrop="this.parentNode.parentNode._onDrop(event);"
+                   ondragleave="this.parentNode.parentNode._onDragLeave(event);">
++          <xul:hbox align="start">
++            <xul:image class="tab-drop-indicator" anonid="tab-drop-indicator" collapsed="true"/>
++          </xul:hbox>
+           <xul:tooltip onpopupshowing="event.stopPropagation(); return this.parentNode.parentNode.parentNode.doPreview(this);"
+                        onpopuphiding="this.parentNode.parentNode.parentNode.resetPreview(this);" orient="vertical">
+             <xul:label class="tooltip-label" crop="right"/>
+             <xul:label class="tooltip-label" hidden="true"><html:canvas class="tab-tooltip-canvas"/></xul:label>
+           </xul:tooltip>
+           <xul:menupopup anonid="tabContextMenu" onpopupshowing="return document.getBindingParent(this).updatePopupMenu(this);">
+             <xul:menuitem label="&closeTab.label;" accesskey="&closeTab.accesskey;"
+                           tbattr="tabbrowser-tab"
+@@ -108,16 +108,19 @@
+         ({ ALL: 0, OTHER: 1, TO_END: 2 });
+       </field>
+       <field name="mSessionStore" readonly="true">
+         Cc["@mozilla.org/suite/sessionstore;1"].getService(Ci.nsISessionStore);
+       </field>
+       <field name="mTabBox" readonly="true">
+         document.getAnonymousElementByAttribute(this, "anonid", "tabbox");
+       </field>
++      <field name="_tabDropIndicator">
++        document.getAnonymousElementByAttribute(this, "anonid", "tab-drop-indicator");
++      </field>
+       <field name="mStrip" readonly="true">
+         document.getAnonymousElementByAttribute(this, "anonid", "strip");
+       </field>
+       <field name="tabContainer" readonly="true">
+         document.getAnonymousElementByAttribute(this, "anonid", "tabcontainer");
+       </field>
+       <field name="mPanelContainer" readonly="true">
+         document.getAnonymousElementByAttribute(this, "anonid", "panelcontainer");
+@@ -2449,17 +2452,17 @@
+ 
+       <method name="_onDragOver">
+         <parameter name="aEvent"/>
+         <body>
+           <![CDATA[
+             aEvent.preventDefault();
+             aEvent.stopPropagation();
+ 
+-            var ib = document.getAnonymousElementByAttribute(this, "class", "tab-drop-indicator-bar");
++            var ind = this._tabDropIndicator;
+ 
+             // autoscroll the tab strip if we drag over the scroll buttons,
+             // even if we aren't dragging a tab
+             var pixelsToScroll = 0;
+             var tabStrip = this.tabContainer.mTabstrip;
+             var ltr = window.getComputedStyle(this, null).direction == "ltr";
+             if (this.tabContainer.getAttribute("overflow") == "true") {
+               var targetAnonid = aEvent.originalTarget.getAttribute("anonid");
+@@ -2471,41 +2474,31 @@
+                 case "alltabs-button":
+                   pixelsToScroll = tabStrip.scrollIncrement;
+                   break;
+               }
+               if (pixelsToScroll)
+                 tabStrip.scrollByPixels((ltr ? 1 : -1) * pixelsToScroll);
+             }
+ 
+-            var ind = document.getAnonymousElementByAttribute(this, "class", "tab-drop-indicator");
+-
+             var draggedTab = aEvent.dataTransfer.mozSourceNode;
+             var newIndex = this.getDropIndex(aEvent);
+             if (draggedTab && draggedTab.parentNode == this.tabContainer) {
+               let tabIndex = this.getTabIndex(draggedTab);
+               if (newIndex == tabIndex || newIndex == tabIndex + 1) {
+-                ib.collapsed = true;
++                ind.collapsed = true;
+                 return;
+               }
+             }
+ 
+             var scrollRect = tabStrip.scrollClientRect;
+             var rect = this.getBoundingClientRect();
+             var minMargin = scrollRect.left - rect.left;
+-            // make sure we don't place the tab drop indicator past the
+-            // edge, or the containing box will flex and stretch
+-            // the tab drop indicator bar, which will flex the url bar.
+-            // XXX todo
+-            // just use first value if you can figure out how to get
+-            // the tab drop indicator to crop instead of flex and stretch
+-            // the tab drop indicator bar.
+             var maxMargin = Math.min(minMargin + scrollRect.width,
+-                                     ib.getBoundingClientRect().right -
+-                                     ind.clientWidth);
++                                     scrollRect.right);
+             if (!ltr)
+               [minMargin, maxMargin] = [this.clientWidth - maxMargin,
+                                         this.clientWidth - minMargin];
+             var newMargin;
+             if (pixelsToScroll) {
+               // if we are scrolling, put the drop indicator at the edge
+               // so that it doesn't jump while scrolling
+               newMargin = (pixelsToScroll > 0) ? maxMargin : minMargin;
+@@ -2525,30 +2518,34 @@
+               }
+               // ensure we never place the drop indicator beyond our limits
+               if (newMargin < minMargin)
+                 newMargin = minMargin;
+               else if (newMargin > maxMargin)
+                 newMargin = maxMargin;
+             }
+ 
+-            ind.style.marginInlineStart = newMargin + "px";
+-
+-            ib.collapsed = false;
++            ind.collapsed = false;
++
++            newMargin += ind.clientWidth / 2;
++            if (!ltr)
++              newMargin *= -1;
++
++            ind.style.MozTransform = "translate(" + Math.round(newMargin) + "px)";
++            ind.style.marginInlineStart = (-ind.clientWidth) + "px";
++            ind.style.marginTop = (-ind.clientHeight) + "px";
+           ]]>
+         </body>
+       </method>
+ 
+       <method name="_onDrop">
+         <parameter name="aEvent"/>
+         <body>
+           <![CDATA[
+-            document.getAnonymousElementByAttribute(this, "class",
+-                                                    "tab-drop-indicator-bar")
+-                    .collapsed = true;
++            this._tabDropIndicator.collapsed = true;
+             aEvent.stopPropagation();
+ 
+             var newIndex = this.getDropIndex(aEvent);
+             var dt = aEvent.dataTransfer;
+             var draggedTab = dt.mozSourceNode;
+             if (draggedTab && draggedTab.parentNode == this.tabContainer) {
+               if (newIndex > this.getTabIndex(draggedTab))
+                 newIndex--;
+@@ -2620,19 +2617,17 @@
+           <![CDATA[
+             var target = aEvent.relatedTarget;
+             while (target && target != this.mStrip)
+               target = target.parentNode;
+ 
+             if (target)
+               return;
+ 
+-            document.getAnonymousElementByAttribute(this, "class",
+-                                                    "tab-drop-indicator-bar")
+-                    .collapsed = true;
++            this._tabDropIndicator.collapsed = true;
+             aEvent.stopPropagation();
+           ]]>
+         </body>
+       </method>
+ 
+       <method name="moveTabTo">
+         <parameter name="aTab"/>
+         <parameter name="aIndex"/>
+diff --git a/suite/themes/classic/mac/navigator/tabbrowser.css b/suite/themes/classic/mac/navigator/tabbrowser.css
+--- a/suite/themes/classic/mac/navigator/tabbrowser.css
++++ b/suite/themes/classic/mac/navigator/tabbrowser.css
+@@ -211,26 +211,18 @@ tabpanels {
+ }
+ 
+ .tabs-newbutton {
+   margin: 0;
+   padding: 1px;
+   list-style-image: url("chrome://navigator/skin/icons/tab-new.png");
+ }
+ 
+-.tab-drop-indicator-bar {
+-  height: 11px;
+-  margin-top: -11px;
+-  margin-inline-start: -6px;
++.tab-drop-indicator {
++  margin-top: -8px !important;
+   position: relative;
+-}
+-
+-.tab-drop-indicator {
+-  height: 11px;
+-  width: 11px;
+-  margin-bottom: -5px;
+-  position: relative;
++  z-index: 1;
+   list-style-image: url('chrome://navigator/skin/icons/tab-drag-indicator.png');
+ }
+ 
+ tooltip[tabpreview="true"] {
+   max-width: none;
+ }
+diff --git a/suite/themes/classic/navigator/tabbrowser.css b/suite/themes/classic/navigator/tabbrowser.css
+--- a/suite/themes/classic/navigator/tabbrowser.css
++++ b/suite/themes/classic/navigator/tabbrowser.css
+@@ -173,26 +173,17 @@ tabpanels {
+   list-style-image: url("chrome://communicator/skin/icons/close-button.png");
+ }
+ 
+ .tabs-newbutton {
+   margin: 0px;
+   list-style-image: url("chrome://navigator/skin/icons/tab-new.png");
+ }
+ 
+-.tab-drop-indicator-bar {
+-    height: 11px;
+-    margin-top: -11px;
+-    margin-inline-start: -6px;
+-    position: relative;
+-}
+-
+ .tab-drop-indicator {
+-    height: 11px;
+-    width: 11px;
+-    margin-bottom: -5px;
+-    position: relative;
+-    list-style-image: url('chrome://navigator/skin/icons/tab-drag-indicator.png');
++  position: relative;
++  z-index: 1;
++  list-style-image: url('chrome://navigator/skin/icons/tab-drag-indicator.png');
+ }
+ 
+ tooltip[tabpreview="true"] {
+   max-width: none;
+ }
+diff --git a/suite/themes/modern/navigator/tabbrowser.css b/suite/themes/modern/navigator/tabbrowser.css
+--- a/suite/themes/modern/navigator/tabbrowser.css
++++ b/suite/themes/modern/navigator/tabbrowser.css
+@@ -142,22 +142,13 @@ tab[progress] {
+ .tabs-newbutton:hover {
+   list-style-image: url("chrome://navigator/skin/icons/tab-new-hov.png");
+ }
+ 
+ .tabs-newbutton:hover:active {
+   list-style-image: url("chrome://navigator/skin/icons/tab-new-act.png");
+ }
+ 
+-.tab-drop-indicator-bar {
+-    height: 11px;
+-    margin-top: -11px;
+-    margin-inline-start: -6px;
+-    position: relative;
++.tab-drop-indicator {
++  position: relative;
++  z-index: 1;
++  list-style-image: url('chrome://navigator/skin/icons/tab-drag-indicator.png');
+ }
+-
+-.tab-drop-indicator {
+-    height: 11px;
+-    width: 11px;
+-    margin-bottom: -5px;
+-    position: relative;
+-    list-style-image: url('chrome://navigator/skin/icons/tab-drag-indicator.png');
+-}

+ 7 - 0
comm-release/patches/series

@@ -2175,3 +2175,10 @@ TOP-1906540-mozdevice-removal-comm-25320.patch
 1909858-venkman-25320.patch
 1909858-venkman-25320.patch
 1909864-1-SeekCell-25320.patch
 1909864-1-SeekCell-25320.patch
 1909864-2-PickNextCell-25320.patch
 1909864-2-PickNextCell-25320.patch
+1911830-helpInfo-25320.patch
+1911841-browserChromeURL-25320.patch
+1478168-63a1.patch
+1911844-boxObject-utilityOverlay-25320.patch
+1911845-tabbrowser-dragOver-25320.patch
+1911847-tabbrowser-boxObject-25320.patch
+1911848-tabbrowser-tabDrop-25320.patch

+ 37 - 0
mozilla-release/patches/1406662-1only-59a1.patch

@@ -0,0 +1,37 @@
+# HG changeset patch
+# User Sylvestre Ledru <sledru@mozilla.com>
+# Date 1510821875 -3600
+# Node ID 7148babfe2ab4a68fb855cb0d2d60cfad3347b74
+# Parent  f638856845113e0d8be636af303895b1b438a581
+Bug 1406662 - When defined in the configure.sh, use the MOZ_MACBUNDLE_ID r=glandium
+
+Preserving the MOZ_MACBUNDLE_ID will avoid issue related to bundle identifier
+
+MozReview-Commit-ID: IDIZGl6usXA
+
+diff --git a/old-configure.in b/old-configure.in
+--- a/old-configure.in
++++ b/old-configure.in
+@@ -2748,17 +2748,21 @@ fi
+ if test "$MOZ_DEBUG"; then
+   MOZ_MACBUNDLE_NAME="${MOZ_MACBUNDLE_NAME} Debug.app"
+ else
+   MOZ_MACBUNDLE_NAME=${MOZ_MACBUNDLE_NAME}.app
+ fi
+ AC_SUBST(MOZ_MACBUNDLE_NAME)
+ 
+ dnl Mac bundle identifier (based on MOZ_APP_DISPLAYNAME)
+-MOZ_MACBUNDLE_ID=`echo $MOZ_APP_DISPLAYNAME | tr '[A-Z]' '[a-z]'`
++# If the MOZ_MACBUNDLE_ID is defined in the configure.sh, use it
++# Otherwise, use MOZ_APP_DISPLAYNAME
++if test -z "$MOZ_MACBUNDLE_ID"; then
++   MOZ_MACBUNDLE_ID=`echo $MOZ_APP_DISPLAYNAME | tr '[A-Z]' '[a-z]'`
++fi
+ MOZ_MACBUNDLE_ID=${MOZ_DISTRIBUTION_ID}.${MOZ_MACBUNDLE_ID}
+ if test "$MOZ_DEBUG"; then
+   MOZ_MACBUNDLE_ID=${MOZ_MACBUNDLE_ID}debug
+ fi
+ 
+ AC_DEFINE_UNQUOTED(MOZ_MACBUNDLE_ID,$MOZ_MACBUNDLE_ID)
+ AC_SUBST(MOZ_MACBUNDLE_ID)
+ 

+ 31 - 0
mozilla-release/patches/1431477-1-60a1.patch

@@ -0,0 +1,31 @@
+# HG changeset patch
+# User Sylvestre Ledru <sledru@mozilla.com>
+# Date 1516615792 -3600
+# Node ID 6cbb45faec894981794b33567c57140f591cb2f6
+# Parent  a4db284311b0fb9a5463797096c8c903184aabf5
+Bug 1431477 - Fix the bundle ID for devedition by removing whitespaces r=glandium
+
+MozReview-Commit-ID: G2cpTlpZFiR
+
+diff --git a/old-configure.in b/old-configure.in
+--- a/old-configure.in
++++ b/old-configure.in
+@@ -2751,17 +2751,17 @@ else
+   MOZ_MACBUNDLE_NAME=${MOZ_MACBUNDLE_NAME}.app
+ fi
+ AC_SUBST(MOZ_MACBUNDLE_NAME)
+ 
+ dnl Mac bundle identifier (based on MOZ_APP_DISPLAYNAME)
+ # If the MOZ_MACBUNDLE_ID is defined in the configure.sh, use it
+ # Otherwise, use MOZ_APP_DISPLAYNAME
+ if test -z "$MOZ_MACBUNDLE_ID"; then
+-   MOZ_MACBUNDLE_ID=`echo $MOZ_APP_DISPLAYNAME | tr '[A-Z]' '[a-z]'`
++   MOZ_MACBUNDLE_ID=`echo $MOZ_APP_DISPLAYNAME | tr '[A-Z]' '[a-z]' | tr -d '[[:blank:]]'`
+ fi
+ MOZ_MACBUNDLE_ID=${MOZ_DISTRIBUTION_ID}.${MOZ_MACBUNDLE_ID}
+ if test "$MOZ_DEBUG"; then
+   MOZ_MACBUNDLE_ID=${MOZ_MACBUNDLE_ID}debug
+ fi
+ 
+ AC_DEFINE_UNQUOTED(MOZ_MACBUNDLE_ID,$MOZ_MACBUNDLE_ID)
+ AC_SUBST(MOZ_MACBUNDLE_ID)

+ 31 - 0
mozilla-release/patches/1431477-2-60a1.patch

@@ -0,0 +1,31 @@
+# HG changeset patch
+# User Sylvestre Ledru <sledru@mozilla.com>
+# Date 1516782572 -3600
+# Node ID 40c125df036bde1df48c90c7231718836df102fe
+# Parent  7ce9b4e02192beb701cfd939642bb46bfdaef7cd
+Bug 1431477 - Ride along: Remove the useless [] (removed by the m4 step anyway) r=glandium
+
+MozReview-Commit-ID: 5RSlgVINJZx
+
+diff --git a/old-configure.in b/old-configure.in
+--- a/old-configure.in
++++ b/old-configure.in
+@@ -2751,17 +2751,17 @@ else
+   MOZ_MACBUNDLE_NAME=${MOZ_MACBUNDLE_NAME}.app
+ fi
+ AC_SUBST(MOZ_MACBUNDLE_NAME)
+ 
+ dnl Mac bundle identifier (based on MOZ_APP_DISPLAYNAME)
+ # If the MOZ_MACBUNDLE_ID is defined in the configure.sh, use it
+ # Otherwise, use MOZ_APP_DISPLAYNAME
+ if test -z "$MOZ_MACBUNDLE_ID"; then
+-   MOZ_MACBUNDLE_ID=`echo $MOZ_APP_DISPLAYNAME | tr '[A-Z]' '[a-z]' | tr -d '[[:blank:]]'`
++   MOZ_MACBUNDLE_ID=`echo $MOZ_APP_DISPLAYNAME | tr 'A-Z' 'a-z' | tr -d '[[:blank:]]'`
+ fi
+ MOZ_MACBUNDLE_ID=${MOZ_DISTRIBUTION_ID}.${MOZ_MACBUNDLE_ID}
+ if test "$MOZ_DEBUG"; then
+   MOZ_MACBUNDLE_ID=${MOZ_MACBUNDLE_ID}debug
+ fi
+ 
+ AC_DEFINE_UNQUOTED(MOZ_MACBUNDLE_ID,$MOZ_MACBUNDLE_ID)
+ AC_SUBST(MOZ_MACBUNDLE_ID)

+ 35 - 0
mozilla-release/patches/1433517-60a1.patch

@@ -0,0 +1,35 @@
+# HG changeset patch
+# User teor <teor2345@gmail.com>
+# Date 1517819460 -7200
+# Node ID a7f88998e959dd94f9050371824b1e9a379cc705
+# Parent  12b3cb098f96698daaab90a4b43857b6cfe7a6bf
+Bug 1433517 - Prevent illegal characters in MOZ_MACBUNDLE_ID r=glandium
+
+CFBundleIdentifiers can only contain [A-Za-z.-], and by convention
+the app component is lowercase and does not contain '.'.
+
+Make configure delete all characters other than [a-z-] when generating
+MOZ_MACBUNDLE_ID from MOZ_APP_DISPLAYNAME.
+
+diff --git a/old-configure.in b/old-configure.in
+--- a/old-configure.in
++++ b/old-configure.in
+@@ -2751,17 +2751,17 @@ else
+   MOZ_MACBUNDLE_NAME=${MOZ_MACBUNDLE_NAME}.app
+ fi
+ AC_SUBST(MOZ_MACBUNDLE_NAME)
+ 
+ dnl Mac bundle identifier (based on MOZ_APP_DISPLAYNAME)
+ # If the MOZ_MACBUNDLE_ID is defined in the configure.sh, use it
+ # Otherwise, use MOZ_APP_DISPLAYNAME
+ if test -z "$MOZ_MACBUNDLE_ID"; then
+-   MOZ_MACBUNDLE_ID=`echo $MOZ_APP_DISPLAYNAME | tr 'A-Z' 'a-z' | tr -d '[[:blank:]]'`
++   MOZ_MACBUNDLE_ID=`echo $MOZ_APP_DISPLAYNAME | tr 'A-Z' 'a-z' | tr -dc 'a-z-'`
+ fi
+ MOZ_MACBUNDLE_ID=${MOZ_DISTRIBUTION_ID}.${MOZ_MACBUNDLE_ID}
+ if test "$MOZ_DEBUG"; then
+   MOZ_MACBUNDLE_ID=${MOZ_MACBUNDLE_ID}debug
+ fi
+ 
+ AC_DEFINE_UNQUOTED(MOZ_MACBUNDLE_ID,$MOZ_MACBUNDLE_ID)
+ AC_SUBST(MOZ_MACBUNDLE_ID)

+ 48 - 0
mozilla-release/patches/1446270-61a1.patch

@@ -0,0 +1,48 @@
+# HG changeset patch
+# User Makoto Kato <m_kato@ga2.so-net.ne.jp>
+# Date 1521185894 -32400
+# Node ID bf807404eb8885b6811ef22069eb0b92f9ea470b
+# Parent  326ab94b619ba797e719c0145ea5407eebbe3475
+Bug 1446270 - Android/arm target should turn on crash reporter as default. r=froydnj
+
+target value of Anndroid/arm is arm-unknown-linux-androideabi, so arm-*-linux*
+matches on android/arm and MOZ_CRASHREPORTER is unset as default option.
+
+Since taskcluster's build adds --enable-crashrepoter as default, we should set
+it as developer's default too.
+
+MozReview-Commit-ID: 8V6sWAN07F9
+
+diff --git a/old-configure.in b/old-configure.in
+--- a/old-configure.in
++++ b/old-configure.in
+@@ -1932,24 +1932,26 @@ dnl ====================================
+ 
+ case $target in
+ i?86-*-mingw*|x86_64-*-mingw*)
+   MOZ_CRASHREPORTER=1
+   ;;
+ i?86-apple-darwin*|x86_64-apple-darwin*)
+   MOZ_CRASHREPORTER=1
+   ;;
++*-android*|*-linuxandroid*)
++  dnl Android/arm is arm-unknown-linux-androideabi, so android condition should
++  dnl be before Linux condition
++  MOZ_CRASHREPORTER=1
++  ;;
+ i?86-*-linux*|x86_64-*-linux*|arm-*-linux*)
+   if test "$MOZ_ENABLE_GTK"; then
+     MOZ_CRASHREPORTER=1
+   fi
+   ;;
+-*-android*|*-linuxandroid*)
+-  MOZ_CRASHREPORTER=1
+-  ;;
+ esac
+ 
+ MOZ_ARG_DISABLE_BOOL(crashreporter,
+ [  --disable-crashreporter Disable breakpad crash reporting],
+     [MOZ_CRASHREPORTER=],
+     [MOZ_CRASHREPORTER=F # Force enable breakpad])
+ 
+ if test "$OS_ARCH" != "$HOST_OS_ARCH" -a "$OS_ARCH" != "WINNT" -a "$OS_ARCH" != "Darwin" -a "$MOZ_WIDGET_TOOLKIT" != "android"; then

+ 89 - 0
mozilla-release/patches/1447442-12-61a1.patch

@@ -0,0 +1,89 @@
+# HG changeset patch
+# User André Bargull <andre.bargull@gmail.com>
+# Date 1523611561 25200
+# Node ID 2b300e277494b2aa2ed79d36118f4aa4b84e328e
+# Parent  f638856845113e0d8be636af303895b1b438a581
+Bug 1447442 - Part 12: Remove unused HAVE_HYPOT from old-configure and update comments in hypot function. r=jorendorff
+
+diff --git a/js/src/jsmath.cpp b/js/src/jsmath.cpp
+--- a/js/src/jsmath.cpp
++++ b/js/src/jsmath.cpp
+@@ -1257,17 +1257,16 @@ js::math_atanh_uncached(double x)
+ }
+ 
+ bool
+ js::math_atanh(JSContext* cx, unsigned argc, Value* vp)
+ {
+     return math_function<math_atanh_impl>(cx, argc, vp);
+ }
+ 
+-/* Consistency wrapper for platform deviations in hypot() */
+ double
+ js::ecmaHypot(double x, double y)
+ {
+     AutoUnsafeCallWithABI unsafe;
+     return fdlibm::hypot(x, y);
+ }
+ 
+ static inline
+@@ -1283,19 +1282,17 @@ hypot_step(double& scale, double& sumsq,
+     }
+ }
+ 
+ double
+ js::hypot4(double x, double y, double z, double w)
+ {
+     AutoUnsafeCallWithABI unsafe;
+ 
+-    /* Check for infinity or NaNs so that we can return immediatelly.
+-     * Does not need to be WIN_XP specific as ecmaHypot
+-     */
++    // Check for infinities or NaNs so that we can return immediately.
+     if (mozilla::IsInfinite(x) || mozilla::IsInfinite(y) ||
+             mozilla::IsInfinite(z) || mozilla::IsInfinite(w))
+         return mozilla::PositiveInfinity<double>();
+ 
+     if (mozilla::IsNaN(x) || mozilla::IsNaN(y) || mozilla::IsNaN(z) ||
+             mozilla::IsNaN(w))
+         return GenericNaN();
+ 
+@@ -1322,17 +1319,17 @@ js::math_hypot(JSContext* cx, unsigned a
+ {
+     CallArgs args = CallArgsFromVp(argc, vp);
+     return math_hypot_handle(cx, args, args.rval());
+ }
+ 
+ bool
+ js::math_hypot_handle(JSContext* cx, HandleValueArray args, MutableHandleValue res)
+ {
+-    // IonMonkey calls the system hypot function directly if two arguments are
++    // IonMonkey calls the ecmaHypot function directly if two arguments are
+     // given. Do that here as well to get the same results.
+     if (args.length() == 2) {
+         double x, y;
+         if (!ToNumber(cx, args[0], &x))
+             return false;
+         if (!ToNumber(cx, args[1], &y))
+             return false;
+ 
+diff --git a/js/src/old-configure.in b/js/src/old-configure.in
+--- a/js/src/old-configure.in
++++ b/js/src/old-configure.in
+@@ -231,17 +231,16 @@ if test -n "$_WIN32_MSVC"; then
+     SKIP_LIBRARY_CHECKS=1
+ 
+     # Since we're skipping compiler and library checks, hard-code
+     # some facts here.
+ 
+     # Common to all MSVC environments:
+ 
+     AC_DEFINE(HAVE_LOCALECONV)
+-    AC_DEFINE(HAVE_HYPOT)
+     AC_CHECK_FUNCS([_getc_nolock])
+ fi
+ 
+ fi # COMPILE_ENVIRONMENT
+ 
+ # Check to see if we are running in a broken QEMU scratchbox.
+ # We know that anything below 1.0.16 is broken.
+ AC_CHECK_PROGS(SBCONF, sb-conf ve, "")

+ 56 - 0
mozilla-release/patches/1456552-62a1.patch

@@ -0,0 +1,56 @@
+# HG changeset patch
+# User Tom Ritter <tom@mozilla.com>
+# Date 1526506367 18000
+# Node ID 87f1c846afc3eca37b82d8e86dd3fe451175ab21
+# Parent  d9e4a3f6c80145070187f4aba8806dada75b2178
+Bug 1456552 Make Optimized MinGW builds use -O# instead of falling through and collecting a -O r=ted
+
+We use -O2 for js (because we can) and we use -O1 for the root because there is an x86 compiler bug
+that is not immediately bypassable
+
+MozReview-Commit-ID: CnDk2ko3jfo
+
+diff --git a/js/src/old-configure.in b/js/src/old-configure.in
+--- a/js/src/old-configure.in
++++ b/js/src/old-configure.in
+@@ -561,16 +561,18 @@ case "$target" in
+         if test -z "$CLANG_CC"; then
+             # Use static libgcc and libstdc++
+             LDFLAGS="$LDFLAGS -static"
+         else
+             # Silence problematic clang warnings
+             CXXFLAGS="$CXXFLAGS -Wno-incompatible-ms-struct"
+         fi
+ 
++        MOZ_OPTIMIZE_FLAGS="-O2"
++
+         WIN32_CONSOLE_EXE_LDFLAGS=-mconsole
+         WIN32_GUI_EXE_LDFLAGS=-mwindows
+     else
+         TARGET_COMPILER_ABI=msvc
+         HOST_CC='$(CC)'
+         HOST_CXX='$(CXX)'
+         STRIP='echo'
+         STRIP_FLAGS='not_strip'
+diff --git a/old-configure.in b/old-configure.in
+--- a/old-configure.in
++++ b/old-configure.in
+@@ -649,16 +649,18 @@ case "$target" in
+         CXXFLAGS="$CXXFLAGS -mms-bitfields"
+         DSO_LDOPTS='-shared'
+         # Use temp file for windres (bug 213281)
+         RCFLAGS='-O coff --use-temp-file'
+         # mingw doesn't require kernel32, user32, and advapi32 explicitly
+         LIBS="$LIBS -luuid -lusp10 -lgdi32 -lwinmm -lwsock32 -luserenv -lsecur32"
+         MOZ_FIX_LINK_PATHS=
+ 
++        MOZ_OPTIMIZE_FLAGS="-O1"
++
+         WIN32_CONSOLE_EXE_LDFLAGS=-mconsole
+         WIN32_GUI_EXE_LDFLAGS=-mwindows
+ 
+         if test -z "$CLANG_CC"; then
+             # Use static libgcc and libstdc++
+             LDFLAGS="$LDFLAGS -static"
+ 
+             # GCC/binutils can't link to a function if we try to include dllexport function

+ 104 - 0
mozilla-release/patches/1476333-1-63a1.patch

@@ -0,0 +1,104 @@
+# HG changeset patch
+# User Brian Grinstead <bgrinstead@mozilla.com>
+# Date 1532445168 25200
+# Node ID f4181dab3ad85ae4636405b770621a9e8b218f19
+# Parent  0a60749e1c31533f4189b92bd9019258aadb713c
+Bug 1476333 - Define the browser chrome URL as BROWSER_CHROME_URL so it can be accessed from AppConstants instead of a pref;r=gps
+
+MozReview-Commit-ID: DPxayAW4D1s
+
+diff --git a/browser/confvars.sh b/browser/confvars.sh
+--- a/browser/confvars.sh
++++ b/browser/confvars.sh
+@@ -20,16 +20,19 @@ if test "$OS_ARCH" = "WINNT"; then
+   fi
+ fi
+ 
+ # Enable building ./signmar and running libmar signature tests
+ MOZ_ENABLE_SIGNMAR=1
+ 
+ MOZ_APP_VERSION=$FIREFOX_VERSION
+ MOZ_APP_VERSION_DISPLAY=$FIREFOX_VERSION_DISPLAY
++
++BROWSER_CHROME_URL=chrome://browser/content/browser.xul
++
+ # MOZ_APP_DISPLAYNAME will be set by branding/configure.sh
+ # MOZ_BRANDING_DIRECTORY is the default branding directory used when none is
+ # specified. It should never point to the "official" branding directory.
+ # For mozilla-beta, mozilla-release, or mozilla-central repositories, use
+ # "unofficial" branding.
+ # For the mozilla-aurora repository, use "aurora".
+ MOZ_BRANDING_DIRECTORY=browser/branding/unofficial
+ MOZ_OFFICIAL_BRANDING_DIRECTORY=browser/branding/official
+diff --git a/old-configure.in b/old-configure.in
+--- a/old-configure.in
++++ b/old-configure.in
+@@ -2872,16 +2872,19 @@ AC_SUBST(MOZ_APP_ID)
+ AC_SUBST(MAR_CHANNEL_ID)
+ AC_SUBST(ACCEPTED_MAR_CHANNEL_IDS)
+ AC_SUBST(MOZ_PROFILE_MIGRATOR)
+ AC_DEFINE_UNQUOTED(MOZ_APP_UA_NAME, "$MOZ_APP_UA_NAME")
+ AC_SUBST(MOZ_APP_UA_NAME)
+ AC_DEFINE_UNQUOTED(MOZ_APP_UA_VERSION, "$MOZ_APP_VERSION")
+ AC_SUBST(MOZ_APP_VERSION)
+ AC_SUBST(MOZ_APP_VERSION_DISPLAY)
++AC_DEFINE_UNQUOTED(BROWSER_CHROME_URL, $BROWSER_CHROME_URL)
++AC_DEFINE_UNQUOTED(MOZ_BROWSER_CHROME_URL_QUOTED, "$BROWSER_CHROME_URL")
++
+ AC_SUBST(MOZ_APP_MAXVERSION)
+ AC_DEFINE_UNQUOTED(FIREFOX_VERSION,$FIREFOX_VERSION)
+ AC_SUBST(FIREFOX_VERSION)
+ AC_SUBST(MOZ_UA_OS_AGNOSTIC)
+ if test -n "$MOZ_UA_OS_AGNOSTIC"; then
+   AC_DEFINE(MOZ_UA_OS_AGNOSTIC)
+ fi
+ 
+diff --git a/toolkit/modules/AppConstants.jsm b/toolkit/modules/AppConstants.jsm
+--- a/toolkit/modules/AppConstants.jsm
++++ b/toolkit/modules/AppConstants.jsm
+@@ -287,16 +287,18 @@ this.AppConstants = Object.freeze({
+   DEBUG_JS_MODULES: "@DEBUG_JS_MODULES@",
+ 
+   MOZ_BING_API_CLIENTID: "@MOZ_BING_API_CLIENTID@",
+   MOZ_BING_API_KEY: "@MOZ_BING_API_KEY@",
+   MOZ_GOOGLE_LOCATION_SERVICE_API_KEY: "@MOZ_GOOGLE_LOCATION_SERVICE_API_KEY@",
+   MOZ_GOOGLE_SAFEBROWSING_API_KEY: "@MOZ_GOOGLE_SAFEBROWSING_API_KEY@",
+   MOZ_MOZILLA_API_KEY: "@MOZ_MOZILLA_API_KEY@",
+ 
++  BROWSER_CHROME_URL: "@BROWSER_CHROME_URL@",
++
+   // URL to the hg revision this was built from (e.g.
+   // "https://hg.mozilla.org/mozilla-central/rev/6256ec9113c1")
+   // On unofficial builds, this is an empty string.
+ #ifndef MOZ_SOURCE_URL
+ #define MOZ_SOURCE_URL
+ #endif
+   SOURCE_REVISION_URL: "@MOZ_SOURCE_URL@",
+ 
+diff --git a/xpfe/appshell/nsXULWindow.cpp b/xpfe/appshell/nsXULWindow.cpp
+--- a/xpfe/appshell/nsXULWindow.cpp
++++ b/xpfe/appshell/nsXULWindow.cpp
+@@ -1939,22 +1939,18 @@ NS_IMETHODIMP nsXULWindow::CreateNewCont
+   NS_ENSURE_TRUE(appShell, NS_ERROR_FAILURE);
+ 
+   // We need to create a new top level window and then enter a nested
+   // loop. Eventually the new window will be told that it has loaded,
+   // at which time we know it is safe to spin out of the nested loop
+   // and allow the opening code to proceed.
+ 
+   nsCOMPtr<nsIURI> uri;
+-
+   nsAutoCString urlStr;
+-  Preferences::GetCString("browser.chromeURL", urlStr);
+-  if (urlStr.IsEmpty()) {
+-    urlStr.AssignLiteral("chrome://navigator/content/navigator.xul");
+-  }
++  urlStr.AssignLiteral(MOZ_BROWSER_CHROME_URL_QUOTED);
+ 
+   nsCOMPtr<nsIIOService> service(do_GetService(NS_IOSERVICE_CONTRACTID));
+   if (service) {
+     service->NewURI(urlStr, nullptr, nullptr, getter_AddRefs(uri));
+   }
+   NS_ENSURE_TRUE(uri, NS_ERROR_FAILURE);
+ 
+   // We need to create a chrome window to contain the content window we're about

+ 1306 - 0
mozilla-release/patches/1476333-2-63a1.patch

@@ -0,0 +1,1306 @@
+# HG changeset patch
+# User Brian Grinstead <bgrinstead@mozilla.com>
+# Date 1532445170 25200
+# Node ID dd386b5b9fa7f5cd6dc4bbbfa0503b3eb2969af5
+# Parent  9c47dafc65faa7c86d8dda4deddbffdc8954cf08
+Bug 1476333 - Refer to AppConstants.BROWSER_CHROME_URL to get the browser URL from the frontend;r=Gijs
+
+Before this change, we accessed the browser URL in the following ways:
+
+- "chrome://browser/content/browser.xul"
+- "chrome://browser/content/" (which redirects to chrome://browser/content/browser.xul)
+- Services.prefs.getCharPref("browser.chromeURL") which returns "chrome://browser/content/"
+- getBrowserURL() from utilityOverlay.js
+
+MozReview-Commit-ID: I5vtRke1x9t
+
+diff --git a/accessible/tests/mochitest/browser.js b/accessible/tests/mochitest/browser.js
+--- a/accessible/tests/mochitest/browser.js
++++ b/accessible/tests/mochitest/browser.js
+@@ -1,8 +1,10 @@
++ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
++
+ /**
+  * Load the browser with the given url and then invokes the given function.
+  */
+ function openBrowserWindow(aFunc, aURL, aRect) {
+   gBrowserContext.testFunc = aFunc;
+   gBrowserContext.startURL = aURL;
+   gBrowserContext.browserRect = aRect;
+ 
+@@ -108,17 +110,17 @@ function openBrowserWindowIntl() {
+       params += ",top=" + rect.top;
+     if ("width" in rect)
+       params += ",width=" + rect.width;
+     if ("height" in rect)
+       params += ",height=" + rect.height;
+   }
+ 
+   gBrowserContext.browserWnd =
+-    window.openDialog(Services.prefs.getCharPref("browser.chromeURL"),
++    window.openDialog(AppConstants.BROWSER_CHROME_URL,
+                       "_blank", params,
+                       gBrowserContext.startURL);
+ 
+   whenDelayedStartupFinished(browserWindow(), function() {
+     addA11yLoadEvent(startBrowserTests, browserWindow());
+   });
+ }
+ 
+diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
+--- a/browser/app/profile/firefox.js
++++ b/browser/app/profile/firefox.js
+@@ -16,17 +16,16 @@
+ #
+ 
+ #ifdef XP_UNIX
+ #ifndef XP_MACOSX
+ #define UNIX_BUT_NOT_MAC
+ #endif
+ #endif
+ 
+-pref("browser.chromeURL","chrome://browser/content/");
+ pref("browser.hiddenWindowChromeURL", "chrome://browser/content/hiddenWindow.xul");
+ 
+ // Enables some extra Extension System Logging (can reduce performance)
+ pref("extensions.logging.enabled", false);
+ 
+ // Disables strict compatibility, making addons compatible-by-default.
+ pref("extensions.strictCompatibility", false);
+ 
+diff --git a/browser/base/content/browser-places.js b/browser/base/content/browser-places.js
+--- a/browser/base/content/browser-places.js
++++ b/browser/base/content/browser-places.js
+@@ -686,17 +686,17 @@ var PlacesCommandHook = {
+   },
+ 
+   /**
+    * Updates disabled state for the "Bookmark All Tabs" command.
+    */
+   updateBookmarkAllTabsCommand:
+   function PCH_updateBookmarkAllTabsCommand() {
+     // There's nothing to do in non-browser windows.
+-    if (window.location.href != getBrowserURL())
++    if (window.location.href != AppConstants.BROWSER_CHROME_URL)
+       return;
+ 
+     // Disable "Bookmark All Tabs" if there are less than two
+     // "unique current pages".
+     goSetCommandEnabled("Browser:BookmarkAllTabs",
+                         this.uniqueCurrentPages.length >= 2);
+   },
+ 
+diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
+--- a/browser/base/content/browser.js
++++ b/browser/base/content/browser.js
+@@ -2156,18 +2156,18 @@ function BrowserGoHome(aEvent) {
+   case "window":
+     OpenBrowserWindow();
+     break;
+   }
+ }
+ 
+ function loadOneOrMoreURIs(aURIString, aTriggeringPrincipal) {
+   // we're not a browser window, pass the URI string to a new browser window
+-  if (window.location.href != getBrowserURL()) {
+-    window.openDialog(getBrowserURL(), "_blank", "all,dialog=no", aURIString);
++  if (window.location.href != AppConstants.BROWSER_CHROME_URL) {
++    window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", "all,dialog=no", aURIString);
+     return;
+   }
+ 
+   // This function throws for certain malformed URIs, so use exception handling
+   // so that we don't disrupt startup
+   try {
+     gBrowser.loadTabs(aURIString.split("|"), {
+       inBackground: false,
+@@ -2202,25 +2202,25 @@ function focusAndSelectUrlBar() {
+   }
+   return false;
+ }
+ 
+ function openLocation() {
+   if (focusAndSelectUrlBar())
+     return;
+ 
+-  if (window.location.href != getBrowserURL()) {
++  if (window.location.href != AppConstants.BROWSER_CHROME_URL) {
+     var win = getTopWin();
+     if (win) {
+       // If there's an open browser window, it should handle this command
+       win.focus();
+       win.openLocation();
+     } else {
+       // If there are no open browser windows, open a new one
+-      window.openDialog("chrome://browser/content/", "_blank",
++      window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank",
+                         "chrome,all,dialog=no", BROWSER_NEW_TAB_URL);
+     }
+   }
+ }
+ 
+ function BrowserOpenTab(event) {
+   // A notification intended to be useful for modular peformance tracking
+   // starting as close as is reasonably possible to the time when the user
+@@ -2336,17 +2336,17 @@ function BrowserOpenFileWindow() {
+     fp.displayDirectory = gLastOpenDirectory.path;
+     fp.open(fpCallback);
+   } catch (ex) {
+   }
+ }
+ 
+ function BrowserCloseTabOrWindow() {
+   // If we're not a browser window, just close the window
+-  if (window.location.href != getBrowserURL()) {
++  if (window.location.href != AppConstants.BROWSER_CHROME_URL) {
+     closeWindow(true);
+     return;
+   }
+ 
+   // If the current tab is the last one, this will close the window.
+   gBrowser.removeCurrentTab({animate: true});
+ }
+ 
+@@ -3696,31 +3696,31 @@ const BrowserSearch = {
+   },
+ 
+   /**
+    * Gives focus to the search bar, if it is present on the toolbar, or loads
+    * the default engine's search form otherwise. For Mac, opens a new window
+    * or focuses an existing window, if necessary.
+    */
+   webSearch: function BrowserSearch_webSearch() {
+-    if (window.location.href != getBrowserURL()) {
++    if (window.location.href != AppConstants.BROWSER_CHROME_URL) {
+       var win = getTopWin();
+       if (win) {
+         // If there's an open browser window, it should handle this command
+         win.focus();
+         win.BrowserSearch.webSearch();
+       } else {
+         // If there are no open browser windows, open a new one
+         var observer = function(subject, topic, data) {
+           if (subject == win) {
+             BrowserSearch.webSearch();
+             Services.obs.removeObserver(observer, "browser-delayed-startup-finished");
+           }
+         };
+-        win = window.openDialog(getBrowserURL(), "_blank",
++        win = window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank",
+                                 "chrome,all,dialog=no", "about:blank");
+         Services.obs.addObserver(observer, "browser-delayed-startup-finished");
+       }
+       return;
+     }
+ 
+     let focusUrlBarIfSearchFieldIsNotActive = function(aSearchBar) {
+       if (!aSearchBar || document.activeElement != aSearchBar.textbox.inputField) {
+@@ -4072,20 +4072,20 @@ function OpenBrowserWindow(options) {
+   // set, then extract the current charset menu setting from the current document and use it to
+   // initialize the new browser window...
+   var win;
+   if (window && (wintype == "navigator:browser") && window.content && window.content.document) {
+     var DocCharset = window.content.document.characterSet;
+     let charsetArg = "charset=" + DocCharset;
+ 
+     // we should "inherit" the charset menu setting in a new window
+-    win = window.openDialog("chrome://browser/content/", "_blank", "chrome,all,dialog=no" + extraFeatures, defaultArgs, charsetArg);
++    win = window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", "chrome,all,dialog=no" + extraFeatures, defaultArgs, charsetArg);
+   } else {
+     // forget about the charset information.
+-    win = window.openDialog("chrome://browser/content/", "_blank", "chrome,all,dialog=no" + extraFeatures, defaultArgs);
++    win = window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", "chrome,all,dialog=no" + extraFeatures, defaultArgs);
+   }
+ 
+   return win;
+ }
+ 
+ // Only here for backwards compat, we should remove this soon
+ function BrowserCustomizeToolbar() {
+   gCustomizeMode.enter();
+@@ -5178,17 +5178,17 @@ nsBrowserAccess.prototype = {
+         // referrer like the other loads do?
+         var url = aURI ? aURI.spec : "about:blank";
+         let features = "all,dialog=no";
+         if (isPrivate) {
+           features += ",private";
+         }
+         // Pass all params to openDialog to ensure that "url" isn't passed through
+         // loadOneOrMoreURIs, which splits based on "|"
+-        newWindow = openDialog(getBrowserURL(), "_blank", features, url, null, null, null);
++        newWindow = openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", features, url, null, null, null);
+         break;
+       case Ci.nsIBrowserDOMWindow.OPEN_NEWTAB :
+         // If we have an opener, that means that the caller is expecting access
+         // to the nsIDOMWindow of the opened tab right away. For e10s windows,
+         // this means forcing the newly opened browser to be non-remote so that
+         // we can hand back the nsIDOMWindow. The XULBrowserWindow.shouldLoadURI
+         // will do the job of shuttling off the newly opened browser to run in
+         // the right process once it starts loading a URI.
+@@ -7913,17 +7913,17 @@ var gPrivateBrowsingUI = {
+     if (!PrivateBrowsingUtils.isWindowPrivate(window)) {
+       return;
+     }
+ 
+     // Disable the Clear Recent History... menu item when in PB mode
+     // temporary fix until bug 463607 is fixed
+     document.getElementById("Tools:Sanitize").setAttribute("disabled", "true");
+ 
+-    if (window.location.href == getBrowserURL()) {
++    if (window.location.href == AppConstants.BROWSER_CHROME_URL) {
+       // Adjust the window's title
+       let docElement = document.documentElement;
+       if (!PrivateBrowsingUtils.permanentPrivateBrowsing) {
+         docElement.setAttribute("title",
+           docElement.getAttribute("title_privatebrowsing"));
+         docElement.setAttribute("titlemodifier",
+           docElement.getAttribute("titlemodifier_privatebrowsing"));
+       }
+diff --git a/browser/base/content/tabbrowser.js.1476333-2.later b/browser/base/content/tabbrowser.js.1476333-2.later
+new file mode 100644
+--- /dev/null
++++ b/browser/base/content/tabbrowser.js.1476333-2.later
+@@ -0,0 +1,21 @@
++--- tabbrowser.js
+++++ tabbrowser.js
++@@ -3400,17 +3400,17 @@ window._gBrowser = {
++     // waiting for the new window to appear.
++     // content area when the docshells are swapped.
++     if (this.animationsEnabled) {
++       aTab.style.maxWidth = ""; // ensure that fade-out transition happens
++       aTab.removeAttribute("fadein");
++     }
++ 
++     // tell a new window to take the "dropped" tab
++-    return window.openDialog(getBrowserURL(), "_blank", options, aTab);
+++    return window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", options, aTab);
++   },
++ 
++   /**
++    * Move contextTab (or selected tabs in a mutli-select context)
++    * to a new browser window, unless it is (they are) already the only tab(s)
++    * in the current window, in which case this will do nothing.
++    */
++   replaceTabsWithWindow(contextTab) {
+diff --git a/browser/base/content/tabbrowser.xml b/browser/base/content/tabbrowser.xml
+--- a/browser/base/content/tabbrowser.xml
++++ b/browser/base/content/tabbrowser.xml
+@@ -3757,17 +3757,17 @@
+             // waiting for the new window to appear.
+             // content area when the docshells are swapped.
+             if (this.animationsEnabled) {
+               aTab.style.maxWidth = ""; // ensure that fade-out transition happens
+               aTab.removeAttribute("fadein");
+             }
+ 
+             // tell a new window to take the "dropped" tab
+-            return window.openDialog(getBrowserURL(), "_blank", options, aTab);
++            return window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", options, aTab);
+           ]]>
+         </body>
+       </method>
+ 
+       <method name="moveTabTo">
+         <parameter name="aTab"/>
+         <parameter name="aIndex"/>
+         <parameter name="aKeepRelatedTabs"/>
+diff --git a/browser/base/content/test/general/browser_bug422590.js b/browser/base/content/test/general/browser_bug422590.js
+--- a/browser/base/content/test/general/browser_bug422590.js
++++ b/browser/base/content/test/general/browser_bug422590.js
+@@ -1,26 +1,26 @@
+ function test() {
+   waitForExplicitFinish();
+ 
+   // test a normal browser window
+-  var newWin = openDialog(getBrowserURL(), "_blank", "chrome,all,dialog=no", "about:blank");
++  var newWin = openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", "chrome,all,dialog=no", "about:blank");
+   ok(newWin, "got new normal window");
+ 
+   whenDelayedStartupFinished(newWin, function() {
+     testCustomize(newWin, function() {
+       newWin.close();
+       testChromeless();
+     });
+   });
+ }
+ 
+ function testChromeless() {
+   // test a chromeless window
+-  var newWin = openDialog(getBrowserURL(), "_blank",
++  var newWin = openDialog(AppConstants.BROWSER_CHROME_URL, "_blank",
+                           "chrome,dialog=no,location=yes,toolbar=no", "about:blank");
+   ok(newWin, "got new window");
+ 
+   whenDelayedStartupFinished(newWin, function() {
+     // Check that the search bar is hidden
+     var searchBar = newWin.BrowserSearch.searchBar;
+     ok(searchBar, "got search bar");
+ 
+diff --git a/browser/base/content/test/general/browser_bug462673.js b/browser/base/content/test/general/browser_bug462673.js
+--- a/browser/base/content/test/general/browser_bug462673.js
++++ b/browser/base/content/test/general/browser_bug462673.js
+@@ -1,25 +1,25 @@
+ add_task(async function() {
+-  var win = openDialog(getBrowserURL(), "_blank", "chrome,all,dialog=no");
++  var win = openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", "chrome,all,dialog=no");
+   await SimpleTest.promiseFocus(win);
+ 
+   let tab = win.gBrowser.tabContainer.firstChild;
+   await promiseTabLoadEvent(tab, getRootDirectory(gTestPath) + "test_bug462673.html");
+ 
+   is(win.gBrowser.browsers.length, 2, "test_bug462673.html has opened a second tab");
+   is(win.gBrowser.selectedTab, tab.nextSibling, "dependent tab is selected");
+   win.gBrowser.removeTab(tab);
+ 
+   // Closing a tab will also close its parent chrome window, but async
+   await promiseWindowWillBeClosed(win);
+ });
+ 
+ add_task(async function() {
+-  var win = openDialog(getBrowserURL(), "_blank", "chrome,all,dialog=no");
++  var win = openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", "chrome,all,dialog=no");
+   await SimpleTest.promiseFocus(win);
+ 
+   let tab = win.gBrowser.tabContainer.firstChild;
+   await promiseTabLoadEvent(tab, getRootDirectory(gTestPath) + "test_bug462673.html");
+ 
+   var newTab = win.gBrowser.addTab();
+   var newBrowser = newTab.linkedBrowser;
+   win.gBrowser.removeTab(tab);
+diff --git a/browser/base/content/test/general/browser_fullscreen-window-open.js b/browser/base/content/test/general/browser_fullscreen-window-open.js
+--- a/browser/base/content/test/general/browser_fullscreen-window-open.js
++++ b/browser/base/content/test/general/browser_fullscreen-window-open.js
+@@ -246,17 +246,17 @@ function waitForWindowOpen(aOptions) {
+ 
+   let onFinalize = function() {
+     aOptions.finalizeFn();
+ 
+     info("Finished: " + message.title);
+     runNextTest();
+   };
+ 
+-  let listener = new WindowListener(message.title, getBrowserURL(), {
++  let listener = new WindowListener(message.title, AppConstants.BROWSER_CHROME_URL, {
+     onSuccess: aOptions.successFn,
+     onFinalize,
+   });
+   Services.wm.addListener(listener);
+ 
+   executeWindowOpenInContent({
+     uri: url,
+     title: message.title,
+@@ -287,17 +287,17 @@ function waitForWindowOpenFromChrome(aOp
+ 
+   let onFinalize = function() {
+     aOptions.finalizeFn();
+ 
+     info("Finished: " + message.title);
+     runNextTest();
+   };
+ 
+-  let listener = new WindowListener(message.title, getBrowserURL(), {
++  let listener = new WindowListener(message.title, AppConstants.BROWSER_CHROME_URL, {
+     onSuccess: aOptions.successFn,
+     onFinalize,
+   });
+   Services.wm.addListener(listener);
+ 
+   newWin.open(url, message.title, message.option);
+ }
+ 
+diff --git a/browser/base/content/test/general/browser_tab_dragdrop2.js b/browser/base/content/test/general/browser_tab_dragdrop2.js
+--- a/browser/base/content/test/general/browser_tab_dragdrop2.js
++++ b/browser/base/content/test/general/browser_tab_dragdrop2.js
+@@ -5,17 +5,17 @@ const URI = ROOT + "browser_tab_dragdrop
+ 
+ // Load the test page (which runs some child popup tests) in a new window.
+ // After the tests were run, tear off the tab into a new window and run popup
+ // tests a second time. We don't care about tests results, exceptions and
+ // crashes will be caught.
+ add_task(async function() {
+   // Open a new window.
+   let args = "chrome,all,dialog=no";
+-  let win = window.openDialog(getBrowserURL(), "_blank", args, URI);
++  let win = window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", args, URI);
+ 
+   // Wait until the tests were run.
+   await promiseTestsDone(win);
+   ok(true, "tests succeeded");
+ 
+   // Create a second tab so that we can move the original one out.
+   win.gBrowser.addTab("about:blank", {skipAnimation: true});
+ 
+diff --git a/browser/base/content/test/performance/browser_windowopen.js.1476333-2.later b/browser/base/content/test/performance/browser_windowopen.js.1476333-2.later
+new file mode 100644
+--- /dev/null
++++ b/browser/base/content/test/performance/browser_windowopen.js.1476333-2.later
+@@ -0,0 +1,21 @@
++--- browser_windowopen.js
+++++ browser_windowopen.js
++@@ -54,17 +54,17 @@ if (Services.appinfo.OS == "WINNT" || Se
++ add_task(async function() {
++   // Flushing all caches helps to ensure that we get consistent
++   // behaviour when opening a new window, even if windows have been
++   // opened in previous tests.
++   Services.obs.notifyObservers(null, "startupcache-invalidate");
++   Services.obs.notifyObservers(null, "chrome-flush-skin-caches");
++   Services.obs.notifyObservers(null, "chrome-flush-caches");
++ 
++-  let win = window.openDialog("chrome://browser/content/", "_blank",
+++  let win = window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank",
++                               "chrome,all,dialog=no,remote,suppressanimation",
++                               "about:home");
++ 
++   let alreadyFocused = false;
++   let inRange = (val, min, max) => min <= val && val <= max;
++   let expectations = {
++     expectedReflows: EXPECTED_REFLOWS,
++     frames: {
+diff --git a/browser/base/content/test/static/browser_all_files_referenced.js.1476333-2.later b/browser/base/content/test/static/browser_all_files_referenced.js.1476333-2.later
+new file mode 100644
+--- /dev/null
++++ b/browser/base/content/test/static/browser_all_files_referenced.js.1476333-2.later
+@@ -0,0 +1,21 @@
++--- browser_all_files_referenced.js
+++++ browser_all_files_referenced.js
++@@ -575,17 +575,17 @@ add_task(async function checkAllTheFiles
++     uri = convertToCodeURI(uri.spec);
++     if ((uri.startsWith("chrome://") || uri.startsWith("resource://")) &&
++         isDevtools == hasDevtoolsPrefix(uri))
++       chromeFiles.push(uri);
++   }
++ 
++   if (isDevtools) {
++     // chrome://devtools/skin/devtools-browser.css is included from browser.xul
++-    gReferencesFromCode.set("chrome://browser/content/browser.xul", null);
+++    gReferencesFromCode.set(AppConstants.BROWSER_CHROME_URL, null);
++     // devtools' css is currently included from browser.css, see bug 1204810.
++     gReferencesFromCode.set("chrome://browser/skin/browser.css", null);
++   }
++ 
++   let isUnreferenced = file => {
++     if (gExceptionPaths.some(e => file.startsWith(e)))
++       return false;
++     if (gReferencesFromCode.has(file)) {
+diff --git a/browser/base/content/test/webrtc/get_user_media_content_script.js b/browser/base/content/test/webrtc/get_user_media_content_script.js
+--- a/browser/base/content/test/webrtc/get_user_media_content_script.js
++++ b/browser/base/content/test/webrtc/get_user_media_content_script.js
+@@ -17,17 +17,17 @@ const kObservedTopics = [
+   "recording-window-ended"
+ ];
+ 
+ var gObservedTopics = {};
+ 
+ function ignoreEvent(aSubject, aTopic, aData) {
+   // With e10s disabled, our content script receives notifications for the
+   // preview displayed in our screen sharing permission prompt; ignore them.
+-  const kBrowserURL = "chrome://browser/content/browser.xul";
++  const kBrowserURL = AppConstants.BROWSER_CHROME_URL;
+   const nsIPropertyBag = Ci.nsIPropertyBag;
+   if (aTopic == "recording-device-events" &&
+       aSubject.QueryInterface(nsIPropertyBag).getProperty("requestURL") == kBrowserURL) {
+     return true;
+   }
+   if (aTopic == "recording-window-ended") {
+     let win = Services.wm.getOuterWindowWithId(aData).top;
+     if (win.document.documentURI == kBrowserURL)
+diff --git a/browser/base/content/utilityOverlay.js b/browser/base/content/utilityOverlay.js
+--- a/browser/base/content/utilityOverlay.js
++++ b/browser/base/content/utilityOverlay.js
+@@ -41,20 +41,16 @@ var gBidiUI = false;
+ 
+ /**
+  * Determines whether the given url is considered a special URL for new tabs.
+  */
+ function isBlankPageURL(aURL) {
+   return aURL == "about:blank" || aURL == BROWSER_NEW_TAB_URL;
+ }
+ 
+-function getBrowserURL() {
+-  return "chrome://browser/content/browser.xul";
+-}
+-
+ function getTopWin(skipPopups) {
+   // If this is called in a browser window, use that window regardless of
+   // whether it's the frontmost window, since commands can be executed in
+   // background windows (bug 626148).
+   if (top.document.documentElement.getAttribute("windowtype") == "navigator:browser" &&
+       (!skipPopups || top.toolbar.visible))
+     return top;
+ 
+@@ -358,17 +354,17 @@ function openLinkIn(url, where, params) 
+               sourceTabBrowser,
+               sourceFrameOuterWindowID: params.frameOuterWindowID,
+             },
+           }, "webNavigation-createdNavigationTarget");
+         }
+       };
+       Services.obs.addObserver(delayedStartupObserver, "browser-delayed-startup-finished");
+     }
+-    win = Services.ww.openWindow(sourceWindow, getBrowserURL(), null, features, sa);
++    win = Services.ww.openWindow(sourceWindow, AppConstants.BROWSER_CHROME_URL, null, features, sa);
+     return;
+   }
+ 
+   // We're now committed to loading the link in an existing browser window.
+ 
+   // Raise the target window before loading the URI, since loading it may
+   // result in a new frontmost window (e.g. "javascript:window.open('');").
+   w.focus();
+@@ -778,17 +774,17 @@ function openPreferences(paneID, extraAr
+   if (!win) {
+     let windowArguments = Cc["@mozilla.org/array;1"]
+                             .createInstance(Ci.nsIMutableArray);
+     let supportsStringPrefURL = Cc["@mozilla.org/supports-string;1"]
+                                   .createInstance(Ci.nsISupportsString);
+     supportsStringPrefURL.data = preferencesURL;
+     windowArguments.appendElement(supportsStringPrefURL);
+ 
+-    win = Services.ww.openWindow(null, Services.prefs.getCharPref("browser.chromeURL"),
++    win = Services.ww.openWindow(null, AppConstants.BROWSER_CHROME_URL,
+                                  "_blank", "chrome,dialog=no,all", windowArguments);
+   } else {
+     let shouldReplaceFragment = friendlyCategoryName ? "whenComparingAndReplace" : "whenComparing";
+     newLoad = !win.switchToTabHavingURI(preferencesURL, true, {
+       ignoreFragment: shouldReplaceFragment,
+       replaceQueryString: true,
+       triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
+     });
+diff --git a/browser/components/customizableui/CustomizableUI.jsm b/browser/components/customizableui/CustomizableUI.jsm
+--- a/browser/components/customizableui/CustomizableUI.jsm
++++ b/browser/components/customizableui/CustomizableUI.jsm
+@@ -40,17 +40,17 @@ const kSpecialWidgetPfx = "customizableu
+ 
+ const kPrefCustomizationState        = "browser.uiCustomization.state";
+ const kPrefCustomizationAutoAdd      = "browser.uiCustomization.autoAdd";
+ const kPrefCustomizationDebug        = "browser.uiCustomization.debug";
+ const kPrefDrawInTitlebar            = "browser.tabs.drawInTitlebar";
+ const kPrefUIDensity                 = "browser.uidensity";
+ const kPrefAutoTouchMode             = "browser.touchmode.auto";
+ 
+-const kExpectedWindowURL = "chrome://browser/content/browser.xul";
++const kExpectedWindowURL = AppConstants.BROWSER_CHROME_URL;
+ 
+ /**
+  * The keys are the handlers that are fired when the event type (the value)
+  * is fired on the subview. A widget that provides a subview has the option
+  * of providing onViewShowing and onViewHiding event handlers.
+  */
+ const kSubviewEvents = [
+   "ViewShowing",
+diff --git a/browser/components/customizableui/test/browser_947914_button_newPrivateWindow.js b/browser/components/customizableui/test/browser_947914_button_newPrivateWindow.js
+--- a/browser/components/customizableui/test/browser_947914_button_newPrivateWindow.js
++++ b/browser/components/customizableui/test/browser_947914_button_newPrivateWindow.js
+@@ -14,17 +14,17 @@ add_task(async function() {
+   let windowWasHandled = false;
+   let privateWindow = null;
+ 
+   let observerWindowOpened = {
+     observe(aSubject, aTopic, aData) {
+       if (aTopic == "domwindowopened") {
+         privateWindow = aSubject.QueryInterface(Ci.nsIDOMWindow);
+         privateWindow.addEventListener("load", function() {
+-          is(privateWindow.location.href, "chrome://browser/content/browser.xul",
++          is(privateWindow.location.href, AppConstants.BROWSER_CHROME_URL,
+              "A new browser window was opened");
+           ok(PrivateBrowsingUtils.isWindowPrivate(privateWindow), "Window is private");
+           windowWasHandled = true;
+         }, {once: true});
+       }
+     }
+   };
+ 
+diff --git a/browser/components/customizableui/test/browser_947914_button_newWindow.js b/browser/components/customizableui/test/browser_947914_button_newWindow.js
+--- a/browser/components/customizableui/test/browser_947914_button_newWindow.js
++++ b/browser/components/customizableui/test/browser_947914_button_newWindow.js
+@@ -13,17 +13,17 @@ add_task(async function() {
+   let windowWasHandled = false;
+   let newWindow = null;
+ 
+   let observerWindowOpened = {
+     observe(aSubject, aTopic, aData) {
+       if (aTopic == "domwindowopened") {
+         newWindow = aSubject.QueryInterface(Ci.nsIDOMWindow);
+         newWindow.addEventListener("load", function() {
+-          is(newWindow.location.href, "chrome://browser/content/browser.xul",
++          is(newWindow.location.href, AppConstants.BROWSER_CHROME_URL,
+              "A new browser window was opened");
+           ok(!PrivateBrowsingUtils.isWindowPrivate(newWindow), "Window is not private");
+           windowWasHandled = true;
+         }, {once: true});
+       }
+     }
+   };
+ 
+diff --git a/browser/components/distribution.js b/browser/components/distribution.js
+--- a/browser/components/distribution.js
++++ b/browser/components/distribution.js
+@@ -432,17 +432,17 @@ DistributionCustomizer.prototype = {
+         } catch (e) { /* ignore bad prefs and move on */ }
+       }
+     }
+ 
+     return this._checkCustomizationComplete();
+   },
+ 
+   _checkCustomizationComplete: function DIST__checkCustomizationComplete() {
+-    const BROWSER_DOCURL = "chrome://browser/content/browser.xul";
++    const BROWSER_DOCURL = AppConstants.BROWSER_CHROME_URL;
+ 
+     if (this._newProfile) {
+       let xulStore = Services.xulStore;
+ 
+       try {
+         var showPersonalToolbar = Services.prefs.getBoolPref("browser.showPersonalToolbar");
+         if (showPersonalToolbar) {
+           xulStore.setValue(BROWSER_DOCURL, "PersonalToolbar", "collapsed", "false");
+diff --git a/browser/components/enterprisepolicies/Policies.jsm.1476333-2.later b/browser/components/enterprisepolicies/Policies.jsm.1476333-2.later
+new file mode 100644
+--- /dev/null
++++ b/browser/components/enterprisepolicies/Policies.jsm.1476333-2.later
+@@ -0,0 +1,54 @@
++--- Policies.jsm
+++++ Policies.jsm
++@@ -1,30 +1,31 @@
++ /* This Source Code Form is subject to the terms of the Mozilla Public
++  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
++  * You can obtain one at http://mozilla.org/MPL/2.0/. */
++ 
++ "use strict";
++ 
++ ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
++ ChromeUtils.import("resource://gre/modules/Services.jsm");
+++ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
++ XPCOMUtils.defineLazyServiceGetter(this, "gXulStore",
++                                    "@mozilla.org/xul/xulstore;1",
++                                    "nsIXULStore");
++ 
++ XPCOMUtils.defineLazyModuleGetters(this, {
++   AddonManager: "resource://gre/modules/AddonManager.jsm",
++   BookmarksPolicies: "resource:///modules/policies/BookmarksPolicies.jsm",
++   CustomizableUI: "resource:///modules/CustomizableUI.jsm",
++   ProxyPolicies: "resource:///modules/policies/ProxyPolicies.jsm",
++   WebsiteFilter: "resource:///modules/policies/WebsiteFilter.jsm",
++ });
++ 
++ const PREF_LOGLEVEL           = "browser.policies.loglevel";
++-const BROWSER_DOCUMENT_URL    = "chrome://browser/content/browser.xul";
+++const BROWSER_DOCUMENT_URL    = AppConstants.BROWSER_CHROME_URL;
++ 
++ XPCOMUtils.defineLazyGetter(this, "log", () => {
++   let { ConsoleAPI } = ChromeUtils.import("resource://gre/modules/Console.jsm", {});
++   return new ConsoleAPI({
++     prefix: "Policies.jsm",
++     // tip: set maxLogLevel to "debug" and use log.debug() to create detailed
++     // messages during development. See LOG_LEVELS in Console.jsm for details.
++     maxLogLevel: "error",
++@@ -953,17 +954,17 @@ function blockAboutPage(manager, feature
++ }
++ 
++ let ChromeURLBlockPolicy = {
++   shouldLoad(contentLocation, loadInfo, mimeTypeGuess) {
++     let contentType = loadInfo.externalContentPolicyType;
++     if (contentLocation.scheme == "chrome" &&
++         contentType == Ci.nsIContentPolicy.TYPE_DOCUMENT &&
++         loadInfo.loadingContext &&
++-        loadInfo.loadingContext.baseURI == "chrome://browser/content/browser.xul" &&
+++        loadInfo.loadingContext.baseURI == AppConstants.BROWSER_CHROME_URL &&
++         contentLocation.host != "mochitests") {
++       return Ci.nsIContentPolicy.REJECT_REQUEST;
++     }
++     return Ci.nsIContentPolicy.ACCEPT;
++   },
++   shouldProcess(contentLocation, loadInfo, mimeTypeGuess) {
++     return Ci.nsIContentPolicy.ACCEPT;
++   },
+diff --git a/browser/components/extensions/ext-windows.js b/browser/components/extensions/ext-windows.js
+--- a/browser/components/extensions/ext-windows.js
++++ b/browser/components/extensions/ext-windows.js
+@@ -155,17 +155,17 @@ this.windows = class extends ExtensionAP
+             }
+           }
+ 
+           let {allowScriptsToClose, url} = createData;
+           if (allowScriptsToClose === null) {
+             allowScriptsToClose = typeof url === "string" && url.startsWith("moz-extension://");
+           }
+ 
+-          let window = Services.ww.openWindow(null, "chrome://browser/content/browser.xul", "_blank",
++          let window = Services.ww.openWindow(null, AppConstants.BROWSER_CHROME_URL, "_blank",
+                                               features.join(","), args);
+ 
+           let win = windowManager.getWrapper(window);
+           win.updateGeometry(createData);
+ 
+           // TODO: focused, type
+ 
+           return new Promise(resolve => {
+diff --git a/browser/components/extensions/test/browser/browser_ext_windows.js b/browser/components/extensions/test/browser/browser_ext_windows.js
+--- a/browser/components/extensions/test/browser/browser_ext_windows.js
++++ b/browser/components/extensions/test/browser/browser_ext_windows.js
+@@ -1,15 +1,15 @@
+ /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set sts=2 sw=2 et tw=80: */
+ "use strict";
+ 
+ add_task(async function testWindowGetAll() {
+   let raisedWin = Services.ww.openWindow(
+-    null, Services.prefs.getCharPref("browser.chromeURL"), "_blank",
++    null, AppConstants.BROWSER_CHROME_URL, "_blank",
+     "chrome,dialog=no,all,alwaysRaised", null);
+ 
+   await TestUtils.topicObserved("browser-delayed-startup-finished",
+                                 subject => subject == raisedWin);
+ 
+   let extension = ExtensionTestUtils.loadExtension({
+     background: function() {
+       browser.windows.getAll((wins) => {
+diff --git a/browser/components/migration/tests/marionette/test_refresh_firefox.py b/browser/components/migration/tests/marionette/test_refresh_firefox.py
+--- a/browser/components/migration/tests/marionette/test_refresh_firefox.py
++++ b/browser/components/migration/tests/marionette/test_refresh_firefox.py
+@@ -201,17 +201,17 @@ class TestFirefoxRefresh(MarionetteTestC
+           let url = arguments[0];
+           let bookmarkIds = PlacesUtils.bookmarks.getBookmarkIdsForURI(makeURI(url), {}, {});
+           return bookmarkIds.length == 1 ? PlacesUtils.bookmarks.getItemTitle(bookmarkIds[0]) : "";
+         """, script_args=(self._bookmarkURL,))
+         self.assertEqual(titleInBookmarks, self._bookmarkText)
+ 
+     def checkBookmarkToolbarVisibility(self):
+         toolbarVisible = self.marionette.execute_script("""
+-          const BROWSER_DOCURL = "chrome://browser/content/browser.xul";
++          const BROWSER_DOCURL = AppConstants.BROWSER_CHROME_URL;
+           return Services.xulStore.getValue(BROWSER_DOCURL, "PersonalToolbar", "collapsed");
+         """)
+         self.assertEqual(toolbarVisible, "false")
+ 
+     def checkHistory(self):
+         historyResult = self.runAsyncCode("""
+           PlacesUtils.history.fetch(arguments[0]).then(pageInfo => {
+             if (!pageInfo) {
+diff --git a/browser/components/nsBrowserContentHandler.js b/browser/components/nsBrowserContentHandler.js
+--- a/browser/components/nsBrowserContentHandler.js
++++ b/browser/components/nsBrowserContentHandler.js
+@@ -268,17 +268,17 @@ nsBrowserContentHandler.prototype = {
+ 
+   mChromeURL: null,
+ 
+   get chromeURL() {
+     if (this.mChromeURL) {
+       return this.mChromeURL;
+     }
+ 
+-    this.mChromeURL = Services.prefs.getCharPref("browser.chromeURL");
++    this.mChromeURL = AppConstants.BROWSER_CHROME_URL;
+ 
+     return this.mChromeURL;
+   },
+ 
+   /* nsISupports */
+   QueryInterface: XPCOMUtils.generateQI([Ci.nsICommandLineHandler,
+                                          Ci.nsIBrowserHandler,
+                                          Ci.nsIContentHandler,
+diff --git a/browser/components/nsBrowserContentHandler.js.1476333-2.later b/browser/components/nsBrowserContentHandler.js.1476333-2.later
+new file mode 100644
+--- /dev/null
++++ b/browser/components/nsBrowserContentHandler.js.1476333-2.later
+@@ -0,0 +1,21 @@
++--- nsBrowserContentHandler.js
+++++ nsBrowserContentHandler.js
++@@ -171,17 +171,17 @@ function getPostUpdateOverridePage(defau
++  * @param postData (optional)
++  *        An nsIInputStream object to use as POST data when loading the provided
++  *        url, or null.
++  * @param forcePrivate (optional)
++  *        Boolean. If set to true, the new window will be a private browsing one.
++  */
++ function openBrowserWindow(cmdLine, urlOrUrlList, postData = null,
++                            forcePrivate = false) {
++-  let chromeURL = Services.prefs.getCharPref("browser.chromeURL");
+++  let chromeURL = AppConstants.BROWSER_CHROME_URL;
++ 
++   let args;
++   if (!urlOrUrlList) {
++     // Just pass in the defaultArgs directly
++     args = [gBrowserContentHandler.defaultArgs];
++   } else if (Array.isArray(urlOrUrlList)) {
++     // Passing an nsIArray for the url disables the "|"-splitting behavior.
++     let uriArray = Cc["@mozilla.org/array;1"]
+diff --git a/browser/components/nsBrowserGlue.js b/browser/components/nsBrowserGlue.js
+--- a/browser/components/nsBrowserGlue.js
++++ b/browser/components/nsBrowserGlue.js
+@@ -1644,17 +1644,17 @@ BrowserGlue.prototype = {
+   /**
+    * Uncollapses PersonalToolbar if its collapsed status is not
+    * persisted, and user customized it or changed default bookmarks.
+    *
+    * If the user does not have a persisted value for the toolbar's
+    * "collapsed" attribute, try to determine whether it's customized.
+    */
+   _maybeToggleBookmarkToolbarVisibility() {
+-    const BROWSER_DOCURL = "chrome://browser/content/browser.xul";
++    const BROWSER_DOCURL = AppConstants.BROWSER_CHROME_URL;
+     const NUM_TOOLBAR_BOOKMARKS_TO_UNHIDE = 3;
+     let xulStore = Services.xulStore;
+ 
+     if (!xulStore.hasValue(BROWSER_DOCURL, "PersonalToolbar", "collapsed")) {
+       // We consider the toolbar customized if it has more than NUM_TOOLBAR_BOOKMARKS_TO_UNHIDE
+       // children, or if it has a persisted currentset value.
+       let toolbarIsCustomized = xulStore.hasValue(BROWSER_DOCURL, "PersonalToolbar", "currentset");
+       let getToolbarFolderCount = () => {
+@@ -1668,17 +1668,17 @@ BrowserGlue.prototype = {
+         xulStore.setValue(BROWSER_DOCURL, "PersonalToolbar", "collapsed", "false");
+       }
+     }
+   },
+ 
+   // eslint-disable-next-line complexity
+   _migrateUI: function BG__migrateUI() {
+     const UI_VERSION = 57;
+-    const BROWSER_DOCURL = "chrome://browser/content/browser.xul";
++    const BROWSER_DOCURL = AppConstants.BROWSER_CHROME_URL;
+ 
+     let currentUIVersion;
+     if (Services.prefs.prefHasUserValue("browser.migration.version")) {
+       currentUIVersion = Services.prefs.getIntPref("browser.migration.version");
+     } else {
+       // This is a new profile, nothing to migrate.
+       Services.prefs.setIntPref("browser.migration.version", UI_VERSION);
+ 
+@@ -2245,17 +2245,17 @@ BrowserGlue.prototype = {
+     let chromeWindow = RecentWindow.getMostRecentBrowserWindow();
+     chromeWindow.openPreferences(...args);
+   },
+ 
+   _openURLInNewWindow(url) {
+     let urlString = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
+     urlString.data = url;
+     return new Promise(resolve => {
+-      let win = Services.ww.openWindow(null, Services.prefs.getCharPref("browser.chromeURL"),
++      let win = Services.ww.openWindow(null, AppConstants.BROWSER_CHROME_URL,
+                                        "_blank", "chrome,all,dialog=no", urlString);
+       win.addEventListener("load", () => { resolve(win); }, {once: true});
+     });
+   },
+ 
+   /**
+    * Called as an observer when Sync's "display URIs" notification is fired.
+    *
+diff --git a/browser/components/nsBrowserGlue.js.1476333-2.later b/browser/components/nsBrowserGlue.js.1476333-2.later
+new file mode 100644
+--- /dev/null
++++ b/browser/components/nsBrowserGlue.js.1476333-2.later
+@@ -0,0 +1,21 @@
++--- nsBrowserGlue.js
+++++ nsBrowserGlue.js
++@@ -9,17 +9,17 @@ ChromeUtils.import("resource://gre/modul
++ ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
++ 
++ (function earlyBlankFirstPaint() {
++   if (!Services.prefs.getBoolPref("browser.startup.blankWindow", false))
++     return;
++ 
++   let store = Services.xulStore;
++   let getValue = attr =>
++-    store.getValue("chrome://browser/content/browser.xul", "main-window", attr);
+++    store.getValue(AppConstants.BROWSER_CHROME_URL, "main-window", attr);
++   let width = getValue("width");
++   let height = getValue("height");
++ 
++   // The clean profile case isn't handled yet. Return early for now.
++   if (!width || !height)
++     return;
++ 
++   let screenX = getValue("screenX");
+diff --git a/browser/components/places/PlacesUIUtils.jsm b/browser/components/places/PlacesUIUtils.jsm
+--- a/browser/components/places/PlacesUIUtils.jsm
++++ b/browser/components/places/PlacesUIUtils.jsm
+@@ -979,17 +979,17 @@ var PlacesUIUtils = {
+                 browserWindow.whereToOpenLink(aEvent, false, true) : "window";
+     if (where == "window") {
+       // There is no browser window open, thus open a new one.
+       var uriList = PlacesUtils.toISupportsString(urls.join("|"));
+       var args = Cc["@mozilla.org/array;1"].
+                   createInstance(Ci.nsIMutableArray);
+       args.appendElement(uriList);
+       browserWindow = Services.ww.openWindow(aWindow,
+-                                             "chrome://browser/content/browser.xul",
++                                             AppConstants.BROWSER_CHROME_URL,
+                                              null, "chrome,dialog=no,all", args);
+       return;
+     }
+ 
+     var loadInBackground = where == "tabshifted";
+     // For consistency, we want all the bookmarks to open in new tabs, instead
+     // of having one of them replace the currently focused tab.  Hence we call
+     // loadTabs with aReplace set to false.
+diff --git a/browser/components/sessionstore/SessionStore.jsm b/browser/components/sessionstore/SessionStore.jsm
+--- a/browser/components/sessionstore/SessionStore.jsm
++++ b/browser/components/sessionstore/SessionStore.jsm
+@@ -4155,17 +4155,17 @@ var SessionStoreInternal = {
+         features += "," + aFeature + "=" + winState[aFeature];
+     });
+ 
+     if (winState.isPrivate) {
+       features += ",private";
+     }
+ 
+     var window =
+-      Services.ww.openWindow(null, this._prefBranch.getCharPref("chromeURL"),
++      Services.ww.openWindow(null, AppConstants.BROWSER_CHROME_URL,
+                              "_blank", features, argString);
+ 
+     do {
+       var ID = "window" + Math.random();
+     } while (ID in this._statesToRestore);
+     this._statesToRestore[(window.__SS_restoreID = ID)] = aState;
+ 
+     return window;
+diff --git a/browser/components/sessionstore/test/browser_394759_behavior.js b/browser/components/sessionstore/test/browser_394759_behavior.js
+--- a/browser/components/sessionstore/test/browser_394759_behavior.js
++++ b/browser/components/sessionstore/test/browser_394759_behavior.js
+@@ -22,17 +22,17 @@
+ function testWindows(windowsToOpen, expectedResults) {
+   return (async function() {
+     for (let winData of windowsToOpen) {
+       let features = "chrome,dialog=no," +
+                      (winData.isPopup ? "all=no" : "all");
+       let url = "http://example.com/?window=" + windowsToOpen.length;
+ 
+       let openWindowPromise = BrowserTestUtils.waitForNewWindow(true, url);
+-      openDialog(getBrowserURL(), "", features, url);
++      openDialog(AppConstants.BROWSER_CHROME_URL, "", features, url);
+       let win = await openWindowPromise;
+       await BrowserTestUtils.closeWindow(win);
+     }
+ 
+     let closedWindowData = JSON.parse(ss.getClosedWindowData());
+     let numPopups = closedWindowData.filter(function(el, i, arr) {
+       return el.isPopup;
+     }).length;
+diff --git a/browser/components/sessionstore/test/browser_580512.js b/browser/components/sessionstore/test/browser_580512.js
+--- a/browser/components/sessionstore/test/browser_580512.js
++++ b/browser/components/sessionstore/test/browser_580512.js
+@@ -47,17 +47,17 @@ function checkSecondWin(win) {
+     finish();
+   });
+ }
+ 
+ function openWinWithCb(cb, argURIs, expectedURIs) {
+   if (!expectedURIs)
+     expectedURIs = argURIs;
+ 
+-  var win = openDialog(getBrowserURL(), "_blank",
++  var win = openDialog(AppConstants.BROWSER_CHROME_URL, "_blank",
+                        "chrome,all,dialog=no", argURIs.join("|"));
+ 
+   win.addEventListener("load", function() {
+     info("the window loaded");
+ 
+     var expectedLoads = expectedURIs.length;
+ 
+     win.gBrowser.addTabsProgressListener({
+diff --git a/browser/components/sessionstore/test/browser_588426.js b/browser/components/sessionstore/test/browser_588426.js
+--- a/browser/components/sessionstore/test/browser_588426.js
++++ b/browser/components/sessionstore/test/browser_588426.js
+@@ -19,17 +19,17 @@ function test() {
+     is(tab.linkedBrowser.currentURI.spec, "about:mozilla", "visible tab is about:mozilla");
+ 
+     finish();
+   });
+ }
+ 
+ function newWindowWithState(state, callback) {
+   let opts = "chrome,all,dialog=no,height=800,width=800";
+-  let win = window.openDialog(getBrowserURL(), "_blank", opts);
++  let win = window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", opts);
+ 
+   win.addEventListener("load", function() {
+     executeSoon(function() {
+       win.addEventListener("SSWindowStateReady", function() {
+         promiseTabRestored(win.gBrowser.tabs[0]).then(() => callback(win));
+       }, {once: true});
+ 
+       ss.setWindowState(win, JSON.stringify(state), true);
+diff --git a/browser/components/sessionstore/test/browser_590563.js b/browser/components/sessionstore/test/browser_590563.js
+--- a/browser/components/sessionstore/test/browser_590563.js
++++ b/browser/components/sessionstore/test/browser_590563.js
+@@ -48,17 +48,17 @@ function middleClickTest(win) {
+   is(win.gBrowser.tabs.length, 3,
+      "The total number of tabs should be 3 after restoring 2 tabs by middle click.");
+   is(win.gBrowser.visibleTabs.length, 3,
+      "The total number of visible tabs should be 3 after restoring 2 tabs by middle click");
+ }
+ 
+ function newWindowWithState(state, callback) {
+   let opts = "chrome,all,dialog=no,height=800,width=800";
+-  let win = window.openDialog(getBrowserURL(), "_blank", opts);
++  let win = window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", opts);
+ 
+   win.addEventListener("load", function() {
+     // The form data will be restored before SSTabRestored, so we want to listen
+     // for that on the currently selected tab
+     let onSSTabRestored = event => {
+       let tab = event.target;
+       if (tab.selected) {
+         win.gBrowser.tabContainer.removeEventListener("SSTabRestored", onSSTabRestored, true);
+diff --git a/browser/components/sessionstore/test/browser_595601-restore_hidden.js b/browser/components/sessionstore/test/browser_595601-restore_hidden.js
+--- a/browser/components/sessionstore/test/browser_595601-restore_hidden.js
++++ b/browser/components/sessionstore/test/browser_595601-restore_hidden.js
+@@ -94,17 +94,17 @@ var TabsProgressListener = {
+ 
+     return [needsRestore, isRestoring];
+   }
+ };
+ 
+ // ----------
+ function newWindowWithState(state, callback) {
+   let opts = "chrome,all,dialog=no,height=800,width=800";
+-  let win = window.openDialog(getBrowserURL(), "_blank", opts);
++  let win = window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", opts);
+ 
+   registerCleanupFunction(() => BrowserTestUtils.closeWindow(win));
+ 
+   whenWindowLoaded(win, function onWindowLoaded(aWin) {
+     TabsProgressListener.init(aWin);
+     TabsProgressListener.setCallback(callback);
+ 
+     ss.setWindowState(aWin, JSON.stringify(state), true);
+diff --git a/browser/components/sessionstore/test/browser_659591.js b/browser/components/sessionstore/test/browser_659591.js
+--- a/browser/components/sessionstore/test/browser_659591.js
++++ b/browser/components/sessionstore/test/browser_659591.js
+@@ -18,14 +18,14 @@ function test() {
+     BrowserTestUtils.closeWindow(win).then(() => {
+       waitForFocus(finish);
+     });
+   });
+ }
+ 
+ function newWindow(callback) {
+   let opts = "chrome,all,dialog=no,height=800,width=800";
+-  let win = window.openDialog(getBrowserURL(), "_blank", opts);
++  let win = window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", opts);
+ 
+   win.addEventListener("load", function() {
+     executeSoon(() => callback(win));
+   }, {once: true});
+ }
+diff --git a/browser/components/sessionstore/test/browser_701377.js b/browser/components/sessionstore/test/browser_701377.js
+--- a/browser/components/sessionstore/test/browser_701377.js
++++ b/browser/components/sessionstore/test/browser_701377.js
+@@ -25,17 +25,17 @@ function test() {
+ 
+     finish();
+   });
+ }
+ 
+ // ----------
+ function newWindowWithState(aState, aCallback) {
+   let opts = "chrome,all,dialog=no,height=800,width=800";
+-  let win = window.openDialog(getBrowserURL(), "_blank", opts);
++  let win = window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", opts);
+ 
+   registerCleanupFunction(() => BrowserTestUtils.closeWindow(win));
+ 
+   whenWindowLoaded(win, function onWindowLoaded(aWin) {
+     ss.setWindowState(aWin, JSON.stringify(aState), true);
+     executeSoon(() => aCallback(aWin));
+   });
+ }
+diff --git a/browser/components/sessionstore/test/head.js b/browser/components/sessionstore/test/head.js
+--- a/browser/components/sessionstore/test/head.js
++++ b/browser/components/sessionstore/test/head.js
+@@ -57,17 +57,17 @@ Cc["@mozilla.org/browser/clh;1"].getServ
+ 
+ function provideWindow(aCallback, aURL, aFeatures) {
+   function callbackSoon(aWindow) {
+     executeSoon(function executeCallbackSoon() {
+       aCallback(aWindow);
+     });
+   }
+ 
+-  let win = openDialog(getBrowserURL(), "", aFeatures || "chrome,all,dialog=no", aURL || "about:blank");
++  let win = openDialog(AppConstants.BROWSER_CHROME_URL, "", aFeatures || "chrome,all,dialog=no", aURL || "about:blank");
+   whenWindowLoaded(win, function onWindowLoaded(aWin) {
+     if (!aURL) {
+       info("Loaded a blank window.");
+       callbackSoon(aWin);
+       return;
+     }
+ 
+     aWin.gBrowser.selectedBrowser.addEventListener("load", function() {
+@@ -428,17 +428,17 @@ function whenNewWindowLoaded(aOptions, a
+   let features = "";
+   let url = "about:blank";
+ 
+   if (aOptions && aOptions.private || false) {
+     features = ",private";
+     url = "about:privatebrowsing";
+   }
+ 
+-  let win = openDialog(getBrowserURL(), "", "chrome,all,dialog=no" + features, url);
++  let win = openDialog(AppConstants.BROWSER_CHROME_URL, "", "chrome,all,dialog=no" + features, url);
+   let delayedStartup = promiseDelayedStartupFinished(win);
+ 
+   let browserLoaded = new Promise(resolve => {
+     if (url == "about:blank") {
+       resolve();
+       return;
+     }
+ 
+diff --git a/browser/components/syncedtabs/TabListComponent.js b/browser/components/syncedtabs/TabListComponent.js
+--- a/browser/components/syncedtabs/TabListComponent.js
++++ b/browser/components/syncedtabs/TabListComponent.js
+@@ -115,17 +115,17 @@ TabListComponent.prototype = {
+     this._window.openUILinkIn(url, where, params);
+   },
+ 
+   onOpenTabs(urls, where) {
+     if (!PlacesUIUtils.confirmOpenInTabs(urls.length, this._window)) {
+       return;
+     }
+     if (where == "window") {
+-      this._window.openDialog(this._window.getBrowserURL(), "_blank",
++      this._window.openDialog(this._window.AppConstants.BROWSER_CHROME_URL, "_blank",
+                               "chrome,dialog=no,all", urls.join("|"));
+     } else {
+       let loadInBackground = where == "tabshifted";
+       this._getChromeWindow(this._window).gBrowser.loadTabs(urls, {
+         inBackground: loadInBackground,
+         replace: false,
+         triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
+       });
+diff --git a/browser/components/syncedtabs/test/xpcshell/test_TabListComponent.js b/browser/components/syncedtabs/test/xpcshell/test_TabListComponent.js
+--- a/browser/components/syncedtabs/test/xpcshell/test_TabListComponent.js
++++ b/browser/components/syncedtabs/test/xpcshell/test_TabListComponent.js
+@@ -82,17 +82,16 @@ add_task(async function testActions() {
+   };
+   let windowMock = {
+     top: {
+       PlacesCommandHook: {
+         bookmarkLink() { return Promise.resolve(); }
+       },
+       PlacesUtils: { bookmarksMenuFolderId: "id" }
+     },
+-    getBrowserURL() {},
+     openDialog() {},
+     openUILinkIn() {}
+   };
+   let component = new TabListComponent({
+     window: windowMock, store, View: null, SyncedTabs,
+     clipboardHelper: clipboardHelperMock,
+     getChromeWindow: getChromeWindowMock });
+ 
+diff --git a/browser/components/tests/browser/browser_default_bookmark_toolbar_visibility.js b/browser/components/tests/browser/browser_default_bookmark_toolbar_visibility.js
+--- a/browser/components/tests/browser/browser_default_bookmark_toolbar_visibility.js
++++ b/browser/components/tests/browser/browser_default_bookmark_toolbar_visibility.js
+@@ -3,16 +3,16 @@
+ 
+ /**
+  * Test _maybeToggleBookmarkToolbarVisibility() code running for new profiles.
+  * Ensure that the bookmarks toolbar is hidden in a default configuration.
+  * If new default bookmarks are added to the toolbar then the threshold of > 3
+  * in NUM_TOOLBAR_BOOKMARKS_TO_UNHIDE may need to be adjusted there.
+  */
+ add_task(async function test_default_bookmark_toolbar_visibility() {
+-  const BROWSER_DOCURL = "chrome://browser/content/browser.xul";
++  const BROWSER_DOCURL = AppConstants.BROWSER_CHROME_URL;
+   let xulStore = Services.xulStore;
+ 
+   is(xulStore.getValue(BROWSER_DOCURL, "PersonalToolbar", "collapsed"), "",
+      "Check that @collapsed isn't persisted");
+   ok(document.getElementById("PersonalToolbar").collapsed,
+      "The bookmarks toolbar should be collapsed by default");
+ });
+diff --git a/browser/modules/ContentWebRTC.jsm b/browser/modules/ContentWebRTC.jsm
+--- a/browser/modules/ContentWebRTC.jsm
++++ b/browser/modules/ContentWebRTC.jsm
+@@ -3,21 +3,22 @@
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+ "use strict";
+ 
+ var EXPORTED_SYMBOLS = [ "ContentWebRTC" ];
+ 
+ ChromeUtils.import("resource://gre/modules/Services.jsm");
+ ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
++ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
+ XPCOMUtils.defineLazyServiceGetter(this, "MediaManagerService",
+                                    "@mozilla.org/mediaManagerService;1",
+                                    "nsIMediaManagerService");
+ 
+-const kBrowserURL = "chrome://browser/content/browser.xul";
++const kBrowserURL = AppConstants.BROWSER_CHROME_URL;
+ 
+ var ContentWebRTC = {
+   // Called only for 'unload' to remove pending gUM prompts in reloaded frames.
+   handleEvent(aEvent) {
+     let contentWindow = aEvent.target.defaultView;
+     let mm = getMessageManagerForWindow(contentWindow);
+     for (let key of contentWindow.pendingGetUserMediaRequests.keys()) {
+       mm.sendAsyncMessage("webrtc:CancelRequest", key);
+diff --git a/browser/modules/Sanitizer.jsm b/browser/modules/Sanitizer.jsm
+--- a/browser/modules/Sanitizer.jsm
++++ b/browser/modules/Sanitizer.jsm
+@@ -699,17 +699,17 @@ var Sanitizer = {
+         let refObj = {};
+         TelemetryStopwatch.start("FX_SANITIZE_OPENWINDOWS", refObj);
+ 
+         // First create a new window. We do this first so that on non-mac, we don't
+         // accidentally close the app by closing all the windows.
+         let handler = Cc["@mozilla.org/browser/clh;1"].getService(Ci.nsIBrowserHandler);
+         let defaultArgs = handler.defaultArgs;
+         let features = "chrome,all,dialog=no," + privateStateForNewWindow;
+-        let newWindow = existingWindow.openDialog("chrome://browser/content/", "_blank",
++        let newWindow = existingWindow.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank",
+                                                   features, defaultArgs);
+ 
+         let onFullScreen = null;
+         if (AppConstants.platform == "macosx") {
+           onFullScreen = function(e) {
+             newWindow.removeEventListener("fullscreen", onFullScreen);
+             let docEl = newWindow.document.documentElement;
+             let sizemode = docEl.getAttribute("sizemode");
+diff --git a/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm b/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm
+--- a/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm
++++ b/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm
+@@ -644,17 +644,17 @@ var BrowserTestUtils = {
+     }
+ 
+     if (options.hasOwnProperty("remote")) {
+       let remoteState = options.remote ? "remote" : "non-remote";
+       features += `,${remoteState}`;
+     }
+ 
+     let win = Services.ww.openWindow(
+-      opener, Services.prefs.getCharPref("browser.chromeURL"), "_blank",
++      opener, AppConstants.BROWSER_CHROME_URL, "_blank",
+       features, argString);
+ 
+     // Wait for browser-delayed-startup-finished notification, it indicates
+     // that the window has loaded completely and is ready to be used for
+     // testing.
+     let startupPromise =
+       TestUtils.topicObserved("browser-delayed-startup-finished",
+                               subject => subject == win).then(() => win);
+diff --git a/toolkit/components/extensions/ext-identity.js b/toolkit/components/extensions/ext-identity.js
+--- a/toolkit/components/extensions/ext-identity.js
++++ b/toolkit/components/extensions/ext-identity.js
+@@ -47,17 +47,17 @@ const checkRedirected = (url, redirectUR
+ const openOAuthWindow = (details, redirectURI) => {
+   let args = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray);
+   let supportsStringPrefURL = Cc["@mozilla.org/supports-string;1"]
+                                 .createInstance(Ci.nsISupportsString);
+   supportsStringPrefURL.data = details.url;
+   args.appendElement(supportsStringPrefURL);
+ 
+   let window = Services.ww.openWindow(null,
+-                                      Services.prefs.getCharPref("browser.chromeURL"),
++                                      AppConstants.BROWSER_CHROME_URL,
+                                       "launchWebAuthFlow_dialog",
+                                       "chrome,location=yes,centerscreen,dialog=no,resizable=yes",
+                                       args);
+ 
+   return new Promise((resolve, reject) => {
+     let wpl;
+ 
+     // If the user just closes the window we need to reject

+ 53 - 0
mozilla-release/patches/1478128-63a1.patch

@@ -0,0 +1,53 @@
+# HG changeset patch
+# User Brian Grinstead <bgrinstead@mozilla.com>
+# Date 1532471118 25200
+# Node ID 21fb558acce345df900991ac8bbb9f1ea7f8ff4d
+# Parent  368b6965078e87e5df4345341f30a6134f3bde38
+Bug 1478128 - Rename `MOZ_BROWSER_CHROME_URL_QUOTED` to `BROWSER_CHROME_URL_QUOTED`;r=gps
+
+MozReview-Commit-ID: G73z0y5A8Re
+
+diff --git a/old-configure.in b/old-configure.in
+--- a/old-configure.in
++++ b/old-configure.in
+@@ -2873,17 +2873,17 @@ AC_SUBST(MAR_CHANNEL_ID)
+ AC_SUBST(ACCEPTED_MAR_CHANNEL_IDS)
+ AC_SUBST(MOZ_PROFILE_MIGRATOR)
+ AC_DEFINE_UNQUOTED(MOZ_APP_UA_NAME, "$MOZ_APP_UA_NAME")
+ AC_SUBST(MOZ_APP_UA_NAME)
+ AC_DEFINE_UNQUOTED(MOZ_APP_UA_VERSION, "$MOZ_APP_VERSION")
+ AC_SUBST(MOZ_APP_VERSION)
+ AC_SUBST(MOZ_APP_VERSION_DISPLAY)
+ AC_DEFINE_UNQUOTED(BROWSER_CHROME_URL, $BROWSER_CHROME_URL)
+-AC_DEFINE_UNQUOTED(MOZ_BROWSER_CHROME_URL_QUOTED, "$BROWSER_CHROME_URL")
++AC_DEFINE_UNQUOTED(BROWSER_CHROME_URL_QUOTED, "$BROWSER_CHROME_URL")
+ 
+ AC_SUBST(MOZ_APP_MAXVERSION)
+ AC_DEFINE_UNQUOTED(FIREFOX_VERSION,$FIREFOX_VERSION)
+ AC_SUBST(FIREFOX_VERSION)
+ AC_SUBST(MOZ_UA_OS_AGNOSTIC)
+ if test -n "$MOZ_UA_OS_AGNOSTIC"; then
+   AC_DEFINE(MOZ_UA_OS_AGNOSTIC)
+ fi
+diff --git a/xpfe/appshell/nsXULWindow.cpp b/xpfe/appshell/nsXULWindow.cpp
+--- a/xpfe/appshell/nsXULWindow.cpp
++++ b/xpfe/appshell/nsXULWindow.cpp
+@@ -1940,17 +1940,17 @@ NS_IMETHODIMP nsXULWindow::CreateNewCont
+ 
+   // We need to create a new top level window and then enter a nested
+   // loop. Eventually the new window will be told that it has loaded,
+   // at which time we know it is safe to spin out of the nested loop
+   // and allow the opening code to proceed.
+ 
+   nsCOMPtr<nsIURI> uri;
+   nsAutoCString urlStr;
+-  urlStr.AssignLiteral(MOZ_BROWSER_CHROME_URL_QUOTED);
++  urlStr.AssignLiteral(BROWSER_CHROME_URL_QUOTED);
+ 
+   nsCOMPtr<nsIIOService> service(do_GetService(NS_IOSERVICE_CONTRACTID));
+   if (service) {
+     service->NewURI(urlStr, nullptr, nullptr, getter_AddRefs(uri));
+   }
+   NS_ENSURE_TRUE(uri, NS_ERROR_FAILURE);
+ 
+   // We need to create a chrome window to contain the content window we're about

+ 69 - 0
mozilla-release/patches/1480004-63a1.patch

@@ -0,0 +1,69 @@
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1533880288 -32400
+# Node ID 783e7599b5c2512066cfcae30cfff438d1ecba58
+# Parent  59c8b66c6f4ec6589fcab297df81e7de7eb121c6
+Bug 1480004 - Normalize optimization level passed to the linker when doing LTO with clang. r=froydnj
+
+diff --git a/js/src/old-configure.in b/js/src/old-configure.in
+--- a/js/src/old-configure.in
++++ b/js/src/old-configure.in
+@@ -1262,16 +1262,27 @@ if test -n "$MOZ_OPTIMIZE"; then
+         [printf("Hello World\n");],
+         _results=yes,
+         _results=no)
+     AC_MSG_RESULT([$_results])
+     if test "$_results" = "no"; then
+         AC_MSG_ERROR([These compiler flags are invalid: $MOZ_OPTIMIZE_FLAGS])
+     fi
+     CFLAGS=$_SAVE_CFLAGS
++    if test -n "$MOZ_LTO" -a -n "$CLANG_CC"; then
++        # When using llvm-based LTO, non numeric optimization levels are
++        # not supported by the linker, so force the linker to use -O2 (
++        # which doesn't influence the level compilation units are actually
++        # compiled at).
++        case " $MOZ_OPTIMIZE_FLAGS " in
++        *\ -Os\ *|*\ -Oz\ *)
++            MOZ_OPTIMIZE_LDFLAGS="$MOZ_OPTIMIZE_LDFLAGS -O2"
++            ;;
++        esac
++    fi
+ fi
+ fi # COMPILE_ENVIRONMENT
+ 
+ AC_SUBST_LIST(MOZ_OPTIMIZE_FLAGS)
+ AC_SUBST_LIST(MOZ_OPTIMIZE_LDFLAGS)
+ AC_SUBST_LIST(MOZ_PGO_OPTIMIZE_FLAGS)
+ 
+ dnl ========================================================
+diff --git a/old-configure.in b/old-configure.in
+--- a/old-configure.in
++++ b/old-configure.in
+@@ -2231,16 +2231,27 @@ if test -n "$MOZ_OPTIMIZE"; then
+         [printf("Hello World\n");],
+         _results=yes,
+         _results=no)
+     AC_MSG_RESULT([$_results])
+     if test "$_results" = "no"; then
+         AC_MSG_ERROR([These compiler flags for C are invalid: $MOZ_OPTIMIZE_FLAGS])
+     fi
+     CFLAGS=$_SAVE_CFLAGS
++    if test -n "$MOZ_LTO" -a -n "$CLANG_CC"; then
++        # When using llvm-based LTO, non numeric optimization levels are
++        # not supported by the linker, so force the linker to use -O2 (
++        # which doesn't influence the level compilation units are actually
++        # compiled at).
++        case " $MOZ_OPTIMIZE_FLAGS " in
++        *\ -Os\ *|*\ -Oz\ *)
++            MOZ_OPTIMIZE_LDFLAGS="$MOZ_OPTIMIZE_LDFLAGS -O2"
++            ;;
++        esac
++    fi
+ fi
+ fi # COMPILE_ENVIRONMENT
+ 
+ AC_SUBST_LIST(MOZ_OPTIMIZE_FLAGS)
+ AC_SUBST_LIST(MOZ_OPTIMIZE_LDFLAGS)
+ AC_SUBST_LIST(MOZ_PGO_OPTIMIZE_FLAGS)
+ 
+ dnl ========================================================

+ 281 - 0
mozilla-release/patches/1484759-63a1.patch

@@ -0,0 +1,281 @@
+# HG changeset patch
+# User Brian Grinstead <bgrinstead@mozilla.com>
+# Date 1534865606 0
+# Node ID 6003a205d723d0d6c9f47a651c1c80483abba8f4
+# Parent  8ee8520351d4eadd46a92f3116593b67640d1472
+Bug 1484759 - Update references to browser.xul in tests to use AppConstants.BROWSER_CHROME_URL;r=Gijs
+
+This only includes functions that seem to be using it to reference a window.
+There are other instances where it's used as a generic chrome URI, and those
+are left unchanged.
+
+Differential Revision: https://phabricator.services.mozilla.com/D3806
+
+diff --git a/dom/base/test/test_openDialogChromeOnly.html b/dom/base/test/test_openDialogChromeOnly.html
+--- a/dom/base/test/test_openDialogChromeOnly.html
++++ b/dom/base/test/test_openDialogChromeOnly.html
+@@ -8,17 +8,17 @@ https://bugzilla.mozilla.org/show_bug.cg
+   <title>Test for Bug 931768</title>
+   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+   <script type="application/javascript">
+ 
+   /** Test for Bug 931768 **/
+ 
+   try {
+-    openDialog("chrome://browser/content/browser.xul");
++    openDialog(AppConstants.BROWSER_CHROME_URL);
+     ok(false, "Calling openDialog from unprivileged script should throw.");
+   } catch (e) {
+     ok(e instanceof ReferenceError,
+        "openDialog shouldn't be available to unprivileged script.");
+   }
+ </script>
+ </body>
+ 
+diff --git a/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm.1484759.later b/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm.1484759.later
+new file mode 100644
+--- /dev/null
++++ b/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm.1484759.later
+@@ -0,0 +1,21 @@
++--- BrowserTestUtils.jsm
+++++ BrowserTestUtils.jsm
++@@ -572,17 +572,17 @@ var BrowserTestUtils = {
++ 
++         if (!anyWindow) {
++           Services.ww.unregisterNotification(observe);
++         }
++ 
++         if (url) {
++           await this.waitForEvent(win, "DOMContentLoaded");
++ 
++-          if (win.document.documentURI != "chrome://browser/content/browser.xul") {
+++          if (win.document.documentURI != AppConstants.BROWSER_CHROME_URL) {
++             return;
++           }
++         }
++ 
++         let promises = [
++           TestUtils.topicObserved("browser-delayed-startup-finished",
++                                   subject => subject == win),
++         ];
+diff --git a/testing/mochitest/api.js.1484759.later b/testing/mochitest/api.js.1484759.later
+new file mode 100644
+--- /dev/null
++++ b/testing/mochitest/api.js.1484759.later
+@@ -0,0 +1,21 @@
++--- api.js
+++++ api.js
++@@ -27,17 +27,17 @@ const windowTracker = {
++   async observe(window, topic, data) {
++     if (topic === "chrome-document-global-created") {
++       await new Promise(resolve =>
++         window.addEventListener("DOMContentLoaded", resolve, {once: true}));
++ 
++       let {document} = window;
++       let {documentURI} = document;
++ 
++-      if (documentURI !== "chrome://browser/content/browser.xul") {
+++      if (documentURI !== AppConstants.BROWSER_CHROME_URL) {
++         return;
++       }
++       loadChromeScripts(window);
++     }
++   },
++ };
++ 
++ function androidStartup() {
+diff --git a/testing/mochitest/browser-test.js.1484759.later b/testing/mochitest/browser-test.js.1484759.later
+new file mode 100644
+--- /dev/null
++++ b/testing/mochitest/browser-test.js.1484759.later
+@@ -0,0 +1,21 @@
++--- browser-test.js
+++++ browser-test.js
++@@ -360,17 +360,17 @@ function takeInstrumentation() {
++   gSaveInstrumentationData = saveData;
++ 
++   Services.ww.registerNotification((win, topic, data) => {
++     if (topic != "domwindowopened") {
++       return;
++     }
++ 
++     win.addEventListener("load", () => {
++-      if (win.location.href != "chrome://browser/content/browser.xul") {
+++      if (win.location.href != AppConstants.BROWSER_CHROME_URL) {
++         return;
++       }
++ 
++       scanWindow(win);
++       observeWindow(win);
++     }, { once: true });
++   });
++ }
+diff --git a/testing/talos/talos/bootstrap.js.1484759.later b/testing/talos/talos/bootstrap.js.1484759.later
+new file mode 100644
+--- /dev/null
++++ b/testing/talos/talos/bootstrap.js.1484759.later
+@@ -0,0 +1,38 @@
++--- bootstrap.js
+++++ bootstrap.js
++@@ -6,33 +6,34 @@
++ //
++ // The canonical version of this file lives in testing/talos/talos, and
++ // is duplicated in a number of test add-ons in directories below it.
++ // Please do not update one withput updating all.
++ 
++ // Reads the chrome.manifest from a legacy non-restartless extension and loads
++ // its overlays into the appropriate top-level windows.
++ 
+++ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
++ ChromeUtils.import("resource://gre/modules/NetUtil.jsm");
++ ChromeUtils.import("resource://gre/modules/Services.jsm");
++ 
++ const windowTracker = {
++   init() {
++     Services.ww.registerNotification(this);
++   },
++ 
++   async observe(window, topic, data) {
++     if (topic === "domwindowopened") {
++       await new Promise(resolve =>
++         window.addEventListener("DOMWindowCreated", resolve, {once: true}));
++ 
++       let {document} = window;
++       let {documentURI} = document;
++ 
++-      if (documentURI !== "chrome://browser/content/browser.xul") {
+++      if (documentURI !== AppConstants.BROWSER_CHROME_URL) {
++         return;
++       }
++       initializeBrowser(window);
++     }
++   },
++ };
++ 
++ function readSync(uri) {
+diff --git a/testing/talos/talos/pageloader/chrome/pageloader.js b/testing/talos/talos/pageloader/chrome/pageloader.js
+--- a/testing/talos/talos/pageloader/chrome/pageloader.js
++++ b/testing/talos/talos/pageloader/chrome/pageloader.js
+@@ -2,16 +2,17 @@
+  * License, v. 2.0. If a copy of the MPL was not distributed with this
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+ /* import-globals-from memory.js */
+ /* import-globals-from report.js */
+ /* eslint mozilla/avoid-Date-timing: "off" */
+ 
+ ChromeUtils.import("resource://gre/modules/Services.jsm");
++ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
+ ChromeUtils.import("resource:///modules/E10SUtils.jsm");
+ 
+ var NUM_CYCLES = 5;
+ var numPageCycles = 1;
+ 
+ var numRetries = 0;
+ var maxRetries = 3;
+ 
+@@ -202,17 +203,17 @@ function plInit() {
+       .createInstance(Ci.nsISupportsString);
+     blank.data = "about:blank";
+ 
+     let toolbars = "all";
+     if (!args.useBrowserChrome) {
+       toolbars = "titlebar,resizable";
+     }
+ 
+-    browserWindow = Services.ww.openWindow(null, "chrome://browser/content/", "_blank",
++    browserWindow = Services.ww.openWindow(null, AppConstants.BROWSER_CHROME_URL, "_blank",
+        `chrome,${toolbars},dialog=no,width=${winWidth},height=${winHeight}`, blank);
+ 
+     gPaintWindow = browserWindow;
+     // get our window out of the way
+     window.resizeTo(10, 10);
+ 
+     var browserLoadFunc = function(ev) {
+       browserWindow.removeEventListener("load", browserLoadFunc, true);
+diff --git a/testing/talos/talos/tests/devtools/addon/bootstrap.js.1484759.later b/testing/talos/talos/tests/devtools/addon/bootstrap.js.1484759.later
+new file mode 100644
+--- /dev/null
++++ b/testing/talos/talos/tests/devtools/addon/bootstrap.js.1484759.later
+@@ -0,0 +1,37 @@
++--- bootstrap.js
+++++ bootstrap.js
++@@ -6,32 +6,33 @@
++ //
++ // The canonical version of this file lives in testing/talos/talos, and
++ // is duplicated in a number of test add-ons in directories below it.
++ // Please do not update one withput updating all.
++ 
++ // Reads the chrome.manifest from a legacy non-restartless extension and loads
++ // its overlays into the appropriate top-level windows.
++ 
+++ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
++ ChromeUtils.import("resource://gre/modules/Services.jsm");
++ 
++ const windowTracker = {
++   init() {
++     Services.ww.registerNotification(this);
++   },
++ 
++   async observe(window, topic, data) {
++     if (topic === "domwindowopened") {
++       await new Promise(resolve =>
++         window.addEventListener("DOMWindowCreated", resolve, {once: true}));
++ 
++       let {document} = window;
++       let {documentURI} = document;
++ 
++-      if (documentURI !== "chrome://browser/content/browser.xul") {
+++      if (documentURI !== AppConstants.BROWSER_CHROME_URL) {
++         return;
++       }
++       initializeBrowser(window);
++     }
++   },
++ };
++ 
++ function startup(data, reason) {
+diff --git a/testing/talos/talos/tests/tart/addon/bootstrap.js.1484759.later b/testing/talos/talos/tests/tart/addon/bootstrap.js.1484759.later
+new file mode 100644
+--- /dev/null
++++ b/testing/talos/talos/tests/tart/addon/bootstrap.js.1484759.later
+@@ -0,0 +1,38 @@
++--- bootstrap.js
+++++ bootstrap.js
++@@ -6,33 +6,34 @@
++ //
++ // The canonical version of this file lives in testing/talos/talos, and
++ // is duplicated in a number of test add-ons in directories below it.
++ // Please do not update one withput updating all.
++ 
++ // Reads the chrome.manifest from a legacy non-restartless extension and loads
++ // its overlays into the appropriate top-level windows.
++ 
+++ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
++ ChromeUtils.import("resource://gre/modules/NetUtil.jsm");
++ ChromeUtils.import("resource://gre/modules/Services.jsm");
++ 
++ const windowTracker = {
++   init() {
++     Services.ww.registerNotification(this);
++   },
++ 
++   async observe(window, topic, data) {
++     if (topic === "domwindowopened") {
++       await new Promise(resolve =>
++         window.addEventListener("DOMWindowCreated", resolve, {once: true}));
++ 
++       let {document} = window;
++       let {documentURI} = document;
++ 
++-      if (documentURI !== "chrome://browser/content/browser.xul") {
+++      if (documentURI !== AppConstants.BROWSER_CHROME_URL) {
++         return;
++       }
++       initializeBrowser(window);
++     }
++   },
++ };
++ 
++ function readSync(uri) {

+ 12 - 0
mozilla-release/patches/series

@@ -7201,3 +7201,15 @@ TOP-1909743-nsstyle-prefers-color-scheme-25320.patch
 TOP-NOBUG-nsstyle-prefers-contrast.patch
 TOP-NOBUG-nsstyle-prefers-contrast.patch
 TOP-NOBUG-nsstyle-prefers-reduced-motion.patch
 TOP-NOBUG-nsstyle-prefers-reduced-motion.patch
 TOP-1909714-NSS3904-11514.patch
 TOP-1909714-NSS3904-11514.patch
+1406662-1only-59a1.patch
+1431477-1-60a1.patch
+1431477-2-60a1.patch
+1433517-60a1.patch
+1446270-61a1.patch
+1447442-12-61a1.patch
+1456552-62a1.patch
+1476333-1-63a1.patch
+1476333-2-63a1.patch
+1478128-63a1.patch
+1480004-63a1.patch
+1484759-63a1.patch