Backed out 3 changesets (bug 1544813) for causing debugger test to perma fail CLOSED TREE
authorCiure Andrei <aciure@mozilla.com>
Thu, 16 May 2019 09:09:04 +0300
changeset 532878 2a832d03ebcc4199e682e7b1160eb47e9bd87e1d
parent 532877 d15e60f91051c45b51a5c8cf130eaa03ef24ce62
child 532879 76a573b6acf4b7c0c7e0b875306a7eb6fbaa64e6
push id11276
push userrgurzau@mozilla.com
push dateMon, 20 May 2019 13:11:24 +0000
treeherdermozilla-beta@847755a7c325 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1544813
milestone68.0a1
backs out67e719e02573ca3325763b9c1778ccf33a1738e1
6a315be5f16ff419f73e35c65d2eb9259e5ebb21
ac87e6ddded678765e2643d86a9ce65512ab9f56
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out 3 changesets (bug 1544813) for causing debugger test to perma fail CLOSED TREE Backed out changeset 67e719e02573 (bug 1544813) Backed out changeset 6a315be5f16f (bug 1544813) Backed out changeset ac87e6ddded6 (bug 1544813)
devtools/client/aboutdebugging-new/src/actions/runtimes.js
devtools/client/aboutdebugging-new/src/base.css
devtools/client/aboutdebugging-new/src/components/ExtensionDebugSetting.js
devtools/client/aboutdebugging-new/src/components/RuntimeActions.js
devtools/client/aboutdebugging-new/src/components/RuntimePage.js
devtools/client/aboutdebugging-new/src/components/debugtarget/ExtensionAction.js
devtools/client/aboutdebugging-new/src/components/debugtarget/moz.build
devtools/client/aboutdebugging-new/src/components/moz.build
devtools/client/aboutdebugging-new/src/constants.js
devtools/client/aboutdebugging-new/src/modules/debug-target-support.js
devtools/client/aboutdebugging-new/src/reducers/runtimes-state.js
devtools/client/aboutdebugging-new/src/types/runtime.js
devtools/client/aboutdebugging-new/test/browser/browser.ini
devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_addons_debug_debugger.js
devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_addons_debug_setting_thisfirefox.js
devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_addons_debug_setting_usb.js
devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_devtoolstoolbox_tooltip_markupview.js
devtools/client/aboutdebugging-new/test/browser/helper-addons.js
devtools/client/debugger/src/actions/navigation.js
devtools/client/debugger/src/client/firefox.js
devtools/client/debugger/src/reducers/debuggee.js
devtools/client/debugger/src/reducers/sources.js
devtools/client/debugger/src/reducers/tests/sources.spec.js
devtools/client/locales/en-US/aboutdebugging.ftl
--- a/devtools/client/aboutdebugging-new/src/actions/runtimes.js
+++ b/devtools/client/aboutdebugging-new/src/actions/runtimes.js
@@ -12,16 +12,17 @@ const {
   getAllRuntimes,
   getCurrentRuntime,
   findRuntimeById,
 } = require("../modules/runtimes-state-helper");
 
 const { l10n } = require("../modules/l10n");
 const { createClientForRuntime } = require("../modules/runtime-client-factory");
 const {
+  isExtensionDebugSettingNeeded,
   isSupportedDebugTargetPane,
 } = require("../modules/debug-target-support");
 
 const { remoteClientManager } =
   require("devtools/client/shared/remote-debugging/remote-client-manager");
 
 const {
   CONNECT_RUNTIME_CANCEL,
@@ -39,16 +40,19 @@ const {
   RUNTIMES,
   THIS_FIREFOX_RUNTIME_CREATED,
   UNWATCH_RUNTIME_FAILURE,
   UNWATCH_RUNTIME_START,
   UNWATCH_RUNTIME_SUCCESS,
   UPDATE_CONNECTION_PROMPT_SETTING_FAILURE,
   UPDATE_CONNECTION_PROMPT_SETTING_START,
   UPDATE_CONNECTION_PROMPT_SETTING_SUCCESS,
+  UPDATE_EXTENSION_DEBUG_SETTING_FAILURE,
+  UPDATE_EXTENSION_DEBUG_SETTING_START,
+  UPDATE_EXTENSION_DEBUG_SETTING_SUCCESS,
   UPDATE_RUNTIME_MULTIE10S_FAILURE,
   UPDATE_RUNTIME_MULTIE10S_START,
   UPDATE_RUNTIME_MULTIE10S_SUCCESS,
   WATCH_RUNTIME_FAILURE,
   WATCH_RUNTIME_START,
   WATCH_RUNTIME_SUCCESS,
 } = require("../constants");
 
@@ -115,22 +119,29 @@ function connectRuntime(id) {
       const runtime = findRuntimeById(id, getState().runtimes);
       const clientWrapper = await createClientForRuntime(runtime);
 
       const deviceDescription = await clientWrapper.getDeviceDescription();
       const compatibilityReport = await clientWrapper.checkVersionCompatibility();
       const icon = await getRuntimeIcon(runtime, deviceDescription.channel);
 
       const {
+        CHROME_DEBUG_ENABLED,
         CONNECTION_PROMPT,
         PERMANENT_PRIVATE_BROWSING,
+        REMOTE_DEBUG_ENABLED,
         SERVICE_WORKERS_ENABLED,
       } = RUNTIME_PREFERENCE;
       const connectionPromptEnabled =
         await clientWrapper.getPreference(CONNECTION_PROMPT, false);
+      const extensionDebugEnabled =
+        isExtensionDebugSettingNeeded(runtime.type)
+          ? await clientWrapper.getPreference(CHROME_DEBUG_ENABLED, true) &&
+            await clientWrapper.getPreference(REMOTE_DEBUG_ENABLED, true)
+          : true;
       const privateBrowsing =
         await clientWrapper.getPreference(PERMANENT_PRIVATE_BROWSING, false);
       const serviceWorkersEnabled =
         await clientWrapper.getPreference(SERVICE_WORKERS_ENABLED, true);
       const serviceWorkersAvailable = serviceWorkersEnabled && !privateBrowsing;
 
       // Fenix specific workarounds are needed until we can get proper server side APIs
       // to detect Fenix and get the proper application names and versions.
@@ -144,16 +155,17 @@ function connectRuntime(id) {
       // retrieved from ADB, and not the Gecko version returned by the Device actor.
       const version = runtime.isFenix ?
         runtime.extra.adbPackageVersion : deviceDescription.version;
 
       const runtimeDetails = {
         clientWrapper,
         compatibilityReport,
         connectionPromptEnabled,
+        extensionDebugEnabled,
         info: {
           deviceName: deviceDescription.deviceName,
           icon,
           name: runtimeName,
           os: deviceDescription.os,
           type: runtime.type,
           version,
         },
@@ -255,16 +267,42 @@ function updateConnectionPromptSetting(c
       dispatch({ type: UPDATE_CONNECTION_PROMPT_SETTING_SUCCESS,
                  runtime, connectionPromptEnabled });
     } catch (e) {
       dispatch({ type: UPDATE_CONNECTION_PROMPT_SETTING_FAILURE, error: e });
     }
   };
 }
 
+function updateExtensionDebugSetting(extensionDebugEnabled) {
+  return async (dispatch, getState) => {
+    dispatch({ type: UPDATE_EXTENSION_DEBUG_SETTING_START });
+    try {
+      const runtime = getCurrentRuntime(getState().runtimes);
+      const { clientWrapper } = runtime.runtimeDetails;
+
+      const { CHROME_DEBUG_ENABLED, REMOTE_DEBUG_ENABLED } = RUNTIME_PREFERENCE;
+      await clientWrapper.setPreference(CHROME_DEBUG_ENABLED, extensionDebugEnabled);
+      await clientWrapper.setPreference(REMOTE_DEBUG_ENABLED, extensionDebugEnabled);
+
+      // Re-get actual value from the runtime.
+      const isChromeDebugEnabled =
+        await clientWrapper.getPreference(CHROME_DEBUG_ENABLED, extensionDebugEnabled);
+      const isRemoveDebugEnabled =
+        await clientWrapper.getPreference(REMOTE_DEBUG_ENABLED, extensionDebugEnabled);
+      extensionDebugEnabled = isChromeDebugEnabled && isRemoveDebugEnabled;
+
+      dispatch({ type: UPDATE_EXTENSION_DEBUG_SETTING_SUCCESS,
+                 runtime, extensionDebugEnabled });
+    } catch (e) {
+      dispatch({ type: UPDATE_EXTENSION_DEBUG_SETTING_FAILURE, error: e });
+    }
+  };
+}
+
 function updateMultiE10s() {
   return async (dispatch, getState) => {
     dispatch({ type: UPDATE_RUNTIME_MULTIE10S_START });
     try {
       const runtime = getCurrentRuntime(getState().runtimes);
       const { clientWrapper } = runtime.runtimeDetails;
       // Re-get actual value from the runtime.
       const { isMultiE10s } = await clientWrapper.getDeviceDescription();
@@ -477,12 +515,13 @@ function removeRuntimeListeners() {
 
 module.exports = {
   connectRuntime,
   createThisFirefoxRuntime,
   disconnectRuntime,
   removeRuntimeListeners,
   unwatchRuntime,
   updateConnectionPromptSetting,
+  updateExtensionDebugSetting,
   updateNetworkRuntimes,
   updateUSBRuntimes,
   watchRuntime,
 };
--- a/devtools/client/aboutdebugging-new/src/base.css
+++ b/devtools/client/aboutdebugging-new/src/base.css
@@ -154,16 +154,21 @@ p, h1 {
   white-space: nowrap;
 }
 
 /* Technical text that should use a monospace font, such as code, error messages. */
 .technical-text {
   font-family: var(--monospace-font-family);
 }
 
+/* Text that is not selectable */
+.unselectable-text {
+  -moz-user-select: none;
+}
+
 /* Links that need to look like current text */
 .undecorated-link,
 .undecorated-link:hover {
   text-decoration: none;
   color: currentColor;
 }
 
 /* Text needs to wrap anywhere */
@@ -367,16 +372,23 @@ Form controls
   height: 100%;
 
   border: 1px solid var(--box-border-color);
   border-radius: 2px;
   color: var(--text-color);
   background-color: var(--box-background);
 }
 
+/* Standard checkbox, from Photon */
+.default-checkbox {
+  height: calc(var(--base-unit) * 4);
+  margin-inline-end: var(--base-unit);
+  width: calc(var(--base-unit) * 4);
+}
+
 /*
 * Other UI components
 */
 
 /*
 * A small, colored badge.
 * NOTE: styles borrowed from Photon's micro buttons (there aren't badges)
 */
new file mode 100644
--- /dev/null
+++ b/devtools/client/aboutdebugging-new/src/components/ExtensionDebugSetting.js
@@ -0,0 +1,77 @@
+/* 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";
+
+const { createFactory, PureComponent } = require("devtools/client/shared/vendor/react");
+const dom = require("devtools/client/shared/vendor/react-dom-factories");
+const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
+
+const FluentReact = require("devtools/client/shared/vendor/fluent-react");
+const Localized = createFactory(FluentReact.Localized);
+
+const Actions = require("../actions/index");
+
+const DOC_URL =
+  "https://developer.mozilla.org/docs/Tools/about:debugging#Enabling_add-on_debugging";
+
+class ExtensionDebugSetting extends PureComponent {
+  static get propTypes() {
+    return {
+      className: PropTypes.string,
+      dispatch: PropTypes.func.isRequired,
+      extensionDebugEnabled: PropTypes.bool.isRequired,
+    };
+  }
+
+  onToggle() {
+    const { extensionDebugEnabled, dispatch } = this.props;
+    dispatch(Actions.updateExtensionDebugSetting(!extensionDebugEnabled));
+  }
+
+  renderCheckbox() {
+    const { extensionDebugEnabled } = this.props;
+
+    return dom.input(
+      {
+        type: "checkbox",
+        id: "extension-debug-setting-input",
+        className: "default-checkbox  qa-extension-debug-checkbox",
+        checked: extensionDebugEnabled,
+        onChange: () => this.onToggle(),
+      }
+    );
+  }
+
+  renderLabel() {
+    return Localized(
+      {
+        id: "about-debugging-extension-debug-setting-label",
+        a: dom.a({
+          href: DOC_URL,
+          target: "_blank",
+        }),
+      },
+      dom.label(
+        {
+          className: "unselectable-text",
+          htmlFor: "extension-debug-setting-input",
+        },
+        "Enable extension debugging [Learn more]"
+      )
+    );
+  }
+
+  render() {
+    const { className } = this.props;
+
+    return dom.aside(
+      { className },
+      this.renderCheckbox(),
+      this.renderLabel(),
+    );
+  }
+}
+
+module.exports = ExtensionDebugSetting;
--- a/devtools/client/aboutdebugging-new/src/components/RuntimeActions.js
+++ b/devtools/client/aboutdebugging-new/src/components/RuntimeActions.js
@@ -7,21 +7,24 @@
 const { createFactory, PureComponent } = require("devtools/client/shared/vendor/react");
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
 
 const FluentReact = require("devtools/client/shared/vendor/fluent-react");
 const Localized = createFactory(FluentReact.Localized);
 
 const ConnectionPromptSetting = createFactory(require("./ConnectionPromptSetting"));
+const ExtensionDebugSetting = createFactory(require("./ExtensionDebugSetting"));
 
 const Actions = require("../actions/index");
 const { RUNTIMES } = require("../constants");
 const Types = require("../types/index");
 
+const { isExtensionDebugSettingNeeded } = require("../modules/debug-target-support");
+
 class RuntimeActions extends PureComponent {
   static get propTypes() {
     return {
       dispatch: PropTypes.func.isRequired,
       runtimeDetails: Types.runtimeDetails,
       runtimeId: PropTypes.string.isRequired,
     };
   }
@@ -37,16 +40,27 @@ class RuntimeActions extends PureCompone
     return runtimeId !== RUNTIMES.THIS_FIREFOX
              ? ConnectionPromptSetting({
                  connectionPromptEnabled,
                  dispatch,
              })
              : null;
   }
 
+  renderExtensionDebugSetting() {
+    const { dispatch, runtimeDetails } = this.props;
+    const { extensionDebugEnabled, info } = runtimeDetails;
+    return isExtensionDebugSettingNeeded(info.type)
+             ? ExtensionDebugSetting({
+                 dispatch,
+                 extensionDebugEnabled,
+             })
+             : null;
+  }
+
   renderProfileButton() {
     const { runtimeId } = this.props;
 
     return runtimeId !== RUNTIMES.THIS_FIREFOX
          ? Localized(
            {
              id: "about-debugging-runtime-profile-button2",
            },
@@ -58,18 +72,22 @@ class RuntimeActions extends PureCompone
              "about-debugging-runtime-profile-button2"
            ),
          )
          : null;
   }
 
   render() {
     return dom.div(
-      {
-        className: "runtime-actions__toolbar",
-      },
-      this.renderProfileButton(),
-      this.renderConnectionPromptSetting(),
+      {},
+      dom.div(
+        {
+          className: "runtime-actions__toolbar",
+        },
+        this.renderProfileButton(),
+        this.renderConnectionPromptSetting(),
+      ),
+      this.renderExtensionDebugSetting(),
     );
   }
 }
 
 module.exports = RuntimeActions;
--- a/devtools/client/aboutdebugging-new/src/components/RuntimePage.js
+++ b/devtools/client/aboutdebugging-new/src/components/RuntimePage.js
@@ -9,16 +9,17 @@ const { createFactory, PureComponent } =
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
 
 const FluentReact = require("devtools/client/shared/vendor/fluent-react");
 const Localized = createFactory(FluentReact.Localized);
 
 const CompatibilityWarning = createFactory(require("./CompatibilityWarning"));
 const DebugTargetPane = createFactory(require("./debugtarget/DebugTargetPane"));
+const ExtensionAction = createFactory(require("./debugtarget/ExtensionAction"));
 const ExtensionDetail = createFactory(require("./debugtarget/ExtensionDetail"));
 const InspectAction = createFactory(require("./debugtarget/InspectAction"));
 const ProfilerDialog = createFactory(require("./ProfilerDialog"));
 const RuntimeActions = createFactory(require("./RuntimeActions"));
 const RuntimeInfo = createFactory(require("./RuntimeInfo"));
 const ServiceWorkerAction = createFactory(require("./debugtarget/ServiceWorkerAction"));
 const ServiceWorkerAdditionalActions =
   createFactory(require("./debugtarget/ServiceWorkerAdditionalActions"));
@@ -160,26 +161,26 @@ class RuntimePage extends PureComponent 
                                  null,
                                  TabDetail,
                                  DEBUG_TARGET_PANE.TAB,
                                  "about-debugging-runtime-tabs"),
       this.renderDebugTargetPane("Temporary Extensions",
                                  this.getIconByType(DEBUG_TARGETS.EXTENSION),
                                  temporaryExtensions,
                                  this.renderTemporaryExtensionInstallSection(),
-                                 InspectAction,
+                                 ExtensionAction,
                                  TemporaryExtensionAdditionalActions,
                                  TemporaryExtensionDetail,
                                  DEBUG_TARGET_PANE.TEMPORARY_EXTENSION,
                                  "about-debugging-runtime-temporary-extensions"),
       this.renderDebugTargetPane("Extensions",
                                  this.getIconByType(DEBUG_TARGETS.EXTENSION),
                                  installedExtensions,
                                  null,
-                                 InspectAction,
+                                 ExtensionAction,
                                  null,
                                  ExtensionDetail,
                                  DEBUG_TARGET_PANE.INSTALLED_EXTENSION,
                                  "about-debugging-runtime-extensions"),
       this.renderDebugTargetPane("Service Workers",
                                  this.getIconByType(DEBUG_TARGETS.WORKER),
                                  serviceWorkers,
                                  null,
new file mode 100644
--- /dev/null
+++ b/devtools/client/aboutdebugging-new/src/components/debugtarget/ExtensionAction.js
@@ -0,0 +1,45 @@
+/* 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";
+
+const { connect } = require("devtools/client/shared/vendor/react-redux");
+const { createFactory, PureComponent } = require("devtools/client/shared/vendor/react");
+const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
+
+const InspectAction = createFactory(require("./InspectAction"));
+
+const Types = require("../../types/index");
+
+const { getCurrentRuntimeDetails } = require("../../modules/runtimes-state-helper");
+
+/**
+ * This component provides components that inspect extension.
+ */
+class ExtensionAction extends PureComponent {
+  static get propTypes() {
+    return {
+      dispatch: PropTypes.func.isRequired,
+      runtimeDetails: Types.runtimeDetails.isRequired,
+      target: Types.debugTarget.isRequired,
+    };
+  }
+
+  render() {
+    const { dispatch, runtimeDetails, target } = this.props;
+    const { extensionDebugEnabled } = runtimeDetails;
+    return InspectAction({
+      disabled: !extensionDebugEnabled,
+      dispatch,
+      target,
+    });
+  }
+}
+
+const mapStateToProps = state => {
+  return {
+    runtimeDetails: getCurrentRuntimeDetails(state.runtimes),
+  };
+};
+module.exports = connect(mapStateToProps)(ExtensionAction);
--- a/devtools/client/aboutdebugging-new/src/components/debugtarget/moz.build
+++ b/devtools/client/aboutdebugging-new/src/components/debugtarget/moz.build
@@ -4,16 +4,17 @@
 
 DevToolsModules(
     'DebugTargetItem.css',
     'DebugTargetItem.js',
     'DebugTargetList.css',
     'DebugTargetList.js',
     'DebugTargetPane.css',
     'DebugTargetPane.js',
+    'ExtensionAction.js',
     'ExtensionDetail.js',
     'FieldPair.css',
     'FieldPair.js',
     'InspectAction.js',
     'ProcessDetail.js',
     'ServiceWorkerAction.css',
     'ServiceWorkerAction.js',
     'ServiceWorkerAdditionalActions.js',
--- a/devtools/client/aboutdebugging-new/src/components/moz.build
+++ b/devtools/client/aboutdebugging-new/src/components/moz.build
@@ -9,16 +9,17 @@ DIRS += [
     'sidebar',
 ]
 
 DevToolsModules(
     'App.css',
     'App.js',
     'CompatibilityWarning.js',
     'ConnectionPromptSetting.js',
+    'ExtensionDebugSetting.js',
     'ProfilerDialog.css',
     'ProfilerDialog.js',
     'RuntimeActions.css',
     'RuntimeActions.js',
     'RuntimeInfo.css',
     'RuntimeInfo.js',
     'RuntimePage.js',
     'ServiceWorkersWarning.js',
--- a/devtools/client/aboutdebugging-new/src/constants.js
+++ b/devtools/client/aboutdebugging-new/src/constants.js
@@ -56,16 +56,19 @@ const actionTypes = {
   TEMPORARY_EXTENSION_RELOAD_SUCCESS: "TEMPORARY_EXTENSION_RELOAD_SUCCESS",
   THIS_FIREFOX_RUNTIME_CREATED: "THIS_FIREFOX_RUNTIME_CREATED",
   UNWATCH_RUNTIME_FAILURE: "UNWATCH_RUNTIME_FAILURE",
   UNWATCH_RUNTIME_START: "UNWATCH_RUNTIME_START",
   UNWATCH_RUNTIME_SUCCESS: "UNWATCH_RUNTIME_SUCCESS",
   UPDATE_CONNECTION_PROMPT_SETTING_FAILURE: "UPDATE_CONNECTION_PROMPT_SETTING_FAILURE",
   UPDATE_CONNECTION_PROMPT_SETTING_START: "UPDATE_CONNECTION_PROMPT_SETTING_START",
   UPDATE_CONNECTION_PROMPT_SETTING_SUCCESS: "UPDATE_CONNECTION_PROMPT_SETTING_SUCCESS",
+  UPDATE_EXTENSION_DEBUG_SETTING_FAILURE: "UPDATE_EXTENSION_DEBUG_SETTING_FAILURE",
+  UPDATE_EXTENSION_DEBUG_SETTING_START: "UPDATE_EXTENSION_DEBUG_SETTING_START",
+  UPDATE_EXTENSION_DEBUG_SETTING_SUCCESS: "UPDATE_EXTENSION_DEBUG_SETTING_SUCCESS",
   UPDATE_RUNTIME_MULTIE10S_FAILURE: "UPDATE_RUNTIME_MULTIE10S_FAILURE",
   UPDATE_RUNTIME_MULTIE10S_START: "UPDATE_RUNTIME_MULTIE10S_START",
   UPDATE_RUNTIME_MULTIE10S_SUCCESS: "UPDATE_RUNTIME_MULTIE10S_SUCCESS",
   USB_RUNTIMES_SCAN_START: "USB_RUNTIMES_SCAN_START",
   USB_RUNTIMES_SCAN_SUCCESS: "USB_RUNTIMES_SCAN_SUCCESS",
   WATCH_RUNTIME_FAILURE: "WATCH_RUNTIME_FAILURE",
   WATCH_RUNTIME_START: "WATCH_RUNTIME_START",
   WATCH_RUNTIME_SUCCESS: "WATCH_RUNTIME_SUCCESS",
@@ -108,18 +111,20 @@ const PREFERENCES = {
   SHOW_HIDDEN_ADDONS: "devtools.aboutdebugging.showHiddenAddons",
   // Preference to store the last path used for loading a temporary extension.
   TEMPORARY_EXTENSION_PATH: "devtools.aboutdebugging.tmpExtDirPath",
   // Preference that disables installing extensions when set to false.
   XPINSTALL_ENABLED: "xpinstall.enabled",
 };
 
 const RUNTIME_PREFERENCE = {
+  CHROME_DEBUG_ENABLED: "devtools.chrome.enabled",
   CONNECTION_PROMPT: "devtools.debugger.prompt-connection",
   PERMANENT_PRIVATE_BROWSING: "browser.privatebrowsing.autostart",
+  REMOTE_DEBUG_ENABLED: "devtools.debugger.remote-enabled",
   SERVICE_WORKERS_ENABLED: "dom.serviceWorkers.enabled",
 };
 
 const RUNTIMES = {
   NETWORK: CONNECTION_TYPES.NETWORK,
   THIS_FIREFOX: CONNECTION_TYPES.THIS_FIREFOX,
   USB: CONNECTION_TYPES.USB,
 };
--- a/devtools/client/aboutdebugging-new/src/modules/debug-target-support.js
+++ b/devtools/client/aboutdebugging-new/src/modules/debug-target-support.js
@@ -50,15 +50,28 @@ const THIS_FIREFOX_DEBUG_TARGET_PANES = 
 
 const SUPPORTED_TARGET_PANE_BY_RUNTIME = {
   [RUNTIMES.THIS_FIREFOX]: THIS_FIREFOX_DEBUG_TARGET_PANES,
   [RUNTIMES.USB]: REMOTE_DEBUG_TARGET_PANES,
   [RUNTIMES.NETWORK]: REMOTE_DEBUG_TARGET_PANES,
 };
 
 /**
+ * If extension debug setting is needed for given runtime type, return true.
+ *
+ * @param {String} runtimeType
+ * @return {bool} true: needed
+ */
+function isExtensionDebugSettingNeeded(runtimeType) {
+  // Debugging local addons for This Firefox reuses the Browser Toolbox, which requires
+  // some preferences to be enabled.
+  return runtimeType === RUNTIMES.THIS_FIREFOX;
+}
+exports.isExtensionDebugSettingNeeded = isExtensionDebugSettingNeeded;
+
+/**
  * A debug target pane is more specialized than a debug target. For instance EXTENSION is
  * a DEBUG_TARGET but INSTALLED_EXTENSION and TEMPORARY_EXTENSION are DEBUG_TARGET_PANES.
  */
 function isSupportedDebugTargetPane(runtimeType, debugTargetPaneKey) {
   return SUPPORTED_TARGET_PANE_BY_RUNTIME[runtimeType].includes(debugTargetPaneKey);
 }
 exports.isSupportedDebugTargetPane = isSupportedDebugTargetPane;
--- a/devtools/client/aboutdebugging-new/src/reducers/runtimes-state.js
+++ b/devtools/client/aboutdebugging-new/src/reducers/runtimes-state.js
@@ -8,16 +8,17 @@ const {
   CONNECT_RUNTIME_CANCEL,
   CONNECT_RUNTIME_FAILURE,
   CONNECT_RUNTIME_NOT_RESPONDING,
   CONNECT_RUNTIME_START,
   CONNECT_RUNTIME_SUCCESS,
   DISCONNECT_RUNTIME_SUCCESS,
   RUNTIMES,
   UPDATE_CONNECTION_PROMPT_SETTING_SUCCESS,
+  UPDATE_EXTENSION_DEBUG_SETTING_SUCCESS,
   UPDATE_RUNTIME_MULTIE10S_SUCCESS,
   REMOTE_RUNTIMES_UPDATED,
   SELECTED_RUNTIME_ID_UPDATED,
   THIS_FIREFOX_RUNTIME_CREATED,
 } = require("../constants");
 
 const {
   findRuntimeById,
@@ -146,16 +147,25 @@ function runtimesReducer(state = Runtime
       const { connectionPromptEnabled } = action;
       const { id: runtimeId } = action.runtime;
       const runtime = findRuntimeById(runtimeId, state);
       const runtimeDetails =
         Object.assign({}, runtime.runtimeDetails, { connectionPromptEnabled });
       return _updateRuntimeById(runtimeId, { runtimeDetails }, state);
     }
 
+    case UPDATE_EXTENSION_DEBUG_SETTING_SUCCESS: {
+      const { extensionDebugEnabled } = action;
+      const { id: runtimeId } = action.runtime;
+      const runtime = findRuntimeById(runtimeId, state);
+      const runtimeDetails =
+        Object.assign({}, runtime.runtimeDetails, { extensionDebugEnabled });
+      return _updateRuntimeById(runtimeId, { runtimeDetails }, state);
+    }
+
     case UPDATE_RUNTIME_MULTIE10S_SUCCESS: {
       const { isMultiE10s } = action;
       const { id: runtimeId } = action.runtime;
       const runtime = findRuntimeById(runtimeId, state);
       const runtimeDetails =
         Object.assign({}, runtime.runtimeDetails, { isMultiE10s });
       return _updateRuntimeById(runtimeId, { runtimeDetails }, state);
     }
--- a/devtools/client/aboutdebugging-new/src/types/runtime.js
+++ b/devtools/client/aboutdebugging-new/src/types/runtime.js
@@ -56,16 +56,20 @@ const runtimeDetails = {
 
   // compatibility report to check if the target runtime is in range of the backward
   // compatibility policy for DevTools remote debugging.
   compatibilityReport: PropTypes.shape(compatibilityReport).isRequired,
 
   // reflect devtools.debugger.prompt-connection preference of this runtime
   connectionPromptEnabled: PropTypes.bool.isRequired,
 
+  // In case that runtime is this-firefox, reflects devtools.chrome.enabled and
+  // devtools.debugger.remote-enabled preference. Otherwise, this sould be true.
+  extensionDebugEnabled: PropTypes.bool.isRequired,
+
   // runtime information
   info: PropTypes.shape(runtimeInfo).isRequired,
 
   // True if this runtime supports multiple content processes
   // This might be undefined when connecting to runtimes older than Fx 66
   isMultiE10s: PropTypes.bool,
 
   // True if service workers should be available in the target runtime. Service workers
--- a/devtools/client/aboutdebugging-new/test/browser/browser.ini
+++ b/devtools/client/aboutdebugging-new/test/browser/browser.ini
@@ -22,25 +22,25 @@ support-files =
   resources/test-temporary-extension/*
   test-tab-favicons.html
   !/devtools/client/shared/test/shared-head.js
   !/devtools/client/shared/test/shared-redux-head.js
   !/devtools/client/shared/test/telemetry-test-helpers.js
 
 [browser_aboutdebugging_addons_debug_console.js]
 tags = webextensions
-[browser_aboutdebugging_addons_debug_debugger.js]
-tags = webextensions
 [browser_aboutdebugging_addons_debug_inspector.js]
 tags = webextensions
 [browser_aboutdebugging_addons_debug_nobg.js]
 tags = webextensions
 [browser_aboutdebugging_addons_debug_popup.js]
 skip-if = (verify && debug) || (debug && os == "linux" && bits == 64) # verify: crashes on shutdown, timeouts linux debug Bug 1299001
 tags = webextensions
+[browser_aboutdebugging_addons_debug_setting_thisfirefox.js]
+[browser_aboutdebugging_addons_debug_setting_usb.js]
 [browser_aboutdebugging_addons_manifest_url.js]
 skip-if = (os == 'linux' && bits == 32) # ADB start() fails on linux 32, see Bug 1499638
 [browser_aboutdebugging_addons_remote_runtime.js]
 [browser_aboutdebugging_addons_temporary_addon_buttons.js]
 skip-if = (os == 'win') # On windows the AddonManager locks the XPI file loaded as a temporary extension and we can not test the reload of the extension.
 [browser_aboutdebugging_addons_temporary_id_message.js]
 [browser_aboutdebugging_addons_temporary_install_error.js]
 [browser_aboutdebugging_addons_temporary_install_path.js]
deleted file mode 100644
--- a/devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_addons_debug_debugger.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-"use strict";
-
-/* import-globals-from helper-addons.js */
-Services.scriptloader.loadSubScript(CHROME_URL_ROOT + "helper-addons.js", this);
-
-add_task(async () => {
-  const EXTENSION_NAME = "temporary-web-extension";
-  const EXTENSION_ID = "test-devtools@mozilla.org";
-
-  await enableExtensionDebugging();
-
-  info("The debugger should show the source codes of extension even if " +
-       "devtools.chrome.enabled and devtools.debugger.remote-enabled are off");
-  await pushPref("devtools.chrome.enabled", false);
-  await pushPref("devtools.debugger.remote-enabled", false);
-
-  const { document, tab, window } = await openAboutDebugging();
-  await selectThisFirefoxPage(document, window.AboutDebugging.store);
-
-  await installTemporaryExtensionFromXPI({
-    background: function() {
-      window.someRandomMethodName = () => {
-        // This will not be referred from anywhere.
-        // However this is necessary to show as the source code in the debugger.
-      };
-    },
-    id: EXTENSION_ID,
-    name: EXTENSION_NAME,
-  }, document);
-
-  const { devtoolsTab, devtoolsWindow } =
-    await openAboutDevtoolsToolbox(document, tab, window, EXTENSION_NAME);
-  const toolbox = getToolbox(devtoolsWindow);
-  await toolbox.selectTool("jsdebugger");
-  const { panelWin } = toolbox.getCurrentPanel();
-
-  info("Check the state of redux");
-  ok(panelWin.dbg.store.getState().debuggee.isWebExtension,
-     "isWebExtension flag in debuggee is true");
-
-  info("Check whether the element displays correctly");
-  const sourceList = panelWin.document.querySelector(".sources-list");
-  ok(sourceList, "Source list element displays correctly");
-  ok(sourceList.textContent.includes("moz-extension"),
-     "moz-extension displays correctly");
-
-  await closeAboutDevtoolsToolbox(document, devtoolsTab, window);
-  await removeTemporaryExtension(EXTENSION_NAME, document);
-  await removeTab(tab);
-});
new file mode 100644
--- /dev/null
+++ b/devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_addons_debug_setting_thisfirefox.js
@@ -0,0 +1,110 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/* import-globals-from helper-addons.js */
+Services.scriptloader.loadSubScript(CHROME_URL_ROOT + "helper-addons.js", this);
+/* import-globals-from helper-collapsibilities.js */
+Services.scriptloader.loadSubScript(CHROME_URL_ROOT + "helper-collapsibilities.js", this);
+
+const TEMPORARY_EXTENSION_ID = "test-devtools-webextension@mozilla.org";
+const TEMPORARY_EXTENSION_NAME = "test-devtools-webextension";
+const REGULAR_EXTENSION_ID = "packaged-extension@tests";
+const REGULAR_EXTENSION_NAME = "Packaged extension";
+
+const TEST_DATA = [
+  {
+    chromeEnabled: false,
+    debuggerRemoteEnable: false,
+    isEnabledAtInitial: false,
+  }, {
+    chromeEnabled: false,
+    debuggerRemoteEnable: true,
+    isEnabledAtInitial: false,
+  }, {
+    chromeEnabled: true,
+    debuggerRemoteEnable: false,
+    isEnabledAtInitial: false,
+  }, {
+    chromeEnabled: true,
+    debuggerRemoteEnable: true,
+    isEnabledAtInitial: true,
+  },
+];
+
+/**
+ * Check the state of extension debug setting checkbox, inspect buttons and prefs on
+ * this-firefox at initializing and after toggling.
+ */
+add_task(async function() {
+  info("Force all debug target panes to be expanded");
+  prepareCollapsibilitiesTest();
+
+  for (const testData of TEST_DATA) {
+    await testState(testData);
+  }
+});
+
+async function testState({ chromeEnabled, debuggerRemoteEnable, isEnabledAtInitial }) {
+  info(`Test for chromeEnabled: ${ chromeEnabled }, ` +
+       `debuggerRemoteEnable:${ debuggerRemoteEnable }`);
+
+  info("Set initial state for test");
+  await pushPref("devtools.chrome.enabled", chromeEnabled);
+  await pushPref("devtools.debugger.remote-enabled", debuggerRemoteEnable);
+
+  const { document, tab, window } = await openAboutDebugging();
+  await selectThisFirefoxPage(document, window.AboutDebugging.store);
+  await installExtensions(document);
+
+  info("Check the status of extension debug setting checkbox and inspect buttons");
+  const checkbox = document.querySelector(".qa-extension-debug-checkbox");
+  ok(checkbox, "Extension debug setting checkbox exists");
+  is(checkbox.checked, isEnabledAtInitial, "The state of checkbox is correct");
+  assertInspectButtons(isEnabledAtInitial, document);
+
+  info("Check the status after toggling checkbox");
+  checkbox.click();
+  await waitUntil(() => checkbox.checked !== isEnabledAtInitial);
+  ok(true, "The state of checkbox is changed correctly after toggling");
+  assertPreferences(!isEnabledAtInitial);
+  assertInspectButtons(!isEnabledAtInitial, document);
+
+  await uninstallExtensions(document);
+  await removeTab(tab);
+}
+
+function assertPreferences(expected) {
+  for (const pref of ["devtools.chrome.enabled", "devtools.debugger.remote-enabled"]) {
+    is(Services.prefs.getBoolPref(pref), expected, `${ pref } should be ${expected}`);
+  }
+}
+
+function assertInspectButtons(shouldBeEnabled, document) {
+  assertInspectButtonsOnCategory(shouldBeEnabled, "Temporary Extensions", document);
+  assertInspectButtonsOnCategory(shouldBeEnabled, "Extensions", document);
+  // Inspect button on Tabs category should be always enabled.
+  assertInspectButtonsOnCategory(true, "Tabs", document);
+}
+
+function assertInspectButtonsOnCategory(shouldBeEnabled, category, document) {
+  const pane = getDebugTargetPane(category, document);
+  const buttons = pane.querySelectorAll(".qa-debug-target-inspect-button");
+  ok([...buttons].every(b => b.disabled !== shouldBeEnabled),
+     `disabled attribute should be ${ !shouldBeEnabled } on ${ category }`);
+}
+
+async function installExtensions(document) {
+  await installTemporaryExtensionFromXPI({
+    id: TEMPORARY_EXTENSION_ID,
+    name: TEMPORARY_EXTENSION_NAME,
+  }, document);
+
+  await installRegularExtension("resources/packaged-extension/packaged-extension.xpi");
+}
+
+async function uninstallExtensions(document) {
+  await removeTemporaryExtension(TEMPORARY_EXTENSION_NAME, document);
+  await removeExtension(REGULAR_EXTENSION_ID, REGULAR_EXTENSION_NAME, document);
+}
new file mode 100644
--- /dev/null
+++ b/devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_addons_debug_setting_usb.js
@@ -0,0 +1,41 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/* import-globals-from helper-collapsibilities.js */
+Services.scriptloader.loadSubScript(CHROME_URL_ROOT + "helper-collapsibilities.js", this);
+
+/**
+ * Check extension debug setting on USB runtime.
+ */
+add_task(async function() {
+  info("Force all debug target panes to be expanded");
+  prepareCollapsibilitiesTest();
+
+  info("Set initial state for test");
+  await pushPref("devtools.debugger.remote-enabled", false);
+
+  // Setup USB devices mocks
+  const mocks = new Mocks();
+  const usbRuntime = mocks.createUSBRuntime("1337id", {
+    deviceName: "Fancy Phone",
+    name: "Lorem ipsum",
+  });
+  const extension = { name: "Test extension name", debuggable: true };
+  usbRuntime.listAddons = () => [extension];
+
+  const { document, tab, window } = await openAboutDebugging();
+  await selectThisFirefoxPage(document, window.AboutDebugging.store);
+  mocks.emitUSBUpdate();
+
+  info("Check the status of extension debug setting checkbox and inspect buttons");
+  await connectToRuntime("Fancy Phone", document);
+  await selectRuntime("Fancy Phone", "Lorem ipsum", document);
+  ok(!document.querySelector(".qa-extension-debug-checkbox"),
+     "Extension debug setting checkbox should not exist");
+  const buttons = document.querySelectorAll(".qa-debug-target-inspect-button");
+  ok([...buttons].every(b => !b.disabled), "All inspect buttons should be enabled");
+
+  await removeTab(tab);
+});
--- a/devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_devtoolstoolbox_tooltip_markupview.js
+++ b/devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_devtoolstoolbox_tooltip_markupview.js
@@ -8,19 +8,16 @@ Services.scriptloader.loadSubScript(CHRO
 
 /**
  * Test tooltip of markup view on about:devtools-toolbox page.
  */
 add_task(async function() {
   info("Force all debug target panes to be expanded");
   prepareCollapsibilitiesTest();
 
-  info("Turn on devtools.chrome.enabled to show event badges");
-  await pushPref("devtools.chrome.enabled", true);
-
   const { document, tab, window } = await openAboutDebugging();
   await selectThisFirefoxPage(document, window.AboutDebugging.store);
   const { devtoolsDocument, devtoolsTab, devtoolsWindow } =
     await openAboutDevtoolsToolbox(document, tab, window);
 
   info("Select inspector tool");
   const toolbox = getToolbox(devtoolsWindow);
   await toolbox.selectTool("inspector");
--- a/devtools/client/aboutdebugging-new/test/browser/helper-addons.js
+++ b/devtools/client/aboutdebugging-new/test/browser/helper-addons.js
@@ -9,16 +9,19 @@ function _getSupportsFile(path) {
   const cr = Cc["@mozilla.org/chrome/chrome-registry;1"]
     .getService(Ci.nsIChromeRegistry);
   const uri = Services.io.newURI(CHROME_URL_ROOT + path);
   const fileurl = cr.convertChromeURL(uri);
   return fileurl.QueryInterface(Ci.nsIFileURL);
 }
 
 async function enableExtensionDebugging() {
+  // Force enabling of addons debugging
+  await pushPref("devtools.chrome.enabled", true);
+  await pushPref("devtools.debugger.remote-enabled", true);
   // Disable security prompt
   await pushPref("devtools.debugger.prompt-connection", false);
   // Enable Browser toolbox test script execution via env variable
   await pushPref("devtools.browser-toolbox.allow-unsafe-script", true);
 }
 /* exported enableExtensionDebugging */
 
 /**
--- a/devtools/client/debugger/src/actions/navigation.js
+++ b/devtools/client/debugger/src/actions/navigation.js
@@ -43,30 +43,24 @@ export function willNavigate(event: Obje
 
     dispatch({
       type: "NAVIGATE",
       mainThread: { ...thread, url: event.url }
     });
   };
 }
 
-export function connect(
-  url: string,
-  actor: string,
-  canRewind: boolean,
-  isWebExtension: boolean
-) {
+export function connect(url: string, actor: string, canRewind: boolean) {
   return async function({ dispatch }: ThunkArgs) {
     await dispatch(updateWorkers());
     dispatch(
       ({
         type: "CONNECT",
         mainThread: { url, actor, type: -1, name: "" },
-        canRewind,
-        isWebExtension
+        canRewind
       }: Action)
     );
   };
 }
 
 /**
  * @memberof actions/navigation
  * @static
--- a/devtools/client/debugger/src/client/firefox.js
+++ b/devtools/client/debugger/src/client/firefox.js
@@ -53,18 +53,17 @@ export async function onConnect(connecti
   // the debugger (if it's paused already, or if loading the page from
   // bfcache) so explicity fire `newSource` events for all returned
   // sources.
   const sourceInfo = await clientCommands.fetchSources();
   const traits = tabTarget.traits;
   await actions.connect(
     tabTarget.url,
     threadClient.actor,
-    traits && traits.canRewind,
-    tabTarget.isWebExtension
+    traits && traits.canRewind
   );
   await actions.newGeneratedSources(sourceInfo);
 
   // If the threadClient is already paused, make sure to show a
   // paused state.
   const pausedPacket = threadClient.getLastPausePacket();
   if (pausedPacket) {
     clientEvents.paused(threadClient, "paused", pausedPacket);
--- a/devtools/client/debugger/src/reducers/debuggee.js
+++ b/devtools/client/debugger/src/reducers/debuggee.js
@@ -21,31 +21,29 @@ import type { Action } from "../actions/
 export type DebuggeeState = {
   workers: WorkerList,
   mainThread: MainThread
 };
 
 export function initialDebuggeeState(): DebuggeeState {
   return {
     workers: [],
-    mainThread: { actor: "", url: "", type: -1, name: "" },
-    isWebExtension: false
+    mainThread: { actor: "", url: "", type: -1, name: "" }
   };
 }
 
 export default function debuggee(
   state: DebuggeeState = initialDebuggeeState(),
   action: Action
 ): DebuggeeState {
   switch (action.type) {
     case "CONNECT":
       return {
         ...state,
-        mainThread: { ...action.mainThread, name: L10N.getStr("mainThread") },
-        isWebExtension: action.isWebExtension
+        mainThread: { ...action.mainThread, name: L10N.getStr("mainThread") }
       };
     case "INSERT_WORKERS":
       return insertWorkers(state, action.workers);
     case "REMOVE_WORKERS":
       const { workers } = action;
       return {
         ...state,
         workers: state.workers.filter(w => !workers.includes(w.actor))
--- a/devtools/client/debugger/src/reducers/sources.js
+++ b/devtools/client/debugger/src/reducers/sources.js
@@ -792,47 +792,44 @@ export function getSelectedSourceId(stat
 }
 
 export function getProjectDirectoryRoot(state: OuterState): string {
   return state.sources.projectDirectoryRoot;
 }
 
 const queryAllDisplayedSources: ReduceQuery<
   SourceResource,
-  {| projectDirectoryRoot: string,
-     chromeAndExtensionsEnabled: boolean,
-     debuggeeIsWebExtension: boolean |},
+  {| projectDirectoryRoot: string, chromeAndExtensionsEnabled: boolean |},
   Array<SourceId>
 > = makeReduceQuery(
   makeMapWithArgs(
     (
       resource,
       ident,
-      { projectDirectoryRoot, chromeAndExtensionsEnabled, debuggeeIsWebExtension }
+      { projectDirectoryRoot, chromeAndExtensionsEnabled }
     ) => ({
       id: resource.id,
       displayed:
         underRoot(resource, projectDirectoryRoot) &&
-        (!resource.isExtension || chromeAndExtensionsEnabled || debuggeeIsWebExtension)
+        (!resource.isExtension || chromeAndExtensionsEnabled)
     })
   ),
   items =>
     items.reduce((acc, { id, displayed }) => {
       if (displayed) {
         acc.push(id);
       }
       return acc;
     }, [])
 );
 
 function getAllDisplayedSources(state: OuterState): Array<SourceId> {
   return queryAllDisplayedSources(state.sources.sources, {
     projectDirectoryRoot: state.sources.projectDirectoryRoot,
-    chromeAndExtensionsEnabled: state.sources.chromeAndExtenstionsEnabled,
-    debuggeeIsWebExtension: state.debuggee.isWebExtension
+    chromeAndExtensionsEnabled: state.sources.chromeAndExtenstionsEnabled
   });
 }
 
 type GetDisplayedSourceIDsSelector = (
   OuterState & SourceActorOuterState
 ) => { [ThreadId]: Set<SourceId> };
 const getDisplayedSourceIDs: GetDisplayedSourceIDsSelector = createSelector(
   getThreadsBySource,
--- a/devtools/client/debugger/src/reducers/tests/sources.spec.js
+++ b/devtools/client/debugger/src/reducers/tests/sources.spec.js
@@ -62,68 +62,63 @@ const mockSourceActors: Array<SourceActo
 ]: any);
 
 describe("sources reducer", () => {
   it("should work", () => {
     let state = initialSourcesState();
     state = update(state, {
       type: "ADD_SOURCE",
       cx: mockcx,
-      debuggee: { isWebExtension: false },
       source: makeMockSource()
     });
     expect(getResourceIds(state.sources)).toHaveLength(1);
   });
 });
 
 describe("sources selectors", () => {
   it("should return all extensions when chrome preference enabled", () => {
     prefs.chromeAndExtenstionsEnabled = true;
     let state = initialSourcesState();
     state = {
       sources: update(state, {
         type: "ADD_SOURCES",
         cx: mockcx,
-        debuggee: { isWebExtension: false },
         sources: ((mockedSources: any): Source[])
       }),
       sourceActors: undefined
     };
     const insertAction = {
       type: "INSERT_SOURCE_ACTORS",
       items: mockSourceActors
     };
     state = {
-      debuggee: { isWebExtension: false },
       sources: update(state.sources, insertAction),
       sourceActors: updateSourceActors(state.sourceActors, insertAction)
     };
     const threadSources = getDisplayedSources(state);
     expect(Object.values(threadSources.foo)).toHaveLength(3);
   });
 
   it("should omit all extensions when chrome preference enabled", () => {
     prefs.chromeAndExtenstionsEnabled = false;
     let state = initialSourcesState();
     state = {
       sources: update(state, {
         type: "ADD_SOURCES",
         cx: mockcx,
-        debuggee: { isWebExtension: false },
         sources: ((mockedSources: any): Source[])
       }),
       sourceActors: undefined
     };
 
     const insertAction = {
       type: "INSERT_SOURCE_ACTORS",
       items: mockSourceActors
     };
 
     state = {
-      debuggee: { isWebExtension: false },
       sources: update(state.sources, insertAction),
       sourceActors: updateSourceActors(state.sourceActors, insertAction)
     };
     const threadSources = getDisplayedSources(state);
     expect(Object.values(threadSources.foo)).toHaveLength(1);
   });
 });
--- a/devtools/client/locales/en-US/aboutdebugging.ftl
+++ b/devtools/client/locales/en-US/aboutdebugging.ftl
@@ -251,16 +251,22 @@ about-debugging-connection-prompt-enable
 
 # Text of the connection prompt button displayed in Runtime pages, when the preference
 # "devtools.debugger.prompt-connection" is true on the target runtime.
 about-debugging-connection-prompt-disable-button = Disable connection prompt
 
 # Title of a modal dialog displayed on remote runtime pages after clicking on the Profile Runtime button.
 about-debugging-profiler-dialog-title2 = Profiler
 
+# Label of a checkbox displayed in the runtime page for "This Firefox".
+# This checkbox will toggle preferences that enable local addon debugging.
+# The "Learn more" link points to MDN.
+# https://developer.mozilla.org/docs/Tools/about:debugging#Enabling_add-on_debugging
+about-debugging-extension-debug-setting-label = Enable extension debugging. <a>Learn more</a>
+
 # Clicking on the header of a debug target category will expand or collapse the debug
 # target items in the category. This text is used as ’title’ attribute of the header,
 # to describe this feature.
 about-debugging-collapse-expand-debug-targets = Collapse / expand
 
 # Debug Targets strings
 
 # Displayed in the categories of "runtime" pages that don't have any debug target to