Backed out 4 changesets (bug 1366808) for Windows GPU leakchecks on a CLOSED TREE
authorAndreea Pavel <apavel@mozilla.com>
Tue, 10 Apr 2018 05:11:36 +0300
changeset 779703 5a326d6404a76e6c80e1a74eb7a8eb6b07943fad
parent 779702 a2385811ffdc30f153b8d5853f198c89020bf5ce
child 779704 f344c2aa32c929855c05250e1a58bde0ece1d0b0
push id105836
push userbmo:ato@sny.no
push dateTue, 10 Apr 2018 12:07:22 +0000
bugs1366808
milestone61.0a1
backs out23f60e5acaa2543d623ae4cbe5a12331db1ce93c
bf2262b6aca8650eb733e930e17886e3f3854d0c
1fc82af3a155bcfcb4744a8462b1698f4a19e81c
0649f0d9884b6e6cf126db83589c6c2778df3a88
Backed out 4 changesets (bug 1366808) for Windows GPU leakchecks on a CLOSED TREE Backed out changeset 23f60e5acaa2 (bug 1366808) Backed out changeset bf2262b6aca8 (bug 1366808) Backed out changeset 1fc82af3a155 (bug 1366808) Backed out changeset 0649f0d9884b (bug 1366808)
browser/base/content/aboutRestartRequired.js
browser/base/content/aboutRestartRequired.xhtml
browser/base/content/tabbrowser.js
browser/base/jar.mn
browser/components/about/AboutRedirector.cpp
browser/components/build/nsModule.cpp
browser/locales/en-US/chrome/browser/aboutRestartRequired.dtd
browser/locales/jar.mn
browser/modules/ContentCrashHandlers.jsm
browser/themes/shared/aboutRestartRequired.css
browser/themes/shared/jar.inc.mn
docshell/base/nsDocShell.cpp
dom/ipc/ContentChild.cpp
dom/ipc/ContentChild.h
dom/ipc/ContentParent.cpp
dom/ipc/ContentProcess.cpp
dom/ipc/TabParent.cpp
gfx/ipc/GPUParent.cpp
gfx/ipc/GPUParent.h
gfx/ipc/GPUProcessImpl.cpp
ipc/glue/MessageChannel.cpp
ipc/glue/MessageChannel.h
ipc/glue/ProtocolUtils.h
js/xpconnect/src/xpc.msg
netwerk/base/nsILoadInfo.idl
toolkit/components/telemetry/Histograms.json
toolkit/components/telemetry/histogram-whitelists.json
xpcom/base/ErrorList.py
deleted file mode 100644
--- a/browser/base/content/aboutRestartRequired.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/* 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/. */
-
-/* eslint-env mozilla/frame-script */
-ChromeUtils.import("resource://gre/modules/Services.jsm");
-
-var AboutRestartRequired = {
-  /* Only do autofocus if we're the toplevel frame; otherwise we
-     don't want to call attention to ourselves!  The key part is
-     that autofocus happens on insertion into the tree, so we
-     can remove the button, add @autofocus, and reinsert the
-     button.
-  */
-  addAutofocus() {
-    if (window.top == window) {
-      var button = document.getElementById("restart");
-      var parent = button.parentNode;
-      button.remove();
-      button.setAttribute("autofocus", "true");
-      parent.insertAdjacentElement("afterbegin", button);
-    }
-  },
-  restart() {
-    Services.startup.quit(Ci.nsIAppStartup.eRestart |
-                          Ci.nsIAppStartup.eAttemptQuit);
-  },
-  init() {
-    this.addAutofocus();
-  },
-};
-
-AboutRestartRequired.init();
deleted file mode 100644
--- a/browser/base/content/aboutRestartRequired.xhtml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- 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/. -->
-
-<!DOCTYPE html [
-  <!ENTITY % htmlDTD
-    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "DTD/xhtml1-strict.dtd">
-  %htmlDTD;
-  <!ENTITY % globalDTD
-    SYSTEM "chrome://global/locale/global.dtd">
-  %globalDTD;
-  <!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd" >
-  %brandDTD;
-  <!ENTITY % restartRequiredDTD
-    SYSTEM "chrome://browser/locale/aboutRestartRequired.dtd">
-  %restartRequiredDTD;
-]>
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <title>&restartRequired.title;</title>
-    <link rel="stylesheet" type="text/css" media="all"
-          href="chrome://browser/skin/aboutRestartRequired.css"/>
-    <!-- If the location of the favicon is changed here, the
-         FAVICON_ERRORPAGE_URL symbol in
-         toolkit/components/places/src/nsFaviconService.h should be updated. -->
-    <link rel="icon" type="image/png" id="favicon"
-          href="chrome://global/skin/icons/warning-16.png"/>
-  </head>
-
-  <body dir="&locale.dir;">
-    <!-- PAGE CONTAINER (for styling purposes only) -->
-    <div id="errorPageContainer">
-      <div id="text-container">
-        <div id="title">
-          <h1 id="title-text">&restartRequired.header;</h1>
-        </div>
-        <div id="errorLongContent">
-          <div id="errorLongDesc">&restartRequired.description;</div>
-        </div>
-      </div>
-      <!-- Restart Button -->
-      <div id="restartButtonContainer" class="button-container">
-        <button id="restart" class="primary" autocomplete="off"
-                onclick="AboutRestartRequired.restart();">
-          &restartRequired.label;
-        </button>
-      </div>
-    </div>
-  </body>
-  <script type="text/javascript"
-           src="chrome://browser/content/aboutRestartRequired.js"/>
-</html>
--- a/browser/base/content/tabbrowser.js
+++ b/browser/base/content/tabbrowser.js
@@ -4048,37 +4048,26 @@ window._gBrowser = {
         this.removePreloadedBrowser();
         return;
       }
 
       let icon = browser.mIconURL;
       let tab = this.getTabForBrowser(browser);
 
       if (this.selectedBrowser == browser) {
-        TabCrashHandler.onSelectedBrowserCrash(browser, false);
+        TabCrashHandler.onSelectedBrowserCrash(browser);
       } else {
         this.updateBrowserRemoteness(browser, false);
         SessionStore.reviveCrashedTab(tab);
       }
 
       tab.removeAttribute("soundplaying");
       this.setIcon(tab, icon, browser.contentPrincipal, browser.contentRequestContextID);
     });
 
-    this.addEventListener("oop-browser-buildid-mismatch", (event) => {
-      if (!event.isTrusted)
-        return;
-
-      let browser = event.originalTarget;
-
-      if (this.selectedBrowser == browser) {
-        TabCrashHandler.onSelectedBrowserCrash(browser, true);
-      }
-    });
-
     this.addEventListener("DOMAudioPlaybackStarted", (event) => {
       var tab = this.getTabFromAudioEvent(event);
       if (!tab) {
         return;
       }
 
       clearTimeout(tab._soundPlayingAttrRemovalTimer);
       tab._soundPlayingAttrRemovalTimer = 0;
--- a/browser/base/jar.mn
+++ b/browser/base/jar.mn
@@ -34,18 +34,16 @@ browser.jar:
         content/browser/abouthome/settings@2x.png      (content/abouthome/settings@2x.png)
         content/browser/abouthome/restore@2x.png       (content/abouthome/restore@2x.png)
         content/browser/abouthome/restore-large@2x.png (content/abouthome/restore-large@2x.png)
 
         content/browser/illustrations/error-connection-failure.svg (content/illustrations/error-connection-failure.svg)
         content/browser/illustrations/error-server-not-found.svg (content/illustrations/error-server-not-found.svg)
         content/browser/illustrations/error-malformed-url.svg (content/illustrations/error-malformed-url.svg)
         content/browser/aboutNetError.xhtml            (content/aboutNetError.xhtml)
-        content/browser/aboutRestartRequired.js       (content/aboutRestartRequired.js)
-        content/browser/aboutRestartRequired.xhtml    (content/aboutRestartRequired.xhtml)
         content/browser/aboutRobots-icon.png          (content/aboutRobots-icon.png)
         content/browser/aboutRobots-widget-left.png   (content/aboutRobots-widget-left.png)
         content/browser/aboutTabCrashed.css           (content/aboutTabCrashed.css)
         content/browser/aboutTabCrashed.js            (content/aboutTabCrashed.js)
         content/browser/aboutTabCrashed.xhtml         (content/aboutTabCrashed.xhtml)
 *       content/browser/browser.css                   (content/browser.css)
         content/browser/browser.js                    (content/browser.js)
 *       content/browser/browser.xul                   (content/browser.xul)
--- a/browser/components/about/AboutRedirector.cpp
+++ b/browser/components/about/AboutRedirector.cpp
@@ -94,18 +94,16 @@ static const RedirEntry kRedirMap[] = {
     nsIAboutModule::ALLOW_SCRIPT },
   { "downloads", "chrome://browser/content/downloads/contentAreaDownloadsView.xul",
     nsIAboutModule::ALLOW_SCRIPT },
   { "reader", "chrome://global/content/reader/aboutReader.html",
     nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
     nsIAboutModule::ALLOW_SCRIPT |
     nsIAboutModule::URI_MUST_LOAD_IN_CHILD |
     nsIAboutModule::HIDE_FROM_ABOUTABOUT },
-  { "restartrequired", "chrome://browser/content/aboutRestartRequired.xhtml",
-    nsIAboutModule::ALLOW_SCRIPT },
 };
 
 static nsAutoCString
 GetAboutModuleName(nsIURI *aURI)
 {
   nsAutoCString path;
   aURI->GetPathQueryRef(path);
 
--- a/browser/components/build/nsModule.cpp
+++ b/browser/components/build/nsModule.cpp
@@ -101,17 +101,16 @@ static const mozilla::Module::ContractID
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "searchreset", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "sessionrestore", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "welcomeback", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "home", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "newtab", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "preferences", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "downloads", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "reader", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
-    { NS_ABOUT_MODULE_CONTRACTID_PREFIX "restartrequired", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
 #if defined(XP_WIN)
     { NS_IEHISTORYENUMERATOR_CONTRACTID, &kNS_WINIEHISTORYENUMERATOR_CID },
 #elif defined(XP_MACOSX)
     { NS_SHELLSERVICE_CONTRACTID, &kNS_SHELLSERVICE_CID },
 #endif
     { nullptr }
 };
 
deleted file mode 100644
--- a/browser/locales/en-US/chrome/browser/aboutRestartRequired.dtd
+++ /dev/null
@@ -1,13 +0,0 @@
-<!-- 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/. -->
-
-<!ENTITY restartRequired.title "Restart Required">
-
-<!ENTITY restartRequired.header "Sorry. We just need to do one small thing to keep going.">
-<!ENTITY restartRequired.description "
-<p>We have just installed an update in the background. Click Restart Firefox to finish applying it.</p>
-<p>We will restore all your pages, windows and tabs afterwards, so you can be on your way quickly.</p>
-">
-
-<!ENTITY restartRequired.label "Restart Firefox">
--- a/browser/locales/jar.mn
+++ b/browser/locales/jar.mn
@@ -13,17 +13,16 @@
 @AB_CD@.jar:
 % locale browser @AB_CD@ %locale/browser/
 *   locale/browser/bookmarks.html                  (generic/profile/bookmarks.html.in)
     locale/browser/aboutDialog.dtd                 (%chrome/browser/aboutDialog.dtd)
     locale/browser/aboutPrivateBrowsing.dtd        (%chrome/browser/aboutPrivateBrowsing.dtd)
     locale/browser/aboutRobots.dtd                 (%chrome/browser/aboutRobots.dtd)
     locale/browser/aboutHome.dtd                   (%chrome/browser/aboutHome.dtd)
     locale/browser/accounts.properties             (%chrome/browser/accounts.properties)
-    locale/browser/aboutRestartRequired.dtd        (%chrome/browser/aboutRestartRequired.dtd)
     locale/browser/aboutSearchReset.dtd            (%chrome/browser/aboutSearchReset.dtd)
     locale/browser/aboutSessionRestore.dtd         (%chrome/browser/aboutSessionRestore.dtd)
     locale/browser/aboutTabCrashed.dtd             (%chrome/browser/aboutTabCrashed.dtd)
     locale/browser/browser.dtd                     (%chrome/browser/browser.dtd)
     locale/browser/baseMenuOverlay.dtd             (%chrome/browser/baseMenuOverlay.dtd)
     locale/browser/browser.properties              (%chrome/browser/browser.properties)
     locale/browser/customizableui/customizableWidgets.properties (%chrome/browser/customizableui/customizableWidgets.properties)
     locale/browser/lightweightThemes.properties    (%chrome/browser/lightweightThemes.properties)
--- a/browser/modules/ContentCrashHandlers.jsm
+++ b/browser/modules/ContentCrashHandlers.jsm
@@ -224,41 +224,35 @@ var TabCrashHandler = {
     if (!browserQueue) {
       return false;
     }
 
     this.crashedBrowserQueues.delete(childID);
 
     let sentBrowser = false;
     for (let weakBrowser of browserQueue) {
-      let browser = weakBrowser.browser.get();
+      let browser = weakBrowser.get();
       if (browser) {
-        if (weakBrowser.restartRequired) {
-          this.sendToRestartRequiredPage(browser);
-        } else {
-          this.sendToTabCrashedPage(browser);
-        }
+        this.sendToTabCrashedPage(browser);
         sentBrowser = true;
       }
     }
 
     return sentBrowser;
   },
 
   /**
    * Called by a tabbrowser when it notices that its selected browser
    * has crashed. This will queue the browser to show the tab crash
    * page once the content process has finished tearing down.
    *
    * @param browser (<xul:browser>)
    *        The selected browser that just crashed.
-   * @param restartRequired (bool)
-   *        Whether or not a browser restart is required to recover.
    */
-  onSelectedBrowserCrash(browser, restartRequired) {
+  onSelectedBrowserCrash(browser) {
     if (!browser.isRemoteBrowser) {
       Cu.reportError("Selected crashed browser is not remote.");
       return;
     }
     if (!browser.frameLoader) {
       Cu.reportError("Selected crashed browser has no frameloader.");
       return;
     }
@@ -270,18 +264,17 @@ var TabCrashHandler = {
       this.crashedBrowserQueues.set(childID, browserQueue);
     }
     // It's probably unnecessary to store this browser as a
     // weak reference, since the content process should complete
     // its teardown in the same tick of the event loop, and then
     // this queue will be flushed. The weak reference is to avoid
     // leaking browsers in case anything goes wrong during this
     // teardown process.
-    browserQueue.push({browser: Cu.getWeakReference(browser),
-                       restartRequired});
+    browserQueue.push(Cu.getWeakReference(browser));
   },
 
   /**
    * This method is exposed for SessionStore to call if the user selects
    * a tab which will restore on demand. It's possible that the tab
    * is in this state because it recently crashed. If that's the case, then
    * it's also possible that the user has not seen the tab crash page for
    * that particular crash, in which case, we might show it to them instead
@@ -314,33 +307,16 @@ var TabCrashHandler = {
         this.sendToTabCrashedPage(browser);
         return true;
       }
     }
 
     return false;
   },
 
-  sendToRestartRequiredPage(browser) {
-    let uri = browser.currentURI;
-    let gBrowser = browser.ownerGlobal.gBrowser;
-    let tab = gBrowser.getTabForBrowser(browser);
-    // The restart required page is non-remote by default.
-    gBrowser.updateBrowserRemoteness(browser, false);
-
-    browser.docShell.displayLoadError(Cr.NS_ERROR_BUILDID_MISMATCH, uri, null);
-    tab.setAttribute("crashed", true);
-
-    // Make sure to only count once even if there are multiple windows
-    // that will all show about:restartrequired.
-    if (this._crashedTabCount == 1) {
-      Services.telemetry.getHistogramById("FX_CONTENT_BUILDID_MISMATCH").add(1);
-    }
-  },
-
   /**
    * We show a special page to users when a normal browser tab has crashed.
    * This method should be called to send a browser to that page once the
    * process has completely closed.
    *
    * @param browser (<xul:browser>)
    *        The browser that has recently crashed.
    */
deleted file mode 100644
--- a/browser/themes/shared/aboutRestartRequired.css
+++ /dev/null
@@ -1,41 +0,0 @@
-/* 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/. */
-
-@import url("chrome://browser/skin/error-pages.css");
-
-.illustrated #errorPageContainer {
-  min-height: 300px;
-  display: flex;
-  flex-direction: column;
-  background-position: left center;
-}
-
-body[dir="rtl"] #errorPageContainer {
-  background-position: right center;
-}
-
-#header {
-  background: none;
-  padding-inline-start: 0;
-  margin-inline-start: 0;
-}
-
-#text-container {
-  margin: auto;
-  padding-inline-start: 38%;
-}
-
-#errorPageContainer {
-  min-height: 350px;
-  display: flex;
-  flex-direction: column;
-  background-position: left center;
-  background-repeat: no-repeat;
-  background-size: 38%;
-  background-image: url("chrome://browser/content/illustrations/error-connection-failure.svg");
-}
-
-#restart {
-  margin-top: 1.2em;
-}
--- a/browser/themes/shared/jar.inc.mn
+++ b/browser/themes/shared/jar.inc.mn
@@ -5,17 +5,16 @@
 # This is not a complete / proper jar manifest. It is included by the
 # actual theme-specific manifests, so that shared resources need only
 # be specified once. As a result, the source file paths are relative
 # to the location of the actual manifest.
 
   skin/classic/browser/aboutNetError.css                       (../shared/aboutNetError.css)
   skin/classic/browser/blockedSite.css                         (../shared/blockedSite.css)
   skin/classic/browser/error-pages.css                         (../shared/error-pages.css)
-  skin/classic/browser/aboutRestartRequired.css                (../shared/aboutRestartRequired.css)
 * skin/classic/browser/aboutSessionRestore.css                 (../shared/aboutSessionRestore.css)
   skin/classic/browser/aboutTabCrashed.css                     (../shared/aboutTabCrashed.css)
   skin/classic/browser/aboutWelcomeBack.css                    (../shared/aboutWelcomeBack.css)
   skin/classic/browser/addons/addon-install-blocked.svg        (../shared/addons/addon-install-blocked.svg)
   skin/classic/browser/addons/addon-install-confirm.svg        (../shared/addons/addon-install-confirm.svg)
   skin/classic/browser/addons/addon-install-downloading.svg    (../shared/addons/addon-install-downloading.svg)
   skin/classic/browser/addons/addon-install-error.svg          (../shared/addons/addon-install-error.svg)
   skin/classic/browser/addons/addon-install-installed.svg      (../shared/addons/addon-install-installed.svg)
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -4746,26 +4746,16 @@ nsDocShell::DisplayLoadError(nsresult aE
     }
 
     // DisplayLoadError requires a non-empty messageStr to proceed and call
     // LoadErrorPage. If the page doesn't have a title, we will use a blank
     // space which will be trimmed and thus treated as empty by the front-end.
     if (messageStr.IsEmpty()) {
       messageStr.AssignLiteral(u" ");
     }
-  } else if (NS_ERROR_BUILDID_MISMATCH == aError) {
-    errorPage.AssignLiteral("restartrequired");
-    error = "restartrequired";
-
-    // DisplayLoadError requires a non-empty messageStr to proceed and call
-    // LoadErrorPage. If the page doesn't have a title, we will use a blank
-    // space which will be trimmed and thus treated as empty by the front-end.
-    if (messageStr.IsEmpty()) {
-      messageStr.AssignLiteral(u" ");
-    }
   } else {
     // Errors requiring simple formatting
     switch (aError) {
       case NS_ERROR_MALFORMED_URI:
         // URI is malformed
         error = "malformedURI";
         errorDescriptionID = "malformedURI2";
         break;
--- a/dom/ipc/ContentChild.cpp
+++ b/dom/ipc/ContentChild.cpp
@@ -602,17 +602,16 @@ ContentChild::RecvSetXPCOMProcessAttribu
   InitGraphicsDeviceData(aXPCOMInit.contentDeviceData());
 
   return IPC_OK();
 }
 
 bool
 ContentChild::Init(MessageLoop* aIOLoop,
                    base::ProcessId aParentPid,
-                   const char* aParentBuildID,
                    IPC::Channel* aChannel,
                    uint64_t aChildID,
                    bool aIsForBrowser)
 {
 #ifdef MOZ_WIDGET_GTK
   // When running X11 only build we need to pass a display down
   // to gtk_init because it's not going to use the one from the environment
   // on its own when deciding which backend to use, and when starting under
@@ -671,25 +670,20 @@ ContentChild::Init(MessageLoop* aIOLoop,
 
   // If communications with the parent have broken down, take the process
   // down so it's not hanging around.
   GetIPCChannel()->SetAbortOnError(true);
 #if defined(XP_WIN) && defined(ACCESSIBILITY)
   GetIPCChannel()->SetChannelFlags(MessageChannel::REQUIRE_A11Y_REENTRY);
 #endif
 
-  // This must be checked before any IPDL message, which may hit sentinel
+  // This must be sent before any IPDL message, which may hit sentinel
   // errors due to parent and content processes having different
   // versions.
-  MessageChannel* channel = GetIPCChannel();
-  if (channel && !channel->SendBuildIDsMatchMessage(aParentBuildID)) {
-    // We need to quit this process if the buildID doesn't match the parent's.
-    // This can occur when an update occurred in the background.
-    ProcessChild::QuickExit();
-  }
+  GetIPCChannel()->SendBuildID();
 
 #ifdef MOZ_X11
   if (!gfxPlatform::IsHeadless()) {
     // Send the parent our X socket to act as a proxy reference for our X
     // resources.
     int xSocketFd = ConnectionNumber(DefaultXDisplay());
     SendBackUpXResources(FileDescriptor(xSocketFd));
   }
--- a/dom/ipc/ContentChild.h
+++ b/dom/ipc/ContentChild.h
@@ -115,17 +115,16 @@ public:
                       const nsACString& aFeatures,
                       bool aForceNoOpener,
                       nsIDocShellLoadInfo* aLoadInfo,
                       bool* aWindowIsNew,
                       mozIDOMWindowProxy** aReturn);
 
   bool Init(MessageLoop* aIOLoop,
             base::ProcessId aParentPid,
-            const char* aParentBuildID,
             IPC::Channel* aChannel,
             uint64_t aChildID,
             bool aIsForBrowser);
 
   void InitXPCOM(const XPCOMInitData& aXPCOMInit,
                  const mozilla::dom::ipc::StructuredCloneData& aInitialData);
 
   void InitGraphicsDeviceData(const ContentDeviceData& aData);
--- a/dom/ipc/ContentParent.cpp
+++ b/dom/ipc/ContentParent.cpp
@@ -2050,20 +2050,16 @@ ContentParent::LaunchSubprocess(ProcessP
   nsCString schedulerPrefs = Scheduler::GetPrefs();
   extraArgs.push_back("-schedulerPrefs");
   extraArgs.push_back(schedulerPrefs.get());
 
   if (gSafeMode) {
     extraArgs.push_back("-safeMode");
   }
 
-  nsCString parentBuildID(mozilla::PlatformBuildID());
-  extraArgs.push_back("-parentBuildID");
-  extraArgs.push_back(parentBuildID.get());
-
   SetOtherProcessId(kInvalidProcessId, ProcessIdState::ePending);
   if (!mSubprocess->Launch(extraArgs)) {
     NS_ERROR("failed to launch child in the parent");
     MarkAsDead();
     return false;
   }
 
   OpenWithAsyncPid(mSubprocess->GetChannel());
--- a/dom/ipc/ContentProcess.cpp
+++ b/dom/ipc/ContentProcess.cpp
@@ -94,17 +94,16 @@ SetPrefsFd(int aFd)
 bool
 ContentProcess::Init(int aArgc, char* aArgv[])
 {
   Maybe<uint64_t> childID;
   Maybe<bool> isForBrowser;
   Maybe<base::SharedMemoryHandle> prefsHandle;
   Maybe<size_t> prefsLen;
   Maybe<const char*> schedulerPrefs;
-  Maybe<const char*> parentBuildID;
 #if defined(XP_MACOSX) && defined(MOZ_CONTENT_SANDBOX)
   nsCOMPtr<nsIFile> profileDir;
 #endif
 
   for (int i = 1; i < aArgc; i++) {
     if (!aArgv[i]) {
       continue;
     }
@@ -164,22 +163,16 @@ ContentProcess::Init(int aArgc, char* aA
       if (++i == aArgc) {
         return false;
       }
       schedulerPrefs = Some(aArgv[i]);
 
     } else if (strcmp(aArgv[i], "-safeMode") == 0) {
       gSafeMode = true;
 
-    } else if (strcmp(aArgv[i], "-parentBuildID") == 0) {
-      if (++i == aArgc) {
-        return false;
-      }
-      parentBuildID = Some(aArgv[i]);
-
 #if defined(XP_MACOSX) && defined(MOZ_CONTENT_SANDBOX)
     } else if (strcmp(aArgv[i], "-profile") == 0) {
       if (++i == aArgc) {
         return false;
       }
       bool flag;
       nsresult rv = XRE_GetFileFromPath(aArgv[i], getter_AddRefs(profileDir));
       if (NS_FAILED(rv) || NS_FAILED(profileDir->Exists(&flag)) || !flag) {
@@ -199,18 +192,17 @@ ContentProcess::Init(int aArgc, char* aA
                                           /* auto_close */ true));
 #endif
 
   // Did we find all the mandatory flags?
   if (childID.isNothing() ||
       isForBrowser.isNothing() ||
       prefsHandle.isNothing() ||
       prefsLen.isNothing() ||
-      schedulerPrefs.isNothing() ||
-      parentBuildID.isNothing()) {
+      schedulerPrefs.isNothing()) {
     return false;
   }
 
   // Set up early prefs from the shared memory.
   base::SharedMemory shm;
   if (!shm.SetHandle(*prefsHandle, /* read_only */ true)) {
     NS_ERROR("failed to open shared memory in the child");
     return false;
@@ -220,17 +212,16 @@ ContentProcess::Init(int aArgc, char* aA
     return false;
   }
   Preferences::DeserializePreferences(static_cast<char*>(shm.memory()),
                                       *prefsLen);
 
   Scheduler::SetPrefs(*schedulerPrefs);
   mContent.Init(IOThreadChild::message_loop(),
                 ParentPid(),
-                *parentBuildID,
                 IOThreadChild::channel(),
                 *childID,
                 *isForBrowser);
   mXREEmbed.Start();
 #if (defined(XP_MACOSX)) && defined(MOZ_CONTENT_SANDBOX)
   mContent.SetProfileDir(profileDir);
 #endif
 
--- a/dom/ipc/TabParent.cpp
+++ b/dom/ipc/TabParent.cpp
@@ -463,26 +463,20 @@ TabParent::ActorDestroy(ActorDestroyReas
                           "oop-frameloader-crashed", nullptr);
       nsCOMPtr<nsIFrameLoaderOwner> owner = do_QueryInterface(frameElement);
       if (owner) {
         RefPtr<nsFrameLoader> currentFrameLoader = owner->GetFrameLoader();
         // It's possible that the frameloader owner has already moved on
         // and created a new frameloader. If so, we don't fire the event,
         // since the frameloader owner has clearly moved on.
         if (currentFrameLoader == frameLoader) {
-          MessageChannel* channel = GetIPCChannel();
-          if (channel && !channel->DoBuildIDsMatch()) {
-            nsContentUtils::DispatchTrustedEvent(
-              frameElement->OwnerDoc(), frameElement,
-              NS_LITERAL_STRING("oop-browser-buildid-mismatch"), true, true);
-          } else {
-            nsContentUtils::DispatchTrustedEvent(
-              frameElement->OwnerDoc(), frameElement,
-              NS_LITERAL_STRING("oop-browser-crashed"), true, true);
-          }
+          nsContentUtils::DispatchTrustedEvent(frameElement->OwnerDoc(), frameElement,
+                                               NS_LITERAL_STRING("oop-browser-crashed"),
+                                               true, true);
+
         }
       }
     }
 
     mFrameLoader = nullptr;
   }
 
   if (os) {
--- a/gfx/ipc/GPUParent.cpp
+++ b/gfx/ipc/GPUParent.cpp
@@ -79,42 +79,36 @@ GPUParent::~GPUParent()
 /* static */ GPUParent*
 GPUParent::GetSingleton()
 {
   return sGPUParent;
 }
 
 bool
 GPUParent::Init(base::ProcessId aParentPid,
-                const char* aParentBuildID,
                 MessageLoop* aIOLoop,
                 IPC::Channel* aChannel)
 {
   // Initialize the thread manager before starting IPC. Otherwise, messages
   // may be posted to the main thread and we won't be able to process them.
   if (NS_WARN_IF(NS_FAILED(nsThreadManager::get().Init()))) {
     return false;
   }
 
   // Now it's safe to start IPC.
   if (NS_WARN_IF(!Open(aChannel, aParentPid, aIOLoop))) {
     return false;
   }
 
   nsDebugImpl::SetMultiprocessMode("GPU");
 
-  // This must be checked before any IPDL message, which may hit sentinel
+  // This must be sent before any IPDL message, which may hit sentinel
   // errors due to parent and content processes having different
   // versions.
-  MessageChannel* channel = GetIPCChannel();
-  if (channel && !channel->SendBuildIDsMatchMessage(aParentBuildID)) {
-    // We need to quit this process if the buildID doesn't match the parent's.
-    // This can occur when an update occurred in the background.
-    ProcessChild::QuickExit();
-  }
+  GetIPCChannel()->SendBuildID();
 
   // Init crash reporter support.
   CrashReporterClient::InitSingleton(this);
 
   // Ensure gfxPrefs are initialized.
   gfxPrefs::GetSingleton();
   gfxConfig::Init();
   gfxVars::Initialize();
--- a/gfx/ipc/GPUParent.h
+++ b/gfx/ipc/GPUParent.h
@@ -22,17 +22,16 @@ class GPUParent final : public PGPUParen
 {
 public:
   GPUParent();
   ~GPUParent();
 
   static GPUParent* GetSingleton();
 
   bool Init(base::ProcessId aParentPid,
-            const char* aParentBuildID,
             MessageLoop* aIOLoop,
             IPC::Channel* aChannel);
   void NotifyDeviceReset();
 
   PAPZInputBridgeParent* AllocPAPZInputBridgeParent(const LayersId& aLayersId) override;
   bool DeallocPAPZInputBridgeParent(PAPZInputBridgeParent* aActor) override;
 
   mozilla::ipc::IPCResult RecvInit(nsTArray<GfxPrefSetting>&& prefs,
--- a/gfx/ipc/GPUProcessImpl.cpp
+++ b/gfx/ipc/GPUProcessImpl.cpp
@@ -26,25 +26,18 @@ GPUProcessImpl::~GPUProcessImpl()
 }
 
 bool
 GPUProcessImpl::Init(int aArgc, char* aArgv[])
 {
 #if defined(MOZ_SANDBOX) && defined(OS_WIN)
   mozilla::SandboxTarget::Instance()->StartSandbox();
 #endif
-  char* parentBuildID = nullptr;
-  for (int idx = aArgc; idx > 0; idx--) {
-    if (!strcmp(aArgv[idx], "-parentBuildID")) {
-      parentBuildID = aArgv[idx + 1];
-    }
-  }
 
   return mGPU.Init(ParentPid(),
-                   parentBuildID,
                    IOThreadChild::message_loop(),
                    IOThreadChild::channel());
 }
 
 void
 GPUProcessImpl::CleanUp()
 {
   NS_ShutdownXPCOM(nullptr);
--- a/ipc/glue/MessageChannel.cpp
+++ b/ipc/glue/MessageChannel.cpp
@@ -528,18 +528,17 @@ MessageChannel::MessageChannel(const cha
     mRemoteStackDepthGuess(0),
     mSawInterruptOutMsg(false),
     mIsWaitingForIncoming(false),
     mAbortOnError(false),
     mNotifiedChannelDone(false),
     mFlags(REQUIRE_DEFAULT),
     mPeerPidSet(false),
     mPeerPid(-1),
-    mIsPostponingSends(false),
-    mBuildIDsConfirmedMatch(false)
+    mIsPostponingSends(false)
 {
     MOZ_COUNT_CTOR(ipc::MessageChannel);
 
 #ifdef OS_WIN
     mTopFrame = nullptr;
     mIsSyncWaitingOnNonMainThread = false;
 #endif
 
@@ -996,63 +995,53 @@ MessageChannel::RejectPendingResponsesFo
     itr->second.get()->Reject(ResponseRejectReason::ActorDestroyed);
     // Take special care of advancing the iterator since we are
     // removing it while iterating.
     itr = mPendingResponses.erase(itr);
     gUnresolvedResponses--;
   }
 }
 
-class BuildIDsMatchMessage : public IPC::Message
+class BuildIDMessage : public IPC::Message
 {
 public:
-    BuildIDsMatchMessage()
-        : IPC::Message(MSG_ROUTING_NONE, BUILD_IDS_MATCH_MESSAGE_TYPE)
+    BuildIDMessage()
+        : IPC::Message(MSG_ROUTING_NONE, BUILD_ID_MESSAGE_TYPE)
     {
     }
     void Log(const std::string& aPrefix, FILE* aOutf) const
     {
-        fputs("(special `Build IDs match' message)", aOutf);
+        fputs("(special `Build ID' message)", aOutf);
     }
 };
 
-// Send the parent a special async message to confirm when the parent and child
-// are of the same buildID. Skips sending the message and returns false if the
-// buildIDs don't match. This is a minor variation on
-// MessageChannel::Send(Message* aMsg).
-bool
-MessageChannel::SendBuildIDsMatchMessage(const char* aParentBuildID)
+// Send the parent a special async message to allow it to detect if
+// this process is running a different build. This is a minor
+// variation on MessageChannel::Send(Message* aMsg).
+void
+MessageChannel::SendBuildID()
 {
     MOZ_ASSERT(!XRE_IsParentProcess());
-
-    nsCString parentBuildID(aParentBuildID);
-    nsCString childBuildID(mozilla::PlatformBuildID());
-
-    if (parentBuildID != childBuildID) {
-        // The build IDs didn't match, usually because an update occurred in the
-        // background.
-        return false;
-    }
-
-    nsAutoPtr<BuildIDsMatchMessage> msg(new BuildIDsMatchMessage());
+    nsAutoPtr<BuildIDMessage> msg(new BuildIDMessage());
+    nsCString buildID(mozilla::PlatformBuildID());
+    IPC::WriteParam(msg, buildID);
 
     MOZ_RELEASE_ASSERT(!msg->is_sync());
     MOZ_RELEASE_ASSERT(msg->nested_level() != IPC::Message::NESTED_INSIDE_SYNC);
 
     AssertWorkerThread();
     mMonitor->AssertNotCurrentThreadOwns();
     // Don't check for MSG_ROUTING_NONE.
 
     MonitorAutoLock lock(*mMonitor);
     if (!Connected()) {
         ReportConnectionError("MessageChannel", msg);
-        return false;
+        return;
     }
     mLink->SendMessage(msg.forget());
-    return true;
 }
 
 class CancelMessage : public IPC::Message
 {
 public:
     explicit CancelMessage(int transaction) :
         IPC::Message(MSG_ROUTING_NONE, CANCEL_MESSAGE_TYPE)
     {
@@ -1061,16 +1050,32 @@ public:
     static bool Read(const Message* msg) {
         return true;
     }
     void Log(const std::string& aPrefix, FILE* aOutf) const {
         fputs("(special `Cancel' message)", aOutf);
     }
 };
 
+MOZ_NEVER_INLINE static void
+CheckChildProcessBuildID(const IPC::Message& aMsg)
+{
+    MOZ_ASSERT(XRE_IsParentProcess());
+    nsCString childBuildID;
+    PickleIterator msgIter(aMsg);
+    MOZ_ALWAYS_TRUE(IPC::ReadParam(&aMsg, &msgIter, &childBuildID));
+    aMsg.EndRead(msgIter);
+
+    nsCString parentBuildID(mozilla::PlatformBuildID());
+
+    // This assert can fail if the child process has been updated
+    // to a newer version while the parent process was running.
+    MOZ_RELEASE_ASSERT(parentBuildID == childBuildID);
+}
+
 bool
 MessageChannel::MaybeInterceptSpecialIOMessage(const Message& aMsg)
 {
     AssertLinkThread();
     mMonitor->AssertCurrentThreadOwns();
 
     if (MSG_ROUTING_NONE == aMsg.routing_id()) {
         if (GOODBYE_MESSAGE_TYPE == aMsg.type()) {
@@ -1082,19 +1087,19 @@ MessageChannel::MaybeInterceptSpecialIOM
                        (mSide == ChildSide) ? "child" : "parent");
             }
             return true;
         } else if (CANCEL_MESSAGE_TYPE == aMsg.type()) {
             IPC_LOG("Cancel from message");
             CancelTransaction(aMsg.transaction_id());
             NotifyWorkerThread();
             return true;
-        } else if (BUILD_IDS_MATCH_MESSAGE_TYPE == aMsg.type()) {
-            IPC_LOG("Build IDs match message");
-            mBuildIDsConfirmedMatch = true;
+        } else if (BUILD_ID_MESSAGE_TYPE == aMsg.type()) {
+            IPC_LOG("Build ID message");
+            CheckChildProcessBuildID(aMsg);
             return true;
         }
     }
     return false;
 }
 
 /* static */ bool
 MessageChannel::IsAlwaysDeferred(const Message& aMsg)
--- a/ipc/glue/MessageChannel.h
+++ b/ipc/glue/MessageChannel.h
@@ -233,18 +233,17 @@ private:
 
         UniquePtr<UntypedCallbackHolder> callback =
             MakeUnique<CallbackHolder<Value>>(
                 aActorId, Move(aResolve), Move(aReject));
         mPendingResponses.insert(std::make_pair(seqno, Move(callback)));
         gUnresolvedResponses++;
     }
 
-    bool SendBuildIDsMatchMessage(const char* aParentBuildI);
-    bool DoBuildIDsMatch() { return mBuildIDsConfirmedMatch; }
+    void SendBuildID();
 
     // Asynchronously deliver a message back to this side of the
     // channel
     bool Echo(Message* aMsg);
 
     // Synchronously send |msg| (i.e., wait for |reply|)
     bool Send(Message* aMsg, Message* aReply);
 
@@ -850,18 +849,16 @@ private:
     RefPtr<CancelableRunnable> mOnChannelConnectedTask;
     bool mPeerPidSet;
     int32_t mPeerPid;
 
     // Channels can enter messages are not sent immediately; instead, they are
     // held in a queue until another thread deems it is safe to send them.
     bool mIsPostponingSends;
     std::vector<UniquePtr<Message>> mPostponedSends;
-
-    bool mBuildIDsConfirmedMatch;
 };
 
 void
 CancelCPOWs();
 
 } // namespace ipc
 } // namespace mozilla
 
--- a/ipc/glue/ProtocolUtils.h
+++ b/ipc/glue/ProtocolUtils.h
@@ -44,23 +44,22 @@ template<typename T> class nsPtrHashKey;
 namespace {
 // XXX the max message ID is actually kuint32max now ... when this
 // changed, the assumptions of the special message IDs changed in that
 // they're not carving out messages from likely-unallocated space, but
 // rather carving out messages from the end of space allocated to
 // protocol 0.  Oops!  We can get away with this until protocol 0
 // starts approaching its 65,536th message.
 enum {
-    BUILD_IDS_MATCH_MESSAGE_TYPE   = kuint16max - 8,
-    BUILD_ID_MESSAGE_TYPE          = kuint16max - 7, // unused
-    CHANNEL_OPENED_MESSAGE_TYPE    = kuint16max - 6,
-    SHMEM_DESTROYED_MESSAGE_TYPE   = kuint16max - 5,
-    SHMEM_CREATED_MESSAGE_TYPE     = kuint16max - 4,
-    GOODBYE_MESSAGE_TYPE           = kuint16max - 3,
-    CANCEL_MESSAGE_TYPE            = kuint16max - 2,
+    BUILD_ID_MESSAGE_TYPE = kuint16max - 7,
+    CHANNEL_OPENED_MESSAGE_TYPE = kuint16max - 6,
+    SHMEM_DESTROYED_MESSAGE_TYPE = kuint16max - 5,
+    SHMEM_CREATED_MESSAGE_TYPE = kuint16max - 4,
+    GOODBYE_MESSAGE_TYPE       = kuint16max - 3,
+    CANCEL_MESSAGE_TYPE        = kuint16max - 2,
 
     // kuint16max - 1 is used by ipc_channel.h.
 };
 
 } // namespace
 
 class nsIEventTarget;
 
--- a/js/xpconnect/src/xpc.msg
+++ b/js/xpconnect/src/xpc.msg
@@ -215,17 +215,16 @@ XPC_MSG_DEF(NS_ERROR_GFX_PRINTER_NAME_NO
 XPC_MSG_DEF(NS_ERROR_GFX_PRINTER_COULD_NOT_OPEN_FILE  , "Failed to open output file for print to file.")
 XPC_MSG_DEF(NS_ERROR_GFX_PRINTER_STARTDOC             , "Printing failed while starting the print job.")
 XPC_MSG_DEF(NS_ERROR_GFX_PRINTER_ENDDOC               , "Printing failed while completing the print job.")
 XPC_MSG_DEF(NS_ERROR_GFX_PRINTER_STARTPAGE            , "Printing failed while starting a new page.")
 XPC_MSG_DEF(NS_ERROR_GFX_PRINTER_DOC_IS_BUSY          , "Cannot print this document yet, it is still being loaded.")
 
 /* Codes related to content */
 XPC_MSG_DEF(NS_ERROR_CONTENT_CRASHED                  , "The process that hosted this content has crashed.")
-XPC_MSG_DEF(NS_ERROR_BUILDID_MISMATCH                 , "The process that hosted this content did not have the same buildID as the parent.")
 
 /* Codes for the JS-implemented Push DOM API. These can be removed as part of bug 1252660. */
 XPC_MSG_DEF(NS_ERROR_DOM_PUSH_INVALID_KEY_ERR         , "Invalid raw ECDSA P-256 public key.")
 XPC_MSG_DEF(NS_ERROR_DOM_PUSH_MISMATCHED_KEY_ERR      , "A subscription with a different application server key already exists.")
 
 /* Codes defined in WebIDL https://heycam.github.io/webidl/#idl-DOMException-error-names */
 XPC_MSG_DEF(NS_ERROR_DOM_NOT_FOUND_ERR                , "The object can not be found here.")
 XPC_MSG_DEF(NS_ERROR_DOM_NOT_ALLOWED_ERR              , "The request is not allowed.")
--- a/netwerk/base/nsILoadInfo.idl
+++ b/netwerk/base/nsILoadInfo.idl
@@ -200,17 +200,17 @@ interface nsILoadInfo : nsISupports
    * Note: If this flag is set and the channel response is a redirect, then
    * the response body might not be available.
    * This can happen if the redirect was cached.
    */
   const unsigned long SEC_DONT_FOLLOW_REDIRECTS = (1<<12);
 
   /**
    * Load an error page, it should be one of following : about:neterror,
-   * about:certerror, about:blocked, about:tabcrashed or about:restartrequired.
+   * about:certerror, about:blocked, or about:tabcrashed.
    */
   const unsigned long SEC_LOAD_ERROR_PAGE = (1<<13);
 
   /**
    * Force inheriting of the principal, overruling any owner that might be set
    * on the channel. (Please note that channel.owner is deprecated and will be
    * removed within Bug 1286838).  See the documentation for principalToInherit,
    * which describes exactly what principal is inherited.
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -12559,25 +12559,16 @@
     "record_in_processes": ["main", "content"],
     "alert_emails": ["wmccloskey@mozilla.com"],
     "bug_numbers": [1269961],
     "expires_in_version": "never",
     "kind": "count",
     "releaseChannelCollection": "opt-out",
     "description": "Counts the number of times that about:tabcrashed was unloaded without submitting."
   },
-  "FX_CONTENT_BUILDID_MISMATCH": {
-    "record_in_processes": ["main"],
-    "alert_emails": ["spohl@mozilla.com"],
-    "bug_numbers": [1366808],
-    "expires_in_version": "never",
-    "kind": "count",
-    "releaseChannelCollection": "opt-out",
-    "description": "Counts the number of times that about:restartrequired appeared."
-  },
    "D3D9_COMPOSITING_FAILURE_ID": {
     "record_in_processes": ["main", "content"],
        "alert_emails": ["gfx-telemetry-alerts@mozilla.com","msreckovic@mozilla.com"],
     "expires_in_version": "59",
     "kind": "count",
     "keyed": true,
     "description": "D3D9 compositor runtime and dynamic failure IDs. This will record a count for each context creation success or failure. Each failure id is a unique identifier that can be traced back to a particular failure branch or blocklist rule.",
     "bug_numbers": [1002846]
--- a/toolkit/components/telemetry/histogram-whitelists.json
+++ b/toolkit/components/telemetry/histogram-whitelists.json
@@ -1631,17 +1631,16 @@
     "FENNEC_SYNC_NUMBER_OF_SYNCS_STARTED",
     "FENNEC_WAS_KILLED",
     "FIPS_ENABLED",
     "FXA_CONFIGURED",
     "FX_BROWSER_FULLSCREEN_USED",
     "FX_CONTENT_CRASH_DUMP_UNAVAILABLE",
     "FX_CONTENT_CRASH_NOT_SUBMITTED",
     "FX_CONTENT_CRASH_PRESENTED",
-    "FX_CONTENT_BUILDID_MISMATCH",
     "FX_SESSION_RESTORE_SEND_UPDATE_CAUSED_OOM",
     "FX_TOUCH_USED",
     "GEOLOCATION_ERROR",
     "MASTER_PASSWORD_ENABLED",
     "MEDIA_CODEC_USED",
     "NETWORK_CONNECTION_COUNT",
     "NUMBER_OF_PROFILES",
     "ONBEFOREUNLOAD_PROMPT_COUNT",
--- a/xpcom/base/ErrorList.py
+++ b/xpcom/base/ErrorList.py
@@ -863,19 +863,16 @@ with modules["CONTENT"]:
     errors["NS_ERROR_CONTENT_BLOCKED"] = FAILURE(6)
     errors["NS_ERROR_CONTENT_BLOCKED_SHOW_ALT"] = FAILURE(7)
     # Success variations of content policy blocking
     errors["NS_PROPTABLE_PROP_NOT_THERE"] = FAILURE(10)
     # Error code for XBL
     errors["NS_ERROR_XBL_BLOCKED"] = FAILURE(15)
     # Error code for when the content process crashed
     errors["NS_ERROR_CONTENT_CRASHED"] = FAILURE(16)
-    # Error code for when the content process had a different buildID than the
-    # parent
-    errors["NS_ERROR_BUILDID_MISMATCH"] = FAILURE(17)
 
     # XXX this is not really used
     errors["NS_HTML_STYLE_PROPERTY_NOT_THERE"] = SUCCESS(2)
     errors["NS_CONTENT_BLOCKED"] = SUCCESS(8)
     errors["NS_CONTENT_BLOCKED_SHOW_ALT"] = SUCCESS(9)
     errors["NS_PROPTABLE_PROP_OVERWRITTEN"] = SUCCESS(11)
     # Error codes for FindBroadcaster in XULDocument.cpp
     errors["NS_FINDBROADCASTER_NOT_FOUND"] = SUCCESS(12)