diff --git a/browser/components/preferences/in-content/main.js b/browser/components/preferences/in-content/main.js
index bb8e906f3e3f..249dc229c006 100644
--- a/browser/components/preferences/in-content/main.js
+++ b/browser/components/preferences/in-content/main.js
@@ -83,38 +83,21 @@ var gMainPane = {
setEventListener("e10sAutoStart", "command",
gMainPane.enableE10SChange);
let e10sCheckbox = document.getElementById("e10sAutoStart");
- e10sCheckbox.checked = Services.appinfo.browserTabsRemoteAutostart;
- // If e10s is blocked for some reason unrelated to prefs, we want to disable
- // the checkbox.
- if (!Services.appinfo.browserTabsRemoteAutostart) {
- let e10sBlockedReason = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
- let appinfo = Services.appinfo.QueryInterface(Ci.nsIObserver);
- appinfo.observe(e10sBlockedReason, "getE10SBlocked", "")
- if (e10sBlockedReason.data) {
- if (e10sBlockedReason.data == "Safe mode") {
- // If the only reason we're disabled is because of safe mode, then
- // we want to allow the user to un-toggle the pref.
- // We're relying on the nsAppRunner code only specifying "Safe mode"
- // as the reason if the pref is otherwise enabled, and there are no
- // other reasons to block e10s.
- // Update the checkbox to reflect the pref state.
- e10sCheckbox.checked = true;
- } else {
- e10sCheckbox.disabled = true;
- let updateChannel = UpdateUtils.UpdateChannel;
- // only add this label on developer channels
- if (updateChannel == "default" ||
- updateChannel == "nightly" ||
- updateChannel == "aurora") {
- e10sCheckbox.label += " (disabled: " + e10sBlockedReason.data + ")";
- }
- }
- }
+ let e10sPref = document.getElementById("browser.tabs.remote.autostart");
+ let e10sTempPref = document.getElementById("e10sTempPref");
+ let e10sForceEnable = document.getElementById("e10sForceEnable");
+
+ let preffedOn = e10sPref.value || e10sTempPref.value || e10sForceEnable.value;
+
+ if (preffedOn) {
+ // The checkbox is checked if e10s is preffed on.
+ e10sCheckbox.checked = true;
+
+ // but if it's force disabled, then the checkbox is disabled.
+ e10sCheckbox.disabled = !Services.appinfo.browserTabsRemoteAutostart;
}
- // If E10S is blocked because of safe mode, we want the checkbox to be
- // enabled
#endif
#ifdef MOZ_DEV_EDITION
diff --git a/browser/components/preferences/in-content/main.xul b/browser/components/preferences/in-content/main.xul
index e30e92aa3431..f51e3f825af9 100644
--- a/browser/components/preferences/in-content/main.xul
+++ b/browser/components/preferences/in-content/main.xul
@@ -16,6 +16,9 @@
+
#endif
diff --git a/toolkit/content/aboutSupport.js b/toolkit/content/aboutSupport.js
index b7481d726231..b3594adbb867 100644
--- a/toolkit/content/aboutSupport.js
+++ b/toolkit/content/aboutSupport.js
@@ -46,8 +46,23 @@ var snapshotFormatters = {
if (data.updateChannel)
$("updatechannel-box").textContent = data.updateChannel;
- $("multiprocess-box").textContent = stringBundle().formatStringFromName("multiProcessStatus",
- [data.numRemoteWindows, data.numTotalWindows, data.remoteAutoStart], 3);
+ let statusStrName = ".unknown";
+
+ // Whitelist of known values with string descriptions:
+ switch (data.autoStartStatus) {
+ case 0:
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ statusStrName = "." + data.autoStartStatus;
+ }
+
+ let statusText = stringBundle().GetStringFromName("multiProcessStatus" + statusStrName);
+ $("multiprocess-box").textContent = stringBundle().formatStringFromName("multiProcessWindows",
+ [data.numRemoteWindows, data.numTotalWindows, statusText], 3);
$("safemode-box").textContent = data.safeMode;
},
diff --git a/toolkit/locales/en-US/chrome/global/aboutSupport.properties b/toolkit/locales/en-US/chrome/global/aboutSupport.properties
index 143ad12da5bf..fdd76bc2b023 100644
--- a/toolkit/locales/en-US/chrome/global/aboutSupport.properties
+++ b/toolkit/locales/en-US/chrome/global/aboutSupport.properties
@@ -96,9 +96,18 @@ canSandboxContent = Content Process Sandboxing
canSandboxMedia = Media Plugin Sandboxing
# LOCALIZATION NOTE %1$S and %2$S will be replaced with the number of remote and the total number
-# of windows, respectively, while %3$S will indicate whether windows are remote by default ('true'
-# or 'false')
-multiProcessStatus = %1$S/%2$S (default: %3$S)
+# of windows, respectively, while %3$S will be replaced with one of the status strings below,
+# which contains a description of the multi-process preference and status.
+# Note: multiProcessStatus.3 doesn't exist because status=3 was deprecated.
+multiProcessWindows = %1$S/%2$S (%3$S)
+multiProcessStatus.0 = Enabled by user
+multiProcessStatus.1 = Enabled by default
+multiProcessStatus.2 = Disabled
+multiProcessStatus.4 = Disabled by accessibility tools
+multiProcessStatus.5 = Disabled by lack of graphics hardware acceleration
+multiProcessStatus.6 = Disabled by unsupported text input
+multiProcessStatus.7 = Disabled by add-ons
+multiProcessStatus.unknown = Unknown status
asyncPanZoom = Asynchronous Pan/Zoom
apzNone = none
diff --git a/toolkit/modules/Troubleshoot.jsm b/toolkit/modules/Troubleshoot.jsm
index 5a86d796baf8..cfa7db057ffa 100644
--- a/toolkit/modules/Troubleshoot.jsm
+++ b/toolkit/modules/Troubleshoot.jsm
@@ -219,6 +219,16 @@ var dataProviders = {
data.remoteAutoStart = Services.appinfo.browserTabsRemoteAutostart;
+ try {
+ let e10sStatus = Cc["@mozilla.org/supports-PRUint64;1"]
+ .createInstance(Ci.nsISupportsPRUint64);
+ let appinfo = Services.appinfo.QueryInterface(Ci.nsIObserver);
+ appinfo.observe(e10sStatus, "getE10SBlocked", "");
+ data.autoStartStatus = e10sStatus.data;
+ } catch (e) {
+ data.autoStartStatus = -1;
+ }
+
done(data);
},
diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
index f8d3364fb230..5bdefd13630b 100644
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -995,17 +995,17 @@ nsXULAppInfo::GetProcessID(uint32_t* aResult)
}
static bool gBrowserTabsRemoteAutostart = false;
-static nsString gBrowserTabsRemoteDisabledReason;
+static uint64_t gBrowserTabsRemoteStatus = 0;
static bool gBrowserTabsRemoteAutostartInitialized = false;
NS_IMETHODIMP
nsXULAppInfo::Observe(nsISupports *aSubject, const char *aTopic, const char16_t *aData) {
if (!nsCRT::strcmp(aTopic, "getE10SBlocked")) {
- nsCOMPtr ret = do_QueryInterface(aSubject);
+ nsCOMPtr ret = do_QueryInterface(aSubject);
if (!ret)
return NS_ERROR_FAILURE;
- ret->SetData(gBrowserTabsRemoteDisabledReason);
+ ret->SetData(gBrowserTabsRemoteStatus);
return NS_OK;
}
@@ -4631,19 +4631,7 @@ XRE_IsContentProcess()
return XRE_GetProcessType() == GeckoProcessType_Content;
}
-static void
-LogE10sBlockedReason(const char *reason) {
- gBrowserTabsRemoteDisabledReason.Assign(NS_ConvertASCIItoUTF16(reason));
-
- nsAutoString msg(NS_LITERAL_STRING("==================\nE10s has been blocked from running because:\n"));
- msg.Append(gBrowserTabsRemoteDisabledReason);
- msg.AppendLiteral("\n==================\n");
- nsCOMPtr console(do_GetService("@mozilla.org/consoleservice;1"));
- if (console) {
- console->LogStringMessage(msg.get());
- }
-}
-
+// If you add anything to this enum, please update about:support to reflect it
enum {
kE10sEnabledByUser = 0,
kE10sEnabledByDefault = 1,
@@ -4773,13 +4761,10 @@ mozilla::BrowserTabsRemoteAutostart()
if (e10sAllowed && prefEnabled) {
if (disabledForA11y) {
status = kE10sDisabledForAccessibility;
- LogE10sBlockedReason("An accessibility tool is or was active. See bug 1198459.");
} else if (disabledForBidi) {
status = kE10sDisabledForBidi;
- LogE10sBlockedReason("Disabled for RTL locales due to broken bidi detection.");
} else if (addonsCanDisable && disabledByAddons) {
status = kE10sDisabledForAddons;
- LogE10sBlockedReason("3rd party add-ons are installed and enabled.");
} else {
gBrowserTabsRemoteAutostart = true;
}
@@ -4817,9 +4802,7 @@ mozilla::BrowserTabsRemoteAutostart()
if (accelDisabled) {
gBrowserTabsRemoteAutostart = false;
-
status = kE10sDisabledForMacGfx;
- LogE10sBlockedReason("Hardware acceleration is disabled");
}
}
#endif // defined(XP_MACOSX)
@@ -4831,6 +4814,8 @@ mozilla::BrowserTabsRemoteAutostart()
status = kE10sEnabledByUser;
}
+ gBrowserTabsRemoteStatus = status;
+
mozilla::Telemetry::Accumulate(mozilla::Telemetry::E10S_STATUS, status);
if (Preferences::GetBool("browser.enabledE10SFromPrompt", false)) {
mozilla::Telemetry::Accumulate(mozilla::Telemetry::E10S_STILL_ACCEPTED_FROM_PROMPT,