Bug 1478060 - Update Debugger Frontend v74. r=dwalsh
authorJason Laster <jason.laster.11@gmail.com>
Tue, 24 Jul 2018 12:36:30 -0400
changeset 428164 614cbdda23a4c689125484f61b720d41154072f5
parent 428163 2cd46d9846a27f2321b42d3aa697aed30cf44850
child 428165 aef8309a42d089a3407dd0a0478339d222f5182a
push id34327
push userarchaeopteryx@coole-files.de
push dateWed, 25 Jul 2018 14:18:02 +0000
treeherdermozilla-central@fa78cd1a6880 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersdwalsh
bugs1478060
milestone63.0a1
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
Bug 1478060 - Update Debugger Frontend v74. r=dwalsh MozReview-Commit-ID: Fxjd6LoO2X9
devtools/client/debugger/new/README.mozilla
devtools/client/debugger/new/dist/debugger.css
devtools/client/debugger/new/dist/parser-worker.js
devtools/client/debugger/new/dist/pretty-print-worker.js
devtools/client/debugger/new/dist/search-worker.js
devtools/client/debugger/new/dist/vendors.css
devtools/client/debugger/new/dist/vendors.js
devtools/client/debugger/new/src/actions/breakpoints/addBreakpoint.js
devtools/client/debugger/new/src/actions/breakpoints/index.js
devtools/client/debugger/new/src/actions/breakpoints/moz.build
devtools/client/debugger/new/src/actions/breakpoints/syncBreakpoint.js
devtools/client/debugger/new/src/actions/index.js
devtools/client/debugger/new/src/actions/moz.build
devtools/client/debugger/new/src/actions/pause/commands.js
devtools/client/debugger/new/src/actions/pause/continueToHere.js
devtools/client/debugger/new/src/actions/pause/paused.js
devtools/client/debugger/new/src/actions/sources/newSources.js
devtools/client/debugger/new/src/actions/sources/prettyPrint.js
devtools/client/debugger/new/src/actions/sources/select.js
devtools/client/debugger/new/src/components/Editor/Preview/Popup.js
devtools/client/debugger/new/src/components/PrimaryPanes/index.js
devtools/client/debugger/new/src/components/shared/Popover.js
devtools/client/debugger/new/src/selectors/breakpointSources.js
devtools/client/debugger/new/src/utils/build-query.js
devtools/client/debugger/new/src/utils/editor/source-search.js
devtools/client/debugger/new/src/utils/moz.build
devtools/client/debugger/new/src/utils/pause/mapScopes/findGeneratedBindingFromPosition.js
devtools/client/debugger/new/src/utils/pause/mapScopes/getApplicableBindingsForOriginalPosition.js
devtools/client/debugger/new/src/utils/pause/mapScopes/index.js
devtools/client/debugger/new/src/utils/pause/mapScopes/moz.build
devtools/client/debugger/new/src/workers/parser/findOutOfScopeLocations.js
devtools/client/debugger/new/src/workers/parser/frameworks.js
devtools/client/debugger/new/src/workers/parser/getScopes/moz.build
devtools/client/debugger/new/src/workers/parser/getScopes/visitor.js
devtools/client/debugger/new/src/workers/parser/getSymbols.js
devtools/client/debugger/new/src/workers/parser/mapBindings.js
devtools/client/debugger/new/src/workers/parser/mapExpression.js
devtools/client/debugger/new/src/workers/parser/mapOriginalExpression.js
devtools/client/debugger/new/src/workers/parser/moz.build
devtools/client/debugger/new/src/workers/parser/pausePoints.js
devtools/client/debugger/new/src/workers/parser/sources.js
devtools/client/debugger/new/src/workers/parser/steps.js
devtools/client/debugger/new/src/workers/parser/utils/ast.js
devtools/client/debugger/new/src/workers/parser/utils/closest.js
devtools/client/debugger/new/src/workers/parser/utils/contains.js
devtools/client/debugger/new/src/workers/parser/utils/formatSymbols.js
devtools/client/debugger/new/src/workers/parser/utils/getFunctionName.js
devtools/client/debugger/new/src/workers/parser/utils/helpers.js
devtools/client/debugger/new/src/workers/parser/utils/inferClassName.js
devtools/client/debugger/new/src/workers/parser/utils/moz.build
devtools/client/debugger/new/src/workers/parser/utils/simple-path.js
devtools/client/debugger/new/src/workers/parser/validate.js
devtools/client/debugger/new/src/workers/parser/worker.js
devtools/client/debugger/new/src/workers/pretty-print/moz.build
devtools/client/debugger/new/src/workers/pretty-print/worker.js
devtools/client/debugger/new/src/workers/search/build-query.js
devtools/client/debugger/new/src/workers/search/get-matches.js
devtools/client/debugger/new/src/workers/search/moz.build
devtools/client/debugger/new/src/workers/search/project-search.js
devtools/client/debugger/new/src/workers/search/worker.js
devtools/client/debugger/new/test/mochitest/browser.ini
devtools/client/debugger/new/test/mochitest/browser_dbg-pause-points.js
devtools/client/debugger/new/test/mochitest/browser_dbg-returnvalues.js
devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemapped-scopes.js
devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-reload.js
devtools/client/debugger/new/test/mochitest/browser_dbg-stepping.js
devtools/client/debugger/new/test/mochitest/examples/doc-sourcemapped.html
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/build.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-classes/input.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-classes/output.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-classes/output.js.map
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-lex-and-nonlex/input.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-lex-and-nonlex/output.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-lex-and-nonlex/output.js.map
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/input.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/output.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/output.js.map
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod1.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod10.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod11.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod12.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod2.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod3.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod4.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod5.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod6.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod7.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod8.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod9.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/optimized-out.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/input.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/output.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/output.js.map
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod1.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod10.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod11.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod12.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod2.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod3.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod4.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod5.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod6.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod7.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod8.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod9.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/optimized-out.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/typescript-classes/output.js.map
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/package.json
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/polyfill-bundle.js
devtools/client/debugger/new/test/mochitest/examples/sourcemapped/webpack.config.js
devtools/client/debugger/new/test/mochitest/examples/sourcemaps-reload/doc-sourcemaps-reload.html
devtools/client/debugger/new/test/mochitest/examples/sourcemaps-reload/doc-sourcemaps-reload2.html
devtools/client/debugger/new/test/mochitest/examples/sourcemaps-reload/doc-sourcemaps-reload3.html
devtools/client/debugger/new/test/mochitest/examples/sourcemaps-reload/sjs_code_reload.sjs
--- 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 73
+Version 74
 
-Comparison: https://github.com/devtools-html/debugger.html/compare/release-72...release-73
+Comparison: https://github.com/devtools-html/debugger.html/compare/release-73...release-74
 
 Packages:
 - babel-plugin-transform-es2015-modules-commonjs @6.26.2
 - babel-preset-react @6.24.1
 - react @16.4.1
 - react-dom @16.4.1
 - webpack @3.11.0
--- a/devtools/client/debugger/new/dist/debugger.css
+++ b/devtools/client/debugger/new/dist/debugger.css
@@ -1283,16 +1283,32 @@ html .toggle-button.end.vertical svg {
 .project-text-search .result.focused .line-number {
   font-weight: bolder;
 }
 
 .project-text-search .result.focused .query-match {
   background-color: #ffffff;
   color: #000000;
 }
+.container {
+  background-color: lightgrey;
+  border: 1px solid darkgrey;
+  cursor: pointer;
+  padding: 0 3px;
+}
+
+.container[aria-selected=true] {
+  background-color: white;
+}
+.container {
+  display: flex;
+  list-style: none;
+  margin: 0;
+  padding: 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/>. */
 
 .sources-panel {
   background-color: var(--theme-sidebar-background);
   display: flex;
   flex: 1;
@@ -1348,16 +1364,17 @@ html .toggle-button.end.vertical svg {
   margin-left: 5px;
 }
 
 .sources-pane {
   display: flex;
   flex: 1;
   overflow-x: auto;
   overflow-y: auto;
+  height: 100%;
 }
 
 .sources-list {
   flex: 1;
   display: flex;
   overflow: hidden;
 }
 
@@ -1415,32 +1432,34 @@ html .toggle-button.end.vertical svg {
   font-size: 12px;
   user-select: none;
   justify-content: center;
   align-items: center;
 }
 
 .sources-panel .outline {
   display: flex;
-  flex: 1;
+  height: 100%;
 }
 
 .tree-indent {
   border-inline-start: 0 none;
 }
 
 .source-outline-tabs {
   width: 100%;
   background: var(--theme-body-background);
   border-top: 1px solid var(--theme-splitter-color);
   display: flex;
   -moz-user-select: none;
   user-select: none;
   box-sizing: border-box;
   height: 30px;
+  margin: 0;
+  padding: 0;
 }
 
 .source-outline-tabs .tab {
   background-color: var(--theme-toolbar-background);
   border-bottom: 1px solid transparent;
   border-color: var(--theme-splitter-color);
   color: var(--theme-body-color);
   cursor: default;
@@ -1469,16 +1488,20 @@ html .toggle-button.end.vertical svg {
   border-bottom-color: transparent;
 }
 
 .source-outline-tabs .tab.active path,
 .source-outline-tabs .tab:hover path {
   fill: var(--theme-body-color);
 }
 
+.source-outline-panel {
+  flex: 1;
+}
+
 .sources-list .managed-tree .tree .node img.blackBox {
   mask: url("chrome://devtools/skin/images/debugger/blackBox.svg") no-repeat;
   mask-size: 100%;
   background-color: var(--theme-highlight-blue);
   width: 13px;
   height: 13px;
   display: inline-block;
   margin-inline-end: 6px;
@@ -2433,22 +2456,19 @@ button.jump-definition {
 }
 /* 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/>. */
 
 .popover .preview-popup {
   background: var(--theme-body-background);
   width: 350px;
-  min-height: 80px;
   border: 1px solid var(--theme-splitter-color);
   padding: 10px;
   height: auto;
-  min-height: inherit;
-  max-height: 200px;
   overflow: auto;
   box-shadow: 1px 2px 3px var(--popup-shadow-color);
 }
 
 .theme-dark .popover .preview-popup {
   box-shadow: 1px 2px 3px var(--popup-shadow-color);
 }
 
--- a/devtools/client/debugger/new/dist/parser-worker.js
+++ b/devtools/client/debugger/new/dist/parser-worker.js
@@ -759,222 +759,16 @@ function overArg(func, transform) {
   };
 }
 
 module.exports = overArg;
 
 
 /***/ }),
 
-/***/ 1363:
-/***/ (function(module, exports, __webpack_require__) {
-
-/* 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 networkRequest = __webpack_require__(1367);
-const workerUtils = __webpack_require__(1368);
-
-module.exports = {
-  networkRequest,
-  workerUtils
-};
-
-/***/ }),
-
-/***/ 1367:
-/***/ (function(module, exports) {
-
-/* 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 networkRequest(url, opts) {
-  return fetch(url, {
-    cache: opts.loadFromCache ? "default" : "no-cache"
-  }).then(res => {
-    if (res.status >= 200 && res.status < 300) {
-      return res.text().then(text => ({ content: text }));
-    }
-    return Promise.reject(`request failed with status ${res.status}`);
-  });
-}
-
-module.exports = networkRequest;
-
-/***/ }),
-
-/***/ 1368:
-/***/ (function(module, exports) {
-
-function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
-
-function WorkerDispatcher() {
-  this.msgId = 1;
-  this.worker = null;
-} /* 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/. */
-
-WorkerDispatcher.prototype = {
-  start(url) {
-    this.worker = new Worker(url);
-    this.worker.onerror = () => {
-      console.error(`Error in worker ${url}`);
-    };
-  },
-
-  stop() {
-    if (!this.worker) {
-      return;
-    }
-
-    this.worker.terminate();
-    this.worker = null;
-  },
-
-  task(method, { queue = false } = {}) {
-    const calls = [];
-    const push = args => {
-      return new Promise((resolve, reject) => {
-        if (queue && calls.length === 0) {
-          Promise.resolve().then(flush);
-        }
-
-        calls.push([args, resolve, reject]);
-
-        if (!queue) {
-          flush();
-        }
-      });
-    };
-
-    const flush = () => {
-      const items = calls.slice();
-      calls.length = 0;
-
-      const id = this.msgId++;
-      this.worker.postMessage({ id, method, calls: items.map(item => item[0]) });
-
-      const listener = ({ data: result }) => {
-        if (result.id !== id) {
-          return;
-        }
-
-        if (!this.worker) {
-          return;
-        }
-
-        this.worker.removeEventListener("message", listener);
-
-        result.results.forEach((resultData, i) => {
-          const [, resolve, reject] = items[i];
-
-          if (resultData.error) {
-            reject(resultData.error);
-          } else {
-            resolve(resultData.response);
-          }
-        });
-      };
-
-      this.worker.addEventListener("message", listener);
-    };
-
-    return (...args) => push(args);
-  }
-};
-
-function workerHandler(publicInterface) {
-  return function (msg) {
-    const { id, method, calls } = msg.data;
-
-    Promise.all(calls.map(args => {
-      try {
-        const response = publicInterface[method].apply(undefined, args);
-        if (response instanceof Promise) {
-          return response.then(val => ({ response: val }),
-          // Error can't be sent via postMessage, so be sure to
-          // convert to string.
-          err => ({ error: err.toString() }));
-        } else {
-          return { response };
-        }
-      } catch (error) {
-        // Error can't be sent via postMessage, so be sure to convert to
-        // string.
-        return { error: error.toString() };
-      }
-    })).then(results => {
-      self.postMessage({ id, results });
-    });
-  };
-}
-
-function streamingWorkerHandler(publicInterface, { timeout = 100 } = {}, worker = self) {
-  let streamingWorker = (() => {
-    var _ref = _asyncToGenerator(function* (id, tasks) {
-      let isWorking = true;
-
-      const intervalId = setTimeout(function () {
-        isWorking = false;
-      }, timeout);
-
-      const results = [];
-      while (tasks.length !== 0 && isWorking) {
-        const { callback, context, args } = tasks.shift();
-        const result = yield callback.call(context, args);
-        results.push(result);
-      }
-      worker.postMessage({ id, status: "pending", data: results });
-      clearInterval(intervalId);
-
-      if (tasks.length !== 0) {
-        yield streamingWorker(id, tasks);
-      }
-    });
-
-    return function streamingWorker(_x, _x2) {
-      return _ref.apply(this, arguments);
-    };
-  })();
-
-  return (() => {
-    var _ref2 = _asyncToGenerator(function* (msg) {
-      const { id, method, args } = msg.data;
-      const workerMethod = publicInterface[method];
-      if (!workerMethod) {
-        console.error(`Could not find ${method} defined in worker.`);
-      }
-      worker.postMessage({ id, status: "start" });
-
-      try {
-        const tasks = workerMethod(args);
-        yield streamingWorker(id, tasks);
-        worker.postMessage({ id, status: "done" });
-      } catch (error) {
-        worker.postMessage({ id, status: "error", error });
-      }
-    });
-
-    return function (_x3) {
-      return _ref2.apply(this, arguments);
-    };
-  })();
-}
-
-module.exports = {
-  WorkerDispatcher,
-  workerHandler,
-  streamingWorkerHandler
-};
-
-/***/ }),
-
 /***/ 1375:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -1942,17 +1736,17 @@ var _validate = __webpack_require__(1629
 var _frameworks = __webpack_require__(1703);
 
 var _pausePoints = __webpack_require__(3612);
 
 var _mapExpression = __webpack_require__(3755);
 
 var _mapExpression2 = _interopRequireDefault(_mapExpression);
 
-var _devtoolsUtils = __webpack_require__(1363);
+var _devtoolsUtils = __webpack_require__(3651);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 const { workerHandler } = _devtoolsUtils.workerUtils; /* 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/>. */
 
 self.onmessage = workerHandler({
@@ -24703,16 +24497,20 @@ class SimplePath {
 
     if (typeof index === "number") {
       return node[key][index];
     }
 
     return node[key];
   }
 
+  get key() {
+    return this._ancestor.key;
+  }
+
   set node(replacement) {
     if (this.type !== "Identifier") {
       throw new Error("Replacing anything other than leaf nodes is undefined behavior " + "in t.traverse()");
     }
 
     const { node, key, index } = this._ancestor;
     if (typeof index === "number") {
       node[key][index] = replacement;
@@ -24816,97 +24614,139 @@ const isForStatement = node => t.isForSt
 const isControlFlow = node => isForStatement(node) || t.isWhileStatement(node) || t.isIfStatement(node) || t.isSwitchCase(node) || t.isSwitchStatement(node) || t.isTryStatement(node) || t.isWithStatement(node);
 
 const isAssignment = node => t.isVariableDeclarator(node) || t.isAssignmentExpression(node) || t.isAssignmentPattern(node);
 
 const isImport = node => t.isImport(node) || t.isImportDeclaration(node);
 const isReturn = node => t.isReturnStatement(node);
 const isCall = node => t.isCallExpression(node) || t.isJSXElement(node);
 
-const inStepExpression = parent => t.isArrayExpression(parent) || t.isObjectProperty(parent) || t.isCallExpression(parent) || t.isJSXElement(parent);
+const inStepExpression = parent => t.isArrayExpression(parent) || t.isObjectProperty(parent) || t.isCallExpression(parent) || t.isJSXElement(parent) || t.isSequenceExpression(parent);
 
 const inExpression = (parent, grandParent) => inStepExpression(parent) || t.isJSXAttribute(grandParent) || t.isTemplateLiteral(parent);
 
 const isExport = node => t.isExportNamedDeclaration(node) || t.isExportDefaultDeclaration(node);
 
 function getStartLine(node) {
   return node.loc.start.line;
 }
 
+// Finds the first call item in a step expression so that we can step
+// to the beginning of the list and either step in or over. e.g. [], x(), { }
+function isFirstCall(node, parentNode, grandParentNode) {
+  let children = [];
+  if (t.isArrayExpression(parentNode)) {
+    children = parentNode.elements;
+  }
+
+  if (t.isObjectProperty(parentNode)) {
+    children = grandParentNode.properties.map(({ value }) => value);
+  }
+
+  if (t.isSequenceExpression(parentNode)) {
+    children = parentNode.expressions;
+  }
+
+  if (t.isCallExpression(parentNode)) {
+    children = parentNode.arguments;
+  }
+
+  return children.find(child => isCall(child)) === node;
+}
+
+// Check to see if the node is a step expression and if any of its children
+// expressions include calls. e.g. [ a() ], { a: a() }
+function hasCall(node) {
+  let children = [];
+  if (t.isArrayExpression(node)) {
+    children = node.elements;
+  }
+
+  if (t.isObjectExpression(node)) {
+    children = node.properties.map(({ value }) => value);
+  }
+
+  if (t.isSequenceExpression(node)) {
+    children = node.expressions;
+  }
+
+  if (t.isCallExpression(node)) {
+    children = node.arguments;
+  }
+
+  return children.find(child => isCall(child));
+}
+
 function getPausePoints(sourceId) {
   const state = {};
   (0, _ast.traverseAst)(sourceId, { enter: onEnter }, state);
   return state;
 }
 
 /* eslint-disable complexity */
 function onEnter(node, ancestors, state) {
   const parent = ancestors[ancestors.length - 1];
   const parentNode = parent && parent.node;
   const grandParent = ancestors[ancestors.length - 2];
+  const grandParentNode = grandParent && grandParent.node;
   const startLocation = node.loc.start;
 
-  if (isImport(node) || t.isClassDeclaration(node) || isExport(node) || t.isDebuggerStatement(node) || t.isThrowStatement(node) || t.isExpressionStatement(node) || t.isBreakStatement(node) || t.isContinueStatement(node)) {
+  if (isImport(node) || t.isClassDeclaration(node) || isExport(node) || t.isDebuggerStatement(node) || t.isThrowStatement(node) || t.isBreakStatement(node) || t.isContinueStatement(node)) {
     return addStopPoint(state, startLocation);
   }
 
   if (isControlFlow(node)) {
-    if (isForStatement(node)) {
-      addStopPoint(state, startLocation);
-    } else {
-      addEmptyPoint(state, startLocation);
-    }
+    addPoint(state, startLocation, isForStatement(node));
 
     const test = node.test || node.discriminant;
     if (test) {
       addStopPoint(state, test.loc.start);
     }
     return;
   }
 
-  if (t.isBlockStatement(node)) {
+  if (t.isBlockStatement(node) || t.isArrayExpression(node)) {
     return addEmptyPoint(state, startLocation);
   }
 
   if (isReturn(node)) {
     // We do not want to pause at the return if the
     // argument is a call on the same line e.g. return foo()
-    if (isCall(node.argument) && getStartLine(node) == getStartLine(node.argument)) {
-      return addEmptyPoint(state, startLocation);
-    }
-
-    return addStopPoint(state, startLocation);
+
+    return addPoint(state, startLocation, !isCall(node.argument) || getStartLine(node) != getStartLine(node.argument));
   }
 
   if (isAssignment(node)) {
-    // We only want to pause at literal assignments `var a = foo()`
+    // step at assignments unless the right side is a call or default assignment
+    // e.g. `var a = b()`,  `a = b(c = 2)`, `a = [ b() ]`
     const value = node.right || node.init;
-
-    if (isCall(value) || t.isFunction(parentNode)) {
-      return addEmptyPoint(state, startLocation);
-    }
-    return addStopPoint(state, startLocation);
+    const defaultAssignment = t.isFunction(parentNode) && parent.key === "params";
+    const includesCall = isCall(value) || hasCall(value);
+
+    return addPoint(state, startLocation, !includesCall && !defaultAssignment);
   }
 
   if (isCall(node)) {
     let location = startLocation;
 
     // When functions are chained, we want to use the property location
     // e.g `foo().bar()`
     if (t.isMemberExpression(node.callee)) {
       location = node.callee.property.loc.start;
     }
 
-    // NOTE: we do not want to land inside an expression e.g. [], {}, call
-    const step = !inExpression(parent.node, grandParent && grandParent.node);
+    // NOTE: We want to skip all nested calls in expressions except for the
+    // first call in arrays and objects expression e.g. [], {}, call
+    const step = isFirstCall(node, parentNode, grandParentNode) || !inExpression(parentNode, grandParentNode);
 
     // NOTE: we add a point at the beginning of the expression
     // and each of the calls because the engine does not support
     // column-based member expression calls.
     addPoint(state, startLocation, { break: true, step });
+
     if (location && !(0, _isEqual2.default)(location, startLocation)) {
       addPoint(state, location, { break: true, step });
     }
 
     return;
   }
 
   if (t.isClassProperty(node)) {
@@ -24924,16 +24764,20 @@ function onEnter(node, ancestors, state)
   }
 }
 
 function hasPoint(state, { line, column }) {
   return state[line] && state[line][column];
 }
 
 function addPoint(state, { line, column }, types) {
+  if (typeof types === "boolean") {
+    types = { step: types, break: types };
+  }
+
   if (!state[line]) {
     state[line] = {};
   }
   state[line][column] = types;
   return state;
 }
 
 function addStopPoint(state, location) {
--- a/devtools/client/debugger/new/dist/pretty-print-worker.js
+++ b/devtools/client/debugger/new/dist/pretty-print-worker.js
@@ -78,66 +78,122 @@ return /******/ (function(modules) { // 
 /***/ 1282:
 /***/ (function(module, exports, __webpack_require__) {
 
 module.exports = __webpack_require__(1630);
 
 
 /***/ }),
 
-/***/ 1363:
+/***/ 1630:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _prettyFast = __webpack_require__(802);
+
+var _prettyFast2 = _interopRequireDefault(_prettyFast);
+
+var _devtoolsUtils = __webpack_require__(3651);
+
+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 { workerHandler } = _devtoolsUtils.workerUtils;
+
+function prettyPrint({ url, indent, sourceText }) {
+  const prettified = (0, _prettyFast2.default)(sourceText, {
+    url: url,
+    indent: " ".repeat(indent)
+  });
+
+  return {
+    code: prettified.code,
+    mappings: invertMappings(prettified.map._mappings)
+  };
+}
+
+function invertMappings(mappings) {
+  return mappings._array.map(m => {
+    const mapping = {
+      generated: {
+        line: m.originalLine,
+        column: m.originalColumn
+      }
+    };
+    if (m.source) {
+      mapping.source = m.source;
+      mapping.original = {
+        line: m.generatedLine,
+        column: m.generatedColumn
+      };
+      mapping.name = m.name;
+    }
+    return mapping;
+  });
+}
+
+self.onmessage = workerHandler({ prettyPrint });
+
+/***/ }),
+
+/***/ 3651:
 /***/ (function(module, exports, __webpack_require__) {
 
 /* 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 networkRequest = __webpack_require__(1367);
-const workerUtils = __webpack_require__(1368);
+const networkRequest = __webpack_require__(3653);
+const workerUtils = __webpack_require__(3654);
 
 module.exports = {
   networkRequest,
   workerUtils
 };
 
 /***/ }),
 
-/***/ 1367:
+/***/ 3653:
 /***/ (function(module, exports) {
 
 /* 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/. */
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 function networkRequest(url, opts) {
   return fetch(url, {
     cache: opts.loadFromCache ? "default" : "no-cache"
   }).then(res => {
     if (res.status >= 200 && res.status < 300) {
       return res.text().then(text => ({ content: text }));
     }
     return Promise.reject(`request failed with status ${res.status}`);
   });
 }
 
 module.exports = networkRequest;
 
 /***/ }),
 
-/***/ 1368:
+/***/ 3654:
 /***/ (function(module, exports) {
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 function WorkerDispatcher() {
   this.msgId = 1;
   this.worker = null;
 } /* 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/. */
+   * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 WorkerDispatcher.prototype = {
   start(url) {
     this.worker = new Worker(url);
     this.worker.onerror = () => {
       console.error(`Error in worker ${url}`);
     };
   },
@@ -166,18 +222,26 @@ WorkerDispatcher.prototype = {
         }
       });
     };
 
     const flush = () => {
       const items = calls.slice();
       calls.length = 0;
 
+      if (!this.worker) {
+        return;
+      }
+
       const id = this.msgId++;
-      this.worker.postMessage({ id, method, calls: items.map(item => item[0]) });
+      this.worker.postMessage({
+        id,
+        method,
+        calls: items.map(item => item[0])
+      });
 
       const listener = ({ data: result }) => {
         if (result.id !== id) {
           return;
         }
 
         if (!this.worker) {
           return;
@@ -210,47 +274,46 @@ function workerHandler(publicInterface) 
     Promise.all(calls.map(args => {
       try {
         const response = publicInterface[method].apply(undefined, args);
         if (response instanceof Promise) {
           return response.then(val => ({ response: val }),
           // Error can't be sent via postMessage, so be sure to
           // convert to string.
           err => ({ error: err.toString() }));
-        } else {
-          return { response };
         }
+        return { response };
       } catch (error) {
         // Error can't be sent via postMessage, so be sure to convert to
         // string.
         return { error: error.toString() };
       }
     })).then(results => {
       self.postMessage({ id, results });
     });
   };
 }
 
 function streamingWorkerHandler(publicInterface, { timeout = 100 } = {}, worker = self) {
   let streamingWorker = (() => {
     var _ref = _asyncToGenerator(function* (id, tasks) {
       let isWorking = true;
 
-      const intervalId = setTimeout(function () {
+      const timeoutId = setTimeout(function () {
         isWorking = false;
       }, timeout);
 
       const results = [];
       while (tasks.length !== 0 && isWorking) {
         const { callback, context, args } = tasks.shift();
         const result = yield callback.call(context, args);
         results.push(result);
       }
       worker.postMessage({ id, status: "pending", data: results });
-      clearInterval(intervalId);
+      clearTimeout(timeoutId);
 
       if (tasks.length !== 0) {
         yield streamingWorker(id, tasks);
       }
     });
 
     return function streamingWorker(_x, _x2) {
       return _ref.apply(this, arguments);
@@ -284,72 +347,16 @@ function streamingWorkerHandler(publicIn
 module.exports = {
   WorkerDispatcher,
   workerHandler,
   streamingWorkerHandler
 };
 
 /***/ }),
 
-/***/ 1630:
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-var _prettyFast = __webpack_require__(802);
-
-var _prettyFast2 = _interopRequireDefault(_prettyFast);
-
-var _devtoolsUtils = __webpack_require__(1363);
-
-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 { workerHandler } = _devtoolsUtils.workerUtils;
-
-function prettyPrint({ url, indent, sourceText }) {
-  const prettified = (0, _prettyFast2.default)(sourceText, {
-    url: url,
-    indent: " ".repeat(indent)
-  });
-
-  return {
-    code: prettified.code,
-    mappings: invertMappings(prettified.map._mappings)
-  };
-}
-
-function invertMappings(mappings) {
-  return mappings._array.map(m => {
-    const mapping = {
-      generated: {
-        line: m.originalLine,
-        column: m.originalColumn
-      }
-    };
-    if (m.source) {
-      mapping.source = m.source;
-      mapping.original = {
-        line: m.generatedLine,
-        column: m.generatedColumn
-      };
-      mapping.name = m.name;
-    }
-    return mapping;
-  });
-}
-
-self.onmessage = workerHandler({ prettyPrint });
-
-/***/ }),
-
 /***/ 381:
 /***/ (function(module, exports, __webpack_require__) {
 
 (function (global, factory) {
 	 true ? factory(exports) :
 	typeof define === 'function' && define.amd ? define(['exports'], factory) :
 	(factory((global.acorn = global.acorn || {})));
 }(this, (function (exports) { 'use strict';
--- a/devtools/client/debugger/new/dist/search-worker.js
+++ b/devtools/client/debugger/new/dist/search-worker.js
@@ -267,222 +267,16 @@ module.exports = arrayMap;
 /***/ 1284:
 /***/ (function(module, exports, __webpack_require__) {
 
 module.exports = __webpack_require__(1631);
 
 
 /***/ }),
 
-/***/ 1363:
-/***/ (function(module, exports, __webpack_require__) {
-
-/* 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 networkRequest = __webpack_require__(1367);
-const workerUtils = __webpack_require__(1368);
-
-module.exports = {
-  networkRequest,
-  workerUtils
-};
-
-/***/ }),
-
-/***/ 1367:
-/***/ (function(module, exports) {
-
-/* 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 networkRequest(url, opts) {
-  return fetch(url, {
-    cache: opts.loadFromCache ? "default" : "no-cache"
-  }).then(res => {
-    if (res.status >= 200 && res.status < 300) {
-      return res.text().then(text => ({ content: text }));
-    }
-    return Promise.reject(`request failed with status ${res.status}`);
-  });
-}
-
-module.exports = networkRequest;
-
-/***/ }),
-
-/***/ 1368:
-/***/ (function(module, exports) {
-
-function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
-
-function WorkerDispatcher() {
-  this.msgId = 1;
-  this.worker = null;
-} /* 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/. */
-
-WorkerDispatcher.prototype = {
-  start(url) {
-    this.worker = new Worker(url);
-    this.worker.onerror = () => {
-      console.error(`Error in worker ${url}`);
-    };
-  },
-
-  stop() {
-    if (!this.worker) {
-      return;
-    }
-
-    this.worker.terminate();
-    this.worker = null;
-  },
-
-  task(method, { queue = false } = {}) {
-    const calls = [];
-    const push = args => {
-      return new Promise((resolve, reject) => {
-        if (queue && calls.length === 0) {
-          Promise.resolve().then(flush);
-        }
-
-        calls.push([args, resolve, reject]);
-
-        if (!queue) {
-          flush();
-        }
-      });
-    };
-
-    const flush = () => {
-      const items = calls.slice();
-      calls.length = 0;
-
-      const id = this.msgId++;
-      this.worker.postMessage({ id, method, calls: items.map(item => item[0]) });
-
-      const listener = ({ data: result }) => {
-        if (result.id !== id) {
-          return;
-        }
-
-        if (!this.worker) {
-          return;
-        }
-
-        this.worker.removeEventListener("message", listener);
-
-        result.results.forEach((resultData, i) => {
-          const [, resolve, reject] = items[i];
-
-          if (resultData.error) {
-            reject(resultData.error);
-          } else {
-            resolve(resultData.response);
-          }
-        });
-      };
-
-      this.worker.addEventListener("message", listener);
-    };
-
-    return (...args) => push(args);
-  }
-};
-
-function workerHandler(publicInterface) {
-  return function (msg) {
-    const { id, method, calls } = msg.data;
-
-    Promise.all(calls.map(args => {
-      try {
-        const response = publicInterface[method].apply(undefined, args);
-        if (response instanceof Promise) {
-          return response.then(val => ({ response: val }),
-          // Error can't be sent via postMessage, so be sure to
-          // convert to string.
-          err => ({ error: err.toString() }));
-        } else {
-          return { response };
-        }
-      } catch (error) {
-        // Error can't be sent via postMessage, so be sure to convert to
-        // string.
-        return { error: error.toString() };
-      }
-    })).then(results => {
-      self.postMessage({ id, results });
-    });
-  };
-}
-
-function streamingWorkerHandler(publicInterface, { timeout = 100 } = {}, worker = self) {
-  let streamingWorker = (() => {
-    var _ref = _asyncToGenerator(function* (id, tasks) {
-      let isWorking = true;
-
-      const intervalId = setTimeout(function () {
-        isWorking = false;
-      }, timeout);
-
-      const results = [];
-      while (tasks.length !== 0 && isWorking) {
-        const { callback, context, args } = tasks.shift();
-        const result = yield callback.call(context, args);
-        results.push(result);
-      }
-      worker.postMessage({ id, status: "pending", data: results });
-      clearInterval(intervalId);
-
-      if (tasks.length !== 0) {
-        yield streamingWorker(id, tasks);
-      }
-    });
-
-    return function streamingWorker(_x, _x2) {
-      return _ref.apply(this, arguments);
-    };
-  })();
-
-  return (() => {
-    var _ref2 = _asyncToGenerator(function* (msg) {
-      const { id, method, args } = msg.data;
-      const workerMethod = publicInterface[method];
-      if (!workerMethod) {
-        console.error(`Could not find ${method} defined in worker.`);
-      }
-      worker.postMessage({ id, status: "start" });
-
-      try {
-        const tasks = workerMethod(args);
-        yield streamingWorker(id, tasks);
-        worker.postMessage({ id, status: "done" });
-      } catch (error) {
-        worker.postMessage({ id, status: "error", error });
-      }
-    });
-
-    return function (_x3) {
-      return _ref2.apply(this, arguments);
-    };
-  })();
-}
-
-module.exports = {
-  WorkerDispatcher,
-  workerHandler,
-  streamingWorkerHandler
-};
-
-/***/ }),
-
 /***/ 14:
 /***/ (function(module, exports) {
 
 /**
  * Checks if `value` is object-like. A value is object-like if it's not `null`
  * and has a `typeof` result of "object".
  *
  * @static
@@ -509,111 +303,29 @@ function isObjectLike(value) {
   return value != null && typeof value == 'object';
 }
 
 module.exports = isObjectLike;
 
 
 /***/ }),
 
-/***/ 1402:
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = buildQuery;
-
-var _escapeRegExp = __webpack_require__(259);
-
-var _escapeRegExp2 = _interopRequireDefault(_escapeRegExp);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Ignore doing outline matches for less than 3 whitespaces
- *
- * @memberof utils/source-search
- * @static
- */
-function ignoreWhiteSpace(str) {
-  return (/^\s{0,2}$/.test(str) ? "(?!\\s*.*)" : str
-  );
-} /* 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 wholeMatch(query, wholeWord) {
-  if (query === "" || !wholeWord) {
-    return query;
-  }
-
-  return `\\b${query}\\b`;
-}
-
-function buildFlags(caseSensitive, isGlobal) {
-  if (caseSensitive && isGlobal) {
-    return "g";
-  }
-
-  if (!caseSensitive && isGlobal) {
-    return "gi";
-  }
-
-  if (!caseSensitive && !isGlobal) {
-    return "i";
-  }
-
-  return;
-}
-
-function buildQuery(originalQuery, modifiers, { isGlobal = false, ignoreSpaces = false }) {
-  const { caseSensitive, regexMatch, wholeWord } = modifiers;
-
-  if (originalQuery === "") {
-    return new RegExp(originalQuery);
-  }
-
-  let query = originalQuery;
-  if (ignoreSpaces) {
-    query = ignoreWhiteSpace(query);
-  }
-
-  if (!regexMatch) {
-    query = (0, _escapeRegExp2.default)(query);
-  }
-
-  query = wholeMatch(query, wholeWord);
-  const flags = buildFlags(caseSensitive, isGlobal);
-
-  if (flags) {
-    return new RegExp(query, flags);
-  }
-
-  return new RegExp(query);
-}
-
-/***/ }),
-
 /***/ 1631:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 var _getMatches = __webpack_require__(1632);
 
 var _getMatches2 = _interopRequireDefault(_getMatches);
 
 var _projectSearch = __webpack_require__(1633);
 
-var _devtoolsUtils = __webpack_require__(1363);
+var _devtoolsUtils = __webpack_require__(3651);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 const { workerHandler } = _devtoolsUtils.workerUtils; /* 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/>. */
 
 self.onmessage = workerHandler({ getMatches: _getMatches2.default, findSourceMatches: _projectSearch.findSourceMatches });
@@ -626,17 +338,17 @@ self.onmessage = workerHandler({ getMatc
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.default = getMatches;
 
-var _buildQuery = __webpack_require__(1402);
+var _buildQuery = __webpack_require__(3761);
 
 var _buildQuery2 = _interopRequireDefault(_buildQuery);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function getMatches(query, text, modifiers) {
   if (!query || !text || !modifiers) {
     return [];
@@ -741,16 +453,311 @@ function escapeRegExp(string) {
     : string;
 }
 
 module.exports = escapeRegExp;
 
 
 /***/ }),
 
+/***/ 3651:
+/***/ (function(module, exports, __webpack_require__) {
+
+/* 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 networkRequest = __webpack_require__(3653);
+const workerUtils = __webpack_require__(3654);
+
+module.exports = {
+  networkRequest,
+  workerUtils
+};
+
+/***/ }),
+
+/***/ 3653:
+/***/ (function(module, exports) {
+
+/* 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 networkRequest(url, opts) {
+  return fetch(url, {
+    cache: opts.loadFromCache ? "default" : "no-cache"
+  }).then(res => {
+    if (res.status >= 200 && res.status < 300) {
+      return res.text().then(text => ({ content: text }));
+    }
+    return Promise.reject(`request failed with status ${res.status}`);
+  });
+}
+
+module.exports = networkRequest;
+
+/***/ }),
+
+/***/ 3654:
+/***/ (function(module, exports) {
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+function WorkerDispatcher() {
+  this.msgId = 1;
+  this.worker = null;
+} /* 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/>. */
+
+WorkerDispatcher.prototype = {
+  start(url) {
+    this.worker = new Worker(url);
+    this.worker.onerror = () => {
+      console.error(`Error in worker ${url}`);
+    };
+  },
+
+  stop() {
+    if (!this.worker) {
+      return;
+    }
+
+    this.worker.terminate();
+    this.worker = null;
+  },
+
+  task(method, { queue = false } = {}) {
+    const calls = [];
+    const push = args => {
+      return new Promise((resolve, reject) => {
+        if (queue && calls.length === 0) {
+          Promise.resolve().then(flush);
+        }
+
+        calls.push([args, resolve, reject]);
+
+        if (!queue) {
+          flush();
+        }
+      });
+    };
+
+    const flush = () => {
+      const items = calls.slice();
+      calls.length = 0;
+
+      if (!this.worker) {
+        return;
+      }
+
+      const id = this.msgId++;
+      this.worker.postMessage({
+        id,
+        method,
+        calls: items.map(item => item[0])
+      });
+
+      const listener = ({ data: result }) => {
+        if (result.id !== id) {
+          return;
+        }
+
+        if (!this.worker) {
+          return;
+        }
+
+        this.worker.removeEventListener("message", listener);
+
+        result.results.forEach((resultData, i) => {
+          const [, resolve, reject] = items[i];
+
+          if (resultData.error) {
+            reject(resultData.error);
+          } else {
+            resolve(resultData.response);
+          }
+        });
+      };
+
+      this.worker.addEventListener("message", listener);
+    };
+
+    return (...args) => push(args);
+  }
+};
+
+function workerHandler(publicInterface) {
+  return function (msg) {
+    const { id, method, calls } = msg.data;
+
+    Promise.all(calls.map(args => {
+      try {
+        const response = publicInterface[method].apply(undefined, args);
+        if (response instanceof Promise) {
+          return response.then(val => ({ response: val }),
+          // Error can't be sent via postMessage, so be sure to
+          // convert to string.
+          err => ({ error: err.toString() }));
+        }
+        return { response };
+      } catch (error) {
+        // Error can't be sent via postMessage, so be sure to convert to
+        // string.
+        return { error: error.toString() };
+      }
+    })).then(results => {
+      self.postMessage({ id, results });
+    });
+  };
+}
+
+function streamingWorkerHandler(publicInterface, { timeout = 100 } = {}, worker = self) {
+  let streamingWorker = (() => {
+    var _ref = _asyncToGenerator(function* (id, tasks) {
+      let isWorking = true;
+
+      const timeoutId = setTimeout(function () {
+        isWorking = false;
+      }, timeout);
+
+      const results = [];
+      while (tasks.length !== 0 && isWorking) {
+        const { callback, context, args } = tasks.shift();
+        const result = yield callback.call(context, args);
+        results.push(result);
+      }
+      worker.postMessage({ id, status: "pending", data: results });
+      clearTimeout(timeoutId);
+
+      if (tasks.length !== 0) {
+        yield streamingWorker(id, tasks);
+      }
+    });
+
+    return function streamingWorker(_x, _x2) {
+      return _ref.apply(this, arguments);
+    };
+  })();
+
+  return (() => {
+    var _ref2 = _asyncToGenerator(function* (msg) {
+      const { id, method, args } = msg.data;
+      const workerMethod = publicInterface[method];
+      if (!workerMethod) {
+        console.error(`Could not find ${method} defined in worker.`);
+      }
+      worker.postMessage({ id, status: "start" });
+
+      try {
+        const tasks = workerMethod(args);
+        yield streamingWorker(id, tasks);
+        worker.postMessage({ id, status: "done" });
+      } catch (error) {
+        worker.postMessage({ id, status: "error", error });
+      }
+    });
+
+    return function (_x3) {
+      return _ref2.apply(this, arguments);
+    };
+  })();
+}
+
+module.exports = {
+  WorkerDispatcher,
+  workerHandler,
+  streamingWorkerHandler
+};
+
+/***/ }),
+
+/***/ 3761:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = buildQuery;
+
+var _escapeRegExp = __webpack_require__(259);
+
+var _escapeRegExp2 = _interopRequireDefault(_escapeRegExp);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Ignore doing outline matches for less than 3 whitespaces
+ *
+ * @memberof utils/source-search
+ * @static
+ */
+function ignoreWhiteSpace(str) {
+  return (/^\s{0,2}$/.test(str) ? "(?!\\s*.*)" : str
+  );
+} /* 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 wholeMatch(query, wholeWord) {
+  if (query === "" || !wholeWord) {
+    return query;
+  }
+
+  return `\\b${query}\\b`;
+}
+
+function buildFlags(caseSensitive, isGlobal) {
+  if (caseSensitive && isGlobal) {
+    return "g";
+  }
+
+  if (!caseSensitive && isGlobal) {
+    return "gi";
+  }
+
+  if (!caseSensitive && !isGlobal) {
+    return "i";
+  }
+
+  return;
+}
+
+function buildQuery(originalQuery, modifiers, { isGlobal = false, ignoreSpaces = false }) {
+  const { caseSensitive, regexMatch, wholeWord } = modifiers;
+
+  if (originalQuery === "") {
+    return new RegExp(originalQuery);
+  }
+
+  let query = originalQuery;
+  if (ignoreSpaces) {
+    query = ignoreWhiteSpace(query);
+  }
+
+  if (!regexMatch) {
+    query = (0, _escapeRegExp2.default)(query);
+  }
+
+  query = wholeMatch(query, wholeWord);
+  const flags = buildFlags(caseSensitive, isGlobal);
+
+  if (flags) {
+    return new RegExp(query, flags);
+  }
+
+  return new RegExp(query);
+}
+
+/***/ }),
+
 /***/ 6:
 /***/ (function(module, exports, __webpack_require__) {
 
 var Symbol = __webpack_require__(7),
     getRawTag = __webpack_require__(10),
     objectToString = __webpack_require__(11);
 
 /** `Object#toString` result references. */
--- a/devtools/client/debugger/new/dist/vendors.css
+++ b/devtools/client/debugger/new/dist/vendors.css
@@ -367,16 +367,32 @@ html[dir="rtl"] .tree-node img.arrow {
 .tree .tree-node.focused {
   color: white;
   background-color: var(--theme-selection-background, #0a84ff);
 }
 
 .tree-node.focused img.arrow {
   background-color: currentColor;
 }
+.container {
+  background-color: lightgrey;
+  border: 1px solid darkgrey;
+  cursor: pointer;
+  padding: 0 3px;
+}
+
+.container[aria-selected=true] {
+  background-color: white;
+}
+.container {
+  display: flex;
+  list-style: none;
+  margin: 0;
+  padding: 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/. */
 
 menu {
   display: inline;
   padding: 0;
 }
--- a/devtools/client/debugger/new/dist/vendors.js
+++ b/devtools/client/debugger/new/dist/vendors.js
@@ -871,222 +871,16 @@ function _interopRequireDefault(obj) { r
 /**
  * This file maps the SVG React Components in the assets/images directory.
  */
 
 exports.default = _Svg2.default;
 
 /***/ }),
 
-/***/ 1363:
-/***/ (function(module, exports, __webpack_require__) {
-
-/* 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 networkRequest = __webpack_require__(1367);
-const workerUtils = __webpack_require__(1368);
-
-module.exports = {
-  networkRequest,
-  workerUtils
-};
-
-/***/ }),
-
-/***/ 1367:
-/***/ (function(module, exports) {
-
-/* 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 networkRequest(url, opts) {
-  return fetch(url, {
-    cache: opts.loadFromCache ? "default" : "no-cache"
-  }).then(res => {
-    if (res.status >= 200 && res.status < 300) {
-      return res.text().then(text => ({ content: text }));
-    }
-    return Promise.reject(`request failed with status ${res.status}`);
-  });
-}
-
-module.exports = networkRequest;
-
-/***/ }),
-
-/***/ 1368:
-/***/ (function(module, exports) {
-
-function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
-
-function WorkerDispatcher() {
-  this.msgId = 1;
-  this.worker = null;
-} /* 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/. */
-
-WorkerDispatcher.prototype = {
-  start(url) {
-    this.worker = new Worker(url);
-    this.worker.onerror = () => {
-      console.error(`Error in worker ${url}`);
-    };
-  },
-
-  stop() {
-    if (!this.worker) {
-      return;
-    }
-
-    this.worker.terminate();
-    this.worker = null;
-  },
-
-  task(method, { queue = false } = {}) {
-    const calls = [];
-    const push = args => {
-      return new Promise((resolve, reject) => {
-        if (queue && calls.length === 0) {
-          Promise.resolve().then(flush);
-        }
-
-        calls.push([args, resolve, reject]);
-
-        if (!queue) {
-          flush();
-        }
-      });
-    };
-
-    const flush = () => {
-      const items = calls.slice();
-      calls.length = 0;
-
-      const id = this.msgId++;
-      this.worker.postMessage({ id, method, calls: items.map(item => item[0]) });
-
-      const listener = ({ data: result }) => {
-        if (result.id !== id) {
-          return;
-        }
-
-        if (!this.worker) {
-          return;
-        }
-
-        this.worker.removeEventListener("message", listener);
-
-        result.results.forEach((resultData, i) => {
-          const [, resolve, reject] = items[i];
-
-          if (resultData.error) {
-            reject(resultData.error);
-          } else {
-            resolve(resultData.response);
-          }
-        });
-      };
-
-      this.worker.addEventListener("message", listener);
-    };
-
-    return (...args) => push(args);
-  }
-};
-
-function workerHandler(publicInterface) {
-  return function (msg) {
-    const { id, method, calls } = msg.data;
-
-    Promise.all(calls.map(args => {
-      try {
-        const response = publicInterface[method].apply(undefined, args);
-        if (response instanceof Promise) {
-          return response.then(val => ({ response: val }),
-          // Error can't be sent via postMessage, so be sure to
-          // convert to string.
-          err => ({ error: err.toString() }));
-        } else {
-          return { response };
-        }
-      } catch (error) {
-        // Error can't be sent via postMessage, so be sure to convert to
-        // string.
-        return { error: error.toString() };
-      }
-    })).then(results => {
-      self.postMessage({ id, results });
-    });
-  };
-}
-
-function streamingWorkerHandler(publicInterface, { timeout = 100 } = {}, worker = self) {
-  let streamingWorker = (() => {
-    var _ref = _asyncToGenerator(function* (id, tasks) {
-      let isWorking = true;
-
-      const intervalId = setTimeout(function () {
-        isWorking = false;
-      }, timeout);
-
-      const results = [];
-      while (tasks.length !== 0 && isWorking) {
-        const { callback, context, args } = tasks.shift();
-        const result = yield callback.call(context, args);
-        results.push(result);
-      }
-      worker.postMessage({ id, status: "pending", data: results });
-      clearInterval(intervalId);
-
-      if (tasks.length !== 0) {
-        yield streamingWorker(id, tasks);
-      }
-    });
-
-    return function streamingWorker(_x, _x2) {
-      return _ref.apply(this, arguments);
-    };
-  })();
-
-  return (() => {
-    var _ref2 = _asyncToGenerator(function* (msg) {
-      const { id, method, args } = msg.data;
-      const workerMethod = publicInterface[method];
-      if (!workerMethod) {
-        console.error(`Could not find ${method} defined in worker.`);
-      }
-      worker.postMessage({ id, status: "start" });
-
-      try {
-        const tasks = workerMethod(args);
-        yield streamingWorker(id, tasks);
-        worker.postMessage({ id, status: "done" });
-      } catch (error) {
-        worker.postMessage({ id, status: "error", error });
-      }
-    });
-
-    return function (_x3) {
-      return _ref2.apply(this, arguments);
-    };
-  })();
-}
-
-module.exports = {
-  WorkerDispatcher,
-  workerHandler,
-  streamingWorkerHandler
-};
-
-/***/ }),
-
 /***/ 1376:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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
@@ -7365,16 +7159,229 @@ module.exports = __WEBPACK_EXTERNAL_MODU
 
 /***/ 365:
 /***/ (function(module, exports) {
 
 module.exports = "<!-- 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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><g fill-rule=\"evenodd\"><path d=\"M1.5 14.042h4.095a.5.5 0 0 0 0-1H1.5a.5.5 0 1 0 0 1zM7.983 2a.5.5 0 0 1 .517.5v7.483l3.136-3.326a.5.5 0 1 1 .728.686l-4 4.243a.499.499 0 0 1-.73-.004L3.635 7.343a.5.5 0 0 1 .728-.686L7.5 9.983V3H1.536C1.24 3 1 2.776 1 2.5s.24-.5.536-.5h6.447zM10.5 14.042h4.095a.5.5 0 0 0 0-1H10.5a.5.5 0 1 0 0 1z\"></path></g></svg>"
 
 /***/ }),
 
+/***/ 3651:
+/***/ (function(module, exports, __webpack_require__) {
+
+/* 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 networkRequest = __webpack_require__(3653);
+const workerUtils = __webpack_require__(3654);
+
+module.exports = {
+  networkRequest,
+  workerUtils
+};
+
+/***/ }),
+
+/***/ 3653:
+/***/ (function(module, exports) {
+
+/* 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 networkRequest(url, opts) {
+  return fetch(url, {
+    cache: opts.loadFromCache ? "default" : "no-cache"
+  }).then(res => {
+    if (res.status >= 200 && res.status < 300) {
+      return res.text().then(text => ({ content: text }));
+    }
+    return Promise.reject(`request failed with status ${res.status}`);
+  });
+}
+
+module.exports = networkRequest;
+
+/***/ }),
+
+/***/ 3654:
+/***/ (function(module, exports) {
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+function WorkerDispatcher() {
+  this.msgId = 1;
+  this.worker = null;
+} /* 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/>. */
+
+WorkerDispatcher.prototype = {
+  start(url) {
+    this.worker = new Worker(url);
+    this.worker.onerror = () => {
+      console.error(`Error in worker ${url}`);
+    };
+  },
+
+  stop() {
+    if (!this.worker) {
+      return;
+    }
+
+    this.worker.terminate();
+    this.worker = null;
+  },
+
+  task(method, { queue = false } = {}) {
+    const calls = [];
+    const push = args => {
+      return new Promise((resolve, reject) => {
+        if (queue && calls.length === 0) {
+          Promise.resolve().then(flush);
+        }
+
+        calls.push([args, resolve, reject]);
+
+        if (!queue) {
+          flush();
+        }
+      });
+    };
+
+    const flush = () => {
+      const items = calls.slice();
+      calls.length = 0;
+
+      if (!this.worker) {
+        return;
+      }
+
+      const id = this.msgId++;
+      this.worker.postMessage({
+        id,
+        method,
+        calls: items.map(item => item[0])
+      });
+
+      const listener = ({ data: result }) => {
+        if (result.id !== id) {
+          return;
+        }
+
+        if (!this.worker) {
+          return;
+        }
+
+        this.worker.removeEventListener("message", listener);
+
+        result.results.forEach((resultData, i) => {
+          const [, resolve, reject] = items[i];
+
+          if (resultData.error) {
+            reject(resultData.error);
+          } else {
+            resolve(resultData.response);
+          }
+        });
+      };
+
+      this.worker.addEventListener("message", listener);
+    };
+
+    return (...args) => push(args);
+  }
+};
+
+function workerHandler(publicInterface) {
+  return function (msg) {
+    const { id, method, calls } = msg.data;
+
+    Promise.all(calls.map(args => {
+      try {
+        const response = publicInterface[method].apply(undefined, args);
+        if (response instanceof Promise) {
+          return response.then(val => ({ response: val }),
+          // Error can't be sent via postMessage, so be sure to
+          // convert to string.
+          err => ({ error: err.toString() }));
+        }
+        return { response };
+      } catch (error) {
+        // Error can't be sent via postMessage, so be sure to convert to
+        // string.
+        return { error: error.toString() };
+      }
+    })).then(results => {
+      self.postMessage({ id, results });
+    });
+  };
+}
+
+function streamingWorkerHandler(publicInterface, { timeout = 100 } = {}, worker = self) {
+  let streamingWorker = (() => {
+    var _ref = _asyncToGenerator(function* (id, tasks) {
+      let isWorking = true;
+
+      const timeoutId = setTimeout(function () {
+        isWorking = false;
+      }, timeout);
+
+      const results = [];
+      while (tasks.length !== 0 && isWorking) {
+        const { callback, context, args } = tasks.shift();
+        const result = yield callback.call(context, args);
+        results.push(result);
+      }
+      worker.postMessage({ id, status: "pending", data: results });
+      clearTimeout(timeoutId);
+
+      if (tasks.length !== 0) {
+        yield streamingWorker(id, tasks);
+      }
+    });
+
+    return function streamingWorker(_x, _x2) {
+      return _ref.apply(this, arguments);
+    };
+  })();
+
+  return (() => {
+    var _ref2 = _asyncToGenerator(function* (msg) {
+      const { id, method, args } = msg.data;
+      const workerMethod = publicInterface[method];
+      if (!workerMethod) {
+        console.error(`Could not find ${method} defined in worker.`);
+      }
+      worker.postMessage({ id, status: "start" });
+
+      try {
+        const tasks = workerMethod(args);
+        yield streamingWorker(id, tasks);
+        worker.postMessage({ id, status: "done" });
+      } catch (error) {
+        worker.postMessage({ id, status: "error", error });
+      }
+    });
+
+    return function (_x3) {
+      return _ref2.apply(this, arguments);
+    };
+  })();
+}
+
+module.exports = {
+  WorkerDispatcher,
+  workerHandler,
+  streamingWorkerHandler
+};
+
+/***/ }),
+
 /***/ 366:
 /***/ (function(module, exports) {
 
 module.exports = "<!-- 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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><g fill-rule=\"evenodd\"><path d=\"M5 13.5H1a.5.5 0 1 0 0 1h4a.5.5 0 1 0 0-1zM12 13.5H8a.5.5 0 1 0 0 1h4a.5.5 0 1 0 0-1zM6.11 5.012A.427.427 0 0 1 6.21 5h7.083L9.646 1.354a.5.5 0 1 1 .708-.708l4.5 4.5a.498.498 0 0 1 0 .708l-4.5 4.5a.5.5 0 0 1-.708-.708L13.293 6H6.5v5.5a.5.5 0 1 1-1 0v-6a.5.5 0 0 1 .61-.488z\"></path></g></svg>"
 
 /***/ }),
 
 /***/ 3669:
@@ -8359,28 +8366,32 @@ var devtoolsContextmenu = _interopRequir
 var _devtoolsEnvironment = __webpack_require__(3721);
 
 var devtoolsEnvironment = _interopRequireWildcard(_devtoolsEnvironment);
 
 var _devtoolsModules = __webpack_require__(1376);
 
 var devtoolsModules = _interopRequireWildcard(_devtoolsModules);
 
-var _devtoolsUtils = __webpack_require__(1363);
+var _devtoolsUtils = __webpack_require__(3651);
 
 var devtoolsUtils = _interopRequireWildcard(_devtoolsUtils);
 
 var _fuzzaldrinPlus = __webpack_require__(161);
 
 var fuzzaldrinPlus = _interopRequireWildcard(_fuzzaldrinPlus);
 
 var _Transition = __webpack_require__(333);
 
 var transition = _interopRequireWildcard(_Transition);
 
+var _tabs = __webpack_require__(3762);
+
+var reactAriaComponentsTabs = _interopRequireWildcard(_tabs);
+
 var _reselect = __webpack_require__(993);
 
 var reselect = _interopRequireWildcard(_reselect);
 
 var _url = __webpack_require__(334);
 
 var url = _interopRequireWildcard(_url);
 
@@ -8406,51 +8417,51 @@ function _interopRequireWildcard(obj) { 
 
 // We cannot directly export literals containing special characters
 // (eg. "my-module/Test") which is why they are nested in "vendored".
 // The keys of the vendored object should match the module names
 // !!! Should remain synchronized with .babel/transform-mc.js !!!
 
 
 // Modules imported without destructuring
-/* 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 vendored = exports.vendored = {
+  classnames: _classnames2.default,
+  "devtools-components": devtoolsComponents,
+  "devtools-config": devtoolsConfig,
+  "devtools-contextmenu": devtoolsContextmenu,
+  "devtools-environment": devtoolsEnvironment,
+  "devtools-modules": devtoolsModules,
+  "devtools-splitter": _devtoolsSplitter2.default,
+  "devtools-utils": devtoolsUtils,
+  "fuzzaldrin-plus": fuzzaldrinPlus,
+  "lodash-move": _lodashMove2.default,
+  "react-aria-components/src/tabs": reactAriaComponentsTabs,
+  "react-transition-group/Transition": transition,
+  reselect,
+  // Svg is required via relative paths, so the key is not imported path.
+  // See .babel/transform-mc.js
+  Svg: _Svg2.default,
+  url
+}; /* 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/>. */
 
 /**
  * Vendors.js is a file used to bundle and expose all dependencies needed to run
  * the transpiled debugger modules when running in Firefox.
  *
  * To make transpilation easier, a vendored module should always be imported in
  * same way:
  * - always with destructuring (import { a } from "modA";)
  * - always without destructuring (import modB from "modB")
  *
  * Both are fine, but cannot be mixed for the same module.
  */
 
 // Modules imported with destructuring
-const vendored = exports.vendored = {
-  classnames: _classnames2.default,
-  "devtools-components": devtoolsComponents,
-  "devtools-config": devtoolsConfig,
-  "devtools-contextmenu": devtoolsContextmenu,
-  "devtools-environment": devtoolsEnvironment,
-  "devtools-modules": devtoolsModules,
-  "devtools-splitter": _devtoolsSplitter2.default,
-  "devtools-utils": devtoolsUtils,
-  "fuzzaldrin-plus": fuzzaldrinPlus,
-  "lodash-move": _lodashMove2.default,
-  "react-transition-group/Transition": transition,
-  reselect,
-  // Svg is required via relative paths, so the key is not imported path.
-  // See .babel/transform-mc.js
-  Svg: _Svg2.default,
-  url
-};
 
 /***/ }),
 
 /***/ 3750:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
@@ -9252,16 +9263,435 @@ function getUnicodeUrl(url) {
 module.exports = {
   getUnicodeHostname,
   getUnicodeUrlPath,
   getUnicodeUrl
 };
 
 /***/ }),
 
+/***/ 3758:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _propTypes = __webpack_require__(3642);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
+var _react = __webpack_require__(0);
+
+var _react2 = _interopRequireDefault(_react);
+
+var _tab = __webpack_require__(3759);
+
+var _tab2 = _interopRequireDefault(_tab);
+
+var _tabList = __webpack_require__(3764);
+
+var _tabList2 = _interopRequireDefault(_tabList);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+class TabList extends _react2.default.Component {
+  constructor(props) {
+    super(props);
+    this.handleKeyPress = this.handleKeyPress.bind(this);
+    this.tabRefs = new Array(_react2.default.Children.count(props.children)).fill(0).map(_ => _react2.default.createRef());
+    this.handlers = this.getHandlers(props.vertical);
+  }
+
+  getHandlers(vertical) {
+    if (vertical) {
+      return {
+        ArrowDown: this.next.bind(this),
+        ArrowUp: this.previous.bind(this)
+      };
+    }
+    return {
+      ArrowLeft: this.previous.bind(this),
+      ArrowRight: this.next.bind(this)
+    };
+  }
+
+  wrapIndex(index) {
+    const count = _react2.default.Children.count(this.props.children);
+    return (index + count) % count;
+  }
+
+  handleKeyPress(event) {
+    const handler = this.handlers[event.key];
+    if (handler) {
+      handler();
+    }
+  }
+
+  previous() {
+    const newIndex = this.wrapIndex(this.props.activeIndex - 1);
+    this.props.onActivateTab(newIndex);
+  }
+
+  next() {
+    const newIndex = this.wrapIndex(this.props.activeIndex + 1);
+    this.props.onActivateTab(newIndex);
+  }
+
+  componentDidUpdate(prevProps) {
+    if (prevProps.activeIndex !== this.props.activeIndex) {
+      this.tabRefs[this.props.activeIndex].current.focus();
+    }
+  }
+
+  render() {
+    var _props = this.props;
+    const accessibleId = _props.accessibleId,
+          activeIndex = _props.activeIndex,
+          children = _props.children,
+          className = _props.className,
+          onActivateTab = _props.onActivateTab;
+
+
+    return _react2.default.createElement(
+      'ul',
+      { className: className, onKeyUp: this.handleKeyPress, role: 'tablist' },
+      _react2.default.Children.map(children, (child, index) => {
+        if (child.type !== _tab2.default) {
+          throw new Error('Direct children of a <TabList> must be a <Tab>');
+        }
+
+        const active = index === activeIndex;
+        const tabRef = this.tabRefs[index];
+
+        return _react2.default.cloneElement(child, {
+          accessibleId: active ? accessibleId : undefined,
+          active,
+          tabRef,
+          onActivate: () => this.props.onActivateTab(index)
+        });
+      })
+    );
+  }
+}
+
+exports.default = TabList;
+TabList.propTypes = {
+  accessibleId: _propTypes2.default.string,
+  activeIndex: _propTypes2.default.number,
+  children: _propTypes2.default.node,
+  className: _propTypes2.default.string,
+  onActivateTab: _propTypes2.default.func,
+  vertical: _propTypes2.default.bool
+};
+
+TabList.defaultProps = {
+  accessibleId: undefined,
+  activeIndex: 0,
+  children: null,
+  className: _tabList2.default.container,
+  onActivateTab: () => {},
+  vertical: false
+};
+
+/***/ }),
+
+/***/ 3759:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = Tab;
+
+var _propTypes = __webpack_require__(3642);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
+var _react = __webpack_require__(0);
+
+var _react2 = _interopRequireDefault(_react);
+
+var _tab = __webpack_require__(3763);
+
+var _tab2 = _interopRequireDefault(_tab);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function Tab({
+  accessibleId,
+  active,
+  children,
+  className,
+  onActivate,
+  tabRef
+}) {
+  return _react2.default.createElement(
+    'li',
+    {
+      'aria-selected': active,
+      className: className,
+      id: accessibleId,
+      onClick: onActivate,
+      ref: tabRef,
+      role: 'tab',
+      tabIndex: active ? 0 : undefined
+    },
+    children
+  );
+}
+
+Tab.propTypes = {
+  accessibleId: _propTypes2.default.string,
+  active: _propTypes2.default.bool,
+  children: _propTypes2.default.node,
+  className: _propTypes2.default.string,
+  onActivate: _propTypes2.default.func,
+  tabRef: _propTypes2.default.object
+};
+
+Tab.defaultProps = {
+  accessibleId: undefined,
+  active: false,
+  className: _tab2.default.container,
+  onActivate: undefined,
+  tabRef: undefined
+};
+
+/***/ }),
+
+/***/ 3760:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = TabPanels;
+
+var _propTypes = __webpack_require__(3642);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
+var _react = __webpack_require__(0);
+
+var _react2 = _interopRequireDefault(_react);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function TabPanels({
+  accessibleId,
+  activeIndex,
+  children,
+  className,
+  hasFocusableContent
+}) {
+  return _react2.default.createElement(
+    'div',
+    {
+      'aria-labelledby': accessibleId,
+      role: 'tabpanel',
+      className: className,
+      tabIndex: hasFocusableContent ? undefined : 0
+    },
+    _react2.default.Children.toArray(children)[activeIndex]
+  );
+}
+
+TabPanels.propTypes = {
+  accessibleId: _propTypes2.default.string,
+  activeIndex: _propTypes2.default.number,
+  children: _propTypes2.default.node,
+  className: _propTypes2.default.string,
+  hasFocusableContent: _propTypes2.default.bool.isRequired
+};
+
+TabPanels.defaultProps = {
+  accessibleId: undefined,
+  activeIndex: 0,
+  className: null
+};
+
+/***/ }),
+
+/***/ 3762:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _tabList = __webpack_require__(3758);
+
+Object.defineProperty(exports, 'TabList', {
+  enumerable: true,
+  get: function get() {
+    return _interopRequireDefault(_tabList).default;
+  }
+});
+
+var _tabPanels = __webpack_require__(3760);
+
+Object.defineProperty(exports, 'TabPanels', {
+  enumerable: true,
+  get: function get() {
+    return _interopRequireDefault(_tabPanels).default;
+  }
+});
+
+var _tab = __webpack_require__(3759);
+
+Object.defineProperty(exports, 'Tab', {
+  enumerable: true,
+  get: function get() {
+    return _interopRequireDefault(_tab).default;
+  }
+});
+
+var _tabs = __webpack_require__(3765);
+
+Object.defineProperty(exports, 'Tabs', {
+  enumerable: true,
+  get: function get() {
+    return _interopRequireDefault(_tabs).default;
+  }
+});
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/***/ }),
+
+/***/ 3763:
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+
+/***/ 3764:
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+
+/***/ 3765:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _propTypes = __webpack_require__(3642);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
+var _react = __webpack_require__(0);
+
+var _react2 = _interopRequireDefault(_react);
+
+var _uniqueId = __webpack_require__(3766);
+
+var _uniqueId2 = _interopRequireDefault(_uniqueId);
+
+var _tabList = __webpack_require__(3758);
+
+var _tabList2 = _interopRequireDefault(_tabList);
+
+var _tabPanels = __webpack_require__(3760);
+
+var _tabPanels2 = _interopRequireDefault(_tabPanels);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+class Tabs extends _react2.default.Component {
+  constructor() {
+    super();
+    this.accessibleId = (0, _uniqueId2.default)();
+  }
+
+  render() {
+    var _props = this.props;
+    const activeIndex = _props.activeIndex,
+          children = _props.children,
+          className = _props.className,
+          onActivateTab = _props.onActivateTab;
+
+    const accessibleId = this.accessibleId;
+
+    return _react2.default.createElement(
+      'div',
+      { className: className },
+      _react2.default.Children.map(children, child => {
+        if (!child) {
+          return child;
+        }
+
+        switch (child.type) {
+          case _tabList2.default:
+            return _react2.default.cloneElement(child, { accessibleId, activeIndex, onActivateTab });
+          case _tabPanels2.default:
+            return _react2.default.cloneElement(child, { accessibleId, activeIndex });
+          default:
+            return child;
+        }
+      })
+    );
+  }
+}
+
+exports.default = Tabs;
+Tabs.propTypes = {
+  activeIndex: _propTypes2.default.number.isRequired,
+  children: _propTypes2.default.node,
+  className: _propTypes2.default.string,
+  onActivateTab: _propTypes2.default.func
+};
+
+Tabs.defaultProps = {
+  children: null,
+  className: undefined,
+  onActivateTab: () => {}
+};
+
+/***/ }),
+
+/***/ 3766:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = uniqueId;
+let counter = 0;
+
+function uniqueId() {
+  counter++;
+  return `$rac$${counter}`;
+}
+
+/***/ }),
+
 /***/ 4:
 /***/ (function(module, exports) {
 
 module.exports = __WEBPACK_EXTERNAL_MODULE_4__;
 
 /***/ }),
 
 /***/ 52:
--- a/devtools/client/debugger/new/src/actions/breakpoints/addBreakpoint.js
+++ b/devtools/client/debugger/new/src/actions/breakpoints/addBreakpoint.js
@@ -1,27 +1,31 @@
 "use strict";
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.default = addBreakpoint;
+exports.addHiddenBreakpoint = addHiddenBreakpoint;
+exports.enableBreakpoint = enableBreakpoint;
+exports.addBreakpoint = addBreakpoint;
 
 var _breakpoint = require("../../utils/breakpoint/index");
 
+var _promise = require("../utils/middleware/promise");
+
 var _selectors = require("../../selectors/index");
 
 var _sourceMaps = require("../../utils/source-maps");
 
 var _source = require("../../utils/source");
 
 /* 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/>. */
-async function addBreakpoint(getState, client, sourceMaps, breakpoint) {
+async function addBreakpointPromise(getState, client, sourceMaps, breakpoint) {
   const state = getState();
   const source = (0, _selectors.getSource)(state, breakpoint.location.sourceId);
   const location = { ...breakpoint.location,
     sourceUrl: source.url
   };
   const generatedLocation = await (0, _sourceMaps.getGeneratedLocation)(state, source, location, sourceMaps);
   const generatedSource = (0, _selectors.getSource)(state, generatedLocation.sourceId);
   (0, _breakpoint.assertLocation)(location);
@@ -63,9 +67,92 @@ async function addBreakpoint(getState, c
     originalText
   };
   (0, _breakpoint.assertBreakpoint)(newBreakpoint);
   const previousLocation = (0, _breakpoint.locationMoved)(location, newLocation) ? location : null;
   return {
     breakpoint: newBreakpoint,
     previousLocation
   };
+}
+/**
+ * Add a new hidden breakpoint
+ *
+ * @memberOf actions/breakpoints
+ * @param location
+ * @return {function(ThunkArgs)}
+ */
+
+
+function addHiddenBreakpoint(location) {
+  return ({
+    dispatch
+  }) => {
+    return dispatch(addBreakpoint(location, {
+      hidden: true
+    }));
+  };
+}
+/**
+ * Enabling a breakpoint
+ * will reuse the existing breakpoint information that is stored.
+ *
+ * @memberof actions/breakpoints
+ * @static
+ * @param {Location} $1.location Location  value
+ */
+
+
+function enableBreakpoint(location) {
+  return async ({
+    dispatch,
+    getState,
+    client,
+    sourceMaps
+  }) => {
+    const breakpoint = (0, _selectors.getBreakpoint)(getState(), location);
+
+    if (!breakpoint || breakpoint.loading) {
+      return;
+    } // To instantly reflect in the UI, we optimistically enable the breakpoint
+
+
+    const enabledBreakpoint = { ...breakpoint,
+      disabled: false
+    };
+    return dispatch({
+      type: "ENABLE_BREAKPOINT",
+      breakpoint: enabledBreakpoint,
+      [_promise.PROMISE]: addBreakpointPromise(getState, client, sourceMaps, breakpoint)
+    });
+  };
+}
+/**
+ * Add a new breakpoint
+ *
+ * @memberof actions/breakpoints
+ * @static
+ * @param {String} $1.condition Conditional breakpoint condition value
+ * @param {Boolean} $1.disabled Disable value for breakpoint value
+ */
+
+
+function addBreakpoint(location, {
+  condition,
+  hidden
+} = {}) {
+  const breakpoint = (0, _breakpoint.createBreakpoint)(location, {
+    condition,
+    hidden
+  });
+  return ({
+    dispatch,
+    getState,
+    sourceMaps,
+    client
+  }) => {
+    return dispatch({
+      type: "ADD_BREAKPOINT",
+      breakpoint,
+      [_promise.PROMISE]: addBreakpointPromise(getState, client, sourceMaps, breakpoint)
+    });
+  };
 }
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/src/actions/breakpoints/index.js
@@ -0,0 +1,415 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.syncBreakpoint = exports.enableBreakpoint = exports.addHiddenBreakpoint = exports.addBreakpoint = undefined;
+exports.removeBreakpoint = removeBreakpoint;
+exports.disableBreakpoint = disableBreakpoint;
+exports.toggleAllBreakpoints = toggleAllBreakpoints;
+exports.toggleBreakpoints = toggleBreakpoints;
+exports.removeAllBreakpoints = removeAllBreakpoints;
+exports.removeBreakpoints = removeBreakpoints;
+exports.remapBreakpoints = remapBreakpoints;
+exports.setBreakpointCondition = setBreakpointCondition;
+exports.toggleBreakpoint = toggleBreakpoint;
+exports.toggleBreakpointsAtLine = toggleBreakpointsAtLine;
+exports.addOrToggleDisabledBreakpoint = addOrToggleDisabledBreakpoint;
+exports.toggleDisabledBreakpoint = toggleDisabledBreakpoint;
+
+var _promise = require("../utils/middleware/promise");
+
+var _selectors = require("../../selectors/index");
+
+var _breakpoint = require("../../utils/breakpoint/index");
+
+var _addBreakpoint = require("./addBreakpoint");
+
+var _remapLocations = require("./remapLocations");
+
+var _remapLocations2 = _interopRequireDefault(_remapLocations);
+
+var _syncBreakpoint = require("./syncBreakpoint");
+
+var _ast = require("../../reducers/ast");
+
+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/>. */
+
+/**
+ * Redux actions for breakpoints
+ * @module actions/breakpoints
+ */
+
+/**
+ * Remove a single breakpoint
+ *
+ * @memberof actions/breakpoints
+ * @static
+ */
+function removeBreakpoint(location) {
+  return ({
+    dispatch,
+    getState,
+    client
+  }) => {
+    const bp = (0, _selectors.getBreakpoint)(getState(), location);
+
+    if (!bp || bp.loading) {
+      return;
+    } // If the breakpoint is already disabled, we don't need to communicate
+    // with the server. We just need to dispatch an action
+    // simulating a successful server request
+
+
+    if (bp.disabled) {
+      return dispatch({
+        type: "REMOVE_BREAKPOINT",
+        breakpoint: bp,
+        status: "done"
+      });
+    }
+
+    return dispatch({
+      type: "REMOVE_BREAKPOINT",
+      breakpoint: bp,
+      disabled: false,
+      [_promise.PROMISE]: client.removeBreakpoint(bp.generatedLocation)
+    });
+  };
+}
+/**
+ * Disable a single breakpoint
+ *
+ * @memberof actions/breakpoints
+ * @static
+ */
+
+
+function disableBreakpoint(location) {
+  return async ({
+    dispatch,
+    getState,
+    client
+  }) => {
+    const bp = (0, _selectors.getBreakpoint)(getState(), location);
+
+    if (!bp || bp.loading) {
+      return;
+    }
+
+    await client.removeBreakpoint(bp.generatedLocation);
+    const newBreakpoint = { ...bp,
+      disabled: true
+    };
+    return dispatch({
+      type: "DISABLE_BREAKPOINT",
+      breakpoint: newBreakpoint
+    });
+  };
+}
+/**
+ * Toggle All Breakpoints
+ *
+ * @memberof actions/breakpoints
+ * @static
+ */
+
+
+function toggleAllBreakpoints(shouldDisableBreakpoints) {
+  return async ({
+    dispatch,
+    getState,
+    client
+  }) => {
+    const breakpoints = (0, _selectors.getBreakpoints)(getState());
+    const modifiedBreakpoints = [];
+
+    for (const [, breakpoint] of breakpoints) {
+      if (shouldDisableBreakpoints) {
+        await client.removeBreakpoint(breakpoint.generatedLocation);
+        const newBreakpoint = { ...breakpoint,
+          disabled: true
+        };
+        modifiedBreakpoints.push(newBreakpoint);
+      } else {
+        const newBreakpoint = { ...breakpoint,
+          disabled: false
+        };
+        modifiedBreakpoints.push(newBreakpoint);
+      }
+    }
+
+    if (shouldDisableBreakpoints) {
+      return dispatch({
+        type: "DISABLE_ALL_BREAKPOINTS",
+        breakpoints: modifiedBreakpoints
+      });
+    }
+
+    return dispatch({
+      type: "ENABLE_ALL_BREAKPOINTS",
+      breakpoints: modifiedBreakpoints
+    });
+  };
+}
+/**
+ * Toggle Breakpoints
+ *
+ * @memberof actions/breakpoints
+ * @static
+ */
+
+
+function toggleBreakpoints(shouldDisableBreakpoints, breakpoints) {
+  return async ({
+    dispatch
+  }) => {
+    const promises = breakpoints.valueSeq().toJS().map(([, breakpoint]) => shouldDisableBreakpoints ? dispatch(disableBreakpoint(breakpoint.location)) : dispatch((0, _addBreakpoint.enableBreakpoint)(breakpoint.location)));
+    await Promise.all(promises);
+  };
+}
+/**
+ * Removes all breakpoints
+ *
+ * @memberof actions/breakpoints
+ * @static
+ */
+
+
+function removeAllBreakpoints() {
+  return async ({
+    dispatch,
+    getState
+  }) => {
+    const breakpointList = (0, _selectors.getBreakpoints)(getState()).valueSeq().toJS();
+    return Promise.all(breakpointList.map(bp => dispatch(removeBreakpoint(bp.location))));
+  };
+}
+/**
+ * Removes breakpoints
+ *
+ * @memberof actions/breakpoints
+ * @static
+ */
+
+
+function removeBreakpoints(breakpoints) {
+  return async ({
+    dispatch
+  }) => {
+    const breakpointList = breakpoints.valueSeq().toJS();
+    return Promise.all(breakpointList.map(bp => dispatch(removeBreakpoint(bp.location))));
+  };
+}
+
+function remapBreakpoints(sourceId) {
+  return async ({
+    dispatch,
+    getState,
+    sourceMaps
+  }) => {
+    const breakpoints = (0, _selectors.getBreakpoints)(getState());
+    const newBreakpoints = await (0, _remapLocations2.default)(breakpoints, sourceId, sourceMaps);
+    return dispatch({
+      type: "REMAP_BREAKPOINTS",
+      breakpoints: newBreakpoints
+    });
+  };
+}
+/**
+ * Update the condition of a breakpoint.
+ *
+ * @throws {Error} "not implemented"
+ * @memberof actions/breakpoints
+ * @static
+ * @param {Location} location
+ *        @see DebuggerController.Breakpoints.addBreakpoint
+ * @param {string} condition
+ *        The condition to set on the breakpoint
+ * @param {Boolean} $1.disabled Disable value for breakpoint value
+ */
+
+
+function setBreakpointCondition(location, {
+  condition
+} = {}) {
+  return async ({
+    dispatch,
+    getState,
+    client,
+    sourceMaps
+  }) => {
+    const bp = (0, _selectors.getBreakpoint)(getState(), location);
+
+    if (!bp) {
+      return dispatch((0, _addBreakpoint.addBreakpoint)(location, {
+        condition
+      }));
+    }
+
+    if (bp.loading) {
+      return;
+    }
+
+    if (bp.disabled) {
+      await dispatch((0, _addBreakpoint.enableBreakpoint)(location));
+      bp.disabled = !bp.disabled;
+    }
+
+    await client.setBreakpointCondition(bp.id, location, condition, sourceMaps.isOriginalId(bp.location.sourceId));
+    const newBreakpoint = { ...bp,
+      condition
+    };
+    (0, _breakpoint.assertBreakpoint)(newBreakpoint);
+    return dispatch({
+      type: "SET_BREAKPOINT_CONDITION",
+      breakpoint: newBreakpoint
+    });
+  };
+}
+
+function toggleBreakpoint(line, column) {
+  return ({
+    dispatch,
+    getState,
+    client,
+    sourceMaps
+  }) => {
+    const state = getState();
+    const selectedSource = (0, _selectors.getSelectedSource)(state);
+
+    if (!line || !selectedSource) {
+      return;
+    }
+
+    const bp = (0, _selectors.getBreakpointAtLocation)(state, {
+      line,
+      column
+    });
+    const isEmptyLine = (0, _ast.isEmptyLineInSource)(state, line, selectedSource.id);
+
+    if (!bp && isEmptyLine || bp && bp.loading) {
+      return;
+    }
+
+    if (bp) {
+      // NOTE: it's possible the breakpoint has slid to a column
+      return dispatch(removeBreakpoint({
+        sourceId: bp.location.sourceId,
+        sourceUrl: bp.location.sourceUrl,
+        line: bp.location.line,
+        column: column || bp.location.column
+      }));
+    }
+
+    return dispatch((0, _addBreakpoint.addBreakpoint)({
+      sourceId: selectedSource.id,
+      sourceUrl: selectedSource.url,
+      line: line,
+      column: column
+    }));
+  };
+}
+
+function toggleBreakpointsAtLine(line, column) {
+  return ({
+    dispatch,
+    getState,
+    client,
+    sourceMaps
+  }) => {
+    const state = getState();
+    const selectedSource = (0, _selectors.getSelectedSource)(state);
+
+    if (!line || !selectedSource) {
+      return;
+    }
+
+    const bps = (0, _selectors.getBreakpointsAtLine)(state, line);
+    const isEmptyLine = (0, _ast.isEmptyLineInSource)(state, line, selectedSource.id);
+
+    if (isEmptyLine) {
+      return;
+    }
+
+    if (bps.size === 0) {
+      return dispatch((0, _addBreakpoint.addBreakpoint)({
+        sourceId: selectedSource.id,
+        sourceUrl: selectedSource.url,
+        line,
+        column
+      }));
+    }
+
+    return Promise.all(bps.map(bp => dispatch(removeBreakpoint(bp.location))));
+  };
+}
+
+function addOrToggleDisabledBreakpoint(line, column) {
+  return ({
+    dispatch,
+    getState,
+    client,
+    sourceMaps
+  }) => {
+    const selectedSource = (0, _selectors.getSelectedSource)(getState());
+
+    if (!line || !selectedSource) {
+      return;
+    }
+
+    const bp = (0, _selectors.getBreakpointAtLocation)(getState(), {
+      line,
+      column
+    });
+
+    if (bp && bp.loading) {
+      return;
+    }
+
+    if (bp) {
+      // NOTE: it's possible the breakpoint has slid to a column
+      return dispatch(toggleDisabledBreakpoint(line, column || bp.location.column));
+    }
+
+    return dispatch((0, _addBreakpoint.addBreakpoint)({
+      sourceId: selectedSource.id,
+      sourceUrl: selectedSource.url,
+      line: line,
+      column: column
+    }));
+  };
+}
+
+function toggleDisabledBreakpoint(line, column) {
+  return ({
+    dispatch,
+    getState,
+    client,
+    sourceMaps
+  }) => {
+    const bp = (0, _selectors.getBreakpointAtLocation)(getState(), {
+      line,
+      column
+    });
+
+    if (!bp || bp.loading) {
+      return;
+    }
+
+    if (!bp.disabled) {
+      return dispatch(disableBreakpoint(bp.location));
+    }
+
+    return dispatch((0, _addBreakpoint.enableBreakpoint)(bp.location));
+  };
+}
+
+exports.addBreakpoint = _addBreakpoint.addBreakpoint;
+exports.addHiddenBreakpoint = _addBreakpoint.addHiddenBreakpoint;
+exports.enableBreakpoint = _addBreakpoint.enableBreakpoint;
+exports.syncBreakpoint = _syncBreakpoint.syncBreakpoint;
\ No newline at end of file
--- a/devtools/client/debugger/new/src/actions/breakpoints/moz.build
+++ b/devtools/client/debugger/new/src/actions/breakpoints/moz.build
@@ -4,11 +4,12 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DIRS += [
 
 ]
 
 DevToolsModules(
     'addBreakpoint.js',
+    'index.js',
     'remapLocations.js',
     'syncBreakpoint.js',
 )
--- a/devtools/client/debugger/new/src/actions/breakpoints/syncBreakpoint.js
+++ b/devtools/client/debugger/new/src/actions/breakpoints/syncBreakpoint.js
@@ -1,14 +1,15 @@
 "use strict";
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.syncClientBreakpoint = syncClientBreakpoint;
+exports.syncBreakpointPromise = syncBreakpointPromise;
+exports.syncBreakpoint = syncBreakpoint;
 
 var _breakpoint = require("../../utils/breakpoint/index");
 
 var _sourceMaps = require("../../utils/source-maps");
 
 var _source = require("../../utils/source");
 
 var _devtoolsSourceMap = require("devtools/client/shared/source-map/index.js");
@@ -47,17 +48,17 @@ function createSyncData(id, pendingBreak
   return {
     breakpoint,
     previousLocation
   };
 } // we have three forms of syncing: disabled syncing, existing server syncing
 // and adding a new breakpoint
 
 
-async function syncClientBreakpoint(getState, client, sourceMaps, sourceId, pendingBreakpoint) {
+async function syncBreakpointPromise(getState, client, sourceMaps, sourceId, pendingBreakpoint) {
   (0, _breakpoint.assertPendingBreakpoint)(pendingBreakpoint);
   const source = (0, _selectors.getSource)(getState(), sourceId);
   const generatedSourceId = sourceMaps.isOriginalId(sourceId) ? (0, _devtoolsSourceMap.originalToGeneratedId)(sourceId) : sourceId;
   const generatedSource = (0, _selectors.getSource)(getState(), generatedSourceId);
 
   if (!source) {
     return null;
   }
@@ -111,9 +112,44 @@ async function syncClientBreakpoint(getS
   } = await client.setBreakpoint(scopedGeneratedLocation, pendingBreakpoint.condition, sourceMaps.isOriginalId(sourceId)); // the breakpoint might have slid server side, so we want to get the location
   // based on the server's return value
 
   const newGeneratedLocation = actualLocation;
   const newLocation = await sourceMaps.getOriginalLocation(newGeneratedLocation);
   const originalText = (0, _source.getTextAtPosition)(source, newLocation);
   const text = (0, _source.getTextAtPosition)(generatedSource, newGeneratedLocation);
   return createSyncData(id, pendingBreakpoint, newLocation, newGeneratedLocation, previousLocation, text, originalText);
+}
+/**
+ * Syncing a breakpoint add breakpoint information that is stored, and
+ * contact the server for more data.
+ *
+ * @memberof actions/breakpoints
+ * @static
+ * @param {String} $1.sourceId String  value
+ * @param {PendingBreakpoint} $1.location PendingBreakpoint  value
+ */
+
+
+function syncBreakpoint(sourceId, pendingBreakpoint) {
+  return async ({
+    dispatch,
+    getState,
+    client,
+    sourceMaps
+  }) => {
+    const response = await syncBreakpointPromise(getState, client, sourceMaps, sourceId, pendingBreakpoint);
+
+    if (!response) {
+      return;
+    }
+
+    const {
+      breakpoint,
+      previousLocation
+    } = response;
+    return dispatch({
+      type: "SYNC_BREAKPOINT",
+      breakpoint,
+      previousLocation
+    });
+  };
 }
\ No newline at end of file
--- a/devtools/client/debugger/new/src/actions/index.js
+++ b/devtools/client/debugger/new/src/actions/index.js
@@ -1,15 +1,15 @@
 "use strict";
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
-var _breakpoints = require("./breakpoints");
+var _breakpoints = require("./breakpoints/index");
 
 var breakpoints = _interopRequireWildcard(_breakpoints);
 
 var _expressions = require("./expressions");
 
 var expressions = _interopRequireWildcard(_expressions);
 
 var _eventListeners = require("./event-listeners");
--- a/devtools/client/debugger/new/src/actions/moz.build
+++ b/devtools/client/debugger/new/src/actions/moz.build
@@ -8,17 +8,16 @@ DIRS += [
     'breakpoints',
     'pause',
     'sources',
     'utils',
 ]
 
 DevToolsModules(
     'ast.js',
-    'breakpoints.js',
     'coverage.js',
     'debuggee.js',
     'event-listeners.js',
     'expressions.js',
     'file-search.js',
     'index.js',
     'navigation.js',
     'preview.js',
--- a/devtools/client/debugger/new/src/actions/pause/commands.js
+++ b/devtools/client/debugger/new/src/actions/pause/commands.js
@@ -15,17 +15,17 @@ exports.reverseStepOut = reverseStepOut;
 exports.astCommand = astCommand;
 
 var _selectors = require("../../selectors/index");
 
 var _promise = require("../utils/middleware/promise");
 
 var _parser = require("../../workers/parser/index");
 
-var _breakpoints = require("../breakpoints");
+var _breakpoints = require("../breakpoints/index");
 
 var _prefs = require("../../utils/prefs");
 
 /* -*- indent-tabs-mode: nil; js-indent-level: 2; js-indent-level: 2 -*- */
 
 /* 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/>. */
--- a/devtools/client/debugger/new/src/actions/pause/continueToHere.js
+++ b/devtools/client/debugger/new/src/actions/pause/continueToHere.js
@@ -2,17 +2,17 @@
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.continueToHere = continueToHere;
 
 var _selectors = require("../../selectors/index");
 
-var _breakpoints = require("../breakpoints");
+var _breakpoints = require("../breakpoints/index");
 
 var _commands = require("./commands");
 
 /* 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 continueToHere(line) {
   return async function ({
--- a/devtools/client/debugger/new/src/actions/pause/paused.js
+++ b/devtools/client/debugger/new/src/actions/pause/paused.js
@@ -6,17 +6,17 @@ Object.defineProperty(exports, "__esModu
 exports.paused = paused;
 
 var _devtoolsSourceMap = require("devtools/client/shared/source-map/index.js");
 
 var _selectors = require("../../selectors/index");
 
 var _ = require("./index");
 
-var _breakpoints = require("../breakpoints");
+var _breakpoints = require("../breakpoints/index");
 
 var _expressions = require("../expressions");
 
 var _sources = require("../sources/index");
 
 var _loadSourceText = require("../sources/loadSourceText");
 
 var _ui = require("../ui");
@@ -51,17 +51,17 @@ function paused(pauseInfo) {
     client,
     sourceMaps
   }) {
     const {
       frames,
       why,
       loadedObjects
     } = pauseInfo;
-    const topFrame = frames.length > 0 ? frames[0] : null;
+    const topFrame = frames.length > 0 ? frames[0] : null; // NOTE: do not step when leaving a frame or paused at a debugger statement
 
     if (topFrame && !why.frameFinished && why.type == "resumeLimit") {
       const mappedFrame = await (0, _mapFrames.updateFrameLocation)(topFrame, sourceMaps);
       const source = await getOriginalSourceForFrame(getState(), mappedFrame); // Ensure that the original file has loaded if there is one.
 
       await dispatch((0, _loadSourceText.loadSourceText)(source));
 
       if ((0, _pause.shouldStep)(mappedFrame, getState(), sourceMaps)) {
--- a/devtools/client/debugger/new/src/actions/sources/newSources.js
+++ b/devtools/client/debugger/new/src/actions/sources/newSources.js
@@ -7,17 +7,17 @@ exports.newSource = newSource;
 exports.newSources = newSources;
 
 var _devtoolsSourceMap = require("devtools/client/shared/source-map/index.js");
 
 var _lodash = require("devtools/client/shared/vendor/lodash");
 
 var _blackbox = require("./blackbox");
 
-var _breakpoints = require("../breakpoints");
+var _breakpoints = require("../breakpoints/index");
 
 var _loadSourceText = require("./loadSourceText");
 
 var _prettyPrint = require("./prettyPrint");
 
 var _sources = require("../sources/index");
 
 var _source = require("../../utils/source");
--- a/devtools/client/debugger/new/src/actions/sources/prettyPrint.js
+++ b/devtools/client/debugger/new/src/actions/sources/prettyPrint.js
@@ -5,17 +5,17 @@ Object.defineProperty(exports, "__esModu
 });
 exports.createPrettySource = createPrettySource;
 exports.togglePrettyPrint = togglePrettyPrint;
 
 var _assert = require("../../utils/assert");
 
 var _assert2 = _interopRequireDefault(_assert);
 
-var _breakpoints = require("../breakpoints");
+var _breakpoints = require("../breakpoints/index");
 
 var _ast = require("../ast");
 
 var _prettyPrint = require("../../workers/pretty-print/index");
 
 var _parser = require("../../workers/parser/index");
 
 var _source = require("../../utils/source");
--- a/devtools/client/debugger/new/src/actions/sources/select.js
+++ b/devtools/client/debugger/new/src/actions/sources/select.js
@@ -103,17 +103,19 @@ function selectSource(sourceId) {
   };
 }
 /**
  * @memberof actions/sources
  * @static
  */
 
 
-function selectLocation(location) {
+function selectLocation(location, {
+  checkPrettyPrint = true
+} = {}) {
   return async ({
     dispatch,
     getState,
     client
   }) => {
     const currentSource = (0, _selectors.getSelectedSource)(getState());
 
     if (!client) {
@@ -140,17 +142,17 @@ function selectLocation(location) {
     await dispatch((0, _loadSourceText.loadSourceText)(source));
     const loadedSource = (0, _selectors.getSource)(getState(), source.id);
 
     if (!loadedSource) {
       // If there was a navigation while we were loading the loadedSource
       return;
     }
 
-    if (_prefs.prefs.autoPrettyPrint && !(0, _selectors.getPrettySource)(getState(), loadedSource.id) && (0, _source.shouldPrettyPrint)(loadedSource) && (0, _source.isMinified)(loadedSource)) {
+    if (checkPrettyPrint && _prefs.prefs.autoPrettyPrint && !(0, _selectors.getPrettySource)(getState(), loadedSource.id) && (0, _source.shouldPrettyPrint)(loadedSource) && (0, _source.isMinified)(loadedSource)) {
       await dispatch((0, _prettyPrint.togglePrettyPrint)(loadedSource.id));
       dispatch((0, _tabs.closeTab)(loadedSource.url));
     }
 
     dispatch((0, _ast.setSymbols)(loadedSource.id));
     dispatch((0, _ast.setOutOfScopeLocations)()); // If a new source is selected update the file search results
 
     const newSource = (0, _selectors.getSelectedSource)(getState());
@@ -162,61 +164,19 @@ function selectLocation(location) {
 }
 /**
  * @memberof actions/sources
  * @static
  */
 
 
 function selectSpecificLocation(location) {
-  return async ({
-    dispatch,
-    getState,
-    client
-  }) => {
-    const currentSource = (0, _selectors.getSelectedSource)(getState());
-
-    if (!client) {
-      // No connection, do nothing. This happens when the debugger is
-      // shut down too fast and it tries to display a default source.
-      return;
-    }
-
-    const source = (0, _selectors.getSource)(getState(), location.sourceId);
-
-    if (!source) {
-      // If there is no source we deselect the current selected source
-      return dispatch(clearSelectedLocation());
-    }
-
-    const activeSearch = (0, _selectors.getActiveSearch)(getState());
-
-    if (activeSearch !== "file") {
-      dispatch((0, _ui.closeActiveSearch)());
-    }
-
-    dispatch((0, _tabs.addTab)(source.url, 0));
-    dispatch(setSelectedLocation(source, location));
-    await dispatch((0, _loadSourceText.loadSourceText)(source));
-    const loadedSource = (0, _selectors.getSource)(getState(), source.id);
-
-    if (!loadedSource) {
-      return;
-    }
-
-    const sourceId = loadedSource.id;
-    dispatch((0, _ast.setSymbols)(sourceId));
-    dispatch((0, _ast.setOutOfScopeLocations)()); // If a new source is selected update the file search results
-
-    const newSource = (0, _selectors.getSelectedSource)(getState());
-
-    if (currentSource && currentSource !== newSource) {
-      dispatch((0, _ui.updateActiveFileSearch)());
-    }
-  };
+  return selectLocation(location, {
+    checkPrettyPrint: false
+  });
 }
 /**
  * @memberof actions/sources
  * @static
  */
 
 
 function selectSpecificSource(sourceId) {
--- a/devtools/client/debugger/new/src/components/Editor/Preview/Popup.js
+++ b/devtools/client/debugger/new/src/components/Editor/Preview/Popup.js
@@ -69,30 +69,58 @@ function inPreview(event) {
   } // $FlowIgnore
 
 
   const inPreviewSelection = document.elementsFromPoint(event.clientX, event.clientY).some(el => el.classList.contains("preview-selection"));
   return inPreviewSelection;
 }
 
 class Popup extends _react.Component {
-  constructor(...args) {
-    var _temp;
+  constructor(props) {
+    super(props);
 
-    return _temp = super(...args), this.onMouseLeave = e => {
+    this.onMouseLeave = e => {
       const relatedTarget = e.relatedTarget;
 
       if (!relatedTarget) {
         return this.props.onClose();
       }
 
       if (!inPreview(e)) {
         this.props.onClose();
       }
-    }, _temp;
+    };
+
+    this.onKeyDown = e => {
+      if (e.key === "Escape") {
+        this.props.onClose();
+      }
+    };
+
+    this.calculateMaxHeight = () => {
+      const {
+        editorRef
+      } = this.props;
+
+      if (!editorRef) {
+        return "auto";
+      }
+
+      return editorRef.getBoundingClientRect().height - this.state.top;
+    };
+
+    this.onPopoverCoords = coords => {
+      this.setState({
+        top: coords.top
+      });
+    };
+
+    this.state = {
+      top: 0
+    };
   }
 
   async componentWillMount() {
     const {
       value,
       setPopupObjectProperties,
       popupObjectProperties
     } = this.props;
@@ -230,17 +258,20 @@ class Popup extends _react.Component {
     }
 
     if (extra.react && (0, _preview.isReactComponent)(this.getObjectProperties())) {
       header = this.renderReact(extra.react);
       roots = roots.filter(r => ["state", "props"].includes(r.name));
     }
 
     return _react2.default.createElement("div", {
-      className: "preview-popup"
+      className: "preview-popup",
+      style: {
+        maxHeight: this.calculateMaxHeight()
+      }
     }, header, this.renderObjectInspector(roots));
   }
 
   renderSimplePreview(value) {
     const {
       openLink
     } = this.props;
     return _react2.default.createElement("div", {
@@ -304,17 +335,19 @@ class Popup extends _react.Component {
 
     if (value && value.type === "object" && !this.getChildren()) {
       return null;
     }
 
     return _react2.default.createElement(_Popover2.default, {
       targetPosition: popoverPos,
       onMouseLeave: this.onMouseLeave,
+      onKeyDown: this.onKeyDown,
       type: type,
+      onPopoverCoords: this.onPopoverCoords,
       editorRef: editorRef
     }, this.renderPreview());
   }
 
 }
 
 exports.Popup = Popup;
 
--- a/devtools/client/debugger/new/src/components/PrimaryPanes/index.js
+++ b/devtools/client/debugger/new/src/components/PrimaryPanes/index.js
@@ -5,16 +5,18 @@ Object.defineProperty(exports, "__esModu
 });
 
 var _react = require("devtools/client/shared/vendor/react");
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = require("devtools/client/shared/vendor/react-redux");
 
+var _tabs = require("devtools/client/debugger/new/dist/vendors").vendored["react-aria-components/src/tabs"];
+
 var _text = require("../../utils/text");
 
 var _actions = require("../../actions/index");
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = require("../../selectors/index");
 
@@ -48,77 +50,69 @@ class PrimaryPanes extends _react.Compon
     this.onAlphabetizeClick = () => {
       const alphabetizeOutline = !_prefs.prefs.alphabetizeOutline;
       _prefs.prefs.alphabetizeOutline = alphabetizeOutline;
       this.setState({
         alphabetizeOutline
       });
     };
 
-    this.renderTabs = () => {
-      return _react2.default.createElement("div", {
-        className: "source-outline-tabs"
-      }, this.renderOutlineTabs());
-    };
-
-    this.renderShortcut = () => {
-      if (this.props.horizontal) {
-        const onClick = () => {
-          if (this.props.sourceSearchOn) {
-            return this.props.closeActiveSearch();
-          }
-
-          this.props.setActiveSearch("source");
-        };
-
-        return _react2.default.createElement("span", {
-          className: "sources-header-info",
-          dir: "ltr",
-          onClick: onClick
-        }, L10N.getFormatStr("sources.search", (0, _text.formatKeyShortcut)(L10N.getStr("sources.search.key2"))));
+    this.onActivateTab = index => {
+      if (index === 0) {
+        this.showPane("sources");
+      } else {
+        this.showPane("outline");
       }
     };
 
     this.state = {
       alphabetizeOutline: _prefs.prefs.alphabetizeOutline
     };
   }
 
   renderOutlineTabs() {
     if (!_prefs.features.outline) {
       return;
     }
 
     const sources = (0, _text.formatKeyShortcut)(L10N.getStr("sources.header"));
     const outline = (0, _text.formatKeyShortcut)(L10N.getStr("outline.header"));
-    return [_react2.default.createElement("div", {
+    const isSources = this.props.selectedTab === "sources";
+    const isOutline = this.props.selectedTab === "outline";
+    return [_react2.default.createElement(_tabs.Tab, {
       className: (0, _classnames2.default)("tab sources-tab", {
-        active: this.props.selectedTab === "sources"
+        active: isSources
       }),
-      onClick: () => this.showPane("sources"),
       key: "sources-tab"
-    }, sources), _react2.default.createElement("div", {
+    }, sources), _react2.default.createElement(_tabs.Tab, {
       className: (0, _classnames2.default)("tab outline-tab", {
-        active: this.props.selectedTab === "outline"
+        active: isOutline
       }),
-      onClick: () => this.showPane("outline"),
       key: "outline-tab"
     }, outline)];
   }
 
   render() {
     const {
       selectedTab
     } = this.props;
-    return _react2.default.createElement("div", {
-      className: "sources-panel"
-    }, this.renderTabs(), selectedTab === "sources" ? _react2.default.createElement(_SourcesTree2.default, null) : _react2.default.createElement(_Outline2.default, {
+    const activeIndex = selectedTab === "sources" ? 0 : 1;
+    return _react2.default.createElement(_tabs.Tabs, {
+      activeIndex: activeIndex,
+      className: "sources-panel",
+      onActivateTab: this.onActivateTab
+    }, _react2.default.createElement(_tabs.TabList, {
+      className: "source-outline-tabs"
+    }, this.renderOutlineTabs()), _react2.default.createElement(_tabs.TabPanels, {
+      className: "source-outline-panel",
+      hasFocusableContent: true
+    }, _react2.default.createElement(_SourcesTree2.default, null), _react2.default.createElement(_Outline2.default, {
       alphabetizeOutline: this.state.alphabetizeOutline,
       onAlphabetizeClick: this.onAlphabetizeClick
-    }));
+    })));
   }
 
 }
 
 const mapStateToProps = state => ({
   selectedTab: (0, _selectors.getSelectedPrimaryPaneTab)(state),
   sources: (0, _selectors.getSources)(state),
   sourceSearchOn: (0, _selectors.getActiveSearch)(state) === "source"
--- a/devtools/client/debugger/new/src/components/shared/Popover.js
+++ b/devtools/client/debugger/new/src/components/shared/Popover.js
@@ -17,20 +17,30 @@ var _BracketArrow = require("./BracketAr
 var _BracketArrow2 = _interopRequireDefault(_BracketArrow);
 
 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/>. */
 class Popover extends _react.Component {
-  constructor(props) {
-    super(props);
+  constructor(...args) {
+    var _temp;
 
-    this.calculateTopForRightOrientation = (target, editor, popover) => {
+    return _temp = super(...args), this.state = {
+      coords: {
+        left: 0,
+        top: 0,
+        orientation: "down",
+        targetMid: {
+          x: 0,
+          y: 0
+        }
+      }
+    }, this.calculateTopForRightOrientation = (target, editor, popover) => {
       if (popover.height < editor.height) {
         const rightOrientationTop = target.top - popover.height / 2;
 
         if (rightOrientationTop < editor.top) {
           return editor.top;
         }
 
         const rightOrientationBottom = rightOrientationTop + popover.height;
@@ -38,58 +48,42 @@ class Popover extends _react.Component {
         if (rightOrientationBottom > editor.bottom) {
           return editor.bottom - popover.height;
         }
 
         return rightOrientationTop;
       }
 
       return 0;
-    };
-
-    this.calculateTop = (target, editor, popover, orientation) => {
+    }, this.calculateTop = (target, editor, popover, orientation) => {
       if (orientation === "down") {
         return target.bottom;
       }
 
       if (orientation === "up") {
         return target.top - popover.height;
       }
 
       return this.calculateTopForRightOrientation(target, editor, popover);
-    };
-
-    this.state = {
-      left: 0,
-      top: 0,
-      targetMid: {
-        x: 0,
-        y: 0
-      },
-      orientation: "up"
-    };
+    }, _temp;
   }
 
   componentDidMount() {
     const {
       type
     } = this.props;
-    const {
-      left,
-      top,
-      orientation,
-      targetMid
-    } = type == "popover" ? this.getPopoverCoords() : this.getTooltipCoords(); // eslint-disable-next-line react/no-did-mount-set-state
+    const coords = type == "popover" ? this.getPopoverCoords() : this.getTooltipCoords();
 
-    this.setState({
-      left,
-      top,
-      orientation,
-      targetMid
-    });
+    if (coords) {
+      this.setState({
+        coords
+      });
+    }
+
+    this.props.onPopoverCoords(this.state.coords);
   }
 
   calculateLeft(target, editor, popover, orientation) {
     const estimatedLeft = target.left;
     const estimatedRight = estimatedLeft + popover.width;
     const isOverflowingRight = estimatedRight > editor.right;
 
     if (orientation === "right") {
@@ -116,97 +110,81 @@ class Popover extends _react.Component {
     if (upOrientationTop > editor.top) {
       return "up";
     }
 
     return "right";
   }
 
   getPopoverCoords() {
-    if (this.$popover && this.props.editorRef) {
-      const popover = this.$popover;
-      const editor = this.props.editorRef;
-      const popoverRect = popover.getBoundingClientRect();
-      const editorRect = editor.getBoundingClientRect();
-      const targetRect = this.props.targetPosition;
-      const orientation = this.calculateOrientation(targetRect, editorRect, popoverRect);
-      const top = this.calculateTop(targetRect, editorRect, popoverRect, orientation);
-      const popoverLeft = this.calculateLeft(targetRect, editorRect, popoverRect, orientation);
-      let targetMid;
+    if (!this.$popover || !this.props.editorRef) {
+      return null;
+    }
 
-      if (orientation === "right") {
-        targetMid = {
-          x: -14,
-          y: targetRect.top - top - 2
-        };
-      } else {
-        targetMid = {
-          x: targetRect.left - popoverLeft + targetRect.width / 2 - 8,
-          y: 0
-        };
-      }
+    const popover = this.$popover;
+    const editor = this.props.editorRef;
+    const popoverRect = popover.getBoundingClientRect();
+    const editorRect = editor.getBoundingClientRect();
+    const targetRect = this.props.targetPosition;
+    const orientation = this.calculateOrientation(targetRect, editorRect, popoverRect);
+    const top = this.calculateTop(targetRect, editorRect, popoverRect, orientation);
+    const popoverLeft = this.calculateLeft(targetRect, editorRect, popoverRect, orientation);
+    let targetMid;
 
-      return {
-        left: popoverLeft,
-        top,
-        orientation,
-        targetMid
+    if (orientation === "right") {
+      targetMid = {
+        x: -14,
+        y: targetRect.top - top - 2
+      };
+    } else {
+      targetMid = {
+        x: targetRect.left - popoverLeft + targetRect.width / 2 - 8,
+        y: 0
       };
     }
 
     return {
-      left: 0,
-      top: 0,
-      orientation: "down",
-      targetMid: {
-        x: 0,
-        y: 0
-      }
+      left: popoverLeft,
+      top,
+      orientation,
+      targetMid
     };
   }
 
   getTooltipCoords() {
-    if (this.$tooltip && this.props.editorRef) {
-      const tooltip = this.$tooltip;
-      const editor = this.props.editorRef;
-      const tooltipRect = tooltip.getBoundingClientRect();
-      const editorRect = editor.getBoundingClientRect();
-      const targetRect = this.props.targetPosition;
-      const left = this.calculateLeft(targetRect, editorRect, tooltipRect);
-      const enoughRoomForTooltipAbove = targetRect.top - editorRect.top > tooltipRect.height;
-      const top = enoughRoomForTooltipAbove ? targetRect.top - tooltipRect.height : targetRect.bottom;
-      return {
-        left,
-        top,
-        orientation: enoughRoomForTooltipAbove ? "up" : "down",
-        targetMid: {
-          x: 0,
-          y: 0
-        }
-      };
+    if (!this.$tooltip || !this.props.editorRef) {
+      return null;
     }
 
+    const tooltip = this.$tooltip;
+    const editor = this.props.editorRef;
+    const tooltipRect = tooltip.getBoundingClientRect();
+    const editorRect = editor.getBoundingClientRect();
+    const targetRect = this.props.targetPosition;
+    const left = this.calculateLeft(targetRect, editorRect, tooltipRect);
+    const enoughRoomForTooltipAbove = targetRect.top - editorRect.top > tooltipRect.height;
+    const top = enoughRoomForTooltipAbove ? targetRect.top - tooltipRect.height : targetRect.bottom;
     return {
-      left: 0,
-      top: 0,
-      orientation: "up",
+      left,
+      top,
+      orientation: enoughRoomForTooltipAbove ? "up" : "down",
       targetMid: {
         x: 0,
         y: 0
       }
     };
   }
 
   getChildren() {
     const {
       children
     } = this.props;
     const {
       orientation
-    } = this.state;
+    } = this.state.coords;
 
     const gap = _react2.default.createElement("div", {
       className: "gap",
       key: "gap"
     });
 
     return orientation === "up" ? [children, gap] : [gap, children];
   }
@@ -238,42 +216,49 @@ class Popover extends _react.Component {
   }
 
   renderPopover() {
     const {
       top,
       left,
       orientation,
       targetMid
-    } = this.state;
+    } = this.state.coords;
+    const {
+      onMouseLeave,
+      onKeyDown
+    } = this.props;
     const arrow = this.getPopoverArrow(orientation, targetMid.x, targetMid.y);
     return _react2.default.createElement("div", {
       className: (0, _classnames2.default)("popover", `orientation-${orientation}`, {
         up: orientation === "up"
       }),
-      onMouseLeave: this.props.onMouseLeave,
+      onMouseLeave: onMouseLeave,
+      onKeyDown: onKeyDown,
       style: {
         top,
         left
       },
       ref: c => this.$popover = c
     }, arrow, this.getChildren());
   }
 
   renderTooltip() {
     const {
-      onMouseLeave
-    } = this.props;
-    const {
       top,
       left
-    } = this.state;
+    } = this.state.coords;
+    const {
+      onMouseLeave,
+      onKeyDown
+    } = this.props;
     return _react2.default.createElement("div", {
       className: "tooltip",
       onMouseLeave: onMouseLeave,
+      onKeyDown: onKeyDown,
       style: {
         top,
         left
       },
       ref: c => this.$tooltip = c
     }, this.getChildren());
   }
 
@@ -288,11 +273,13 @@ class Popover extends _react.Component {
 
     return this.renderPopover();
   }
 
 }
 
 Popover.defaultProps = {
   onMouseLeave: () => {},
+  onPopoverCoords: () => {},
+  onKeyDown: () => {},
   type: "popover"
 };
 exports.default = Popover;
\ No newline at end of file
--- a/devtools/client/debugger/new/src/selectors/breakpointSources.js
+++ b/devtools/client/debugger/new/src/selectors/breakpointSources.js
@@ -13,21 +13,23 @@ var _selectors = require("../selectors/i
 
 var _source = require("../utils/source");
 
 /* 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 getBreakpointsForSource(source, breakpoints) {
   const bpList = breakpoints.valueSeq();
-  return bpList.filter(bp => bp.location.sourceId == source.id && !bp.hidden && (bp.text || bp.condition)).sortBy(bp => bp.location.line).toJS();
+  return bpList.filter(bp => bp.location.sourceId == source.id && !bp.hidden && (bp.text || bp.originalText || bp.condition)).sortBy(bp => bp.location.line).toJS();
 }
 
 function findBreakpointSources(sources, breakpoints) {
-  const sourceIds = (0, _lodash.uniq)(breakpoints.valueSeq().filter(bp => !bp.hidden).map(bp => bp.location.sourceId).toJS());
+  const sourceIds = (0, _lodash.uniq)(breakpoints.valueSeq().map(bp => bp.location.sourceId).toJS());
   const breakpointSources = sourceIds.map(id => sources[id]).filter(source => source && !source.isBlackBoxed);
   return (0, _lodash.sortBy)(breakpointSources, source => (0, _source.getFilename)(source));
 }
 
 const getBreakpointSources = exports.getBreakpointSources = (0, _reselect.createSelector)(_selectors.getBreakpoints, _selectors.getSources, (breakpoints, sources) => findBreakpointSources(sources, breakpoints).map(source => ({
   source,
   breakpoints: getBreakpointsForSource(source, breakpoints)
-})));
\ No newline at end of file
+})).filter(({
+  breakpoints: bpSources
+}) => bpSources.length > 0));
\ No newline at end of file
rename from devtools/client/debugger/new/src/workers/search/build-query.js
rename to devtools/client/debugger/new/src/utils/build-query.js
--- a/devtools/client/debugger/new/src/utils/editor/source-search.js
+++ b/devtools/client/debugger/new/src/utils/editor/source-search.js
@@ -7,17 +7,17 @@ exports.buildQuery = undefined;
 exports.getMatchIndex = getMatchIndex;
 exports.searchSourceForHighlight = searchSourceForHighlight;
 exports.removeOverlay = removeOverlay;
 exports.clearSearch = clearSearch;
 exports.find = find;
 exports.findNext = findNext;
 exports.findPrev = findPrev;
 
-var _buildQuery = require("../../workers/search/build-query");
+var _buildQuery = require("../build-query");
 
 var _buildQuery2 = _interopRequireDefault(_buildQuery);
 
 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/>. */
--- a/devtools/client/debugger/new/src/utils/moz.build
+++ b/devtools/client/debugger/new/src/utils/moz.build
@@ -9,16 +9,17 @@ DIRS += [
     'pause',
     'sources-tree',
 ]
 
 DevToolsModules(
     'assert.js',
     'ast.js',
     'bootstrap.js',
+    'build-query.js',
     'clipboard.js',
     'dbg.js',
     'defer.js',
     'DevToolsUtils.js',
     'expressions.js',
     'fromJS.js',
     'function.js',
     'indentation.js',
--- a/devtools/client/debugger/new/src/utils/pause/mapScopes/findGeneratedBindingFromPosition.js
+++ b/devtools/client/debugger/new/src/utils/pause/mapScopes/findGeneratedBindingFromPosition.js
@@ -1,77 +1,31 @@
 "use strict";
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.findGeneratedBindingForStandardBinding = findGeneratedBindingForStandardBinding;
-exports.findGeneratedBindingForImportBinding = findGeneratedBindingForImportBinding;
-exports.findGeneratedBindingForNormalDeclaration = findGeneratedBindingForNormalDeclaration;
-exports.findGeneratedBindingForImportDeclaration = findGeneratedBindingForImportDeclaration;
+exports.findGeneratedReference = findGeneratedReference;
+exports.findGeneratedImportReference = findGeneratedImportReference;
+exports.findGeneratedImportDeclaration = findGeneratedImportDeclaration;
 
 var _locColumn = require("./locColumn");
 
 var _mappingContains = require("./mappingContains");
 
-var _getGeneratedLocationRanges = require("./getGeneratedLocationRanges");
-
 var _firefox = require("../../../client/firefox");
 
 /* 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/>. */
 
 /**
- * Find a simple 1-1 match of a binding in the original code to a binding
- * in the generated code.
- */
-async function findGeneratedBindingForStandardBinding(sourceMaps, client, source, pos, name, bindingType, generatedAstBindings) {
-  return await findGeneratedReference((await (0, _getGeneratedLocationRanges.getGeneratedLocationRanges)(generatedAstBindings, source, pos, bindingType, pos.type, sourceMaps)));
-}
-/**
- * Find a simple 1-1 match of a binding in the original code to an
- * expression in the generated code.
- */
-
-
-async function findGeneratedBindingForImportBinding(sourceMaps, client, source, pos, name, bindingType, generatedAstBindings) {
-  return await findGeneratedImportReference((await (0, _getGeneratedLocationRanges.getGeneratedLocationRanges)(generatedAstBindings, source, pos, bindingType, pos.type, sourceMaps)));
-}
-/**
- * Find a simple 1-1 match of a binding's declaration in the original code to a
- * binding in the generated code.
- */
-
-
-async function findGeneratedBindingForNormalDeclaration(sourceMaps, client, source, pos, name, bindingType, generatedAstBindings) {
-  return await findGeneratedReference((await (0, _getGeneratedLocationRanges.getGeneratedLocationRanges)(generatedAstBindings, source, pos.declaration, bindingType, pos.type, sourceMaps)));
-}
-/**
- * Find a simple 1-1 match of an import binding's declaration in the original
- * code to an expression in the generated code.
- */
-
-
-async function findGeneratedBindingForImportDeclaration(sourceMaps, client, source, pos, name, bindingType, generatedAstBindings) {
-  const importName = pos.importName;
-
-  if (typeof importName !== "string") {
-    // Should never happen, just keeping Flow happy.
-    return null;
-  }
-
-  return await findGeneratedImportDeclaration((await (0, _getGeneratedLocationRanges.getGeneratedLocationRanges)(generatedAstBindings, source, pos.declaration, bindingType, pos.type, sourceMaps)), importName);
-}
-/**
  * Given a mapped range over the generated source, attempt to resolve a real
  * binding descriptor that can be used to access the value.
  */
-
-
 async function findGeneratedReference(applicableBindings) {
   // We can adjust this number as we go, but these are a decent start as a
   // general heuristic to assume the bindings were bad or just map a chunk of
   // whole line or something.
   if (applicableBindings.length > 4) {
     // Babel's for..of generates at least 3 bindings inside one range for
     // block-scoped loop variables, so we shouldn't go below that.
     applicableBindings = [];
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/src/utils/pause/mapScopes/getApplicableBindingsForOriginalPosition.js
@@ -0,0 +1,133 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.originalRangeStartsInside = originalRangeStartsInside;
+exports.getApplicableBindingsForOriginalPosition = getApplicableBindingsForOriginalPosition;
+
+var _positionCmp = require("./positionCmp");
+
+var _filtering = require("./filtering");
+
+var _mappingContains = require("./mappingContains");
+
+/* 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/>. */
+async function originalRangeStartsInside(source, {
+  start,
+  end
+}, sourceMaps) {
+  const endPosition = await sourceMaps.getGeneratedLocation(end, source);
+  const startPosition = await sourceMaps.getGeneratedLocation(start, source); // If the start and end positions collapse into eachother, it means that
+  // the range in the original content didn't _start_ at the start position.
+  // Since this likely means that the range doesn't logically apply to this
+  // binding location, we skip it.
+
+  return (0, _positionCmp.positionCmp)(startPosition, endPosition) !== 0;
+}
+
+async function getApplicableBindingsForOriginalPosition(generatedAstBindings, source, {
+  start,
+  end
+}, bindingType, locationType, sourceMaps) {
+  const ranges = await sourceMaps.getGeneratedRanges(start, source);
+  const resultRanges = ranges.reduce((acc, mapRange) => {
+    // Some tooling creates ranges that map a line as a whole, which is useful
+    // for step-debugging, but can easily lead to finding the wrong binding.
+    // To avoid these false-positives, we entirely ignore ranges that cover
+    // full lines.
+    if (locationType === "ref" && mapRange.columnStart === 0 && mapRange.columnEnd === Infinity) {
+      return acc;
+    }
+
+    const range = {
+      start: {
+        line: mapRange.line,
+        column: mapRange.columnStart
+      },
+      end: {
+        line: mapRange.line,
+        // SourceMapConsumer's 'lastColumn' is inclusive, so we add 1 to make
+        // it exclusive like all other locations.
+        column: mapRange.columnEnd + 1
+      }
+    };
+    const previous = acc[acc.length - 1];
+
+    if (previous && (previous.end.line === range.start.line && previous.end.column === range.start.column || previous.end.line + 1 === range.start.line && previous.end.column === Infinity && range.start.column === 0)) {
+      previous.end.line = range.end.line;
+      previous.end.column = range.end.column;
+    } else {
+      acc.push(range);
+    }
+
+    return acc;
+  }, []); // When searching for imports, we expand the range to up to the next available
+  // mapping to allow for import declarations that are composed of multiple
+  // variable statements, where the later ones are entirely unmapped.
+  // Babel 6 produces imports in this style, e.g.
+  //
+  // var _mod = require("mod"); // mapped from import statement
+  // var _mod2 = interop(_mod); // entirely unmapped
+
+  if (bindingType === "import" && locationType !== "ref") {
+    const endPosition = await sourceMaps.getGeneratedLocation(end, source);
+    const startPosition = await sourceMaps.getGeneratedLocation(start, source);
+
+    for (const range of resultRanges) {
+      if ((0, _mappingContains.mappingContains)(range, {
+        start: startPosition,
+        end: startPosition
+      }) && (0, _positionCmp.positionCmp)(range.end, endPosition) < 0) {
+        range.end.line = endPosition.line;
+        range.end.column = endPosition.column;
+        break;
+      }
+    }
+  }
+
+  return filterApplicableBindings(generatedAstBindings, resultRanges);
+}
+
+function filterApplicableBindings(bindings, ranges) {
+  const result = [];
+
+  for (const range of ranges) {
+    // Any binding overlapping a part of the mapping range.
+    const filteredBindings = (0, _filtering.filterSortedArray)(bindings, binding => {
+      if ((0, _positionCmp.positionCmp)(binding.loc.end, range.start) <= 0) {
+        return -1;
+      }
+
+      if ((0, _positionCmp.positionCmp)(binding.loc.start, range.end) >= 0) {
+        return 1;
+      }
+
+      return 0;
+    });
+    let firstInRange = true;
+    let firstOnLine = true;
+    let line = -1;
+
+    for (const binding of filteredBindings) {
+      if (binding.loc.start.line === line) {
+        firstOnLine = false;
+      } else {
+        line = binding.loc.start.line;
+        firstOnLine = true;
+      }
+
+      result.push({
+        binding,
+        range,
+        firstOnLine,
+        firstInRange
+      });
+      firstInRange = false;
+    }
+  }
+
+  return result;
+}
\ No newline at end of file
--- a/devtools/client/debugger/new/src/utils/pause/mapScopes/index.js
+++ b/devtools/client/debugger/new/src/utils/pause/mapScopes/index.js
@@ -10,16 +10,18 @@ var _parser = require("../../../workers/
 var _locColumn = require("./locColumn");
 
 var _rangeMetadata = require("./rangeMetadata");
 
 var _findGeneratedBindingFromPosition = require("./findGeneratedBindingFromPosition");
 
 var _buildGeneratedBindingList = require("./buildGeneratedBindingList");
 
+var _getApplicableBindingsForOriginalPosition = require("./getApplicableBindingsForOriginalPosition");
+
 var _log = require("../../log");
 
 /* 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-disable-next-line max-len
 async function buildMappedScopes(source, frame, scopes, sourceMaps, client) {
   const originalAstScopes = await (0, _parser.getScopes)(frame.location);
@@ -223,58 +225,79 @@ function hasValidIdent(range, pos) {
 async function findGeneratedBinding(sourceMaps, client, source, name, originalBinding, originalRanges, generatedAstBindings) {
   // If there are no references to the implicits, then we have no way to
   // even attempt to map it back to the original since there is no location
   // data to use. Bail out instead of just showing it as unmapped.
   if (originalBinding.type === "implicit" && !originalBinding.refs.some(item => item.type === "ref")) {
     return null;
   }
 
+  const loadApplicableBindings = async (pos, locationType) => {
+    let applicableBindings = await (0, _getApplicableBindingsForOriginalPosition.getApplicableBindingsForOriginalPosition)(generatedAstBindings, source, pos, originalBinding.type, locationType, sourceMaps);
+
+    if (applicableBindings.length > 0) {
+      hadApplicableBindings = true;
+    }
+
+    if (locationType !== "ref" && !(await (0, _getApplicableBindingsForOriginalPosition.originalRangeStartsInside)(source, pos, sourceMaps))) {
+      applicableBindings = [];
+    }
+
+    return applicableBindings;
+  };
+
   const {
     refs
   } = originalBinding;
+  let hadApplicableBindings = false;
   let genContent = null;
 
   for (const pos of refs) {
+    const applicableBindings = await loadApplicableBindings(pos, pos.type);
     const range = (0, _rangeMetadata.findMatchingRange)(originalRanges, pos);
 
     if (range && hasValidIdent(range, pos)) {
       if (originalBinding.type === "import") {
-        genContent = await (0, _findGeneratedBindingFromPosition.findGeneratedBindingForImportBinding)(sourceMaps, client, source, pos, name, originalBinding.type, generatedAstBindings);
+        genContent = await (0, _findGeneratedBindingFromPosition.findGeneratedImportReference)(applicableBindings);
       } else {
-        genContent = await (0, _findGeneratedBindingFromPosition.findGeneratedBindingForStandardBinding)(sourceMaps, client, source, pos, name, originalBinding.type, generatedAstBindings);
+        genContent = await (0, _findGeneratedBindingFromPosition.findGeneratedReference)(applicableBindings);
       }
     }
 
     if ((pos.type === "class-decl" || pos.type === "class-inner") && source.contentType && source.contentType.match(/\/typescript/)) {
       const declRange = (0, _rangeMetadata.findMatchingRange)(originalRanges, pos.declaration);
 
       if (declRange && declRange.type !== "multiple") {
-        // Resolve to first binding in the range
-        const declContent = await (0, _findGeneratedBindingFromPosition.findGeneratedBindingForNormalDeclaration)(sourceMaps, client, source, pos, name, originalBinding.type, generatedAstBindings);
+        const applicableDeclBindings = await loadApplicableBindings(pos.declaration, pos.type); // Resolve to first binding in the range
+
+        const declContent = await (0, _findGeneratedBindingFromPosition.findGeneratedReference)(applicableDeclBindings);
 
         if (declContent) {
           // Prefer the declaration mapping in this case because TS sometimes
           // maps class declaration names to "export.Foo = Foo;" or to
           // the decorator logic itself
           genContent = declContent;
         }
       }
     }
 
-    if (!genContent && (pos.type === "import-decl" || pos.type === "import-ns-decl")) {
+    if (!genContent && pos.type === "import-decl" && typeof pos.importName === "string") {
+      const {
+        importName
+      } = pos;
       const declRange = (0, _rangeMetadata.findMatchingRange)(originalRanges, pos.declaration); // The import declaration should have an original position mapping,
       // but otherwise we don't really have preferences on the range type
       // because it can have multiple bindings, but we do want to make sure
       // that all of the bindings that match the range are part of the same
       // import declaration.
 
       if (declRange && declRange.singleDeclaration) {
-        // match the import declaration location
-        genContent = await (0, _findGeneratedBindingFromPosition.findGeneratedBindingForImportDeclaration)(sourceMaps, client, source, pos, name, originalBinding.type, generatedAstBindings);
+        const applicableDeclBindings = await loadApplicableBindings(pos.declaration, pos.type); // match the import declaration location
+
+        genContent = await (0, _findGeneratedBindingFromPosition.findGeneratedImportDeclaration)(applicableDeclBindings, importName);
       }
     }
 
     if (genContent) {
       break;
     }
   }
 
@@ -303,16 +326,37 @@ async function findGeneratedBinding(sour
           unscoped: true,
           // HACK: Until support for "unscoped" lands in devtools-reps,
           // this will make these show as (unavailable).
           missingArguments: true
         }
       },
       expression: null
     };
+  } else if (!hadApplicableBindings) {
+    // If there were no applicable bindings to consider while searching for
+    // matching bindings, then the source map for this file didn't make any
+    // attempt to map the binding, and that most likely means that the
+    // code was entirely emitted from the output code.
+    return {
+      grip: {
+        configurable: false,
+        enumerable: true,
+        writable: false,
+        value: {
+          type: "null",
+          optimizedOut: true
+        }
+      },
+      expression: `
+        (() => {
+          throw new Error('"' + ${JSON.stringify(name)} + '" has been optimized out.');
+        })()
+      `
+    };
   } // If no location mapping is found, then the map is bad, or
   // the map is okay but it original location is inside
   // of some scope, but the generated location is outside, leading
   // us to search for bindings that don't technically exist.
 
 
   return {
     grip: {
--- a/devtools/client/debugger/new/src/utils/pause/mapScopes/moz.build
+++ b/devtools/client/debugger/new/src/utils/pause/mapScopes/moz.build
@@ -6,15 +6,15 @@
 DIRS += [
 
 ]
 
 DevToolsModules(
     'buildGeneratedBindingList.js',
     'filtering.js',
     'findGeneratedBindingFromPosition.js',
-    'getGeneratedLocationRanges.js',
+    'getApplicableBindingsForOriginalPosition.js',
     'index.js',
     'locColumn.js',
     'mappingContains.js',
     'positionCmp.js',
     'rangeMetadata.js',
 )
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/findOutOfScopeLocations.js
+++ /dev/null
@@ -1,148 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _get = require("devtools/client/shared/vendor/lodash").get;
-
-var _get2 = _interopRequireDefault(_get);
-
-var _findIndex = require("devtools/client/shared/vendor/lodash").findIndex;
-
-var _findIndex2 = _interopRequireDefault(_findIndex);
-
-var _findLastIndex = require("devtools/client/shared/vendor/lodash").findLastIndex;
-
-var _findLastIndex2 = _interopRequireDefault(_findLastIndex);
-
-var _contains = require("./utils/contains");
-
-var _getSymbols = require("./getSymbols");
-
-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/>. */
-function findSymbols(source) {
-  const {
-    functions,
-    comments
-  } = (0, _getSymbols.getSymbols)(source);
-  return {
-    functions,
-    comments
-  };
-}
-/**
- * Returns the location for a given function path. If the path represents a
- * function declaration, the location will begin after the function identifier
- * but before the function parameters.
- */
-
-
-function getLocation(func) {
-  const location = { ...func.location
-  }; // if the function has an identifier, start the block after it so the
-  // identifier is included in the "scope" of its parent
-
-  const identifierEnd = (0, _get2.default)(func, "identifier.loc.end");
-
-  if (identifierEnd) {
-    location.start = identifierEnd;
-  }
-
-  return location;
-}
-/**
- * Find the nearest location containing the input position and
- * return new locations without inner locations under that nearest location
- *
- * @param locations Notice! The locations MUST be sorted by `sortByStart`
- *                  so that we can do linear time complexity operation.
- */
-
-
-function removeInnerLocations(locations, position) {
-  // First, let's find the nearest position-enclosing function location,
-  // which is to find the last location enclosing the position.
-  const newLocs = locations.slice();
-  const parentIndex = (0, _findLastIndex2.default)(newLocs, loc => (0, _contains.containsPosition)(loc, position));
-
-  if (parentIndex < 0) {
-    return newLocs;
-  } // Second, from the nearest location, loop locations again, stop looping
-  // once seeing the 1st location not enclosed by the nearest location
-  // to find the last inner locations inside the nearest location.
-
-
-  const innerStartIndex = parentIndex + 1;
-  const parentLoc = newLocs[parentIndex];
-  const outerBoundaryIndex = (0, _findIndex2.default)(newLocs, loc => !(0, _contains.containsLocation)(parentLoc, loc), innerStartIndex);
-  const innerBoundaryIndex = outerBoundaryIndex < 0 ? newLocs.length - 1 : outerBoundaryIndex - 1; // Third, remove those inner functions
-
-  newLocs.splice(innerStartIndex, innerBoundaryIndex - parentIndex);
-  return newLocs;
-}
-/**
- * Return an new locations array which excludes
- * items that are completely enclosed by another location in the input locations
- *
- * @param locations Notice! The locations MUST be sorted by `sortByStart`
- *                  so that we can do linear time complexity operation.
- */
-
-
-function removeOverlaps(locations) {
-  if (locations.length == 0) {
-    return [];
-  }
-
-  const firstParent = locations[0];
-  return locations.reduce(deduplicateNode, [firstParent]);
-}
-
-function deduplicateNode(nodes, location) {
-  const parent = nodes[nodes.length - 1];
-
-  if (!(0, _contains.containsLocation)(parent, location)) {
-    nodes.push(location);
-  }
-
-  return nodes;
-}
-/**
- * Sorts an array of locations by start position
- */
-
-
-function sortByStart(a, b) {
-  if (a.start.line < b.start.line) {
-    return -1;
-  } else if (a.start.line === b.start.line) {
-    return a.start.column - b.start.column;
-  }
-
-  return 1;
-}
-/**
- * Returns an array of locations that are considered out of scope for the given
- * location.
- */
-
-
-function findOutOfScopeLocations(sourceId, position) {
-  const {
-    functions,
-    comments
-  } = findSymbols(sourceId);
-  const commentLocations = comments.map(c => c.location);
-  let locations = functions.map(getLocation).concat(commentLocations).sort(sortByStart); // Must remove inner locations then filter, otherwise,
-  // we will mis-judge in-scope inner locations as out of scope.
-
-  locations = removeInnerLocations(locations, position).filter(loc => !(0, _contains.containsPosition)(loc, position));
-  return removeOverlaps(locations);
-}
-
-exports.default = findOutOfScopeLocations;
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/frameworks.js
+++ /dev/null
@@ -1,88 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.getFramework = getFramework;
-
-var _types = require("@babel/types/index");
-
-var t = _interopRequireWildcard(_types);
-
-var _getSymbols = require("./getSymbols");
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
-
-/* 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 getFramework(sourceId) {
-  const sourceSymbols = (0, _getSymbols.getSymbols)(sourceId);
-
-  if (isReactComponent(sourceSymbols)) {
-    return "React";
-  }
-
-  if (isAngularComponent(sourceSymbols)) {
-    return "Angular";
-  }
-
-  if (isVueComponent(sourceSymbols)) {
-    return "Vue";
-  }
-} // React
-
-
-function isReactComponent(sourceSymbols) {
-  const {
-    imports,
-    classes,
-    callExpressions
-  } = sourceSymbols;
-  return importsReact(imports) || requiresReact(callExpressions) || extendsReactComponent(classes);
-}
-
-function importsReact(imports) {
-  return imports.some(importObj => importObj.source === "react" && importObj.specifiers.some(specifier => specifier === "React"));
-}
-
-function requiresReact(callExpressions) {
-  return callExpressions.some(callExpression => callExpression.name === "require" && callExpression.values.some(value => value === "react"));
-}
-
-function extendsReactComponent(classes) {
-  return classes.some(classObj => t.isIdentifier(classObj.parent, {
-    name: "Component"
-  }) || t.isIdentifier(classObj.parent, {
-    name: "PureComponent"
-  }) || t.isMemberExpression(classObj.parent, {
-    computed: false
-  }) && t.isIdentifier(classObj.parent, {
-    name: "Component"
-  }));
-} // Angular
-
-
-const isAngularComponent = sourceSymbols => {
-  const {
-    memberExpressions,
-    identifiers
-  } = sourceSymbols;
-  return identifiesAngular(identifiers) && hasAngularExpressions(memberExpressions);
-};
-
-const identifiesAngular = identifiers => {
-  return identifiers.some(item => item.name == "angular");
-};
-
-const hasAngularExpressions = memberExpressions => {
-  return memberExpressions.some(item => item.name == "controller" || item.name == "module");
-}; // Vue
-
-
-const isVueComponent = sourceSymbols => {
-  const {
-    identifiers
-  } = sourceSymbols;
-  return identifiers.some(identifier => identifier.name == "Vue");
-};
\ No newline at end of file
--- a/devtools/client/debugger/new/src/workers/parser/getScopes/moz.build
+++ b/devtools/client/debugger/new/src/workers/parser/getScopes/moz.build
@@ -4,10 +4,9 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DIRS += [
 
 ]
 
 DevToolsModules(
     'index.js',
-    'visitor.js',
 )
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/getScopes/visitor.js
+++ /dev/null
@@ -1,745 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.parseSourceScopes = parseSourceScopes;
-exports.buildScopeList = buildScopeList;
-
-var _isEmpty = require("devtools/client/shared/vendor/lodash").isEmpty;
-
-var _isEmpty2 = _interopRequireDefault(_isEmpty);
-
-var _types = require("@babel/types/index");
-
-var t = _interopRequireWildcard(_types);
-
-var _devtoolsSourceMap = require("devtools/client/shared/source-map/index.js");
-
-var _getFunctionName = require("../utils/getFunctionName");
-
-var _getFunctionName2 = _interopRequireDefault(_getFunctionName);
-
-var _ast = require("../utils/ast");
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
-
-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/>. */
-function parseSourceScopes(sourceId) {
-  const ast = (0, _ast.getAst)(sourceId);
-
-  if ((0, _isEmpty2.default)(ast)) {
-    return null;
-  }
-
-  return buildScopeList(ast, sourceId);
-}
-
-function buildScopeList(ast, sourceId) {
-  const {
-    global,
-    lexical
-  } = createGlobalScope(ast, sourceId);
-  const state = {
-    sourceId,
-    freeVariables: new Map(),
-    freeVariableStack: [],
-    inType: null,
-    scope: lexical,
-    scopeStack: [],
-    declarationBindingIds: new Set()
-  };
-  t.traverse(ast, scopeCollectionVisitor, state);
-
-  for (const [key, freeVariables] of state.freeVariables) {
-    let binding = global.bindings[key];
-
-    if (!binding) {
-      binding = {
-        type: "global",
-        refs: []
-      };
-      global.bindings[key] = binding;
-    }
-
-    binding.refs = freeVariables.concat(binding.refs);
-  } // TODO: This should probably check for ".mjs" extension on the
-  // original file, and should also be skipped if the the generated
-  // code is an ES6 module rather than a script.
-
-
-  if ((0, _devtoolsSourceMap.isGeneratedId)(sourceId) || ast.program.sourceType === "script" && !looksLikeCommonJS(global)) {
-    stripModuleScope(global);
-  }
-
-  return toParsedScopes([global], sourceId) || [];
-}
-
-function toParsedScopes(children, sourceId) {
-  if (!children || children.length === 0) {
-    return undefined;
-  }
-
-  return children.map(scope => {
-    // Removing unneed information from TempScope such as parent reference.
-    // We also need to convert BabelLocation to the Location type.
-    return {
-      start: scope.loc.start,
-      end: scope.loc.end,
-      type: scope.type === "module" || scope.type === "function-body" ? "block" : scope.type,
-      displayName: scope.displayName,
-      bindings: scope.bindings,
-      children: toParsedScopes(scope.children, sourceId)
-    };
-  });
-}
-
-function createTempScope(type, displayName, parent, loc) {
-  const result = {
-    type,
-    displayName,
-    parent,
-    children: [],
-    loc,
-    bindings: Object.create(null)
-  };
-
-  if (parent) {
-    parent.children.push(result);
-  }
-
-  return result;
-}
-
-function pushTempScope(state, type, displayName, loc) {
-  const scope = createTempScope(type, displayName, state.scope, loc);
-  state.scope = scope;
-  state.freeVariableStack.push(state.freeVariables);
-  state.freeVariables = new Map();
-  return scope;
-}
-
-function isNode(node, type) {
-  return node ? node.type === type : false;
-}
-
-function getVarScope(scope) {
-  let s = scope;
-
-  while (s.type !== "function" && s.type !== "module") {
-    if (!s.parent) {
-      return s;
-    }
-
-    s = s.parent;
-  }
-
-  return s;
-}
-
-function fromBabelLocation(location, sourceId) {
-  return {
-    sourceId,
-    line: location.line,
-    column: location.column
-  };
-}
-
-function parseDeclarator(declaratorId, targetScope, type, locationType, declaration, state) {
-  if (isNode(declaratorId, "Identifier")) {
-    let existing = targetScope.bindings[declaratorId.name];
-
-    if (!existing) {
-      existing = {
-        type,
-        refs: []
-      };
-      targetScope.bindings[declaratorId.name] = existing;
-    }
-
-    state.declarationBindingIds.add(declaratorId);
-    existing.refs.push({
-      type: locationType,
-      start: fromBabelLocation(declaratorId.loc.start, state.sourceId),
-      end: fromBabelLocation(declaratorId.loc.end, state.sourceId),
-      declaration: {
-        start: fromBabelLocation(declaration.loc.start, state.sourceId),
-        end: fromBabelLocation(declaration.loc.end, state.sourceId)
-      }
-    });
-  } else if (isNode(declaratorId, "ObjectPattern")) {
-    declaratorId.properties.forEach(prop => {
-      parseDeclarator(prop.value, targetScope, type, locationType, declaration, state);
-    });
-  } else if (isNode(declaratorId, "ArrayPattern")) {
-    declaratorId.elements.forEach(item => {
-      parseDeclarator(item, targetScope, type, locationType, declaration, state);
-    });
-  } else if (isNode(declaratorId, "AssignmentPattern")) {
-    parseDeclarator(declaratorId.left, targetScope, type, locationType, declaration, state);
-  } else if (isNode(declaratorId, "RestElement")) {
-    parseDeclarator(declaratorId.argument, targetScope, type, locationType, declaration, state);
-  } else if (t.isTSParameterProperty(declaratorId)) {
-    parseDeclarator(declaratorId.parameter, targetScope, type, locationType, declaration, state);
-  }
-}
-
-function isLetOrConst(node) {
-  return node.kind === "let" || node.kind === "const";
-}
-
-function hasLexicalDeclaration(node, parent) {
-  const nodes = [];
-
-  if (t.isSwitchStatement(node)) {
-    for (const caseNode of node.cases) {
-      nodes.push(...caseNode.consequent);
-    }
-  } else {
-    nodes.push(...node.body);
-  }
-
-  const isFunctionBody = t.isFunction(parent, {
-    body: node
-  });
-  return nodes.some(child => isLexicalVariable(child) || t.isClassDeclaration(child) || !isFunctionBody && t.isFunctionDeclaration(child));
-}
-
-function isLexicalVariable(node) {
-  return isNode(node, "VariableDeclaration") && isLetOrConst(node);
-}
-
-function createGlobalScope(ast, sourceId) {
-  const global = createTempScope("object", "Global", null, {
-    start: fromBabelLocation(ast.loc.start, sourceId),
-    end: fromBabelLocation(ast.loc.end, sourceId)
-  });
-  const lexical = createTempScope("block", "Lexical Global", global, {
-    start: fromBabelLocation(ast.loc.start, sourceId),
-    end: fromBabelLocation(ast.loc.end, sourceId)
-  });
-  return {
-    global,
-    lexical
-  };
-}
-
-const scopeCollectionVisitor = {
-  // eslint-disable-next-line complexity
-  enter(node, ancestors, state) {
-    state.scopeStack.push(state.scope);
-    const parentNode = ancestors.length === 0 ? null : ancestors[ancestors.length - 1].node;
-
-    if (state.inType) {
-      return;
-    }
-
-    if (t.isProgram(node)) {
-      const scope = pushTempScope(state, "module", "Module", {
-        start: fromBabelLocation(node.loc.start, state.sourceId),
-        end: fromBabelLocation(node.loc.end, state.sourceId)
-      });
-      scope.bindings.this = {
-        type: "implicit",
-        refs: []
-      };
-    } else if (t.isFunction(node)) {
-      let scope = state.scope;
-
-      if (t.isFunctionExpression(node) && isNode(node.id, "Identifier")) {
-        scope = pushTempScope(state, "block", "Function Expression", {
-          start: fromBabelLocation(node.loc.start, state.sourceId),
-          end: fromBabelLocation(node.loc.end, state.sourceId)
-        });
-        state.declarationBindingIds.add(node.id);
-        scope.bindings[node.id.name] = {
-          type: "const",
-          refs: [{
-            type: "fn-expr",
-            start: fromBabelLocation(node.id.loc.start, state.sourceId),
-            end: fromBabelLocation(node.id.loc.end, state.sourceId),
-            declaration: {
-              start: fromBabelLocation(node.loc.start, state.sourceId),
-              end: fromBabelLocation(node.loc.end, state.sourceId)
-            }
-          }]
-        };
-      }
-
-      if (t.isFunctionDeclaration(node) && isNode(node.id, "Identifier")) {
-        // This ignores Annex B function declaration hoisting, which
-        // is probably a fine assumption.
-        state.declarationBindingIds.add(node.id);
-        const refs = [{
-          type: "fn-decl",
-          start: fromBabelLocation(node.id.loc.start, state.sourceId),
-          end: fromBabelLocation(node.id.loc.end, state.sourceId),
-          declaration: {
-            start: fromBabelLocation(node.loc.start, state.sourceId),
-            end: fromBabelLocation(node.loc.end, state.sourceId)
-          }
-        }];
-
-        if (scope.type === "block") {
-          scope.bindings[node.id.name] = {
-            type: "let",
-            refs
-          };
-        } else {
-          getVarScope(scope).bindings[node.id.name] = {
-            type: "var",
-            refs
-          };
-        }
-      }
-
-      scope = pushTempScope(state, "function", (0, _getFunctionName2.default)(node, parentNode), {
-        // Being at the start of a function doesn't count as
-        // being inside of it.
-        start: fromBabelLocation(node.params[0] ? node.params[0].loc.start : node.loc.start, state.sourceId),
-        end: fromBabelLocation(node.loc.end, state.sourceId)
-      });
-      node.params.forEach(param => parseDeclarator(param, scope, "var", "fn-param", node, state));
-
-      if (!t.isArrowFunctionExpression(node)) {
-        scope.bindings.this = {
-          type: "implicit",
-          refs: []
-        };
-        scope.bindings.arguments = {
-          type: "implicit",
-          refs: []
-        };
-      }
-
-      if (t.isBlockStatement(node.body) && hasLexicalDeclaration(node.body, node)) {
-        scope = pushTempScope(state, "function-body", "Function Body", {
-          start: fromBabelLocation(node.body.loc.start, state.sourceId),
-          end: fromBabelLocation(node.body.loc.end, state.sourceId)
-        });
-      }
-    } else if (t.isClass(node)) {
-      if (t.isIdentifier(node.id)) {
-        // For decorated classes, the AST considers the first the decorator
-        // to be the start of the class. For the purposes of mapping class
-        // declarations however, we really want to look for the "class Foo"
-        // piece. To achieve that, we estimate the location of the declaration
-        // instead.
-        let declStart = node.loc.start;
-
-        if (node.decorators && node.decorators.length > 0) {
-          // Estimate the location of the "class" keyword since it
-          // is unlikely to be a different line than the class name.
-          declStart = {
-            line: node.id.loc.start.line,
-            column: node.id.loc.start.column - "class ".length
-          };
-        }
-
-        const declaration = {
-          start: fromBabelLocation(declStart, state.sourceId),
-          end: fromBabelLocation(node.loc.end, state.sourceId)
-        };
-
-        if (t.isClassDeclaration(node)) {
-          state.declarationBindingIds.add(node.id);
-          state.scope.bindings[node.id.name] = {
-            type: "let",
-            refs: [{
-              type: "class-decl",
-              start: fromBabelLocation(node.id.loc.start, state.sourceId),
-              end: fromBabelLocation(node.id.loc.end, state.sourceId),
-              declaration
-            }]
-          };
-        }
-
-        const scope = pushTempScope(state, "block", "Class", {
-          start: fromBabelLocation(node.loc.start, state.sourceId),
-          end: fromBabelLocation(node.loc.end, state.sourceId)
-        });
-        state.declarationBindingIds.add(node.id);
-        scope.bindings[node.id.name] = {
-          type: "const",
-          refs: [{
-            type: "class-inner",
-            start: fromBabelLocation(node.id.loc.start, state.sourceId),
-            end: fromBabelLocation(node.id.loc.end, state.sourceId),
-            declaration
-          }]
-        };
-      }
-    } else if (t.isForXStatement(node) || t.isForStatement(node)) {
-      const init = node.init || node.left;
-
-      if (isNode(init, "VariableDeclaration") && isLetOrConst(init)) {
-        // Debugger will create new lexical environment for the for.
-        pushTempScope(state, "block", "For", {
-          // Being at the start of a for loop doesn't count as
-          // being inside it.
-          start: fromBabelLocation(init.loc.start, state.sourceId),
-          end: fromBabelLocation(node.loc.end, state.sourceId)
-        });
-      }
-    } else if (t.isCatchClause(node)) {
-      const scope = pushTempScope(state, "block", "Catch", {
-        start: fromBabelLocation(node.loc.start, state.sourceId),
-        end: fromBabelLocation(node.loc.end, state.sourceId)
-      });
-      parseDeclarator(node.param, scope, "var", "catch", node, state);
-    } else if (t.isBlockStatement(node) && // Function body's are handled in the function logic above.
-    !t.isFunction(parentNode) && hasLexicalDeclaration(node, parentNode)) {
-      // Debugger will create new lexical environment for the block.
-      pushTempScope(state, "block", "Block", {
-        start: fromBabelLocation(node.loc.start, state.sourceId),
-        end: fromBabelLocation(node.loc.end, state.sourceId)
-      });
-    } else if (t.isVariableDeclaration(node) && (node.kind === "var" || // Lexical declarations in for statements are handled above.
-    !t.isForStatement(parentNode, {
-      init: node
-    }) || !t.isForXStatement(parentNode, {
-      left: node
-    }))) {
-      // Finds right lexical environment
-      const hoistAt = !isLetOrConst(node) ? getVarScope(state.scope) : state.scope;
-      node.declarations.forEach(declarator => {
-        parseDeclarator(declarator.id, hoistAt, node.kind, node.kind, node, state);
-      });
-    } else if (t.isImportDeclaration(node) && (!node.importKind || node.importKind === "value")) {
-      node.specifiers.forEach(spec => {
-        if (spec.importKind && spec.importKind !== "value") {
-          return;
-        }
-
-        if (t.isImportNamespaceSpecifier(spec)) {
-          state.declarationBindingIds.add(spec.local);
-          state.scope.bindings[spec.local.name] = {
-            // Imported namespaces aren't live import bindings, they are
-            // just normal const bindings.
-            type: "const",
-            refs: [{
-              type: "import-ns-decl",
-              start: fromBabelLocation(spec.local.loc.start, state.sourceId),
-              end: fromBabelLocation(spec.local.loc.end, state.sourceId),
-              declaration: {
-                start: fromBabelLocation(node.loc.start, state.sourceId),
-                end: fromBabelLocation(node.loc.end, state.sourceId)
-              }
-            }]
-          };
-        } else {
-          state.declarationBindingIds.add(spec.local);
-          state.scope.bindings[spec.local.name] = {
-            type: "import",
-            refs: [{
-              type: "import-decl",
-              start: fromBabelLocation(spec.local.loc.start, state.sourceId),
-              end: fromBabelLocation(spec.local.loc.end, state.sourceId),
-              importName: t.isImportDefaultSpecifier(spec) ? "default" : spec.imported.name,
-              declaration: {
-                start: fromBabelLocation(node.loc.start, state.sourceId),
-                end: fromBabelLocation(node.loc.end, state.sourceId)
-              }
-            }]
-          };
-        }
-      });
-    } else if (t.isTSEnumDeclaration(node)) {
-      state.declarationBindingIds.add(node.id);
-      state.scope.bindings[node.id.name] = {
-        type: "const",
-        refs: [{
-          type: "ts-enum-decl",
-          start: fromBabelLocation(node.id.loc.start, state.sourceId),
-          end: fromBabelLocation(node.id.loc.end, state.sourceId),
-          declaration: {
-            start: fromBabelLocation(node.loc.start, state.sourceId),
-            end: fromBabelLocation(node.loc.end, state.sourceId)
-          }
-        }]
-      };
-    } else if (t.isTSModuleDeclaration(node)) {
-      state.declarationBindingIds.add(node.id);
-      state.scope.bindings[node.id.name] = {
-        type: "const",
-        refs: [{
-          type: "ts-namespace-decl",
-          start: fromBabelLocation(node.id.loc.start, state.sourceId),
-          end: fromBabelLocation(node.id.loc.end, state.sourceId),
-          declaration: {
-            start: fromBabelLocation(node.loc.start, state.sourceId),
-            end: fromBabelLocation(node.loc.end, state.sourceId)
-          }
-        }]
-      };
-    } else if (t.isTSModuleBlock(node)) {
-      pushTempScope(state, "block", "TypeScript Namespace", {
-        start: fromBabelLocation(node.loc.start, state.sourceId),
-        end: fromBabelLocation(node.loc.end, state.sourceId)
-      });
-    } else if (t.isIdentifier(node) && t.isReferenced(node, parentNode) && // Babel doesn't cover this in 'isReferenced' yet, but it should
-    // eventually.
-    !t.isTSEnumMember(parentNode, {
-      id: node
-    }) && !t.isTSModuleDeclaration(parentNode, {
-      id: node
-    }) && // isReferenced above fails to see `var { foo } = ...` as a non-reference
-    // because the direct parent is not enough to know that the pattern is
-    // used within a variable declaration.
-    !state.declarationBindingIds.has(node)) {
-      let freeVariables = state.freeVariables.get(node.name);
-
-      if (!freeVariables) {
-        freeVariables = [];
-        state.freeVariables.set(node.name, freeVariables);
-      }
-
-      freeVariables.push({
-        type: "ref",
-        start: fromBabelLocation(node.loc.start, state.sourceId),
-        end: fromBabelLocation(node.loc.end, state.sourceId),
-        meta: buildMetaBindings(state.sourceId, node, ancestors)
-      });
-    } else if (isOpeningJSXIdentifier(node, ancestors)) {
-      let freeVariables = state.freeVariables.get(node.name);
-
-      if (!freeVariables) {
-        freeVariables = [];
-        state.freeVariables.set(node.name, freeVariables);
-      }
-
-      freeVariables.push({
-        type: "ref",
-        start: fromBabelLocation(node.loc.start, state.sourceId),
-        end: fromBabelLocation(node.loc.end, state.sourceId),
-        meta: buildMetaBindings(state.sourceId, node, ancestors)
-      });
-    } else if (t.isThisExpression(node)) {
-      let freeVariables = state.freeVariables.get("this");
-
-      if (!freeVariables) {
-        freeVariables = [];
-        state.freeVariables.set("this", freeVariables);
-      }
-
-      freeVariables.push({
-        type: "ref",
-        start: fromBabelLocation(node.loc.start, state.sourceId),
-        end: fromBabelLocation(node.loc.end, state.sourceId),
-        meta: buildMetaBindings(state.sourceId, node, ancestors)
-      });
-    } else if (t.isClassProperty(parentNode, {
-      value: node
-    })) {
-      const scope = pushTempScope(state, "function", "Class Field", {
-        start: fromBabelLocation(node.loc.start, state.sourceId),
-        end: fromBabelLocation(node.loc.end, state.sourceId)
-      });
-      scope.bindings.this = {
-        type: "implicit",
-        refs: []
-      };
-      scope.bindings.arguments = {
-        type: "implicit",
-        refs: []
-      };
-    } else if (t.isSwitchStatement(node) && hasLexicalDeclaration(node, parentNode)) {
-      pushTempScope(state, "block", "Switch", {
-        start: fromBabelLocation(node.loc.start, state.sourceId),
-        end: fromBabelLocation(node.loc.end, state.sourceId)
-      });
-    }
-
-    if ( // In general Flow expressions are deleted, so they can't contain
-    // runtime bindings, but typecasts are the one exception there.
-    t.isFlow(node) && !t.isTypeCastExpression(node) || // In general TS items are deleted, but TS has a few wrapper node
-    // types that can contain general JS expressions.
-    node.type.startsWith("TS") && !t.isTSTypeAssertion(node) && !t.isTSAsExpression(node) && !t.isTSNonNullExpression(node) && !t.isTSModuleDeclaration(node) && !t.isTSModuleBlock(node) && !t.isTSParameterProperty(node) && !t.isTSExportAssignment(node)) {
-      // Flag this node as a root "type" node. All items inside of this
-      // will be skipped entirely.
-      state.inType = node;
-    }
-  },
-
-  exit(node, ancestors, state) {
-    const currentScope = state.scope;
-    const parentScope = state.scopeStack.pop();
-
-    if (!parentScope) {
-      throw new Error("Assertion failure - unsynchronized pop");
-    }
-
-    state.scope = parentScope; // It is possible, as in the case of function expressions, that a single
-    // node has added multiple scopes, so we need to traverse upward here
-    // rather than jumping stright to 'parentScope'.
-
-    for (let scope = currentScope; scope && scope !== parentScope; scope = scope.parent) {
-      const freeVariables = state.freeVariables;
-      state.freeVariables = state.freeVariableStack.pop();
-      const parentFreeVariables = state.freeVariables; // Match up any free variables that match this scope's bindings and
-      // merge then into the refs.
-
-      for (const key of Object.keys(scope.bindings)) {
-        const binding = scope.bindings[key];
-        const freeVars = freeVariables.get(key);
-
-        if (freeVars) {
-          binding.refs.push(...freeVars);
-          freeVariables.delete(key);
-        }
-      } // Move any undeclared references in this scope into the parent for
-      // processing in higher scopes.
-
-
-      for (const [key, value] of freeVariables) {
-        let refs = parentFreeVariables.get(key);
-
-        if (!refs) {
-          refs = [];
-          parentFreeVariables.set(key, refs);
-        }
-
-        refs.push(...value);
-      }
-    }
-
-    if (state.inType === node) {
-      state.inType = null;
-    }
-  }
-
-};
-
-function isOpeningJSXIdentifier(node, ancestors) {
-  if (!t.isJSXIdentifier(node)) {
-    return false;
-  }
-
-  for (let i = ancestors.length - 1; i >= 0; i--) {
-    const {
-      node: parent,
-      key
-    } = ancestors[i];
-
-    if (t.isJSXOpeningElement(parent) && key === "name") {
-      return true;
-    } else if (!t.isJSXMemberExpression(parent) || key !== "object") {
-      break;
-    }
-  }
-
-  return false;
-}
-
-function buildMetaBindings(sourceId, node, ancestors, parentIndex = ancestors.length - 1) {
-  if (parentIndex <= 1) {
-    return null;
-  }
-
-  const parent = ancestors[parentIndex].node;
-  const grandparent = ancestors[parentIndex - 1].node; // Consider "0, foo" to be equivalent to "foo".
-
-  if (t.isSequenceExpression(parent) && parent.expressions.length === 2 && t.isNumericLiteral(parent.expressions[0]) && parent.expressions[1] === node) {
-    let start = parent.loc.start;
-    let end = parent.loc.end;
-
-    if (t.isCallExpression(grandparent, {
-      callee: parent
-    })) {
-      // Attempt to expand the range around parentheses, e.g.
-      // (0, foo.bar)()
-      start = grandparent.loc.start;
-      end = Object.assign({}, end);
-      end.column += 1;
-    }
-
-    return {
-      type: "inherit",
-      start: fromBabelLocation(start, sourceId),
-      end: fromBabelLocation(end, sourceId),
-      parent: buildMetaBindings(sourceId, parent, ancestors, parentIndex - 1)
-    };
-  } // Consider "Object(foo)" to be equivalent to "foo"
-
-
-  if (t.isCallExpression(parent) && t.isIdentifier(parent.callee, {
-    name: "Object"
-  }) && parent.arguments.length === 1 && parent.arguments[0] === node) {
-    return {
-      type: "inherit",
-      start: fromBabelLocation(parent.loc.start, sourceId),
-      end: fromBabelLocation(parent.loc.end, sourceId),
-      parent: buildMetaBindings(sourceId, parent, ancestors, parentIndex - 1)
-    };
-  }
-
-  if (t.isMemberExpression(parent, {
-    object: node
-  })) {
-    if (parent.computed) {
-      if (t.isStringLiteral(parent.property)) {
-        return {
-          type: "member",
-          start: fromBabelLocation(parent.loc.start, sourceId),
-          end: fromBabelLocation(parent.loc.end, sourceId),
-          property: parent.property.value,
-          parent: buildMetaBindings(sourceId, parent, ancestors, parentIndex - 1)
-        };
-      }
-    } else {
-      return {
-        type: "member",
-        start: fromBabelLocation(parent.loc.start, sourceId),
-        end: fromBabelLocation(parent.loc.end, sourceId),
-        property: parent.property.name,
-        parent: buildMetaBindings(sourceId, parent, ancestors, parentIndex - 1)
-      };
-    }
-  }
-
-  if (t.isCallExpression(parent, {
-    callee: node
-  }) && parent.arguments.length == 0) {
-    return {
-      type: "call",
-      start: fromBabelLocation(parent.loc.start, sourceId),
-      end: fromBabelLocation(parent.loc.end, sourceId),
-      parent: buildMetaBindings(sourceId, parent, ancestors, parentIndex - 1)
-    };
-  }
-
-  return null;
-}
-
-function looksLikeCommonJS(rootScope) {
-  const hasRefs = name => rootScope.bindings[name] && rootScope.bindings[name].refs.length > 0;
-
-  return hasRefs("__dirname") || hasRefs("__filename") || hasRefs("require") || hasRefs("exports") || hasRefs("module");
-}
-
-function stripModuleScope(rootScope) {
-  const rootLexicalScope = rootScope.children[0];
-  const moduleScope = rootLexicalScope.children[0];
-
-  if (moduleScope.type !== "module") {
-    throw new Error("Assertion failure - should be module");
-  }
-
-  Object.keys(moduleScope.bindings).forEach(name => {
-    const binding = moduleScope.bindings[name];
-
-    if (binding.type === "let" || binding.type === "const") {
-      rootLexicalScope.bindings[name] = binding;
-    } else {
-      rootScope.bindings[name] = binding;
-    }
-  });
-  rootLexicalScope.children = moduleScope.children;
-  rootLexicalScope.children.forEach(child => {
-    child.parent = rootLexicalScope;
-  });
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/getSymbols.js
+++ /dev/null
@@ -1,478 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.clearSymbols = clearSymbols;
-exports.getSymbols = getSymbols;
-
-var _types = require("@babel/types/index");
-
-var t = _interopRequireWildcard(_types);
-
-var _simplePath = require("./utils/simple-path");
-
-var _simplePath2 = _interopRequireDefault(_simplePath);
-
-var _ast = require("./utils/ast");
-
-var _helpers = require("./utils/helpers");
-
-var _inferClassName = require("./utils/inferClassName");
-
-var _getFunctionName = require("./utils/getFunctionName");
-
-var _getFunctionName2 = _interopRequireDefault(_getFunctionName);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
-
-/* 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/>. */
-let symbolDeclarations = new Map();
-
-function getFunctionParameterNames(path) {
-  if (path.node.params != null) {
-    return path.node.params.map(param => {
-      if (param.type !== "AssignmentPattern") {
-        return param.name;
-      } // Parameter with default value
-
-
-      if (param.left.type === "Identifier" && param.right.type === "Identifier") {
-        return `${param.left.name} = ${param.right.name}`;
-      } else if (param.left.type === "Identifier" && param.right.type === "StringLiteral") {
-        return `${param.left.name} = ${param.right.value}`;
-      } else if (param.left.type === "Identifier" && param.right.type === "ObjectExpression") {
-        return `${param.left.name} = {}`;
-      } else if (param.left.type === "Identifier" && param.right.type === "ArrayExpression") {
-        return `${param.left.name} = []`;
-      } else if (param.left.type === "Identifier" && param.right.type === "NullLiteral") {
-        return `${param.left.name} = null`;
-      }
-    });
-  }
-
-  return [];
-}
-/* eslint-disable complexity */
-
-
-function extractSymbol(path, symbols) {
-  if ((0, _helpers.isVariable)(path)) {
-    symbols.variables.push(...(0, _helpers.getVariableNames)(path));
-  }
-
-  if ((0, _helpers.isFunction)(path)) {
-    symbols.functions.push({
-      name: (0, _getFunctionName2.default)(path.node, path.parent),
-      klass: (0, _inferClassName.inferClassName)(path),
-      location: path.node.loc,
-      parameterNames: getFunctionParameterNames(path),
-      identifier: path.node.id
-    });
-  }
-
-  if (t.isJSXElement(path)) {
-    symbols.hasJsx = true;
-  }
-
-  if (t.isGenericTypeAnnotation(path)) {
-    symbols.hasTypes = true;
-  }
-
-  if (t.isClassDeclaration(path)) {
-    const {
-      loc,
-      superClass
-    } = path.node;
-    symbols.classes.push({
-      name: path.node.id.name,
-      parent: superClass ? {
-        name: t.isMemberExpression(superClass) ? (0, _helpers.getCode)(superClass) : superClass.name,
-        location: superClass.loc
-      } : null,
-      location: loc
-    });
-  }
-
-  if (t.isImportDeclaration(path)) {
-    symbols.imports.push({
-      source: path.node.source.value,
-      location: path.node.loc,
-      specifiers: (0, _helpers.getSpecifiers)(path.node.specifiers)
-    });
-  }
-
-  if (t.isObjectProperty(path)) {
-    const {
-      start,
-      end,
-      identifierName
-    } = path.node.key.loc;
-    symbols.objectProperties.push({
-      name: identifierName,
-      location: {
-        start,
-        end
-      },
-      expression: getSnippet(path)
-    });
-  }
-
-  if (t.isMemberExpression(path)) {
-    const {
-      start,
-      end
-    } = path.node.property.loc;
-    symbols.memberExpressions.push({
-      name: path.node.property.name,
-      location: {
-        start,
-        end
-      },
-      expression: getSnippet(path),
-      computed: path.node.computed
-    });
-  }
-
-  if ((t.isStringLiteral(path) || t.isNumericLiteral(path)) && t.isMemberExpression(path.parentPath)) {
-    // We only need literals that are part of computed memeber expressions
-    const {
-      start,
-      end
-    } = path.node.loc;
-    symbols.literals.push({
-      name: path.node.value,
-      location: {
-        start,
-        end
-      },
-      expression: getSnippet(path.parentPath)
-    });
-  }
-
-  if (t.isCallExpression(path)) {
-    const callee = path.node.callee;
-    const args = path.node.arguments;
-
-    if (!t.isMemberExpression(callee)) {
-      const {
-        start,
-        end,
-        identifierName
-      } = callee.loc;
-      symbols.callExpressions.push({
-        name: identifierName,
-        values: args.filter(arg => arg.value).map(arg => arg.value),
-        location: {
-          start,
-          end
-        }
-      });
-    }
-  }
-
-  if (t.isStringLiteral(path) && t.isProperty(path.parentPath)) {
-    const {
-      start,
-      end
-    } = path.node.loc;
-    return symbols.identifiers.push({
-      name: path.node.value,
-      expression: (0, _helpers.getObjectExpressionValue)(path.parent),
-      location: {
-        start,
-        end
-      }
-    });
-  }
-
-  if (t.isIdentifier(path) && !t.isGenericTypeAnnotation(path.parent)) {
-    let {
-      start,
-      end
-    } = path.node.loc; // We want to include function params, but exclude the function name
-
-    if (t.isClassMethod(path.parent) && !path.inList) {
-      return;
-    }
-
-    if (t.isProperty(path.parentPath) && !(0, _helpers.isObjectShorthand)(path.parent)) {
-      return symbols.identifiers.push({
-        name: path.node.name,
-        expression: (0, _helpers.getObjectExpressionValue)(path.parent),
-        location: {
-          start,
-          end
-        }
-      });
-    }
-
-    if (path.node.typeAnnotation) {
-      const column = path.node.typeAnnotation.loc.start.column;
-      end = { ...end,
-        column
-      };
-    }
-
-    symbols.identifiers.push({
-      name: path.node.name,
-      expression: path.node.name,
-      location: {
-        start,
-        end
-      }
-    });
-  }
-
-  if (t.isThisExpression(path.node)) {
-    const {
-      start,
-      end
-    } = path.node.loc;
-    symbols.identifiers.push({
-      name: "this",
-      location: {
-        start,
-        end
-      },
-      expression: "this"
-    });
-  }
-
-  if (t.isVariableDeclarator(path)) {
-    const nodeId = path.node.id;
-
-    if (t.isArrayPattern(nodeId)) {
-      return;
-    }
-
-    const properties = nodeId.properties && t.objectPattern(nodeId.properties) ? nodeId.properties : [{
-      value: {
-        name: nodeId.name
-      },
-      loc: path.node.loc
-    }];
-    properties.forEach(function (property) {
-      const {
-        start,
-        end
-      } = property.loc;
-      symbols.identifiers.push({
-        name: property.value.name,
-        expression: property.value.name,
-        location: {
-          start,
-          end
-        }
-      });
-    });
-  }
-}
-/* eslint-enable complexity */
-
-
-function extractSymbols(sourceId) {
-  const symbols = {
-    functions: [],
-    variables: [],
-    callExpressions: [],
-    memberExpressions: [],
-    objectProperties: [],
-    comments: [],
-    identifiers: [],
-    classes: [],
-    imports: [],
-    literals: [],
-    hasJsx: false,
-    hasTypes: false,
-    loading: false
-  };
-  const ast = (0, _ast.traverseAst)(sourceId, {
-    enter(node, ancestors) {
-      try {
-        const path = (0, _simplePath2.default)(ancestors);
-
-        if (path) {
-          extractSymbol(path, symbols);
-        }
-      } catch (e) {
-        console.error(e);
-      }
-    }
-
-  }); // comments are extracted separately from the AST
-
-  symbols.comments = (0, _helpers.getComments)(ast);
-  return symbols;
-}
-
-function extendSnippet(name, expression, path, prevPath) {
-  const computed = path && path.node.computed;
-  const prevComputed = prevPath && prevPath.node.computed;
-  const prevArray = t.isArrayExpression(prevPath);
-  const array = t.isArrayExpression(path);
-  const value = path && path.node.property && path.node.property.extra && path.node.property.extra.raw || "";
-
-  if (expression === "") {
-    if (computed) {
-      return name === undefined ? `[${value}]` : `[${name}]`;
-    }
-
-    return name;
-  }
-
-  if (computed || array) {
-    if (prevComputed || prevArray) {
-      return `[${name}]${expression}`;
-    }
-
-    return `[${name === undefined ? value : name}].${expression}`;
-  }
-
-  if (prevComputed || prevArray) {
-    return `${name}${expression}`;
-  }
-
-  if ((0, _helpers.isComputedExpression)(expression) && name !== undefined) {
-    return `${name}${expression}`;
-  }
-
-  return `${name}.${expression}`;
-}
-
-function getMemberSnippet(node, expression = "") {
-  if (t.isMemberExpression(node)) {
-    const name = node.property.name;
-    const snippet = getMemberSnippet(node.object, extendSnippet(name, expression, {
-      node
-    }));
-    return snippet;
-  }
-
-  if (t.isCallExpression(node)) {
-    return "";
-  }
-
-  if (t.isThisExpression(node)) {
-    return `this.${expression}`;
-  }
-
-  if (t.isIdentifier(node)) {
-    if ((0, _helpers.isComputedExpression)(expression)) {
-      return `${node.name}${expression}`;
-    }
-
-    return `${node.name}.${expression}`;
-  }
-
-  return expression;
-}
-
-function getObjectSnippet(path, prevPath, expression = "") {
-  if (!path) {
-    return expression;
-  }
-
-  const name = path.node.key.name;
-  const extendedExpression = extendSnippet(name, expression, path, prevPath);
-  const nextPrevPath = path;
-  const nextPath = path.parentPath && path.parentPath.parentPath;
-  return getSnippet(nextPath, nextPrevPath, extendedExpression);
-}
-
-function getArraySnippet(path, prevPath, expression) {
-  if (!prevPath.parentPath) {
-    throw new Error("Assertion failure - path should exist");
-  }
-
-  const index = `${prevPath.parentPath.containerIndex}`;
-  const extendedExpression = extendSnippet(index, expression, path, prevPath);
-  const nextPrevPath = path;
-  const nextPath = path.parentPath && path.parentPath.parentPath;
-  return getSnippet(nextPath, nextPrevPath, extendedExpression);
-}
-
-function getSnippet(path, prevPath, expression = "") {
-  if (!path) {
-    return expression;
-  }
-
-  if (t.isVariableDeclaration(path)) {
-    const node = path.node.declarations[0];
-    const name = node.id.name;
-    return extendSnippet(name, expression, path, prevPath);
-  }
-
-  if (t.isVariableDeclarator(path)) {
-    const node = path.node.id;
-
-    if (t.isObjectPattern(node)) {
-      return expression;
-    }
-
-    const name = node.name;
-    const prop = extendSnippet(name, expression, path, prevPath);
-    return prop;
-  }
-
-  if (t.isAssignmentExpression(path)) {
-    const node = path.node.left;
-    const name = t.isMemberExpression(node) ? getMemberSnippet(node) : node.name;
-    const prop = extendSnippet(name, expression, path, prevPath);
-    return prop;
-  }
-
-  if ((0, _helpers.isFunction)(path)) {
-    return expression;
-  }
-
-  if (t.isIdentifier(path)) {
-    const node = path.node;
-    return `${node.name}.${expression}`;
-  }
-
-  if (t.isObjectProperty(path)) {
-    return getObjectSnippet(path, prevPath, expression);
-  }
-
-  if (t.isObjectExpression(path)) {
-    const parentPath = prevPath && prevPath.parentPath;
-    return getObjectSnippet(parentPath, prevPath, expression);
-  }
-
-  if (t.isMemberExpression(path)) {
-    return getMemberSnippet(path.node, expression);
-  }
-
-  if (t.isArrayExpression(path)) {
-    if (!prevPath) {
-      throw new Error("Assertion failure - path should exist");
-    }
-
-    return getArraySnippet(path, prevPath, expression);
-  }
-
-  return "";
-}
-
-function clearSymbols() {
-  symbolDeclarations = new Map();
-}
-
-function getSymbols(sourceId) {
-  if (symbolDeclarations.has(sourceId)) {
-    const symbols = symbolDeclarations.get(sourceId);
-
-    if (symbols) {
-      return symbols;
-    }
-  }
-
-  const symbols = extractSymbols(sourceId);
-  symbolDeclarations.set(sourceId, symbols);
-  return symbols;
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/mapBindings.js
+++ /dev/null
@@ -1,114 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = mapExpressionBindings;
-
-var _ast = require("./utils/ast");
-
-var _generator = require("@babel/generator/index");
-
-var _generator2 = _interopRequireDefault(_generator);
-
-var _types = require("@babel/types/index");
-
-var t = _interopRequireWildcard(_types);
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
-
-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/>. */
-// translates new bindings `var a = 3` into `self.a = 3`
-// and existing bindings `var a = 3` into `a = 3` for re-assignments
-function globalizeDeclaration(node, bindings) {
-  return node.declarations.map(declaration => {
-    const identifier = bindings.includes(declaration.id.name) ? declaration.id : t.memberExpression(t.identifier("self"), declaration.id);
-    return t.expressionStatement(t.assignmentExpression("=", identifier, declaration.init));
-  });
-} // translates new bindings `a = 3` into `self.a = 3`
-// and keeps assignments the same for existing bindings.
-
-
-function globalizeAssignment(node, bindings) {
-  if (bindings.includes(node.left.name)) {
-    return node;
-  }
-
-  const identifier = t.memberExpression(t.identifier("self"), node.left);
-  return t.assignmentExpression(node.operator, identifier, node.right);
-}
-
-function isTopLevel(ancestors) {
-  return ancestors.filter(ancestor => ancestor.key == "body").length == 1;
-}
-
-function replaceNode(ancestors, node) {
-  const parent = ancestors[ancestors.length - 1];
-
-  if (typeof parent.index === "number") {
-    if (Array.isArray(node)) {
-      parent.node[parent.key].splice(parent.index, 1, ...node);
-    } else {
-      parent.node[parent.key][parent.index] = node;
-    }
-  } else {
-    parent.node[parent.key] = node;
-  }
-}
-
-function hasDestructuring(node) {
-  return node.declarations.some(declaration => t.isPattern(declaration.id));
-}
-
-function mapExpressionBindings(expression, bindings = []) {
-  const ast = (0, _ast.parseScript)(expression);
-  let shouldUpdate = true;
-  t.traverse(ast, (node, ancestors) => {
-    const parent = ancestors[ancestors.length - 1];
-
-    if (t.isWithStatement(node)) {
-      shouldUpdate = false;
-      return;
-    }
-
-    if (!isTopLevel(ancestors)) {
-      return;
-    }
-
-    if (t.isAssignmentExpression(node)) {
-      if (t.isIdentifier(node.left)) {
-        const newNode = globalizeAssignment(node, bindings);
-        return replaceNode(ancestors, newNode);
-      }
-
-      if (t.isPattern(node.left)) {
-        shouldUpdate = false;
-        return;
-      }
-    }
-
-    if (!t.isVariableDeclaration(node)) {
-      return;
-    }
-
-    if (hasDestructuring(node)) {
-      shouldUpdate = false;
-      return;
-    }
-
-    if (!t.isForStatement(parent.node)) {
-      const newNodes = globalizeDeclaration(node, bindings);
-      replaceNode(ancestors, newNodes);
-    }
-  });
-
-  if (!shouldUpdate) {
-    return expression;
-  }
-
-  return (0, _generator2.default)(ast).code;
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/mapExpression.js
+++ /dev/null
@@ -1,35 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = mapExpression;
-
-var _mapOriginalExpression = require("./mapOriginalExpression");
-
-var _mapOriginalExpression2 = _interopRequireDefault(_mapOriginalExpression);
-
-var _mapBindings = require("./mapBindings");
-
-var _mapBindings2 = _interopRequireDefault(_mapBindings);
-
-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/>. */
-function mapExpression(expression, mappings, bindings, shouldMapBindings = true) {
-  let originalExpression = expression;
-
-  if (mappings) {
-    originalExpression = (0, _mapOriginalExpression2.default)(expression, mappings);
-  }
-
-  let safeExpression = originalExpression;
-
-  if (shouldMapBindings) {
-    safeExpression = (0, _mapBindings2.default)(originalExpression, bindings);
-  }
-
-  return safeExpression;
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/mapOriginalExpression.js
+++ /dev/null
@@ -1,114 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = mapOriginalExpression;
-
-var _ast = require("./utils/ast");
-
-var _getScopes = require("./getScopes/index");
-
-var _generator = require("@babel/generator/index");
-
-var _generator2 = _interopRequireDefault(_generator);
-
-var _types = require("@babel/types/index");
-
-var t = _interopRequireWildcard(_types);
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
-
-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/>. */
-// NOTE: this will only work if we are replacing an original identifier
-function replaceNode(ancestors, node) {
-  const ancestor = ancestors[ancestors.length - 1];
-
-  if (typeof ancestor.index === "number") {
-    ancestor.node[ancestor.key][ancestor.index] = node;
-  } else {
-    ancestor.node[ancestor.key] = node;
-  }
-}
-
-function getFirstExpression(ast) {
-  const statements = ast.program.body;
-
-  if (statements.length == 0) {
-    return null;
-  }
-
-  return statements[0].expression;
-}
-
-function locationKey(start) {
-  return `${start.line}:${start.column}`;
-}
-
-function mapOriginalExpression(expression, mappings) {
-  const ast = (0, _ast.parseScript)(expression);
-  const scopes = (0, _getScopes.buildScopeList)(ast, "");
-  const nodes = new Map();
-  const replacements = new Map(); // The ref-only global bindings are the ones that are accessed, but not
-  // declared anywhere in the parsed code, meaning they are either global,
-  // or declared somewhere in a scope outside the parsed code, so we
-  // rewrite all of those specifically to avoid rewritting declarations that
-  // shadow outer mappings.
-
-  for (const name of Object.keys(scopes[0].bindings)) {
-    const {
-      refs
-    } = scopes[0].bindings[name];
-    const mapping = mappings[name];
-
-    if (!refs.every(ref => ref.type === "ref") || !mapping || mapping === name) {
-      continue;
-    }
-
-    let node = nodes.get(name);
-
-    if (!node) {
-      node = getFirstExpression((0, _ast.parseScript)(mapping));
-      nodes.set(name, node);
-    }
-
-    for (const ref of refs) {
-      let {
-        line,
-        column
-      } = ref.start; // This shouldn't happen, just keeping Flow happy.
-
-      if (typeof column !== "number") {
-        column = 0;
-      }
-
-      replacements.set(locationKey({
-        line,
-        column
-      }), node);
-    }
-  }
-
-  if (replacements.size === 0) {
-    // Avoid the extra code generation work and also avoid potentially
-    // reformatting the user's code unnecessarily.
-    return expression;
-  }
-
-  t.traverse(ast, (node, ancestors) => {
-    if (!t.isIdentifier(node) && !t.isThisExpression(node)) {
-      return;
-    }
-
-    const replacement = replacements.get(locationKey(node.loc.start));
-
-    if (replacement) {
-      replaceNode(ancestors, t.cloneNode(replacement));
-    }
-  });
-  return (0, _generator2.default)(ast).code;
-}
\ No newline at end of file
--- a/devtools/client/debugger/new/src/workers/parser/moz.build
+++ b/devtools/client/debugger/new/src/workers/parser/moz.build
@@ -1,24 +1,12 @@
 # vim: set filetype=python:
 # 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/.
 
 DIRS += [
     'getScopes',
-    'utils',
 ]
 
 DevToolsModules(
-    'findOutOfScopeLocations.js',
-    'frameworks.js',
-    'getSymbols.js',
     'index.js',
-    'mapBindings.js',
-    'mapExpression.js',
-    'mapOriginalExpression.js',
-    'pausePoints.js',
-    'sources.js',
-    'steps.js',
-    'validate.js',
-    'worker.js',
 )
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/pausePoints.js
+++ /dev/null
@@ -1,191 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.getPausePoints = getPausePoints;
-
-var _ast = require("./utils/ast");
-
-var _types = require("@babel/types/index");
-
-var t = _interopRequireWildcard(_types);
-
-var _isEqual = require("devtools/client/shared/vendor/lodash").isEqual;
-
-var _isEqual2 = _interopRequireDefault(_isEqual);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
-
-/* 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 isForStatement = node => t.isForStatement(node) || t.isForOfStatement(node);
-
-const isControlFlow = node => isForStatement(node) || t.isWhileStatement(node) || t.isIfStatement(node) || t.isSwitchCase(node) || t.isSwitchStatement(node) || t.isTryStatement(node) || t.isWithStatement(node);
-
-const isAssignment = node => t.isVariableDeclarator(node) || t.isAssignmentExpression(node) || t.isAssignmentPattern(node);
-
-const isImport = node => t.isImport(node) || t.isImportDeclaration(node);
-
-const isReturn = node => t.isReturnStatement(node);
-
-const isCall = node => t.isCallExpression(node) || t.isJSXElement(node);
-
-const inStepExpression = parent => t.isArrayExpression(parent) || t.isObjectProperty(parent) || t.isCallExpression(parent) || t.isJSXElement(parent);
-
-const inExpression = (parent, grandParent) => inStepExpression(parent) || t.isJSXAttribute(grandParent) || t.isTemplateLiteral(parent);
-
-const isExport = node => t.isExportNamedDeclaration(node) || t.isExportDefaultDeclaration(node);
-
-function getStartLine(node) {
-  return node.loc.start.line;
-}
-
-function getPausePoints(sourceId) {
-  const state = {};
-  (0, _ast.traverseAst)(sourceId, {
-    enter: onEnter
-  }, state);
-  return state;
-}
-/* eslint-disable complexity */
-
-
-function onEnter(node, ancestors, state) {
-  const parent = ancestors[ancestors.length - 1];
-  const parentNode = parent && parent.node;
-  const grandParent = ancestors[ancestors.length - 2];
-  const startLocation = node.loc.start;
-
-  if (isImport(node) || t.isClassDeclaration(node) || isExport(node) || t.isDebuggerStatement(node) || t.isThrowStatement(node) || t.isExpressionStatement(node) || t.isBreakStatement(node) || t.isContinueStatement(node)) {
-    return addStopPoint(state, startLocation);
-  }
-
-  if (isControlFlow(node)) {
-    if (isForStatement(node)) {
-      addStopPoint(state, startLocation);
-    } else {
-      addEmptyPoint(state, startLocation);
-    }
-
-    const test = node.test || node.discriminant;
-
-    if (test) {
-      addStopPoint(state, test.loc.start);
-    }
-
-    return;
-  }
-
-  if (t.isBlockStatement(node)) {
-    return addEmptyPoint(state, startLocation);
-  }
-
-  if (isReturn(node)) {
-    // We do not want to pause at the return if the
-    // argument is a call on the same line e.g. return foo()
-    if (isCall(node.argument) && getStartLine(node) == getStartLine(node.argument)) {
-      return addEmptyPoint(state, startLocation);
-    }
-
-    return addStopPoint(state, startLocation);
-  }
-
-  if (isAssignment(node)) {
-    // We only want to pause at literal assignments `var a = foo()`
-    const value = node.right || node.init;
-
-    if (isCall(value) || t.isFunction(parentNode)) {
-      return addEmptyPoint(state, startLocation);
-    }
-
-    return addStopPoint(state, startLocation);
-  }
-
-  if (isCall(node)) {
-    let location = startLocation; // When functions are chained, we want to use the property location
-    // e.g `foo().bar()`
-
-    if (t.isMemberExpression(node.callee)) {
-      location = node.callee.property.loc.start;
-    } // NOTE: we do not want to land inside an expression e.g. [], {}, call
-
-
-    const step = !inExpression(parent.node, grandParent && grandParent.node); // NOTE: we add a point at the beginning of the expression
-    // and each of the calls because the engine does not support
-    // column-based member expression calls.
-
-    addPoint(state, startLocation, {
-      break: true,
-      step
-    });
-
-    if (location && !(0, _isEqual2.default)(location, startLocation)) {
-      addPoint(state, location, {
-        break: true,
-        step
-      });
-    }
-
-    return;
-  }
-
-  if (t.isClassProperty(node)) {
-    return addBreakPoint(state, startLocation);
-  }
-
-  if (t.isFunction(node)) {
-    const {
-      line,
-      column
-    } = node.loc.end;
-    addBreakPoint(state, startLocation);
-    return addEmptyPoint(state, {
-      line,
-      column: column - 1
-    });
-  }
-
-  if (!hasPoint(state, startLocation) && inStepExpression(parentNode)) {
-    return addEmptyPoint(state, startLocation);
-  }
-}
-
-function hasPoint(state, {
-  line,
-  column
-}) {
-  return state[line] && state[line][column];
-}
-
-function addPoint(state, {
-  line,
-  column
-}, types) {
-  if (!state[line]) {
-    state[line] = {};
-  }
-
-  state[line][column] = types;
-  return state;
-}
-
-function addStopPoint(state, location) {
-  return addPoint(state, location, {
-    break: true,
-    step: true
-  });
-}
-
-function addEmptyPoint(state, location) {
-  return addPoint(state, location, {});
-}
-
-function addBreakPoint(state, location) {
-  return addPoint(state, location, {
-    break: true
-  });
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/sources.js
+++ /dev/null
@@ -1,34 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.hasSource = hasSource;
-exports.setSource = setSource;
-exports.getSource = getSource;
-exports.clearSources = clearSources;
-
-/* 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/>. */
-let cachedSources = new Map();
-
-function hasSource(sourceId) {
-  return cachedSources.has(sourceId);
-}
-
-function setSource(source) {
-  cachedSources.set(source.id, source);
-}
-
-function getSource(sourceId) {
-  if (!cachedSources.has(sourceId)) {
-    throw new Error(`Parser: source ${sourceId} was not provided.`);
-  }
-
-  return cachedSources.get(sourceId);
-}
-
-function clearSources() {
-  cachedSources = new Map();
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/steps.js
+++ /dev/null
@@ -1,63 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.getNextStep = getNextStep;
-
-var _types = require("@babel/types/index");
-
-var t = _interopRequireWildcard(_types);
-
-var _closest = require("./utils/closest");
-
-var _helpers = require("./utils/helpers");
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
-
-/* 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 getNextStep(sourceId, pausedPosition) {
-  const currentExpression = getSteppableExpression(sourceId, pausedPosition);
-
-  if (!currentExpression) {
-    return null;
-  }
-
-  const currentStatement = currentExpression.find(p => {
-    return p.inList && t.isStatement(p.node);
-  });
-
-  if (!currentStatement) {
-    throw new Error("Assertion failure - this should always find at least Program");
-  }
-
-  return _getNextStep(currentStatement, sourceId, pausedPosition);
-}
-
-function getSteppableExpression(sourceId, pausedPosition) {
-  const closestPath = (0, _closest.getClosestPath)(sourceId, pausedPosition);
-
-  if (!closestPath) {
-    return null;
-  }
-
-  if ((0, _helpers.isAwaitExpression)(closestPath) || (0, _helpers.isYieldExpression)(closestPath)) {
-    return closestPath;
-  }
-
-  return closestPath.find(p => t.isAwaitExpression(p.node) || t.isYieldExpression(p.node));
-}
-
-function _getNextStep(statement, sourceId, position) {
-  const nextStatement = statement.getSibling(1);
-
-  if (nextStatement) {
-    return { ...nextStatement.node.loc.start,
-      sourceId: sourceId
-    };
-  }
-
-  return null;
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/utils/ast.js
+++ /dev/null
@@ -1,168 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.parseScript = parseScript;
-exports.getAst = getAst;
-exports.clearASTs = clearASTs;
-exports.traverseAst = traverseAst;
-
-var _parseScriptTags = require("parse-script-tags/index");
-
-var _parseScriptTags2 = _interopRequireDefault(_parseScriptTags);
-
-var _babylon = require("babylon/index");
-
-var babylon = _interopRequireWildcard(_babylon);
-
-var _types = require("@babel/types/index");
-
-var t = _interopRequireWildcard(_types);
-
-var _isEmpty = require("devtools/client/shared/vendor/lodash").isEmpty;
-
-var _isEmpty2 = _interopRequireDefault(_isEmpty);
-
-var _sources = require("../sources");
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
-
-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/>. */
-let ASTs = new Map();
-
-function _parse(code, opts) {
-  return babylon.parse(code, { ...opts,
-    tokens: true
-  });
-}
-
-const sourceOptions = {
-  generated: {
-    sourceType: "unambiguous",
-    tokens: true,
-    plugins: ["objectRestSpread"]
-  },
-  original: {
-    sourceType: "unambiguous",
-    tokens: true,
-    plugins: ["jsx", "flow", "doExpressions", "decorators", "objectRestSpread", "classProperties", "exportDefaultFrom", "exportNamespaceFrom", "asyncGenerators", "functionBind", "functionSent", "dynamicImport", "react-jsx"]
-  }
-};
-
-function parse(text, opts) {
-  let ast;
-
-  if (!text) {
-    return;
-  }
-
-  try {
-    ast = _parse(text, opts);
-  } catch (error) {
-    console.error(error);
-    ast = {};
-  }
-
-  return ast;
-} // Custom parser for parse-script-tags that adapts its input structure to
-// our parser's signature
-
-
-function htmlParser({
-  source,
-  line
-}) {
-  return parse(source, {
-    startLine: line
-  });
-}
-
-const VUE_COMPONENT_START = /^\s*</;
-
-function vueParser({
-  source,
-  line
-}) {
-  return parse(source, {
-    startLine: line,
-    ...sourceOptions.original
-  });
-}
-
-function parseVueScript(code) {
-  if (typeof code !== "string") {
-    return;
-  }
-
-  let ast; // .vue files go through several passes, so while there is a
-  // single-file-component Vue template, there are also generally .vue files
-  // that are still just JS as well.
-
-  if (code.match(VUE_COMPONENT_START)) {
-    ast = (0, _parseScriptTags2.default)(code, vueParser);
-
-    if (t.isFile(ast)) {
-      // parseScriptTags is currently hard-coded to return scripts, but Vue
-      // always expects ESM syntax, so we just hard-code it.
-      ast.program.sourceType = "module";
-    }
-  } else {
-    ast = parse(code, sourceOptions.original);
-  }
-
-  return ast;
-}
-
-function parseScript(text, opts) {
-  return _parse(text, opts);
-}
-
-function getAst(sourceId) {
-  if (ASTs.has(sourceId)) {
-    return ASTs.get(sourceId);
-  }
-
-  const source = (0, _sources.getSource)(sourceId);
-  let ast = {};
-  const {
-    contentType
-  } = source;
-
-  if (contentType == "text/html") {
-    ast = (0, _parseScriptTags2.default)(source.text, htmlParser) || {};
-  } else if (contentType && contentType === "text/vue") {
-    ast = parseVueScript(source.text) || {};
-  } else if (contentType && contentType.match(/(javascript|jsx)/) && !contentType.match(/typescript-jsx/)) {
-    const type = source.id.includes("original") ? "original" : "generated";
-    const options = sourceOptions[type];
-    ast = parse(source.text, options);
-  } else if (contentType && contentType.match(/typescript/)) {
-    const options = { ...sourceOptions.original,
-      plugins: [...sourceOptions.original.plugins.filter(p => p !== "flow" && p !== "decorators" && p !== "decorators2" && (p !== "jsx" || contentType.match(/typescript-jsx/))), "decorators", "typescript"]
-    };
-    ast = parse(source.text, options);
-  }
-
-  ASTs.set(source.id, ast);
-  return ast;
-}
-
-function clearASTs() {
-  ASTs = new Map();
-}
-
-function traverseAst(sourceId, visitor, state) {
-  const ast = getAst(sourceId);
-
-  if ((0, _isEmpty2.default)(ast)) {
-    return null;
-  }
-
-  t.traverse(ast, visitor, state);
-  return ast;
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/utils/closest.js
+++ /dev/null
@@ -1,41 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.getClosestPath = getClosestPath;
-
-var _simplePath = require("./simple-path");
-
-var _simplePath2 = _interopRequireDefault(_simplePath);
-
-var _ast = require("./ast");
-
-var _contains = require("./contains");
-
-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/>. */
-function getClosestPath(sourceId, location) {
-  let closestPath = null;
-  (0, _ast.traverseAst)(sourceId, {
-    enter(node, ancestors) {
-      if ((0, _contains.nodeContainsPosition)(node, location)) {
-        const path = (0, _simplePath2.default)(ancestors);
-
-        if (path && (!closestPath || path.depth > closestPath.depth)) {
-          closestPath = path;
-        }
-      }
-    }
-
-  });
-
-  if (!closestPath) {
-    throw new Error("Assertion failure - This should always fine a path");
-  }
-
-  return closestPath;
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/utils/contains.js
+++ /dev/null
@@ -1,43 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.containsPosition = containsPosition;
-exports.containsLocation = containsLocation;
-exports.nodeContainsPosition = nodeContainsPosition;
-
-/* 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 startsBefore(a, b) {
-  let before = a.start.line < b.line;
-
-  if (a.start.line === b.line) {
-    before = a.start.column >= 0 && b.column >= 0 ? a.start.column <= b.column : true;
-  }
-
-  return before;
-}
-
-function endsAfter(a, b) {
-  let after = a.end.line > b.line;
-
-  if (a.end.line === b.line) {
-    after = a.end.column >= 0 && b.column >= 0 ? a.end.column >= b.column : true;
-  }
-
-  return after;
-}
-
-function containsPosition(a, b) {
-  return startsBefore(a, b) && endsAfter(a, b);
-}
-
-function containsLocation(a, b) {
-  return containsPosition(a, b.start) && containsPosition(a, b.end);
-}
-
-function nodeContainsPosition(node, position) {
-  return containsPosition(node.loc, position);
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/utils/formatSymbols.js
+++ /dev/null
@@ -1,62 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.formatSymbols = formatSymbols;
-
-var _getSymbols = require("../getSymbols");
-
-var _sources = require("../sources");
-
-/* 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 formatLocation(loc) {
-  if (!loc) {
-    return "";
-  }
-
-  const {
-    start,
-    end
-  } = loc;
-  const startLoc = `(${start.line}, ${start.column})`;
-  const endLoc = `(${end.line}, ${end.column})`;
-  return `[${startLoc}, ${endLoc}]`;
-}
-
-function summarize(symbol) {
-  if (typeof symbol == "boolean") {
-    return symbol ? "true" : "false";
-  }
-
-  const loc = formatLocation(symbol.location);
-  const params = symbol.parameterNames ? `(${symbol.parameterNames.join(", ")})` : "";
-  const expression = symbol.expression || "";
-  const klass = symbol.klass || "";
-  const name = symbol.name == undefined ? "" : symbol.name;
-  const names = symbol.specifiers ? symbol.specifiers.join(", ") : "";
-  const values = symbol.values ? symbol.values.join(", ") : "";
-  return `${loc} ${expression} ${name}${params} ${klass} ${names} ${values}`.trim(); // eslint-disable-line max-len
-}
-
-const bools = ["hasJsx", "hasTypes", "loading"];
-
-function formatBool(name, symbols) {
-  return `${name}: ${symbols[name] ? "true" : "false"}`;
-}
-
-function formatKey(name, symbols) {
-  if (bools.includes(name)) {
-    return formatBool(name, symbols);
-  }
-
-  return `${name}:\n${symbols[name].map(summarize).join("\n")}`;
-}
-
-function formatSymbols(source) {
-  (0, _sources.setSource)(source);
-  const symbols = (0, _getSymbols.getSymbols)(source.id);
-  return Object.keys(symbols).map(name => formatKey(name, symbols)).join("\n\n");
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/utils/getFunctionName.js
+++ /dev/null
@@ -1,105 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = getFunctionName;
-
-var _types = require("@babel/types/index");
-
-var t = _interopRequireWildcard(_types);
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
-
-/* 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/>. */
-// Perform ES6's anonymous function name inference for all
-// locations where static analysis is possible.
-// eslint-disable-next-line complexity
-function getFunctionName(node, parent) {
-  if (t.isIdentifier(node.id)) {
-    return node.id.name;
-  }
-
-  if (t.isObjectMethod(node, {
-    computed: false
-  }) || t.isClassMethod(node, {
-    computed: false
-  })) {
-    const key = node.key;
-
-    if (t.isIdentifier(key)) {
-      return key.name;
-    }
-
-    if (t.isStringLiteral(key)) {
-      return key.value;
-    }
-
-    if (t.isNumericLiteral(key)) {
-      return `${key.value}`;
-    }
-  }
-
-  if (t.isObjectProperty(parent, {
-    computed: false,
-    value: node
-  }) || // TODO: Babylon 6 doesn't support computed class props. It is included
-  // here so that it is most flexible. Once Babylon 7 is used, this
-  // can change to use computed: false like ObjectProperty.
-  t.isClassProperty(parent, {
-    value: node
-  }) && !parent.computed) {
-    const key = parent.key;
-
-    if (t.isIdentifier(key)) {
-      return key.name;
-    }
-
-    if (t.isStringLiteral(key)) {
-      return key.value;
-    }
-
-    if (t.isNumericLiteral(key)) {
-      return `${key.value}`;
-    }
-  }
-
-  if (t.isAssignmentExpression(parent, {
-    operator: "=",
-    right: node
-  })) {
-    if (t.isIdentifier(parent.left)) {
-      return parent.left.name;
-    } // This case is not supported in standard ES6 name inference, but it
-    // is included here since it is still a helpful case during debugging.
-
-
-    if (t.isMemberExpression(parent.left, {
-      computed: false
-    })) {
-      return parent.left.property.name;
-    }
-  }
-
-  if (t.isAssignmentPattern(parent, {
-    right: node
-  }) && t.isIdentifier(parent.left)) {
-    return parent.left.name;
-  }
-
-  if (t.isVariableDeclarator(parent, {
-    init: node
-  }) && t.isIdentifier(parent.id)) {
-    return parent.id.name;
-  }
-
-  if (t.isExportDefaultDeclaration(parent, {
-    declaration: node
-  }) && t.isFunctionDeclaration(node)) {
-    return "default";
-  }
-
-  return "anonymous";
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/utils/helpers.js
+++ /dev/null
@@ -1,196 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.isFunction = isFunction;
-exports.isAwaitExpression = isAwaitExpression;
-exports.isYieldExpression = isYieldExpression;
-exports.isObjectShorthand = isObjectShorthand;
-exports.getObjectExpressionValue = getObjectExpressionValue;
-exports.getCode = getCode;
-exports.getVariableNames = getVariableNames;
-exports.getComments = getComments;
-exports.getSpecifiers = getSpecifiers;
-exports.isVariable = isVariable;
-exports.isComputedExpression = isComputedExpression;
-exports.getMemberExpression = getMemberExpression;
-exports.getVariables = getVariables;
-
-var _types = require("@babel/types/index");
-
-var t = _interopRequireWildcard(_types);
-
-var _generator = require("@babel/generator/index");
-
-var _generator2 = _interopRequireDefault(_generator);
-
-var _flatten = require("devtools/client/shared/vendor/lodash").flatten;
-
-var _flatten2 = _interopRequireDefault(_flatten);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
-
-/* 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 isFunction(node) {
-  return t.isFunction(node) || t.isArrowFunctionExpression(node) || t.isObjectMethod(node) || t.isClassMethod(node);
-}
-
-function isAwaitExpression(path) {
-  const {
-    node,
-    parent
-  } = path;
-  return t.isAwaitExpression(node) || t.isAwaitExpression(parent.init) || t.isAwaitExpression(parent);
-}
-
-function isYieldExpression(path) {
-  const {
-    node,
-    parent
-  } = path;
-  return t.isYieldExpression(node) || t.isYieldExpression(parent.init) || t.isYieldExpression(parent);
-}
-
-function isObjectShorthand(parent) {
-  return t.isObjectProperty(parent) && parent.value && parent.key.start == parent.value.start && parent.key.loc.identifierName === parent.value.loc.identifierName;
-}
-
-function getObjectExpressionValue(node) {
-  const {
-    value
-  } = node;
-
-  if (t.isIdentifier(value)) {
-    return value.name;
-  }
-
-  if (t.isCallExpression(value)) {
-    return "";
-  }
-
-  const code = (0, _generator2.default)(value).code;
-  const shouldWrap = t.isObjectExpression(value);
-  return shouldWrap ? `(${code})` : code;
-}
-
-function getCode(node) {
-  return (0, _generator2.default)(node).code;
-}
-
-function getVariableNames(path) {
-  if (t.isObjectProperty(path.node) && !isFunction(path.node.value)) {
-    if (path.node.key.type === "StringLiteral") {
-      return [{
-        name: path.node.key.value,
-        location: path.node.loc
-      }];
-    } else if (path.node.value.type === "Identifier") {
-      return [{
-        name: path.node.value.name,
-        location: path.node.loc
-      }];
-    } else if (path.node.value.type === "AssignmentPattern") {
-      return [{
-        name: path.node.value.left.name,
-        location: path.node.loc
-      }];
-    }
-
-    return [{
-      name: path.node.key.name,
-      location: path.node.loc
-    }];
-  }
-
-  if (!path.node.declarations) {
-    return path.node.params.map(dec => ({
-      name: dec.name,
-      location: dec.loc
-    }));
-  }
-
-  const declarations = path.node.declarations.filter(dec => dec.id.type !== "ObjectPattern").map(getVariables);
-  return (0, _flatten2.default)(declarations);
-}
-
-function getComments(ast) {
-  if (!ast || !ast.comments) {
-    return [];
-  }
-
-  return ast.comments.map(comment => ({
-    name: comment.location,
-    location: comment.loc
-  }));
-}
-
-function getSpecifiers(specifiers) {
-  if (!specifiers) {
-    return [];
-  }
-
-  return specifiers.map(specifier => specifier.local && specifier.local.name);
-}
-
-function isVariable(path) {
-  const node = path.node;
-  return t.isVariableDeclaration(node) || isFunction(path) && path.node.params != null && path.node.params.length || t.isObjectProperty(node) && !isFunction(path.node.value);
-}
-
-function isComputedExpression(expression) {
-  return /^\[/m.test(expression);
-}
-
-function getMemberExpression(root) {
-  function _getMemberExpression(node, expr) {
-    if (t.isMemberExpression(node)) {
-      expr = [node.property.name].concat(expr);
-      return _getMemberExpression(node.object, expr);
-    }
-
-    if (t.isCallExpression(node)) {
-      return [];
-    }
-
-    if (t.isThisExpression(node)) {
-      return ["this"].concat(expr);
-    }
-
-    return [node.name].concat(expr);
-  }
-
-  const expr = _getMemberExpression(root, []);
-
-  return expr.join(".");
-}
-
-function getVariables(dec) {
-  if (!dec.id) {
-    return [];
-  }
-
-  if (t.isArrayPattern(dec.id)) {
-    if (!dec.id.elements) {
-      return [];
-    } // NOTE: it's possible that an element is empty
-    // e.g. const [, a] = arr
-
-
-    return dec.id.elements.filter(element => element).map(element => {
-      return {
-        name: t.isAssignmentPattern(element) ? element.left.name : element.name || element.argument.name,
-        location: element.loc
-      };
-    });
-  }
-
-  return [{
-    name: dec.id.name,
-    location: dec.loc
-  }];
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/utils/inferClassName.js
+++ /dev/null
@@ -1,98 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.inferClassName = inferClassName;
-
-var _types = require("@babel/types/index");
-
-var t = _interopRequireWildcard(_types);
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
-
-/* 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/>. */
-// the function class is inferred from a call like
-// createClass or extend
-function fromCallExpression(callExpression) {
-  const whitelist = ["extend", "createClass"];
-  const callee = callExpression.node.callee;
-
-  if (!callee) {
-    return null;
-  }
-
-  const name = t.isMemberExpression(callee) ? callee.property.name : callee.name;
-
-  if (!whitelist.includes(name)) {
-    return null;
-  }
-
-  const variable = callExpression.findParent(p => t.isVariableDeclarator(p.node));
-
-  if (variable) {
-    return variable.node.id.name;
-  }
-
-  const assignment = callExpression.findParent(p => t.isAssignmentExpression(p.node));
-
-  if (!assignment) {
-    return null;
-  }
-
-  const left = assignment.node.left;
-
-  if (left.name) {
-    return name;
-  }
-
-  if (t.isMemberExpression(left)) {
-    return left.property.name;
-  }
-
-  return null;
-} // the function class is inferred from a prototype assignment
-// e.g. TodoClass.prototype.render = function() {}
-
-
-function fromPrototype(assignment) {
-  const left = assignment.node.left;
-
-  if (!left) {
-    return null;
-  }
-
-  if (t.isMemberExpression(left) && left.object && t.isMemberExpression(left.object) && left.object.property.identifier === "prototype") {
-    return left.object.object.name;
-  }
-
-  return null;
-} // infer class finds an appropriate class for functions
-// that are defined inside of a class like thing.
-// e.g. `class Foo`, `TodoClass.prototype.foo`,
-//      `Todo = createClass({ foo: () => {}})`
-
-
-function inferClassName(path) {
-  const classDeclaration = path.findParent(p => t.isClassDeclaration(p.node));
-
-  if (classDeclaration) {
-    return classDeclaration.node.id.name;
-  }
-
-  const callExpression = path.findParent(p => t.isCallExpression(p.node));
-
-  if (callExpression) {
-    return fromCallExpression(callExpression);
-  }
-
-  const assignment = path.findParent(p => t.isAssignmentExpression(p.node));
-
-  if (assignment) {
-    return fromPrototype(assignment);
-  }
-
-  return null;
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/utils/moz.build
+++ /dev/null
@@ -1,19 +0,0 @@
-# vim: set filetype=python:
-# 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/.
-
-DIRS += [
-
-]
-
-DevToolsModules(
-    'ast.js',
-    'closest.js',
-    'contains.js',
-    'formatSymbols.js',
-    'getFunctionName.js',
-    'helpers.js',
-    'inferClassName.js',
-    'simple-path.js',
-)
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/utils/simple-path.js
+++ /dev/null
@@ -1,161 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = createSimplePath;
-
-/* 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 createSimplePath(ancestors) {
-  if (ancestors.length === 0) {
-    return null;
-  } // Slice the array because babel-types traverse may continue mutating
-  // the ancestors array in later traversal logic.
-
-
-  return new SimplePath(ancestors.slice());
-}
-
-/**
- * Mimics @babel/traverse's NodePath API in a simpler fashion that isn't as
- * heavy, but still allows the ease of passing paths around to process nested
- * AST structures.
- */
-class SimplePath {
-  constructor(ancestors, index = ancestors.length - 1) {
-    if (index < 0 || index >= ancestors.length) {
-      console.error(ancestors);
-      throw new Error("Created invalid path");
-    }
-
-    this._ancestors = ancestors;
-    this._ancestor = ancestors[index];
-    this._index = index;
-  }
-
-  get parentPath() {
-    let path = this._parentPath;
-
-    if (path === undefined) {
-      if (this._index === 0) {
-        path = null;
-      } else {
-        path = new SimplePath(this._ancestors, this._index - 1);
-      }
-
-      this._parentPath = path;
-    }
-
-    return path;
-  }
-
-  get parent() {
-    return this._ancestor.node;
-  }
-
-  get node() {
-    const {
-      node,
-      key,
-      index
-    } = this._ancestor;
-
-    if (typeof index === "number") {
-      return node[key][index];
-    }
-
-    return node[key];
-  }
-
-  set node(replacement) {
-    if (this.type !== "Identifier") {
-      throw new Error("Replacing anything other than leaf nodes is undefined behavior " + "in t.traverse()");
-    }
-
-    const {
-      node,
-      key,
-      index
-    } = this._ancestor;
-
-    if (typeof index === "number") {
-      node[key][index] = replacement;
-    } else {
-      node[key] = replacement;
-    }
-  }
-
-  get type() {
-    return this.node.type;
-  }
-
-  get inList() {
-    return typeof this._ancestor.index === "number";
-  }
-
-  get containerIndex() {
-    const {
-      index
-    } = this._ancestor;
-
-    if (typeof index !== "number") {
-      throw new Error("Cannot get index of non-array node");
-    }
-
-    return index;
-  }
-
-  get depth() {
-    return this._index;
-  }
-
-  replace(node) {
-    this.node = node;
-  }
-
-  find(predicate) {
-    for (let path = this; path; path = path.parentPath) {
-      if (predicate(path)) {
-        return path;
-      }
-    }
-
-    return null;
-  }
-
-  findParent(predicate) {
-    if (!this.parentPath) {
-      throw new Error("Cannot use findParent on root path");
-    }
-
-    return this.parentPath.find(predicate);
-  }
-
-  getSibling(offset) {
-    const {
-      node,
-      key,
-      index
-    } = this._ancestor;
-
-    if (typeof index !== "number") {
-      throw new Error("Non-array nodes do not have siblings");
-    }
-
-    const container = node[key];
-    const siblingIndex = index + offset;
-
-    if (siblingIndex < 0 || siblingIndex >= container.length) {
-      return null;
-    }
-
-    return new SimplePath(this._ancestors.slice(0, -1).concat([{
-      node,
-      key,
-      index: siblingIndex
-    }]));
-  }
-
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/validate.js
+++ /dev/null
@@ -1,20 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.hasSyntaxError = hasSyntaxError;
-
-var _ast = require("./utils/ast");
-
-/* 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 hasSyntaxError(input) {
-  try {
-    (0, _ast.parseScript)(input);
-    return false;
-  } catch (e) {
-    return `${e.name} : ${e.message}`;
-  }
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/parser/worker.js
+++ /dev/null
@@ -1,54 +0,0 @@
-"use strict";
-
-var _getSymbols = require("./getSymbols");
-
-var _ast = require("./utils/ast");
-
-var _getScopes = require("./getScopes/index");
-
-var _getScopes2 = _interopRequireDefault(_getScopes);
-
-var _sources = require("./sources");
-
-var _findOutOfScopeLocations = require("./findOutOfScopeLocations");
-
-var _findOutOfScopeLocations2 = _interopRequireDefault(_findOutOfScopeLocations);
-
-var _steps = require("./steps");
-
-var _validate = require("./validate");
-
-var _frameworks = require("./frameworks");
-
-var _pausePoints = require("./pausePoints");
-
-var _mapExpression = require("./mapExpression");
-
-var _mapExpression2 = _interopRequireDefault(_mapExpression);
-
-var _devtoolsUtils = require("devtools/client/debugger/new/dist/vendors").vendored["devtools-utils"];
-
-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 {
-  workerHandler
-} = _devtoolsUtils.workerUtils;
-self.onmessage = workerHandler({
-  findOutOfScopeLocations: _findOutOfScopeLocations2.default,
-  getSymbols: _getSymbols.getSymbols,
-  getScopes: _getScopes2.default,
-  clearSymbols: _getSymbols.clearSymbols,
-  clearScopes: _getScopes.clearScopes,
-  clearASTs: _ast.clearASTs,
-  hasSource: _sources.hasSource,
-  setSource: _sources.setSource,
-  clearSources: _sources.clearSources,
-  getNextStep: _steps.getNextStep,
-  hasSyntaxError: _validate.hasSyntaxError,
-  getFramework: _frameworks.getFramework,
-  getPausePoints: _pausePoints.getPausePoints,
-  mapExpression: _mapExpression2.default
-});
\ No newline at end of file
--- a/devtools/client/debugger/new/src/workers/pretty-print/moz.build
+++ b/devtools/client/debugger/new/src/workers/pretty-print/moz.build
@@ -4,10 +4,9 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DIRS += [
 
 ]
 
 DevToolsModules(
     'index.js',
-    'worker.js',
 )
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/pretty-print/worker.js
+++ /dev/null
@@ -1,57 +0,0 @@
-"use strict";
-
-var _prettyFast = require("pretty-fast/index");
-
-var _prettyFast2 = _interopRequireDefault(_prettyFast);
-
-var _devtoolsUtils = require("devtools/client/debugger/new/dist/vendors").vendored["devtools-utils"];
-
-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 {
-  workerHandler
-} = _devtoolsUtils.workerUtils;
-
-function prettyPrint({
-  url,
-  indent,
-  sourceText
-}) {
-  const prettified = (0, _prettyFast2.default)(sourceText, {
-    url: url,
-    indent: " ".repeat(indent)
-  });
-  return {
-    code: prettified.code,
-    mappings: invertMappings(prettified.map._mappings)
-  };
-}
-
-function invertMappings(mappings) {
-  return mappings._array.map(m => {
-    const mapping = {
-      generated: {
-        line: m.originalLine,
-        column: m.originalColumn
-      }
-    };
-
-    if (m.source) {
-      mapping.source = m.source;
-      mapping.original = {
-        line: m.generatedLine,
-        column: m.generatedColumn
-      };
-      mapping.name = m.name;
-    }
-
-    return mapping;
-  });
-}
-
-self.onmessage = workerHandler({
-  prettyPrint
-});
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/search/get-matches.js
+++ /dev/null
@@ -1,41 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = getMatches;
-
-var _buildQuery = require("./build-query");
-
-var _buildQuery2 = _interopRequireDefault(_buildQuery);
-
-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/>. */
-function getMatches(query, text, modifiers) {
-  if (!query || !text || !modifiers) {
-    return [];
-  }
-
-  const regexQuery = (0, _buildQuery2.default)(query, modifiers, {
-    isGlobal: true
-  });
-  const matchedLocations = [];
-  const lines = text.split("\n");
-
-  for (let i = 0; i < lines.length; i++) {
-    let singleMatch;
-    const line = lines[i];
-
-    while ((singleMatch = regexQuery.exec(line)) !== null) {
-      matchedLocations.push({
-        line: i,
-        ch: singleMatch.index
-      });
-    }
-  }
-
-  return matchedLocations;
-}
\ No newline at end of file
--- a/devtools/client/debugger/new/src/workers/search/moz.build
+++ b/devtools/client/debugger/new/src/workers/search/moz.build
@@ -3,14 +3,10 @@
 # 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/.
 
 DIRS += [
 
 ]
 
 DevToolsModules(
-    'build-query.js',
-    'get-matches.js',
     'index.js',
-    'project-search.js',
-    'worker.js',
 )
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/search/project-search.js
+++ /dev/null
@@ -1,43 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.findSourceMatches = findSourceMatches;
-
-/* 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/>. */
-// Maybe reuse file search's functions?
-function findSourceMatches(source, queryText) {
-  const {
-    id,
-    loadedState,
-    text
-  } = source;
-
-  if (loadedState != "loaded" || !text || queryText == "") {
-    return [];
-  }
-
-  const lines = text.split("\n");
-  let result = undefined;
-  const query = new RegExp(queryText, "g");
-  const matches = lines.map((_text, line) => {
-    const indices = [];
-
-    while (result = query.exec(_text)) {
-      indices.push({
-        sourceId: id,
-        line: line + 1,
-        column: result.index,
-        match: result[0],
-        value: _text,
-        text: result.input
-      });
-    }
-
-    return indices;
-  }).filter(_matches => _matches.length > 0);
-  return [].concat(...matches);
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/new/src/workers/search/worker.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-var _getMatches = require("./get-matches");
-
-var _getMatches2 = _interopRequireDefault(_getMatches);
-
-var _projectSearch = require("./project-search");
-
-var _devtoolsUtils = require("devtools/client/debugger/new/dist/vendors").vendored["devtools-utils"];
-
-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 {
-  workerHandler
-} = _devtoolsUtils.workerUtils;
-self.onmessage = workerHandler({
-  getMatches: _getMatches2.default,
-  findSourceMatches: _projectSearch.findSourceMatches
-});
\ No newline at end of file
--- a/devtools/client/debugger/new/test/mochitest/browser.ini
+++ b/devtools/client/debugger/new/test/mochitest/browser.ini
@@ -6,16 +6,24 @@ support-files =
   head.js
   helpers.js
   !/devtools/client/commandline/test/helpers.js
   !/devtools/client/shared/test/shared-head.js
   !/devtools/client/shared/test/telemetry-test-helpers.js
   examples/sourcemapped/polyfill-bundle.js
   examples/sourcemapped/fixtures/typescript-classes/output.js
   examples/sourcemapped/fixtures/typescript-classes/output.js.map
+  examples/sourcemapped/fixtures/rollup-babel-classes/output.js
+  examples/sourcemapped/fixtures/rollup-babel-classes/output.js.map
+  examples/sourcemapped/fixtures/rollup-babel-lex-and-nonlex/output.js
+  examples/sourcemapped/fixtures/rollup-babel-lex-and-nonlex/output.js.map
+  examples/sourcemapped/fixtures/rollup-babel-modules/output.js
+  examples/sourcemapped/fixtures/rollup-babel-modules/output.js.map
+  examples/sourcemapped/fixtures/rollup-modules/output.js
+  examples/sourcemapped/fixtures/rollup-modules/output.js.map
   examples/sourcemapped/fixtures/babel-bindings-with-flow/output.js
   examples/sourcemapped/fixtures/babel-bindings-with-flow/output.js.map
   examples/sourcemapped/fixtures/babel-eval-maps/output.js
   examples/sourcemapped/fixtures/babel-eval-maps/output.js.map
   examples/sourcemapped/fixtures/babel-for-of/output.js
   examples/sourcemapped/fixtures/babel-for-of/output.js.map
   examples/sourcemapped/fixtures/babel-line-start-bindings-es6/output.js
   examples/sourcemapped/fixtures/babel-line-start-bindings-es6/output.js.map
@@ -85,17 +93,18 @@ support-files =
   examples/sourcemaps3/test.js
   examples/sourcemaps-reload/v1.bundle.js
   examples/sourcemaps-reload/v1.bundle.js.map
   examples/sourcemaps-reload/v2.bundle.js
   examples/sourcemaps-reload/v2.bundle.js.map
   examples/sourcemaps-reload/v3.bundle.js
   examples/sourcemaps-reload/v3.bundle.js.map
   examples/sourcemaps-reload/doc-sourcemaps-reload.html
-  examples/sourcemaps-reload/sjs_code_reload.sjs
+  examples/sourcemaps-reload/doc-sourcemaps-reload2.html
+  examples/sourcemaps-reload/doc-sourcemaps-reload3.html
   examples/wasm-sourcemaps/fib.c
   examples/wasm-sourcemaps/fib.wasm
   examples/wasm-sourcemaps/fib.wasm.map
   examples/wasm-sourcemaps/utils.js
   examples/sum/sum.js
   examples/sum/sum.min.js
   examples/sum/sum.min.js.map
   examples/big-sourcemap_files/bundle.js
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-pause-points.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-pause-points.js
@@ -6,55 +6,54 @@ requestLongerTimeout(2);
 async function stepOvers(dbg, count, onStep = () => {}) {
   let i = 0;
   while (i++ <= count) {
     await dbg.actions.stepOver();
     await waitForPaused(dbg);
     onStep(dbg.getState());
   }
 }
+function formatSteps(steps) {
+  return steps.map(loc => `(${loc.join(",")})`).join(", ")
+}
 
 async function testCase(dbg, { name, count, steps }) {
   invokeInTab(name);
   let locations = [];
 
   await stepOvers(dbg, count, state => {
-    locations.push(dbg.selectors.getTopFrame(state).location);
+    const {line, column} = dbg.selectors.getTopFrame(state).location
+    locations.push([line, column]);
   });
 
-  const formattedSteps = locations
-    .map(({ line, column }) => `(${line},${column})`)
-    .join(", ");
-
-  is(formattedSteps, steps, name);
-
+  is(formatSteps(locations), formatSteps(steps), name);
   await resume(dbg);
 }
 
 add_task(async function test() {
   const dbg = await initDebugger("doc-pause-points.html");
 
   await selectSource(dbg, "pause-points.js")
   await testCase(dbg, {
     name: "statements",
     count: 7,
-    steps: "(9,2), (10,4), (10,13), (11,2), (11,21), (12,2), (12,12), (13,0)"
+    steps: [[9,2], [10,4], [10,13], [11,2], [11,21], [12,2], [12,12], [13,0]]
   });
 
   await testCase(dbg, {
     name: "expressions",
     count: 4,
-    steps: "(40,2), (41,2), (41,8), (42,8), (43,0)"
+    steps: [[40,2], [41,2], [41,8], [42,8], [43,0]]
   });
 
   await testCase(dbg, {
     name: "sequences",
     count: 4,
-    steps: "(23,2), (25,8), (29,8), (34,2), (37,0)"
+    steps: [[23,2], [25,8], [31,4], [34,2], [37,0]]
   });
 
   await testCase(dbg, {
     name: "flow",
     count: 8,
     steps:
-      "(16,2), (17,12), (18,6), (19,8), (19,17), (19,8), (19,17), (19,8), (20,0)"
+      [[16,2], [17,12], [18,6], [19,8], [19,17], [19,8], [19,17], [19,8], [20,0]]
   });
 });
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-returnvalues.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-returnvalues.js
@@ -5,17 +5,17 @@ function getLabel(dbg, index) {
 function getValue(dbg, index) {
   return findElement(dbg, "scopeValue", index).innerText;
 }
 
 async function testReturnValue(dbg, val) {
   invokeInTab("return_something", val);
   await waitForPaused(dbg);
 
-  // "Step in" 3 times to get to the point where the debugger can
+  // "Step in" 2 times to get to the point where the debugger can
   // see the return value.
   await stepIn(dbg);
   await stepIn(dbg);
 
   is(getLabel(dbg, 1), "return_something", "check for return_something");
 
   // We don't show "undefined" but we do show other falsy values.
   let label = getLabel(dbg, 2);
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemapped-scopes.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemapped-scopes.js
@@ -185,16 +185,42 @@ add_task(async function() {
     "Function Body",
     "Another()",
     ["one", "1"],
     "Thing()",
     "Module",
     "root()"
   ]);
 
+  await breakpointScopes(dbg, "rollup-babel-classes", { line: 6, column: 6 }, [
+    "Class",
+    "Thing()",
+    "Function Body",
+    "Another()",
+    "one",
+    "Thing()",
+    "Module",
+    "root()"
+  ]);
+
+  await breakpointScopes(dbg, "rollup-babel-classes", { line: 16, column: 6 }, [
+    "Function Body",
+    // Rollup removes these as dead code, so they are marked as optimized out.
+    ["three", "(optimized away)"],
+    ["two", "(optimized away)"],
+    "Class",
+    "Another()",
+    "Function Body",
+    "Another()",
+    ["one", "1"],
+    "Thing()",
+    "Module",
+    "root()"
+  ]);
+
   await breakpointScopes(dbg, "babel-for-loops", { line: 5, column: 4 }, [
     "For",
     ["i", "1"],
     "Function Body",
     ["i", "0"],
     "Module",
     "root()"
   ]);
@@ -325,16 +351,86 @@ add_task(async function() {
     "Function Body",
     "Thing()",
     "root",
     "someHelper()",
     "Module",
     "root()"
   ]);
 
+  await breakpointScopes(dbg, "rollup-babel-lex-and-nonlex", { line: 3, column: 4 }, [
+    "Function Body",
+    "Thing()",
+    "root",
+    "someHelper()",
+    "Module",
+    "root()"
+  ]);
+
+  await breakpointScopes(
+    dbg,
+    "rollup-babel-modules",
+    { line: 20, column: 2 },
+    [
+      // This test currently bails out because Babel does not map function calls
+      // fully and includes the () of the call in the range of the identifier.
+      // this means that Rollup, has to map locations for calls to imports,
+      // it can fail. This will be addressed in Babel eventually.
+      "root",
+      ["<this>", "Window"],
+      ["arguments", "Arguments"],
+      "rollupBabelModules",
+      ["aDefault", '"a-default"'],
+      ["aDefault2", '"a-default2"'],
+      ["aDefault3", '"a-default3"'],
+      ["aNamed", '"a-named"'],
+      ["aNamed$1", '(optimized away)'],
+      ["aNamed$2", '(optimized away)'],
+      ["aNamed2", '"a-named2"'],
+      ["aNamed3", '"a-named3"'],
+      ["aNamespace", "{\u2026}"],
+      ["aNamespace3", "{\u2026}"],
+      ["arguments", "(unavailable)"],
+      ["mod12", "(optimized away)"],
+      ["mod4", "(optimized away)"],
+      ["optimizedOut", "(optimized away)"],
+      ["original", '"an-original"'],
+      ["original$1", '"an-original2"'],
+      ["original$2", '"an-original3"'],
+      "root()"
+    ]
+  );
+
+  await breakpointScopes(
+    dbg,
+    "rollup-modules",
+    { line: 20, column: 0 },
+    [
+      "Module",
+      ["aDefault", '"a-default"'],
+      ["aDefault2", '"a-default2"'],
+      ["aDefault3", '"a-default3"'],
+      ["anAliased", '"an-original"'],
+      ["anAliased2", '"an-original2"'],
+      ["anAliased3", '"an-original3"'],
+      ["aNamed", '"a-named"'],
+      ["aNamed2", '"a-named2"'],
+      ["aNamed3", '"a-named3"'],
+      ["aNamespace", "{\u2026}"],
+      // ["aNamespace2", "{\u2026}"],
+      ["aNamespace3", "{\u2026}"],
+      ["anotherNamed", '"a-named"'],
+      ["anotherNamed2", '"a-named2"'],
+      ["anotherNamed3", '"a-named3"'],
+      ["example", "(optimized away)"],
+      ["optimizedOut", "(optimized away)"],
+      "root()"
+    ]
+  );
+
   await breakpointScopes(
     dbg,
     "babel-modules-webpack",
     { line: 20, column: 2 },
     [
       "Module",
       ["aDefault", '"a-default"'],
       ["aDefault2", '"a-default2"'],
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-reload.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-reload.js
@@ -20,40 +20,36 @@ async function waitForBreakpoint(dbg, lo
 function getBreakpoints(dbg) {
   const breakpoints = dbg.selectors.getBreakpoints(dbg.getState());
   return breakpoints.valueSeq().toJS();
 }
 
 add_task(async function() {
   const dbg = await initDebugger("doc-minified.html");
 
-  dump(`>> meh`);
-
-  await navigate(dbg, "sourcemaps-reload/doc-sourcemaps-reload.html", "v1");
+  await navigate(dbg, "sourcemaps-reload/doc-sourcemaps-reload.html", "v1.js");
 
-  dump(`>> select v1`);
-  await selectSource(dbg, "v1");
-  await addBreakpoint(dbg, "v1", 6);
+  await selectSource(dbg, "v1.js");
+  await addBreakpoint(dbg, "v1.js", 6);
+
   let breakpoint = getBreakpoints(dbg)[0];
   is(breakpoint.location.line, 6);
 
   let syncBp = waitForDispatch(dbg, "SYNC_BREAKPOINT");
-  await reload(dbg);
+  await navigate(dbg, "doc-sourcemaps-reload2.html", "v1.js");
 
-  await waitForPaused(dbg);
   await syncBp;
-  assertDebugLine(dbg, 72);
   breakpoint = getBreakpoints(dbg)[0];
 
   is(breakpoint.location.line, 9);
   is(breakpoint.generatedLocation.line, 73);
 
-  await resume(dbg);
+  await addBreakpoint(dbg, "v1.js", 13);
+
+  // NOTE: When we reload, the `foo` function and the
+  // module is no longer 13 lines long
   syncBp = waitForDispatch(dbg, "SYNC_BREAKPOINT", 2);
-  await selectSource(dbg, "v1");
-  await addBreakpoint(dbg, "v1", 13);
-
-  await reload(dbg);
+  await navigate(dbg, "doc-sourcemaps-reload3.html", "v1.js");
   await waitForSource(dbg, "v1");
   await syncBp;
 
   is(getBreakpoints(dbg).length, 0, "No breakpoints");
 });
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-stepping.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-stepping.js
@@ -19,11 +19,11 @@ add_task(async function test() {
   await stepIn(dbg);
   await stepIn(dbg);
   await stepIn(dbg);
   await stepIn(dbg);
   await stepIn(dbg);
   await stepIn(dbg);
   await stepIn(dbg);
 
-  assertDebugLine(dbg, 42309);
+  assertDebugLine(dbg, 42308);
   assertPausedLocation(dbg);
 });
--- a/devtools/client/debugger/new/test/mochitest/examples/doc-sourcemapped.html
+++ b/devtools/client/debugger/new/test/mochitest/examples/doc-sourcemapped.html
@@ -5,17 +5,17 @@
 <html>
   <head>
     <meta charset="UTF-8">
     <script src="sourcemapped/polyfill-bundle.js"></script>
   </head>
   <body>
     <!-- INJECTED-START -->
     <!--
-      Content generated by examples/sourcemapped/webpack.config.js.
+      Content generated by examples/sourcemapped/build.js.
       Run "yarn build" to update.
     -->
     <script src="sourcemapped/fixtures/babel-bindings-with-flow/output.js"></script>
     <button onclick="babelBindingsWithFlow()">Run babel-bindings-with-flow</button>
     <script src="sourcemapped/fixtures/babel-classes/output.js"></script>
     <button onclick="babelClasses()">Run babel-classes</button>
     <script src="sourcemapped/fixtures/babel-commonjs/output.js"></script>
     <button onclick="babelCommonjs()">Run babel-commonjs</button>
@@ -60,16 +60,24 @@
     <script src="sourcemapped/fixtures/babel-this-arguments-bindings/output.js"></script>
     <button onclick="babelThisArgumentsBindings()">Run babel-this-arguments-bindings</button>
     <script src="sourcemapped/fixtures/babel-try-catches/output.js"></script>
     <button onclick="babelTryCatches()">Run babel-try-catches</button>
     <script src="sourcemapped/fixtures/babel-type-module/output.js"></script>
     <button onclick="babelTypeModule()">Run babel-type-module</button>
     <script src="sourcemapped/fixtures/babel-type-script/output.js"></script>
     <button onclick="babelTypeScript()">Run babel-type-script</button>
+    <script src="sourcemapped/fixtures/rollup-babel-classes/output.js"></script>
+    <button onclick="rollupBabelClasses()">Run rollup-babel-classes</button>
+    <script src="sourcemapped/fixtures/rollup-babel-lex-and-nonlex/output.js"></script>
+    <button onclick="rollupBabelLexAndNonlex()">Run rollup-babel-lex-and-nonlex</button>
+    <script src="sourcemapped/fixtures/rollup-babel-modules/output.js"></script>
+    <button onclick="rollupBabelModules()">Run rollup-babel-modules</button>
+    <script src="sourcemapped/fixtures/rollup-modules/output.js"></script>
+    <button onclick="rollupModules()">Run rollup-modules</button>
     <script src="sourcemapped/fixtures/typescript-classes/output.js"></script>
     <button onclick="typescriptClasses()">Run typescript-classes</button>
     <script src="sourcemapped/fixtures/webpack-functions/output.js"></script>
     <button onclick="webpackFunctions()">Run webpack-functions</button>
     <script src="sourcemapped/fixtures/webpack-line-mappings/output.js"></script>
     <button onclick="webpackLineMappings()">Run webpack-line-mappings</button>
     <!-- INJECTED-END -->
   </body>
new file mode 100755
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/build.js
@@ -0,0 +1,150 @@
+#!env node
+
+const fs = require("fs");
+const path = require("path");
+const _ = require("lodash");
+const rollup = require("rollup");
+const rollupBabel = require("rollup-plugin-babel");
+const webpack = require("webpack");
+
+const fixtures = path.join(__dirname, "fixtures");
+
+const tests = fs.readdirSync(fixtures).map(name => {
+  if (name[0] === ".") return;
+
+  const dirname = path.relative(__dirname, path.join(fixtures, name));
+
+  const inputTS = path.join(dirname, "input.ts");
+  const inputJS = path.join(dirname, "input.js");
+
+  return {
+    name,
+    camelName: _.camelCase(name),
+    dirname,
+    input: `./${fs.existsSync(inputTS) ? inputTS : inputJS}`,
+    output: path.join(dirname, "output.js")
+  };
+}).filter(Boolean);
+
+const html = path.join(__dirname, "..", "doc-sourcemapped.html");
+
+fs.writeFileSync(
+  html,
+  fs.readFileSync(html, "utf8").replace(
+    /\n\s*<!-- INJECTED-START[\s\S]*INJECTED-END -->\n/,
+    `
+    <!-- INJECTED-START -->
+    <!--
+      Content generated by examples/sourcemapped/build.js.
+      Run "yarn build" to update.
+    -->${tests
+      .map(
+        ({ name, camelName, output }) =>
+          `\n    <script src="${path.join("sourcemapped", output)}"></script>` +
+          `\n    <button onclick="${camelName}()">Run ${name}</button>`
+      )
+      .join("")}
+    <!-- INJECTED-END -->
+`
+  )
+);
+
+function runWebpack(config) {
+  webpack(config, (err, res) => {
+    if (err) throw err;
+
+    console.log(res.toString());
+  });
+}
+
+runWebpack({
+  context: __dirname,
+  entry: "babel-polyfill",
+  output: {
+    filename: "polyfill-bundle.js"
+  }
+});
+
+for (const { name, camelName, dirname, input, output } of tests) {
+  const rollupBuildEnabled = name.match(/rollup-/);
+  const babelEnabled = name.match(/babel-/);
+  const babelEnv = !name.match(/-es6/);
+  const babelModules = name.match(/-cjs/);
+  const evalMaps = name.match(/-eval/);
+
+  if (!babelEnabled && babelModules) {
+    throw new Error(
+      "Babel is not enabled, compiling to CommonJS is not possible in " + name
+    );
+  }
+
+  const babelOptions = babelEnabled && {
+    babelrc: false,
+    presets: babelEnv
+      ? [["env", { modules: babelModules ? "commonjs" : false }]]
+      : [],
+    plugins: [
+      "babel-plugin-transform-flow-strip-types",
+    ]
+  };
+
+  if (rollupBuildEnabled) {
+    (async function() {
+      const bundle = await rollup.rollup({
+        input: "fake-bundle-root",
+        plugins: [
+          // Our input file may export more than the default, but we
+          // want to enable 'exports: "default",' so we need the root
+          // import to only have a default export.
+          {
+            resolveId: id => id === "fake-bundle-root" ? id : undefined,
+            load: id => id === "fake-bundle-root"
+              ? `import test from "${path.join(__dirname, input)}"; export default test;`
+              : undefined,
+          },
+          babelOptions && rollupBabel(babelOptions)
+        ].filter(Boolean),
+      });
+
+      await bundle.write({
+        file: output,
+        dir: dirname,
+        format: "iife",
+        name: camelName,
+        sourcemap: true,
+        exports: "default",
+      });
+    })();
+    continue;
+  }
+
+  runWebpack({
+    context: __dirname,
+    entry: input,
+    output: {
+      path: __dirname,
+      filename: output,
+
+      libraryTarget: "var",
+      library: camelName,
+      libraryExport: "default"
+    },
+    devtool: evalMaps ? "eval-source-map" : "source-map",
+    module: {
+      loaders: [
+        babelOptions && {
+          test: /\.js$/,
+          exclude: /node_modules/,
+          loader: "babel-loader",
+          options: babelOptions,
+        },
+        {
+          test: /\.tsx?$/,
+          exclude: /node_modules/,
+          loader: "ts-loader",
+          options: {}
+        }
+      ].filter(Boolean)
+    }
+  });
+}
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-classes/input.js
@@ -0,0 +1,22 @@
+export default function root() {
+  let one = 1;
+
+  class Thing {
+    one() {
+      console.log("pause here");
+    }
+  }
+
+  class Another {
+    method() {
+      let two = 2;
+
+      const three = 3;
+
+      console.log("pause here", Another, one, Thing, root);
+    }
+  }
+
+  new Another().method();
+  new Thing().one();
+}
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-classes/output.js
@@ -0,0 +1,49 @@
+var rollupBabelClasses = (function () {
+  'use strict';
+
+  var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+  function root() {
+    var one = 1;
+
+    var Thing = function () {
+      function Thing() {
+        _classCallCheck(this, Thing);
+      }
+
+      _createClass(Thing, [{
+        key: "one",
+        value: function one() {
+          console.log("pause here");
+        }
+      }]);
+
+      return Thing;
+    }();
+
+    var Another = function () {
+      function Another() {
+        _classCallCheck(this, Another);
+      }
+
+      _createClass(Another, [{
+        key: "method",
+        value: function method() {
+
+          console.log("pause here", Another, one, Thing, root);
+        }
+      }]);
+
+      return Another;
+    }();
+
+    new Another().method();
+    new Thing().one();
+  }
+
+  return root;
+
+}());
+//# sourceMappingURL=output.js.map
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-classes/output.js.map
@@ -0,0 +1,1 @@
+{"version":3,"file":"output.js","sources":["input.js"],"sourcesContent":["export default function root() {\n  let one = 1;\n\n  class Thing {\n    one() {\n      console.log(\"pause here\");\n    }\n  }\n\n  class Another {\n    method() {\n      let two = 2;\n\n      const three = 3;\n\n      console.log(\"pause here\", Another, one, Thing, root);\n    }\n  }\n\n  new Another().method();\n  new Thing().one();\n}\n"],"names":["root","one","Thing","console","log","Another","method"],"mappings":";;;;;;;AAAA,EAAe,SAASA,IAAT,GAAgB;EAC7B,MAAIC,MAAM,CAAV;;EAD6B,MAGvBC,KAHuB;EAAA;EAAA;EAAA;;EAAA;EAAA;EAAA,4BAIrB;EACJC,gBAAQC,GAAR,CAAY,YAAZ;EACD;EAN0B;;EAAA;EAAA;;EAAA,MASvBC,OATuB;EAAA;EAAA;EAAA;;EAAA;EAAA;EAAA,+BAUlB;AACP;EAIAF,gBAAQC,GAAR,CAAY,YAAZ,EAA0BC,OAA1B,EAAmCJ,GAAnC,EAAwCC,KAAxC,EAA+CF,IAA/C;EACD;EAhB0B;;EAAA;EAAA;;EAmB7B,MAAIK,OAAJ,GAAcC,MAAd;EACA,MAAIJ,KAAJ,GAAYD,GAAZ;EACD;;;;;;;;"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-lex-and-nonlex/input.js
@@ -0,0 +1,9 @@
+export default function root() {
+  function someHelper(){
+    console.log("pause here", root, Thing);
+  }
+
+  class Thing {}
+
+  someHelper();
+}
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-lex-and-nonlex/output.js
@@ -0,0 +1,21 @@
+var rollupBabelLexAndNonlex = (function () {
+  'use strict';
+
+  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+  function root() {
+    function someHelper() {
+      console.log("pause here", root, Thing);
+    }
+
+    var Thing = function Thing() {
+      _classCallCheck(this, Thing);
+    };
+
+    someHelper();
+  }
+
+  return root;
+
+}());
+//# sourceMappingURL=output.js.map
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-lex-and-nonlex/output.js.map
@@ -0,0 +1,1 @@
+{"version":3,"file":"output.js","sources":["input.js"],"sourcesContent":["export default function root() {\n  function someHelper(){\n    console.log(\"pause here\", root, Thing);\n  }\n\n  class Thing {}\n\n  someHelper();\n}\n"],"names":["root","someHelper","console","log","Thing"],"mappings":";;;;;AAAA,EAAe,SAASA,IAAT,GAAgB;EAC7B,WAASC,UAAT,GAAqB;EACnBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B,EAAgCI,KAAhC;EACD;;EAH4B,MAKvBA,KALuB;EAAA;EAAA;;EAO7BH;EACD;;;;;;;;"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/input.js
@@ -0,0 +1,48 @@
+import aDefault from "./src/mod1";
+import { aNamed, aNamed as anotherNamed } from "./src/mod2";
+import { original as anAliased } from "./src/mod3";
+import * as aNamespace from "./src/mod4";
+
+import aDefault2 from "./src/mod5";
+import { aNamed2, aNamed2 as anotherNamed2 } from "./src/mod6";
+import { original as anAliased2 } from "./src/mod7";
+// import * as aNamespace2 from "./src/mod8";
+
+import aDefault3 from "./src/mod9";
+import { aNamed3, aNamed3 as anotherNamed3 } from "./src/mod10";
+import { original as anAliased3 } from "./src/mod11";
+import * as aNamespace3 from "./src/mod12";
+
+import optimizedOut from "./src/optimized-out";
+optimizedOut();
+
+export default function root() {
+  console.log("pause here", root);
+
+  console.log(aDefault);
+  console.log(anAliased);
+  console.log(aNamed);
+  console.log(anotherNamed);
+  console.log(aNamespace);
+
+  try {
+    // None of these are callable in this code, but we still want to make sure
+    // they map properly even if the only reference is in a call expressions.
+    console.log(aDefault2());
+    console.log(anAliased2());
+    console.log(aNamed2());
+    console.log(anotherNamed2());
+    // console.log(aNamespace2()); // Rollup does not allow calling namespaces.
+
+    console.log(new aDefault3());
+    console.log(new anAliased3());
+    console.log(new aNamed3());
+    console.log(new anotherNamed3());
+    console.log(new aNamespace3());
+  } catch (e) {}
+}
+
+export function example() {
+  // Stop rollup from optimizing this function out.
+  window.console;
+}
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/output.js
@@ -0,0 +1,75 @@
+var rollupBabelModules = (function () {
+  'use strict';
+
+  var aDefault = "a-default";
+
+  var aNamed = "a-named";
+
+  var original = "an-original";
+
+  var mod4 = "a-default";
+  var aNamed$1 = "a-named";
+
+  var aNamespace = /*#__PURE__*/Object.freeze({
+    default: mod4,
+    aNamed: aNamed$1
+  });
+
+  var aDefault2 = "a-default2";
+
+  var aNamed2 = "a-named2";
+
+  var original$1 = "an-original2";
+
+  var aDefault3 = "a-default3";
+
+  var aNamed3 = "a-named3";
+
+  var original$2 = "an-original3";
+
+  var mod12 = "a-default3";
+  var aNamed$2 = "a-named3";
+
+  var aNamespace3 = /*#__PURE__*/Object.freeze({
+    default: mod12,
+    aNamed: aNamed$2
+  });
+
+  function optimizedOut() {
+    // Include enough logic to make Rollup not optimize the function out,
+    // since we want to test the _engine_'s logic for optimizing it out.
+    window.console;
+  }
+
+  optimizedOut();
+
+  function root() {
+    console.log("pause here", root);
+
+    console.log(aDefault);
+    console.log(original);
+    console.log(aNamed);
+    console.log(aNamed);
+    console.log(aNamespace);
+
+    try {
+      // None of these are callable in this code, but we still want to make sure
+      // they map properly even if the only reference is in a call expressions.
+      console.log(aDefault2());
+      console.log(original$1());
+      console.log(aNamed2());
+      console.log(aNamed2());
+      // console.log(aNamespace2()); // Rollup does not allow calling namespaces.
+
+      console.log(new aDefault3());
+      console.log(new original$2());
+      console.log(new aNamed3());
+      console.log(new aNamed3());
+      console.log(new aNamespace3());
+    } catch (e) {}
+  }
+
+  return root;
+
+}());
+//# sourceMappingURL=output.js.map
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/output.js.map
@@ -0,0 +1,1 @@
+{"version":3,"file":"output.js","sources":["src/mod1.js","src/mod2.js","src/mod3.js","src/mod4.js","src/mod5.js","src/mod6.js","src/mod7.js","src/mod9.js","src/mod10.js","src/mod11.js","src/mod12.js","src/optimized-out.js","input.js"],"sourcesContent":["export default \"a-default\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","export default \"a-default3\";\nexport const aNamed = \"a-named3\";\n","export default function optimizedOut() {\n  // Include enough logic to make Rollup not optimize the function out,\n  // since we want to test the _engine_'s logic for optimizing it out.\n  window.console;\n}\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n// import * as aNamespace2 from \"./src/mod8\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\nimport * as aNamespace3 from \"./src/mod12\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n  console.log(\"pause here\", root);\n\n  console.log(aDefault);\n  console.log(anAliased);\n  console.log(aNamed);\n  console.log(anotherNamed);\n  console.log(aNamespace);\n\n  try {\n    // None of these are callable in this code, but we still want to make sure\n    // they map properly even if the only reference is in a call expressions.\n    console.log(aDefault2());\n    console.log(anAliased2());\n    console.log(aNamed2());\n    console.log(anotherNamed2());\n    // console.log(aNamespace2()); // Rollup does not allow calling namespaces.\n\n    console.log(new aDefault3());\n    console.log(new anAliased3());\n    console.log(new aNamed3());\n    console.log(new anotherNamed3());\n    console.log(new aNamespace3());\n  } catch (e) {}\n}\n\nexport function example() {\n  // Stop rollup from optimizing this function out.\n  window.console;\n}\n"],"names":["aNamed","original","aNamed2","aNamed3","optimizedOut","window","console","root","log","aDefault","anAliased","anotherNamed","aNamespace","aDefault2","anAliased2","anotherNamed2","aDefault3","anAliased3","anotherNamed3","aNamespace3","e"],"mappings":";;;AAAA,iBAAe,WAAf;;ECAO,IAAMA,SAAS,SAAf;;ECAA,IAAMC,WAAW,aAAjB;;ACAP,aAAe,WAAf;AACA,EAAO,IAAMD,WAAS,SAAf;;;;;;;ACDP,kBAAe,YAAf;;ECAO,IAAME,UAAU,UAAhB;;ECAA,IAAMD,aAAW,cAAjB;;ACAP,kBAAe,YAAf;;ECAO,IAAME,UAAU,UAAhB;;ECAA,IAAMF,aAAW,cAAjB;;ACAP,cAAe,YAAf;AACA,EAAO,IAAMD,WAAS,UAAf;;;;;;;ECDQ,SAASI,YAAT,GAAwB;EACrC;EACA;EACAC,SAAOC,OAAP;EACD;;ECYDF;;AAEA,EAAe,SAASG,IAAT,GAAgB;EAC7BD,UAAQE,GAAR,CAAY,YAAZ,EAA0BD,IAA1B;;EAEAD,UAAQE,GAAR,CAAYC,QAAZ;EACAH,UAAQE,GAAR,CAAYE,QAAZ;EACAJ,UAAQE,GAAR,CAAYR,MAAZ;EACAM,UAAQE,GAAR,CAAYG,MAAZ;EACAL,UAAQE,GAAR,CAAYI,UAAZ;;EAEA,MAAI;EACF;EACA;EACAN,YAAQE,GAAR,CAAYK,WAAZ;EACAP,YAAQE,GAAR,CAAYM,YAAZ;EACAR,YAAQE,GAAR,CAAYN,SAAZ;EACAI,YAAQE,GAAR,CAAYO,SAAZ;EACA;;EAEAT,YAAQE,GAAR,CAAY,IAAIQ,SAAJ,EAAZ;EACAV,YAAQE,GAAR,CAAY,IAAIS,UAAJ,EAAZ;EACAX,YAAQE,GAAR,CAAY,IAAIL,OAAJ,EAAZ;EACAG,YAAQE,GAAR,CAAY,IAAIU,OAAJ,EAAZ;EACAZ,YAAQE,GAAR,CAAY,IAAIW,WAAJ,EAAZ;EACD,GAdD,CAcE,OAAOC,CAAP,EAAU;EACb;;;;;;;;"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod1.js
@@ -0,0 +1,1 @@
+export default "a-default";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod10.js
@@ -0,0 +1,1 @@
+export const aNamed3 = "a-named3";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod11.js
@@ -0,0 +1,1 @@
+export const original = "an-original3";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod12.js
@@ -0,0 +1,2 @@
+export default "a-default3";
+export const aNamed = "a-named3";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod2.js
@@ -0,0 +1,1 @@
+export const aNamed = "a-named";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod3.js
@@ -0,0 +1,1 @@
+export const original = "an-original";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod4.js
@@ -0,0 +1,2 @@
+export default "a-default";
+export const aNamed = "a-named";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod5.js
@@ -0,0 +1,1 @@
+export default "a-default2";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod6.js
@@ -0,0 +1,1 @@
+export const aNamed2 = "a-named2";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod7.js
@@ -0,0 +1,1 @@
+export const original = "an-original2";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod8.js
@@ -0,0 +1,2 @@
+export default "a-default2";
+export const aNamed = "a-named2";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/mod9.js
@@ -0,0 +1,1 @@
+export default "a-default3";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-babel-modules/src/optimized-out.js
@@ -0,0 +1,5 @@
+export default function optimizedOut() {
+  // Include enough logic to make Rollup not optimize the function out,
+  // since we want to test the _engine_'s logic for optimizing it out.
+  window.console;
+}
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/input.js
@@ -0,0 +1,48 @@
+import aDefault from "./src/mod1";
+import { aNamed, aNamed as anotherNamed } from "./src/mod2";
+import { original as anAliased } from "./src/mod3";
+import * as aNamespace from "./src/mod4";
+
+import aDefault2 from "./src/mod5";
+import { aNamed2, aNamed2 as anotherNamed2 } from "./src/mod6";
+import { original as anAliased2 } from "./src/mod7";
+// import * as aNamespace2 from "./src/mod8";
+
+import aDefault3 from "./src/mod9";
+import { aNamed3, aNamed3 as anotherNamed3 } from "./src/mod10";
+import { original as anAliased3 } from "./src/mod11";
+import * as aNamespace3 from "./src/mod12";
+
+import optimizedOut from "./src/optimized-out";
+optimizedOut();
+
+export default function root() {
+  console.log("pause here", root);
+
+  console.log(aDefault);
+  console.log(anAliased);
+  console.log(aNamed);
+  console.log(anotherNamed);
+  console.log(aNamespace);
+
+  try {
+    // None of these are callable in this code, but we still want to make sure
+    // they map properly even if the only reference is in a call expressions.
+    console.log(aDefault2());
+    console.log(anAliased2());
+    console.log(aNamed2());
+    console.log(anotherNamed2());
+    // console.log(aNamespace2()); // Rollup does not allow calling namespaces.
+
+    console.log(new aDefault3());
+    console.log(new anAliased3());
+    console.log(new aNamed3());
+    console.log(new anotherNamed3());
+    console.log(new aNamespace3());
+  } catch (e) {}
+}
+
+export function example() {
+  // Stop rollup from optimizing this function out.
+  window.console;
+}
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/output.js
@@ -0,0 +1,75 @@
+var rollupModules = (function () {
+  'use strict';
+
+  var aDefault = "a-default";
+
+  const aNamed = "a-named";
+
+  const original = "an-original";
+
+  var mod4 = "a-default";
+  const aNamed$1 = "a-named";
+
+  var aNamespace = /*#__PURE__*/Object.freeze({
+    default: mod4,
+    aNamed: aNamed$1
+  });
+
+  var aDefault2 = "a-default2";
+
+  const aNamed2 = "a-named2";
+
+  const original$1 = "an-original2";
+
+  var aDefault3 = "a-default3";
+
+  const aNamed3 = "a-named3";
+
+  const original$2 = "an-original3";
+
+  var mod12 = "a-default3";
+  const aNamed$2 = "a-named3";
+
+  var aNamespace3 = /*#__PURE__*/Object.freeze({
+    default: mod12,
+    aNamed: aNamed$2
+  });
+
+  function optimizedOut() {
+    // Include enough logic to make Rollup not optimize the function out,
+    // since we want to test the _engine_'s logic for optimizing it out.
+    window.console;
+  }
+
+  optimizedOut();
+
+  function root() {
+    console.log("pause here", root);
+
+    console.log(aDefault);
+    console.log(original);
+    console.log(aNamed);
+    console.log(aNamed);
+    console.log(aNamespace);
+
+    try {
+      // None of these are callable in this code, but we still want to make sure
+      // they map properly even if the only reference is in a call expressions.
+      console.log(aDefault2());
+      console.log(original$1());
+      console.log(aNamed2());
+      console.log(aNamed2());
+      // console.log(aNamespace2()); // Rollup does not allow calling namespaces.
+
+      console.log(new aDefault3());
+      console.log(new original$2());
+      console.log(new aNamed3());
+      console.log(new aNamed3());
+      console.log(new aNamespace3());
+    } catch (e) {}
+  }
+
+  return root;
+
+}());
+//# sourceMappingURL=output.js.map
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/output.js.map
@@ -0,0 +1,1 @@
+{"version":3,"file":"output.js","sources":["src/mod1.js","src/mod2.js","src/mod3.js","src/mod4.js","src/mod5.js","src/mod6.js","src/mod7.js","src/mod9.js","src/mod10.js","src/mod11.js","src/mod12.js","src/optimized-out.js","input.js"],"sourcesContent":["export default \"a-default\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","export default \"a-default3\";\nexport const aNamed = \"a-named3\";\n","export default function optimizedOut() {\n  // Include enough logic to make Rollup not optimize the function out,\n  // since we want to test the _engine_'s logic for optimizing it out.\n  window.console;\n}\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n// import * as aNamespace2 from \"./src/mod8\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\nimport * as aNamespace3 from \"./src/mod12\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n  console.log(\"pause here\", root);\n\n  console.log(aDefault);\n  console.log(anAliased);\n  console.log(aNamed);\n  console.log(anotherNamed);\n  console.log(aNamespace);\n\n  try {\n    // None of these are callable in this code, but we still want to make sure\n    // they map properly even if the only reference is in a call expressions.\n    console.log(aDefault2());\n    console.log(anAliased2());\n    console.log(aNamed2());\n    console.log(anotherNamed2());\n    // console.log(aNamespace2()); // Rollup does not allow calling namespaces.\n\n    console.log(new aDefault3());\n    console.log(new anAliased3());\n    console.log(new aNamed3());\n    console.log(new anotherNamed3());\n    console.log(new aNamespace3());\n  } catch (e) {}\n}\n\nexport function example() {\n  // Stop rollup from optimizing this function out.\n  window.console;\n}\n"],"names":["aNamed","original","anAliased","anotherNamed","anAliased2","anotherNamed2","anAliased3","anotherNamed3"],"mappings":";;;AAAA,iBAAe,WAAW,CAAC;;ECApB,MAAM,MAAM,GAAG,SAAS,CAAC;;ECAzB,MAAM,QAAQ,GAAG,aAAa,CAAC;;ACAtC,aAAe,WAAW,CAAC;AAC3B,EAAO,MAAMA,QAAM,GAAG,SAAS,CAAC;;;;;;;ACDhC,kBAAe,YAAY,CAAC;;ECArB,MAAM,OAAO,GAAG,UAAU,CAAC;;ECA3B,MAAMC,UAAQ,GAAG,cAAc,CAAC;;ACAvC,kBAAe,YAAY,CAAC;;ECArB,MAAM,OAAO,GAAG,UAAU,CAAC;;ECA3B,MAAMA,UAAQ,GAAG,cAAc,CAAC;;ACAvC,cAAe,YAAY,CAAC;AAC5B,EAAO,MAAMD,QAAM,GAAG,UAAU,CAAC;;;;;;;ECDlB,SAAS,YAAY,GAAG;EACvC;EACA;EACA,EAAE,MAAM,CAAC,OAAO,CAAC;EACjB,CAAC;;ECYD,YAAY,EAAE,CAAC;;AAEf,EAAe,SAAS,IAAI,GAAG;EAC/B,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;;EAElC,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;EACxB,EAAE,OAAO,CAAC,GAAG,CAACE,QAAS,CAAC,CAAC;EACzB,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;EACtB,EAAE,OAAO,CAAC,GAAG,CAACC,MAAY,CAAC,CAAC;EAC5B,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;;EAE1B,EAAE,IAAI;EACN;EACA;EACA,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;EAC7B,IAAI,OAAO,CAAC,GAAG,CAACC,UAAU,EAAE,CAAC,CAAC;EAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;EAC3B,IAAI,OAAO,CAAC,GAAG,CAACC,OAAa,EAAE,CAAC,CAAC;EACjC;;EAEA,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;EACjC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAIC,UAAU,EAAE,CAAC,CAAC;EAClC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;EAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,IAAIC,OAAa,EAAE,CAAC,CAAC;EACrC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;EACnC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE;EAChB,CAAC;;;;;;;;"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod1.js
@@ -0,0 +1,1 @@
+export default "a-default";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod10.js
@@ -0,0 +1,1 @@
+export const aNamed3 = "a-named3";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod11.js
@@ -0,0 +1,1 @@
+export const original = "an-original3";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod12.js
@@ -0,0 +1,2 @@
+export default "a-default3";
+export const aNamed = "a-named3";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod2.js
@@ -0,0 +1,1 @@
+export const aNamed = "a-named";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod3.js
@@ -0,0 +1,1 @@
+export const original = "an-original";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod4.js
@@ -0,0 +1,2 @@
+export default "a-default";
+export const aNamed = "a-named";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod5.js
@@ -0,0 +1,1 @@
+export default "a-default2";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod6.js
@@ -0,0 +1,1 @@
+export const aNamed2 = "a-named2";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod7.js
@@ -0,0 +1,1 @@
+export const original = "an-original2";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod8.js
@@ -0,0 +1,2 @@
+export default "a-default2";
+export const aNamed = "a-named2";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/mod9.js
@@ -0,0 +1,1 @@
+export default "a-default3";
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/rollup-modules/src/optimized-out.js
@@ -0,0 +1,5 @@
+export default function optimizedOut() {
+  // Include enough logic to make Rollup not optimize the function out,
+  // since we want to test the _engine_'s logic for optimizing it out.
+  window.console;
+}
--- a/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/typescript-classes/output.js.map
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/fixtures/typescript-classes/output.js.map
@@ -1,1 +1,1 @@
-{"version":3,"sources":["webpack:///webpack/bootstrap 0112384f4b82e20507d8","webpack:///./fixtures/typescript-classes/src/mod.ts","webpack:///./fixtures/typescript-classes/input.ts"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC5DA,0BAAiC,IAA0B;IACzD,OAAO,mBAAmB,MAAM;QAC9B,OAAY,MAAM,CAAC;IACrB,CAAC,CAAC;AACJ,CAAC;AAJD,4CAIC;AAED,iBAA+B,CAAC;AAAhC,yBAAgC;;;;;;;;;ACPhC,gFAAgF;AAChF,qCAAqC;;;;;;;;;;;;;;;;;;AAErC,sCAAqD;AAErD,gCAAmC;AAKnC;IAHA;QAIE,UAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IAFY,YAAY;QAHxB,yBAAgB,CAAC;YAChB,QAAQ,EAAE,UAAU;SACrB,CAAC;OACW,YAAY,CAExB;IAAD,mBAAC;CAAA;AAFY,oCAAY;AAIzB,IAAM,EAAE,GAAG,aAAG;IACZ,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC,CAAC;AACF,EAAE,CAAC,KAAK,CAAC,CAAC;AAEV,mEAAmE;AACnE,8DAA8D;AAC9D;IAAA;QACE,UAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IAAD,oBAAC;AAAD,CAAC;AAFY,sCAAa;AAI1B;IAAA;QACE,SAAI,GAAG,CAAC,CAAC;IACX,CAAC;IAAD,mBAAC;AAAD,CAAC;AAED,IAAM,eAAe;IAAG;QACtB,SAAI,GAAG,CAAC,CAAC;IACX,CAAC;IAAD,UAAC;AAAD,CAAC,IAAC;AAEF;IAAsB,2BAAY;IAAlC;QAAA,qEAEC;QADC,UAAI,GAAG,CAAC,CAAC;;IACX,CAAC;IAAD,cAAC;AAAD,CAAC,CAFqB,YAAY,GAEjC;AAED,IAAI,MAAM;IAAyB,2BAAY;IAAlC;QAAA,qEAEZ;QADC,UAAI,GAAG,CAAC,CAAC;;IACX,CAAC;IAAD,cAAC;AAAD,CAAC,CAFkC,YAAY,EAE9C,CAAC;AAEF,EAAE,CAAC;AAEH;IACE,2EAA2E;IAC3E,0EAA0E;IAC1E,kEAAkE;IAClE,IAAI,CAAC,EAAE,CAAC,CAAC;IAET,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAC5B,CAAC;AAPD,+BAOC","file":"fixtures/typescript-classes/output.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0112384f4b82e20507d8","\nexport function decoratorFactory(opts: { selector: string }) {\n  return function decorator(target) {\n    return <any>target;\n  };\n}\n\nexport default function def() {}\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/typescript-classes/src/mod.ts","// This file essentially reproduces an example Angular component to map testing,\n// among other typescript edge cases.\n\nimport def, { decoratorFactory } from './src/mod.ts';\n\nimport * as ns from './src/mod.ts';\n\n@decoratorFactory({\n  selector: 'app-root',\n})\nexport class AppComponent {\n  title = 'app';\n}\n\nconst fn = arg => {\n  console.log(\"here\");\n};\nfn(\"arg\");\n\n// Un-decorated exported classes present a mapping challege because\n// the class name is mapped to an unhelpful export assignment.\nexport class ExportedOther {\n  title = 'app';\n}\n\nclass AnotherThing {\n  prop = 4;\n}\n\nconst ExpressionClass = class Foo {\n  prop = 4;\n};\n\nclass SubDecl extends AnotherThing {\n  prop = 4;\n}\n\nlet SubVar = class SubExpr extends AnotherThing {\n  prop = 4;\n};\n\nns;\n\nexport default function(){\n  // This file is specifically for testing the mappings of classes and things\n  // above, which means we don't want to include _other_ references to then.\n  // To avoid having them be optimized out, we include a no-op eval.\n  eval(\"\");\n\n  console.log(\"pause here\");\n}\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/typescript-classes/input.ts"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///webpack/bootstrap e07865278f2d86b80b9e","webpack:///./fixtures/typescript-classes/src/mod.ts","webpack:///./fixtures/typescript-classes/input.ts"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC5DA,0BAAiC,IAA0B;IACzD,OAAO,mBAAmB,MAAM;QAC9B,OAAY,MAAM,CAAC;IACrB,CAAC,CAAC;AACJ,CAAC;AAJD,4CAIC;AAED,iBAA+B,CAAC;AAAhC,yBAAgC;;;;;;;;;ACPhC,gFAAgF;AAChF,qCAAqC;;;;;;;;;;;;;;;;;;AAErC,sCAAqD;AAErD,gCAAmC;AAKnC;IAHA;QAIE,UAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IAFY,YAAY;QAHxB,yBAAgB,CAAC;YAChB,QAAQ,EAAE,UAAU;SACrB,CAAC;OACW,YAAY,CAExB;IAAD,mBAAC;CAAA;AAFY,oCAAY;AAIzB,IAAM,EAAE,GAAG,aAAG;IACZ,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC,CAAC;AACF,EAAE,CAAC,KAAK,CAAC,CAAC;AAEV,mEAAmE;AACnE,8DAA8D;AAC9D;IAAA;QACE,UAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IAAD,oBAAC;AAAD,CAAC;AAFY,sCAAa;AAI1B;IAAA;QACE,SAAI,GAAG,CAAC,CAAC;IACX,CAAC;IAAD,mBAAC;AAAD,CAAC;AAED,IAAM,eAAe;IAAG;QACtB,SAAI,GAAG,CAAC,CAAC;IACX,CAAC;IAAD,UAAC;AAAD,CAAC,IAAC;AAEF;IAAsB,2BAAY;IAAlC;QAAA,qEAEC;QADC,UAAI,GAAG,CAAC,CAAC;;IACX,CAAC;IAAD,cAAC;AAAD,CAAC,CAFqB,YAAY,GAEjC;AAED,IAAI,MAAM;IAAyB,2BAAY;IAAlC;QAAA,qEAEZ;QADC,UAAI,GAAG,CAAC,CAAC;;IACX,CAAC;IAAD,cAAC;AAAD,CAAC,CAFkC,YAAY,EAE9C,CAAC;AAEF,EAAE,CAAC;AAEH;IACE,2EAA2E;IAC3E,0EAA0E;IAC1E,kEAAkE;IAClE,IAAI,CAAC,EAAE,CAAC,CAAC;IAET,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAC5B,CAAC;AAPD,+BAOC","file":"fixtures/typescript-classes/output.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap e07865278f2d86b80b9e","\nexport function decoratorFactory(opts: { selector: string }) {\n  return function decorator(target) {\n    return <any>target;\n  };\n}\n\nexport default function def() {}\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/typescript-classes/src/mod.ts","// This file essentially reproduces an example Angular component to map testing,\n// among other typescript edge cases.\n\nimport def, { decoratorFactory } from './src/mod.ts';\n\nimport * as ns from './src/mod.ts';\n\n@decoratorFactory({\n  selector: 'app-root',\n})\nexport class AppComponent {\n  title = 'app';\n}\n\nconst fn = arg => {\n  console.log(\"here\");\n};\nfn(\"arg\");\n\n// Un-decorated exported classes present a mapping challege because\n// the class name is mapped to an unhelpful export assignment.\nexport class ExportedOther {\n  title = 'app';\n}\n\nclass AnotherThing {\n  prop = 4;\n}\n\nconst ExpressionClass = class Foo {\n  prop = 4;\n};\n\nclass SubDecl extends AnotherThing {\n  prop = 4;\n}\n\nlet SubVar = class SubExpr extends AnotherThing {\n  prop = 4;\n};\n\nns;\n\nexport default function(){\n  // This file is specifically for testing the mappings of classes and things\n  // above, which means we don't want to include _other_ references to then.\n  // To avoid having them be optimized out, we include a no-op eval.\n  eval(\"\");\n\n  console.log(\"pause here\");\n}\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/typescript-classes/input.ts"],"sourceRoot":""}
\ No newline at end of file
--- a/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/package.json
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/package.json
@@ -1,26 +1,27 @@
 {
   "name": "babel-sourcemaps",
   "version": "1.0.0",
   "description": "Rebuild assets for babel's test fixtures",
   "scripts": {
-    "build": "webpack",
-    "watch": "webpack -w"
+    "build": "node ./build.js"
   },
   "keywords": [],
   "author": "",
   "license": "MPL-2.0",
   "devDependencies": {
     "babel-core": "^6.26.0",
     "babel-loader": "^7.1.2",
     "babel-plugin-add-module-exports": "^0.2.1",
     "babel-plugin-transform-flow-strip-types": "^6.22.0",
     "babel-preset-env": "^1.6.1",
     "ts-loader": "3.5",
     "typescript": "^2.8.3",
     "webpack": "^3.7.1"
   },
   "dependencies": {
     "babel-polyfill": "^6.26.0",
-    "lodash": "^4.17.5"
+    "lodash": "^4.17.5",
+    "rollup": "^0.63.0",
+    "rollup-plugin-babel": "^3.0.7"
   }
 }
--- a/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/polyfill-bundle.js
+++ b/devtools/client/debugger/new/test/mochitest/examples/sourcemapped/polyfill-bundle.js
@@ -63,20 +63,20 @@
 /******/ 	return __webpack_require__(__webpack_require__.s = 125);
 /******/ })
 /************************************************************************/
 /******/ ([
 /* 0 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var global = __webpack_require__(2);
-var core = __webpack_require__(18);
+var core = __webpack_require__(21);
 var hide = __webpack_require__(11);
 var redefine = __webpack_require__(12);
-var ctx = __webpack_require__(19);
+var ctx = __webpack_require__(18);
 var PROTOTYPE = 'prototype';
 
 var $export = function (type, name, source) {
   var IS_FORCED = type & $export.F;
   var IS_GLOBAL = type & $export.G;
   var IS_STATIC = type & $export.S;
   var IS_PROTO = type & $export.P;
   var IS_BIND = type & $export.B;
@@ -157,17 +157,17 @@ module.exports = function (it) {
 };
 
 
 /***/ }),
 /* 5 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var store = __webpack_require__(49)('wks');
-var uid = __webpack_require__(33);
+var uid = __webpack_require__(32);
 var Symbol = __webpack_require__(2).Symbol;
 var USE_SYMBOL = typeof Symbol == 'function';
 
 var $exports = module.exports = function (name) {
   return store[name] || (store[name] =
     USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
 };
 
@@ -239,38 +239,38 @@ module.exports = function (it) {
 };
 
 
 /***/ }),
 /* 11 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var dP = __webpack_require__(7);
-var createDesc = __webpack_require__(32);
+var createDesc = __webpack_require__(31);
 module.exports = __webpack_require__(6) ? function (object, key, value) {
   return dP.f(object, key, createDesc(1, value));
 } : function (object, key, value) {
   object[key] = value;
   return object;
 };
 
 
 /***/ }),
 /* 12 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var global = __webpack_require__(2);
 var hide = __webpack_require__(11);
 var has = __webpack_require__(14);
-var SRC = __webpack_require__(33)('src');
+var SRC = __webpack_require__(32)('src');
 var TO_STRING = 'toString';
 var $toString = Function[TO_STRING];
 var TPL = ('' + $toString).split(TO_STRING);
 
-__webpack_require__(18).inspectSource = function (it) {
+__webpack_require__(21).inspectSource = function (it) {
   return $toString.call(it);
 };
 
 (module.exports = function (O, key, val, safe) {
   var isFunction = typeof val == 'function';
   if (isFunction) has(val, 'name') || hide(val, 'name', key);
   if (O[key] === val) return;
   if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));
@@ -337,17 +337,17 @@ module.exports = function (it) {
 };
 
 
 /***/ }),
 /* 16 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var pIE = __webpack_require__(47);
-var createDesc = __webpack_require__(32);
+var createDesc = __webpack_require__(31);
 var toIObject = __webpack_require__(15);
 var toPrimitive = __webpack_require__(22);
 var has = __webpack_require__(14);
 var IE8_DOM_DEFINE = __webpack_require__(91);
 var gOPD = Object.getOwnPropertyDescriptor;
 
 exports.f = __webpack_require__(6) ? gOPD : function getOwnPropertyDescriptor(O, P) {
   O = toIObject(O);
@@ -361,38 +361,30 @@ exports.f = __webpack_require__(6) ? gOP
 
 /***/ }),
 /* 17 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
 var has = __webpack_require__(14);
 var toObject = __webpack_require__(9);
-var IE_PROTO = __webpack_require__(66)('IE_PROTO');
+var IE_PROTO = __webpack_require__(65)('IE_PROTO');
 var ObjectProto = Object.prototype;
 
 module.exports = Object.getPrototypeOf || function (O) {
   O = toObject(O);
   if (has(O, IE_PROTO)) return O[IE_PROTO];
   if (typeof O.constructor == 'function' && O instanceof O.constructor) {
     return O.constructor.prototype;
   } return O instanceof Object ? ObjectProto : null;
 };
 
 
 /***/ }),
 /* 18 */
-/***/ (function(module, exports) {
-
-var core = module.exports = { version: '2.5.7' };
-if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
-
-
-/***/ }),
-/* 19 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // optional / simple context binding
 var aFunction = __webpack_require__(10);
 module.exports = function (fn, that, length) {
   aFunction(fn);
   if (that === undefined) return fn;
   switch (length) {
@@ -408,43 +400,51 @@ module.exports = function (fn, that, len
   }
   return function (/* ...args */) {
     return fn.apply(that, arguments);
   };
 };
 
 
 /***/ }),
-/* 20 */
+/* 19 */
 /***/ (function(module, exports) {
 
 var toString = {}.toString;
 
 module.exports = function (it) {
   return toString.call(it).slice(8, -1);
 };
 
 
 /***/ }),
-/* 21 */
+/* 20 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 var fails = __webpack_require__(3);
 
 module.exports = function (method, arg) {
   return !!method && fails(function () {
     // eslint-disable-next-line no-useless-call
     arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null);
   });
 };
 
 
 /***/ }),
+/* 21 */
+/***/ (function(module, exports) {
+
+var core = module.exports = { version: '2.5.5' };
+if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
+
+
+/***/ }),
 /* 22 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 7.1.1 ToPrimitive(input [, PreferredType])
 var isObject = __webpack_require__(4);
 // instead of the ES6 spec version, we didn't implement @@toPrimitive case
 // and the second argument - flag - preferred type is a string
 module.exports = function (it, S) {
@@ -481,17 +481,17 @@ module.exports = function (it) {
 
 
 /***/ }),
 /* 25 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // most Object methods by ES6 should accept primitives
 var $export = __webpack_require__(0);
-var core = __webpack_require__(18);
+var core = __webpack_require__(21);
 var fails = __webpack_require__(3);
 module.exports = function (KEY, exec) {
   var fn = (core.Object || {})[KEY] || Object[KEY];
   var exp = {};
   exp[KEY] = exec(fn);
   $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);
 };
 
@@ -502,21 +502,21 @@ module.exports = function (KEY, exec) {
 
 // 0 -> Array#forEach
 // 1 -> Array#map
 // 2 -> Array#filter
 // 3 -> Array#some
 // 4 -> Array#every
 // 5 -> Array#find
 // 6 -> Array#findIndex
-var ctx = __webpack_require__(19);
+var ctx = __webpack_require__(18);
 var IObject = __webpack_require__(46);