Backed out changeset 432b51c73e20 (bug 1463481) for devtools failures on several files. CLOSED TREE
authorCosmin Sabou <csabou@mozilla.com>
Thu, 24 May 2018 20:23:29 +0300
changeset 473956 c106211c6ed5e6a580da659f0a629e281b98bcf7
parent 473955 53a1f773dfd04205537635f22354ffb03a29eb38
child 473957 4816f8eef0ab4139e66d23107830d1ad1d28d147
push id9374
push userjlund@mozilla.com
push dateMon, 18 Jun 2018 21:43:20 +0000
treeherdermozilla-beta@160e085dfb0b [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1463481
milestone62.0a1
backs out432b51c73e203e36f2a80fa687018d15a0f90a11
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 changeset 432b51c73e20 (bug 1463481) for devtools failures on several files. CLOSED TREE
devtools/client/debugger/new/README.mozilla
devtools/client/debugger/new/dist/debugger.css
devtools/client/debugger/new/dist/vendors.js
devtools/client/debugger/new/src/actions/pause/extra.js
devtools/client/debugger/new/src/components/Editor/Preview/Popup.js
devtools/client/debugger/new/src/components/Editor/Tab.js
devtools/client/debugger/new/src/components/QuickOpenModal.js
devtools/client/debugger/new/src/components/SecondaryPanes/Frames/WhyPaused.js
devtools/client/debugger/new/src/components/shared/SearchInput.js
devtools/client/debugger/new/src/utils/preview.js
devtools/client/debugger/new/src/utils/source.js
devtools/client/debugger/new/src/utils/sources-tree/getURL.js
devtools/client/shared/components/reps/reps.js
devtools/client/shared/source-map/worker.js
--- a/devtools/client/debugger/new/README.mozilla
+++ b/devtools/client/debugger/new/README.mozilla
@@ -1,13 +1,13 @@
 This is the debugger.html project output.
 See https://github.com/devtools-html/debugger.html
 
-Version 58
+Version 57
 
-Comparison: https://github.com/devtools-html/debugger.html/compare/release-57...release-58
+Comparison: https://github.com/devtools-html/debugger.html/compare/release-56...release-57
 
 Packages:
 - babel-plugin-transform-es2015-modules-commonjs @6.26.2
 - babel-preset-react @6.24.1
 - react @16.2.0
 - react-dom @16.2.0
 - webpack @3.12.0
--- a/devtools/client/debugger/new/dist/debugger.css
+++ b/devtools/client/debugger/new/dist/debugger.css
@@ -1128,27 +1128,22 @@ html .toggle-button.end.vertical svg {
 }
 
 .search-field input.empty {
   color: var(--theme-highlight-orange);
 }
 
 .search-field .summary {
   line-height: 27px;
-  text-align: center;
   padding-right: 10px;
   color: var(--theme-body-color-inactive);
-  align-self: center;
-  padding-top: 1px;
-  white-space: nowrap;
 }
 
 .search-field.big .summary {
-  padding: 5px 0 5px 0;
-  line-height: 2rem;
+  line-height: 40px;
 }
 
 .search-field .search-nav-buttons {
   display: flex;
   user-select: none;
 }
 
 .search-field .search-nav-buttons .nav-btn {
--- a/devtools/client/debugger/new/dist/vendors.js
+++ b/devtools/client/debugger/new/dist/vendors.js
@@ -7938,20 +7938,16 @@ class Tree extends Component {
         depth,
         renderItem: this.props.renderItem,
         focused: focused === item,
         expanded: this.props.isExpanded(item),
         isExpandable: this._nodeIsExpandable(item),
         onExpand: this._onExpand,
         onCollapse: this._onCollapse,
         onClick: e => {
-          // We can stop the propagation since click handler on the node can be
-          // created in `renderItem`.
-          e.stopPropagation();
-
           // Since the user just clicked the node, there's no need to check if
           // it should be scrolled into view.
           this._focus(item, { preventAutoScroll: true });
           if (this.props.isExpanded(item)) {
             this.props.onCollapse(item);
           } else {
             this.props.onExpand(item, e.altKey);
           }
--- a/devtools/client/debugger/new/src/actions/pause/extra.js
+++ b/devtools/client/debugger/new/src/actions/pause/extra.js
@@ -55,17 +55,17 @@ async function getImmutableProps(express
 async function getExtraProps(getState, expression, result, evaluate) {
   const props = {};
   const component = (0, _selectors.inComponent)(getState());
 
   if (component) {
     props.react = await getReactProps(evaluate, component);
   }
 
-  if ((0, _preview.isImmutablePreview)(result)) {
+  if ((0, _preview.isImmutable)(result)) {
     props.immutable = await getImmutableProps(expression, evaluate);
   }
 
   return props;
 }
 
 function fetchExtra() {
   return async function ({
--- a/devtools/client/debugger/new/src/components/Editor/Preview/Popup.js
+++ b/devtools/client/debugger/new/src/components/Editor/Preview/Popup.js
@@ -26,18 +26,16 @@ var _Popover = require("../../shared/Pop
 var _Popover2 = _interopRequireDefault(_Popover);
 
 var _PreviewFunction = require("../../shared/PreviewFunction");
 
 var _PreviewFunction2 = _interopRequireDefault(_PreviewFunction);
 
 var _editor = require("../../../utils/editor/index");
 
-var _preview = require("../../../utils/preview");
-
 var _Svg = require("devtools/client/debugger/new/dist/vendors").vendored["Svg"];
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
 var _firefox = require("../../../client/firefox");
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
@@ -132,41 +130,32 @@ class Popup extends _react.Component {
       name: expression,
       path: expression,
       contents: {
         value: rootValue
       }
     });
   }
 
-  getObjectProperties() {
+  getChildren() {
     const {
       popupObjectProperties
     } = this.props;
     const root = this.getRoot();
     const value = getValue(root);
-
-    if (!value) {
-      return null;
-    }
+    const actor = value ? value.actor : null;
+    const loadedRootProperties = popupObjectProperties[actor];
 
-    return popupObjectProperties[value.actor];
-  }
-
-  getChildren() {
-    const properties = this.getObjectProperties();
-    const root = this.getRoot();
-
-    if (!properties) {
+    if (!loadedRootProperties) {
       return null;
     }
 
     const children = getChildren({
       item: root,
-      loadedProperties: new Map([[root.path, properties]])
+      loadedProperties: new Map([[root.path, loadedRootProperties]])
     });
 
     if (children.length > 0) {
       return children;
     }
 
     return null;
   }
@@ -227,22 +216,22 @@ class Popup extends _react.Component {
     let roots = this.getChildren();
 
     if (!Array.isArray(roots) || roots.length === 0) {
       return null;
     }
 
     let header = null;
 
-    if ((0, _preview.isImmutable)(this.getObjectProperties())) {
+    if (extra.immutable) {
       header = this.renderImmutable(extra.immutable);
       roots = roots.filter(r => r.type != NODE_TYPES.PROTOTYPE);
     }
 
-    if ((0, _preview.isReactComponent)(this.getObjectProperties())) {
+    if (extra.react) {
       header = this.renderReact(extra.react);
       roots = roots.filter(r => ["state", "props"].includes(r.name));
     }
 
     return _react2.default.createElement("div", {
       className: "preview-popup"
     }, header, this.renderObjectInspector(roots));
   }
--- a/devtools/client/debugger/new/src/components/Editor/Tab.js
+++ b/devtools/client/debugger/new/src/components/Editor/Tab.js
@@ -19,18 +19,16 @@ var _SourceIcon2 = _interopRequireDefaul
 var _Button = require("../shared/Button/index");
 
 var _actions = require("../../actions/index");
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _source = require("../../utils/source");
 
-var _devtoolsModules = require("devtools/client/debugger/new/dist/vendors").vendored["devtools-modules"];
-
 var _clipboard = require("../../utils/clipboard");
 
 var _tabs = require("../../utils/tabs");
 
 var _selectors = require("../../selectors/index");
 
 var _classnames = require("devtools/client/debugger/new/dist/vendors").vendored["classnames"];
 
@@ -170,17 +168,17 @@ class Tab extends _react.PureComponent {
       onMouseUp: handleTabClick,
       onContextMenu: e => this.onTabContextMenu(e, sourceId),
       title: (0, _source.getFileURL)(source)
     }, _react2.default.createElement(_SourceIcon2.default, {
       source: source,
       shouldHide: icon => ["file", "javascript"].includes(icon)
     }), _react2.default.createElement("div", {
       className: "filename"
-    }, (0, _devtoolsModules.getUnicodeUrlPath)(filename)), _react2.default.createElement(_Button.CloseButton, {
+    }, filename), _react2.default.createElement(_Button.CloseButton, {
       handleClick: onClickClose,
       tooltip: L10N.getStr("sourceTabs.closeTabButtonTooltip")
     }));
   }
 
 }
 
 const mapStateToProps = (state, {
--- a/devtools/client/debugger/new/src/components/QuickOpenModal.js
+++ b/devtools/client/debugger/new/src/components/QuickOpenModal.js
@@ -284,16 +284,20 @@ class QuickOpenModal extends _react.Comp
 
       if (e.key === "Enter") {
         if (this.isGotoQuery()) {
           const location = (0, _quickOpen.parseLineColumn)(query);
           return this.gotoLocation(location);
         }
 
         if (results) {
+          if (this.isShortcutQuery()) {
+            return this.setModifier(results[selectedIndex]);
+          }
+
           return this.selectResultItem(e, results[selectedIndex]);
         }
       }
 
       if (e.key === "Tab") {
         return this.closeModal();
       }
 
@@ -351,16 +355,28 @@ class QuickOpenModal extends _react.Comp
       newQuery = query.replace(/[@:#?]/gi, " ");
       return results.map(result => {
         return _objectSpread({}, result, {
           title: this.renderHighlight(result.title, (0, _path.basename)(newQuery), "title")
         });
       });
     };
 
+    this.renderLoading = () => {
+      const {
+        symbolsLoading
+      } = this.props;
+
+      if ((this.isFunctionQuery() || this.isVariableQuery()) && symbolsLoading) {
+        return _react2.default.createElement("div", {
+          className: "loading-indicator"
+        }, L10N.getStr("loadingText"));
+      }
+    };
+
     this.state = {
       results: null,
       selectedIndex: 0
     };
   }
 
   componentDidMount() {
     const {
@@ -395,28 +411,16 @@ class QuickOpenModal extends _react.Comp
 
     if (this.isGotoQuery()) {
       return !/^:\d*$/.test(query);
     }
 
     return !this.getResultCount() && !!query;
   }
 
-  getSummaryMessage() {
-    let summaryMsg = "";
-
-    if (this.isGotoQuery()) {
-      summaryMsg = L10N.getStr("shortcuts.gotoLine");
-    } else if ((this.isFunctionQuery() || this.isVariableQuery()) && this.props.symbolsLoading) {
-      summaryMsg = L10N.getStr("loadingText");
-    }
-
-    return summaryMsg;
-  }
-
   render() {
     const {
       enabled,
       query
     } = this.props;
     const {
       selectedIndex,
       results
@@ -424,35 +428,36 @@ class QuickOpenModal extends _react.Comp
 
     if (!enabled) {
       return null;
     }
 
     const newResults = results && results.slice(0, 100);
     const items = this.highlightMatching(query, newResults || []);
     const expanded = !!items && items.length > 0;
+    const summaryMsg = this.isGotoQuery() ? L10N.getStr("shortcuts.gotoLine") : "";
     return _react2.default.createElement(_Modal2.default, {
       "in": enabled,
       handleClose: this.closeModal
     }, _react2.default.createElement(_SearchInput2.default, _extends({
       query: query,
       hasPrefix: true,
       count: this.getResultCount(),
       placeholder: L10N.getStr("sourceSearch.search"),
-      summaryMsg: this.getSummaryMessage(),
+      summaryMsg: summaryMsg,
       showErrorEmoji: this.shouldShowErrorEmoji(),
       onChange: this.onChange,
       onKeyDown: this.onKeyDown,
       handleClose: this.closeModal,
       expanded: expanded,
       showClose: false,
       selectedItemId: expanded && items[selectedIndex] ? items[selectedIndex].id : ""
     }, this.isSourceSearch() ? {
       size: "big"
-    } : {})), newResults && _react2.default.createElement(_ResultList2.default, _extends({
+    } : {})), this.renderLoading(), newResults && _react2.default.createElement(_ResultList2.default, _extends({
       key: "results",
       items: items,
       selected: selectedIndex,
       selectItem: this.selectResultItem,
       ref: "resultList",
       expanded: expanded
     }, this.isSourceSearch() ? {
       size: "big"
--- a/devtools/client/debugger/new/src/components/SecondaryPanes/Frames/WhyPaused.js
+++ b/devtools/client/debugger/new/src/components/SecondaryPanes/Frames/WhyPaused.js
@@ -18,17 +18,17 @@ function _interopRequireDefault(obj) { r
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 function renderExceptionSummary(exception) {
   if (typeof exception === "string") {
     return exception;
   }
 
   const preview = exception.preview;
 
-  if (!preview || !preview.name || !preview.message) {
+  if (!preview) {
     return;
   }
 
   return `${preview.name}: ${preview.message}`;
 }
 
 function renderMessage(why) {
   if (why.type == "exception" && why.exception) {
--- a/devtools/client/debugger/new/src/components/shared/SearchInput.js
+++ b/devtools/client/debugger/new/src/components/shared/SearchInput.js
@@ -106,30 +106,16 @@ class SearchInput extends _react.Compone
   renderArrowButtons() {
     const {
       handleNext,
       handlePrev
     } = this.props;
     return [arrowBtn(handleNext, "arrow-down", (0, _classnames2.default)("nav-btn", "next"), L10N.getFormatStr("editor.searchResults.nextResult")), arrowBtn(handlePrev, "arrow-up", (0, _classnames2.default)("nav-btn", "prev"), L10N.getFormatStr("editor.searchResults.prevResult"))];
   }
 
-  renderSummaryMsg() {
-    const {
-      summaryMsg
-    } = this.props;
-
-    if (!summaryMsg) {
-      return null;
-    }
-
-    return _react2.default.createElement("div", {
-      className: "summary"
-    }, summaryMsg);
-  }
-
   renderNav() {
     const {
       count,
       handleNext,
       handlePrev
     } = this.props;
 
     if (!handleNext && !handlePrev || !count || count == 1) {
@@ -148,16 +134,17 @@ class SearchInput extends _react.Compone
       onChange,
       onKeyDown,
       onKeyUp,
       placeholder,
       query,
       selectedItemId,
       showErrorEmoji,
       size,
+      summaryMsg,
       showClose
     } = this.props;
     const inputProps = {
       className: (0, _classnames2.default)({
         empty: showErrorEmoji
       }),
       onChange,
       onKeyDown,
@@ -177,17 +164,19 @@ class SearchInput extends _react.Compone
         focused: this.state.inputFocused
       })
     }, _react2.default.createElement("div", {
       className: (0, _classnames2.default)("search-field", size),
       role: "combobox",
       "aria-haspopup": "listbox",
       "aria-owns": "result-list",
       "aria-expanded": expanded
-    }, this.renderSvg(), _react2.default.createElement("input", inputProps), this.renderSummaryMsg(), this.renderNav(), showClose && _react2.default.createElement(_Button.CloseButton, {
+    }, this.renderSvg(), _react2.default.createElement("input", inputProps), summaryMsg && _react2.default.createElement("div", {
+      className: "summary"
+    }, summaryMsg), this.renderNav(), showClose && _react2.default.createElement(_Button.CloseButton, {
       handleClick: handleClose,
       buttonClass: size
     })));
   }
 
 }
 
 SearchInput.defaultProps = {
--- a/devtools/client/debugger/new/src/utils/preview.js
+++ b/devtools/client/debugger/new/src/utils/preview.js
@@ -1,41 +1,45 @@
 "use strict";
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.isImmutablePreview = isImmutablePreview;
 exports.isImmutable = isImmutable;
 exports.isReactComponent = isReactComponent;
 exports.isConsole = isConsole;
 
 /* 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/>. */
 const IMMUTABLE_FIELDS = ["_root", "__ownerID", "__altered", "__hash"];
-const REACT_FIELDS = ["_reactInternalInstance", "_reactInternalFiber"];
-
-function isImmutablePreview(result) {
-  return result && isImmutable(result.preview);
-}
 
 function isImmutable(result) {
-  if (!result || typeof result.ownProperties != "object") {
+  if (!result || !result.preview) {
     return;
   }
 
-  const ownProperties = result.ownProperties;
+  const ownProperties = result.preview.ownProperties;
+
+  if (!ownProperties) {
+    return;
+  }
+
   return IMMUTABLE_FIELDS.every(field => Object.keys(ownProperties).includes(field));
 }
 
 function isReactComponent(result) {
-  if (!result || typeof result.ownProperties != "object") {
+  if (!result || !result.preview) {
     return;
   }
 
-  const ownProperties = result.ownProperties;
-  return REACT_FIELDS.some(field => Object.keys(ownProperties).includes(field));
+  const ownProperties = result.preview.ownProperties;
+
+  if (!ownProperties) {
+    return;
+  }
+
+  return Object.keys(ownProperties).includes("_reactInternalInstance") || Object.keys(ownProperties).includes("_reactInternalFiber");
 }
 
 function isConsole(expression) {
   return /^console/.test(expression);
 }
\ No newline at end of file
--- a/devtools/client/debugger/new/src/utils/source.js
+++ b/devtools/client/debugger/new/src/utils/source.js
@@ -35,18 +35,16 @@ exports.getSourceClassnames = getSourceC
 var _devtoolsSourceMap = require("devtools/client/shared/source-map/index.js");
 
 var _utils = require("./utils");
 
 var _path = require("./path");
 
 var _url = require("devtools/client/debugger/new/dist/vendors").vendored["url"];
 
-var _devtoolsModules = require("devtools/client/debugger/new/dist/vendors").vendored["devtools-modules"];
-
 var _sourcesTree = require("./sources-tree/index");
 
 const sourceTypes = exports.sourceTypes = {
   coffee: "coffeescript",
   js: "javascript",
   jsx: "react",
   ts: "typescript"
 };
@@ -148,35 +146,28 @@ function getRawSourceURL(url) {
   return url ? url.replace(/:formatted$/, "") : url;
 }
 
 function resolveFileURL(url, transformUrl = initialUrl => initialUrl) {
   url = getRawSourceURL(url || "");
   const name = transformUrl(url);
   return (0, _utils.endTruncateStr)(name, 50);
 }
-/**
- * Gets a readable filename from a URL for display purposes.
- *
- * @memberof utils/source
- * @static
- */
-
 
 function getFilenameFromURL(url) {
-  return resolveFileURL(url, initialUrl => (0, _devtoolsModules.getUnicodeUrlPath)((0, _path.basename)(initialUrl)) || "(index)");
+  return resolveFileURL(url, initialUrl => (0, _path.basename)(initialUrl) || "(index)");
 }
 
 function getFormattedSourceId(id) {
   const sourceId = id.split("/")[1];
   return `SOURCE${sourceId}`;
 }
 /**
- * Gets a readable filename from a source URL for display purposes.
- * If the source does not have a URL, the source ID will be returned instead.
+ * Show a source url's filename.
+ * If the source does not have a url, use the source id.
  *
  * @memberof utils/source
  * @static
  */
 
 
 function getFilename(source) {
   const {
@@ -193,35 +184,35 @@ function getFilename(source) {
 
   if (qMarkIdx > 0) {
     filename = filename.slice(0, qMarkIdx);
   }
 
   return filename;
 }
 /**
- * Gets a readable source URL for display purposes.
- * If the source does not have a URL, the source ID will be returned instead.
+ * Show a source url.
+ * If the source does not have a url, use the source id.
  *
  * @memberof utils/source
  * @static
  */
 
 
 function getFileURL(source) {
   const {
     url,
     id
   } = source;
 
   if (!url) {
     return getFormattedSourceId(id);
   }
 
-  return resolveFileURL(url, _devtoolsModules.getUnicodeUrl);
+  return resolveFileURL(url);
 }
 
 const contentTypeModeMap = {
   "text/javascript": {
     name: "javascript"
   },
   "text/typescript": {
     name: "javascript",
--- a/devtools/client/debugger/new/src/utils/sources-tree/getURL.js
+++ b/devtools/client/debugger/new/src/utils/sources-tree/getURL.js
@@ -5,18 +5,16 @@ Object.defineProperty(exports, "__esModu
 });
 exports.getFilenameFromPath = getFilenameFromPath;
 exports.getURL = getURL;
 
 var _url = require("devtools/client/debugger/new/dist/vendors").vendored["url"];
 
 var _lodash = require("devtools/client/shared/vendor/lodash");
 
-var _devtoolsModules = require("devtools/client/debugger/new/dist/vendors").vendored["devtools-modules"];
-
 /* 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/>. */
 function getFilenameFromPath(pathname) {
   let filename = "";
 
   if (pathname) {
     filename = pathname.substring(pathname.lastIndexOf("/") + 1); // This file does not have a name. Default should be (index).
@@ -108,17 +106,17 @@ function getURL(sourceUrl, debuggeeUrl =
       }
 
       break;
 
     case "http:":
     case "https:":
       return (0, _lodash.merge)(def, {
         path: pathname,
-        group: (0, _devtoolsModules.getUnicodeHostname)(host),
+        group: host,
         filename: filename
       });
   }
 
   return (0, _lodash.merge)(def, {
     path: path,
     group: protocol ? `${protocol}//` : "",
     filename: filename
--- a/devtools/client/shared/components/reps/reps.js
+++ b/devtools/client/shared/components/reps/reps.js
@@ -1,18 +1,18 @@
 (function webpackUniversalModuleDefinition(root, factory) {
 	if(typeof exports === 'object' && typeof module === 'object')
-		module.exports = factory(require("devtools/client/shared/vendor/react"), require("Services"), require("devtools/client/shared/vendor/react-redux"), require("devtools/client/shared/vendor/redux"), require("devtools/client/shared/vendor/react-prop-types"), require("devtools/client/shared/vendor/react-dom-factories"));
+		module.exports = factory(require("devtools/client/shared/vendor/react"), require("devtools/client/shared/vendor/react-redux"), require("devtools/client/shared/vendor/redux"), require("devtools/client/shared/vendor/react-prop-types"), require("devtools/client/shared/vendor/react-dom-factories"));
 	else if(typeof define === 'function' && define.amd)
-		define(["devtools/client/shared/vendor/react", "Services", "devtools/client/shared/vendor/react-redux", "devtools/client/shared/vendor/redux", "devtools/client/shared/vendor/react-prop-types", "devtools/client/shared/vendor/react-dom-factories"], factory);
+		define(["devtools/client/shared/vendor/react", "devtools/client/shared/vendor/react-redux", "devtools/client/shared/vendor/redux", "devtools/client/shared/vendor/react-prop-types", "devtools/client/shared/vendor/react-dom-factories"], factory);
 	else {
-		var a = typeof exports === 'object' ? factory(require("devtools/client/shared/vendor/react"), require("Services"), require("devtools/client/shared/vendor/react-redux"), require("devtools/client/shared/vendor/redux"), require("devtools/client/shared/vendor/react-prop-types"), require("devtools/client/shared/vendor/react-dom-factories")) : factory(root["devtools/client/shared/vendor/react"], root["Services"], root["devtools/client/shared/vendor/react-redux"], root["devtools/client/shared/vendor/redux"], root["devtools/client/shared/vendor/react-prop-types"], root["devtools/client/shared/vendor/react-dom-factories"]);
+		var a = typeof exports === 'object' ? factory(require("devtools/client/shared/vendor/react"), require("devtools/client/shared/vendor/react-redux"), require("devtools/client/shared/vendor/redux"), require("devtools/client/shared/vendor/react-prop-types"), require("devtools/client/shared/vendor/react-dom-factories")) : factory(root["devtools/client/shared/vendor/react"], root["devtools/client/shared/vendor/react-redux"], root["devtools/client/shared/vendor/redux"], root["devtools/client/shared/vendor/react-prop-types"], root["devtools/client/shared/vendor/react-dom-factories"]);
 		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
 	}
-})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_22__, __WEBPACK_EXTERNAL_MODULE_3592__, __WEBPACK_EXTERNAL_MODULE_3593__, __WEBPACK_EXTERNAL_MODULE_3642__, __WEBPACK_EXTERNAL_MODULE_3643__) {
+})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_3592__, __WEBPACK_EXTERNAL_MODULE_3593__, __WEBPACK_EXTERNAL_MODULE_3642__, __WEBPACK_EXTERNAL_MODULE_3643__) {
 return /******/ (function(modules) { // webpackBootstrap
 /******/ 	// The module cache
 /******/ 	var installedModules = {};
 /******/
 /******/ 	// The require function
 /******/ 	function __webpack_require__(moduleId) {
 /******/
 /******/ 		// Check if module is in cache
@@ -133,23 +133,16 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBP
 	} else {
 		window.classNames = classNames;
 	}
 }());
 
 
 /***/ }),
 
-/***/ 22:
-/***/ (function(module, exports) {
-
-module.exports = __WEBPACK_EXTERNAL_MODULE_22__;
-
-/***/ }),
-
 /***/ 3592:
 /***/ (function(module, exports) {
 
 module.exports = __WEBPACK_EXTERNAL_MODULE_3592__;
 
 /***/ }),
 
 /***/ 3593:
@@ -4411,28 +4404,25 @@ class Tree extends Component {
         depth,
         renderItem: this.props.renderItem,
         focused: focused === item,
         expanded: this.props.isExpanded(item),
         isExpandable: this._nodeIsExpandable(item),
         onExpand: this._onExpand,
         onCollapse: this._onCollapse,
         onClick: e => {
-          // We can stop the propagation since click handler on the node can be
-          // created in `renderItem`.
-          e.stopPropagation();
-
           // Since the user just clicked the node, there's no need to check if
           // it should be scrolled into view.
           this._focus(item, { preventAutoScroll: true });
           if (this.props.isExpanded(item)) {
             this.props.onCollapse(item);
           } else {
             this.props.onExpand(item, e.altKey);
           }
+          e.stopPropagation();
         }
       });
     });
 
     const style = Object.assign({}, this.props.style || {}, {
       padding: 0,
       margin: 0
     });
@@ -6138,38 +6128,31 @@ module.exports = props => {
 /***/ 3696:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
-var _devtoolsServices = __webpack_require__(22);
-
-var _devtoolsServices2 = _interopRequireDefault(_devtoolsServices);
-
 var _devtoolsComponents = __webpack_require__(3669);
 
 var _devtoolsComponents2 = _interopRequireDefault(_devtoolsComponents);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 /* 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/>. */
 
 const { Component, createFactory } = __webpack_require__(0);
 const dom = __webpack_require__(3643);
 const { connect } = __webpack_require__(3592);
 const { bindActionCreators } = __webpack_require__(3593);
 
-const { appinfo } = _devtoolsServices2.default;
-const isMacOS = appinfo.OS === "Darwin";
-
 const Tree = createFactory(_devtoolsComponents2.default.Tree);
 __webpack_require__(3697);
 
 const classnames = __webpack_require__(175);
 const { MODE } = __webpack_require__(3645);
 
 const Utils = __webpack_require__(3657);
 
@@ -6458,17 +6441,17 @@ class ObjectInspector extends Component 
 
     const parentElementProps = {
       className: classnames("node object-node", {
         focused,
         lessen: !expanded && (nodeIsDefaultProperties(item) || nodeIsPrototype(item) || dimTopLevelWindow === true && nodeIsWindow(item) && depth === 0),
         block: nodeIsBlock(item)
       }),
       onClick: e => {
-        if (onCmdCtrlClick && (isMacOS && e.metaKey || !isMacOS && e.ctrlKey)) {
+        if (e.metaKey && onCmdCtrlClick) {
           onCmdCtrlClick(item, {
             depth,
             event: e,
             focused,
             expanded
           });
           e.stopPropagation();
           return;
--- a/devtools/client/shared/source-map/worker.js
+++ b/devtools/client/shared/source-map/worker.js
@@ -2141,51 +2141,31 @@ async function getAllGeneratedLocations(
 
   return positions.map(({ line, column }) => ({
     sourceId: generatedSourceId,
     line,
     column
   }));
 }
 
-async function getOriginalLocation(location, { search } = {}) {
+async function getOriginalLocation(location) {
   if (!isGeneratedId(location.sourceId)) {
     return location;
   }
 
   const map = await getSourceMap(location.sourceId);
   if (!map) {
     return location;
   }
 
-  // First check for an exact match
-  let match = map.originalPositionFor({
+  const { source: sourceUrl, line, column } = map.originalPositionFor({
     line: location.line,
     column: location.column == null ? 0 : location.column
   });
 
-  // If there is not an exact match, look for a match with a bias at the
-  // current location and then on subsequent lines
-  if (search) {
-    let line = location.line;
-    let column = location.column == null ? 0 : location.column;
-
-    while (match.source === null) {
-      match = map.originalPositionFor({
-        line,
-        column,
-        bias: SourceMapConsumer[search]
-      });
-
-      line += search == "LEAST_UPPER_BOUND" ? 1 : -1;
-      column = search == "LEAST_UPPER_BOUND" ? 0 : Infinity;
-    }
-  }
-
-  const { source: sourceUrl, line, column } = match;
   if (sourceUrl == null) {
     // No url means the location didn't map.
     return location;
   }
 
   return {
     sourceId: generatedToOriginalId(location.sourceId, sourceUrl),
     sourceUrl,