Merge inbound to mozilla-central r=merge a=merge
authorCsoregi Natalia <ncsoregi@mozilla.com>
Wed, 01 Nov 2017 12:14:00 +0200
changeset 389534 cd7217cf05a2332a8fd7b498767a07b2c31ea657
parent 389533 7651a53b3faf36d9f76202eab9f1338b9d839c72 (current diff)
parent 389453 f9632977cebf710915738f5f7677ca8c7ec0cde0 (diff)
child 389535 70623eaf6ab0b353d6506a21b8dc027e90bd3e28
child 389648 7f7a137d01854cd7a5d2296c7c7625cf07042475
push id96866
push userncsoregi@mozilla.com
push dateWed, 01 Nov 2017 10:29:43 +0000
treeherdermozilla-inbound@70623eaf6ab0 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge, merge
milestone58.0a1
first release with
nightly linux32
cd7217cf05a2 / 58.0a1 / 20171101104430 / files
nightly linux64
cd7217cf05a2 / 58.0a1 / 20171101104430 / files
nightly mac
cd7217cf05a2 / 58.0a1 / 20171101104430 / files
nightly win32
cd7217cf05a2 / 58.0a1 / 20171101104430 / files
nightly win64
cd7217cf05a2 / 58.0a1 / 20171101104430 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge inbound to mozilla-central r=merge a=merge
devtools/client/debugger/new/test/mochitest/browser_dbg-search-sources.js
devtools/client/debugger/new/test/mochitest/browser_dbg-search-symbols.js
layout/painting/nsDisplayList.cpp
toolkit/components/browser/nsCommandHandler.cpp
toolkit/components/browser/nsCommandHandler.h
toolkit/components/browser/nsEmbedStream.cpp
toolkit/components/browser/nsEmbedStream.h
toolkit/components/browser/nsICommandHandler.idl
toolkit/components/browser/nsIWebBrowserStream.idl
xpcom/base/LinuxUtils.cpp
xpcom/base/LinuxUtils.h
xpcom/base/SystemMemoryReporter.cpp
xpcom/base/SystemMemoryReporter.h
--- a/browser/components/customizableui/CustomizeMode.jsm
+++ b/browser/components/customizableui/CustomizeMode.jsm
@@ -1532,24 +1532,24 @@ CustomizeMode.prototype = {
       this._updateEmptyPaletteNotice();
     }
     CustomizableUI.dispatchToolboxEvent("customizationchange");
   },
 
   _updateEmptyPaletteNotice() {
     let paletteItems = this.visiblePalette.getElementsByTagName("toolbarpaletteitem");
     this.paletteEmptyNotice.hidden = !!paletteItems.length;
-    let readyPlayerOne = this.document.getElementById("ready-player-one");
+    let whimsyButton = this.document.getElementById("whimsy-button");
 
     if (paletteItems.length == 1 &&
         paletteItems[0].id.includes("wrapper-customizableui-special-spring")) {
-      readyPlayerOne.hidden = false;
+      whimsyButton.hidden = false;
     } else {
       this.togglePong(false);
-      readyPlayerOne.hidden = true;
+      whimsyButton.hidden = true;
     }
   },
 
   _updateResetButton() {
     let btn = this.document.getElementById("customization-reset-button");
     btn.disabled = CustomizableUI.inDefaultState;
   },
 
@@ -2528,18 +2528,18 @@ CustomizeMode.prototype = {
     // Ensure we move the button (back) after the user leaves customize mode.
     event.view.gCustomizeMode._moveDownloadsButtonToNavBar = checkbox.checked;
   },
 
   togglePong(enabled) {
     // It's possible we're toggling for a reason other than hitting
     // the button (we might be exiting, for example), so make sure that
     // the state and checkbox are in sync.
-    let readyPlayerOne = this.document.getElementById("ready-player-one");
-    readyPlayerOne.checked = enabled;
+    let whimsyButton = this.document.getElementById("whimsy-button");
+    whimsyButton.checked = enabled;
 
     if (enabled) {
       this.visiblePalette.setAttribute("whimsypong", "true");
       this.pongArena.hidden = false;
       if (!this.uninitWhimsy) {
         this.uninitWhimsy = this.whimsypong();
       }
     } else {
@@ -2668,16 +2668,17 @@ CustomizeMode.prototype = {
       if (rAFHandle) {
         window.cancelAnimationFrame(rAFHandle);
       }
       let arena = elements.arena;
       while (arena.firstChild) {
         arena.firstChild.remove();
       }
       arena.removeAttribute("score");
+      arena.removeAttribute("lives");
       arena.style.removeProperty("background-image");
       arena.style.removeProperty("background-position");
       arena.style.removeProperty("background-repeat");
       arena.style.removeProperty("background-size");
       elements = null;
       document = null;
       quit = true;
     }
@@ -2725,16 +2726,17 @@ CustomizeMode.prototype = {
     let window = this.window;
     rAFHandle = window.requestAnimationFrame(function animate() {
       update();
       draw();
       if (quit) {
         elements.score.textContent = score;
         elements.lives && elements.lives.setAttribute("lives", lives);
         elements.arena.setAttribute("score", score);
+        elements.arena.setAttribute("lives", "0");
       } else {
         rAFHandle = window.requestAnimationFrame(animate);
       }
     });
 
     return uninit;
   },
 };
--- a/browser/components/customizableui/content/customizeMode.inc.xul
+++ b/browser/components/customizableui/content/customizeMode.inc.xul
@@ -123,17 +123,17 @@
         <checkbox id="customization-uidensity-autotouchmode-checkbox"
                   hidden="true"
                   label="&customizeMode.uidensity.autoTouchMode.checkbox.label;"
                   oncommand="gCustomizeMode.updateAutoTouchMode(this.checked)"/>
 #endif
       </panel>
     </button>
 
-    <button id="ready-player-one"
+    <button id="whimsy-button"
             type="checkbox"
             class="customizationmode-button"
             oncommand="gCustomizeMode.togglePong(this.checked);"
             hidden="true"/>
 
     <spacer id="customization-footer-spacer"/>
     <button id="customization-undo-reset-button"
             class="customizationmode-button"
--- a/browser/extensions/formautofill/test/unit/head.js
+++ b/browser/extensions/formautofill/test/unit/head.js
@@ -10,16 +10,17 @@
 
 var {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/NetUtil.jsm");
 Cu.import("resource://gre/modules/ObjectUtils.jsm");
 Cu.import("resource://gre/modules/FormLikeFactory.jsm");
+Cu.import("resource://testing-common/FileTestUtils.jsm");
 Cu.import("resource://testing-common/MockDocument.jsm");
 Cu.import("resource://testing-common/TestUtils.jsm");
 
 XPCOMUtils.defineLazyModuleGetter(this, "DownloadPaths",
                                   "resource://gre/modules/DownloadPaths.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "FileUtils",
                                   "resource://gre/modules/FileUtils.jsm");
 
@@ -46,53 +47,20 @@ let bootstrapURI = Services.io.newFileUR
 if (!extensionDir.exists()) {
   extensionDir = extensionDir.parent;
   extensionDir.append(EXTENSION_ID + ".xpi");
   let jarURI = Services.io.newFileURI(extensionDir);
   bootstrapURI = "jar:" + jarURI.spec + "!/bootstrap.js";
 }
 Components.manager.addBootstrappedManifestLocation(extensionDir);
 
-// While the previous test file should have deleted all the temporary files it
-// used, on Windows these might still be pending deletion on the physical file
-// system.  Thus, start from a new base number every time, to make a collision
-// with a file that is still pending deletion highly unlikely.
-let gFileCounter = Math.floor(Math.random() * 1000000);
-
-/**
- * Returns a reference to a temporary file, that is guaranteed not to exist, and
- * to have never been created before.
- *
- * @param {string} leafName
- *        Suggested leaf name for the file to be created.
- *
- * @returns {nsIFile} pointing to a non-existent file in a temporary directory.
- *
- * @note It is not enough to delete the file if it exists, or to delete the file
- *       after calling nsIFile.createUnique, because on Windows the delete
- *       operation in the file system may still be pending, preventing a new
- *       file with the same name to be created.
- */
+// Returns a reference to a temporary file that is guaranteed not to exist and
+// is cleaned up later. See FileTestUtils.getTempFile for details.
 function getTempFile(leafName) {
-  // Prepend a serial number to the extension in the suggested leaf name.
-  let [base, ext] = DownloadPaths.splitBaseNameAndExtension(leafName);
-  let finalLeafName = base + "-" + gFileCounter + ext;
-  gFileCounter++;
-
-  // Get a file reference under the temporary directory for this test file.
-  let file = FileUtils.getFile("TmpD", [finalLeafName]);
-  do_check_false(file.exists());
-
-  do_register_cleanup(function() {
-    if (file.exists()) {
-      file.remove(false);
-    }
-  });
-
-  return file;
+  return FileTestUtils.getTempFile(leafName);
 }
 
 async function initProfileStorage(fileName, records, collectionName = "addresses") {
   let {ProfileStorage} = Cu.import("resource://formautofill/ProfileStorage.jsm", {});
   let path = getTempFile(fileName).path;
   let profileStorage = new ProfileStorage(path);
   await profileStorage.initialize();
 
--- a/browser/extensions/pdfjs/README.mozilla
+++ b/browser/extensions/pdfjs/README.mozilla
@@ -1,5 +1,5 @@
 This is the PDF.js project output, https://github.com/mozilla/pdf.js
 
-Current extension version is: 1.10.88
+Current extension version is: 2.0.87
 
-Taken from upstream commit: c62a1938
+Taken from upstream commit: b46443f0
--- a/browser/extensions/pdfjs/content/build/pdf.js
+++ b/browser/extensions/pdfjs/content/build/pdf.js
@@ -1451,17 +1451,17 @@ exports.unreachable = unreachable;
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.SimpleXMLParser = exports.DOMSVGFactory = exports.DOMCMapReaderFactory = exports.DOMCanvasFactory = exports.DEFAULT_LINK_REL = exports.getDefaultSetting = exports.LinkTarget = exports.getFilenameFromUrl = exports.isValidUrl = exports.isExternalLinkTargetSet = exports.addLinkAttributes = exports.RenderingCancelledException = exports.CustomStyle = undefined;
+exports.SimpleXMLParser = exports.DOMSVGFactory = exports.DOMCMapReaderFactory = exports.DOMCanvasFactory = exports.DEFAULT_LINK_REL = exports.getDefaultSetting = exports.LinkTarget = exports.getFilenameFromUrl = exports.isExternalLinkTargetSet = exports.addLinkAttributes = exports.RenderingCancelledException = exports.CustomStyle = undefined;
 
 var _util = __w_pdfjs_require__(0);
 
 var _global_scope = __w_pdfjs_require__(2);
 
 var _global_scope2 = _interopRequireDefault(_global_scope);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -1784,44 +1784,36 @@ function getDefaultSetting(id) {
       }
       (0, _util.warn)('PDFJS.externalLinkTarget is invalid: ' + globalSettings.externalLinkTarget);
       globalSettings.externalLinkTarget = LinkTarget.NONE;
       return LinkTarget.NONE;
     case 'externalLinkRel':
       return globalSettings ? globalSettings.externalLinkRel : DEFAULT_LINK_REL;
     case 'enableStats':
       return !!(globalSettings && globalSettings.enableStats);
-    case 'pdfjsNext':
-      return !!(globalSettings && globalSettings.pdfjsNext);
     default:
       throw new Error('Unknown default setting: ' + id);
   }
 }
 function isExternalLinkTargetSet() {
   var externalLinkTarget = getDefaultSetting('externalLinkTarget');
   switch (externalLinkTarget) {
     case LinkTarget.NONE:
       return false;
     case LinkTarget.SELF:
     case LinkTarget.BLANK:
     case LinkTarget.PARENT:
     case LinkTarget.TOP:
       return true;
   }
 }
-function isValidUrl(url, allowRelative) {
-  (0, _util.deprecated)('isValidUrl(), please use createValidAbsoluteUrl() instead.');
-  var baseUrl = allowRelative ? 'http://example.com' : null;
-  return (0, _util.createValidAbsoluteUrl)(url, baseUrl) !== null;
-}
 exports.CustomStyle = CustomStyle;
 exports.RenderingCancelledException = RenderingCancelledException;
 exports.addLinkAttributes = addLinkAttributes;
 exports.isExternalLinkTargetSet = isExternalLinkTargetSet;
-exports.isValidUrl = isValidUrl;
 exports.getFilenameFromUrl = getFilenameFromUrl;
 exports.LinkTarget = LinkTarget;
 exports.getDefaultSetting = getDefaultSetting;
 exports.DEFAULT_LINK_REL = DEFAULT_LINK_REL;
 exports.DOMCanvasFactory = DOMCanvasFactory;
 exports.DOMCMapReaderFactory = DOMCMapReaderFactory;
 exports.DOMSVGFactory = DOMSVGFactory;
 exports.SimpleXMLParser = SimpleXMLParser;
@@ -1840,17 +1832,17 @@ module.exports = typeof window !== 'unde
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.build = exports.version = exports._UnsupportedManager = exports.setPDFNetworkStreamClass = exports.PDFPageProxy = exports.PDFDocumentProxy = exports.PDFWorker = exports.PDFDataRangeTransport = exports.LoopbackPort = exports.getDocument = undefined;
+exports.build = exports.version = exports.setPDFNetworkStreamClass = exports.PDFPageProxy = exports.PDFDocumentProxy = exports.PDFWorker = exports.PDFDataRangeTransport = exports.LoopbackPort = exports.getDocument = undefined;
 
 var _util = __w_pdfjs_require__(0);
 
 var _dom_utils = __w_pdfjs_require__(1);
 
 var _font_loader = __w_pdfjs_require__(14);
 
 var _canvas = __w_pdfjs_require__(15);
@@ -1872,35 +1864,18 @@ var isPostMessageTransfersDisabled = fal
 var pdfjsFilePath = null;
 var fakeWorkerFilesLoader = null;
 var useRequireEnsure = false;
 ;
 var PDFNetworkStream;
 function setPDFNetworkStreamClass(cls) {
   PDFNetworkStream = cls;
 }
-function getDocument(src, pdfDataRangeTransport, passwordCallback, progressCallback) {
+function getDocument(src) {
   var task = new PDFDocumentLoadingTask();
-  if (arguments.length > 1) {
-    (0, _util.deprecated)('getDocument is called with pdfDataRangeTransport, ' + 'passwordCallback or progressCallback argument');
-  }
-  if (pdfDataRangeTransport) {
-    if (!(pdfDataRangeTransport instanceof PDFDataRangeTransport)) {
-      pdfDataRangeTransport = Object.create(pdfDataRangeTransport);
-      pdfDataRangeTransport.length = src.length;
-      pdfDataRangeTransport.initialData = src.initialData;
-      if (!pdfDataRangeTransport.abort) {
-        pdfDataRangeTransport.abort = function () {};
-      }
-    }
-    src = Object.create(src);
-    src.range = pdfDataRangeTransport;
-  }
-  task.onPassword = passwordCallback || null;
-  task.onProgress = progressCallback || null;
   var source;
   if (typeof src === 'string') {
     source = { url: src };
   } else if ((0, _util.isArrayBuffer)(src)) {
     source = { data: src };
   } else if (src instanceof PDFDataRangeTransport) {
     source = { range: src };
   } else {
@@ -1941,22 +1916,18 @@ function getDocument(src, pdfDataRangeTr
     } else if (key === 'CMapReaderFactory') {
       CMapReaderFactory = source[key];
       continue;
     }
     params[key] = source[key];
   }
   params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE;
   params.ignoreErrors = params.stopAtErrors !== true;
-  if (params.disableNativeImageDecoder !== undefined) {
-    (0, _util.deprecated)('parameter disableNativeImageDecoder, ' + 'use nativeImageDecoderSupport instead');
-  }
-  params.nativeImageDecoderSupport = params.nativeImageDecoderSupport || (params.disableNativeImageDecoder === true ? _util.NativeImageDecoding.NONE : _util.NativeImageDecoding.DECODE);
-  if (params.nativeImageDecoderSupport !== _util.NativeImageDecoding.DECODE && params.nativeImageDecoderSupport !== _util.NativeImageDecoding.NONE && params.nativeImageDecoderSupport !== _util.NativeImageDecoding.DISPLAY) {
-    (0, _util.warn)('Invalid parameter nativeImageDecoderSupport: ' + 'need a state of enum {NativeImageDecoding}');
+  const nativeImageDecoderValues = Object.values(_util.NativeImageDecoding);
+  if (params.nativeImageDecoderSupport === undefined || !nativeImageDecoderValues.includes(params.nativeImageDecoderSupport)) {
     params.nativeImageDecoderSupport = _util.NativeImageDecoding.DECODE;
   }
   if (!worker) {
     var workerPort = (0, _dom_utils.getDefaultSetting)('workerPort');
     worker = workerPort ? PDFWorker.fromPort(workerPort) : new PDFWorker();
     task._worker = worker;
   }
   var docId = task.docId;
@@ -1985,17 +1956,17 @@ function getDocument(src, pdfDataRangeTr
     });
   }).catch(task._capability.reject);
   return task;
 }
 function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
   if (worker.destroyed) {
     return Promise.reject(new Error('Worker was destroyed'));
   }
-  let apiVersion = '1.10.88';
+  let apiVersion = '2.0.87';
   source.disableAutoFetch = (0, _dom_utils.getDefaultSetting)('disableAutoFetch');
   source.disableStream = (0, _dom_utils.getDefaultSetting)('disableStream');
   source.chunkedViewerLoading = !!pdfDataRangeTransport;
   if (pdfDataRangeTransport) {
     source.length = pdfDataRangeTransport.length;
     source.initialData = pdfDataRangeTransport.initialData;
   }
   return worker.messageHandler.sendWithPromise('GetDocRequest', {
@@ -2137,17 +2108,17 @@ var PDFDocumentProxy = function PDFDocum
       return this.transport.getPageLabels();
     },
     getPageMode() {
       return this.transport.getPageMode();
     },
     getAttachments: function PDFDocumentProxy_getAttachments() {
       return this.transport.getAttachments();
     },
-    getJavaScript: function PDFDocumentProxy_getJavaScript() {
+    getJavaScript() {
       return this.transport.getJavaScript();
     },
     getOutline: function PDFDocumentProxy_getOutline() {
       return this.transport.getOutline();
     },
     getMetadata: function PDFDocumentProxy_getMetadata() {
       return this.transport.getMetadata();
     },
@@ -2257,20 +2228,16 @@ var PDFPageProxy = function PDFPageProxy
       };
       var internalRenderTask = new InternalRenderTask(complete, params, this.objs, this.commonObjs, intentState.operatorList, this.pageNumber, canvasFactory);
       internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print';
       if (!intentState.renderTasks) {
         intentState.renderTasks = [];
       }
       intentState.renderTasks.push(internalRenderTask);
       var renderTask = internalRenderTask.task;
-      if (params.continueCallback) {
-        (0, _util.deprecated)('render is used with continueCallback parameter');
-        renderTask.onContinue = params.continueCallback;
-      }
       intentState.displayReadyCapability.promise.then(transparency => {
         if (this.pendingCleanup) {
           complete();
           return;
         }
         stats.time('Rendering');
         internalRenderTask.initializeGraphics(transparency);
         internalRenderTask.operatorListChanged();
@@ -2363,20 +2330,16 @@ var PDFPageProxy = function PDFPageProxy
           renderTask.cancel();
         });
       }, this);
       this.objs.clear();
       this.annotationsPromise = null;
       this.pendingCleanup = false;
       return Promise.all(waitOn);
     },
-    destroy() {
-      (0, _util.deprecated)('page destroy method, use cleanup() instead');
-      this.cleanup();
-    },
     cleanup: function PDFPageProxy_cleanup() {
       this.pendingCleanup = true;
       this._tryCleanup();
     },
     _tryCleanup: function PDFPageProxy_tryCleanup() {
       if (!this.pendingCleanup || Object.keys(this.intentStates).some(function (intent) {
         var intentState = this.intentStates[intent];
         return intentState.renderTasks.length !== 0 || intentState.receivingOperatorList;
@@ -2954,26 +2917,24 @@ var WorkerTransport = function WorkerTra
         }
         if (intentState.operatorList) {
           intentState.operatorList.lastChunk = true;
           for (var i = 0; i < intentState.renderTasks.length; i++) {
             intentState.renderTasks[i].operatorListChanged();
           }
         }
       }, this);
-      messageHandler.on('UnsupportedFeature', function transportUnsupportedFeature(data) {
+      messageHandler.on('UnsupportedFeature', function (data) {
         if (this.destroyed) {
           return;
         }
-        var featureId = data.featureId;
-        var loadingTask = this.loadingTask;
+        let loadingTask = this.loadingTask;
         if (loadingTask.onUnsupportedFeature) {
-          loadingTask.onUnsupportedFeature(featureId);
-        }
-        _UnsupportedManager.notify(featureId);
+          loadingTask.onUnsupportedFeature(data.featureId);
+        }
       }, this);
       messageHandler.on('JpegDecode', function (data) {
         if (this.destroyed) {
           return Promise.reject(new Error('Worker was destroyed'));
         }
         if (typeof document === 'undefined') {
           return Promise.reject(new Error('"document" is not defined.'));
         }
@@ -3290,43 +3251,28 @@ var InternalRenderTask = function Intern
           }
           this.callback();
         }
       }
     }
   };
   return InternalRenderTask;
 }();
-var _UnsupportedManager = function UnsupportedManagerClosure() {
-  var listeners = [];
-  return {
-    listen(cb) {
-      (0, _util.deprecated)('Global UnsupportedManager.listen is used: ' + ' use PDFDocumentLoadingTask.onUnsupportedFeature instead');
-      listeners.push(cb);
-    },
-    notify(featureId) {
-      for (var i = 0, ii = listeners.length; i < ii; i++) {
-        listeners[i](featureId);
-      }
-    }
-  };
-}();
 var version, build;
 {
-  exports.version = version = '1.10.88';
-  exports.build = build = 'c62a1938';
+  exports.version = version = '2.0.87';
+  exports.build = build = 'b46443f0';
 }
 exports.getDocument = getDocument;
 exports.LoopbackPort = LoopbackPort;
 exports.PDFDataRangeTransport = PDFDataRangeTransport;
 exports.PDFWorker = PDFWorker;
 exports.PDFDocumentProxy = PDFDocumentProxy;
 exports.PDFPageProxy = PDFPageProxy;
 exports.setPDFNetworkStreamClass = setPDFNetworkStreamClass;
-exports._UnsupportedManager = _UnsupportedManager;
 exports.version = version;
 exports.build = build;
 
 /***/ }),
 /* 4 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
@@ -3765,20 +3711,16 @@ class Metadata {
     return this._metadata[name] || null;
   }
   getAll() {
     return this._metadata;
   }
   has(name) {
     return typeof this._metadata[name] !== 'undefined';
   }
-  get metadata() {
-    (0, _util.deprecated)('`metadata` getter; use `getAll()` instead.');
-    return this.getAll();
-  }
 }
 exports.Metadata = Metadata;
 
 /***/ }),
 /* 6 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
@@ -5046,18 +4988,18 @@ exports.SVGGraphics = SVGGraphics;
 
 /***/ }),
 /* 9 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
-var pdfjsVersion = '1.10.88';
-var pdfjsBuild = 'c62a1938';
+var pdfjsVersion = '2.0.87';
+var pdfjsBuild = 'b46443f0';
 var pdfjsSharedUtil = __w_pdfjs_require__(0);
 var pdfjsDisplayGlobal = __w_pdfjs_require__(13);
 var pdfjsDisplayAPI = __w_pdfjs_require__(3);
 var pdfjsDisplayTextLayer = __w_pdfjs_require__(7);
 var pdfjsDisplayAnnotationLayer = __w_pdfjs_require__(6);
 var pdfjsDisplayDOMUtils = __w_pdfjs_require__(1);
 var pdfjsDisplaySVG = __w_pdfjs_require__(8);
 ;
@@ -5075,17 +5017,16 @@ exports.createPromiseCapability = pdfjsS
 exports.PasswordResponses = pdfjsSharedUtil.PasswordResponses;
 exports.InvalidPDFException = pdfjsSharedUtil.InvalidPDFException;
 exports.MissingPDFException = pdfjsSharedUtil.MissingPDFException;
 exports.SVGGraphics = pdfjsDisplaySVG.SVGGraphics;
 exports.NativeImageDecoding = pdfjsSharedUtil.NativeImageDecoding;
 exports.UnexpectedResponseException = pdfjsSharedUtil.UnexpectedResponseException;
 exports.OPS = pdfjsSharedUtil.OPS;
 exports.UNSUPPORTED_FEATURES = pdfjsSharedUtil.UNSUPPORTED_FEATURES;
-exports.isValidUrl = pdfjsDisplayDOMUtils.isValidUrl;
 exports.createValidAbsoluteUrl = pdfjsSharedUtil.createValidAbsoluteUrl;
 exports.createObjectURL = pdfjsSharedUtil.createObjectURL;
 exports.removeNullCharacters = pdfjsSharedUtil.removeNullCharacters;
 exports.shadow = pdfjsSharedUtil.shadow;
 exports.createBlob = pdfjsSharedUtil.createBlob;
 exports.RenderingCancelledException = pdfjsDisplayDOMUtils.RenderingCancelledException;
 exports.getFilenameFromUrl = pdfjsDisplayDOMUtils.getFilenameFromUrl;
 exports.addLinkAttributes = pdfjsDisplayDOMUtils.addLinkAttributes;
@@ -8147,22 +8088,22 @@ if (isReadableStreamSupported) {
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.PDFJS = exports.globalScope = undefined;
 
-var _api = __w_pdfjs_require__(3);
-
 var _dom_utils = __w_pdfjs_require__(1);
 
 var _util = __w_pdfjs_require__(0);
 
+var _api = __w_pdfjs_require__(3);
+
 var _annotation_layer = __w_pdfjs_require__(6);
 
 var _global_scope = __w_pdfjs_require__(2);
 
 var _global_scope2 = _interopRequireDefault(_global_scope);
 
 var _metadata = __w_pdfjs_require__(5);
 
@@ -8172,18 +8113,18 @@ var _svg = __w_pdfjs_require__(8);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 if (!_global_scope2.default.PDFJS) {
   _global_scope2.default.PDFJS = {};
 }
 var PDFJS = _global_scope2.default.PDFJS;
 {
-  PDFJS.version = '1.10.88';
-  PDFJS.build = 'c62a1938';
+  PDFJS.version = '2.0.87';
+  PDFJS.build = 'b46443f0';
 }
 PDFJS.pdfBug = false;
 if (PDFJS.verbosity !== undefined) {
   (0, _util.setVerbosityLevel)(PDFJS.verbosity);
 }
 delete PDFJS.verbosity;
 Object.defineProperty(PDFJS, 'verbosity', {
   get() {
@@ -8233,33 +8174,30 @@ PDFJS.disableStream = PDFJS.disableStrea
 PDFJS.disableAutoFetch = PDFJS.disableAutoFetch === undefined ? false : PDFJS.disableAutoFetch;
 PDFJS.pdfBug = PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug;
 PDFJS.postMessageTransfers = PDFJS.postMessageTransfers === undefined ? true : PDFJS.postMessageTransfers;
 PDFJS.disableCreateObjectURL = PDFJS.disableCreateObjectURL === undefined ? false : PDFJS.disableCreateObjectURL;
 PDFJS.disableWebGL = PDFJS.disableWebGL === undefined ? true : PDFJS.disableWebGL;
 PDFJS.externalLinkTarget = PDFJS.externalLinkTarget === undefined ? _dom_utils.LinkTarget.NONE : PDFJS.externalLinkTarget;
 PDFJS.externalLinkRel = PDFJS.externalLinkRel === undefined ? _dom_utils.DEFAULT_LINK_REL : PDFJS.externalLinkRel;
 PDFJS.isEvalSupported = PDFJS.isEvalSupported === undefined ? true : PDFJS.isEvalSupported;
-PDFJS.pdfjsNext = PDFJS.pdfjsNext === undefined ? false : PDFJS.pdfjsNext;
-;
 PDFJS.getDocument = _api.getDocument;
 PDFJS.LoopbackPort = _api.LoopbackPort;
 PDFJS.PDFDataRangeTransport = _api.PDFDataRangeTransport;
 PDFJS.PDFWorker = _api.PDFWorker;
 PDFJS.hasCanvasTypedArrays = true;
 PDFJS.CustomStyle = _dom_utils.CustomStyle;
 PDFJS.LinkTarget = _dom_utils.LinkTarget;
 PDFJS.addLinkAttributes = _dom_utils.addLinkAttributes;
 PDFJS.getFilenameFromUrl = _dom_utils.getFilenameFromUrl;
 PDFJS.isExternalLinkTargetSet = _dom_utils.isExternalLinkTargetSet;
 PDFJS.AnnotationLayer = _annotation_layer.AnnotationLayer;
 PDFJS.renderTextLayer = _text_layer.renderTextLayer;
 PDFJS.Metadata = _metadata.Metadata;
 PDFJS.SVGGraphics = _svg.SVGGraphics;
-PDFJS.UnsupportedManager = _api._UnsupportedManager;
 exports.globalScope = _global_scope2.default;
 exports.PDFJS = PDFJS;
 
 /***/ }),
 /* 14 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
--- a/browser/extensions/pdfjs/content/build/pdf.worker.js
+++ b/browser/extensions/pdfjs/content/build/pdf.worker.js
@@ -10092,28 +10092,31 @@ var Catalog = function CatalogClosure() 
           attachments[(0, _util.stringToPDFString)(name)] = fs.serializable;
         }
       }
       return (0, _util.shadow)(this, 'attachments', attachments);
     },
     get javaScript() {
       var xref = this.xref;
       var obj = this.catDict.get('Names');
-      var javaScript = [];
+      let javaScript = null;
       function appendIfJavaScriptDict(jsDict) {
         var type = jsDict.get('S');
         if (!(0, _primitives.isName)(type, 'JavaScript')) {
           return;
         }
         var js = jsDict.get('JS');
         if ((0, _primitives.isStream)(js)) {
           js = (0, _util.bytesToString)(js.getBytes());
         } else if (!(0, _util.isString)(js)) {
           return;
         }
+        if (!javaScript) {
+          javaScript = [];
+        }
         javaScript.push((0, _util.stringToPDFString)(js));
       }
       if (obj && obj.has('JavaScript')) {
         var nameTree = new NameTree(obj.getRaw('JavaScript'), xref);
         var names = nameTree.getAll();
         for (var name in names) {
           var jsDict = names[name];
           if ((0, _primitives.isDict)(jsDict)) {
@@ -10122,16 +10125,19 @@ var Catalog = function CatalogClosure() 
         }
       }
       var openactionDict = this.catDict.get('OpenAction');
       if ((0, _primitives.isDict)(openactionDict, 'Action')) {
         var actionType = openactionDict.get('S');
         if ((0, _primitives.isName)(actionType, 'Named')) {
           var action = openactionDict.get('N');
           if ((0, _primitives.isName)(action, 'Print')) {
+            if (!javaScript) {
+              javaScript = [];
+            }
             javaScript.push('print({});');
           }
         } else {
           appendIfJavaScriptDict(openactionDict);
         }
       }
       return (0, _util.shadow)(this, 'javaScript', javaScript);
     },
@@ -20268,16 +20274,18 @@ var getSpecialPUASymbols = getLookupTabl
  t[63735] = 0x239F;
  t[63736] = 0x23A0;
 });
 function mapSpecialUnicodeValues(code) {
  if (code >= 0xFFF0 && code <= 0xFFFF) {
   return 0;
  } else if (code >= 0xF600 && code <= 0xF8FF) {
   return getSpecialPUASymbols()[code] || code;
+ } else if (code === 0x00AD) {
+  return 0x002D;
  }
  return code;
 }
 function getUnicodeForGlyph(name, glyphsUnicodeMap) {
  var unicode = glyphsUnicodeMap[name];
  if (unicode !== undefined) {
   return unicode;
  }
@@ -23270,18 +23278,18 @@ exports.PostScriptCompiler = PostScriptC
 
 /***/ }),
 /* 17 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
-var pdfjsVersion = '1.10.88';
-var pdfjsBuild = 'c62a1938';
+var pdfjsVersion = '2.0.87';
+var pdfjsBuild = 'b46443f0';
 var pdfjsCoreWorker = __w_pdfjs_require__(18);
 exports.WorkerMessageHandler = pdfjsCoreWorker.WorkerMessageHandler;
 
 /***/ }),
 /* 18 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
@@ -23466,17 +23474,17 @@ var WorkerMessageHandler = {
     });
   },
   createDocumentHandler(docParams, port) {
     var pdfManager;
     var terminated = false;
     var cancelXHRs = null;
     var WorkerTasks = [];
     let apiVersion = docParams.apiVersion;
-    let workerVersion = '1.10.88';
+    let workerVersion = '2.0.87';
     if (apiVersion !== null && apiVersion !== workerVersion) {
       throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version "${workerVersion}".`);
     }
     var docId = docParams.docId;
     var docBaseUrl = docParams.docBaseUrl;
     var workerHandlerName = docParams.docId + '_worker';
     var handler = new _util.MessageHandler(workerHandlerName, docId, port);
     handler.postMessageTransfers = docParams.postMessageTransfers;
@@ -31584,16 +31592,20 @@ var Font = function FontClosure() {
     var ID = 1;
     return function Font_getFontID() {
       return String(ID++);
     };
   }();
   function int16(b0, b1) {
     return (b0 << 8) + b1;
   }
+  function writeSignedInt16(bytes, index, value) {
+    bytes[index + 1] = value;
+    bytes[index] = value >>> 8;
+  }
   function signedInt16(b0, b1) {
     var value = (b0 << 8) + b1;
     return value & 1 << 15 ? value - 0x10000 : value;
   }
   function int32(b0, b1, b2, b3) {
     return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
   }
   function string16(value) {
@@ -32233,18 +32245,20 @@ var Font = function FontClosure() {
         var glyphProfile = {
           length: 0,
           sizeOfInstructions: 0
         };
         if (sourceEnd - sourceStart <= 12) {
           return glyphProfile;
         }
         var glyf = source.subarray(sourceStart, sourceEnd);
-        var contoursCount = glyf[0] << 8 | glyf[1];
-        if (contoursCount & 0x8000) {
+        var contoursCount = signedInt16(glyf[0], glyf[1]);
+        if (contoursCount < 0) {
+          contoursCount = -1;
+          writeSignedInt16(glyf, 0, contoursCount);
           dest.set(glyf, destStart);
           glyphProfile.length = glyf.length;
           return glyphProfile;
         }
         var i,
             j = 10,
             flagsCount = 0;
         for (i = 0; i < contoursCount; i++) {
--- a/browser/extensions/pdfjs/content/web/viewer.js
+++ b/browser/extensions/pdfjs/content/web/viewer.js
@@ -1498,17 +1498,17 @@ let PDFViewerApplication = {
       this.toolbar.setPagesCount(pdfDocument.numPages, true);
       this.toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);
     });
     pagesPromise.then(() => {
       if (!this.supportsPrinting) {
         return;
       }
       pdfDocument.getJavaScript().then(javaScript => {
-        if (javaScript.length === 0) {
+        if (!javaScript) {
           return;
         }
         javaScript.some(js => {
           if (!js) {
             return false;
           }
           console.warn('Warning: JavaScript is not supported');
           this.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.javaScript);
@@ -2732,25 +2732,18 @@ const CursorTool = {
 class PDFCursorTools {
   constructor({ container, eventBus, preferences }) {
     this.container = container;
     this.eventBus = eventBus;
     this.active = CursorTool.SELECT;
     this.activeBeforePresentationMode = null;
     this.handTool = new _grab_to_pan.GrabToPan({ element: this.container });
     this._addEventListeners();
-    Promise.all([preferences.get('cursorToolOnLoad'), preferences.get('enableHandToolOnLoad')]).then(([cursorToolPref, handToolPref]) => {
-      if (handToolPref === true) {
-        preferences.set('enableHandToolOnLoad', false);
-        if (cursorToolPref === CursorTool.SELECT) {
-          cursorToolPref = CursorTool.HAND;
-          preferences.set('cursorToolOnLoad', cursorToolPref).catch(() => {});
-        }
-      }
-      this.switchTool(cursorToolPref);
+    preferences.get('cursorToolOnLoad').then(value => {
+      this.switchTool(value);
     }).catch(() => {});
   }
   get activeTool() {
     return this.active;
   }
   switchTool(tool) {
     if (this.activeBeforePresentationMode !== null) {
       return;
--- a/browser/themes/shared/customizableui/customizeMode.inc.css
+++ b/browser/themes/shared/customizableui/customizeMode.inc.css
@@ -554,22 +554,22 @@ toolbarpaletteitem[place=toolbar] > tool
   padding: 5px 12px;
 }
 
 #downloads-button-autohide-checkbox {
   margin: 0;
   padding: 0;
 }
 
-#ready-player-one {
+#whimsy-button {
   /* Don't need HiDPI versions since the size used will be scaled down to 20x20. */
   list-style-image: url("chrome://browser/skin/customizableui/whimsy.png");
 }
 
-#ready-player-one > .button-box > .button-icon {
+#whimsy-button > .button-box > .button-icon {
   width: 16px;
   height: 16px;
 }
 
 #customization-palette[whimsypong] {
   /* Keep the palette in the render tree but invisible
      so -moz-element() will work. */
   padding: 0;
@@ -639,8 +639,28 @@ toolbarpaletteitem[place=toolbar] > tool
 
 #lives[lives="2"] {
   height: 40px;
 }
 
 #lives[lives="1"] {
   height: 20px;
 }
+
+#customization-pong-arena[lives="0"] > #ball {
+  animation: game-over 4s forwards ease;
+}
+
+@keyframes game-over {
+  15% {
+    transform: scale(2) translateY(-10px) rotateZ(-90deg);
+  }
+  35% {
+    opacity: 1;
+  }
+  65% {
+    opacity: 0;
+  }
+  100% {
+    transform: scale(2) translateY(300px) rotateZ(-2.5turn);
+    opacity: 0;
+  }
+}
--- a/build/mobile/remoteautomation.py
+++ b/build/mobile/remoteautomation.py
@@ -111,16 +111,17 @@ class RemoteAutomation(Automation):
         """
         proc.utilityPath = utilityPath
         # maxTime is used to override the default timeout, we should honor that
         status = proc.wait(timeout = maxTime, noOutputTimeout = timeout)
         self.lastTestSeen = proc.getLastTestSeen
 
         topActivity = self._devicemanager.getTopActivity()
         if topActivity == proc.procName:
+            print "Browser unexpectedly found running. Killing..."
             proc.kill(True)
         if status == 1:
             if maxTime:
                 print "TEST-UNEXPECTED-FAIL | %s | application ran for longer than " \
                       "allowed maximum time of %s seconds" % (self.lastTestSeen, maxTime)
             else:
                 print "TEST-UNEXPECTED-FAIL | %s | application ran for longer than " \
                       "allowed maximum time" % (self.lastTestSeen)
@@ -401,16 +402,19 @@ class RemoteAutomation(Automation):
                 if datetime.datetime.now() > endTime:
                     status = 1
                     break
                 if (noOutputTimeout and noOutputTimer > noOutputTimeout):
                     status = 2
                     break
                 if not hasOutput:
                     top = self.dm.getTopActivity()
+                    if top == "":
+                        print "Failed to get top activity, retrying, once..."
+                        top = self.dm.getTopActivity()
             # Flush anything added to stdout during the sleep
             self.read_stdout()
             return status
 
         def kill(self, stagedShutdown = False):
             if self.utilityPath:
                 # Take a screenshot to capture the screen state just before
                 # the application is killed. There are on-device screenshot
--- a/devtools/client/debugger/new/README.mozilla
+++ b/devtools/client/debugger/new/README.mozilla
@@ -1,11 +1,11 @@
 This is the debugger.html project output.
 See https://github.com/devtools-html/debugger.html
 
-Taken from upstream commit: aa6b25cc7dc645b8c1d76af58b99012e40b80848
+Taken from upstream commit: d9f18b2cd0792de70289d4dcde5ed3e38be87cf1
 
 Packages:
 - babel-plugin-transform-es2015-modules-commonjs @6.26.0
 - babel-preset-react @6.24.1
 - react @15.6.2
 - react-dom @15.6.2
-- webpack @3.7.1
+- webpack @3.8.1
--- a/devtools/client/debugger/new/debugger.css
+++ b/devtools/client/debugger/new/debugger.css
@@ -421,25 +421,39 @@ body {
   left: 0;
   transition: z-index 200ms;
   z-index: 100;
 }
 
 .modal {
   width: 80%;
   height: auto;
-  overflow-y: scroll;
+  overflow-y: auto;
   background-color: var(--theme-toolbar-background);
   transition: transform 150ms cubic-bezier(0.07, 0.95, 0, 1);
   box-shadow: 1px 1px 3px 1px var(--popup-shadow-color);
 }
 
+.modal .input-wrapper {
+  display: flex;
+  justify-content: center;
+}
+
+.modal .close-btn {
+  padding: 6px;
+}
+
+.modal .result-list {
+  height: calc(100% - 28px);
+  overflow-y: auto;
+}
+
 .modal.entering,
 .modal.exited {
-  transform: translateY(-250px);
+  transform: translateY(-101%);
 }
 
 .modal.entered,
 .modal.exiting {
   transform: translateY(5px);
 }
 
 /* This rule is active when the screen is not short and narrow */
@@ -904,57 +918,79 @@ menuseparator {
  * events. This is good for performance during splitter
  * bar dragging.
  */
 .split-box.dragging > .controlled,
 .split-box.dragging > .uncontrolled {
   pointer-events: none;
 }
 .arrow,
-.folder,
-.domain,
-.file,
 .worker,
 .refresh,
 .shortcut,
 .add-button {
   fill: var(--theme-splitter-color);
 }
 
+.file,
+.folder,
+.domain {
+  background-color: var(--theme-splitter-color);
+}
+
 .worker,
 .folder {
   position: relative;
   top: 2px;
 }
 
 .domain,
 .file,
 .worker,
 .refresh,
 .add-button {
   position: relative;
   top: 1px;
 }
 
-.domain svg,
-.folder svg,
 .worker svg,
 .refresh svg,
 .shortcut svg,
 .add-button svg {
   width: 15px;
 }
 
-.file svg {
+img.domain,
+img.folder {
+  width: 15px;
+  height: 15px;
+}
+
+img.domain {
+  mask: url("chrome://devtools/skin/images/debugger/domain.svg") no-repeat;
+}
+
+img.folder {
+  mask: url("chrome://devtools/skin/images/debugger/folder.svg") no-repeat;
+}
+
+img.file {
+  mask: url("chrome://devtools/skin/images/debugger/file.svg") no-repeat;
   width: 13px;
-}
-
-.file svg,
-.domain svg,
-.folder svg,
+  height: 13px;
+}
+
+img.domain,
+img.folder,
+img.file {
+  mask-size: 100%;
+  margin-inline-end: 5px;
+  display: inline-block;
+}
+
 .refresh svg,
 .shortcut svg,
 .worker svg {
   margin-inline-end: 5px;
 }
 
 img.arrow {
   mask: url("chrome://devtools/skin/images/debugger/arrow.svg");
@@ -1276,164 +1312,28 @@ html[dir="rtl"] .managed-tree .tree .nod
 .project-text-search .managed-tree {
   overflow-y: auto;
   height: calc(100% - 81px);
 }
 
 .project-text-search .managed-tree .tree {
   height: 100%;
 }
-.autocomplete {
-  position: relative;
-  width: 100%;
-  height: 100%;
-}
-
-.autocomplete .no-result-msg {
-  color: var(--theme-body-color-inactive);
-  font-size: 24px;
-  padding: 4px;
-  word-break: break-all;
-}
-.result-list {
-  list-style: none;
-  margin: 0px;
-  padding: 0px;
-  overflow: auto;
-  width: calc(100% - 1px); /* 1px fixes the hidden right border */
-}
-
-.result-list.big {
-  max-height: calc(100% - 32px);
-}
-
-.result-list * {
-  -moz-user-select: none;
-  user-select: none;
-}
-
-.result-list li {
-  color: var(--theme-body-color);
-  padding: 4px 13px;
-  display: flex;
-  justify-content: space-between;
-  border: 1px solid transparent;
-}
-
-.result-list.big li {
-  padding: 10px;
-  flex-direction: column;
-  border-bottom: 1px solid var(--theme-splitter-color);
-}
-
-.result-list li:hover {
-  background: var(--theme-tab-toolbar-background);
-}
-
-.result-list li.selected {
-  border-color: var(--theme-selection-background);
-}
-
-.result-list.small li.selected {
-  background-color: var(--theme-selection-background);
-  color: white;
-}
-
-.theme-dark .result-list.small li.selected {
-  background-color: var(--theme-body-background);
-}
-
-.theme-dark .result-list li:hover {
-  background: var(--grey-70);
-}
-
-.theme-dark .result-list li.selected {
-  background: var(--grey-70);
-}
-
-.result-list li .title {
-  line-height: 1.5em;
-  word-break: break-all;
-}
-
-.result-list li.selected .title {
-  color: white;
-}
-
-.result-list.big li.selected .title {
-  color: var(--theme-body-color);
-}
-
-.result-list.big li .subtitle {
-  word-break: break-all;
-  color: var(--theme-body-color-inactive);
-}
-
-.result-list.big li .subtitle {
-  line-height: 1.5em;
-}
-
-.search-bar .result-list li.selected .subtitle {
-  color: white;
-}
-
-.search-bar .result-list {
-  border-bottom: 1px solid var(--theme-splitter-color);
-}
-
-.theme-dark .result-list {
-  background-color: var(--theme-body-background);
-}
 .search-container {
   position: absolute;
   top: 30px;
   left: 0;
   width: calc(100% - 1px);
   height: calc(100% - 31px);
   display: flex;
   flex-direction: column;
   z-index: 20;
   background-color: var(--theme-body-background);
   overflow-y: hidden;
 }
-
-.searchinput-container {
-  display: flex;
-  border-bottom: 1px solid var(--theme-splitter-color);
-}
-
-.theme-dark .result-list li .subtitle {
-  color: var(--theme-comment-alt);
-}
-
-.toggle-search {
-  background-color: var(--theme-toolbar-background);
-  border-bottom: 1px solid var(--theme-splitter-color);
-  color: var(--theme-comment-alt);
-  display: flex;
-  flex-shrink: 0;
-  justify-content: flex-start;
-  line-height: 40px;
-  padding: 0 13px;
-  width: calc(100% - 1px);
-}
-
-.toggle-search .title {
-  font-weight: 500;
-  font-size: 120%;
-}
-
-.toggle-search .text {
-  margin-left: 1em;
-  cursor: default;
-}
-
-.toggle-search .active {
-  color: var(--theme-selection-background);
-}
 .sources-panel {
   background-color: var(--theme-sidebar-background);
   display: flex;
   flex: 1;
   flex-direction: column;
   overflow: hidden;
   position: relative;
 }
@@ -1556,16 +1456,43 @@ html[dir="rtl"] .managed-tree .tree .nod
   background-color: var(--theme-body-background);
   border-bottom-color: transparent;
 }
 
 .source-outline-tabs .tab.active path,
 .source-outline-tabs .tab:hover path {
   fill: var(--theme-body-color);
 }
+
+.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: 5px;
+  margin-bottom: -2px;
+}
+
+.sources-list .managed-tree .tree .node.focused img.blackBox {
+  background-color: white;
+}
+
+.theme-dark .sources-list .managed-tree .tree .node:not(.focused) img.blackBox {
+  background-color: var(--theme-content-color3);
+}
+
+.theme-dark .sources-list .managed-tree .tree .node img.blackBox {
+  background-color: var(--theme-body-color);
+}
+
+.theme-dark .sources-list .managed-tree .tree .node.focused img.blackBox {
+  background-color: white;
+}
 .outline {
   overflow-y: auto;
 }
 
 .outline .outline-pane-info {
   width: 100%;
   font-style: italic;
   text-align: center;
@@ -1624,17 +1551,17 @@ html[dir="rtl"] .managed-tree .tree .nod
 
 .function-signature .comma {
   color: var(--object-color);
 }
 .toggle-button-start,
 .toggle-button-end {
   transform: translate(0, 0px);
   transition: transform 0.25s ease-in-out;
-  padding: 5px 5px;
+  padding: 5px;
 }
 
 .toggle-button-start.vertical,
 .toggle-button-end.vertical {
   padding: 2.5px 2.5px;
 }
 
 .toggle-button-start svg,
@@ -1672,17 +1599,17 @@ html .toggle-button-end.vertical svg {
 }
 .source-footer {
   background: var(--theme-body-background);
   border-top: 1px solid var(--theme-splitter-color);
   position: absolute;
   display: flex;
   bottom: 0;
   left: 0;
-  right: 1px;
+  right: 0;
   opacity: 1;
   z-index: 1;
   -moz-user-select: none;
   user-select: none;
   height: var(--editor-footer-height);
   box-sizing: border-box;
 }
 
@@ -1773,17 +1700,17 @@ html .toggle-button-end.vertical svg {
 .search-bottom-bar * {
   -moz-user-select: none;
   user-select: none;
 }
 
 .search-bottom-bar {
   display: flex;
   flex-shrink: 0;
-  justify-content: space-between;
+  justify-content: flex-end;
   width: calc(100% - 1px);
   height: var(--editor-second-searchbar-height);
   background-color: var(--theme-toolbar-background);
   border-bottom: 1px solid var(--theme-splitter-color);
   padding: 0 13px;
 }
 
 .search-bottom-bar button:focus {
@@ -2393,16 +2320,18 @@ html[dir="rtl"] .arrow svg,
 .conditional-breakpoint-panel input:focus {
   outline-width: 0;
 }
 .editor-wrapper {
   --debug-line-border: rgb(145, 188, 219);
   --debug-expression-background: rgba(202, 227, 255, 0.5);
   --editor-searchbar-height: 27px;
   --editor-second-searchbar-height: 27px;
+  --debug-line-error-border: rgb(255, 0, 0);
+  --debug-expression-error-background: rgba(231, 116, 113, 0.3);
 }
 
 .theme-dark .editor-wrapper {
   --debug-expression-background: #54617e;
   --debug-line-border: #7786a2;
 }
 
 .editor-wrapper .CodeMirror-linewidget {
@@ -2418,18 +2347,18 @@ html[dir="rtl"] .arrow svg,
 }
 
 /**
  * There's a known codemirror flex issue with chrome that this addresses.
  * BUG https://github.com/devtools-html/debugger.html/issues/63
  */
 .editor-wrapper {
   position: absolute;
-  height: calc(100% - 31px);
-  width: calc(100% - 1.5px);
+  height: calc(100% - 29px);
+  width: calc(100% - 1px);
   top: 29px;
   left: 0px;
   --editor-footer-height: 24px;
 }
 
 html[dir="rtl"] .editor-mount {
   direction: ltr;
 }
@@ -2510,19 +2439,18 @@ html[dir="rtl"] .editor-mount {
 }
 
 .editor-wrapper .editor-mount {
   width: 100%;
   background-color: var(--theme-body-background);
 }
 
 .CodeMirror-linenumber {
-  font-size: 12px;
-  line-height: 15px;
-  font-family: monospace;
+  font-size: 11px;
+  line-height: 14px;
 }
 
 .folding-enabled .CodeMirror-linenumber {
   text-align: left;
   padding: 0 0 0 2px;
 }
 
 /* set the linenumber white when there is a breakpoint */
@@ -2542,27 +2470,42 @@ html[dir="rtl"] .editor-mount {
 .theme-dark .editor-wrapper .CodeMirror-line .cm-comment {
   color: var(--theme-content-color3);
 }
 
 .debug-expression {
   background-color: var(--debug-expression-background);
 }
 
+debug-expression-error {
+  background-color: var(--debug-expression-error-background);
+}
+
 .new-debug-line .CodeMirror-line {
   background-color: transparent !important;
   outline: var(--debug-line-border) solid 1px;
 }
 
 /* Don't display the highlight color since the debug line
    is already highlighted */
 .new-debug-line .CodeMirror-activeline-background {
   display: none;
 }
 
+.new-debug-line-error .CodeMirror-line {
+  background-color: var(--debug-expression-error-background) !important;
+  outline: var(--debug-line-error-border) solid 1px;
+}
+
+/* Don't display the highlight color since the debug line
+  is already highlighted */
+.new-debug-line-error .CodeMirror-activeline-background {
+  display: none;
+}
+
 .highlight-line .CodeMirror-line {
   animation: fade-highlight-out 1.5s normal forwards;
 }
 
 @keyframes fade-highlight-out {
   0% {
     background-color: var(--theme-highlight-gray);
   }
@@ -2992,28 +2935,28 @@ html .breakpoints-list .breakpoint.pause
 
 .event-listeners .listener .close {
   display: none;
 }
 
 .event-listeners .listener:hover .close {
   display: block;
 }
-.workers-list * {
-  user-select: none;
-}
-
-.workers-list .worker {
-  font-size: 12px;
-  color: var(--theme-content-color1);
-  padding: 0.5em 1em 0.5em 0.5em;
-  line-height: 1em;
-  position: relative;
-  transition: all 0.25s ease;
-}
+.workers-list * {
+  user-select: none;
+}
+
+.workers-list .worker {
+  font-size: 12px;
+  color: var(--theme-content-color1);
+  padding: 0.5em 1em 0.5em 0.5em;
+  line-height: 1em;
+  position: relative;
+  transition: all 0.25s ease;
+}
 :root {
   --accordion-header-background: var(--theme-toolbar-background);
 }
 
 :root.theme-dark {
   --accordion-header-background: #141416;
 }
 
@@ -3119,55 +3062,83 @@ html[dir="rtl"] .command-bar {
   background: var(--theme-toolbar-background-hover);
 }
 
 :root.theme-dark .command-bar > button {
   color: var(--theme-body-color);
 }
 
 .command-bar > button {
-  margin-inline-end: 0.7em;
+  margin-inline-end: 0.3em;
 }
 
 .command-bar > button:focus {
   outline: none;
 }
 
 html .command-bar > button:disabled {
   opacity: 0.8;
   cursor: default;
 }
 
-.command-bar > button > i {
-  height: 100%;
-  width: 100%;
-  display: block;
-}
-
-.command-bar > button > i > svg {
+img.pause,
+img.stepOver,
+img.stepIn,
+img.stepOut,
+img.resume {
+  background-color: var(--theme-body-color);
+}
+
+.command-bar > button > img {
   width: 16px;
   height: 16px;
-}
-
-.command-bar button.pause-exceptions {
-  margin-inline-start: 0.5em;
+  display: inline-block;
+}
+
+.command-bar > button > img.pause {
+  mask: url("chrome://devtools/skin/images/debugger/pause.svg") no-repeat;
+}
+
+.command-bar > button > img.stepOver {
+  mask: url("chrome://devtools/skin/images/debugger/stepOver.svg") no-repeat;
+}
+
+.command-bar > button > img.stepIn {
+  mask: url("chrome://devtools/skin/images/debugger/stepIn.svg") no-repeat;
+}
+
+.command-bar > button > img.stepOut {
+  mask: url("chrome://devtools/skin/images/debugger/stepOut.svg") no-repeat;
+}
+
+.command-bar > button > img.resume {
+  mask: url("chrome://devtools/skin/images/debugger/resume.svg") no-repeat;
+}
+
+.command-bar > button.pause-exceptions.uncaught.enabled > img.pause-exceptions {
+  background-color: var(--theme-highlight-purple);
+}
+
+.command-bar > button.pause-exceptions.all.enabled > img.pause-exceptions {
+  background-color: var(--theme-highlight-blue);
+}
+
+.command-bar > button.pause-exceptions.enabled > img.pause-exceptions {
+  background-color: var(--theme-body-color);
+}
+
+.command-bar > button > img.pause-exceptions {
+  mask: url("chrome://devtools/skin/images/debugger/pause-exceptions.svg") no-repeat;
+  margin-inline-start: 0.2em;
 }
 
 .command-bar .subSettings {
   float: right;
 }
 
-.command-bar button.pause-exceptions.uncaught {
-  color: var(--theme-highlight-purple);
-}
-
-.command-bar button.pause-exceptions.all {
-  color: var(--theme-highlight-blue);
-}
-
 .bottom {
   border-bottom: none;
   background-color: var(--theme-body-background);
   border-top: 1px solid var(--theme-splitter-color);
   flex: 0 0 27px;
 }
 
 .command-bar > button {
@@ -3211,17 +3182,17 @@ html .command-bar > button:disabled {
 .scopes-pane {
   overflow: auto;
 }
 
 .scopes-list .function-signature {
   display: inline-block;
 }
 .secondary-panes {
-  overflow: scroll;
+  overflow: auto;
   display: flex;
   flex-direction: column;
   flex: 1;
   white-space: nowrap;
   --breakpoint-expression-right-clear-space: 36px;
 }
 
 /*
@@ -3387,16 +3358,20 @@ html .welcomebox .toggle-button-end.coll
   min-width: 40px;
   overflow: hidden;
   padding: 5px;
   margin-inline-start: 3px;
   margin-top: 3px;
   cursor: default;
 }
 
+.source-tab:first-child {
+  margin-inline-start: 0;
+}
+
 .source-tab:hover {
   background-color: var(--theme-toolbar-background-alt);
   border-color: var(--theme-splitter-color);
 }
 
 .source-tab.active {
   color: var(--theme-body-color);
   background-color: var(--theme-body-background);
@@ -3522,39 +3497,97 @@ html[dir="rtl"] .dropdown {
   position: fixed;
   width: 100%;
   height: 100%;
   background: transparent;
   z-index: 999;
   left: 0;
   top: 0;
 }
-.symbol-modal-wrapper {
-  position: fixed;
-  width: 100%;
-  height: 100%;
-  z-index: 9;
-}
-
-.symbol-modal {
-  position: absolute;
-  left: calc(50% - 250px);
-  z-index: 10;
-  width: 500px;
-  height: 230px;
-  background-color: var(--theme-codemirror-gutter-background);
-  top: 30px;
-}
-
-.symbol-modal .input-wrapper,
-.modal .input-wrapper {
+.result-list {
+  list-style: none;
+  margin: 0px;
+  padding: 0px;
+  overflow: auto;
+  width: calc(100% - 1px); /* 1px fixes the hidden right border */
+}
+
+.result-list * {
+  -moz-user-select: none;
+  user-select: none;
+}
+
+.result-list li {
+  color: var(--theme-body-color);
+  padding: 4px 13px;
   display: flex;
-  justify-content: center;
-}
-
-.modal .close-btn {
-  padding: 6px;
-}
-
-.modal .result-list {
-  height: calc(100% - 28px);
-  overflow-y: auto;
-}
+  justify-content: space-between;
+  border: 1px solid transparent;
+}
+
+.result-list.big li {
+  padding: 10px;
+  flex-direction: column;
+  border-bottom: 1px solid var(--theme-splitter-color);
+}
+
+.result-list li:hover {
+  background: var(--theme-tab-toolbar-background);
+}
+
+.result-list li.selected {
+  border-color: var(--theme-selection-background);
+}
+
+.result-list.small li.selected {
+  background-color: var(--theme-selection-background);
+  color: white;
+}
+
+.theme-dark .result-list.small li.selected {
+  background-color: var(--theme-body-background);
+}
+
+.theme-dark .result-list li:hover {
+  background: var(--grey-70);
+}
+
+.theme-dark .result-list li.selected {
+  background: var(--grey-70);
+}
+
+.result-list li .title {
+  line-height: 1.5em;
+  word-break: break-all;
+}
+
+.result-list li.selected .title {
+  color: white;
+}
+
+.result-list.big li.selected .title {
+  color: var(--theme-body-color);
+}
+
+.result-list.big li .subtitle {
+  word-break: break-all;
+  color: var(--theme-body-color-inactive);
+}
+
+.result-list.big li .subtitle {
+  line-height: 1.5em;
+}
+
+.theme-dark .result-list.big li .subtitle {
+  color: var(--theme-comment-alt);
+}
+
+.search-bar .result-list li.selected .subtitle {
+  color: white;
+}
+
+.search-bar .result-list {
+  border-bottom: 1px solid var(--theme-splitter-color);
+}
+
+.theme-dark .result-list {
+  background-color: var(--theme-body-background);
+}
--- a/devtools/client/debugger/new/debugger.js
+++ b/devtools/client/debugger/new/debugger.js
@@ -12998,65 +12998,65 @@ module.exports = __WEBPACK_EXTERNAL_MODU
 /* 787 */,
 /* 788 */,
 /* 789 */,
 /* 790 */,
 /* 791 */,
 /* 792 */
 /***/ (function(module, exports) {
 
-var g;
-
-// This works in non-strict mode
-g = (function() {
-	return this;
-})();
-
-try {
-	// This works if eval is allowed (see CSP)
-	g = g || Function("return this")() || (1,eval)("this");
-} catch(e) {
-	// This works if the window reference is available
-	if(typeof window === "object")
-		g = window;
-}
-
-// g can still be undefined, but nothing to do about it...
-// We return undefined, instead of nothing here, so it's
-// easier to handle this case. if(!global) { ...}
-
-module.exports = g;
+var g;
+
+// This works in non-strict mode
+g = (function() {
+	return this;
+})();
+
+try {
+	// This works if eval is allowed (see CSP)
+	g = g || Function("return this")() || (1,eval)("this");
+} catch(e) {
+	// This works if the window reference is available
+	if(typeof window === "object")
+		g = window;
+}
+
+// g can still be undefined, but nothing to do about it...
+// We return undefined, instead of nothing here, so it's
+// easier to handle this case. if(!global) { ...}
+
+module.exports = g;
 
 
 /***/ }),
 /* 793 */
 /***/ (function(module, exports) {
 
-module.exports = function(module) {
-	if(!module.webpackPolyfill) {
-		module.deprecate = function() {};
-		module.paths = [];
-		// module.parent = undefined by default
-		if(!module.children) module.children = [];
-		Object.defineProperty(module, "loaded", {
-			enumerable: true,
-			get: function() {
-				return module.l;
-			}
-		});
-		Object.defineProperty(module, "id", {
-			enumerable: true,
-			get: function() {
-				return module.i;
-			}
-		});
-		module.webpackPolyfill = 1;
-	}
-	return module;
-};
+module.exports = function(module) {
+	if(!module.webpackPolyfill) {
+		module.deprecate = function() {};
+		module.paths = [];
+		// module.parent = undefined by default
+		if(!module.children) module.children = [];
+		Object.defineProperty(module, "loaded", {
+			enumerable: true,
+			get: function() {
+				return module.l;
+			}
+		});
+		Object.defineProperty(module, "id", {
+			enumerable: true,
+			get: function() {
+				return module.i;
+			}
+		});
+		module.webpackPolyfill = 1;
+	}
+	return module;
+};
 
 
 /***/ }),
 /* 794 */,
 /* 795 */,
 /* 796 */,
 /* 797 */,
 /* 798 */,
@@ -14257,17 +14257,17 @@ module.exports = "<svg xmlns=\"http://ww
 /* 955 */,
 /* 956 */,
 /* 957 */,
 /* 958 */,
 /* 959 */,
 /* 960 */
 /***/ (function(module, exports) {
 
-module.exports = "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# LOCALIZATION NOTE These strings are used inside the Debugger\n# which is available from the Web Developer sub-menu -> 'Debugger'.\n# The correct localization of this file might be to keep it in\n# English, or another language commonly spoken among web developers.\n# You want to make that choice consistent across the developer tools.\n# A good criteria is the language in which you'd find the best\n# documentation on web development on the web.\n\n# LOCALIZATION NOTE (collapsePanes): This is the tooltip for the button\n# that collapses the left and right panes in the debugger UI.\ncollapsePanes=Collapse panes\n\n# LOCALIZATION NOTE (copySource): This is the text that appears in the\n# context menu to copy the selected source of file open.\ncopySource=Copy\ncopySource.accesskey=y\n\n# LOCALIZATION NOTE (copySourceUri2): This is the text that appears in the\n# context menu to copy the source URI of file open.\ncopySourceUri2=Copy source URI\ncopySourceUri2.accesskey=u\n\n# LOCALIZATION NOTE (setDirectoryRoot): This is the text that appears in the\n# context menu to set a directory as root directory\nsetDirectoryRoot.label=Set directory root\nsetDirectoryRoot.accesskey=r\n\n# LOCALIZATION NOTE (copyFunction): This is the text that appears in the\n# context menu to copy the function the user selected\ncopyFunction.label=Copy function\ncopyFunction.accesskey=F\n\n# LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the\n# context menu to copy the stack trace methods, file names and row number.\ncopyStackTrace=Copy stack trace\ncopyStackTrace.accesskey=c\n\n# LOCALIZATION NOTE (expandPanes): This is the tooltip for the button\n# that expands the left and right panes in the debugger UI.\nexpandPanes=Expand panes\n\n# LOCALIZATION NOTE (pauseButtonTooltip): The tooltip that is displayed for the pause\n# button when the debugger is in a running state.\npauseButtonTooltip=Pause %S\n\n# LOCALIZATION NOTE (pausePendingButtonTooltip): The tooltip that is displayed for\n# the pause button after it's been clicked but before the next JavaScript to run.\npausePendingButtonTooltip=Waiting for next execution\n\n# LOCALIZATION NOTE (resumeButtonTooltip): The label that is displayed on the pause\n# button when the debugger is in a paused state.\nresumeButtonTooltip=Resume %S\n\n# LOCALIZATION NOTE (stepOverTooltip): The label that is displayed on the\n# button that steps over a function call.\nstepOverTooltip=Step over %S\n\n# LOCALIZATION NOTE (stepInTooltip): The label that is displayed on the\n# button that steps into a function call.\nstepInTooltip=Step in %S\n\n# LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the\n# button that steps out of a function call.\nstepOutTooltip=Step out %S\n\n# LOCALIZATION NOTE (workersHeader): The text to display in the events\n# header.\nworkersHeader=Workers\n\n# LOCALIZATION NOTE (noWorkersText): The text to display in the workers list\n# when there are no workers.\nnoWorkersText=This page has no workers.\n\n# LOCALIZATION NOTE (noSourcesText): The text to display in the sources list\n# when there are no sources.\nnoSourcesText=This page has no sources.\n\n# LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab\n# when there are no events.\nnoEventListenersText=No event listeners to display.\n\n# LOCALIZATION NOTE (eventListenersHeader): The text to display in the events\n# header.\neventListenersHeader=Event listeners\n\n# LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab\n# when there are no stack frames.\nnoStackFramesText=No stack frames to display\n\n# LOCALIZATION NOTE (eventCheckboxTooltip): The tooltip text to display when\n# the user hovers over the checkbox used to toggle an event breakpoint.\neventCheckboxTooltip=Toggle breaking on this event\n\n# LOCALIZATION NOTE (eventOnSelector): The text to display in the events tab\n# for every event item, between the event type and event selector.\neventOnSelector=on\n\n# LOCALIZATION NOTE (eventInSource): The text to display in the events tab\n# for every event item, between the event selector and listener's owner source.\neventInSource=in\n\n# LOCALIZATION NOTE (eventNodes): The text to display in the events tab when\n# an event is listened on more than one target node.\neventNodes=%S nodes\n\n# LOCALIZATION NOTE (eventNative): The text to display in the events tab when\n# a listener is added from plugins, thus getting translated to native code.\neventNative=[native code]\n\n# LOCALIZATION NOTE (*Events): The text to display in the events tab for\n# each group of sub-level event entries.\nanimationEvents=Animation\naudioEvents=Audio\nbatteryEvents=Battery\nclipboardEvents=Clipboard\ncompositionEvents=Composition\ndeviceEvents=Device\ndisplayEvents=Display\ndragAndDropEvents=Drag and Drop\ngamepadEvents=Gamepad\nindexedDBEvents=IndexedDB\ninteractionEvents=Interaction\nkeyboardEvents=Keyboard\nmediaEvents=HTML5 Media\nmouseEvents=Mouse\nmutationEvents=Mutation\nnavigationEvents=Navigation\npointerLockEvents=Pointer Lock\nsensorEvents=Sensor\nstorageEvents=Storage\ntimeEvents=Time\ntouchEvents=Touch\notherEvents=Other\n\n# LOCALIZATION NOTE (blackboxCheckboxTooltip2): The tooltip text to display when\n# the user hovers over the checkbox used to toggle blackboxing its associated\n# source.\nblackboxCheckboxTooltip2=Toggle blackboxing\n\n# LOCALIZATION NOTE (sources.search.key2): Key shortcut to open the search for\n# searching all the source files the debugger has seen.\nsources.search.key2=CmdOrCtrl+P\n\n# LOCALIZATION NOTE (sources.search.alt.key): A second key shortcut to open the\n# search for searching all the source files the debugger has seen.\nsources.search.alt.key=CmdOrCtrl+O\n\n# LOCALIZATION NOTE (projectTextSearch.key): A key shortcut to open the\n# full project text search for searching all the files the debugger has seen.\nprojectTextSearch.key=CmdOrCtrl+Shift+F\n\n# LOCALIZATION NOTE (functionSearch.key): A key shortcut to open the\n# modal for searching functions in a file.\nfunctionSearch.key=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE (toggleBreakpoint.key): A key shortcut to toggle\n# breakpoints.\ntoggleBreakpoint.key=CmdOrCtrl+B\n\n# LOCALIZATION NOTE (toggleCondPanel.key): A key shortcut to toggle\n# the conditional breakpoint panel.\ntoggleCondPanel.key=CmdOrCtrl+Shift+B\n\n# LOCALIZATION NOTE (stepOut.key): A key shortcut to\n# step out.\nstepOut.key=Shift+F11\n\n# LOCALIZATION NOTE (shortcuts.header.editor): Sections header in\n# the shortcuts modal for keyboard shortcuts related to editing.\nshortcuts.header.editor=Editor\n\n# LOCALIZATION NOTE (shortcuts.header.stepping): Sections header in\n# the shortcuts modal for keyboard shortcuts related to stepping.\nshortcuts.header.stepping=Stepping\n\n# LOCALIZATION NOTE (shortcuts.header.search): Sections header in\n# the shortcuts modal for keyboard shortcuts related to search.\nshortcuts.header.search=Search\n\n# LOCALIZATION NOTE (projectTextSearch.placeholder): A placeholder shown\n# when searching across all of the files in a project.\nprojectTextSearch.placeholder=Find in files…\n\n# LOCALIZATION NOTE (projectTextSearch.noResults): The center pane Text Search\n# message when the query did not match any text of all files in a project.\nprojectTextSearch.noResults=No results found\n\n# LOCALIZATION NOTE (sources.noSourcesAvailable): Text shown when the debugger\n# does not have any sources.\nsources.noSourcesAvailable=This page has no sources\n\n# LOCALIZATION NOTE (sourceSearch.search.key2): Key shortcut to open the search\n# for searching within a the currently opened files in the editor\nsourceSearch.search.key2=CmdOrCtrl+F\n\n# LOCALIZATION NOTE (sourceSearch.search.placeholder): placeholder text in\n# the source search input bar\nsourceSearch.search.placeholder=Search in file…\n\n# LOCALIZATION NOTE (sourceSearch.search.again.key2): Key shortcut to highlight\n# the next occurrence of the last search triggered from a source search\nsourceSearch.search.again.key2=CmdOrCtrl+G\n\n# LOCALIZATION NOTE (sourceSearch.search.againPrev.key2): Key shortcut to highlight\n# the previous occurrence of the last search triggered from a source search\nsourceSearch.search.againPrev.key2=CmdOrCtrl+Shift+G\n\n# LOCALIZATION NOTE (sourceSearch.resultsSummary1): Shows a summary of\n# the number of matches for autocomplete\nsourceSearch.resultsSummary1=%d results\n\n# LOCALIZATION NOTE (noMatchingStringsText): The text to display in the\n# global search results when there are no matching strings after filtering.\nnoMatchingStringsText=No matches found\n\n# LOCALIZATION NOTE (emptySearchText): This is the text that appears in the\n# filter text box when it is empty and the scripts container is selected.\nemptySearchText=Search scripts (%S)\n\n# LOCALIZATION NOTE (emptyVariablesFilterText): This is the text that\n# appears in the filter text box for the variables view container.\nemptyVariablesFilterText=Filter variables\n\n# LOCALIZATION NOTE (emptyPropertiesFilterText): This is the text that\n# appears in the filter text box for the editor's variables view bubble.\nemptyPropertiesFilterText=Filter properties\n\n# LOCALIZATION NOTE (searchPanelFilter): This is the text that appears in the\n# filter panel popup for the filter scripts operation.\nsearchPanelFilter=Filter scripts (%S)\n\n# LOCALIZATION NOTE (searchPanelGlobal): This is the text that appears in the\n# filter panel popup for the global search operation.\nsearchPanelGlobal=Search in all files (%S)\n\n# LOCALIZATION NOTE (searchPanelFunction): This is the text that appears in the\n# filter panel popup for the function search operation.\nsearchPanelFunction=Search for function definition (%S)\n\n# LOCALIZATION NOTE (searchPanelToken): This is the text that appears in the\n# filter panel popup for the token search operation.\nsearchPanelToken=Find in this file (%S)\n\n# LOCALIZATION NOTE (searchPanelGoToLine): This is the text that appears in the\n# filter panel popup for the line search operation.\nsearchPanelGoToLine=Go to line (%S)\n\n# LOCALIZATION NOTE (searchPanelVariable): This is the text that appears in the\n# filter panel popup for the variables search operation.\nsearchPanelVariable=Filter variables (%S)\n\n# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that\n# are displayed in the breakpoints menu item popup.\nbreakpointMenuItem.setConditional=Configure conditional breakpoint\nbreakpointMenuItem.enableSelf2.label=Enable\nbreakpointMenuItem.enableSelf2.accesskey=E\nbreakpointMenuItem.disableSelf2.label=Disable\nbreakpointMenuItem.disableSelf2.accesskey=D\nbreakpointMenuItem.deleteSelf2.label=Remove\nbreakpointMenuItem.deleteSelf2.accesskey=R\nbreakpointMenuItem.enableOthers2.label=Enable others\nbreakpointMenuItem.enableOthers2.accesskey=o\nbreakpointMenuItem.disableOthers2.label=Disable others\nbreakpointMenuItem.disableOthers2.accesskey=s\nbreakpointMenuItem.deleteOthers2.label=Remove others\nbreakpointMenuItem.deleteOthers2.accesskey=h\nbreakpointMenuItem.enableAll2.label=Enable all\nbreakpointMenuItem.enableAll2.accesskey=b\nbreakpointMenuItem.disableAll2.label=Disable all\nbreakpointMenuItem.disableAll2.accesskey=k\nbreakpointMenuItem.deleteAll2.label=Remove all\nbreakpointMenuItem.deleteAll2.accesskey=a\nbreakpointMenuItem.removeCondition2.label=Remove condition\nbreakpointMenuItem.removeCondition2.accesskey=c\nbreakpointMenuItem.addCondition2.label=Add condition\nbreakpointMenuItem.addCondition2.accesskey=A\nbreakpointMenuItem.editCondition2.label=Edit condition\nbreakpointMenuItem.editCondition2.accesskey=n\nbreakpointMenuItem.enableSelf=Enable breakpoint\nbreakpointMenuItem.enableSelf.accesskey=E\nbreakpointMenuItem.disableSelf=Disable breakpoint\nbreakpointMenuItem.disableSelf.accesskey=D\nbreakpointMenuItem.deleteSelf=Remove breakpoint\nbreakpointMenuItem.deleteSelf.accesskey=R\nbreakpointMenuItem.enableOthers=Enable others\nbreakpointMenuItem.enableOthers.accesskey=o\nbreakpointMenuItem.disableOthers=Disable others\nbreakpointMenuItem.disableOthers.accesskey=s\nbreakpointMenuItem.deleteOthers=Remove others\nbreakpointMenuItem.deleteOthers.accesskey=h\nbreakpointMenuItem.enableAll=Enable all breakpoints\nbreakpointMenuItem.enableAll.accesskey=b\nbreakpointMenuItem.disableAll=Disable all breakpoints\nbreakpointMenuItem.disableAll.accesskey=k\nbreakpointMenuItem.deleteAll=Remove all breakpoints\nbreakpointMenuItem.deleteAll.accesskey=a\nbreakpointMenuItem.removeCondition.label=Remove breakpoint condition\nbreakpointMenuItem.removeCondition.accesskey=c\nbreakpointMenuItem.editCondition.label=Edit breakpoint condition\nbreakpointMenuItem.editCondition.accesskey=n\n\n# LOCALIZATION NOTE (breakpoints.header): Breakpoints right sidebar pane header.\nbreakpoints.header=Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.none): The text that appears when there are\n# no breakpoints present\nbreakpoints.none=No breakpoints\n\n# LOCALIZATION NOTE (breakpoints.enable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.enable=Enable breakpoints\n\n# LOCALIZATION NOTE (breakpoints.disable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.disable=Disable breakpoints\n\n# LOCALIZATION NOTE (breakpoints.removeBreakpointTooltip): The tooltip that is displayed\n# for remove breakpoint button in right sidebar\nbreakpoints.removeBreakpointTooltip=Remove breakpoint\n\n# LOCALIZATION NOTE (callStack.header): Call Stack right sidebar pane header.\ncallStack.header=Call stack\n\n# LOCALIZATION NOTE (callStack.notPaused): Call Stack right sidebar pane\n# message when not paused.\ncallStack.notPaused=Not paused\n\n# LOCALIZATION NOTE (callStack.collapse): Call Stack right sidebar pane\n# message to hide some of the frames that are shown.\ncallStack.collapse=Collapse rows\n\n# LOCALIZATION NOTE (callStack.expand): Call Stack right sidebar pane\n# message to show more of the frames.\ncallStack.expand=Expand rows\n\n# LOCALIZATION NOTE (editor.searchResults): Editor Search bar message\n# for the summarizing the selected search result. e.g. 5 of 10 results.\neditor.searchResults=%d of %d results\n\n# LOCALIZATION NOTE (sourceSearch.singleResult): Copy shown when there is one result.\neditor.singleResult=1 result\n\n# LOCALIZATION NOTE (editor.noResults): Editor Search bar message\n# for when no results found.\neditor.noResults=No results\n\n# LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar\n# tooltip for traversing to the Next Result\neditor.searchResults.nextResult=Next result\n\n# LOCALIZATION NOTE (editor.searchResults.prevResult): Editor Search bar\n# tooltip for traversing to the Previous Result\neditor.searchResults.prevResult=Previous result\n\n# LOCALIZATION NOTE (editor.searchTypeToggleTitle): Search bar title for\n# toggling search type buttons(function search, variable search)\neditor.searchTypeToggleTitle=Search for:\n\n# LOCALIZATION NOTE (editor.continueToHere.label): Editor gutter context\n# menu item for jumping to a new paused location\neditor.continueToHere.label=Continue to here\neditor.continueToHere.accesskey=H\n\n# LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item\n# for adding a breakpoint on a line.\neditor.addBreakpoint=Add breakpoint\n\n# LOCALIZATION NOTE (editor.disableBreakpoint): Editor gutter context menu item\n# for disabling a breakpoint on a line.\neditor.disableBreakpoint=Disable breakpoint\neditor.disableBreakpoint.accesskey=D\n\n# LOCALIZATION NOTE (editor.enableBreakpoint): Editor gutter context menu item\n# for enabling a breakpoint on a line.\neditor.enableBreakpoint=Enable breakpoint\n\n# LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item\n# for removing a breakpoint on a line.\neditor.removeBreakpoint=Remove breakpoint\n\n# LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item\n# for setting a breakpoint condition on a line.\neditor.editBreakpoint=Edit breakpoint\n\n# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context\n# menu item for adding/editing a breakpoint condition on a line.\neditor.addConditionalBreakpoint=Add/Edit conditional breakpoint\neditor.addConditionalBreakpoint.accesskey=c\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for\n# input element inside ConditionalPanel component\neditor.conditionalPanel.placeholder=This breakpoint will pause when the expression is true\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Tooltip text for\n# close button inside ConditionalPanel component\neditor.conditionalPanel.close=Cancel edit breakpoint and close\n\n# LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item\n# for navigating to a source mapped location\neditor.jumpToMappedLocation1=Jump to %S location\neditor.jumpToMappedLocation1.accesskey=m\n\n# LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the\n# context menu to disable framework grouping.\nframework.disableGrouping=Disable framework grouping\nframework.disableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the\n# context menu to enable framework grouping.\nframework.enableGrouping=Enable framework grouping\nframework.enableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (generated): Source Map term for a server source location\ngenerated=Generated\n\n# LOCALIZATION NOTE (original): Source Map term for a debugger UI source location\noriginal=original\n\n# LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression\n# input element\nexpressions.placeholder=Add watch expression\nexpressions.placeholder.accesskey=e\n\n# LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item\n# for closing the selected tab below the mouse.\nsourceTabs.closeTab=Close tab\nsourceTabs.closeTab.accesskey=c\n\n# LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item\n# for closing the other tabs.\nsourceTabs.closeOtherTabs=Close other tabs\nsourceTabs.closeOtherTabs.accesskey=o\n\n# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd): Editor source tab context menu item\n# for closing the tabs to the end (the right for LTR languages) of the selected tab.\nsourceTabs.closeTabsToEnd=Close tabs to the right\nsourceTabs.closeTabsToEnd.accesskey=e\n\n# LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item\n# for closing all tabs.\nsourceTabs.closeAllTabs=Close all tabs\nsourceTabs.closeAllTabs.accesskey=a\n\n# LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item\n# for revealing source in tree.\nsourceTabs.revealInTree=Reveal in tree\nsourceTabs.revealInTree.accesskey=r\n\n# LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item\n# for pretty printing the source.\nsourceTabs.prettyPrint=Pretty print source\nsourceTabs.prettyPrint.accesskey=p\n\n# LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.blackbox=Blackbox source\nsourceFooter.blackbox.accesskey=B\n\n# LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.unblackbox=Unblackbox source\nsourceFooter.unblackbox.accesskey=b\n\n# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated\n# with a blackboxed source\nsourceFooter.blackboxed=Blackboxed source\n\n# LOCALIZATION NOTE (sourceFooter.codeCoverage): Text associated\n# with a code coverage button\nsourceFooter.codeCoverage=Code coverage\n\n# LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed\n# for close tab button in source tabs.\nsourceTabs.closeTabButtonTooltip=Close tab\n\n# LOCALIZATION NOTE (scopes.header): Scopes right sidebar pane header.\nscopes.header=Scopes\n\n# LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message\n# for when the debugger is paused, but there isn't pause data.\nscopes.notAvailable=Scopes unavailable\n\n# LOCALIZATION NOTE (scopes.notPaused): Scopes right sidebar pane message\n# for when the debugger is not paused.\nscopes.notPaused=Not paused\n\n# LOCALIZATION NOTE (scopes.block): Refers to a block of code in\n# the scopes pane when the debugger is paused.\nscopes.block=Block\n\n# LOCALIZATION NOTE (sources.header): Sources left sidebar header\nsources.header=Sources\n\n# LOCALIZATION NOTE (outline.header): Outline left sidebar header\noutline.header=Outline\n\n# LOCALIZATION NOTE (outline.noFunctions): Outline text when there are no functions to display\noutline.noFunctions=No functions\n\n# LOCALIZATION NOTE (sources.search): Sources left sidebar prompt\n# e.g. Cmd+P to search. On a mac, we use the command unicode character.\n# On windows, it's ctrl.\nsources.search=%S to search\n\n# LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar\n# pane header.\nwatchExpressions.header=Watch expressions\n\n# LOCALIZATION NOTE (watchExpressions.refreshButton): Watch Expressions header\n# button for refreshing the expressions.\nwatchExpressions.refreshButton=Refresh\n\n# LOCALIZATION NOTE (welcome.search): The center pane welcome panel's\n# search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on\n# a mac we use the unicode character.\nwelcome.search=%S to search for sources\n\n# LOCALIZATION NOTE (welcome.findInFiles): The center pane welcome panel's\n# search prompt. e.g. cmd+f to search for files. On windows, it's ctrl+shift+f, on\n# a mac we use the unicode character.\nwelcome.findInFiles=%S to find in files\n\n# LOCALIZATION NOTE (welcome.searchFunction): Label displayed in the welcome\n# panel. %S is replaced by the keyboard shortcut to search for functions.\nwelcome.searchFunction=%S to search for functions in file\n\n# LOCALIZATION NOTE (sourceSearch.search): The center pane Source Search\n# prompt for searching for files.\nsourceSearch.search=Search sources…\n\n# LOCALIZATION NOTE (sourceSearch.noResults): The center pane Source Search\n# message when the query did not match any of the sources.\nsourceSearch.noResults2=No results found\n\n# LOCALIZATION NOTE (ignoreExceptions): The pause on exceptions button tooltip\n# when the debugger will not pause on exceptions.\nignoreExceptions=Ignore exceptions. Click to pause on uncaught exceptions\n\n# LOCALIZATION NOTE (pauseOnUncaughtExceptions): The pause on exceptions button\n# tooltip when the debugger will pause on uncaught exceptions.\npauseOnUncaughtExceptions=Pause on uncaught exceptions. Click to pause on all exceptions\n\n# LOCALIZATION NOTE (pauseOnExceptions): The pause on exceptions button tooltip\n# when the debugger will pause on all exceptions.\npauseOnExceptions=Pause on all exceptions. Click to ignore exceptions\n\n# LOCALIZATION NOTE (loadingText): The text that is displayed in the script\n# editor when the loading process has started but there is no file to display\n# yet.\nloadingText=Loading\\u2026\n\n# LOCALIZATION NOTE (errorLoadingText3): The text that is displayed in the debugger\n# viewer when there is an error loading a file\nerrorLoadingText3=Error loading this URI: %S\n\n# LOCALIZATION NOTE (addWatchExpressionText): The text that is displayed in the\n# watch expressions list to add a new item.\naddWatchExpressionText=Add watch expression\n\n# LOCALIZATION NOTE (addWatchExpressionButton): The button that is displayed in the\n# variables view popup.\naddWatchExpressionButton=Watch\n\n# LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the\n# variables pane when there are no variables to display.\nemptyVariablesText=No variables to display\n\n# LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables\n# pane as a header for each variable scope (e.g. \"Global scope, \"With scope\",\n# etc.).\nscopeLabel=%S scope\n\n# LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch\n# expressions scope. This text is displayed in the variables pane as a header for\n# the watch expressions scope.\nwatchExpressionsScopeLabel=Watch expressions\n\n# LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text\n# is added to scopeLabel and displayed in the variables pane as a header for\n# the global scope.\nglobalScopeLabel=Global\n\n# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is\n# shown before the stack trace in an error.\nvariablesViewErrorStacktrace=Stack trace:\n\n# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed\n# when you have an object preview that does not show all of the elements. At the end of the list\n# you see \"N more...\" in the web console output.\n# This is a semi-colon list of plural forms.\n# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals\n# #1 number of remaining items in the object\n# example: 3 more…\nvariablesViewMoreObjects=#1 more…;#1 more…\n\n# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed\n# in the variables list on an item with an editable name.\nvariablesEditableNameTooltip=Double click to edit\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in the variables list on an item with an editable value.\nvariablesEditableValueTooltip=Click to change value\n\n# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed\n# in the variables list on an item which can be removed.\nvariablesCloseButtonTooltip=Click to remove\n\n# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed\n# in the variables list on a getter or setter which can be edited.\nvariablesEditButtonTooltip=Click to set value\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in a tooltip on the \"open in inspector\" button in the the variables list for a\n# DOMNode item.\nvariablesDomNodeValueTooltip=Click to select the node in the inspector\n\n# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed\n# in the variables list on certain variables or properties as tooltips.\n# Expanations of what these represent can be found at the following links:\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed\n# It's probably best to keep these in English.\nconfigurableTooltip=configurable\nenumerableTooltip=enumerable\nwritableTooltip=writable\nfrozenTooltip=frozen\nsealedTooltip=sealed\nextensibleTooltip=extensible\noverriddenTooltip=overridden\nWebIDLTooltip=WebIDL\n\n# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed\n# in the variables list as a separator between the name and value.\nvariablesSeparatorLabel=:\n\n# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed\n# in the watch expressions list as a separator between the code and evaluation.\nwatchExpressionsSeparatorLabel2=\\u0020→\n\n# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed\n# in the functions search panel as a separator between function's inferred name\n# and its real name (if available).\nfunctionSearchSeparatorLabel=←\n\n# LOCALIZATION NOTE(gotoLineModal.placeholder): The placeholder\n# text displayed when the user searches for specific lines in a file\ngotoLineModal.placeholder=Go to line…\ngotoLineModal.key=CmdOrCtrl+Shift+;\n\n# LOCALIZATION NOTE(symbolSearch.search.functionsPlaceholder): The placeholder\n# text displayed when the user searches for functions in a file\nsymbolSearch.search.functionsPlaceholder=Search functions…\n\n# LOCALIZATION NOTE(symbolSearch.search.variablesPlaceholder): The placeholder\n# text displayed when the user searches for variables in a file\nsymbolSearch.search.variablesPlaceholder=Search variables…\n\n# LOCALIZATION NOTE(symbolSearch.search.key2): The Key Shortcut for\n# searching for a function or variable\nsymbolSearch.search.key2=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.modifiersLabel): A label\n# preceding the group of modifiers\nsymbolSearch.searchModifier.modifiersLabel=Modifiers:\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.regex): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.regex=Regex\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.caseSensitive): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.caseSensitive=Case sensitive\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.wholeWord): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.wholeWord=Whole word\n\n# LOCALIZATION NOTE (resumptionOrderPanelTitle): This is the text that appears\n# as a description in the notification panel popup, when multiple debuggers are\n# open in separate tabs and the user tries to resume them in the wrong order.\n# The substitution parameter is the URL of the last paused window that must be\n# resumed first.\nresumptionOrderPanelTitle=There are one or more paused debuggers. Please resume the most-recently paused debugger first at: %S\n\nvariablesViewOptimizedOut=(optimized away)\nvariablesViewUninitialized=(uninitialized)\nvariablesViewMissingArgs=(unavailable)\n\nanonymousSourcesLabel=Anonymous sources\n\nexperimental=This is an experimental feature\n\n# LOCALIZATION NOTE (whyPaused.debuggerStatement): The text that is displayed\n# in a info block explaining how the debugger is currently paused due to a `debugger`\n# statement in the code\nwhyPaused.debuggerStatement=Paused on debugger statement\n\n# LOCALIZATION NOTE (whyPaused.breakpoint): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a breakpoint\nwhyPaused.breakpoint=Paused on breakpoint\n\n# LOCALIZATION NOTE (whyPaused.exception): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an exception\nwhyPaused.exception=Paused on exception\n\n# LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed\n# in a info block explaining how the debugger is currently paused while stepping\n# in or out of the stack\nwhyPaused.resumeLimit=Paused while stepping\n\n# LOCALIZATION NOTE (whyPaused.pauseOnDOMEvents): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# dom event\nwhyPaused.pauseOnDOMEvents=Paused on event listener\n\n# LOCALIZATION NOTE (whyPaused.breakpointConditionThrown): The text that is displayed\n# in an info block when evaluating a conditional breakpoint throws an error\nwhyPaused.breakpointConditionThrown=Error with conditional breakpoint\n\n# LOCALIZATION NOTE (whyPaused.xhr): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# xml http request\nwhyPaused.xhr=Paused on XMLHttpRequest\n\n# LOCALIZATION NOTE (whyPaused.promiseRejection): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# promise rejection\nwhyPaused.promiseRejection=Paused on promise rejection\n\n# LOCALIZATION NOTE (whyPaused.assert): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# assert\nwhyPaused.assert=Paused on assertion\n\n# LOCALIZATION NOTE (whyPaused.debugCommand): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# debugger statement\nwhyPaused.debugCommand=Paused on debugged function\n\n# LOCALIZATION NOTE (whyPaused.other): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an event\n# listener breakpoint set\nwhyPaused.other=Debugger paused\n\n# LOCALIZATION NOTE (ctrl): The text that is used for documenting\n# keyboard shortcuts that use the control key\nctrl=Ctrl\n\n# LOCALIZATION NOTE (anonymous): The text that is displayed when the\n# display name is null.\nanonymous=(anonymous)\n\n# LOCALIZATION NOTE (shortcuts.toggleBreakpoint): text describing\n# keyboard shortcut action for toggling breakpoint\nshortcuts.toggleBreakpoint=Toggle Breakpoint\nshortcuts.toggleBreakpoint.accesskey=B\n\n# LOCALIZATION NOTE (shortcuts.toggleCondPanel): text describing\n# keyboard shortcut action for toggling conditional panel keyboard\nshortcuts.toggleCondPanel=Toggle Conditional Panel\n\n# LOCALIZATION NOTE (shortcuts.pauseOrResume): text describing\n# keyboard shortcut action for pause of resume\nshortcuts.pauseOrResume=Pause/Resume\n\n# LOCALIZATION NOTE (shortcuts.stepOver): text describing\n# keyboard shortcut action for stepping over\nshortcuts.stepOver=Step Over\n\n# LOCALIZATION NOTE (shortcuts.stepIn): text describing\n# keyboard shortcut action for stepping in\nshortcuts.stepIn=Step In\n\n# LOCALIZATION NOTE (shortcuts.stepOut): text describing\n# keyboard shortcut action for stepping out\nshortcuts.stepOut=Step Out\n\n# LOCALIZATION NOTE (shortcuts.fileSearch): text describing\n# keyboard shortcut action for source file search\nshortcuts.fileSearch=Source File Search\n\n# LOCALIZATION NOTE (shortcuts.searchAgain): text describing\n# keyboard shortcut action for searching again\nshortcuts.searchAgain=Search Again\n\n# LOCALIZATION NOTE (shortcuts.projectSearch): text describing\n# keyboard shortcut action for full project search\nshortcuts.projectSearch=Full Project Search\n\n# LOCALIZATION NOTE (shortcuts.functionSearch): text describing\n# keyboard shortcut action for function search\nshortcuts.functionSearch=Function Search\n\n# LOCALIZATION NOTE (shortcuts.buttonName): text describing\n# keyboard shortcut button text\nshortcuts.buttonName=Keyboard shortcuts\n"
+module.exports = "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# LOCALIZATION NOTE These strings are used inside the Debugger\n# which is available from the Web Developer sub-menu -> 'Debugger'.\n# The correct localization of this file might be to keep it in\n# English, or another language commonly spoken among web developers.\n# You want to make that choice consistent across the developer tools.\n# A good criteria is the language in which you'd find the best\n# documentation on web development on the web.\n\n# LOCALIZATION NOTE (collapsePanes): This is the tooltip for the button\n# that collapses the left and right panes in the debugger UI.\ncollapsePanes=Collapse panes\n\n# LOCALIZATION NOTE (copySource): This is the text that appears in the\n# context menu to copy the selected source of file open.\ncopySource=Copy\ncopySource.accesskey=y\n\n# LOCALIZATION NOTE (copySourceUri2): This is the text that appears in the\n# context menu to copy the source URI of file open.\ncopySourceUri2=Copy source URI\ncopySourceUri2.accesskey=u\n\n# LOCALIZATION NOTE (setDirectoryRoot): This is the text that appears in the\n# context menu to set a directory as root directory\nsetDirectoryRoot.label=Set directory root\nsetDirectoryRoot.accesskey=r\n\n# LOCALIZATION NOTE (copyFunction): This is the text that appears in the\n# context menu to copy the function the user selected\ncopyFunction.label=Copy function\ncopyFunction.accesskey=F\n\n# LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the\n# context menu to copy the stack trace methods, file names and row number.\ncopyStackTrace=Copy stack trace\ncopyStackTrace.accesskey=c\n\n# LOCALIZATION NOTE (expandPanes): This is the tooltip for the button\n# that expands the left and right panes in the debugger UI.\nexpandPanes=Expand panes\n\n# LOCALIZATION NOTE (pauseButtonTooltip): The tooltip that is displayed for the pause\n# button when the debugger is in a running state.\npauseButtonTooltip=Pause %S\n\n# LOCALIZATION NOTE (pausePendingButtonTooltip): The tooltip that is displayed for\n# the pause button after it's been clicked but before the next JavaScript to run.\npausePendingButtonTooltip=Waiting for next execution\n\n# LOCALIZATION NOTE (resumeButtonTooltip): The label that is displayed on the pause\n# button when the debugger is in a paused state.\nresumeButtonTooltip=Resume %S\n\n# LOCALIZATION NOTE (stepOverTooltip): The label that is displayed on the\n# button that steps over a function call.\nstepOverTooltip=Step over %S\n\n# LOCALIZATION NOTE (stepInTooltip): The label that is displayed on the\n# button that steps into a function call.\nstepInTooltip=Step in %S\n\n# LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the\n# button that steps out of a function call.\nstepOutTooltip=Step out %S\n\n# LOCALIZATION NOTE (workersHeader): The text to display in the events\n# header.\nworkersHeader=Workers\n\n# LOCALIZATION NOTE (noWorkersText): The text to display in the workers list\n# when there are no workers.\nnoWorkersText=This page has no workers.\n\n# LOCALIZATION NOTE (noSourcesText): The text to display in the sources list\n# when there are no sources.\nnoSourcesText=This page has no sources.\n\n# LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab\n# when there are no events.\nnoEventListenersText=No event listeners to display.\n\n# LOCALIZATION NOTE (eventListenersHeader): The text to display in the events\n# header.\neventListenersHeader=Event listeners\n\n# LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab\n# when there are no stack frames.\nnoStackFramesText=No stack frames to display\n\n# LOCALIZATION NOTE (eventCheckboxTooltip): The tooltip text to display when\n# the user hovers over the checkbox used to toggle an event breakpoint.\neventCheckboxTooltip=Toggle breaking on this event\n\n# LOCALIZATION NOTE (eventOnSelector): The text to display in the events tab\n# for every event item, between the event type and event selector.\neventOnSelector=on\n\n# LOCALIZATION NOTE (eventInSource): The text to display in the events tab\n# for every event item, between the event selector and listener's owner source.\neventInSource=in\n\n# LOCALIZATION NOTE (eventNodes): The text to display in the events tab when\n# an event is listened on more than one target node.\neventNodes=%S nodes\n\n# LOCALIZATION NOTE (eventNative): The text to display in the events tab when\n# a listener is added from plugins, thus getting translated to native code.\neventNative=[native code]\n\n# LOCALIZATION NOTE (*Events): The text to display in the events tab for\n# each group of sub-level event entries.\nanimationEvents=Animation\naudioEvents=Audio\nbatteryEvents=Battery\nclipboardEvents=Clipboard\ncompositionEvents=Composition\ndeviceEvents=Device\ndisplayEvents=Display\ndragAndDropEvents=Drag and Drop\ngamepadEvents=Gamepad\nindexedDBEvents=IndexedDB\ninteractionEvents=Interaction\nkeyboardEvents=Keyboard\nmediaEvents=HTML5 Media\nmouseEvents=Mouse\nmutationEvents=Mutation\nnavigationEvents=Navigation\npointerLockEvents=Pointer Lock\nsensorEvents=Sensor\nstorageEvents=Storage\ntimeEvents=Time\ntouchEvents=Touch\notherEvents=Other\n\n# LOCALIZATION NOTE (blackboxCheckboxTooltip2): The tooltip text to display when\n# the user hovers over the checkbox used to toggle blackboxing its associated\n# source.\nblackboxCheckboxTooltip2=Toggle blackboxing\n\n# LOCALIZATION NOTE (sources.search.key2): Key shortcut to open the search for\n# searching all the source files the debugger has seen.\nsources.search.key2=CmdOrCtrl+P\n\n# LOCALIZATION NOTE (sources.search.alt.key): A second key shortcut to open the\n# search for searching all the source files the debugger has seen.\nsources.search.alt.key=CmdOrCtrl+O\n\n# LOCALIZATION NOTE (projectTextSearch.key): A key shortcut to open the\n# full project text search for searching all the files the debugger has seen.\nprojectTextSearch.key=CmdOrCtrl+Shift+F\n\n# LOCALIZATION NOTE (functionSearch.key): A key shortcut to open the\n# modal for searching functions in a file.\nfunctionSearch.key=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE (toggleBreakpoint.key): A key shortcut to toggle\n# breakpoints.\ntoggleBreakpoint.key=CmdOrCtrl+B\n\n# LOCALIZATION NOTE (toggleCondPanel.key): A key shortcut to toggle\n# the conditional breakpoint panel.\ntoggleCondPanel.key=CmdOrCtrl+Shift+B\n\n# LOCALIZATION NOTE (stepOut.key): A key shortcut to\n# step out.\nstepOut.key=Shift+F11\n\n# LOCALIZATION NOTE (shortcuts.header.editor): Sections header in\n# the shortcuts modal for keyboard shortcuts related to editing.\nshortcuts.header.editor=Editor\n\n# LOCALIZATION NOTE (shortcuts.header.stepping): Sections header in\n# the shortcuts modal for keyboard shortcuts related to stepping.\nshortcuts.header.stepping=Stepping\n\n# LOCALIZATION NOTE (shortcuts.header.search): Sections header in\n# the shortcuts modal for keyboard shortcuts related to search.\nshortcuts.header.search=Search\n\n# LOCALIZATION NOTE (projectTextSearch.placeholder): A placeholder shown\n# when searching across all of the files in a project.\nprojectTextSearch.placeholder=Find in files…\n\n# LOCALIZATION NOTE (projectTextSearch.noResults): The center pane Text Search\n# message when the query did not match any text of all files in a project.\nprojectTextSearch.noResults=No results found\n\n# LOCALIZATION NOTE (sources.noSourcesAvailable): Text shown when the debugger\n# does not have any sources.\nsources.noSourcesAvailable=This page has no sources\n\n# LOCALIZATION NOTE (sourceSearch.search.key2): Key shortcut to open the search\n# for searching within a the currently opened files in the editor\nsourceSearch.search.key2=CmdOrCtrl+F\n\n# LOCALIZATION NOTE (sourceSearch.search.placeholder): placeholder text in\n# the source search input bar\nsourceSearch.search.placeholder=Search in file…\n\n# LOCALIZATION NOTE (sourceSearch.search.again.key2): Key shortcut to highlight\n# the next occurrence of the last search triggered from a source search\nsourceSearch.search.again.key2=CmdOrCtrl+G\n\n# LOCALIZATION NOTE (sourceSearch.search.againPrev.key2): Key shortcut to highlight\n# the previous occurrence of the last search triggered from a source search\nsourceSearch.search.againPrev.key2=CmdOrCtrl+Shift+G\n\n# LOCALIZATION NOTE (sourceSearch.resultsSummary1): Shows a summary of\n# the number of matches for autocomplete\nsourceSearch.resultsSummary1=%d results\n\n# LOCALIZATION NOTE (noMatchingStringsText): The text to display in the\n# global search results when there are no matching strings after filtering.\nnoMatchingStringsText=No matches found\n\n# LOCALIZATION NOTE (emptySearchText): This is the text that appears in the\n# filter text box when it is empty and the scripts container is selected.\nemptySearchText=Search scripts (%S)\n\n# LOCALIZATION NOTE (emptyVariablesFilterText): This is the text that\n# appears in the filter text box for the variables view container.\nemptyVariablesFilterText=Filter variables\n\n# LOCALIZATION NOTE (emptyPropertiesFilterText): This is the text that\n# appears in the filter text box for the editor's variables view bubble.\nemptyPropertiesFilterText=Filter properties\n\n# LOCALIZATION NOTE (searchPanelFilter): This is the text that appears in the\n# filter panel popup for the filter scripts operation.\nsearchPanelFilter=Filter scripts (%S)\n\n# LOCALIZATION NOTE (searchPanelGlobal): This is the text that appears in the\n# filter panel popup for the global search operation.\nsearchPanelGlobal=Search in all files (%S)\n\n# LOCALIZATION NOTE (searchPanelFunction): This is the text that appears in the\n# filter panel popup for the function search operation.\nsearchPanelFunction=Search for function definition (%S)\n\n# LOCALIZATION NOTE (searchPanelToken): This is the text that appears in the\n# filter panel popup for the token search operation.\nsearchPanelToken=Find in this file (%S)\n\n# LOCALIZATION NOTE (searchPanelGoToLine): This is the text that appears in the\n# filter panel popup for the line search operation.\nsearchPanelGoToLine=Go to line (%S)\n\n# LOCALIZATION NOTE (searchPanelVariable): This is the text that appears in the\n# filter panel popup for the variables search operation.\nsearchPanelVariable=Filter variables (%S)\n\n# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that\n# are displayed in the breakpoints menu item popup.\nbreakpointMenuItem.setConditional=Configure conditional breakpoint\nbreakpointMenuItem.enableSelf2.label=Enable\nbreakpointMenuItem.enableSelf2.accesskey=E\nbreakpointMenuItem.disableSelf2.label=Disable\nbreakpointMenuItem.disableSelf2.accesskey=D\nbreakpointMenuItem.deleteSelf2.label=Remove\nbreakpointMenuItem.deleteSelf2.accesskey=R\nbreakpointMenuItem.enableOthers2.label=Enable others\nbreakpointMenuItem.enableOthers2.accesskey=o\nbreakpointMenuItem.disableOthers2.label=Disable others\nbreakpointMenuItem.disableOthers2.accesskey=s\nbreakpointMenuItem.deleteOthers2.label=Remove others\nbreakpointMenuItem.deleteOthers2.accesskey=h\nbreakpointMenuItem.enableAll2.label=Enable all\nbreakpointMenuItem.enableAll2.accesskey=b\nbreakpointMenuItem.disableAll2.label=Disable all\nbreakpointMenuItem.disableAll2.accesskey=k\nbreakpointMenuItem.deleteAll2.label=Remove all\nbreakpointMenuItem.deleteAll2.accesskey=a\nbreakpointMenuItem.removeCondition2.label=Remove condition\nbreakpointMenuItem.removeCondition2.accesskey=c\nbreakpointMenuItem.addCondition2.label=Add condition\nbreakpointMenuItem.addCondition2.accesskey=A\nbreakpointMenuItem.editCondition2.label=Edit condition\nbreakpointMenuItem.editCondition2.accesskey=n\nbreakpointMenuItem.enableSelf=Enable breakpoint\nbreakpointMenuItem.enableSelf.accesskey=E\nbreakpointMenuItem.disableSelf=Disable breakpoint\nbreakpointMenuItem.disableSelf.accesskey=D\nbreakpointMenuItem.deleteSelf=Remove breakpoint\nbreakpointMenuItem.deleteSelf.accesskey=R\nbreakpointMenuItem.enableOthers=Enable others\nbreakpointMenuItem.enableOthers.accesskey=o\nbreakpointMenuItem.disableOthers=Disable others\nbreakpointMenuItem.disableOthers.accesskey=s\nbreakpointMenuItem.deleteOthers=Remove others\nbreakpointMenuItem.deleteOthers.accesskey=h\nbreakpointMenuItem.enableAll=Enable all breakpoints\nbreakpointMenuItem.enableAll.accesskey=b\nbreakpointMenuItem.disableAll=Disable all breakpoints\nbreakpointMenuItem.disableAll.accesskey=k\nbreakpointMenuItem.deleteAll=Remove all breakpoints\nbreakpointMenuItem.deleteAll.accesskey=a\nbreakpointMenuItem.removeCondition.label=Remove breakpoint condition\nbreakpointMenuItem.removeCondition.accesskey=c\nbreakpointMenuItem.editCondition.label=Edit breakpoint condition\nbreakpointMenuItem.editCondition.accesskey=n\n\n# LOCALIZATION NOTE (breakpoints.header): Breakpoints right sidebar pane header.\nbreakpoints.header=Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.none): The text that appears when there are\n# no breakpoints present\nbreakpoints.none=No breakpoints\n\n# LOCALIZATION NOTE (breakpoints.enable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.enable=Enable breakpoints\n\n# LOCALIZATION NOTE (breakpoints.disable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.disable=Disable breakpoints\n\n# LOCALIZATION NOTE (breakpoints.removeBreakpointTooltip): The tooltip that is displayed\n# for remove breakpoint button in right sidebar\nbreakpoints.removeBreakpointTooltip=Remove breakpoint\n\n# LOCALIZATION NOTE (callStack.header): Call Stack right sidebar pane header.\ncallStack.header=Call stack\n\n# LOCALIZATION NOTE (callStack.notPaused): Call Stack right sidebar pane\n# message when not paused.\ncallStack.notPaused=Not paused\n\n# LOCALIZATION NOTE (callStack.collapse): Call Stack right sidebar pane\n# message to hide some of the frames that are shown.\ncallStack.collapse=Collapse rows\n\n# LOCALIZATION NOTE (callStack.expand): Call Stack right sidebar pane\n# message to show more of the frames.\ncallStack.expand=Expand rows\n\n# LOCALIZATION NOTE (editor.searchResults): Editor Search bar message\n# for the summarizing the selected search result. e.g. 5 of 10 results.\neditor.searchResults=%d of %d results\n\n# LOCALIZATION NOTE (sourceSearch.singleResult): Copy shown when there is one result.\neditor.singleResult=1 result\n\n# LOCALIZATION NOTE (editor.noResults): Editor Search bar message\n# for when no results found.\neditor.noResults=No results\n\n# LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar\n# tooltip for traversing to the Next Result\neditor.searchResults.nextResult=Next result\n\n# LOCALIZATION NOTE (editor.searchResults.prevResult): Editor Search bar\n# tooltip for traversing to the Previous Result\neditor.searchResults.prevResult=Previous result\n\n# LOCALIZATION NOTE (editor.searchTypeToggleTitle): Search bar title for\n# toggling search type buttons(function search, variable search)\neditor.searchTypeToggleTitle=Search for:\n\n# LOCALIZATION NOTE (editor.continueToHere.label): Editor gutter context\n# menu item for jumping to a new paused location\neditor.continueToHere.label=Continue to here\neditor.continueToHere.accesskey=H\n\n# LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item\n# for adding a breakpoint on a line.\neditor.addBreakpoint=Add breakpoint\n\n# LOCALIZATION NOTE (editor.disableBreakpoint): Editor gutter context menu item\n# for disabling a breakpoint on a line.\neditor.disableBreakpoint=Disable breakpoint\neditor.disableBreakpoint.accesskey=D\n\n# LOCALIZATION NOTE (editor.enableBreakpoint): Editor gutter context menu item\n# for enabling a breakpoint on a line.\neditor.enableBreakpoint=Enable breakpoint\n\n# LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item\n# for removing a breakpoint on a line.\neditor.removeBreakpoint=Remove breakpoint\n\n# LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item\n# for setting a breakpoint condition on a line.\neditor.editBreakpoint=Edit breakpoint\n\n# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context\n# menu item for adding a breakpoint condition on a line.\neditor.addConditionalBreakpoint=Add conditional breakpoint\neditor.addConditionalBreakpoint.accesskey=c\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for\n# input element inside ConditionalPanel component\neditor.conditionalPanel.placeholder=This breakpoint will pause when the expression is true\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Tooltip text for\n# close button inside ConditionalPanel component\neditor.conditionalPanel.close=Cancel edit breakpoint and close\n\n# LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item\n# for navigating to a source mapped location\neditor.jumpToMappedLocation1=Jump to %S location\neditor.jumpToMappedLocation1.accesskey=m\n\n# LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the\n# context menu to disable framework grouping.\nframework.disableGrouping=Disable framework grouping\nframework.disableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the\n# context menu to enable framework grouping.\nframework.enableGrouping=Enable framework grouping\nframework.enableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (generated): Source Map term for a server source location\ngenerated=Generated\n\n# LOCALIZATION NOTE (original): Source Map term for a debugger UI source location\noriginal=original\n\n# LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression\n# input element\nexpressions.placeholder=Add watch expression\nexpressions.label=Add watch expression\nexpressions.accesskey=e\n\n# LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item\n# for closing the selected tab below the mouse.\nsourceTabs.closeTab=Close tab\nsourceTabs.closeTab.accesskey=c\n\n# LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item\n# for closing the other tabs.\nsourceTabs.closeOtherTabs=Close other tabs\nsourceTabs.closeOtherTabs.accesskey=o\n\n# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd): Editor source tab context menu item\n# for closing the tabs to the end (the right for LTR languages) of the selected tab.\nsourceTabs.closeTabsToEnd=Close tabs to the right\nsourceTabs.closeTabsToEnd.accesskey=e\n\n# LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item\n# for closing all tabs.\nsourceTabs.closeAllTabs=Close all tabs\nsourceTabs.closeAllTabs.accesskey=a\n\n# LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item\n# for revealing source in tree.\nsourceTabs.revealInTree=Reveal in tree\nsourceTabs.revealInTree.accesskey=r\n\n# LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item\n# for pretty printing the source.\nsourceTabs.prettyPrint=Pretty print source\nsourceTabs.prettyPrint.accesskey=p\n\n# LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.blackbox=Blackbox source\nsourceFooter.blackbox.accesskey=B\n\n# LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.unblackbox=Unblackbox source\nsourceFooter.unblackbox.accesskey=b\n\n# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated\n# with a blackboxed source\nsourceFooter.blackboxed=Blackboxed source\n\n# LOCALIZATION NOTE (sourceFooter.codeCoverage): Text associated\n# with a code coverage button\nsourceFooter.codeCoverage=Code coverage\n\n# LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed\n# for close tab button in source tabs.\nsourceTabs.closeTabButtonTooltip=Close tab\n\n# LOCALIZATION NOTE (scopes.header): Scopes right sidebar pane header.\nscopes.header=Scopes\n\n# LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message\n# for when the debugger is paused, but there isn't pause data.\nscopes.notAvailable=Scopes unavailable\n\n# LOCALIZATION NOTE (scopes.notPaused): Scopes right sidebar pane message\n# for when the debugger is not paused.\nscopes.notPaused=Not paused\n\n# LOCALIZATION NOTE (scopes.block): Refers to a block of code in\n# the scopes pane when the debugger is paused.\nscopes.block=Block\n\n# LOCALIZATION NOTE (sources.header): Sources left sidebar header\nsources.header=Sources\n\n# LOCALIZATION NOTE (outline.header): Outline left sidebar header\noutline.header=Outline\n\n# LOCALIZATION NOTE (outline.noFunctions): Outline text when there are no functions to display\noutline.noFunctions=No functions\n\n# LOCALIZATION NOTE (sources.search): Sources left sidebar prompt\n# e.g. Cmd+P to search. On a mac, we use the command unicode character.\n# On windows, it's ctrl.\nsources.search=%S to search\n\n# LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar\n# pane header.\nwatchExpressions.header=Watch expressions\n\n# LOCALIZATION NOTE (watchExpressions.refreshButton): Watch Expressions header\n# button for refreshing the expressions.\nwatchExpressions.refreshButton=Refresh\n\n# LOCALIZATION NOTE (welcome.search): The center pane welcome panel's\n# search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on\n# a mac we use the unicode character.\nwelcome.search=%S to search for sources\n\n# LOCALIZATION NOTE (welcome.findInFiles): The center pane welcome panel's\n# search prompt. e.g. cmd+f to search for files. On windows, it's ctrl+shift+f, on\n# a mac we use the unicode character.\nwelcome.findInFiles=%S to find in files\n\n# LOCALIZATION NOTE (welcome.searchFunction): Label displayed in the welcome\n# panel. %S is replaced by the keyboard shortcut to search for functions.\nwelcome.searchFunction=%S to search for functions in file\n\n# LOCALIZATION NOTE (sourceSearch.search): The center pane Source Search\n# prompt for searching for files.\nsourceSearch.search=Search sources…\n\n# LOCALIZATION NOTE (sourceSearch.noResults): The center pane Source Search\n# message when the query did not match any of the sources.\nsourceSearch.noResults2=No results found\n\n# LOCALIZATION NOTE (ignoreExceptions): The pause on exceptions button tooltip\n# when the debugger will not pause on exceptions.\nignoreExceptions=Ignore exceptions. Click to pause on uncaught exceptions\n\n# LOCALIZATION NOTE (pauseOnUncaughtExceptions): The pause on exceptions button\n# tooltip when the debugger will pause on uncaught exceptions.\npauseOnUncaughtExceptions=Pause on uncaught exceptions. Click to pause on all exceptions\n\n# LOCALIZATION NOTE (pauseOnExceptions): The pause on exceptions button tooltip\n# when the debugger will pause on all exceptions.\npauseOnExceptions=Pause on all exceptions. Click to ignore exceptions\n\n# LOCALIZATION NOTE (loadingText): The text that is displayed in the script\n# editor when the loading process has started but there is no file to display\n# yet.\nloadingText=Loading\\u2026\n\n# LOCALIZATION NOTE (errorLoadingText3): The text that is displayed in the debugger\n# viewer when there is an error loading a file\nerrorLoadingText3=Error loading this URI: %S\n\n# LOCALIZATION NOTE (addWatchExpressionText): The text that is displayed in the\n# watch expressions list to add a new item.\naddWatchExpressionText=Add watch expression\n\n# LOCALIZATION NOTE (addWatchExpressionButton): The button that is displayed in the\n# variables view popup.\naddWatchExpressionButton=Watch\n\n# LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the\n# variables pane when there are no variables to display.\nemptyVariablesText=No variables to display\n\n# LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables\n# pane as a header for each variable scope (e.g. \"Global scope, \"With scope\",\n# etc.).\nscopeLabel=%S scope\n\n# LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch\n# expressions scope. This text is displayed in the variables pane as a header for\n# the watch expressions scope.\nwatchExpressionsScopeLabel=Watch expressions\n\n# LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text\n# is added to scopeLabel and displayed in the variables pane as a header for\n# the global scope.\nglobalScopeLabel=Global\n\n# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is\n# shown before the stack trace in an error.\nvariablesViewErrorStacktrace=Stack trace:\n\n# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed\n# when you have an object preview that does not show all of the elements. At the end of the list\n# you see \"N more...\" in the web console output.\n# This is a semi-colon list of plural forms.\n# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals\n# #1 number of remaining items in the object\n# example: 3 more…\nvariablesViewMoreObjects=#1 more…;#1 more…\n\n# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed\n# in the variables list on an item with an editable name.\nvariablesEditableNameTooltip=Double click to edit\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in the variables list on an item with an editable value.\nvariablesEditableValueTooltip=Click to change value\n\n# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed\n# in the variables list on an item which can be removed.\nvariablesCloseButtonTooltip=Click to remove\n\n# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed\n# in the variables list on a getter or setter which can be edited.\nvariablesEditButtonTooltip=Click to set value\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in a tooltip on the \"open in inspector\" button in the the variables list for a\n# DOMNode item.\nvariablesDomNodeValueTooltip=Click to select the node in the inspector\n\n# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed\n# in the variables list on certain variables or properties as tooltips.\n# Expanations of what these represent can be found at the following links:\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed\n# It's probably best to keep these in English.\nconfigurableTooltip=configurable\nenumerableTooltip=enumerable\nwritableTooltip=writable\nfrozenTooltip=frozen\nsealedTooltip=sealed\nextensibleTooltip=extensible\noverriddenTooltip=overridden\nWebIDLTooltip=WebIDL\n\n# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed\n# in the variables list as a separator between the name and value.\nvariablesSeparatorLabel=:\n\n# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed\n# in the watch expressions list as a separator between the code and evaluation.\nwatchExpressionsSeparatorLabel2=\\u0020→\n\n# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed\n# in the functions search panel as a separator between function's inferred name\n# and its real name (if available).\nfunctionSearchSeparatorLabel=←\n\n# LOCALIZATION NOTE(gotoLineModal.placeholder): The placeholder\n# text displayed when the user searches for specific lines in a file\ngotoLineModal.placeholder=Go to line…\ngotoLineModal.key=CmdOrCtrl+Shift+;\n\n# LOCALIZATION NOTE(symbolSearch.search.functionsPlaceholder): The placeholder\n# text displayed when the user searches for functions in a file\nsymbolSearch.search.functionsPlaceholder=Search functions…\n\n# LOCALIZATION NOTE(symbolSearch.search.variablesPlaceholder): The placeholder\n# text displayed when the user searches for variables in a file\nsymbolSearch.search.variablesPlaceholder=Search variables…\n\n# LOCALIZATION NOTE(symbolSearch.search.key2): The Key Shortcut for\n# searching for a function or variable\nsymbolSearch.search.key2=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.modifiersLabel): A label\n# preceding the group of modifiers\nsymbolSearch.searchModifier.modifiersLabel=Modifiers:\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.regex): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.regex=Regex\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.caseSensitive): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.caseSensitive=Case sensitive\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.wholeWord): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.wholeWord=Whole word\n\n# LOCALIZATION NOTE (resumptionOrderPanelTitle): This is the text that appears\n# as a description in the notification panel popup, when multiple debuggers are\n# open in separate tabs and the user tries to resume them in the wrong order.\n# The substitution parameter is the URL of the last paused window that must be\n# resumed first.\nresumptionOrderPanelTitle=There are one or more paused debuggers. Please resume the most-recently paused debugger first at: %S\n\nvariablesViewOptimizedOut=(optimized away)\nvariablesViewUninitialized=(uninitialized)\nvariablesViewMissingArgs=(unavailable)\n\nanonymousSourcesLabel=Anonymous sources\n\nexperimental=This is an experimental feature\n\n# LOCALIZATION NOTE (whyPaused.debuggerStatement): The text that is displayed\n# in a info block explaining how the debugger is currently paused due to a `debugger`\n# statement in the code\nwhyPaused.debuggerStatement=Paused on debugger statement\n\n# LOCALIZATION NOTE (whyPaused.breakpoint): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a breakpoint\nwhyPaused.breakpoint=Paused on breakpoint\n\n# LOCALIZATION NOTE (whyPaused.exception): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an exception\nwhyPaused.exception=Paused on exception\n\n# LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed\n# in a info block explaining how the debugger is currently paused while stepping\n# in or out of the stack\nwhyPaused.resumeLimit=Paused while stepping\n\n# LOCALIZATION NOTE (whyPaused.pauseOnDOMEvents): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# dom event\nwhyPaused.pauseOnDOMEvents=Paused on event listener\n\n# LOCALIZATION NOTE (whyPaused.breakpointConditionThrown): The text that is displayed\n# in an info block when evaluating a conditional breakpoint throws an error\nwhyPaused.breakpointConditionThrown=Error with conditional breakpoint\n\n# LOCALIZATION NOTE (whyPaused.xhr): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# xml http request\nwhyPaused.xhr=Paused on XMLHttpRequest\n\n# LOCALIZATION NOTE (whyPaused.promiseRejection): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# promise rejection\nwhyPaused.promiseRejection=Paused on promise rejection\n\n# LOCALIZATION NOTE (whyPaused.assert): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# assert\nwhyPaused.assert=Paused on assertion\n\n# LOCALIZATION NOTE (whyPaused.debugCommand): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# debugger statement\nwhyPaused.debugCommand=Paused on debugged function\n\n# LOCALIZATION NOTE (whyPaused.other): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an event\n# listener breakpoint set\nwhyPaused.other=Debugger paused\n\n# LOCALIZATION NOTE (ctrl): The text that is used for documenting\n# keyboard shortcuts that use the control key\nctrl=Ctrl\n\n# LOCALIZATION NOTE (anonymous): The text that is displayed when the\n# display name is null.\nanonymous=(anonymous)\n\n# LOCALIZATION NOTE (shortcuts.toggleBreakpoint): text describing\n# keyboard shortcut action for toggling breakpoint\nshortcuts.toggleBreakpoint=Toggle Breakpoint\nshortcuts.toggleBreakpoint.accesskey=B\n\n# LOCALIZATION NOTE (shortcuts.toggleCondPanel): text describing\n# keyboard shortcut action for toggling conditional panel keyboard\nshortcuts.toggleCondPanel=Toggle Conditional Panel\n\n# LOCALIZATION NOTE (shortcuts.pauseOrResume): text describing\n# keyboard shortcut action for pause of resume\nshortcuts.pauseOrResume=Pause/Resume\n\n# LOCALIZATION NOTE (shortcuts.stepOver): text describing\n# keyboard shortcut action for stepping over\nshortcuts.stepOver=Step Over\n\n# LOCALIZATION NOTE (shortcuts.stepIn): text describing\n# keyboard shortcut action for stepping in\nshortcuts.stepIn=Step In\n\n# LOCALIZATION NOTE (shortcuts.stepOut): text describing\n# keyboard shortcut action for stepping out\nshortcuts.stepOut=Step Out\n\n# LOCALIZATION NOTE (shortcuts.fileSearch): text describing\n# keyboard shortcut action for source file search\nshortcuts.fileSearch=Source File Search\n\n# LOCALIZATION NOTE (shortcuts.searchAgain): text describing\n# keyboard shortcut action for searching again\nshortcuts.searchAgain=Search Again\n\n# LOCALIZATION NOTE (shortcuts.projectSearch): text describing\n# keyboard shortcut action for full project search\nshortcuts.projectSearch=Full Project Search\n\n# LOCALIZATION NOTE (shortcuts.functionSearch): text describing\n# keyboard shortcut action for function search\nshortcuts.functionSearch=Function Search\n\n# LOCALIZATION NOTE (shortcuts.buttonName): text describing\n# keyboard shortcut button text\nshortcuts.buttonName=Keyboard shortcuts\n"
 
 /***/ }),
 /* 961 */,
 /* 962 */,
 /* 963 */,
 /* 964 */,
 /* 965 */
 /***/ (function(module, exports) {
@@ -16186,22 +16186,17 @@ module.exports = "<svg version=\"1.1\" x
 
 /***/ }),
 /* 1296 */
 /***/ (function(module, exports) {
 
 // removed by extract-text-webpack-plugin
 
 /***/ }),
-/* 1297 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 1297 */,
 /* 1298 */
 /***/ (function(module, exports) {
 
 // removed by extract-text-webpack-plugin
 
 /***/ }),
 /* 1299 */
 /***/ (function(module, exports) {
@@ -16294,22 +16289,17 @@ module.exports = "<svg version=\"1.1\" x
 
 /***/ }),
 /* 1314 */
 /***/ (function(module, exports) {
 
 // removed by extract-text-webpack-plugin
 
 /***/ }),
-/* 1315 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 1315 */,
 /* 1316 */
 /***/ (function(module, exports) {
 
 // removed by extract-text-webpack-plugin
 
 /***/ }),
 /* 1317 */
 /***/ (function(module, exports) {
@@ -16552,19 +16542,19 @@ var ast = _interopRequireWildcard(_ast);
 var _coverage = __webpack_require__(1423);
 
 var coverage = _interopRequireWildcard(_coverage);
 
 var _projectTextSearch = __webpack_require__(1424);
 
 var projectTextSearch = _interopRequireWildcard(_projectTextSearch);
 
-var _sourceSearch = __webpack_require__(1425);
-
-var sourceSearch = _interopRequireWildcard(_sourceSearch);
+var _quickOpen = __webpack_require__(1635);
+
+var quickOpen = _interopRequireWildcard(_quickOpen);
 
 var _sourceTree = __webpack_require__(1426);
 
 var sourceTree = _interopRequireWildcard(_sourceTree);
 
 var _breakpointAtLocation = __webpack_require__(1503);
 
 var _breakpointAtLocation2 = _interopRequireDefault(_breakpointAtLocation);
@@ -16584,17 +16574,17 @@ var _isSelectedFrameVisible2 = _interopR
 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)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 
 /**
  * @param object - location
  */
 
-module.exports = _extends({}, expressions, sources, pause, debuggee, breakpoints, pendingBreakpoints, eventListeners, ui, ast, coverage, fileSearch, projectTextSearch, sourceSearch, sourceTree, {
+module.exports = _extends({}, expressions, sources, pause, debuggee, breakpoints, pendingBreakpoints, eventListeners, ui, ast, coverage, fileSearch, projectTextSearch, quickOpen, sourceTree, {
   getBreakpointAtLocation: _breakpointAtLocation2.default,
   getInScopeLines: _linesInScope2.default,
   getVisibleBreakpoints: _visibleBreakpoints2.default,
   isSelectedFrameVisible: _isSelectedFrameVisible2.default
 });
 
 /***/ }),
 /* 1353 */
@@ -17031,17 +17021,17 @@ var expressions = _interopRequireWildcar
 var _eventListeners = __webpack_require__(1527);
 
 var eventListeners = _interopRequireWildcard(_eventListeners);
 
 var _sources = __webpack_require__(1373);
 
 var sources = _interopRequireWildcard(_sources);
 
-var _pause = __webpack_require__(1528);
+var _pause = __webpack_require__(1639);
 
 var pause = _interopRequireWildcard(_pause);
 
 var _navigation = __webpack_require__(1529);
 
 var navigation = _interopRequireWildcard(_navigation);
 
 var _ui = __webpack_require__(1385);
@@ -17059,19 +17049,19 @@ var ast = _interopRequireWildcard(_ast);
 var _coverage = __webpack_require__(1531);
 
 var coverage = _interopRequireWildcard(_coverage);
 
 var _projectTextSearch = __webpack_require__(1433);
 
 var projectTextSearch = _interopRequireWildcard(_projectTextSearch);
 
-var _sourceSearch = __webpack_require__(1434);
-
-var sourceSearch = _interopRequireWildcard(_sourceSearch);
+var _quickOpen = __webpack_require__(1647);
+
+var quickOpen = _interopRequireWildcard(_quickOpen);
 
 var _sourceTree = __webpack_require__(1532);
 
 var sourceTree = _interopRequireWildcard(_sourceTree);
 
 var _loadSourceText = __webpack_require__(1435);
 
 var loadSourceText = _interopRequireWildcard(_loadSourceText);
@@ -17081,17 +17071,17 @@ var _debuggee = __webpack_require__(1533
 var debuggee = _interopRequireWildcard(_debuggee);
 
 var _toolbox = __webpack_require__(1534);
 
 var toolbox = _interopRequireWildcard(_toolbox);
 
 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)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 
-exports.default = Object.assign({}, navigation, breakpoints, expressions, eventListeners, sources, pause, ui, fileSearch, ast, coverage, projectTextSearch, sourceSearch, sourceTree, loadSourceText, debuggee, toolbox);
+exports.default = Object.assign({}, navigation, breakpoints, expressions, eventListeners, sources, pause, ui, fileSearch, ast, coverage, projectTextSearch, quickOpen, sourceTree, loadSourceText, debuggee, toolbox);
 
 /***/ }),
 /* 1355 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -17487,16 +17477,25 @@ function toEditorRange(sourceId, locatio
     end: toEditorPosition(sourceId, end)
   };
 }
 
 function toSourceLine(sourceId, line) {
   return (0, _wasm.isWasm)(sourceId) ? (0, _wasm.lineToWasmOffset)(sourceId, line) : line + 1;
 }
 
+function scrollToColumn(codeMirror, line, column) {
+  const { top, left } = codeMirror.charCoords({ line: line, ch: column }, "local");
+
+  const centeredX = left - codeMirror.getScrollerElement().offsetWidth / 2;
+  const centeredY = top - codeMirror.getScrollerElement().offsetHeight / 2;
+
+  codeMirror.scrollTo(centeredX, centeredY);
+}
+
 function toSourceLocation(sourceId, location) {
   return {
     line: toSourceLine(sourceId, location.line),
     column: (0, _wasm.isWasm)(sourceId) ? undefined : location.column
   };
 }
 
 function markText(editor, className, location) {
@@ -17525,16 +17524,17 @@ function getSourceLocationFromMouseEvent
 
 module.exports = Object.assign({}, expressionUtils, sourceDocumentUtils, sourceSearchUtils, _devtoolsSourceEditor.SourceEditorUtils, {
   createEditor,
   isWasm: _wasm.isWasm,
   toEditorLine,
   toEditorPosition,
   toEditorRange,
   toSourceLine,
+  scrollToColumn,
   toSourceLocation,
   shouldShowPrettyPrint,
   shouldShowFooter,
   traverseResults,
   markText,
   lineAtHeight,
   getSourceLocationFromMouseEvent
 });
@@ -17703,16 +17703,30 @@ function updateTheme(className) {
     root.className = "";
     appRoot.className = className;
 
     root.classList.add(`theme-${theme}`);
     appRoot.classList.add(`theme-${theme}`);
   }
 }
 
+function updatePlatform(className) {
+  if (false) {
+    const root = document.body.parentNode;
+    const appRoot = document.querySelector(".launchpad-root");
+
+    const agent = navigator.userAgent.toLowerCase();
+    const win = agent.indexOf("windows") > -1 ? "win" : "linux";
+    const platform = agent.indexOf("mac os") > -1 ? "mac" : win;
+
+    root.classList.add("html");
+    appRoot.setAttribute("platform", platform);
+  }
+}
+
 function updateDir() {
   const dir = getValue("dir");
   const root = document.body.parentNode;
   root.dir = dir;
 }
 
 async function updateConfig() {
   const response = await fetch("/getconfig", {
@@ -17761,16 +17775,17 @@ function renderRoot(_React, _ReactDOM, c
 
   const className = "launchpad-root theme-body";
   const root = Root(className);
   mount.appendChild(root);
 
   if (isDevelopment()) {
     updateConfig();
     updateTheme(className);
+    updatePlatform();
   }
 
   if (component.props || component.propTypes) {
     _ReactDOM.render(createElement(Provider, { store: _store }, createElement(component, props)), root);
   } else {
     root.appendChild(component);
   }
 }
@@ -18182,20 +18197,16 @@ function _asyncToGenerator(fn) { return 
 
 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/. */
 
-const mark = typeof window == "object" && window.performance && window.performance.mark ? window.performance.mark.bind(window.performance) : () => {};
-
-const measure = typeof window == "object" && window.performance && window.performance.measure ? window.performance.measure.bind(window.performance) : () => {};
-
 WorkerDispatcher.prototype = {
   start(url) {
     this.worker = new Worker(url);
     this.worker.onerror = () => {
       console.error(`Error in worker ${url}`);
     };
   },
 
@@ -18207,35 +18218,28 @@ WorkerDispatcher.prototype = {
     this.worker.terminate();
     this.worker = null;
   },
 
   task(method) {
     return (...args) => {
       return new Promise((resolve, reject) => {
         const id = this.msgId++;
-
-        mark(`${method}_start`);
-
         this.worker.postMessage({ id, method, args });
 
         const listener = ({ data: result }) => {
           if (result.id !== id) {
             return;
           }
 
           if (!this.worker) {
             reject("Oops, The worker has shutdown!");
             return;
           }
           this.worker.removeEventListener("message", listener);
-
-          mark(`${method}_end`);
-          measure(`${method}`, `${method}_start`, `${method}_end`);
-
           if (result.error) {
             reject(result.error);
           } else {
             resolve(result.response);
           }
         };
 
         this.worker.addEventListener("message", listener);
@@ -18329,16 +18333,27 @@ module.exports = {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.getSelectedSourceText = exports.getSelectedSource = exports.getSelectedLocation = exports.getSourcesForTabs = exports.getSearchTabs = exports.getSourceTabs = exports.getSources = undefined;
+
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+/* 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 reducer
+ * @module reducers/sources
+ */
+
 exports.initialState = initialState;
 exports.removeSourceFromTabList = removeSourceFromTabList;
 exports.removeSourcesFromTabList = removeSourcesFromTabList;
 exports.getNewSelectedSourceId = getNewSelectedSourceId;
 exports.getSource = getSource;
 exports.getSourceByURL = getSourceByURL;
 exports.getPendingSelectedLocation = getPendingSelectedLocation;
 exports.getPrettySource = getPrettySource;
@@ -18366,24 +18381,16 @@ function initialState() {
   return (0, _makeRecord2.default)({
     sources: I.Map(),
     selectedLocation: undefined,
     pendingSelectedLocation: _prefs.prefs.pendingSelectedLocation,
     sourcesText: I.Map(),
     tabs: I.List(restoreTabs())
   })();
 }
-/* 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 reducer
- * @module reducers/sources
- */
 
 function update(state = initialState(), action) {
   let location = null;
 
   switch (action.type) {
     case "ADD_SOURCE":
       {
         const source = action.source;
@@ -18399,26 +18406,24 @@ function update(state = initialState(), 
         return state;
       }
 
     case "SELECT_SOURCE":
       if (action.status != "start") {
         return state;
       }
 
-      location = {
-        line: action.line,
+      location = _extends({}, action.location, {
         url: action.source.url
-      };
+      });
 
       _prefs.prefs.pendingSelectedLocation = location;
-      return state.set("selectedLocation", {
-        sourceId: action.source.id,
-        line: action.line
-      }).set("pendingSelectedLocation", location);
+      return state.set("selectedLocation", _extends({
+        sourceId: action.source.id
+      }, action.location)).set("pendingSelectedLocation", location);
 
     case "CLEAR_SELECTED_SOURCE":
       location = { url: "" };
       _prefs.prefs.pendingSelectedLocation = location;
 
       return state.set("selectedLocation", { sourceId: "" }).set("pendingSelectedLocation", location);
 
     case "SELECT_SOURCE_URL":
@@ -19001,17 +19006,16 @@ exports.selectSource = selectSource;
 exports.jumpToMappedLocation = jumpToMappedLocation;
 exports.addTab = addTab;
 exports.moveTab = moveTab;
 exports.closeTab = closeTab;
 exports.closeTabs = closeTabs;
 exports.togglePrettyPrint = togglePrettyPrint;
 exports.toggleBlackBox = toggleBlackBox;
 exports.loadAllSources = loadAllSources;
-exports.ensureParserHasSourceText = ensureParserHasSourceText;
 
 var _promise = __webpack_require__(1370);
 
 var _assert = __webpack_require__(1384);
 
 var _assert2 = _interopRequireDefault(_assert);
 
 var _breakpoints = __webpack_require__(1396);
@@ -19029,47 +19033,39 @@ var _createPrettySource = __webpack_requ
 var _loadSourceText = __webpack_require__(1435);
 
 var _prefs = __webpack_require__(226);
 
 var _editor = __webpack_require__(1358);
 
 var _sourceMaps = __webpack_require__(1397);
 
-var _parser = __webpack_require__(1365);
-
-var parser = _interopRequireWildcard(_parser);
-
-var _selectors = __webpack_require__(1352);
-
-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)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+var _selectors = __webpack_require__(1352);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 // If a request has been made to show this source, go ahead and
 // select it.
-
+async function checkSelectedSource(state, dispatch, source) {
+  const pendingLocation = (0, _selectors.getPendingSelectedLocation)(state);
+
+  if (pendingLocation && !!source.url && pendingLocation.url === source.url) {
+    await dispatch(selectSource(source.id, { location: pendingLocation }));
+  }
+}
 
 /* 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 the sources state
  * @module actions/sources
  */
 
-async function checkSelectedSource(state, dispatch, source) {
-  const pendingLocation = (0, _selectors.getPendingSelectedLocation)(state);
-
-  if (pendingLocation && !!source.url && pendingLocation.url === source.url) {
-    await dispatch(selectSource(source.id, { line: pendingLocation.line }));
-  }
-}
-
 async function checkPendingBreakpoints(state, dispatch, sourceId) {
   // source may have been modified by selectSource
   const source = (0, _selectors.getSource)(state, sourceId).toJS();
   const pendingBreakpoints = (0, _selectors.getPendingBreakpointsForSource)(state, source.url);
   if (!pendingBreakpoints.size) {
     return;
   }
 
@@ -19132,16 +19128,17 @@ function loadSourceMap(generatedSource) 
       isPrettyPrinted: false,
       isWasm: false,
       isBlackBoxed: false,
       loadedState: "unloaded"
     }));
 
     dispatch({ type: "ADD_SOURCES", sources: originalSources });
 
+    await dispatch((0, _loadSourceText.loadSourceText)(generatedSource));
     originalSources.forEach(async source => {
       await checkSelectedSource(getState(), dispatch, source);
       checkPendingBreakpoints(getState(), dispatch, source.id);
     });
   };
 }
 
 /**
@@ -19158,17 +19155,17 @@ function selectSourceURL(url, options = 
     const source = (0, _selectors.getSourceByURL)(getState(), url);
     if (source) {
       await dispatch(selectSource(source.get("id"), options));
     } else {
       dispatch({
         type: "SELECT_SOURCE_URL",
         url: url,
         tabIndex: options.tabIndex,
-        line: options.line
+        location: options.location
       });
     }
   };
 }
 
 /**
  * @memberof actions/sources
  * @static
@@ -19193,17 +19190,17 @@ function selectSource(id, options = {}) 
     }
 
     dispatch(addTab(source.toJS(), 0));
 
     return dispatch({
       type: "SELECT_SOURCE",
       source: source.toJS(),
       tabIndex: options.tabIndex,
-      line: options.line,
+      location: options.location || {},
       [_promise.PROMISE]: (async () => {
         await dispatch((0, _loadSourceText.loadSourceText)(source.toJS()));
         await dispatch((0, _ast.setOutOfScopeLocations)());
       })()
     });
   };
 }
 
@@ -19220,17 +19217,17 @@ function jumpToMappedLocation(sourceLoca
     const source = (0, _selectors.getSource)(getState(), sourceLocation.sourceId);
     let pairedLocation;
     if (sourceMaps.isOriginalId(sourceLocation.sourceId)) {
       pairedLocation = await (0, _sourceMaps.getGeneratedLocation)(getState(), source.toJS(), sourceLocation, sourceMaps);
     } else {
       pairedLocation = await sourceMaps.getOriginalLocation(sourceLocation, source.toJS());
     }
 
-    return dispatch(selectSource(pairedLocation.sourceId, { line: pairedLocation.line }));
+    return dispatch(selectSource(pairedLocation.sourceId, { location: pairedLocation }));
   };
 }
 
 function addTab(source, tabIndex) {
   return {
     type: "ADD_TAB",
     source,
     tabIndex
@@ -19306,28 +19303,25 @@ function togglePrettyPrint(sourceId) {
     const selectedLocation = (0, _selectors.getSelectedLocation)(getState());
     const selectedOriginalLocation = selectedLocation ? await sourceMaps.getOriginalLocation(selectedLocation) : {};
 
     const url = (0, _source2.getPrettySourceURL)(source.url);
     const prettySource = (0, _selectors.getSourceByURL)(getState(), url);
 
     if (prettySource) {
       return dispatch(selectSource(prettySource.get("id"), {
-        line: selectedOriginalLocation.line
+        location: selectedOriginalLocation
       }));
     }
 
-    const { source: newPrettySource } = await dispatch((0, _createPrettySource.createPrettySource)(sourceId));
-
+    const newPrettySource = await dispatch((0, _createPrettySource.createPrettySource)(sourceId));
     await dispatch((0, _breakpoints.remapBreakpoints)(sourceId));
     await dispatch((0, _ast.setEmptyLines)(newPrettySource.id));
 
-    return dispatch(selectSource(newPrettySource.id, {
-      line: selectedOriginalLocation.line
-    }));
+    return dispatch(selectSource(newPrettySource.id, { location: selectedOriginalLocation }));
   };
 }
 
 function toggleBlackBox(source) {
   return async ({ dispatch, getState, client, sourceMaps }) => {
     const { isBlackBoxed, id } = source;
 
     return dispatch({
@@ -19358,31 +19352,16 @@ function loadAllSources() {
       // each of the source texts as they get loaded
       if (query) {
         await dispatch((0, _projectTextSearch.searchSource)(source.id, query));
       }
     }
   };
 }
 
-/**
- * Ensures parser has source text
- *
- * @memberof actions/sources
- * @static
- */
-function ensureParserHasSourceText(sourceId) {
-  return async ({ dispatch, getState }) => {
-    if (!(await parser.hasSource(sourceId))) {
-      await dispatch((0, _loadSourceText.loadSourceText)((0, _selectors.getSource)(getState(), sourceId).toJS()));
-      await parser.setSource((0, _selectors.getSource)(getState(), sourceId).toJS());
-    }
-  };
-}
-
 /***/ }),
 /* 1374 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
@@ -19500,17 +19479,16 @@ module.exports = {
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.getHiddenBreakpointLocation = exports.getHiddenBreakpoint = undefined;
 
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 /* 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/. */
 
 /**
  * Breakpoints reducer
@@ -19519,31 +19497,31 @@ var _extends = Object.assign || function
 
 exports.initialState = initialState;
 exports.getBreakpoints = getBreakpoints;
 exports.getBreakpoint = getBreakpoint;
 exports.getBreakpointsDisabled = getBreakpointsDisabled;
 exports.getBreakpointsLoading = getBreakpointsLoading;
 exports.getBreakpointsForSource = getBreakpointsForSource;
 exports.getBreakpointForLine = getBreakpointForLine;
+exports.getHiddenBreakpoint = getHiddenBreakpoint;
+exports.getHiddenBreakpointLocation = getHiddenBreakpointLocation;
 
 var _immutable = __webpack_require__(146);
 
 var I = _interopRequireWildcard(_immutable);
 
 var _makeRecord = __webpack_require__(1361);
 
 var _makeRecord2 = _interopRequireDefault(_makeRecord);
 
 var _devtoolsSourceMap = __webpack_require__(1360);
 
 var _breakpoint = __webpack_require__(1364);
 
-var _reselect = __webpack_require__(993);
-
 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)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 
 function initialState() {
   return (0, _makeRecord2.default)({
     breakpoints: I.Map(),
     breakpointsDisabled: false
@@ -19684,27 +19662,27 @@ function getBreakpointsForSource(state, 
 function getBreakpointForLine(state, sourceId, line) {
   if (!sourceId) {
     return I.Map();
   }
   const breakpoints = getBreakpointsForSource(state, sourceId);
   return breakpoints.find(breakpoint => breakpoint.location.line === line);
 }
 
-const getHiddenBreakpoint = exports.getHiddenBreakpoint = (0, _reselect.createSelector)(getBreakpoints, function (breakpoints) {
-  const hiddenBreakpoints = breakpoints.valueSeq().filter(breakpoint => breakpoint.hidden).first();
-  return hiddenBreakpoints;
-});
-
-const getHiddenBreakpointLocation = exports.getHiddenBreakpointLocation = (0, _reselect.createSelector)(getHiddenBreakpoint, function (hiddenBreakpoint) {
+function getHiddenBreakpoint(state) {
+  return getBreakpoints(state).valueSeq().filter(breakpoint => breakpoint.hidden).first();
+}
+
+function getHiddenBreakpointLocation(state) {
+  const hiddenBreakpoint = getHiddenBreakpoint(state);
   if (!hiddenBreakpoint) {
     return null;
   }
   return hiddenBreakpoint.location;
-});
+}
 
 exports.default = update;
 
 /***/ }),
 /* 1379 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -19732,17 +19710,17 @@ var _Close = __webpack_require__(1374);
 
 var _Close2 = _interopRequireDefault(_Close);
 
 __webpack_require__(1313);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 const arrowBtn = (onClick, type, className, tooltip) => {
-  var props = {
+  const props = {
     onClick,
     type,
     className,
     title: tooltip,
     key: type
   };
 
   return _react2.default.createElement(
@@ -19751,20 +19729,26 @@ const arrowBtn = (onClick, type, classNa
     _react2.default.createElement(_Svg2.default, { name: type })
   );
 };
 
 class SearchInput extends _react.Component {
 
   componentDidMount() {
     this.$input.focus();
+    if (this.$input.value != "") {
+      this.$input.setSelectionRange(this.$input.value.length + 1, this.$input.value.length + 1);
+    }
   }
 
   componentDidUpdate() {
     this.$input.focus();
+    if (this.$input.value != "") {
+      this.$input.setSelectionRange(this.$input.value.length + 1, this.$input.value.length + 1);
+    }
   }
 
   shouldShowErrorEmoji() {
     const { count, query, showErrorEmoji } = this.props;
     return count === 0 && query.trim() !== "" && !showErrorEmoji;
   }
 
   renderSvg() {
@@ -19842,17 +19826,16 @@ class SearchInput extends _react.Compone
     );
   }
 }
 
 SearchInput.defaultProps = {
   size: "",
   showErrorEmoji: true
 };
-
 exports.default = SearchInput;
 
 /***/ }),
 /* 1380 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
@@ -19874,178 +19857,93 @@ var _devtoolsConfig = __webpack_require_
 var _utils = __webpack_require__(1366);
 
 var _source = __webpack_require__(1356);
 
 function getFrameUrl(frame) {
   return (0, _lodash.get)(frame, "source.url", "") || "";
 }
 
-function isBackbone(frame) {
-  return getFrameUrl(frame).match(/backbone/i);
-}
-
-function isJQuery(frame) {
-  return getFrameUrl(frame).match(/jquery/i);
-}
-
-function isReact(frame) {
-  return getFrameUrl(frame).match(/react/i);
-}
-
-function isImmutable(frame) {
-  return getFrameUrl(frame).match(/immutable/i);
-}
-
-function isWebpack(frame) {
-  return getFrameUrl(frame).match(/webpack\/bootstrap/i);
-}
-
-function isNodeInternal(frame) {
-  // starts with "internal/" OR no path, just "timers.js", "url.js" etc
-  // (normally frameUrl will be a FQ pathname)
-  return (/(^internal\/|^[^.\/]+\.js)/.test(getFrameUrl(frame))
-  );
-}
-
-function isExpress(frame) {
-  return (/node_modules\/express/.test(getFrameUrl(frame))
-  );
-}
-
-function isPug(frame) {
-  return (/node_modules\/pug/.test(getFrameUrl(frame))
-  );
-}
-
-function isExtJs(frame) {
-  return (/\/ext-all[\.\-]/.test(getFrameUrl(frame))
-  );
-}
-
-function isUnderscore(frame) {
-  return getFrameUrl(frame).match(/underscore/i);
-}
-
-function isLodash(frame) {
-  return getFrameUrl(frame).match(/lodash/i);
-}
-
-function isEmber(frame) {
-  return getFrameUrl(frame).match(/ember/i);
-}
-
-function isChoo(frame) {
-  return getFrameUrl(frame).match(/choo/i);
-}
-
-function isVueJS(frame) {
-  return getFrameUrl(frame).match(/vue\.js/i);
-}
-
-function isRxJs(frame) {
-  return getFrameUrl(frame).match(/rxjs/i);
-}
-
-function isAngular(frame) {
-  return getFrameUrl(frame).match(/angular/i);
-}
-
-function isRedux(frame) {
-  return getFrameUrl(frame).match(/redux/i);
-}
-
-function isDojo(frame) {
-  return getFrameUrl(frame).match(/dojo/i);
-}
-
-function isPreact(frame) {
-  return getFrameUrl(frame).match(/preact/i);
-}
+const libraryMap = [{
+  label: "Backbone",
+  pattern: /backbone/i
+}, {
+  label: "jQuery",
+  pattern: /jquery/i
+}, {
+  label: "Preact",
+  pattern: /preact/i
+}, {
+  label: "React",
+  pattern: /react/i
+}, {
+  label: "Immutable",
+  pattern: /immutable/i
+}, {
+  label: "Webpack",
+  pattern: /webpack\/bootstrap/i
+}, {
+  label: "Node",
+  pattern: /(^internal\/|^[^.\/]+\.js)/
+}, {
+  label: "Express",
+  pattern: /node_modules\/express/
+}, {
+  label: "Pug",
+  pattern: /node_modules\/pug/
+}, {
+  label: "ExtJS",
+  pattern: /\/ext-all[\.\-]/
+}, {
+  label: "Underscore",
+  pattern: /underscore/i
+}, {
+  label: "Lodash",
+  pattern: /lodash/i
+}, {
+  label: "Ember",
+  pattern: /ember/i
+}, {
+  label: "Choo",
+  pattern: /choo/i
+}, {
+  label: "VueJS",
+  pattern: /vue\.js/i
+}, {
+  label: "RxJS",
+  pattern: /rxjs/i
+}, {
+  label: "Angular",
+  pattern: /angular/i
+}, {
+  label: "Redux",
+  pattern: /redux/i
+}, {
+  label: "Dojo",
+  pattern: /dojo/i
+}, {
+  label: "Marko",
+  pattern: /marko/i
+}, {
+  label: "NuxtJS",
+  pattern: /[\._]nuxt/i
+}, {
+  label: "Aframe",
+  pattern: /aframe/i
+}, {
+  label: "NextJS",
+  pattern: /[\._]next/i
+}];
 
 function getLibraryFromUrl(frame) {
   // @TODO each of these fns calls getFrameUrl, just call it once
   // (assuming there's not more complex logic to identify a lib)
-
-  if (isBackbone(frame)) {
-    return "Backbone";
-  }
-
-  if (isJQuery(frame)) {
-    return "jQuery";
-  }
-
-  // Needs to remain before "react", otherwise "react" can also match "preact"
-  if (isPreact(frame)) {
-    return "Preact";
-  }
-
-  if (isReact(frame)) {
-    return "React";
-  }
-
-  if (isWebpack(frame)) {
-    return "Webpack";
-  }
-
-  if (isNodeInternal(frame)) {
-    return "Node";
-  }
-
-  if (isExpress(frame)) {
-    return "Express";
-  }
-
-  if (isChoo(frame)) {
-    return "Choo";
-  }
-
-  if (isPug(frame)) {
-    return "Pug";
-  }
-
-  if (isExtJs(frame)) {
-    return "ExtJS";
-  }
-
-  if (isUnderscore(frame)) {
-    return "Underscore";
-  }
-
-  if (isLodash(frame)) {
-    return "Lodash";
-  }
-
-  if (isEmber(frame)) {
-    return "Ember";
-  }
-
-  if (isVueJS(frame)) {
-    return "VueJS";
-  }
-
-  if (isRxJs(frame)) {
-    return "RxJS";
-  }
-
-  if (isAngular(frame)) {
-    return "Angular";
-  }
-
-  if (isRedux(frame)) {
-    return "Redux";
-  }
-
-  if (isDojo(frame)) {
-    return "Dojo";
-  }
-
-  if (isImmutable(frame)) {
-    return "Immutable";
-  }
+  const frameUrl = getFrameUrl(frame);
+  const match = (0, _lodash.find)(libraryMap, o => frameUrl.match(o.pattern));
+  return match && match.label;
 }
 
 const displayNameMap = {
   Backbone: {
     "extend/child": "Create Class",
     ".create": "Create Model"
   },
   jQuery: {
@@ -20165,17 +20063,17 @@ function collapseFrames(frames) {
   }
 
   items = addGroupToList(currentGroup, items);
   items = addGroupToList(lastGroup, items);
   return items;
 }
 
 function collapseLastFrames(frames) {
-  const index = (0, _lodash.findIndex)(frames, isWebpack);
+  const index = (0, _lodash.findIndex)(frames, frame => getFrameUrl(frame).match(/webpack\/bootstrap/i));
 
   if (index == -1) {
     return { newFrames: frames, lastGroup: [] };
   }
 
   const newFrames = frames.slice(0, index);
   const lastGroup = frames.slice(index);
   return { newFrames, lastGroup };
@@ -20587,48 +20485,36 @@ function assert(condition, message) {
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.setContextMenu = setContextMenu;
 exports.closeActiveSearch = closeActiveSearch;
 exports.setActiveSearch = setActiveSearch;
 exports.toggleFrameworkGrouping = toggleFrameworkGrouping;
-exports.setSelectedSymbolType = setSelectedSymbolType;
 exports.showSource = showSource;
 exports.togglePaneCollapse = togglePaneCollapse;
 exports.highlightLineRange = highlightLineRange;
 exports.clearHighlightLineRange = clearHighlightLineRange;
 exports.openConditionalPanel = openConditionalPanel;
 exports.closeConditionalPanel = closeConditionalPanel;
 exports.setProjectDirectoryRoot = setProjectDirectoryRoot;
 exports.setOrientation = setOrientation;
 
 var _selectors = __webpack_require__(1352);
 
-var _sourceSearch = __webpack_require__(1434);
-
 function setContextMenu(type, event) {
   return ({ dispatch }) => {
     dispatch({ type: "SET_CONTEXT_MENU", contextMenu: { type, event } });
   };
 }
-
 function closeActiveSearch() {
-  return ({ getState, dispatch }) => {
-    const activeSearch = (0, _selectors.getActiveSearch)(getState());
-
-    if (activeSearch == "source") {
-      dispatch((0, _sourceSearch.clearSourceSearchQuery)());
-    }
-
-    dispatch({
-      type: "TOGGLE_ACTIVE_SEARCH",
-      value: null
-    });
+  return {
+    type: "TOGGLE_ACTIVE_SEARCH",
+    value: null
   };
 }
 
 function setActiveSearch(activeSearch) {
   return ({ dispatch, getState }) => {
     const activeSearchState = (0, _selectors.getActiveSearch)(getState());
     if (activeSearchState === activeSearch) {
       return;
@@ -20645,25 +20531,16 @@ function toggleFrameworkGrouping(toggleV
   return ({ dispatch, getState }) => {
     dispatch({
       type: "TOGGLE_FRAMEWORK_GROUPING",
       value: toggleValue
     });
   };
 }
 
-function setSelectedSymbolType(symbolType) {
-  return ({ dispatch, getState }) => {
-    dispatch({
-      type: "SET_SYMBOL_SEARCH_TYPE",
-      symbolType
-    });
-  };
-}
-
 function showSource(sourceId) {
   return ({ dispatch, getState }) => {
     const source = (0, _selectors.getSource)(getState(), sourceId);
 
     dispatch({
       type: "SHOW_SOURCE",
       sourceUrl: ""
     });
@@ -21110,19 +20987,21 @@ exports.join = join;
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.getSelectedFrame = exports.getSelectedFrameId = exports.getLoadedObjects = exports.getPause = exports.State = undefined;
+exports.getSelectedFrame = exports.getLoadedObjects = exports.getPause = exports.State = undefined;
 
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+/* eslint complexity: ["error", 30]*/
+
 /* 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/. */
 
 /**
  * Pause reducer
  * @module reducers/pause
  */
@@ -21133,16 +21012,18 @@ exports.isEvaluatingExpression = isEvalu
 exports.pausedInEval = pausedInEval;
 exports.getLoadedObject = getLoadedObject;
 exports.getObjectProperties = getObjectProperties;
 exports.getIsWaitingOnBreak = getIsWaitingOnBreak;
 exports.getShouldPauseOnExceptions = getShouldPauseOnExceptions;
 exports.getShouldIgnoreCaughtExceptions = getShouldIgnoreCaughtExceptions;
 exports.getFrames = getFrames;
 exports.getFrameScopes = getFrameScopes;
+exports.getScopes = getScopes;
+exports.getSelectedFrameId = getSelectedFrameId;
 exports.getDebuggeeUrl = getDebuggeeUrl;
 exports.getChromeScopes = getChromeScopes;
 
 var _reselect = __webpack_require__(993);
 
 var _prefs = __webpack_require__(226);
 
 const State = exports.State = () => ({
@@ -21184,16 +21065,23 @@ function update(state = State(), action)
           pause: pauseInfo,
           selectedFrameId,
           frames,
           frameScopes,
           loadedObjects: objectMap
         });
       }
 
+    case "MAP_SCOPES":
+      const { frame, scopes } = action;
+      const selectedFrameId = frame.id;
+
+      return _extends({}, state, {
+        frameScopes: _extends({}, state.frameScopes, { [selectedFrameId]: scopes })
+      });
     case "RESUME":
       return Object.assign({}, state, {
         pause: null,
         frames: null,
         selectedFrameId: null,
         loadedObjects: {}
       });
 
@@ -21208,21 +21096,18 @@ function update(state = State(), action)
         return Object.assign({}, state, { pause, frames });
       }
 
       break;
     case "BREAK_ON_NEXT":
       return Object.assign({}, state, { isWaitingOnBreak: true });
 
     case "SELECT_FRAME":
-      const { frame, scopes } = action;
-      const selectedFrameId = frame.id;
       return _extends({}, state, {
-        frameScopes: _extends({}, state.frameScopes, { [selectedFrameId]: scopes }),
-        selectedFrameId
+        selectedFrameId: action.frame.id
       });
 
     case "LOAD_OBJECT_PROPERTIES":
       if (action.status === "start") {
         return _extends({}, state, {
           loadedObjects: _extends({}, state.loadedObjects, {
             [action.objectId]: {}
           })
@@ -21343,19 +21228,24 @@ function getShouldIgnoreCaughtExceptions
 function getFrames(state) {
   return state.pause.frames;
 }
 
 function getFrameScopes(state, frameId) {
   return state.pause.frameScopes[frameId];
 }
 
-const getSelectedFrameId = exports.getSelectedFrameId = (0, _reselect.createSelector)(getPauseState, pauseWrapper => {
-  return pauseWrapper.selectedFrameId;
-});
+function getScopes(state) {
+  const selectedFrameId = getSelectedFrameId(state);
+  return state.pause.frameScopes[selectedFrameId];
+}
+
+function getSelectedFrameId(state) {
+  return state.pause.selectedFrameId;
+}
 
 const getSelectedFrame = exports.getSelectedFrame = (0, _reselect.createSelector)(getSelectedFrameId, getFrames, (selectedFrameId, frames) => {
   if (!frames) {
     return null;
   }
   return frames.find(frame => frame.id == selectedFrameId);
 });
 
@@ -21822,18 +21712,16 @@ exports.evaluateExpressions = evaluateEx
 exports.getMappedExpression = getMappedExpression;
 
 var _selectors = __webpack_require__(1352);
 
 var _promise = __webpack_require__(1370);
 
 var _utils = __webpack_require__(1522);
 
-var _sources = __webpack_require__(1373);
-
 var _devtoolsSourceMap = __webpack_require__(1360);
 
 var _expressions = __webpack_require__(1437);
 
 var _parser = __webpack_require__(1365);
 
 var parser = _interopRequireWildcard(_parser);
 
@@ -21920,35 +21808,31 @@ function evaluateExpression(expression) 
     if (!expression.input) {
       console.warn("Expressions should not be empty");
       return;
     }
 
     let input = expression.input;
     const error = await parser.hasSyntaxError(input);
     if (error) {
-      debugger;
       return dispatch({
         type: "EVALUATE_EXPRESSION",
         input: expression.input,
         value: { input: expression.input, result: error }
       });
     }
 
     const frame = (0, _selectors.getSelectedFrame)(getState());
 
     if (frame) {
       const { location, generatedLocation } = frame;
       const source = (0, _selectors.getSource)(getState(), location.sourceId);
       const sourceId = source.get("id");
 
       if (!(0, _devtoolsSourceMap.isGeneratedId)(sourceId)) {
-        const generatedSourceId = generatedLocation.sourceId;
-        await dispatch((0, _sources.ensureParserHasSourceText)(generatedSourceId));
-
         input = await getMappedExpression({ sourceMaps }, generatedLocation, input);
       }
     }
 
     const frameId = (0, _selectors.getSelectedFrameId)(getState());
     return dispatch({
       type: "EVALUATE_EXPRESSION",
       input: expression.input,
@@ -21989,39 +21873,39 @@ var _extends = Object.assign || function
 exports.setSymbols = setSymbols;
 exports.setEmptyLines = setEmptyLines;
 exports.setOutOfScopeLocations = setOutOfScopeLocations;
 exports.clearPreview = clearPreview;
 exports.setPreview = setPreview;
 
 var _selectors = __webpack_require__(1352);
 
-var _sources = __webpack_require__(1373);
-
 var _expressions = __webpack_require__(1398);
 
 var _promise = __webpack_require__(1370);
 
 var _parser = __webpack_require__(1365);
 
+var _ast = __webpack_require__(1638);
+
 var _devtoolsSourceMap = __webpack_require__(1360);
 
 const extraProps = {
   react: { displayName: "this._reactInternalInstance.getName()" }
 };
 
 function setSymbols(sourceId) {
   return async ({ dispatch, getState }) => {
     const sourceRecord = (0, _selectors.getSource)(getState(), sourceId);
     if (!sourceRecord) {
       return;
     }
 
     const source = sourceRecord.toJS();
-    if (!source.text || (0, _selectors.hasSymbols)(getState(), source)) {
+    if (!source.text || source.isWasm || (0, _selectors.hasSymbols)(getState(), source)) {
       return;
     }
 
     const symbols = await (0, _parser.getSymbols)(source);
 
     dispatch({
       type: "SET_SYMBOLS",
       source,
@@ -22033,17 +21917,17 @@ function setSymbols(sourceId) {
 function setEmptyLines(sourceId) {
   return async ({ dispatch, getState }) => {
     const sourceRecord = (0, _selectors.getSource)(getState(), sourceId);
     if (!sourceRecord) {
       return;
     }
 
     const source = sourceRecord.toJS();
-    if (!source.text) {
+    if (!source.text || source.isWasm) {
       return;
     }
 
     const emptyLines = await (0, _parser.getEmptyLines)(source);
 
     dispatch({
       type: "SET_EMPTY_LINES",
       source,
@@ -22085,61 +21969,44 @@ function clearPreview() {
     }
 
     return dispatch({
       type: "CLEAR_SELECTION"
     });
   };
 }
 
-function findBestMatch(symbols, tokenPos, token) {
-  const { memberExpressions, identifiers } = symbols;
-  const { line, column } = tokenPos;
-  return identifiers.concat(memberExpressions).reduce((found, expression) => {
-    const overlaps = expression.location.start.line == line && expression.location.start.column <= column && expression.location.end.column >= column;
-
-    if (overlaps) {
-      return expression;
-    }
-
-    return found;
-  }, {});
-}
-
 function setPreview(token, tokenPos, cursorPos) {
   return async ({ dispatch, getState, client, sourceMaps }) => {
     const currentSelection = (0, _selectors.getPreview)(getState());
     if (currentSelection && currentSelection.updating) {
       return;
     }
 
     await dispatch({
       type: "SET_PREVIEW",
       [_promise.PROMISE]: async function () {
         const source = (0, _selectors.getSelectedSource)(getState());
         const _symbols = await (0, _parser.getSymbols)(source.toJS());
 
-        const found = findBestMatch(_symbols, tokenPos, token);
+        const found = (0, _ast.findBestMatchExpression)(_symbols, tokenPos, token);
         if (!found) {
           return;
         }
 
         let { expression, location } = found;
 
         if (!expression) {
           return;
         }
 
         const sourceId = source.get("id");
         if (location && !(0, _devtoolsSourceMap.isGeneratedId)(sourceId)) {
           const generatedLocation = await sourceMaps.getGeneratedLocation(_extends({}, location.start, { sourceId }), source.toJS());
 
-          const generatedSourceId = generatedLocation.sourceId;
-          await dispatch((0, _sources.ensureParserHasSourceText)(generatedSourceId));
-
           expression = await (0, _expressions.getMappedExpression)({ sourceMaps }, generatedLocation, expression);
         }
 
         const selectedFrame = (0, _selectors.getSelectedFrame)(getState());
         const { result } = await client.evaluate(expression, {
           frameId: selectedFrame.id
         });
 
@@ -22169,40 +22036,38 @@ function setPreview(token, tokenPos, cur
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
+
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
 exports.updateFrameLocations = updateFrameLocations;
 exports.updateScopeBindings = updateScopeBindings;
 exports.getPauseReason = getPauseReason;
 exports.getPausedPosition = getPausedPosition;
 
 var _lodash = __webpack_require__(2);
 
 var _parser = __webpack_require__(1365);
 
 function updateFrameLocations(frames, sourceMaps) {
   if (!frames || frames.length == 0) {
     return Promise.resolve(frames);
   }
 
-  return Promise.all(frames.map(frame => {
-    return sourceMaps.getOriginalLocation(frame.location).then(loc => {
-      return Object.assign({}, frame, {
-        location: loc,
-        generatedLocation: frame.location
-      });
-    });
-  }));
-}
-
+  return Promise.all(frames.map(frame => sourceMaps.getOriginalLocation(frame.location).then(loc => _extends({}, frame, {
+    location: loc,
+    generatedLocation: frame.location
+  }))));
+}
 
 function extendScope(scope, generatedScopes, index) {
   if (!scope) {
     return undefined;
   }
   if (index >= generatedScopes.length) {
     return scope;
   }
@@ -22509,17 +22374,17 @@ var _classnames2 = _interopRequireDefaul
 var _Transition = __webpack_require__(333);
 
 var _Transition2 = _interopRequireDefault(_Transition);
 
 __webpack_require__(1303);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-class Modal extends _react.Component {
+class Modal extends _react2.default.Component {
   constructor(...args) {
     var _temp;
 
     return _temp = super(...args), this.onClick = e => {
       e.stopPropagation();
     }, _temp;
   }
 
@@ -22585,20 +22450,17 @@ var _react = __webpack_require__(0);
 var _react2 = _interopRequireDefault(_react);
 
 __webpack_require__(1311);
 
 var _devtoolsComponents = __webpack_require__(1441);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-const Tree = (0, _react.createFactory)(_devtoolsComponents.Tree);
-
 class ManagedTree extends _react.Component {
-
   constructor(props) {
     super();
 
     this.setExpanded = (item, isExpanded, shouldIncludeChildren) => {
       const expandItem = i => {
         const path = this.props.getPath(i);
         if (isExpanded) {
           expanded.add(path);
@@ -22700,17 +22562,17 @@ class ManagedTree extends _react.Compone
         setExpanded: this.setExpanded
       })
     };
 
     const props = _extends({}, this.props, overrides);
     return _react2.default.createElement(
       "div",
       { className: "managed-tree" },
-      _react2.default.createElement(Tree, props)
+      _react2.default.createElement(_devtoolsComponents.Tree, props)
     );
   }
 }
 
 exports.default = ManagedTree;
 
 /***/ }),
 /* 1405 */
@@ -22826,17 +22688,17 @@ var _devtoolsConfig = __webpack_require_
 function scrollList(resultList, index) {
   if (!resultList.hasOwnProperty(index)) {
     return;
   }
 
   const resultEl = resultList[index];
 
   if ((0, _devtoolsConfig.isFirefox)()) {
-    resultEl.scrollIntoView({ block: "end", behavior: "smooth" });
+    resultEl.scrollIntoView({ block: "center", behavior: "smooth" });
   } else {
     chromeScrollList(resultEl, index);
   }
 }
 
 function chromeScrollList(elem, index) {
   const resultsEl = elem.parentNode;
   if (!resultsEl || resultsEl.children.length === 0) {
@@ -22878,17 +22740,16 @@ var _Svg = __webpack_require__(1359);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
 __webpack_require__(1321);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class PaneToggleButton extends _react.Component {
-
   shouldComponentUpdate(nextProps) {
     const { collapsed, horizontal } = this.props;
 
     return horizontal !== nextProps.horizontal || collapsed !== nextProps.collapsed;
   }
 
   render() {
     const { position, collapsed, horizontal, handleClick } = this.props;
@@ -23748,23 +23609,23 @@ var _makeRecord = __webpack_require__(13
 
 var _makeRecord2 = _interopRequireDefault(_makeRecord);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 const State = exports.State = (0, _makeRecord2.default)({
   workers: (0, _immutable.List)()
 });
-/* 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/. */
-
-/**
- * Debuggee reducer
- * @module reducers/debuggee
+/* 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/. */
+
+/**
+ * Debuggee reducer
+ * @module reducers/debuggee
  */
 
 function debuggee(state = State(), action) {
   switch (action.type) {
     case "SET_WORKERS":
       return state.set("workers", (0, _immutable.List)(action.workers.workers));
     default:
       return state;
@@ -23988,17 +23849,16 @@ exports.default = update;
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.State = undefined;
 exports.getActiveSearch = getActiveSearch;
 exports.getContextMenu = getContextMenu;
 exports.getFrameworkGroupingState = getFrameworkGroupingState;
-exports.getSymbolSearchType = getSymbolSearchType;
 exports.getShownSource = getShownSource;
 exports.getPaneCollapse = getPaneCollapse;
 exports.getHighlightedLineRange = getHighlightedLineRange;
 exports.getConditionalPanelLine = getConditionalPanelLine;
 exports.getProjectDirectoryRoot = getProjectDirectoryRoot;
 exports.getOrientation = getOrientation;
 
 var _makeRecord = __webpack_require__(1361);
@@ -24016,17 +23876,16 @@ function _interopRequireDefault(obj) { r
 /**
  * UI reducer
  * @module reducers/ui
  */
 
 const State = exports.State = (0, _makeRecord2.default)({
   activeSearch: null,
   contextMenu: {},
-  symbolSearchType: "functions",
   shownSource: "",
   projectDirectoryRoot: "",
   startPanelCollapsed: _prefs.prefs.startPanelCollapsed,
   endPanelCollapsed: _prefs.prefs.endPanelCollapsed,
   frameworkGroupingOn: _prefs.prefs.frameworkGroupingOn,
   highlightedLineRange: undefined,
   conditionalPanelLine: null,
   orientation: "horizontal"
@@ -24040,21 +23899,16 @@ function update(state = State(), action)
       }
 
     case "TOGGLE_FRAMEWORK_GROUPING":
       {
         _prefs.prefs.frameworkGroupingOn = action.value;
         return state.set("frameworkGroupingOn", action.value);
       }
 
-    case "SET_SYMBOL_SEARCH_TYPE":
-      {
-        return state.set("symbolSearchType", action.symbolType);
-      }
-
     case "SET_CONTEXT_MENU":
       {
         return state.set("contextMenu", action.contextMenu);
       }
 
     case "SET_ORIENTATION":
       {
         return state.set("orientation", action.orientation);
@@ -24115,20 +23969,16 @@ function getActiveSearch(state) {
 function getContextMenu(state) {
   return state.ui.get("contextMenu");
 }
 
 function getFrameworkGroupingState(state) {
   return state.ui.get("frameworkGroupingOn");
 }
 
-function getSymbolSearchType(state) {
-  return state.ui.get("symbolSearchType");
-}
-
 function getShownSource(state) {
   return state.ui.get("shownSource");
 }
 
 function getPaneCollapse(state, position) {
   if (position == "start") {
     return state.ui.get("startPanelCollapsed");
   }
@@ -24384,63 +24234,17 @@ function getTextSearchResults(state) {
 
 function getTextSearchQuery(state) {
   return state.projectTextSearch.get("query");
 }
 
 exports.default = update;
 
 /***/ }),
-/* 1425 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = update;
-exports.getSourceSearchQuery = getSourceSearchQuery;
-
-var _makeRecord = __webpack_require__(1361);
-
-var _makeRecord2 = _interopRequireDefault(_makeRecord);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function InitialState() {
-  return (0, _makeRecord2.default)({
-    queryString: ""
-  })();
-} /* 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/. */
-
-/**
- * Source search reducer
- * @module reducers/source-search
- */
-
-function update(state = InitialState(), action) {
-  switch (action.type) {
-    case "SET_QUERY_STRING":
-      return state.update("queryString", value => action.queryString);
-    case "CLEAR_QUERY_STRING":
-      return state.update("queryString", value => "");
-    default:
-      return state;
-  }
-}
-
-function getSourceSearchQuery(state) {
-  return state.sourceSearch.get("queryString");
-}
-
-/***/ }),
+/* 1425 */,
 /* 1426 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -24724,18 +24528,18 @@ var _App = __webpack_require__(1518);
 var _App2 = _interopRequireDefault(_App);
 
 var _prefs = __webpack_require__(226);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function bootstrapStore(client, { services, toolboxActions }) {
   const createStore = (0, _createStore2.default)({
-    log: (0, _devtoolsConfig.getValue)("logging.actions"),
-    timing: (0, _devtoolsConfig.getValue)("performance.actions"),
+    log: (0, _devtoolsConfig.isTesting)() || (0, _devtoolsConfig.getValue)("logging.actions"),
+    timing: (0, _devtoolsConfig.isDevelopment)(),
     makeThunkArgs: (args, state) => {
       return Object.assign({}, args, { client }, services, toolboxActions);
     }
   });
 
   const store = createStore((0, _redux.combineReducers)(_reducers2.default));
   store.subscribe(() => updatePrefs(store.getState()));
 
@@ -24938,89 +24742,73 @@ function searchSource(sourceId, query) {
         filepath: source.url,
         matches
       }
     });
   };
 }
 
 /***/ }),
-/* 1434 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.setSourceSearchQuery = setSourceSearchQuery;
-exports.clearSourceSearchQuery = clearSourceSearchQuery;
-function setSourceSearchQuery(queryString) {
-  return ({ dispatch, getState }) => {
-    dispatch({
-      type: "SET_QUERY_STRING",
-      queryString
-    });
-  };
-}
-
-function clearSourceSearchQuery() {
-  return ({ dispatch, getState }) => {
-    dispatch({
-      type: "CLEAR_QUERY_STRING"
-    });
-  };
-}
-
-/***/ }),
+/* 1434 */,
 /* 1435 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.loadSourceText = loadSourceText;
 
 var _promise = __webpack_require__(1370);
 
 var _ast = __webpack_require__(1399);
 
+var _selectors = __webpack_require__(1352);
+
+var _parser = __webpack_require__(1365);
+
+async function loadSource(source, { sourceMaps, client }) {
+  if (sourceMaps.isOriginalId(source.id)) {
+    return await sourceMaps.getOriginalSourceText(source);
+  }
+
+  const response = await client.sourceContents(source.id);
+
+  return {
+    id: source.id,
+    text: response.source,
+    contentType: response.contentType || "text/javascript"
+  };
+}
+
 /**
  * @memberof actions/sources
  * @static
  */
 function loadSourceText(source) {
   return async ({ dispatch, getState, client, sourceMaps }) => {
     // Fetch the source text only once.
     if (source.text) {
       return Promise.resolve(source);
     }
 
     await dispatch({
       type: "LOAD_SOURCE_TEXT",
       source: source,
-      [_promise.PROMISE]: async function () {
-        if (sourceMaps.isOriginalId(source.id)) {
-          return await sourceMaps.getOriginalSourceText(source);
-        }
-
-        const response = await client.sourceContents(source.id);
-
-        return {
-          id: source.id,
-          text: response.source,
-          contentType: response.contentType || "text/javascript"
-        };
-      }()
-    });
-
+      [_promise.PROMISE]: loadSource(source, { sourceMaps, client })
+    });
+
+    const newSource = (0, _selectors.getSource)(getState(), source.id).toJS();
+    if (newSource.isWasm) {
+      return;
+    }
+
+    await (0, _parser.setSource)(newSource);
     await dispatch((0, _ast.setSymbols)(source.id));
     await dispatch((0, _ast.setEmptyLines)(source.id));
   };
 }
 
 /***/ }),
 /* 1436 */
 /***/ (function(module, exports, __webpack_require__) {
@@ -25032,19 +24820,17 @@ Object.defineProperty(exports, "__esModu
   value: true
 });
 exports.showLoading = exports.showSourceText = exports.updateDocument = exports.updateLineNumberFormat = exports.resetLineNumberFormat = exports.clearDocuments = exports.removeDocument = exports.setDocument = exports.getDocument = undefined;
 
 var _source = __webpack_require__(1356);
 
 var _wasm = __webpack_require__(1401);
 
-var _devtoolsSourceEditor = __webpack_require__(1386);
-
-const { resizeBreakpointGutter } = _devtoolsSourceEditor.SourceEditorUtils;
+var _ui = __webpack_require__(1439);
 
 let sourceDocs = {};
 
 function getDocument(key) {
   return sourceDocs[key];
 }
 
 function setDocument(key, doc) {
@@ -25057,27 +24843,29 @@ function removeDocument(key) {
 
 function clearDocuments() {
   sourceDocs = {};
 }
 
 function resetLineNumberFormat(editor) {
   const cm = editor.codeMirror;
   cm.setOption("lineNumberFormatter", number => number);
-  resizeBreakpointGutter(cm);
+  (0, _ui.resizeBreakpointGutter)(cm);
+  (0, _ui.resizeToggleButton)(cm);
 }
 
 function updateLineNumberFormat(editor, sourceId) {
   if (!(0, _wasm.isWasm)(sourceId)) {
     return resetLineNumberFormat(editor);
   }
   const cm = editor.codeMirror;
   const lineNumberFormatter = (0, _wasm.getWasmLineNumberFormatter)(sourceId);
   cm.setOption("lineNumberFormatter", lineNumberFormatter);
-  resizeBreakpointGutter(cm);
+  (0, _ui.resizeBreakpointGutter)(cm);
+  (0, _ui.resizeToggleButton)(cm);
 }
 
 function updateDocument(editor, sourceId) {
   if (!sourceId) {
     return;
   }
 
   const doc = getDocument(sourceId) || editor.createDocument();
@@ -25162,17 +24950,17 @@ Object.defineProperty(exports, "__esModu
 exports.sanitizeInput = sanitizeInput;
 exports.wrapExpression = wrapExpression;
 exports.getValue = getValue;
 
 var _indentation = __webpack_require__(1438);
 
 // replace quotes and slashes that could interfere with the evaluation.
 function sanitizeInput(input) {
-  return input.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
+  return input.replace(/\\/g, "\\\\").replace(/"/g, '"');
 }
 
 /*
  * wrap the expression input in a try/catch so that it can be safely
  * evaluated.
  *
  * NOTE: we add line after the expression to protect against comments.
 */
@@ -25268,34 +25056,67 @@ function correctIndentation(text) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.isVisible = isVisible;
+exports.getLineNumberWidth = getLineNumberWidth;
+exports.resizeBreakpointGutter = resizeBreakpointGutter;
+exports.resizeToggleButton = resizeToggleButton;
 /* Checks to see if the root element is available and
  * if the element is visible. We check the width of the element
  * because it is more reliable than either checking a focus state or
  * the visibleState or hidden property.
  */
 function isVisible() {
   const el = document.querySelector("#mount");
   return el && el.getBoundingClientRect().width;
 }
 
+/* Gets the line numbers width in the code editor
+ */
+function getLineNumberWidth(editor) {
+  const gutters = editor.display.gutters;
+  const lineNumbers = gutters.querySelector(".CodeMirror-linenumbers");
+  return lineNumbers && lineNumbers.clientWidth;
+}
+
+/**
+ * Forces the breakpoint gutter to be the same size as the line
+ * numbers gutter. Editor CSS will absolutely position the gutter
+ * beneath the line numbers. This makes it easy to be flexible with
+ * how we overlay breakpoints.
+ */
+function resizeBreakpointGutter(editor) {
+  const gutters = editor.display.gutters;
+  const breakpoints = gutters.querySelector(".breakpoints");
+  if (breakpoints) {
+    breakpoints.style.width = `${getLineNumberWidth(editor)}px`;
+  }
+}
+
+/**
+ * Forces the left toggle button in source header to be the same size
+ * as the line numbers gutter.
+ */
+function resizeToggleButton(editor) {
+  const toggleButton = document.querySelector(".source-header .toggle-button-start");
+  if (toggleButton) {
+    toggleButton.style.width = `${getLineNumberWidth(editor)}px`;
+  }
+}
+
 /***/ }),
 /* 1440 */
 /***/ (function(module, exports, __webpack_require__) {
 
-"use strict";
-
-
-var SplitBox = __webpack_require__(1536);
+const SplitBox = __webpack_require__(1536);
 
 module.exports = SplitBox;
 
 /***/ }),
 /* 1441 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -25631,17 +25452,17 @@ class ResultList extends _react.Componen
     this.renderListItem = this.renderListItem.bind(this);
   }
 
   renderListItem(item, index) {
     const { selectItem, selected } = this.props;
     const props = {
       onClick: event => selectItem(event, item, index),
       key: `${item.id}${item.value}${index}`,
-      ref: index,
+      ref: String(index),
       title: item.value,
       className: (0, _classnames2.default)("result-item", {
         selected: index === selected
       })
     };
 
     return _react2.default.createElement(
       "li",
@@ -25664,17 +25485,16 @@ class ResultList extends _react.Componen
 
     return _react2.default.createElement(
       "ul",
       { className: (0, _classnames2.default)("result-list", size) },
       items.map(this.renderListItem)
     );
   }
 }
-
 exports.default = ResultList;
 ResultList.defaultProps = {
   size: "small"
 };
 
 /***/ }),
 /* 1446 */
 /***/ (function(module, exports, __webpack_require__) {
@@ -26907,20 +26727,16 @@ function FrameLocation({ frame }) {
     `${filename}: ${frame.location.line}`
   );
 }
 
 FrameLocation.displayName = "FrameLocation";
 
 class FrameComponent extends _react.Component {
 
-  constructor() {
-    super();
-  }
-
   onContextMenu(event) {
     const {
       frame,
       copyStackTrace,
       toggleFrameworkGrouping,
       toggleBlackBox,
       frameworkGroupingOn
     } = this.props;
@@ -26968,17 +26784,16 @@ class FrameComponent extends _react.Comp
   }
 }
 
 exports.default = FrameComponent;
 FrameComponent.defaultProps = {
   hideLocation: false,
   shouldMapDisplayName: true
 };
-
 FrameComponent.displayName = "Frame";
 
 /***/ }),
 /* 1454 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
@@ -31638,26 +31453,94 @@ function waitUntilService({ dispatch, ge
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
+
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
 exports.log = log;
+
+var _devtoolsConfig = __webpack_require__(1355);
+
+const blacklist = ["LOAD_OBJECT_PROPERTIES", "SET_SYMBOLS", "OUT_OF_SCOPE_LOCATIONS"];
+
+function cloneAction(action) {
+  action = action || {};
+  action = _extends({}, action);
+
+  // ADD_TAB, ...
+  if (action.source && action.source.text) {
+    const source = _extends({}, action.source, { text: "" });
+    action.source = source;
+  }
+
+  // LOAD_SOURCE_TEXT
+  if (action.text) {
+    action.text = "";
+  }
+
+  if (action.value && action.value.text) {
+    const value = _extends({}, action.value, { text: "" });
+    action.value = value;
+  }
+
+  return action;
+}
+
+function formatFrame(frame) {
+  const { id, location, displayName } = frame;
+  return { id, location, displayName };
+}
+
+function formatPause(pause) {
+  return _extends({}, pause, {
+    pauseInfo: { why: pause.pauseInfo.why },
+    scopes: [],
+    frames: pause.frames.map(formatFrame),
+    loadedObjects: []
+  });
+}
+
+function serializeAction(action) {
+  try {
+    action = cloneAction(action);
+    if (blacklist.includes(action.type)) {
+      action = {};
+    }
+
+    if (action.type === "PAUSED") {
+      action = formatPause(action);
+    }
+
+    // dump(`> ${action.type}...\n ${JSON.stringify(action)}\n`);
+    return JSON.stringify(action);
+  } catch (e) {
+    console.error(e);
+  }
+}
+
 /**
  * A middleware that logs all actions coming through the system
  * to the console.
  */
 function log({ dispatch, getState }) {
   return next => action => {
-    const status = action.status == "done" ? "<-" : "->";
-    const asyncMsg = !action.status ? "" : status;
-    console.log(action, asyncMsg);
+    const asyncMsg = !action.status ? "" : `[${action.status}]`;
+
+    if ((0, _devtoolsConfig.isTesting)()) {
+      dump(`[ACTION] ${action.type} ${asyncMsg} - ${serializeAction(action)}\n`);
+    } else {
+      console.log(action, asyncMsg);
+    }
+
     next(action);
   };
 }
 
 /***/ }),
 /* 1513 */
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -31803,19 +31686,19 @@ var _ast2 = _interopRequireDefault(_ast)
 var _coverage = __webpack_require__(1423);
 
 var _coverage2 = _interopRequireDefault(_coverage);
 
 var _projectTextSearch = __webpack_require__(1424);
 
 var _projectTextSearch2 = _interopRequireDefault(_projectTextSearch);
 
-var _sourceSearch = __webpack_require__(1425);
-
-var _sourceSearch2 = _interopRequireDefault(_sourceSearch);
+var _quickOpen = __webpack_require__(1635);
+
+var _quickOpen2 = _interopRequireDefault(_quickOpen);
 
 var _sourceTree = __webpack_require__(1426);
 
 var _sourceTree2 = _interopRequireDefault(_sourceTree);
 
 var _debuggee = __webpack_require__(1418);
 
 var _debuggee2 = _interopRequireDefault(_debuggee);
@@ -31830,17 +31713,17 @@ exports.default = {
   pendingBreakpoints: _pendingBreakpoints2.default,
   asyncRequests: _asyncRequests2.default,
   pause: _pause2.default,
   ui: _ui2.default,
   fileSearch: _fileSearch2.default,
   ast: _ast2.default,
   coverage: _coverage2.default,
   projectTextSearch: _projectTextSearch2.default,
-  sourceSearch: _sourceSearch2.default,
+  quickOpen: _quickOpen2.default,
   sourceTree: _sourceTree2.default,
   debuggee: _debuggee2.default
 }; /* 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/. */
 
 /**
  * Reducer index
@@ -31957,23 +31840,19 @@ var _SecondaryPanes2 = _interopRequireDe
 var _WelcomeBox = __webpack_require__(1613);
 
 var _WelcomeBox2 = _interopRequireDefault(_WelcomeBox);
 
 var _Tabs = __webpack_require__(1614);
 
 var _Tabs2 = _interopRequireDefault(_Tabs);
 
-var _SymbolModal = __webpack_require__(1616);
-
-var _SymbolModal2 = _interopRequireDefault(_SymbolModal);
-
-var _GotoLineModal = __webpack_require__(1617);
-
-var _GotoLineModal2 = _interopRequireDefault(_GotoLineModal);
+var _QuickOpenModal = __webpack_require__(1652);
+
+var _QuickOpenModal2 = _interopRequireDefault(_QuickOpenModal);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 const shortcuts = new _devtoolsModules.KeyShortcuts({ window });
 
 const { appinfo } = _devtoolsModules.Services;
 
 const isMacOS = appinfo.OS === "Darwin";
@@ -31987,112 +31866,102 @@ class App extends _react.Component {
     this.state = {
       shortcutsModalEnabled: false,
       startPanelSize: 0,
       endPanelSize: 0
     };
 
     this.getChildContext = this.getChildContext.bind(this);
     this.onLayoutChange = this.onLayoutChange.bind(this);
-    this.toggleSymbolModal = this.toggleSymbolModal.bind(this);
-    this.toggleGoToLineModal = this.toggleGoToLineModal.bind(this);
+    this.toggleQuickOpenModal = this.toggleQuickOpenModal.bind(this);
     this.renderEditorPane = this.renderEditorPane.bind(this);
     this.renderVerticalLayout = this.renderVerticalLayout.bind(this);
     this.onEscape = this.onEscape.bind(this);
     this.onCommandSlash = this.onCommandSlash.bind(this);
   }
 
   getChildContext() {
     return { shortcuts };
   }
 
   componentDidMount() {
     verticalLayoutBreakpoint.addListener(this.onLayoutChange);
 
-    shortcuts.on(L10N.getStr("symbolSearch.search.key2"), this.toggleSymbolModal);
-
-    shortcuts.on(L10N.getStr("gotoLineModal.key"), this.toggleGoToLineModal);
+    shortcuts.on(L10N.getStr("symbolSearch.search.key2"), (_, e) => this.toggleQuickOpenModal(_, e, "@"));
+
+    const searchKeys = [L10N.getStr("sources.search.key2"), L10N.getStr("sources.search.alt.key")];
+    searchKeys.forEach(key => shortcuts.on(key, this.toggleQuickOpenModal));
+
+    shortcuts.on(L10N.getStr("gotoLineModal.key"), (_, e) => this.toggleQuickOpenModal(_, e, ":"));
 
     shortcuts.on("Escape", this.onEscape);
     shortcuts.on("Cmd+/", this.onCommandSlash);
   }
 
   componentWillUnmount() {
     verticalLayoutBreakpoint.removeListener(this.onLayoutChange);
-    shortcuts.off(L10N.getStr("symbolSearch.search.key2"), this.toggleSymbolModal);
-
-    shortcuts.off(L10N.getStr("gotoLineModal.key"), this.toggleGoToLineModal);
+    shortcuts.off(L10N.getStr("symbolSearch.search.key2"), this.toggleQuickOpenModal);
+
+    const searchKeys = [L10N.getStr("sources.search.key2"), L10N.getStr("sources.search.alt.key")];
+    searchKeys.forEach(key => shortcuts.off(key, this.toggleQuickOpenModal));
+
+    shortcuts.off(L10N.getStr("gotoLineModal.key"), this.toggleQuickOpenModal);
 
     shortcuts.off("Escape", this.onEscape);
   }
 
   onEscape(_, e) {
-    const { activeSearch, closeActiveSearch } = this.props;
+    const {
+      activeSearch,
+      quickOpenEnabled,
+      closeActiveSearch,
+      closeQuickOpen
+    } = this.props;
 
     if (activeSearch) {
       e.preventDefault();
       closeActiveSearch();
     }
+
+    if (quickOpenEnabled === true) {
+      closeQuickOpen();
+    }
   }
 
   onCommandSlash() {
     this.toggleShortcutsModal();
   }
 
   isHorizontal() {
     return this.props.orientation === "horizontal";
   }
 
-  toggleSymbolModal(_, e) {
-    const {
-      selectedSource,
-      activeSearch,
-      closeActiveSearch,
-      setActiveSearch
-    } = this.props;
+  toggleQuickOpenModal(_, e, query) {
+    const { quickOpenEnabled, openQuickOpen, closeQuickOpen } = this.props;
 
     e.preventDefault();
     e.stopPropagation();
 
-    if (!selectedSource) {
-      return;
-    }
-
-    if (activeSearch == "symbol") {
-      return closeActiveSearch();
-    }
-
-    setActiveSearch("symbol");
-  }
-
-  toggleGoToLineModal(_, e) {
-    const {
-      selectedSource,
-      activeSearch,
-      closeActiveSearch,
-      setActiveSearch
-    } = this.props;
-
-    e.preventDefault();
-    e.stopPropagation();
-
-    if (!selectedSource) {
-      return;
-    }
-
-    if (activeSearch == "line") {
-      return closeActiveSearch();
-    }
-
-    setActiveSearch("line");
+    if (quickOpenEnabled === true) {
+      closeQuickOpen();
+      return;
+    }
+
+    if (query != null) {
+      openQuickOpen(query);
+      return;
+    }
+    openQuickOpen();
+    return;
   }
 
   onLayoutChange() {
+    const orientation = verticalLayoutBreakpoint.matches ? "horizontal" : "vertical";
     if ((0, _ui.isVisible)()) {
-      this.props.setOrientation(verticalLayoutBreakpoint.matches ? "horizontal" : "vertical");
+      this.props.setOrientation(orientation);
     }
   }
 
   renderEditorPane() {
     const { startPanelCollapsed, endPanelCollapsed } = this.props;
     const { endPanelSize, startPanelSize } = this.state;
     const horizontal = this.isHorizontal();
 
@@ -32184,76 +32053,51 @@ class App extends _react.Component {
       endPanel: _react2.default.createElement(_SecondaryPanes2.default, {
         horizontal: horizontal,
         toggleShortcutsModal: () => this.toggleShortcutsModal()
       }),
       endPanelCollapsed: endPanelCollapsed
     });
   }
 
-  renderSymbolModal() {
-    const { selectSource, selectedSource, activeSearch } = this.props;
-
-    if (activeSearch !== "symbol") {
-      return;
-    }
-
-    return _react2.default.createElement(_SymbolModal2.default, {
-      selectSource: selectSource,
-      selectedSource: selectedSource
-    });
-  }
-
-  renderGotoLineModal() {
-    const { selectSource, selectedSource, activeSearch } = this.props;
-
-    if (activeSearch !== "line") {
-      return;
-    }
-
-    return _react2.default.createElement(_GotoLineModal2.default, {
-      selectSource: selectSource,
-      selectedSource: selectedSource
-    });
-  }
-
   renderShortcutsModal() {
     const additionalClass = isMacOS ? "mac" : "";
 
     if (!_prefs.features.shortcuts) {
       return;
     }
 
     return _react2.default.createElement(_ShortcutsModal.ShortcutsModal, {
       additionalClass: additionalClass,
       enabled: this.state.shortcutsModalEnabled,
       handleClose: () => this.toggleShortcutsModal()
     });
   }
 
   render() {
+    const { quickOpenEnabled } = this.props;
     return _react2.default.createElement(
       "div",
       { className: "debugger" },
       this.isHorizontal() ? this.renderHorizontalLayout() : this.renderVerticalLayout(),
-      this.renderSymbolModal(),
-      this.renderGotoLineModal(),
+      quickOpenEnabled === true && _react2.default.createElement(_QuickOpenModal2.default, null),
       this.renderShortcutsModal()
     );
   }
 }
 
 App.childContextTypes = { shortcuts: _propTypes2.default.object };
 
 function mapStateToProps(state) {
   return {
     selectedSource: (0, _selectors.getSelectedSource)(state),
     startPanelCollapsed: (0, _selectors.getPaneCollapse)(state, "start"),
     endPanelCollapsed: (0, _selectors.getPaneCollapse)(state, "end"),
     activeSearch: (0, _selectors.getActiveSearch)(state),
+    quickOpenEnabled: (0, _selectors.getQuickOpenEnabled)(state),
     orientation: (0, _selectors.getOrientation)(state)
   };
 }
 
 exports.default = (0, _reactRedux.connect)(mapStateToProps, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(App);
 
 /***/ }),
 /* 1519 */
@@ -32517,20 +32361,22 @@ function createPrettySource(sourceId) {
       id,
       isPrettyPrinted: true,
       text: code,
       contentType: "text/javascript",
       frames,
       loadedState: "loaded"
     };
 
-    return dispatch({
+    dispatch({
       type: "ADD_SOURCE",
       source: prettySource
     });
+
+    return prettySource;
   };
 }
 
 /***/ }),
 /* 1524 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -33115,338 +32961,17 @@ function updateEventBreakpoints(eventNam
           eventNames: eventNames
         });
       });
     });
   };
 }
 
 /***/ }),
-/* 1528 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.resumed = resumed;
-exports.continueToHere = continueToHere;
-exports.paused = paused;
-exports.pauseOnExceptions = pauseOnExceptions;
-exports.command = command;
-exports.stepIn = stepIn;
-exports.stepOver = stepOver;
-exports.stepOut = stepOut;
-exports.resume = resume;
-exports.breakOnNext = breakOnNext;
-exports.selectFrame = selectFrame;
-exports.loadObjectProperties = loadObjectProperties;
-exports.astCommand = astCommand;
-
-var _sources = __webpack_require__(1373);
-
-var _promise = __webpack_require__(1370);
-
-var _selectors = __webpack_require__(1352);
-
-var _pause = __webpack_require__(1400);
-
-var _expressions = __webpack_require__(1398);
-
-var _breakpoints = __webpack_require__(1396);
-
-var _breakpoints2 = __webpack_require__(1378);
-
-var _parser = __webpack_require__(1365);
-
-var parser = _interopRequireWildcard(_parser);
-
-var _prefs = __webpack_require__(226);
-
-var _devtoolsSourceMap = __webpack_require__(1360);
-
-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)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
-
-async function _getScopeBindings({ dispatch, getState, sourceMaps }, generatedLocation, scopes) {
-  const { sourceId } = generatedLocation;
-  const sourceRecord = (0, _selectors.getSource)(getState(), sourceId);
-  if (sourceRecord.get("isWasm")) {
-    return scopes;
-  }
-
-  await dispatch((0, _sources.ensureParserHasSourceText)(sourceId));
-
-  return await (0, _pause.updateScopeBindings)(scopes, generatedLocation, sourceMaps);
-}
-
-/**
- * Redux actions for the pause state
- * @module actions/pause
- */
-
-/**
- * Debugger has just resumed
- *
- * @memberof actions/pause
- * @static
- */
-function resumed() {
-  return ({ dispatch, client, getState }) => {
-    if (!(0, _selectors.isPaused)(getState())) {
-      return;
-    }
-
-    const wasPausedInEval = (0, _selectors.pausedInEval)(getState());
-
-    dispatch({
-      type: "RESUME",
-      value: undefined
-    });
-
-    if (!(0, _selectors.isStepping)(getState()) && !wasPausedInEval) {
-      dispatch((0, _expressions.evaluateExpressions)());
-    }
-  };
-}
-
-function continueToHere(line) {
-  return async function ({ dispatch, getState, client, sourceMaps }) {
-    const source = (0, _selectors.getSelectedSource)(getState()).toJS();
-
-    await dispatch((0, _breakpoints.addHiddenBreakpoint)({
-      line,
-      column: undefined,
-      sourceId: source.id
-    }));
-
-    dispatch(command("resume"));
-  };
-}
-
-/**
- * Debugger has just paused
- *
- * @param {object} pauseInfo
- * @memberof actions/pause
- * @static
- */
-function paused(pauseInfo) {
-  return async function ({ dispatch, getState, client, sourceMaps }) {
-    let { frames, why, loadedObjects } = pauseInfo;
-
-    frames = await (0, _pause.updateFrameLocations)(frames, sourceMaps);
-    const frame = frames[0];
-
-    const frameScopes = await client.getFrameScopes(frame);
-    const scopes = !(0, _devtoolsSourceMap.isGeneratedId)(frame.location.sourceId) ? await _getScopeBindings({ dispatch, getState, sourceMaps }, frame.generatedLocation, frameScopes) : frameScopes;
-
-    dispatch({
-      type: "PAUSED",
-      pauseInfo: { why, frame, frames },
-      frames: frames,
-      scopes,
-      selectedFrameId: frame.id,
-      loadedObjects: loadedObjects || []
-    });
-
-    const hiddenBreakpointLocation = (0, _breakpoints2.getHiddenBreakpointLocation)(getState());
-    if (hiddenBreakpointLocation) {
-      dispatch((0, _breakpoints.removeBreakpoint)(hiddenBreakpointLocation));
-    }
-
-    if (!(0, _selectors.isEvaluatingExpression)(getState())) {
-      dispatch((0, _expressions.evaluateExpressions)());
-    }
-
-    dispatch((0, _sources.selectSource)(frame.location.sourceId, { line: frame.location.line }));
-  };
-}
-
-/**
- *
- * @memberof actions/pause
- * @static
- */
-function pauseOnExceptions(shouldPauseOnExceptions, shouldIgnoreCaughtExceptions) {
-  return ({ dispatch, client }) => {
-    dispatch({
-      type: "PAUSE_ON_EXCEPTIONS",
-      shouldPauseOnExceptions,
-      shouldIgnoreCaughtExceptions,
-      [_promise.PROMISE]: client.pauseOnExceptions(shouldPauseOnExceptions, shouldIgnoreCaughtExceptions)
-    });
-  };
-}
-
-/**
- * Debugger commands like stepOver, stepIn, stepUp
- *
- * @param string $0.type
- * @memberof actions/pause
- * @static
- */
-function command(type) {
-  return async ({ dispatch, client }) => {
-    // execute debugger thread command e.g. stepIn, stepOver
-    dispatch({ type: "COMMAND", value: { type } });
-
-    await client[type]();
-
-    dispatch({ type: "CLEAR_COMMAND" });
-  };
-}
-
-/**
- * StepIn
- * @memberof actions/pause
- * @static
- * @returns {Function} {@link command}
- */
-function stepIn() {
-  return ({ dispatch, getState }) => {
-    if ((0, _selectors.getPause)(getState())) {
-      return dispatch(command("stepIn"));
-    }
-  };
-}
-
-/**
- * stepOver
- * @memberof actions/pause
- * @static
- * @returns {Function} {@link command}
- */
-function stepOver() {
-  return ({ dispatch, getState }) => {
-    if ((0, _selectors.getPause)(getState())) {
-      return dispatch(astCommand("stepOver"));
-    }
-  };
-}
-
-/**
- * stepOut
- * @memberof actions/pause
- * @static
- * @returns {Function} {@link command}
- */
-function stepOut() {
-  return ({ dispatch, getState }) => {
-    if ((0, _selectors.getPause)(getState())) {
-      return dispatch(command("stepOut"));
-    }
-  };
-}
-
-/**
- * resume
- * @memberof actions/pause
- * @static
- * @returns {Function} {@link command}
- */
-function resume() {
-  return ({ dispatch, getState }) => {
-    if ((0, _selectors.getPause)(getState())) {
-      return dispatch(command("resume"));
-    }
-  };
-}
-
-/**
- * Debugger breakOnNext command.
- * It's different from the comand action because we also want to
- * highlight the pause icon.
- *
- * @memberof actions/pause
- * @static
- */
-function breakOnNext() {
-  return ({ dispatch, client }) => {
-    client.breakOnNext();
-
-    return dispatch({
-      type: "BREAK_ON_NEXT",
-      value: true
-    });
-  };
-}
-
-/**
- * @memberof actions/pause
- * @static
- */
-function selectFrame(frame) {
-  return async ({ dispatch, client, getState, sourceMaps }) => {
-    const frameScopes = await client.getFrameScopes(frame);
-    const scopes = !(0, _devtoolsSourceMap.isGeneratedId)(frame.location.sourceId) ? await _getScopeBindings({ dispatch, getState, sourceMaps }, frame.generatedLocation, frameScopes) : frameScopes;
-
-    dispatch({
-      type: "SELECT_FRAME",
-      frame,
-      scopes
-    });
-
-    dispatch((0, _sources.selectSource)(frame.location.sourceId, { line: frame.location.line }));
-
-    dispatch((0, _expressions.evaluateExpressions)());
-  };
-}
-
-/**
- * @memberof actions/pause
- * @static
- */
-function loadObjectProperties(object) {
-  return ({ dispatch, client, getState }) => {
-    const objectId = object.actor || object.objectId;
-
-    if ((0, _selectors.getLoadedObject)(getState(), objectId)) {
-      return;
-    }
-
-    dispatch({
-      type: "LOAD_OBJECT_PROPERTIES",
-      objectId,
-      [_promise.PROMISE]: client.getProperties(object)
-    });
-  };
-}
-
-/**
- * @memberOf actions/pause
- * @static
- * @param stepType
- * @returns {function(ThunkArgs)}
- */
-function astCommand(stepType) {
-  return async ({ dispatch, getState, sourceMaps }) => {
-    if (!_prefs.features.asyncStepping) {
-      return dispatch(command(stepType));
-    }
-
-    const pauseInfo = (0, _selectors.getPause)(getState());
-    const source = (0, _selectors.getSelectedSource)(getState()).toJS();
-
-    const pausedPosition = await (0, _pause.getPausedPosition)(pauseInfo, sourceMaps);
-
-    if (stepType == "stepOver") {
-      const nextLocation = await parser.getNextStep(source, pausedPosition);
-      if (nextLocation) {
-        await dispatch((0, _breakpoints.addHiddenBreakpoint)(nextLocation));
-        return dispatch(command("resume"));
-      }
-    }
-
-    return dispatch(command(stepType));
-  };
-}
-
-/***/ }),
+/* 1528 */,
 /* 1529 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -33761,17 +33286,16 @@ var _classnames2 = _interopRequireDefaul
 
 var _text = __webpack_require__(1387);
 
 __webpack_require__(1304);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class ShortcutsModal extends _react.Component {
-
   renderPrettyCombos(combo) {
     return combo.split(" ").map(c => _react2.default.createElement(
       "span",
       { key: c, className: "keystroke" },
       c
     )).reduce((prev, curr) => [prev, " + ", curr]);
   }
 
@@ -33881,37 +33405,32 @@ class ShortcutsModal extends _react.Comp
   }
 }
 exports.ShortcutsModal = ShortcutsModal;
 
 /***/ }),
 /* 1536 */
 /***/ (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
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-var React = __webpack_require__(0);
-var ReactDOM = __webpack_require__(4);
-var Draggable = React.createFactory(__webpack_require__(1537));
-var dom = React.DOM,
-    PropTypes = React.PropTypes;
-
+/* 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 React = __webpack_require__(0);
+const ReactDOM = __webpack_require__(4);
+const Draggable = React.createFactory(__webpack_require__(1537));
+const { DOM: dom, PropTypes } = React;
 
 __webpack_require__(1309);
 
 /**
  * This component represents a Splitter. The splitter supports vertical
  * as well as horizontal mode.
  */
-var SplitBox = React.createClass({
+const SplitBox = React.createClass({
   propTypes: {
     // Custom class name. You can use more names separated by a space.
     className: PropTypes.string,
     // Initial size of controlled panel.
     initialSize: PropTypes.any,
     // Optional initial width of controlled panel.
     initialWidth: PropTypes.number,
     // Optional initial height of controlled panel.
@@ -33937,196 +33456,183 @@ var SplitBox = React.createClass({
     // Optional style properties passed into the splitbox
     style: PropTypes.object,
     // Optional callback when splitbox resize stops
     onResizeEnd: PropTypes.func
   },
 
   displayName: "SplitBox",
 
-  getDefaultProps: function getDefaultProps() {
+  getDefaultProps() {
     return {
       splitterSize: 5,
       vert: true,
       endPanelControl: false,
       endPanelCollapsed: false,
       startPanelCollapsed: false
     };
   },
 
-
   /**
    * The state stores the current orientation (vertical or horizontal)
    * and the current size (width/height). All these values can change
    * during the component's life time.
    */
-  getInitialState: function getInitialState() {
+  getInitialState() {
     return {
       vert: this.props.vert,
       // We use integers for these properties
       width: parseInt(this.props.initialWidth || this.props.initialSize),
       height: parseInt(this.props.initialHeight || this.props.initialSize)
     };
   },
-  componentWillReceiveProps: function componentWillReceiveProps(nextProps) {
+
+  componentWillReceiveProps(nextProps) {
     if (this.props.vert !== nextProps.vert) {
       this.setState({ vert: nextProps.vert });
     }
   },
 
-
   // Dragging Events
 
   /**
    * Set 'resizing' cursor on entire document during splitter dragging.
    * This avoids cursor-flickering that happens when the mouse leaves
    * the splitter bar area (happens frequently).
    */
-  onStartMove: function onStartMove() {
-    var splitBox = ReactDOM.findDOMNode(this);
-    var doc = splitBox.ownerDocument;
-    var defaultCursor = doc.documentElement.style.cursor;
+  onStartMove() {
+    const splitBox = ReactDOM.findDOMNode(this);
+    const doc = splitBox.ownerDocument;
+    let defaultCursor = doc.documentElement.style.cursor;
     doc.documentElement.style.cursor = this.state.vert ? "ew-resize" : "ns-resize";
 
     splitBox.classList.add("dragging");
 
     this.setState({
       defaultCursor: defaultCursor
     });
   },
-  onStopMove: function onStopMove() {
-    var splitBox = ReactDOM.findDOMNode(this);
-    var doc = splitBox.ownerDocument;
+
+  onStopMove() {
+    const splitBox = ReactDOM.findDOMNode(this);
+    const doc = splitBox.ownerDocument;
     doc.documentElement.style.cursor = this.state.defaultCursor;
 
     splitBox.classList.remove("dragging");
 
     if (this.props.onResizeEnd) {
       this.props.onResizeEnd(this.state.vert ? this.state.width : this.state.height);
     }
   },
 
-
   /**
    * Adjust size of the controlled panel. Depending on the current
    * orientation we either remember the width or height of
    * the splitter box.
    */
-  onMove: function onMove(_ref) {
-    var movementX = _ref.movementX,
-        movementY = _ref.movementY;
-
-    var node = ReactDOM.findDOMNode(this);
-    var doc = node.ownerDocument;
+  onMove({ movementX, movementY }) {
+    const node = ReactDOM.findDOMNode(this);
+    const doc = node.ownerDocument;
 
     if (this.props.endPanelControl) {
       // For the end panel we need to increase the width/height when the
       // movement is towards the left/top.
       movementX = -movementX;
       movementY = -movementY;
     }
 
     if (this.state.vert) {
-      var isRtl = doc.dir === "rtl";
+      const isRtl = doc.dir === "rtl";
       if (isRtl) {
         // In RTL we need to reverse the movement again -- but only for vertical
         // splitters
         movementX = -movementX;
       }
 
-      this.setState(function (state, props) {
-        return {
-          width: state.width + movementX
-        };
-      });
-    } else {
-      this.setState(function (state, props) {
-        return {
-          height: state.height + movementY
-        };
-      });
-    }
-  },
-
+      this.setState((state, props) => ({
+        width: state.width + movementX
+      }));
+    } else {
+      this.setState((state, props) => ({
+        height: state.height + movementY
+      }));
+    }
+  },
 
   // Rendering
-  preparePanelStyles: function preparePanelStyles() {
-    var vert = this.state.vert;
-    var _props = this.props,
-        minSize = _props.minSize,
-        maxSize = _props.maxSize,
-        startPanelCollapsed = _props.startPanelCollapsed,
-        endPanelControl = _props.endPanelControl,
-        endPanelCollapsed = _props.endPanelCollapsed;
-
-    var leftPanelStyle = void 0,
-        rightPanelStyle = void 0;
+  preparePanelStyles() {
+    const vert = this.state.vert;
+    const {
+      minSize,
+      maxSize,
+      startPanelCollapsed,
+      endPanelControl,
+      endPanelCollapsed
+    } = this.props;
+    let leftPanelStyle, rightPanelStyle;
 
     // Set proper size for panels depending on the current state.
     if (vert) {
-      var startWidth = endPanelControl ? null : this.state.width,
+      let startWidth = endPanelControl ? null : this.state.width,
           endWidth = endPanelControl ? this.state.width : null;
 
       leftPanelStyle = {
         maxWidth: endPanelControl ? null : maxSize,
         minWidth: endPanelControl ? null : minSize,
         width: startPanelCollapsed ? 0 : startWidth
       };
       rightPanelStyle = {
         maxWidth: endPanelControl ? maxSize : null,
         minWidth: endPanelControl ? minSize : null,
         width: endPanelCollapsed ? 0 : endWidth
       };
     } else {
-      var startHeight = endPanelControl ? null : this.state.height,
+      let startHeight = endPanelControl ? null : this.state.height,
           endHeight = endPanelControl ? this.state.height : null;
 
       leftPanelStyle = {
         maxHeight: endPanelControl ? null : maxSize,
         minHeight: endPanelControl ? null : minSize,
         height: endPanelCollapsed ? maxSize : startHeight
       };
       rightPanelStyle = {
         maxHeight: endPanelControl ? maxSize : null,
         minHeight: endPanelControl ? minSize : null,
         height: startPanelCollapsed ? maxSize : endHeight
       };
     }
 
-    return { leftPanelStyle: leftPanelStyle, rightPanelStyle: rightPanelStyle };
-  },
-  render: function render() {
-    var vert = this.state.vert;
-    var _props2 = this.props,
-        startPanelCollapsed = _props2.startPanelCollapsed,
-        startPanel = _props2.startPanel,
-        endPanel = _props2.endPanel,
-        endPanelControl = _props2.endPanelControl,
-        splitterSize = _props2.splitterSize,
-        endPanelCollapsed = _props2.endPanelCollapsed;
-
-
-    var style = Object.assign({}, this.props.style);
+    return { leftPanelStyle, rightPanelStyle };
+  },
+
+  render() {
+    const vert = this.state.vert;
+    const {
+      startPanelCollapsed,
+      startPanel,
+      endPanel,
+      endPanelControl,
+      splitterSize,
+      endPanelCollapsed
+    } = this.props;
+
+    let style = Object.assign({}, this.props.style);
 
     // Calculate class names list.
-    var classNames = ["split-box"];
+    let classNames = ["split-box"];
     classNames.push(vert ? "vert" : "horz");
     if (this.props.className) {
       classNames = classNames.concat(this.props.className.split(" "));
     }
 
-    var _preparePanelStyles = this.preparePanelStyles(),
-        leftPanelStyle = _preparePanelStyles.leftPanelStyle,
-        rightPanelStyle = _preparePanelStyles.rightPanelStyle;
+    const { leftPanelStyle, rightPanelStyle } = this.preparePanelStyles();
 
     // Calculate splitter size
-
-
-    var splitterStyle = {
-      flex: "0 0 " + splitterSize + "px"
+    let splitterStyle = {
+      flex: `0 0 ${splitterSize}px`
     };
 
     return dom.div({
       className: classNames.join(" "),
       style: style
     }, !startPanelCollapsed ? dom.div({
       className: endPanelControl ? "uncontrolled" : "controlled",
       style: leftPanelStyle
@@ -34144,61 +33650,59 @@ var SplitBox = React.createClass({
 });
 
 module.exports = SplitBox;
 
 /***/ }),
 /* 1537 */
 /***/ (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 file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-var React = __webpack_require__(0);
-var ReactDOM = __webpack_require__(4);
-var dom = React.DOM,
-    PropTypes = React.PropTypes;
-
-
-var Draggable = React.createClass({
+const React = __webpack_require__(0);
+const ReactDOM = __webpack_require__(4);
+const { DOM: dom, PropTypes } = React;
+
+const Draggable = React.createClass({
   displayName: "Draggable",
 
   propTypes: {
     onMove: PropTypes.func.isRequired,
     onStart: PropTypes.func,
     onStop: PropTypes.func,
     style: PropTypes.object,
     className: PropTypes.string
   },
 
-  startDragging: function startDragging(ev) {
+  startDragging(ev) {
     ev.preventDefault();
-    var doc = ReactDOM.findDOMNode(this).ownerDocument;
+    const doc = ReactDOM.findDOMNode(this).ownerDocument;
     doc.addEventListener("mousemove", this.onMove);
     doc.addEventListener("mouseup", this.onUp);
     this.props.onStart && this.props.onStart();
   },
-  onMove: function onMove(ev) {
+
+  onMove(ev) {
     ev.preventDefault();
     // We pass the whole event because we don't know which properties
     // the callee needs.
     this.props.onMove(ev);
   },
-  onUp: function onUp(ev) {
+
+  onUp(ev) {
     ev.preventDefault();
-    var doc = ReactDOM.findDOMNode(this).ownerDocument;
+    const doc = ReactDOM.findDOMNode(this).ownerDocument;
     doc.removeEventListener("mousemove", this.onMove);
     doc.removeEventListener("mouseup", this.onUp);
     this.props.onStop && this.props.onStop();
   },
-  render: function render() {
+
+  render() {
     return dom.div({
       style: this.props.style,
       className: this.props.className,
       onMouseDown: this.startDragging
     });
   }
 });
 
@@ -34230,166 +33734,109 @@ var _redux = __webpack_require__(3);
 var _actions = __webpack_require__(1354);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _TextSearch = __webpack_require__(1539);
 
 var _TextSearch2 = _interopRequireDefault(_TextSearch);
 
-var _SourceSearch = __webpack_require__(1548);
-
-var _SourceSearch2 = _interopRequireDefault(_SourceSearch);
-
-var _ToggleSearch = __webpack_require__(1550);
-
-var _ToggleSearch2 = _interopRequireDefault(_ToggleSearch);
-
 var _selectors = __webpack_require__(1352);
 
 __webpack_require__(1317);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class ProjectSearch extends _react.Component {
 
   constructor(props) {
     super(props);
-
-    this.toggleSourceSearch = this.toggleSourceSearch.bind(this);
     this.toggleProjectTextSearch = this.toggleProjectTextSearch.bind(this);
   }
 
   componentDidMount() {
     const shortcuts = this.context.shortcuts;
 
     shortcuts.on(L10N.getStr("projectTextSearch.key"), this.toggleProjectTextSearch);
-
-    const searchKeys = [L10N.getStr("sources.search.key2"), L10N.getStr("sources.search.alt.key")];
-    searchKeys.forEach(key => shortcuts.on(key, this.toggleSourceSearch));
   }
 
   componentWillUnmount() {
     const shortcuts = this.context.shortcuts;
     shortcuts.off(L10N.getStr("projectTextSearch.key"), this.toggleProjectTextSearch);
-
-    const searchKeys = [L10N.getStr("sources.search.key2"), L10N.getStr("sources.search.alt.key")];
-    searchKeys.forEach(key => shortcuts.off(key, this.toggleSourceSearch));
   }
 
   toggleProjectTextSearch(key, e) {
     const { closeActiveSearch, setActiveSearch } = this.props;
     if (e) {
       e.preventDefault();
     }
 
     if (this.isProjectSearchEnabled()) {
       return closeActiveSearch();
     }
     return setActiveSearch("project");
   }
 
-  toggleSourceSearch(key, e) {
-    const { closeActiveSearch, setActiveSearch } = this.props;
-    if (e) {
-      e.preventDefault();
-    }
-
-    if (this.isSourceSearchEnabled()) {
-      return closeActiveSearch();
-    }
-    return setActiveSearch("source");
-  }
-
   isProjectSearchEnabled() {
     return this.props.activeSearch === "project";
   }
 
-  isSourceSearchEnabled() {
-    return this.props.activeSearch === "source";
-  }
-
-  renderSourceSearch() {
-    const {
-      sources,
-      selectSource,
-      closeActiveSearch,
-      sourceSearchQuery,
-      setSourceSearchQuery,
-      clearSourceSearchQuery
-    } = this.props;
-    return _react2.default.createElement(_SourceSearch2.default, {
-      sources: sources,
-      selectSource: selectSource,
-      closeActiveSearch: closeActiveSearch,
-      searchBottomBar: _react2.default.createElement(_ToggleSearch2.default, { kind: "sources", toggle: this.toggleProjectTextSearch }),
-      query: sourceSearchQuery,
-      setQuery: setSourceSearchQuery,
-      clearQuery: clearSourceSearchQuery
-    });
-  }
-
   renderTextSearch() {
     const {
       sources,
       results,
       searchSources,
       closeActiveSearch,
       selectSource,
       textSearchQuery
     } = this.props;
 
     return _react2.default.createElement(_TextSearch2.default, {
       sources: sources,
       results: results.toJS(),
       searchSources: searchSources,
       closeActiveSearch: closeActiveSearch,
       selectSource: selectSource,
-      query: textSearchQuery,
-      searchBottomBar: _react2.default.createElement(_ToggleSearch2.default, { kind: "project", toggle: this.toggleSourceSearch })
-    });
-  }
-
-  render() {
-    if (!(this.isProjectSearchEnabled() || this.isSourceSearchEnabled())) {
+      query: textSearchQuery
+    });
+  }
+
+  render() {
+    if (!this.isProjectSearchEnabled()) {
       return null;
     }
 
     return _react2.default.createElement(
       "div",
       { className: "search-container" },
-      this.isProjectSearchEnabled() ? this.renderTextSearch() : this.renderSourceSearch()
+      this.renderTextSearch()
     );
   }
 }
 
 ProjectSearch.propTypes = {
   sources: _propTypes2.default.object.isRequired,
   results: _propTypes2.default.object,
   textSearchQuery: _propTypes2.default.string,
   setActiveSearch: _propTypes2.default.func.isRequired,
   closeActiveSearch: _propTypes2.default.func.isRequired,
   searchSources: _propTypes2.default.func,
   activeSearch: _propTypes2.default.string,
-  selectSource: _propTypes2.default.func.isRequired,
-  sourceSearchQuery: _propTypes2.default.string,
-  setSourceSearchQuery: _propTypes2.default.func,
-  clearSourceSearchQuery: _propTypes2.default.func
+  selectSource: _propTypes2.default.func.isRequired
 };
 
 ProjectSearch.contextTypes = {
   shortcuts: _propTypes2.default.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => ({
   sources: (0, _selectors.getSources)(state),
   activeSearch: (0, _selectors.getActiveSearch)(state),
   results: (0, _selectors.getTextSearchResults)(state),
-  textSearchQuery: (0, _selectors.getTextSearchQuery)(state),
-  sourceSearchQuery: (0, _selectors.getSourceSearchQuery)(state)
+  textSearchQuery: (0, _selectors.getTextSearchQuery)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(ProjectSearch);
 
 /***/ }),
 /* 1539 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
@@ -34452,17 +33899,18 @@ class TextSearch extends _react.Componen
   }
 
   componentWillUnmount() {
     const shortcuts = this.context.shortcuts;
     shortcuts.off("Enter", this.onEnterPress);
   }
 
   selectMatchItem(matchItem) {
-    this.props.selectSource(matchItem.sourceId, { line: matchItem.line });
+    const { line, column } = matchItem;
+    this.props.selectSource(matchItem.sourceId, { location: { line, column } });
   }
 
   getResults() {
     const { results } = this.props;
     return results.filter(result => result.filepath && result.matches.length > 0);
   }
 
   getResultCount() {
@@ -34511,17 +33959,17 @@ class TextSearch extends _react.Componen
     return _react2.default.createElement(
       "div",
       {
         className: (0, _classnames2.default)("file-result", { focused }),
         key: file.sourceId,
         onClick: e => setExpanded(file, !expanded)
       },
       _react2.default.createElement(_Svg2.default, { name: "arrow", className: (0, _classnames2.default)({ expanded }) }),
-      _react2.default.createElement(_Svg2.default, { name: "file" }),
+      _react2.default.createElement("img", { className: "file" }),
       _react2.default.createElement(
         "span",
         { className: "file-path" },
         (0, _sourcesTree.getRelativePath)(file.filepath)
       ),
       _react2.default.createElement(
         "span",
         { className: "matches-summary" },
@@ -34667,16 +34115,17 @@ const svg = {
   vuejs: __webpack_require__(1174),
   "magnifying-glass": __webpack_require__(357),
   "arrow-up": __webpack_require__(919),
   "arrow-down": __webpack_require__(920),
   pause: __webpack_require__(358),
   "pause-exceptions": __webpack_require__(359),
   plus: __webpack_require__(360),
   preact: __webpack_require__(1233),
+  aframe: __webpack_require__(1648),
   prettyPrint: __webpack_require__(361),
   react: __webpack_require__(1000),
   "regex-match": __webpack_require__(362),
   redux: __webpack_require__(256),
   immutable: __webpack_require__(258),
   resume: __webpack_require__(363),
   settings: __webpack_require__(364),
   stepIn: __webpack_require__(365),
@@ -34689,18 +34138,21 @@ const svg = {
   worker: __webpack_require__(372),
   "sad-face": __webpack_require__(1347),
   refresh: __webpack_require__(1348),
   webpack: __webpack_require__(1001),
   node: __webpack_require__(1002),
   express: __webpack_require__(1003),
   pug: __webpack_require__(1004),
   extjs: __webpack_require__(1043),
+  marko: __webpack_require__(1649),
+  nextjs: __webpack_require__(1650),
   showSources: __webpack_require__(1044),
-  showOutline: __webpack_require__(1045)
+  showOutline: __webpack_require__(1045),
+  nuxtjs: __webpack_require__(1651)
 };
 
 function Svg({ name, className, onClick, "aria-label": ariaLabel }) {
   if (!svg[name]) {
     const error = `Unknown SVG: ${name}`;
     if (isDevelopment()) {
       throw new Error(error);
     }
@@ -35631,301 +35083,19 @@ function highlightMatches(lineMatch) {
       "span",
       { className: "line-match", key: 2 },
       value.slice(column + len, value.length)
     )
   );
 } // Maybe reuse file search's functions?
 
 /***/ }),
-/* 1548 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _propTypes = __webpack_require__(20);
-
-var _propTypes2 = _interopRequireDefault(_propTypes);
-
-var _react = __webpack_require__(0);
-
-var _react2 = _interopRequireDefault(_react);
-
-var _source = __webpack_require__(1356);
-
-var _utils = __webpack_require__(1366);
-
-var _Autocomplete = __webpack_require__(1549);
-
-var _Autocomplete2 = _interopRequireDefault(_Autocomplete);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-class SourceSearch extends _react.Component {
-
-  searchResults(sources) {
-    return sources.valueSeq().toJS().filter(source => !(0, _source.isPretty)(source) && !(0, _source.isThirdParty)(source)).map(source => ({
-      value: (0, _source.getSourcePath)(source),
-      title: (0, _source.getSourcePath)(source).split("/").pop(),
-      subtitle: (0, _utils.endTruncateStr)((0, _source.getSourcePath)(source), 100),
-      id: source.id
-    }));
-  }
-
-  render() {
-    const {
-      sources,
-      searchBottomBar,
-      selectSource,
-      query,
-      setQuery
-    } = this.props;
-    return _react2.default.createElement(
-      _Autocomplete2.default,
-      {
-        selectItem: (e, result) => selectSource(result.id),
-        close: this.props.closeActiveSearch,
-        items: this.searchResults(sources),
-        inputValue: query,
-        placeholder: L10N.getStr("sourceSearch.search"),
-        onChangeHandler: setQuery,
-        size: "big"
-      },
-      searchBottomBar
-    );
-  }
-}
-
-exports.default = SourceSearch;
-SourceSearch.contextTypes = {
-  shortcuts: _propTypes2.default.object
-};
-
-/***/ }),
-/* 1549 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _react = __webpack_require__(0);
-
-var _react2 = _interopRequireDefault(_react);
-
-var _fuzzaldrinPlus = __webpack_require__(161);
-
-var _classnames = __webpack_require__(175);
-
-var _classnames2 = _interopRequireDefault(_classnames);
-
-var _resultList = __webpack_require__(1406);
-
-__webpack_require__(1315);
-
-var _SearchInput = __webpack_require__(1379);
-
-var _SearchInput2 = _interopRequireDefault(_SearchInput);
-
-var _ResultList = __webpack_require__(1445);
-
-var _ResultList2 = _interopRequireDefault(_ResultList);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-class Autocomplete extends _react.Component {
-
-  constructor(props) {
-    super(props);
-
-    this.onKeyDown = this.onKeyDown.bind(this);
-    this.state = {
-      selectedIndex: 0,
-      focused: false
-    };
-  }
-
-  componentDidUpdate() {
-    if (this.refs.resultList && this.refs.resultList.refs) {
-      (0, _resultList.scrollList)(this.refs.resultList.refs, this.state.selectedIndex);
-    }
-  }
-
-  getSearchResults() {
-    const inputValue = this.props.inputValue;
-    if (inputValue == "") {
-      return [];
-    }
-
-    return (0, _fuzzaldrinPlus.filter)(this.props.items, inputValue, {
-      key: "value"
-    });
-  }
-
-  onKeyDown(e) {
-    const searchResults = this.getSearchResults(),
-          resultCount = searchResults.length;
-
-    if (e.key === "ArrowUp") {
-      const selectedIndex = Math.max(0, this.state.selectedIndex - 1);
-      this.setState({ selectedIndex });
-      if (this.props.onSelectedItem) {
-        this.props.onSelectedItem(searchResults[selectedIndex]);
-      }
-      e.preventDefault();
-    } else if (e.key === "ArrowDown") {
-      const selectedIndex = Math.min(resultCount - 1, this.state.selectedIndex + 1);
-      this.setState({ selectedIndex });
-      if (this.props.onSelectedItem) {
-        this.props.onSelectedItem(searchResults[selectedIndex]);
-      }
-      e.preventDefault();
-    } else if (e.key === "Enter") {
-      if (searchResults.length) {
-        this.props.selectItem(e, searchResults[this.state.selectedIndex]);
-      } else {
-        this.props.close(this.props.inputValue);
-      }
-      e.preventDefault();
-    } else if (e.key === "Tab") {
-      this.props.close(this.props.inputValue);
-      e.preventDefault();
-    }
-  }
-
-  renderResults(results) {
-    const { size } = this.props;
-
-    if (results.length) {
-      const props = {
-        items: results,
-        selected: this.state.selectedIndex,
-        selectItem: this.props.selectItem,
-        close: this.props.close,
-        size,
-        ref: "resultList"
-      };
-
-      return _react2.default.createElement(_ResultList2.default, props);
-    } else if (this.props.inputValue && !results.length) {
-      return _react2.default.createElement(
-        "div",
-        { className: "no-result-msg absolute-center" },
-        L10N.getStr("sourceSearch.noResults2")
-      );
-    }
-  }
-
-  render() {
-    const { focused } = this.state;
-    const { size, children } = this.props;
-    const searchResults = this.getSearchResults();
-    const summaryMsg = L10N.getFormatStr("sourceSearch.resultsSummary1", searchResults.length);
-
-    const searchProps = {
-      query: this.props.inputValue,
-      count: searchResults.length,
-      placeholder: this.props.placeholder,
-      size,
-      showErrorEmoji: true,
-      summaryMsg,
-      onChange: e => {
-        this.props.onChangeHandler(e.target.value);
-        this.setState({
-          selectedIndex: 0
-        });
-      },
-      onFocus: () => this.setState({ focused: true }),
-      onBlur: () => this.setState({ focused: false }),
-      onKeyDown: this.onKeyDown,
-      handleClose: this.props.close
-    };
-
-    return _react2.default.createElement(
-      "div",
-      { className: (0, _classnames2.default)("autocomplete", { focused }) },
-      _react2.default.createElement(_SearchInput2.default, searchProps),
-      children,
-      this.renderResults(searchResults)
-    );
-  }
-}
-
-exports.default = Autocomplete;
-Autocomplete.defaultProps = {
-  size: ""
-};
-
-/***/ }),
-/* 1550 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _propTypes = __webpack_require__(20);
-
-var _propTypes2 = _interopRequireDefault(_propTypes);
-
-var _react = __webpack_require__(0);
-
-var _react2 = _interopRequireDefault(_react);
-
-var _classnames = __webpack_require__(175);
-
-var _classnames2 = _interopRequireDefault(_classnames);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-class ToggleSearch extends _react.Component {
-  render() {
-    const { kind, toggle } = this.props;
-    const isSourcesActive = kind === "sources";
-    return _react2.default.createElement(
-      "div",
-      { className: "toggle-search" },
-      _react2.default.createElement(
-        "span",
-        {
-          className: (0, _classnames2.default)("text", { active: isSourcesActive }),
-          onClick: toggle
-        },
-        L10N.getStr("sourceSearch.search")
-      ),
-      _react2.default.createElement(
-        "span",
-        {
-          className: (0, _classnames2.default)("text", { active: !isSourcesActive }),
-          onClick: toggle
-        },
-        L10N.getStr("projectTextSearch.placeholder")
-      )
-    );
-  }
-}
-
-exports.default = ToggleSearch;
-ToggleSearch.propTypes = {
-  kind: _propTypes2.default.string.isRequired,
-  toggle: _propTypes2.default.func.isRequired
-};
-
-/***/ }),
+/* 1548 */,
+/* 1549 */,
+/* 1550 */,
 /* 1551 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -36098,17 +35268,16 @@ var _PreviewFunction = __webpack_require
 
 var _PreviewFunction2 = _interopRequireDefault(_PreviewFunction);
 
 var _lodash = __webpack_require__(2);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Outline extends _react.Component {
-
   selectItem(location) {
     const { selectedSource, selectSource } = this.props;
     if (!selectedSource) {
       return;
     }
     const selectedSourceId = selectedSource.get("id");
     const startLine = location.start.line;
     selectSource(selectedSourceId, { line: startLine });
@@ -36252,16 +35421,17 @@ function _interopRequireDefault(obj) { r
 
 class SourcesTree extends _react.Component {
 
   constructor(props) {
     super(props);
     this.state = (0, _sourcesTree.createTree)(this.props.sources, this.props.debuggeeUrl, this.props.projectRoot);
     this.focusItem = this.focusItem.bind(this);
     this.selectItem = this.selectItem.bind(this);
+    this.getPath = this.getPath.bind(this);
     this.getIcon = this.getIcon.bind(this);
     this.onContextMenu = this.onContextMenu.bind(this);
     this.renderItem = this.renderItem.bind(this);
 
     this.queueUpdate = (0, _utils.throttle)(function () {
       if (!this.mounted) {
         return;
       }
@@ -36348,30 +35518,40 @@ class SourcesTree extends _react.Compone
   }
 
   selectItem(item) {
     if (!(0, _sourcesTree.nodeHasChildren)(item)) {
       this.props.selectSource(item.contents.get("id"));
     }
   }
 
-  getIcon(item, depth) {
+  getPath(item) {
+    const { sources } = this.props;
+    const blackBoxedPart = item.contents.get && sources.get(item.contents.get("id")).get("isBlackBoxed") ? "update" : "";
+    return `${item.path}/${item.name}/${blackBoxedPart}`;
+  }
+
+  getIcon(sources, item, depth) {
     if (item.path === "/Webpack") {
       return _react2.default.createElement(_Svg2.default, { name: "webpack" });
     }
 
     if (depth === 0) {
-      return _react2.default.createElement(_Svg2.default, { name: "domain" });
+      return _react2.default.createElement("img", { className: "domain" });
     }
 
     if (!(0, _sourcesTree.nodeHasChildren)(item)) {
-      return _react2.default.createElement(_Svg2.default, { name: "file" });
-    }
-
-    return _react2.default.createElement(_Svg2.default, { name: "folder" });
+      const source = sources.get(item.contents.get("id"));
+      if (source.get("isBlackBoxed")) {
+        return _react2.default.createElement("img", { className: "blackBox" });
+      }
+      return _react2.default.createElement("img", { className: "file" });
+    }
+
+    return _react2.default.createElement("img", { className: "folder" });
   }
 
   onContextMenu(event, item) {
     const copySourceUri2Label = L10N.getStr("copySourceUri2");
     const copySourceUri2Key = L10N.getStr("copySourceUri2.accesskey");
     const setDirectoryRootLabel = L10N.getStr("setDirectoryRoot.label");
     const setDirectoryRootKey = L10N.getStr("setDirectoryRoot.accesskey");
 
@@ -36408,18 +35588,18 @@ class SourcesTree extends _react.Compone
       className: (0, _classnames2.default)("arrow", {
         expanded: expanded
       }),
       onClick: e => {
         e.stopPropagation();
         setExpanded(item, !expanded, e.altKey);
       }
     }) : _react2.default.createElement("i", { className: "no-arrow" });
-
-    const icon = this.getIcon(item, depth);
+    const { sources } = this.props;
+    const icon = this.getIcon(sources, item, depth);
     let paddingDir = "paddingRight";
     if (document.body && document.body.parentElement) {
       paddingDir = document.body.parentElement.dir == "ltr" ? "paddingLeft" : "paddingRight";
     }
 
     return _react2.default.createElement(
       "div",
       {
@@ -36455,17 +35635,17 @@ class SourcesTree extends _react.Compone
     } = this.state;
 
     const isEmpty = sourceTree.contents.length === 0;
     const treeProps = {
       key: isEmpty ? "empty" : "full",
       getParent: item => parentMap.get(item),
       getChildren: item => (0, _sourcesTree.nodeHasChildren)(item) ? item.contents : [],
       getRoots: () => sourceTree.contents,
-      getPath: item => `${item.path}/${item.name}`,
+      getPath: this.getPath,
       itemHeight: 21,
       autoExpandDepth: expanded ? 0 : 1,
       autoExpandAll: false,
       onFocus: this.focusItem,
       listItems,
       highlightItems,
       expanded,
       onExpand: (item, expandedState) => setExpandedState(expandedState),
@@ -36511,17 +35691,18 @@ class SourcesTree extends _react.Compone
 
 // React
 exports.default = (0, _reactRedux.connect)(state => {
   return {
     shownSource: (0, _selectors.getShownSource)(state),
     selectedSource: (0, _selectors.getSelectedSource)(state),
     debuggeeUrl: (0, _selectors.getDebuggeeUrl)(state),
     expanded: (0, _selectors.getExpandedState)(state),
-    projectRoot: (0, _selectors.getProjectDirectoryRoot)(state)
+    projectRoot: (0, _selectors.getProjectDirectoryRoot)(state),
+    sources: (0, _selectors.getSources)(state)
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(SourcesTree);
 
 /***/ }),
 /* 1554 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -36614,28 +35795,31 @@ var _EditorMenu = __webpack_require__(15
 var _EditorMenu2 = _interopRequireDefault(_EditorMenu);
 
 var _ConditionalPanel = __webpack_require__(1598);
 
 var _ConditionalPanel2 = _interopRequireDefault(_ConditionalPanel);
 
 var _editor = __webpack_require__(1358);
 
+var _ui = __webpack_require__(1439);
+
 __webpack_require__(1332);
 
 __webpack_require__(1333);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 const cssVars = {
   searchbarHeight: "var(--editor-searchbar-height)",
   secondSearchbarHeight: "var(--editor-second-searchbar-height)",
   footerHeight: "var(--editor-footer-height)"
 };
 
+
 class Editor extends _react.PureComponent {
 
   constructor() {
     super();
 
     this.onToggleBreakpoint = (key, e) => {
       e.preventDefault();
       const { codeMirror } = this.state.editor;
@@ -36707,16 +35891,18 @@ class Editor extends _react.PureComponen
 
       if (ev.shiftKey) {
         return addOrToggleDisabledBreakpoint(sourceLine);
       }
       return toggleBreakpoint(sourceLine);
     };
 
     this.onGutterContextMenu = event => {
+      event.stopPropagation();
+      event.preventDefault();
       return this.props.setContextMenu("Gutter", event);
     };
 
     this.toggleConditionalPanel = line => {
       const {
         conditionalPanelLine,
         closeConditionalPanel,
         openConditionalPanel
@@ -36741,17 +35927,18 @@ class Editor extends _react.PureComponen
     };
   }
 
   componentWillReceiveProps(nextProps) {
     if (!this.state.editor) {
       return;
     }
 
-    (0, _editor.resizeBreakpointGutter)(this.state.editor.codeMirror);
+    (0, _ui.resizeBreakpointGutter)(this.state.editor.codeMirror);
+    (0, _ui.resizeToggleButton)(this.state.editor.codeMirror);
   }
 
   setupEditor() {
     const editor = (0, _editor.createEditor)();
 
     // disables the default search shortcuts
 
     editor._initShortcuts = () => {};
@@ -36759,17 +35946,19 @@ class Editor extends _react.PureComponen
     const node = _reactDom2.default.findDOMNode(this);
     if (node instanceof HTMLElement) {
       editor.appendToLocalElement(node.querySelector(".editor-mount"));
     }
 
     const { codeMirror } = editor;
     const codeMirrorWrapper = codeMirror.getWrapperElement();
 
-    (0, _editor.resizeBreakpointGutter)(codeMirror);
+    (0, _ui.resizeBreakpointGutter)(codeMirror);
+    (0, _ui.resizeToggleButton)(codeMirror);
+
     (0, _devtoolsLaunchpad.debugGlobal)("cm", codeMirror);
 
     codeMirror.on("gutterClick", this.onGutterClick);
 
     // Set code editor wrapper to be focusable
     codeMirrorWrapper.tabIndex = 0;
     codeMirrorWrapper.addEventListener("keydown", e => this.onKeyDown(e));
     codeMirrorWrapper.addEventListener("click", e => this.onClick(e));
@@ -36782,29 +35971,20 @@ class Editor extends _react.PureComponen
       }
     };
 
     const codeMirrorGutter = codeMirror.getGutterElement();
     codeMirrorGutter.addEventListener("mouseleave", toggleFoldMarkerVisibility);
     codeMirrorGutter.addEventListener("mouseenter", toggleFoldMarkerVisibility);
 
     if (!(0, _devtoolsConfig.isFirefox)()) {
-      codeMirror.on("gutterContextMenu", (cm, line, eventName, event) => {
-        event.stopPropagation();
-        event.preventDefault();
-        return this.onGutterContextMenu(event);
-      });
-
+      codeMirror.on("gutterContextMenu", (cm, line, eventName, event) => this.onGutterContextMenu(event));
       codeMirror.on("contextmenu", (cm, event) => this.openMenu(event));
     } else {
-      codeMirrorWrapper.addEventListener("contextmenu", event => {
-        event.stopPropagation();
-        event.preventDefault();
-        return this.openMenu(event);
-      });
+      codeMirrorWrapper.addEventListener("contextmenu", event => this.openMenu(event));
     }
 
     this.setState({ editor });
     return editor;
   }
 
   componentDidMount() {
     const editor = this.setupEditor();
@@ -36852,29 +36032,30 @@ class Editor extends _react.PureComponen
     // `this.props` to be the current props. This lifecycle method is
     // responsible for updating the editor annotations.
     const { selectedLocation, selectedSource } = this.props;
 
     // If the location is different and a new line is requested,
     // update the pending jump line. Note that if jumping to a line in
     // a source where the text hasn't been loaded yet, we will set the
     // line here but not jump until rendering the actual source.
+
     if (prevProps.selectedLocation !== selectedLocation) {
       if (selectedLocation && selectedLocation.line != undefined) {
         this.pendingJumpLocation = selectedLocation;
       } else {
         this.pendingJumpLocation = null;
       }
     }
 
     // Only update and jump around in real source texts. This will
     // keep the jump state around until the real source text is
     // loaded.
-    if (selectedSource && selectedSource.has("text")) {
-      this.flashLine();
+    if (selectedSource && (0, _source.isLoaded)(selectedSource.toJS())) {
+      this.highlightLine();
     }
   }
 
   onKeyDown(e) {
     const { codeMirror } = this.state.editor;
     const { key, target } = e;
     const codeWrapper = codeMirror.getWrapperElement();
     const textArea = codeWrapper.querySelector("textArea");
@@ -36894,16 +36075,19 @@ class Editor extends _react.PureComponen
    * The default Esc command is overridden in the CodeMirror keymap to allow
    * the Esc keypress event to be catched by the toolbox and trigger the
    * split console. Restore it here, but preventDefault if and only if there
    * is a multiselection.
    */
 
 
   openMenu(event) {
+    event.stopPropagation();
+    event.preventDefault();
+
     const { setContextMenu } = this.props;
 
     if (event.target.classList.contains("CodeMirror-linenumber")) {
       return setContextMenu("Gutter", event);
     }
 
     return setContextMenu("Editor", event);
   }
@@ -36914,45 +36098,54 @@ class Editor extends _react.PureComponen
     if (e.metaKey && e.altKey) {
       const sourceLocation = (0, _editor.getSourceLocationFromMouseEvent)(this.state.editor, selectedLocation, e);
       jumpToMappedLocation(sourceLocation);
     }
   }
 
   // If the location has changed and a specific line is requested,
   // move to that line and flash it.
-  flashLine() {
-    if (!this.pendingJumpLocation) {
+  highlightLine() {
+    const { selectedLocation, selectedFrame } = this.props;
+    if (!selectedLocation) {
       return;
     }
 
     // Make sure to clean up after ourselves. Not only does this
     // cancel any existing animation, but it avoids it from
     // happening ever again (in case CodeMirror re-applies the
     // class, etc).
-    if (this.lastJumpLine) {
+    if (this.lastJumpLine !== null) {
       (0, _editor.clearLineClass)(this.state.editor.codeMirror, "highlight-line");
     }
 
-    const { sourceId, line: sourceLine } = this.pendingJumpLocation;
-    const line = (0, _editor.toEditorLine)(sourceId, sourceLine);
-    this.state.editor.alignLine(line);
+    let line = null;
+    if (selectedLocation.line >= 0) {
+      line = this.scrollToPosition();
+    }
 
     // We only want to do the flashing animation if it's not a debug
     // line, which has it's own styling.
     // Also, if it the first time the debugger is being loaded, we don't want
     // to flash the previously saved selected line.
-    if (this.lastJumpLine && (!this.props.selectedFrame || this.props.selectedFrame.location.line !== line)) {
+    if (line !== null && this.lastJumpLine !== null && (!selectedFrame || selectedFrame.location.line !== line)) {
       this.state.editor.codeMirror.addLineClass(line, "line", "highlight-line");
     }
 
     this.lastJumpLine = line;
     this.pendingJumpLocation = null;
   }
 
+  scrollToPosition() {
+    const { sourceId, line, column } = this.props.selectedLocation;
+    const editorLine = (0, _editor.toEditorLine)(sourceId, line);
+    (0, _editor.scrollToColumn)(this.state.editor.codeMirror, editorLine, column);
+    return editorLine;
+  }
+
   setSize(nextProps) {
     if (!this.state.editor) {
       return;
     }
 
     if (nextProps.startPanelSize !== this.props.startPanelSize || nextProps.endPanelSize !== this.props.endPanelSize) {
       this.state.editor.codeMirror.setSize();
     }
@@ -37160,17 +36353,16 @@ var _PaneToggle = __webpack_require__(14
 
 var _PaneToggle2 = _interopRequireDefault(_PaneToggle);
 
 __webpack_require__(1322);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class SourceFooter extends _react.PureComponent {
-
   prettyPrintButton() {
     const { selectedSource, togglePrettyPrint } = this.props;
     const sourceLoaded = selectedSource && (0, _source.isLoaded)(selectedSource.toJS());
 
     if (!(0, _editor.shouldShowPrettyPrint)(selectedSource)) {
       return;
     }
 
@@ -37365,17 +36557,16 @@ function getShortcuts() {
   return {
     shiftSearchAgainShortcut: searchAgainPrevKey,
     searchAgainShortcut: searchAgainKey,
     searchShortcut: searchKey
   };
 }
 
 class SearchBar extends _react.Component {
-
   constructor(props) {
     super(props);
 
     this.onEscape = e => {
       this.closeSearch(e);
     };
 
     this.clearSearch = () => {
@@ -37570,31 +36761,16 @@ class SearchBar extends _react.Component
 
     if (index == -1) {
       return L10N.getFormatStr("sourceSearch.resultsSummary1", count);
     }
 
     return L10N.getFormatStr("editor.searchResults", matchIndex + 1, count);
   }
 
-  renderSearchType() {
-    return _react2.default.createElement(
-      "div",
-      { className: "search-type-toggles" },
-      _react2.default.createElement(
-        "span",
-        {
-          className: "search-type-name",
-          onClick: () => this.props.setActiveSearch("symbol")
-        },
-        L10N.getStr("symbolSearch.search.functionsPlaceholder")
-      )
-    );
-  }
-
   render() {
     const { searchResults: { count }, searchOn } = this.props;
 
     if (!searchOn) {
       return _react2.default.createElement("div", null);
     }
 
     return _react2.default.createElement(
@@ -37609,17 +36785,16 @@ class SearchBar extends _react.Component
         onKeyUp: this.onKeyUp,
         handleNext: e => this.traverseResults(e, false),
         handlePrev: e => this.traverseResults(e, true),
         handleClose: this.closeSearch
       }),
       _react2.default.createElement(
         "div",
         { className: "search-bottom-bar" },
-        this.renderSearchType(),
         this.renderSearchModifiers()
       )
     );
   }
 }
 
 SearchBar.contextTypes = {
   shortcuts: _propTypes2.default.object
@@ -40645,17 +39820,16 @@ class Popover extends _react.Component {
     return this.renderPopover();
   }
 }
 
 Popover.defaultProps = {
   onMouseLeave: () => {},
   type: "popover"
 };
-
 exports.default = Popover;
 
 /***/ }),
 /* 1587 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
@@ -40725,17 +39899,16 @@ var _visibleBreakpoints2 = _interopRequi
 
 var _breakpoint = __webpack_require__(1364);
 
 var _source = __webpack_require__(1356);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Breakpoints extends _react.Component {
-
   shouldComponentUpdate(nextProps) {
     if (nextProps.selectedSource && !(0, _source.isLoaded)(nextProps.selectedSource.toJS())) {
       return false;
     }
 
     return true;
   }
 
@@ -40915,17 +40088,16 @@ const markerEl = document.createElement(
 
 function makeMarker() {
   const marker = markerEl.cloneNode(true);
   marker.className = "editor hit-marker";
   return marker;
 }
 
 class HitMarker extends _react.Component {
-
   addMarker() {
     const hitData = this.props.hitData;
     const line = hitData.line - 1;
 
     this.props.editor.setGutterMarker(line, "hit-markers", makeMarker());
 
     this.props.editor.addLineClass(line, "line", "hit-marker");
   }
@@ -41290,49 +40462,56 @@ var _editor = __webpack_require__(1358);
 
 var _sourceDocuments = __webpack_require__(1436);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _selectors = __webpack_require__(1352);
 
 class DebugLine extends _react.Component {
-
   constructor() {
     super();
     this.state = { debugExpression: { clear: () => {} } };
   }
 
   componentDidMount() {
-    this.setDebugLine(this.props.selectedFrame, this.props.selectedLocation, this.props.editor);
+    this.setDebugLine(this.props.pauseInfo, this.props.selectedFrame, this.props.selectedLocation, this.props.editor);
   }
 
   componentWillReceiveProps(nextProps) {
     this.clearDebugLine(this.props.selectedFrame, this.props.editor);
-    this.setDebugLine(nextProps.selectedFrame, nextProps.selectedLocation, nextProps.editor);
+    this.setDebugLine(nextProps.pauseInfo, nextProps.selectedFrame, nextProps.selectedLocation, nextProps.editor);
   }
 
   componentWillUnmount() {
     this.clearDebugLine(this.props.selectedFrame, this.props.editor);
   }
 
-  setDebugLine(selectedFrame, selectedLocation, editor) {
+  setDebugLine(pauseInfo, selectedFrame, selectedLocation, editor) {
     if (!selectedFrame) {
       return;
     }
+
     const { location, location: { sourceId } } = selectedFrame;
-    const { line, column } = (0, _editor.toEditorPosition)(sourceId, location);
-
     const doc = (0, _sourceDocuments.getDocument)(sourceId);
     if (!doc) {
       return;
     }
 
-    doc.addLineClass(line, "line", "new-debug-line");
-    const debugExpression = (0, _editor.markText)(editor, "debug-expression", {
+    const { line, column } = (0, _editor.toEditorPosition)(sourceId, location);
+
+    // make sure the line is visible
+    if (editor && editor.alignLine) {
+      editor.alignLine(line);
+    }
+
+    const { markTextClass, lineClass } = this.getTextClasses(pauseInfo);
+    doc.addLineClass(line, "line", lineClass);
+
+    const debugExpression = (0, _editor.markText)(editor, markTextClass, {
       start: { line, column },
       end: { line, column: null }
     });
     this.setState({ debugExpression });
   }
 
   clearDebugLine(selectedFrame, editor) {
     if (!selectedFrame) {
@@ -41346,27 +40525,39 @@ class DebugLine extends _react.Component
 
     const editorLine = line - 1;
     const doc = (0, _sourceDocuments.getDocument)(sourceId);
     if (!doc) {
       return;
     }
 
     doc.removeLineClass(editorLine, "line", "new-debug-line");
+    doc.removeLineClass(editorLine, "line", "new-debug-line-error");
+  }
+
+  getTextClasses(pauseInfo) {
+    if (pauseInfo && pauseInfo.why.type === "exception") {
+      return {
+        markTextClass: "debug-expression-error",
+        lineClass: "new-debug-line-error"
+      };
+    }
+    return { markTextClass: "debug-expression", lineClass: "new-debug-line" };
   }
 
   render() {
     return null;
   }
 }
 
 exports.DebugLine = DebugLine;
 exports.default = (0, _reactRedux.connect)(state => ({
   selectedLocation: (0, _selectors.getSelectedLocation)(state),
-  selectedFrame: (0, _selectors.getSelectedFrame)(state)
+  selectedFrame: (0, _selectors.getSelectedFrame)(state),
+  pauseInfo: (0, _selectors.getPause)(state)
 }))(DebugLine);
 
 /***/ }),
 /* 1594 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
@@ -41584,31 +40775,37 @@ class GutterContextMenuComponent extends
   showMenu(nextProps) {
     const { contextMenu } = nextProps,
           props = _objectWithoutProperties(nextProps, ["contextMenu"]);
     const { event } = contextMenu;
     const sourceId = props.selectedSource ? props.selectedSource.get("id") : "";
     const line = (0, _editor.lineAtHeight)(props.editor, sourceId, event);
     const breakpoint = nextProps.breakpoints.find(bp => bp.location.line === line);
 
+    if (props.emptyLines.includes(line)) {
+      return;
+    }
+
     gutterMenu(_extends({ event, sourceId, line, breakpoint }, props));
   }
 
   render() {
     return null;
   }
 }
 
 exports.default = (0, _reactRedux.connect)(state => {
+  const selectedSource = (0, _selectors.getSelectedSource)(state);
   return {
     selectedLocation: (0, _selectors.getSelectedLocation)(state),
-    selectedSource: (0, _selectors.getSelectedSource)(state),
+    selectedSource: selectedSource,
     breakpoints: (0, _selectors.getVisibleBreakpoints)(state),
     pauseData: (0, _selectors.getPause)(state),
-    contextMenu: (0, _selectors.getContextMenu)(state)
+    contextMenu: (0, _selectors.getContextMenu)(state),
+    emptyLines: selectedSource ? (0, _selectors.getEmptyLines)(state, selectedSource.toJS()) : []
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(GutterContextMenuComponent);
 
 /***/ }),
 /* 1596 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -41681,33 +40878,34 @@ function getMenuItems(event, {
     id: "node-menu-copy-source",
     label: copySourceLabel,
     accesskey: copySourceKey,
     disabled: selectionText.length === 0,
     click: () => (0, _clipboard.copyToTheClipboard)(selectionText)
   };
 
   const { line } = editor.codeMirror.coordsChar({
-    left: event.clientX
+    left: event.clientX,
+    top: event.clientY
   });
 
   const sourceLocation = (0, _editor.getSourceLocationFromMouseEvent)(editor, selectedLocation, event);
 
   const pairedType = (0, _devtoolsSourceMap.isOriginalId)(selectedLocation.sourceId) ? L10N.getStr("generated") : L10N.getStr("original");
 
   const jumpLabel = {
     accesskey: L10N.getStr("editor.jumpToMappedLocation1.accesskey"),
     disabled: false,
     label: L10N.getFormatStr("editor.jumpToMappedLocation1", pairedType),
     click: () => jumpToMappedLocation(sourceLocation)
   };
 
   const watchExpressionLabel = {
-    accesskey: L10N.getStr("expressions.placeholder.accesskey"),
-    label: L10N.getStr("expressions.placeholder"),
+    accesskey: L10N.getStr("expressions.accesskey"),
+    label: L10N.getStr("expressions.label"),
     click: () => addExpression(editor.codeMirror.getSelection())
   };
 
   const blackBoxMenuItem = {
     id: "node-menu-blackbox",
     label: toggleBlackBoxLabel,
     accesskey: blackboxKey,
     disabled: false,
@@ -41854,20 +41052,16 @@ var _selectors = __webpack_require__(135
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class ConditionalPanel extends _react.PureComponent {
 
   constructor() {
     super();
 
-    this.setInput = node => {
-      this.input = node;
-    };
-
     this.saveAndClose = () => {
       if (this.input) {
         this.setBreakpoint(this.input.value);
       }
 
       this.props.closeConditionalPanel();
     };
 
@@ -41875,17 +41069,22 @@ class ConditionalPanel extends _react.Pu
       if (e.key === "Enter") {
         this.saveAndClose();
       } else if (e.key === "Escape") {
         this.props.closeConditionalPanel();
       }
     };
 
     this.cbPanel = null;
-    this.input = {};
+  }
+
+  keepFocusOnInput() {
+    if (this.input) {
+      this.input.focus();
+    }
   }
 
   setBreakpoint(condition) {
     const { selectedLocation, line } = this.props;
     const sourceId = selectedLocation ? selectedLocation.sourceId : "";
     const location = { sourceId, line };
     return this.props.setBreakpointCondition(location, { condition });
   }
@@ -41908,36 +41107,42 @@ class ConditionalPanel extends _react.Pu
     const { selectedLocation, line, editor } = props;
     const sourceId = selectedLocation ? selectedLocation.sourceId : "";
 
     const editorLine = (0, _editor.toEditorLine)(sourceId, line);
     this.cbPanel = editor.codeMirror.addLineWidget(editorLine, this.renderConditionalPanel(props), {
       coverGutter: true,
       noHScroll: false
     });
-    this.input.focus();
+    if (this.input) {
+      this.input.focus();
+    }
   }
 
   renderConditionalPanel(props) {
     const { breakpoint } = props;
     const condition = breakpoint ? breakpoint.condition : "";
     const panel = document.createElement("div");
     _reactDom2.default.render(_react2.default.createElement(
       "div",
-      { className: "conditional-breakpoint-panel" },
+      {
+        className: "conditional-breakpoint-panel",
+        onClick: () => this.keepFocusOnInput(),
+        onBlur: this.props.closeConditionalPanel
+      },
       _react2.default.createElement(
         "div",
         { className: "prompt" },
         "\xBB"
       ),
       _react2.default.createElement("input", {
         defaultValue: condition,
         placeholder: L10N.getStr("editor.conditionalPanel.placeholder"),
         onKeyDown: this.onKey,
-        ref: this.setInput
+        ref: input => this.input = input
       }),
       _react2.default.createElement(_Close2.default, {
         handleClick: this.props.closeConditionalPanel,
         buttonClass: "big",
         tooltip: L10N.getStr("editor.conditionalPanel.close")
       })
     ), panel);
     return panel;
@@ -42335,17 +41540,16 @@ function renderSourceLocation(source, li
   return _react2.default.createElement(
     "div",
     { className: "location" },
     `${(0, _utils.endTruncateStr)(filename, 30)}: ${bpLocation}`
   );
 }
 
 class Breakpoints extends _react.PureComponent {
-
   shouldComponentUpdate(nextProps, nextState) {
     const { breakpoints } = this.props;
     return breakpoints !== nextProps.breakpoints;
   }
 
   handleCheckbox(breakpoint) {
     if (breakpoint.loading) {
       return;
@@ -42895,18 +42099,18 @@ var _selectors = __webpack_require__(135
 __webpack_require__(1338);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 const NUM_FRAMES_SHOWN = 7;
 
 class Frames extends _react.Component {
 
-  constructor(...args) {
-    super(...args);
+  constructor(props) {
+    super(props);
 
     this.state = {
       showAllFrames: false
     };
 
     this.toggleFramesDisplay = this.toggleFramesDisplay.bind(this);
     this.copyStackTrace = this.copyStackTrace.bind(this);
     this.toggleFrameworkGrouping = this.toggleFrameworkGrouping.bind(this);
@@ -42967,17 +42171,17 @@ class Frames extends _react.Component {
       framesOrGroups.map(frameOrGroup => frameOrGroup.id ? _react2.default.createElement(_Frame2.default, {
         frame: frameOrGroup,
         toggleFrameworkGrouping: this.toggleFrameworkGrouping,
         copyStackTrace: this.copyStackTrace,
         frameworkGroupingOn: frameworkGroupingOn,
         selectFrame: selectFrame,
         selectedFrame: selectedFrame,
         toggleBlackBox: toggleBlackBox,
-        key: frameOrGroup.id
+        key: String(frameOrGroup.id)
       }) : _react2.default.createElement(_Group2.default, {
         group: frameOrGroup,
         toggleFrameworkGrouping: this.toggleFrameworkGrouping,
         copyStackTrace: this.copyStackTrace,
         frameworkGroupingOn: frameworkGroupingOn,
         selectFrame: selectFrame,
         selectedFrame: selectedFrame,
         toggleBlackBox: toggleBlackBox,
@@ -43488,17 +42692,16 @@ var _Svg = __webpack_require__(1359);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
 __webpack_require__(1341);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Accordion extends _react.Component {
-
   constructor(props) {
     super();
 
     this.renderContainer = (item, i) => {
       const { opened, created } = this.state;
       const containerClassName = `${item.header.toLowerCase().replace(/\s/g, "-")}-pane`;
 
       return _react2.default.createElement(
@@ -43597,20 +42800,16 @@ var _reactRedux = __webpack_require__(11
 var _redux = __webpack_require__(3);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _selectors = __webpack_require__(1352);
 
-var _Svg = __webpack_require__(1359);
-
-var _Svg2 = _interopRequireDefault(_Svg);
-
 var _text = __webpack_require__(1387);
 
 var _actions = __webpack_require__(1354);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 __webpack_require__(1295);
 
@@ -43675,22 +42874,21 @@ function debugBtn(onClick, type, classNa
     "aria-label": tooltip,
     title: tooltip,
     disabled
   };
 
   return _react2.default.createElement(
     "button",
     _extends({ className: (0, _classnames2.default)(type, className) }, props),
-    _react2.default.createElement(_Svg2.default, { name: type })
+    _react2.default.createElement("img", { className: type })
   );
 }
 
 class CommandBar extends _react.Component {
-
   componentWillUnmount() {
     const shortcuts = this.context.shortcuts;
     COMMANDS.forEach(action => shortcuts.off(getKey(action)));
     if (isMacOS) {
       COMMANDS.forEach(action => shortcuts.off(getKeyForOS("WINNT", action)));
     }
   }
 
@@ -43824,17 +43022,16 @@ function debugBtn(onClick, type, classNa
   return _react2.default.createElement(
     "button",
     _extends({ className: (0, _classnames2.default)(type, className) }, props),
     "?"
   );
 }
 
 class UtilsBar extends _react.Component {
-
   renderUtilButtons() {
     return [debugBtn(this.props.toggleShortcutsModal, "shortcut", "active", L10N.getStr("shortcuts.buttonName"), false)];
   }
 
   render() {
     return _react2.default.createElement(
       "div",
       {
@@ -44115,33 +43312,33 @@ var _scopes = __webpack_require__(1612);
 
 var _devtoolsReps = __webpack_require__(1408);
 
 __webpack_require__(1296);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Scopes extends _react.PureComponent {
-
   constructor(props, ...args) {
     const { pauseInfo, selectedFrame, frameScopes } = props;
 
     super(props, ...args);
 
     this.state = {
       scopes: (0, _scopes.getScopes)(pauseInfo, selectedFrame, frameScopes)
     };
   }
 
   componentWillReceiveProps(nextProps) {
-    const { pauseInfo, selectedFrame } = this.props;
+    const { pauseInfo, selectedFrame, frameScopes } = this.props;
     const pauseInfoChanged = pauseInfo !== nextProps.pauseInfo;
-    const selectedFrameChange = selectedFrame !== nextProps.selectedFrame;
-
-    if (pauseInfoChanged || selectedFrameChange) {
+    const selectedFrameChanged = selectedFrame !== nextProps.selectedFrame;
+    const frameScopesChanged = frameScopes !== nextProps.frameScopes;
+
+    if (pauseInfoChanged || selectedFrameChanged || frameScopesChanged) {
       this.setState({
         scopes: (0, _scopes.getScopes)(nextProps.pauseInfo, nextProps.selectedFrame, nextProps.frameScopes)
       });
     }
   }
 
   render() {
     const { pauseInfo, loadObjectProperties, loadedObjects } = this.props;
@@ -44402,17 +43599,16 @@ var _PaneToggle = __webpack_require__(14
 
 var _PaneToggle2 = _interopRequireDefault(_PaneToggle);
 
 __webpack_require__(1343);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class WelcomeBox extends _react.Component {
-
   renderToggleButton() {
     const { horizontal, endPanelCollapsed, togglePaneCollapse } = this.props;
     if (horizontal) {
       return;
     }
 
     return _react2.default.createElement(_PaneToggle2.default, {
       position: "end",
@@ -44424,30 +43620,30 @@ class WelcomeBox extends _react.Componen
 
   render() {
     const searchSourcesShortcut = (0, _text.formatKeyShortcut)(L10N.getStr("sources.search.key2"));
 
     const searchProjectShortcut = (0, _text.formatKeyShortcut)(L10N.getStr("projectTextSearch.key"));
 
     const searchSourcesLabel = L10N.getStr("welcome.search").substring(2);
     const searchProjectLabel = L10N.getStr("welcome.findInFiles").substring(2);
-    const { setActiveSearch } = this.props;
+    const { setActiveSearch, openQuickOpen } = this.props;
 
     return _react2.default.createElement(
       "div",
       { className: "welcomebox" },
       _react2.default.createElement(
         "div",
         { className: "alignlabel small-size-layout" },
         _react2.default.createElement(
           "div",
           { className: "shortcutFunction" },
           _react2.default.createElement(
             "p",
-            { onClick: setActiveSearch.bind(null, "source") },
+            { onClick: () => openQuickOpen() },
             _react2.default.createElement(
               "span",
               { className: "shortcutKey" },
               searchSourcesShortcut
             ),
             searchSourcesLabel
           ),
           _react2.default.createElement(
@@ -44466,31 +43662,31 @@ class WelcomeBox extends _react.Componen
       _react2.default.createElement(
         "div",
         { className: "alignlabel normal-layout" },
         _react2.default.createElement(
           "div",
           { className: "shortcutKeys" },
           _react2.default.createElement(
             "p",
-            { onClick: setActiveSearch.bind(null, "source") },
+            { onClick: () => openQuickOpen() },
             searchSourcesShortcut
           ),
           _react2.default.createElement(
             "p",
             { onClick: setActiveSearch.bind(null, "project") },
             searchProjectShortcut
           )
         ),
         _react2.default.createElement(
           "div",
           { className: "shortcutFunction" },
           _react2.default.createElement(
             "p",
-            { onClick: setActiveSearch.bind(null, "source") },
+            { onClick: () => openQuickOpen() },
             searchSourcesLabel
           ),
           _react2.default.createElement(
             "p",
             { onClick: setActiveSearch.bind(null, "project") },
             searchProjectLabel
           )
         )
@@ -45043,424 +44239,1141 @@ class Dropdown extends _react.Component 
       this.renderMask()
     );
   }
 }
 
 exports.default = Dropdown;
 
 /***/ }),
-/* 1616 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _propTypes = __webpack_require__(20);
-
-var _propTypes2 = _interopRequireDefault(_propTypes);
+/* 1616 */,
+/* 1617 */,
+/* 1618 */,
+/* 1619 */,
+/* 1620 */,
+/* 1621 */,
+/* 1622 */,
+/* 1623 */,
+/* 1624 */,
+/* 1625 */,
+/* 1626 */,
+/* 1627 */,
+/* 1628 */,
+/* 1629 */,
+/* 1630 */,
+/* 1631 */,
+/* 1632 */,
+/* 1633 */,
+/* 1634 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.mapScopes = mapScopes;
+
+var _selectors = __webpack_require__(1352);
+
+var _pause = __webpack_require__(1400);
+
+var _devtoolsSourceMap = __webpack_require__(1360);
+
+function mapScopes() {
+  return async function ({ dispatch, getState, client, sourceMaps }) {
+    const frame = (0, _selectors.getSelectedFrame)(getState());
+    if (!frame) {
+      return;
+    }
+
+    if ((0, _devtoolsSourceMap.isGeneratedId)(frame.location.sourceId)) {
+      return;
+    }
+
+    const sourceRecord = (0, _selectors.getSource)(getState(), frame.generatedLocation.sourceId);
+
+    if (sourceRecord.get("isWasm")) {
+      return;
+    }
+
+    const frameScopes = await client.getFrameScopes(frame);
+    const scopes = await (0, _pause.updateScopeBindings)(frameScopes, frame.generatedLocation, sourceMaps);
+
+    dispatch({
+      type: "MAP_SCOPES",
+      frame,
+      scopes
+    });
+  };
+}
+
+/***/ }),
+/* 1635 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.State = undefined;
+exports.default = update;
+exports.getQuickOpenEnabled = getQuickOpenEnabled;
+exports.getQuickOpenQuery = getQuickOpenQuery;
+exports.getQuickOpenType = getQuickOpenType;
+
+var _makeRecord = __webpack_require__(1361);
+
+var _makeRecord2 = _interopRequireDefault(_makeRecord);
+
+var _quickOpen = __webpack_require__(1636);
+
+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/. */
+
+/**
+ * Quick Open reducer
+ * @module reducers/quick-open
+ */
+
+const State = exports.State = (0, _makeRecord2.default)({
+  enabled: false,
+  query: "",
+  searchType: "sources"
+});
+
+function update(state = State(), action) {
+  switch (action.type) {
+    case "OPEN_QUICK_OPEN":
+      if (action.query != null) {
+        return state.merge({
+          enabled: true,
+          query: action.query,
+          searchType: (0, _quickOpen.parseQuickOpenQuery)(action.query)
+        });
+      }
+      return state.set("enabled", true);
+    case "CLOSE_QUICK_OPEN":
+      return State();
+    case "SET_QUICK_OPEN_QUERY":
+      return state.merge({
+        query: action.query,
+        searchType: (0, _quickOpen.parseQuickOpenQuery)(action.query)
+      });
+    default:
+      return state;
+  }
+}
+
+function getQuickOpenEnabled(state) {
+  return state.quickOpen.get("enabled");
+}
+
+function getQuickOpenQuery(state) {
+  return state.quickOpen.get("query");
+}
+
+function getQuickOpenType(state) {
+  return state.quickOpen.get("searchType");
+}
+
+/***/ }),
+/* 1636 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+exports.parseQuickOpenQuery = parseQuickOpenQuery;
+exports.parseLineColumn = parseLineColumn;
+exports.formatSymbol = formatSymbol;
+exports.formatSymbols = formatSymbols;
+exports.formatSources = formatSources;
+
+var _utils = __webpack_require__(1366);
+
+var _source = __webpack_require__(1356);
+
+function parseQuickOpenQuery(query) {
+  const modifierPattern = /^@|#|\:$/;
+  const gotoSourcePattern = /^(\w+)\:/;
+  const startsWithModifier = modifierPattern.test(query[0]);
+  const isGotoSource = gotoSourcePattern.test(query);
+
+  if (startsWithModifier) {
+    const modifiers = {
+      "@": "functions",
+      "#": "variables",
+      ":": "goto"
+    };
+    const modifier = query[0];
+    return modifiers[modifier];
+  }
+
+  if (isGotoSource) {
+    return "gotoSource";
+  }
+
+  return "sources";
+}
+
+function parseLineColumn(query) {
+  const [, line, column] = query.split(":");
+  const lineNumber = parseInt(line, 10);
+  const columnNumber = parseInt(column, 10);
+  if (!isNaN(lineNumber)) {
+    return _extends({
+      line: lineNumber
+    }, !isNaN(columnNumber) ? { column: columnNumber } : null);
+  }
+}
+
+function formatSymbol(symbol) {
+  return {
+    id: `${symbol.name}:${symbol.location.start.line}`,
+    title: symbol.name,
+    subtitle: `:${symbol.location.start.line}`,
+    value: symbol.name,
+    location: symbol.location
+  };
+}
+
+function formatSymbols(symbols) {
+  if (!symbols) {
+    return { variables: [], functions: [] };
+  }
+
+  const { variables, functions } = symbols;
+
+  return {
+    variables: variables.map(formatSymbol),
+    functions: functions.map(formatSymbol)
+  };
+}
+
+function formatSources(sources) {
+  return sources.valueSeq().toJS().filter(source => !(0, _source.isPretty)(source) && !(0, _source.isThirdParty)(source)).map(source => ({
+    value: (0, _source.getSourcePath)(source),
+    title: (0, _source.getSourcePath)(source).split("/").pop(),
+    subtitle: (0, _utils.endTruncateStr)((0, _source.getSourcePath)(source), 100),
+    id: source.id
+  })).filter(formattedSource => formattedSource.value != "");
+}
+
+/***/ }),
+/* 1637 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.command = command;
+exports.stepIn = stepIn;
+exports.stepOver = stepOver;
+exports.stepOut = stepOut;
+exports.resume = resume;
+exports.astCommand = astCommand;
+
+var _selectors = __webpack_require__(1352);
+
+var _pause = __webpack_require__(1400);
+
+var _parser = __webpack_require__(1365);
+
+var _breakpoints = __webpack_require__(1396);
+
+var _prefs = __webpack_require__(226);
+
+/**
+ * Debugger commands like stepOver, stepIn, stepUp
+ *
+ * @param string $0.type
+ * @memberof actions/pause
+ * @static
+ */
+function command(type) {
+  return async ({ dispatch, client }) => {
+    // execute debugger thread command e.g. stepIn, stepOver
+    dispatch({ type: "COMMAND", value: { type } });
+
+    await client[type]();
+
+    dispatch({ type: "CLEAR_COMMAND" });
+  };
+}
+
+/**
+ * StepIn
+ * @memberof actions/pause
+ * @static
+ * @returns {Function} {@link command}
+ */
+
+
+function stepIn() {
+  return ({ dispatch, getState }) => {
+    if ((0, _selectors.getPause)(getState())) {
+      return dispatch(command("stepIn"));
+    }
+  };
+}
+
+/**
+ * stepOver
+ * @memberof actions/pause
+ * @static
+ * @returns {Function} {@link command}
+ */
+function stepOver() {
+  return ({ dispatch, getState }) => {
+    if ((0, _selectors.getPause)(getState())) {
+      return dispatch(astCommand("stepOver"));
+    }
+  };
+}
+
+/**
+ * stepOut
+ * @memberof actions/pause
+ * @static
+ * @returns {Function} {@link command}
+ */
+function stepOut() {
+  return ({ dispatch, getState }) => {
+    if ((0, _selectors.getPause)(getState())) {
+      return dispatch(command("stepOut"));
+    }
+  };
+}
+
+/**
+ * resume
+ * @memberof actions/pause
+ * @static
+ * @returns {Function} {@link command}
+ */
+function resume() {
+  return ({ dispatch, getState }) => {
+    if ((0, _selectors.getPause)(getState())) {
+      return dispatch(command("resume"));
+    }
+  };
+}
+
+/**
+ * @memberOf actions/pause
+ * @static
+ * @param stepType
+ * @returns {function(ThunkArgs)}
+ */
+function astCommand(stepType) {
+  return async ({ dispatch, getState, sourceMaps }) => {
+    if (!_prefs.features.asyncStepping) {
+      return dispatch(command(stepType));
+    }
+
+    const pauseInfo = (0, _selectors.getPause)(getState());
+    const source = (0, _selectors.getSelectedSource)(getState()).toJS();
+
+    const pausedPosition = await (0, _pause.getPausedPosition)(pauseInfo, sourceMaps);
+
+    if (stepType == "stepOver") {
+      const nextLocation = await (0, _parser.getNextStep)(source, pausedPosition);
+      if (nextLocation) {
+        await dispatch((0, _breakpoints.addHiddenBreakpoint)(nextLocation));
+        return dispatch(command("resume"));
+      }
+    }
+
+    return dispatch(command(stepType));
+  };
+}
+
+/***/ }),
+/* 1638 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.findBestMatchExpression = findBestMatchExpression;
+function findBestMatchExpression(symbols, tokenPos, token) {
+  const { memberExpressions, identifiers } = symbols;
+  const { line, column } = tokenPos;
+  return identifiers.concat(memberExpressions).reduce((found, expression) => {
+    const overlaps = expression.location.start.line == line && expression.location.start.column <= column && expression.location.end.column >= column && !expression.computed;
+
+    if (overlaps) {
+      return expression;
+    }
+
+    return found;
+  }, {});
+}
+
+/***/ }),
+/* 1639 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _commands = __webpack_require__(1637);
+
+Object.defineProperty(exports, "stepIn", {
+  enumerable: true,
+  get: function () {
+    return _commands.stepIn;
+  }
+});
+Object.defineProperty(exports, "stepOver", {
+  enumerable: true,
+  get: function () {
+    return _commands.stepOver;
+  }
+});
+Object.defineProperty(exports, "stepOut", {
+  enumerable: true,
+  get: function () {
+    return _commands.stepOut;
+  }
+});
+Object.defineProperty(exports, "resume", {
+  enumerable: true,
+  get: function () {
+    return _commands.resume;
+  }
+});
+
+var _mapScopes = __webpack_require__(1634);
+
+Object.defineProperty(exports, "mapScopes", {
+  enumerable: true,
+  get: function () {
+    return _mapScopes.mapScopes;
+  }
+});
+
+var _paused = __webpack_require__(1640);
+
+Object.defineProperty(exports, "paused", {
+  enumerable: true,
+  get: function () {
+    return _paused.paused;
+  }
+});
+
+var _resumed = __webpack_require__(1641);
+
+Object.defineProperty(exports, "resumed", {
+  enumerable: true,
+  get: function () {
+    return _resumed.resumed;
+  }
+});
+
+var _continueToHere = __webpack_require__(1642);
+
+Object.defineProperty(exports, "continueToHere", {
+  enumerable: true,
+  get: function () {
+    return _continueToHere.continueToHere;
+  }
+});
+
+var _breakOnNext = __webpack_require__(1643);
+
+Object.defineProperty(exports, "breakOnNext", {
+  enumerable: true,
+  get: function () {
+    return _breakOnNext.breakOnNext;
+  }
+});
+
+var _loadObjectProperties = __webpack_require__(1644);
+
+Object.defineProperty(exports, "loadObjectProperties", {
+  enumerable: true,
+  get: function () {
+    return _loadObjectProperties.loadObjectProperties;
+  }
+});
+
+var _pauseOnExceptions = __webpack_require__(1645);
+
+Object.defineProperty(exports, "pauseOnExceptions", {
+  enumerable: true,
+  get: function () {
+    return _pauseOnExceptions.pauseOnExceptions;
+  }
+});
+
+var _selectFrame = __webpack_require__(1646);
+
+Object.defineProperty(exports, "selectFrame", {
+  enumerable: true,
+  get: function () {
+    return _selectFrame.selectFrame;
+  }
+});
+
+/***/ }),
+/* 1640 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.paused = paused;
+
+var _selectors = __webpack_require__(1352);
+
+var _pause = __webpack_require__(1400);
+
+var _breakpoints = __webpack_require__(1396);
+
+var _expressions = __webpack_require__(1398);
+
+var _sources = __webpack_require__(1373);
+
+var _ui = __webpack_require__(1385);
+
+var _mapScopes = __webpack_require__(1634);
+
+/**
+ * Debugger has just paused
+ *
+ * @param {object} pauseInfo
+ * @memberof actions/pause
+ * @static
+ */
+function paused(pauseInfo) {
+  return async function ({ dispatch, getState, client, sourceMaps }) {
+    const { frames, why, loadedObjects } = pauseInfo;
+
+    const mappedFrames = await (0, _pause.updateFrameLocations)(frames, sourceMaps);
+    const frame = mappedFrames[0];
+    const frameScopes = await client.getFrameScopes(frame);
+
+    dispatch({
+      type: "PAUSED",
+      pauseInfo: { why, frame, frames },
+      frames: mappedFrames,
+      scopes: frameScopes,
+      selectedFrameId: frame.id,
+      loadedObjects: loadedObjects || []
+    });
+
+    const hiddenBreakpointLocation = (0, _selectors.getHiddenBreakpointLocation)(getState());
+    if (hiddenBreakpointLocation) {
+      dispatch((0, _breakpoints.removeBreakpoint)(hiddenBreakpointLocation));
+    }
+
+    if (!(0, _selectors.isEvaluatingExpression)(getState())) {
+      dispatch((0, _expressions.evaluateExpressions)());
+    }
+
+    const { line, column } = frame.location;
+    await dispatch((0, _sources.selectSource)(frame.location.sourceId, { line, column }));
+
+    dispatch((0, _ui.togglePaneCollapse)("end", false));
+    dispatch((0, _mapScopes.mapScopes)());
+  };
+}
+
+/***/ }),
+/* 1641 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.resumed = resumed;
+
+var _selectors = __webpack_require__(1352);
+
+var _expressions = __webpack_require__(1398);
+
+/**
+ * Debugger has just resumed
+ *
+ * @memberof actions/pause
+ * @static
+ */
+function resumed() {
+  return ({ dispatch, client, getState }) => {
+    if (!(0, _selectors.isPaused)(getState())) {
+      return;
+    }
+
+    const wasPausedInEval = (0, _selectors.pausedInEval)(getState());
+
+    dispatch({
+      type: "RESUME",
+      value: undefined
+    });
+
+    if (!(0, _selectors.isStepping)(getState()) && !wasPausedInEval) {
+      dispatch((0, _expressions.evaluateExpressions)());
+    }
+  };
+}
+
+/***/ }),
+/* 1642 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.continueToHere = continueToHere;
+
+var _selectors = __webpack_require__(1352);
+
+var _breakpoints = __webpack_require__(1396);
+
+var _commands = __webpack_require__(1637);
+
+function continueToHere(line) {
+  return async function ({ dispatch, getState }) {
+    const source = (0, _selectors.getSelectedSource)(getState()).toJS();
+
+    await dispatch((0, _breakpoints.addHiddenBreakpoint)({
+      line,
+      column: undefined,
+      sourceId: source.id
+    }));
+
+    dispatch((0, _commands.resume)());
+  };
+}
+
+/***/ }),
+/* 1643 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.breakOnNext = breakOnNext;
+
+
+/**
+ * Debugger breakOnNext command.
+ * It's different from the comand action because we also want to
+ * highlight the pause icon.
+ *
+ * @memberof actions/pause
+ * @static
+ */
+function breakOnNext() {
+  return ({ dispatch, client }) => {
+    client.breakOnNext();
+
+    return dispatch({
+      type: "BREAK_ON_NEXT",
+      value: true
+    });
+  };
+}
+
+/***/ }),
+/* 1644 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.loadObjectProperties = loadObjectProperties;
+
+var _promise = __webpack_require__(1370);
+
+var _selectors = __webpack_require__(1352);
+
+/**
+ * @memberof actions/pause
+ * @static
+ */
+function loadObjectProperties(object) {
+  return ({ dispatch, client, getState }) => {
+    const objectId = object.actor || object.objectId;
+
+    if ((0, _selectors.getLoadedObject)(getState(), objectId)) {
+      return;
+    }
+
+    dispatch({
+      type: "LOAD_OBJECT_PROPERTIES",
+      objectId,
+      [_promise.PROMISE]: client.getProperties(object)
+    });
+  };
+}
+
+/***/ }),
+/* 1645 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.pauseOnExceptions = pauseOnExceptions;
+
+var _promise = __webpack_require__(1370);
+
+/**
+ *
+ * @memberof actions/pause
+ * @static
+ */
+function pauseOnExceptions(shouldPauseOnExceptions, shouldIgnoreCaughtExceptions) {
+  return ({ dispatch, client }) => {
+    dispatch({
+      type: "PAUSE_ON_EXCEPTIONS",
+      shouldPauseOnExceptions,
+      shouldIgnoreCaughtExceptions,
+      [_promise.PROMISE]: client.pauseOnExceptions(shouldPauseOnExceptions, shouldIgnoreCaughtExceptions)
+    });
+  };
+}
+
+/***/ }),
+/* 1646 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.selectFrame = selectFrame;
+
+var _sources = __webpack_require__(1373);
+
+var _expressions = __webpack_require__(1398);
+
+var _mapScopes = __webpack_require__(1634);
+
+/**
+ * @memberof actions/pause
+ * @static
+ */
+function selectFrame(frame) {
+  return async ({ dispatch, client, getState, sourceMaps }) => {
+    dispatch({
+      type: "SELECT_FRAME",
+      frame
+    });
+
+    const { line, column } = frame.location;
+    dispatch((0, _sources.selectSource)(frame.location.sourceId, { line, column }));
+
+    dispatch((0, _expressions.evaluateExpressions)());
+    dispatch((0, _mapScopes.mapScopes)());
+  };
+}
+
+/***/ }),
+/* 1647 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.setQuickOpenQuery = setQuickOpenQuery;
+exports.openQuickOpen = openQuickOpen;
+exports.closeQuickOpen = closeQuickOpen;
+function setQuickOpenQuery(query) {
+  return {
+    type: "SET_QUICK_OPEN_QUERY",
+    query
+  };
+}
+function openQuickOpen(query) {
+  if (query != null) {
+    return { type: "OPEN_QUICK_OPEN", query };
+  }
+  return { type: "OPEN_QUICK_OPEN" };
+}
+
+function closeQuickOpen() {
+  return { type: "CLOSE_QUICK_OPEN" };
+}
+
+/***/ }),
+/* 1648 */
+/***/ (function(module, exports) {
+
+module.exports = "<svg id=\"svg2\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" viewBox=\"0 0 354.33071 354.33071\"><metadata id=\"metadata7\"><rdf:RDF><cc:Work rdf:about><dc:format>image/svg+xml</dc:format><dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"></dc><dc:title></dc></cc:Work></rdf:RDF></metadata><g id=\"layer1\" fill=\"#EF2D5E\" transform=\"translate(0 -698.03)\"><path id=\"text3336\" d=\"m102.28 749.3-88.657 293.97h72.114l14.848-63.206h86.112l14.845 63.206h73.81l-34.36-113.69-128.53 0.00011 30.967-129.8v-50.48z\"></path><rect id=\"rect3356\" transform=\"rotate(237.21)\" height=\"79.557\" width=\"79.557\" y=\"-311.53\" x=\"-785.82\"></rect><rect id=\"rect3362\" transform=\"matrix(-.78208 .62317 -.62317 -.78208 0 0)\" height=\"95.238\" width=\"95.238\" y=\"-885.85\" x=\"318.72\"></rect><rect id=\"rect3364\" transform=\"rotate(12.582)\" height=\"95.238\" width=\"95.238\" y=\"633.02\" x=\"396.31\"></rect></g></svg>"
+
+/***/ }),
+/* 1649 */
+/***/ (function(module, exports) {
+
+module.exports = "<svg viewBox=\"0 0 256 140\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\"><defs><linearGradient x1=\"49.9109718%\" y1=\"99.9084071%\" x2=\"49.9109718%\" y2=\"-0.0902654867%\" id=\"linearGradient-1\"><stop stop-color=\"#8AC23E\" offset=\"0%\"></stop><stop stop-color=\"#8AC23E\" stop-opacity=\"0\" offset=\"100%\"></stop></linearGradient><linearGradient x1=\"49.9835165%\" y1=\"0.0637125664%\" x2=\"49.9835165%\" y2=\"100.062389%\" id=\"linearGradient-2\"><stop stop-color=\"#698932\" offset=\"0%\"></stop><stop stop-color=\"#698932\" stop-opacity=\"0\" offset=\"100%\"></stop></linearGradient><linearGradient x1=\"50.0595611%\" y1=\"0.0637125664%\" x2=\"50.0595611%\" y2=\"100.062389%\" id=\"linearGradient-3\"><stop stop-color=\"#FFED01\" offset=\"0%\"></stop><stop stop-color=\"#FFED01\" stop-opacity=\"0\" offset=\"100%\"></stop></linearGradient><linearGradient x1=\"50.0170846%\" y1=\"0.0637125664%\" x2=\"50.0170846%\" y2=\"100.092699%\" id=\"linearGradient-4\"><stop stop-color=\"#E02A89\" offset=\"0%\"></stop><stop stop-color=\"#E02A89\" stop-opacity=\"0\" offset=\"100%\"></stop></linearGradient><linearGradient x1=\"49.9631661%\" y1=\"-0.0915929204%\" x2=\"49.9631661%\" y2=\"99.9070796%\" id=\"linearGradient-5\"><stop stop-color=\"#7F1E4F\" offset=\"0%\"></stop><stop stop-color=\"#7F1E4F\" stop-opacity=\"0\" offset=\"100%\"></stop></linearGradient><linearGradient x1=\"49.9652038%\" y1=\"-0.0915929204%\" x2=\"49.9652038%\" y2=\"99.9070796%\" id=\"linearGradient-6\"><stop stop-color=\"#E95506\" offset=\"0%\"></stop><stop stop-color=\"#E95506\" stop-opacity=\"0\" offset=\"100%\"></stop></linearGradient><linearGradient x1=\"49.9766458%\" y1=\"99.9084071%\" x2=\"49.9766458%\" y2=\"-0.0265486726%\" id=\"linearGradient-7\"><stop stop-color=\"#88D0F1\" offset=\"0%\"></stop><stop stop-color=\"#88D0F1\" stop-opacity=\"0\" offset=\"100%\"></stop></linearGradient><linearGradient x1=\"50.0205329%\" y1=\"0.0637125664%\" x2=\"50.0205329%\" y2=\"99.9986726%\" id=\"linearGradient-8\"><stop stop-color=\"#00828B\" offset=\"0%\"></stop><stop stop-color=\"#00828B\" stop-opacity=\"0\" offset=\"83.25%\"></stop></linearGradient><linearGradient x1=\"50.078022%\" y1=\"99.9752212%\" x2=\"50.078022%\" y2=\"0.0705752212%\" id=\"linearGradient-9\"><stop stop-color=\"#2073BA\" offset=\"0%\"></stop><stop stop-color=\"#2073BA\" stop-opacity=\"0\" offset=\"100%\"></stop></linearGradient><linearGradient x1=\"50.0177116%\" y1=\"0.0637125664%\" x2=\"50.0177116%\" y2=\"99.9986726%\" id=\"linearGradient-10\"><stop stop-color=\"#8ED0E1\" offset=\"0%\"></stop><stop stop-color=\"#88D0F1\" stop-opacity=\"0\" offset=\"100%\"></stop></linearGradient></defs><g><path d=\"M128.1,0 L164.2,0 C150.9,21.8 136.2,45.8 121.5,69.7 L85.4,69.7 C100.1,45.8 114.8,21.8 128.1,0 Z\" fill=\"#8DC220\"></path><path d=\"M42.7,0 L78.8,0 C71.7,11.6 64.5,23.3 57.4,34.9 C50.3,46.5 43.2,58.1 36.1,69.7 C43.2,81.3 50.3,93 57.4,104.6 C64.5,116.2 71.6,127.8 78.8,139.4 L42.7,139.4 C35.6,127.8 28.4,116.2 21.3,104.6 C14.2,93.1 7.1,81.4 0,69.8 C7.1,58.2 14.2,46.6 21.3,35 C28.4,23.3 35.6,11.7 42.7,0 Z\" fill=\"#44BFEF\"></path><path d=\"M42.7,0 L42.7,0 C57.4,24 72.1,48 85.4,69.7 L121.5,69.7 C108.2,48 93.5,24 78.8,0 L78.8,0 L42.7,0 Z\" fill=\"#00AC71\"></path><path d=\"M164.2,0 L128.1,0 C135.2,11.6 142.3,23.3 149.5,34.9 C156.6,46.5 163.7,58.1 170.9,69.7 C163.8,81.3 156.6,93 149.5,104.6 C142.4,116.2 135.3,127.8 128.1,139.4 L164.2,139.4 C171.3,127.8 178.4,116.2 185.6,104.6 C192.7,93 199.8,81.4 207,69.7 C199.8,58.1 192.7,46.5 185.6,34.9 C178.5,23.3 171.3,11.7 164.2,0 Z\" fill=\"#F9BC00\"></path><path d=\"M149.3,24.6 L113.2,24.6 C108.6,32.1 104,39.7 99.4,47.2 C94.8,54.7 90.2,62.3 85.5,69.8 L121.6,69.8 C126.2,62.3 130.9,54.7 135.5,47.2 C140,39.6 144.6,32.1 149.3,24.6 Z\" fill=\"url(#linearGradient-1)\"></path><path d=\"M100.5,45.2 L136.6,45.2 C141.2,37.7 145.8,30.1 150.4,22.6 C155,15.1 159.6,7.5 164.2,0 L128.1,0 C123.5,7.5 118.9,15.1 114.3,22.6 C109.7,30.2 105.1,37.7 100.5,45.2 Z\" fill=\"url(#linearGradient-2)\"></path><path d=\"M191.9,45.2 L155.8,45.2 C151.2,37.7 146.5,30.1 141.9,22.6 C137.3,15.1 132.7,7.5 128.1,0 L164.2,0 C168.8,7.5 173.4,15.1 178,22.6 C182.7,30.2 187.3,37.7 191.9,45.2 Z\" fill=\"url(#linearGradient-3)\"></path><path d=\"M213.2,0 L177.1,0 C184.2,11.7 191.3,23.3 198.4,34.9 C205.5,46.5 212.7,58.1 219.8,69.7 C212.7,81.3 205.5,93 198.4,104.6 C191.3,116.2 184.2,127.8 177,139.4 L213.1,139.4 C220.2,127.8 227.3,116.2 234.5,104.6 C241.6,93 248.7,81.4 255.9,69.7 C248.8,58.1 241.7,46.5 234.5,34.9 C227.5,23.3 220.3,11.7 213.2,0 Z\" fill=\"#DF1B1C\"></path><path d=\"M240.9,45.2 L204.8,45.2 C200.1,37.7 195.5,30.1 190.9,22.6 C186.3,15.1 181.7,7.5 177.1,0 L213.2,0 C217.8,7.5 222.4,15.1 227,22.6 C231.6,30.2 236.3,37.7 240.9,45.2 Z\" fill=\"url(#linearGradient-4)\"></path><path d=\"M192.2,115 L228.3,115 C232.9,107.5 237.5,100 242.1,92.4 C246.7,84.9 251.3,77.3 256,69.8 L219.8,69.8 C215.2,77.3 210.6,84.9 206,92.4 C201.4,99.9 196.8,107.4 192.2,115 Z\" fill=\"url(#linearGradient-5)\"></path><path d=\"M143.2,115 L179.3,115 C183.9,107.5 188.5,99.9 193.1,92.4 C197.7,84.9 202.3,77.3 207,69.8 L170.9,69.8 C166.3,77.3 161.7,84.9 157.1,92.4 C152.4,99.9 147.8,107.4 143.2,115 Z\" fill=\"url(#linearGradient-6)\"></path><path d=\"M63.8,24.6 L27.7,24.6 C23.1,32.1 18.5,39.7 13.9,47.2 C9.2,54.7 4.6,62.3 0,69.8 L36.1,69.8 C40.7,62.3 45.3,54.8 49.9,47.2 C54.5,39.7 59.1,32.1 63.8,24.6 Z\" fill=\"url(#linearGradient-7)\"></path><path d=\"M15,45.2 L51.1,45.2 C55.7,37.7 60.3,30.1 64.9,22.6 C69.6,15.1 74.2,7.5 78.8,0 L42.7,0 C38.1,7.5 33.5,15 28.9,22.6 C24.3,30.1 19.7,37.7 15,45.2 Z\" fill=\"url(#linearGradient-8)\"></path><path d=\"M15,94.3 L51.1,94.3 C55.7,101.8 60.3,109.4 64.9,116.9 C69.5,124.4 74.1,132 78.7,139.5 L42.6,139.5 C38,132 33.3,124.5 28.7,116.9 C24.2,109.4 19.6,101.9 15,94.3 Z\" fill=\"url(#linearGradient-9)\"></path><path d=\"M106.5,45.2 L70.4,45.2 C65.8,37.7 61.2,30.1 56.6,22.6 C51.9,15.1 47.3,7.5 42.7,0 L78.8,0 C83.4,7.5 88,15 92.6,22.6 C97.3,30.1 101.9,37.7 106.5,45.2 Z\" fill=\"url(#linearGradient-10)\"></path></g></svg>"
+
+/***/ }),
+/* 1650 */
+/***/ (function(module, exports) {
+
+module.exports = "<svg viewBox=\"0 0 512 512\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" style=\"background: #FFFFFF;\"><title>Zeit - Black on white logo</title><defs><linearGradient x1=\"114.720775%\" y1=\"181.283245%\" x2=\"39.5399306%\" y2=\"100%\" id=\"linearGradient-1\"><stop stop-color=\"#FFFFFF\" offset=\"0%\"></stop><stop stop-color=\"#000000\" offset=\"100%\"></stop></linearGradient></defs><g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"><g id=\"Black-on-white\" fill=\"url(#linearGradient-1)\"><polygon id=\"Triangle-3-Copy\" points=\"254 156 367 356 141 356\"></polygon></g></g></svg>"
+
+/***/ }),
+/* 1651 */
+/***/ (function(module, exports) {
+
+module.exports = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 1000 1000\"><style>.st0{display:none}.st1{display:inline}.st2{fill:#222}.st3{fill:#41b883}.st4{fill:#328170}.st5{fill:#35495e}</style><g id=\"express\" class=\"st0\"><g class=\"st1\"><path class=\"st2\" d=\"M24.5 870.5v-376H494v-22H24.5v-343h499.1v-22H2.5v785H528v-22H24.5z\"></path><path class=\"st2\" d=\"M951.3 327.4L756.7 583.6 566.5 327.4h-28.6l205.6 272.7-225.4 292.4h26.4l212.2-276 213.3 276h27.5L771 600l206.7-272.6h-26.4z\"></path></g></g><g id=\"nuxt\"><path class=\"st3\" d=\"M317.9 852H3.7l408.1-704 408.1 704H507.7\"></path><path class=\"st4\" d=\"M779.8 852h216.5l-354-608.5-351 608.5h216.5\"></path><path class=\"st5\" d=\"M651.2 852h159.5L549.9 403.8 291.3 852h159.5\"></path></g></svg>"
+
+/***/ }),
+/* 1652 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.QuickOpenModal = undefined;
+
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _redux = __webpack_require__(3);
 
 var _fuzzaldrinPlus = __webpack_require__(161);
 
-var _selectors = __webpack_require__(1352);
-
 var _actions = __webpack_require__(1354);
 
 var _actions2 = _interopRequireDefault(_actions);
 
+var _selectors = __webpack_require__(1352);
+
 var _resultList = __webpack_require__(1406);
 
+var _quickOpen = __webpack_require__(1636);
+
 var _Modal = __webpack_require__(1403);
 
 var _Modal2 = _interopRequireDefault(_Modal);
 
 var _SearchInput = __webpack_require__(1379);
 
 var _SearchInput2 = _interopRequireDefault(_SearchInput);
 
 var _ResultList = __webpack_require__(1445);
 
 var _ResultList2 = _interopRequireDefault(_ResultList);
 
-__webpack_require__(1297);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function formatSymbol(symbol) {
-  return {
-    id: `${symbol.name}:${symbol.location.start.line}`,
-    title: symbol.name,
-    subtitle: `:${symbol.location.start.line}`,
-    value: symbol.name,
-    location: symbol.location
-  };
-}
-
-class SymbolModal extends _react.Component {
-
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+class QuickOpenModal extends _react.Component {
   constructor(props) {
     super(props);
 
-    this.onClick = e => {
-      e.stopPropagation();
-    };
-
-    this.onChange = e => {
-      const { selectedSource } = this.props;
-      if (!selectedSource || !selectedSource.get("text")) {
+    this.closeModal = () => {
+      this.props.closeQuickOpen();
+      this.props.clearHighlightLineRange();
+    };
+
+    this.searchSources = query => {
+      if (query == "") {
+        const results = this.props.sources;
+        this.setState({ results });
         return;
       }
 
-      this.setState({ query: e.target.value });
-      return this.updateResults(e.target.value);
-    };
-
-    this.closeModal = () => {
-      this.props.closeActiveSearch();
-      this.props.clearHighlightLineRange();
+      const { searchType } = this.props;
+
+      if (searchType === "gotoSource") {
+        const [baseQuery] = query.split(":");
+        const results = (0, _fuzzaldrinPlus.filter)(this.props.sources, baseQuery, { key: "value" });
+        this.setState({ results });
+      } else {
+        const results = (0, _fuzzaldrinPlus.filter)(this.props.sources, query, { key: "value" });
+        this.setState({ results });
+      }
+    };
+
+    this.searchSymbols = query => {
+      const { symbols: { functions, variables }, searchType } = this.props;
+
+      let results = functions;
+      if (searchType === "variables") {
+        results = variables;
+      }
+      if (query === "@" || query === "#") {
+        this.setState({ results });
+        return;
+      }
+
+      results = (0, _fuzzaldrinPlus.filter)(results, query.slice(1), {
+        key: "value"
+      });
+
+      this.setState({ results });
+    };
+
+    this.updateResults = query => {
+      if (this.isSymbolSearch()) {
+        return this.searchSymbols(query);
+      }
+      return this.searchSources(query);
     };
 
     this.selectResultItem = (e, item) => {
-      const { selectSource, selectedSource } = this.props;
-
-      if (!selectedSource || !item) {
+      if (item == null) {
         return;
       }
-
-      selectSource(selectedSource.get("id"), {
-        line: item.location.start.line
-      });
+      const { selectSource, selectedSource, query, searchType } = this.props;
+      if (this.isSymbolSearch()) {
+        if (selectedSource == null) {
+          return;
+        }
+        selectSource(selectedSource.get("id"), {
+          location: _extends({}, item.location != null ? { line: item.location.start.line } : {})
+        });
+      } else if (searchType === "gotoSource") {
+        const location = (0, _quickOpen.parseLineColumn)(query);
+        if (location != null) {
+          selectSource(item.id, { location });
+        }
+      } else {
+        selectSource(item.id);
+      }
 
       this.closeModal();
     };
 
-    this.updateResults = query => {
-      const { symbolType, symbols } = this.props;
-
-      let symbolSearchResults = symbols[symbolType];
-      if (query == "") {
-        this.setState({ results: symbolSearchResults });
+    this.onSelectResultItem = item => {
+      const {
+        selectSource,
+        selectedSource,
+        highlightLineRange,
+        searchType
+      } = this.props;
+      if (!this.isSymbolSearch() || selectedSource == null) {
         return;
       }
 
-      symbolSearchResults = (0, _fuzzaldrinPlus.filter)(symbolSearchResults, query, {
-        key: "value"
-      });
-
-      this.setState({ results: symbolSearchResults });
+      if (searchType === "variables") {
+        selectSource(selectedSource.get("id"), {
+          location: _extends({}, item.location != null ? { line: item.location.start.line } : {})
+        });
+      }
+
+      if (searchType === "functions") {
+        highlightLineRange(_extends({}, item.location != null ? { start: item.location.start.line, end: item.location.end.line } : {}, {
+          sourceId: selectedSource.get("id")
+        }));
+      }
     };
 
     this.traverseResults = direction => {
-      const { resultsIndex, results } = this.state;
-      const resultCount = this.resultsCount();
-      const index = resultsIndex + direction;
+      const { selectedIndex, results } = this.state;
+      const resultCount = this.resultCount();
+      const index = selectedIndex + direction;
       const nextIndex = (index + resultCount) % resultCount;
 
-      this.setState({ resultsIndex: nextIndex });
-
-      if (results) {
+      this.setState({ selectedIndex: nextIndex });
+
+      if (results != null) {
         this.onSelectResultItem(results[nextIndex]);
       }
     };
 
-    this.onKeyUp = e => {
-      e.preventDefault();
-      const { enabled } = this.props;
-      const { results, resultsIndex } = this.state;
+    this.onChange = e => {
+      const { selectedSource, setQuickOpenQuery } = this.props;
+      setQuickOpenQuery(e.target.value);
+      const noSource = !selectedSource || !selectedSource.get("text");
+      if (this.isSymbolSearch() && noSource) {
+        return;
+      }
+      this.updateResults(e.target.value);
+    };
+
+    this.onKeyDown = e => {
+      const {
+        selectSource,
+        selectedSource,
+        enabled,
+        query,
+        searchType
+      } = this.props;
+      const { results, selectedIndex } = this.state;
 
       if (!enabled || !results) {
         return;
       }
 
-      if (e.key === "ArrowUp") {
-        this.traverseResults(-1);
-      } else if (e.key === "ArrowDown") {
-        this.traverseResults(1);
+      const canTraverse = searchType !== "goto";
+      if (e.key === "ArrowUp" && canTraverse) {
+        return this.traverseResults(-1);
+      } else if (e.key === "ArrowDown" && canTraverse) {
+        return this.traverseResults(1);
       } else if (e.key === "Enter") {
-        this.selectResultItem(e, results[resultsIndex]);
-        this.closeModal();
+        if (searchType === "goto") {
+          if (!selectedSource) {
+            return;
+          }
+          const location = (0, _quickOpen.parseLineColumn)(query);
+          if (location != null) {
+            selectSource(selectedSource.get("id"), { location });
+          }
+        } else {
+          this.selectResultItem(e, results[selectedIndex]);
+        }
+        return this.closeModal();
       } else if (e.key === "Tab") {
-        this.closeModal();
-      }
-    };
-
-    this.renderResults = () => {
-      const { resultsIndex, results } = this.state;
-
-      const { enabled } = this.props;
-      if (!enabled || !results) {
-        return null;
-      }
-
-      return _react2.default.createElement(_ResultList2.default, {
-        key: "results",
-        items: results,
-        selected: resultsIndex,
-        selectItem: this.selectResultItem,
-        ref: "resultList"
-      });
-    };
-
-    this.buildSummaryMsg = () => {
-      const { resultsIndex } = this.state;
-      const count = this.resultsCount();
-
-      if (count > 1) {
-        return L10N.getFormatStr("editor.searchResults", resultsIndex + 1, count);
-      } else if (count === 1) {
-        return L10N.getFormatStr("editor.singleResult");
-      }
-    };
-
-    this.buildPlaceHolder = () => {
-      const { symbolType } = this.props;
-      return L10N.getFormatStr(`symbolSearch.search.${symbolType}Placeholder`);
-    };
-
-    this.state = { results: null, query: "", resultsIndex: 0 };
+        return this.closeModal();
+      }
+    };
+
+    this.resultCount = () => this.state.results ? this.state.results.length : 0;
+
+    this.isSymbolSearch = () => ["functions", "variables"].includes(this.props.searchType);
+
+    this.state = {
+      results: null,
+      selectedIndex: 0
+    };
   }
 
   componentDidMount() {
-    this.updateResults(this.state.query);
-  }
-
-  componentDidUpdate(prevProps, prevState) {
+    this.updateResults(this.props.query);
+  }
+
+  componentDidUpdate(prevProps) {
     if (this.refs.resultList && this.refs.resultList.refs) {
-      (0, _resultList.scrollList)(this.refs.resultList.refs, this.state.resultsIndex);
-    }
-
-    if (!prevProps.enabled && this.props.enabled) {
-      this.updateResults(this.state.query);
-    }
-  }
-
-  onSelectResultItem(item) {
-    const {
-      selectSource,
-      selectedSource,
-      symbolType,
-      highlightLineRange
-    } = this.props;
-
-    if (selectedSource && symbolType !== "functions") {
-      selectSource(selectedSource.get("id"), {
-        line: item.location.start.line
-      });
-    }
-
-    if (selectedSource && symbolType === "functions") {
-      highlightLineRange({
-        start: item.location.start.line,
-        end: item.location.end.line,
-        sourceId: selectedSource.get("id")
-      });
-    }
+      (0, _resultList.scrollList)(this.refs.resultList.refs, this.state.selectedIndex);
+    }
+
+    const nowEnabled = !prevProps.enabled && this.props.enabled;
+    const queryChanged = prevProps.query !== this.props.query;
+    if (nowEnabled || queryChanged) {
+      this.updateResults(this.props.query);
+    }
+  }
+
+  renderResults() {
+    const { enabled, searchType } = this.props;
+    const { selectedIndex, results } = this.state;
+
+    if (!enabled || !results) {
+      return null;
+    }
+
+    return _react2.default.createElement(_ResultList2.default, _extends({
+      key: "results",
+      items: results,
+      selected: selectedIndex,
+      selectItem: this.selectResultItem,
+      ref: "resultList"
+    }, searchType === "sources" || searchType === "gotoSource" ? { size: "big" } : {}));
   }
 
   renderInput() {
-    const { query } = this.state;
+    const { query, searchType } = this.props;
+    const summaryMsg = L10N.getFormatStr("sourceSearch.resultsSummary1", this.resultCount());
+
+    const showSummary = searchType === "sources" || searchType === "functions" || searchType === "variables";
 
     return _react2.default.createElement(
       "div",
       { key: "input", className: "input-wrapper" },
-      _react2.default.createElement(_SearchInput2.default, {
+      _react2.default.createElement(_SearchInput2.default, _extends({
         query: query,
-        count: this.resultsCount(),
-        placeholder: this.buildPlaceHolder(),
-        summaryMsg: this.buildSummaryMsg(),
+        count: this.resultCount(),
+        placeholder: L10N.getStr("sourceSearch.search")
+      }, showSummary === true ? { summaryMsg } : {}, {
         onChange: this.onChange,
-        onKeyUp: this.onKeyUp,
-        handleNext: () => this.traverseResults(1),
-        handlePrev: () => this.traverseResults(-1),
+        onKeyDown: this.onKeyDown,
         handleClose: this.closeModal
-      })
-    );
-  }
-
-  resultsCount() {
-    return this.state.results ? this.state.results.length : 0;
-  }
-
+      }))
+    );
+  }
   render() {
     const { enabled } = this.props;
 
     if (!enabled) {
       return null;
     }
 
     return _react2.default.createElement(
       _Modal2.default,
       { "in": enabled, handleClose: this.closeModal },
       this.renderInput(),
       this.renderResults()
     );
   }
 }
 
-SymbolModal.contextTypes = {
-  shortcuts: _propTypes2.default.object
-};
-
-function _getFormattedSymbols(state, source) {
-  if (!source) {
-    return { variables: [], functions: [] };
-  }
-
-  const { variables, functions } = (0, _selectors.getSymbols)(state, source.toJS());
-
-  return {
-    variables: variables.map(formatSymbol),
-    functions: functions.map(formatSymbol)
-  };
-}
-
-exports.default = (0, _reactRedux.connect)(state => {
-  const source = (0, _selectors.getSelectedSource)(state);
-  return {
-    enabled: Boolean((0, _selectors.getActiveSearch)(state) === "symbol" && source),
-    symbolType: (0, _selectors.getSymbolSearchType)(state),
-    symbols: _getFormattedSymbols(state, source)
-  };
-}, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(SymbolModal);
-
-/***/ }),
-/* 1617 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _react = __webpack_require__(0);
-
-var _react2 = _interopRequireDefault(_react);
-
-var _reactRedux = __webpack_require__(1189);
-
-var _redux = __webpack_require__(3);
-
-var _selectors = __webpack_require__(1352);
-
-var _actions = __webpack_require__(1354);
-
-var _actions2 = _interopRequireDefault(_actions);
-
-var _Modal = __webpack_require__(1403);
-
-var _Modal2 = _interopRequireDefault(_Modal);
-
-var _SearchInput = __webpack_require__(1379);
-
-var _SearchInput2 = _interopRequireDefault(_SearchInput);
-
-__webpack_require__(1297);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-class GotoLineModal extends _react.Component {
-
-  constructor(props) {
-    super(props);
-
-    this.onClick = e => {
-      e.stopPropagation();
-    };
-
-    this.onChange = e => {
-      const { selectedSource } = this.props;
-      if (!selectedSource || !selectedSource.get("text")) {
-        return;
-      }
-
-      this.setState({ query: e.target.value });
-    };
-
-    this.closeModal = () => {
-      this.props.closeActiveSearch();
-      this.props.clearHighlightLineRange();
-    };
-
-    this.onKeyUp = e => {
-      e.preventDefault();
-      const { selectSource, selectedSource, enabled } = this.props;
-      const { query } = this.state;
-
-      if (!enabled || !selectedSource) {
-        return;
-      }
-
-      if (e.key === "Enter" && query != null) {
-        const linenumber = parseInt(query.replace(/[^\d+]/g, ""), 10);
-        if (!isNaN(linenumber)) {
-          selectSource(selectedSource.get("id"), { line: linenumber });
-        }
-        this.closeModal();
-        return;
-      }
-
-      if (e.key === "Tab") {
-        this.closeModal();
-        return;
-      }
-      return;
-    };
-
-    this.buildPlaceHolder = () => L10N.getFormatStr("gotoLineModal.placeholder");
-
-    this.state = { query: "" };
-  }
-
-  renderInput() {
-    const { query } = this.state;
-
-    return _react2.default.createElement(
-      "div",
-      { key: "input", className: "input-wrapper" },
-      _react2.default.createElement(_SearchInput2.default, {
-        query: query,
-        placeholder: this.buildPlaceHolder(),
-        onChange: this.onChange,
-        onKeyUp: this.onKeyUp,
-        handleClose: this.closeModal
-      })
-    );
-  }
-
-  render() {
-    const { enabled } = this.props;
-
-    if (!enabled) {
-      return null;
-    }
-
-    return _react2.default.createElement(
-      _Modal2.default,
-      { "in": enabled, handleClose: this.closeModal },
-      this.renderInput()
-    );
-  }
-}
-
-exports.default = (0, _reactRedux.connect)(state => {
-  const source = (0, _selectors.getSelectedSource)(state);
-  return {
-    enabled: Boolean((0, _selectors.getActiveSearch)(state) === "line" && source)
-  };
-}, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(GotoLineModal);
+exports.QuickOpenModal = QuickOpenModal;
+function mapStateToProps(state) {
+  const selectedSource = (0, _selectors.getSelectedSource)(state);
+  let symbols = null;
+  if (selectedSource != null) {
+    symbols = (0, _selectors.getSymbols)(state, selectedSource.toJS());
+  }
+  return {
+    enabled: (0, _selectors.getQuickOpenEnabled)(state),
+    sources: (0, _quickOpen.formatSources)((0, _selectors.getSources)(state)),
+    selectedSource,
+    symbols: (0, _quickOpen.formatSymbols)(symbols),
+    query: (0, _selectors.getQuickOpenQuery)(state),
+    searchType: (0, _selectors.getQuickOpenType)(state)
+  };
+}
+
+exports.default = (0, _reactRedux.connect)(mapStateToProps, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(QuickOpenModal);
 
 /***/ })
 /******/ ]);
 });
\ No newline at end of file
--- a/devtools/client/debugger/new/parser-worker.js
+++ b/devtools/client/debugger/new/parser-worker.js
@@ -27277,65 +27277,65 @@ module.exports = isFlattenable;
 /* 787 */,
 /* 788 */,
 /* 789 */,
 /* 790 */,
 /* 791 */,
 /* 792 */
 /***/ (function(module, exports) {
 
-var g;
-
-// This works in non-strict mode
-g = (function() {
-	return this;
-})();
-
-try {
-	// This works if eval is allowed (see CSP)
-	g = g || Function("return this")() || (1,eval)("this");
-} catch(e) {
-	// This works if the window reference is available
-	if(typeof window === "object")
-		g = window;
-}
-
-// g can still be undefined, but nothing to do about it...
-// We return undefined, instead of nothing here, so it's
-// easier to handle this case. if(!global) { ...}
-
-module.exports = g;
+var g;
+
+// This works in non-strict mode
+g = (function() {
+	return this;
+})();
+
+try {
+	// This works if eval is allowed (see CSP)
+	g = g || Function("return this")() || (1,eval)("this");
+} catch(e) {
+	// This works if the window reference is available
+	if(typeof window === "object")
+		g = window;
+}
+
+// g can still be undefined, but nothing to do about it...
+// We return undefined, instead of nothing here, so it's
+// easier to handle this case. if(!global) { ...}
+
+module.exports = g;
 
 
 /***/ }),
 /* 793 */
 /***/ (function(module, exports) {
 
-module.exports = function(module) {
-	if(!module.webpackPolyfill) {
-		module.deprecate = function() {};
-		module.paths = [];
-		// module.parent = undefined by default
-		if(!module.children) module.children = [];
-		Object.defineProperty(module, "loaded", {
-			enumerable: true,
-			get: function() {
-				return module.l;
-			}
-		});
-		Object.defineProperty(module, "id", {
-			enumerable: true,
-			get: function() {
-				return module.i;
-			}
-		});
-		module.webpackPolyfill = 1;
-	}
-	return module;
-};
+module.exports = function(module) {
+	if(!module.webpackPolyfill) {
+		module.deprecate = function() {};
+		module.paths = [];
+		// module.parent = undefined by default
+		if(!module.children) module.children = [];
+		Object.defineProperty(module, "loaded", {
+			enumerable: true,
+			get: function() {
+				return module.l;
+			}
+		});
+		Object.defineProperty(module, "id", {
+			enumerable: true,
+			get: function() {
+				return module.i;
+			}
+		});
+		module.webpackPolyfill = 1;
+	}
+	return module;
+};
 
 
 /***/ }),
 /* 794 */,
 /* 795 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var createToPairs = __webpack_require__(812),
@@ -32025,20 +32025,16 @@ function _asyncToGenerator(fn) { return 
 
 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/. */
 
-const mark = typeof window == "object" && window.performance && window.performance.mark ? window.performance.mark.bind(window.performance) : () => {};
-
-const measure = typeof window == "object" && window.performance && window.performance.measure ? window.performance.measure.bind(window.performance) : () => {};
-
 WorkerDispatcher.prototype = {
   start(url) {
     this.worker = new Worker(url);
     this.worker.onerror = () => {
       console.error(`Error in worker ${url}`);
     };
   },
 
@@ -32050,35 +32046,28 @@ WorkerDispatcher.prototype = {
     this.worker.terminate();
     this.worker = null;
   },
 
   task(method) {
     return (...args) => {
       return new Promise((resolve, reject) => {
         const id = this.msgId++;
-
-        mark(`${method}_start`);
-
         this.worker.postMessage({ id, method, args });
 
         const listener = ({ data: result }) => {
           if (result.id !== id) {
             return;
           }
 
           if (!this.worker) {
             reject("Oops, The worker has shutdown!");
             return;
           }
           this.worker.removeEventListener("message", listener);
-
-          mark(`${method}_end`);
-          measure(`${method}`, `${method}_start`, `${method}_end`);
-
           if (result.error) {
             reject(result.error);
           } else {
             resolve(result.response);
           }
         };
 
         this.worker.addEventListener("message", listener);
@@ -32537,21 +32526,34 @@ function getClosestPath(source, location
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.containsPosition = containsPosition;
 exports.containsLocation = containsLocation;
 exports.nodeContainsPosition = nodeContainsPosition;
+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) {
-  const startsBefore = a.start.line < b.line || a.start.line === b.line && a.start.column <= b.column;
-  const endsAfter = a.end.line > b.line || a.end.line === b.line && a.end.column >= b.column;
-
-  return startsBefore && endsAfter;
+  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);
@@ -32591,16 +32593,22 @@ function _interopRequireWildcard(obj) { 
 let symbolDeclarations = new Map();
 
 function getFunctionParameterNames(path) {
   return path.node.params.map(param => param.name);
 }
 
 function getVariableNames(path) {
   if (t.isObjectProperty(path) && !(0, _helpers.isFunction)(path.node.value)) {
+    if (path.node.key.type === "StringLiteral") {
+      return [{
+        name: path.node.key.value,
+        location: path.node.loc
+      }];
+    }
     return [{
       name: path.node.key.name,
       location: path.node.loc
     }];
   }
 
   if (!path.node.declarations) {
     return path.node.params.map(dec => ({
@@ -32620,23 +32628,33 @@ function getComments(ast) {
     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 extractSymbols(source) {
   const functions = [];
   const variables = [];
   const memberExpressions = [];
   const callExpressions = [];
   const objectProperties = [];
   const identifiers = [];
+  const classes = [];
+  const imports = [];
 
   const ast = (0, _ast.traverseAst)(source, {
     enter(path) {
       if ((0, _helpers.isVariable)(path)) {
         variables.push(...getVariableNames(path));
       }
 
       if ((0, _helpers.isFunction)(path)) {
@@ -32645,38 +32663,48 @@ function extractSymbols(source) {
           klass: (0, _inferClassName.inferClassName)(path),
           location: path.node.loc,
           parameterNames: getFunctionParameterNames(path),
           identifier: path.node.id
         });
       }
 
       if (t.isClassDeclaration(path)) {
-        variables.push({
+        classes.push({
           name: path.node.id.name,
+          parent: path.node.superClass,
           location: path.node.loc
         });
       }
 
+      if (t.isImportDeclaration(path)) {
+        imports.push({
+          source: path.node.source.value,
+          location: path.node.loc,
+          specifiers: getSpecifiers(path.node.specifiers)
+        });
+      }
+
       if (t.isObjectProperty(path)) {
         const { start, end, identifierName } = path.node.key.loc;
         objectProperties.push({
           name: identifierName,
           location: { start, end },
           expression: getSnippet(path)
         });
       }
 
       if (t.isMemberExpression(path)) {
         const { start, end } = path.node.property.loc;
         memberExpressions.push({
           name: path.node.property.name,
           location: { start, end },
           expressionLocation: path.node.loc,
-          expression: getSnippet(path)
+          expression: getSnippet(path),
+          computed: path.node.computed
         });
       }
 
       if (t.isCallExpression(path)) {
         const callee = path.node.callee;
         if (!t.isMemberExpression(callee)) {
           const { start, end, identifierName } = callee.loc;
           callExpressions.push({
@@ -32724,17 +32752,19 @@ function extractSymbols(source) {
 
   return {
     functions,
     variables,
     callExpressions,
     memberExpressions,
     objectProperties,
     comments,
-    identifiers
+    identifiers,
+    classes,
+    imports
   };
 }
 
 function getSymbols(source) {
   if (symbolDeclarations.has(source.id)) {
     const symbols = symbolDeclarations.get(source.id);
     if (symbols) {
       return symbols;
@@ -33715,18 +33745,16 @@ exports.default = getOutOfScopeLocations
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
 exports.getNextStep = getNextStep;
 
-var _debuggerHtml = __webpack_require__(1626);
-
 var _types = __webpack_require__(1627);
 
 var _closest = __webpack_require__(1455);
 
 var _helpers = __webpack_require__(1411);
 
 function getNextStep(source, pausedPosition) {
   const currentExpression = getSteppableExpression(source, pausedPosition);
@@ -33758,23 +33786,17 @@ function _getNextStep(statement, positio
       sourceId: position.sourceId
     });
   }
 
   return null;
 }
 
 /***/ }),
-/* 1626 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-/***/ }),
+/* 1626 */,
 /* 1627 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /***/ }),
 /* 1628 */
--- a/devtools/client/debugger/new/pretty-print-worker.js
+++ b/devtools/client/debugger/new/pretty-print-worker.js
@@ -129,20 +129,16 @@ function _asyncToGenerator(fn) { return 
 
 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/. */
 
-const mark = typeof window == "object" && window.performance && window.performance.mark ? window.performance.mark.bind(window.performance) : () => {};
-
-const measure = typeof window == "object" && window.performance && window.performance.measure ? window.performance.measure.bind(window.performance) : () => {};
-
 WorkerDispatcher.prototype = {
   start(url) {
     this.worker = new Worker(url);
     this.worker.onerror = () => {
       console.error(`Error in worker ${url}`);
     };
   },
 
@@ -154,35 +150,28 @@ WorkerDispatcher.prototype = {
     this.worker.terminate();
     this.worker = null;
   },
 
   task(method) {
     return (...args) => {
       return new Promise((resolve, reject) => {
         const id = this.msgId++;
-
-        mark(`${method}_start`);
-
         this.worker.postMessage({ id, method, args });
 
         const listener = ({ data: result }) => {
           if (result.id !== id) {
             return;
           }
 
           if (!this.worker) {
             reject("Oops, The worker has shutdown!");
             return;
           }
           this.worker.removeEventListener("message", listener);
-
-          mark(`${method}_end`);
-          measure(`${method}`, `${method}_start`, `${method}_end`);
-
           if (result.error) {
             reject(result.error);
           } else {
             resolve(result.response);
           }
         };
 
         this.worker.addEventListener("message", listener);
--- a/devtools/client/debugger/new/search-worker.js
+++ b/devtools/client/debugger/new/search-worker.js
@@ -898,20 +898,16 @@ function _asyncToGenerator(fn) { return 
 
 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/. */
 
-const mark = typeof window == "object" && window.performance && window.performance.mark ? window.performance.mark.bind(window.performance) : () => {};
-
-const measure = typeof window == "object" && window.performance && window.performance.measure ? window.performance.measure.bind(window.performance) : () => {};
-
 WorkerDispatcher.prototype = {
   start(url) {
     this.worker = new Worker(url);
     this.worker.onerror = () => {
       console.error(`Error in worker ${url}`);
     };
   },
 
@@ -923,35 +919,28 @@ WorkerDispatcher.prototype = {
     this.worker.terminate();
     this.worker = null;
   },
 
   task(method) {
     return (...args) => {
       return new Promise((resolve, reject) => {
         const id = this.msgId++;
-
-        mark(`${method}_start`);
-
         this.worker.postMessage({ id, method, args });
 
         const listener = ({ data: result }) => {
           if (result.id !== id) {
             return;
           }
 
           if (!this.worker) {
             reject("Oops, The worker has shutdown!");
             return;
           }
           this.worker.removeEventListener("message", listener);
-
-          mark(`${method}_end`);
-          measure(`${method}`, `${method}_start`, `${method}_end`);
-
           if (result.error) {
             reject(result.error);
           } else {
             resolve(result.response);
           }
         };
 
         this.worker.addEventListener("message", listener);
@@ -2824,66 +2813,66 @@ function isSymbol(value) {
 module.exports = isSymbol;
 
 
 /***/ }),
 
 /***/ 792:
 /***/ (function(module, exports) {
 
-var g;
-
-// This works in non-strict mode
-g = (function() {
-	return this;
-})();
-
-try {
-	// This works if eval is allowed (see CSP)
-	g = g || Function("return this")() || (1,eval)("this");
-} catch(e) {
-	// This works if the window reference is available
-	if(typeof window === "object")
-		g = window;
-}
-
-// g can still be undefined, but nothing to do about it...
-// We return undefined, instead of nothing here, so it's
-// easier to handle this case. if(!global) { ...}
-
-module.exports = g;
+var g;
+
+// This works in non-strict mode
+g = (function() {
+	return this;
+})();
+
+try {
+	// This works if eval is allowed (see CSP)
+	g = g || Function("return this")() || (1,eval)("this");
+} catch(e) {
+	// This works if the window reference is available
+	if(typeof window === "object")
+		g = window;
+}
+
+// g can still be undefined, but nothing to do about it...
+// We return undefined, instead of nothing here, so it's
+// easier to handle this case. if(!global) { ...}
+
+module.exports = g;
 
 
 /***/ }),
 
 /***/ 793:
 /***/ (function(module, exports) {
 
-module.exports = function(module) {
-	if(!module.webpackPolyfill) {
-		module.deprecate = function() {};
-		module.paths = [];
-		// module.parent = undefined by default
-		if(!module.children) module.children = [];
-		Object.defineProperty(module, "loaded", {
-			enumerable: true,
-			get: function() {
-				return module.l;
-			}
-		});
-		Object.defineProperty(module, "id", {
-			enumerable: true,
-			get: function() {
-				return module.i;
-			}
-		});
-		module.webpackPolyfill = 1;
-	}
-	return module;
-};
+module.exports = function(module) {
+	if(!module.webpackPolyfill) {
+		module.deprecate = function() {};
+		module.paths = [];
+		// module.parent = undefined by default
+		if(!module.children) module.children = [];
+		Object.defineProperty(module, "loaded", {
+			enumerable: true,
+			get: function() {
+				return module.l;
+			}
+		});
+		Object.defineProperty(module, "id", {
+			enumerable: true,
+			get: function() {
+				return module.i;
+			}
+		});
+		module.webpackPolyfill = 1;
+	}
+	return module;
+};
 
 
 /***/ }),
 
 /***/ 8:
 /***/ (function(module, exports, __webpack_require__) {
 
 var freeGlobal = __webpack_require__(9);
--- a/devtools/client/debugger/new/test/mochitest/browser.ini
+++ b/devtools/client/debugger/new/test/mochitest/browser.ini
@@ -80,34 +80,33 @@ skip-if = debug # bug 1374187
 [browser_dbg-editor-select.js]
 [browser_dbg-editor-highlight.js]
 [browser_dbg-expressions.js]
 [browser_dbg-expressions-error.js]
 [browser_dbg-iframes.js]
 [browser_dbg_keyboard_navigation.js]
 [browser_dbg_keyboard-shortcuts.js]
 skip-if = os == "linux" # bug 1351952
+[browser_dbg-layout-changes.js]
 [browser_dbg-pause-exceptions.js]
 skip-if = true # Bug 1393121
 [browser_dbg-navigation.js]
 [browser_dbg-minified.js]
 [browser_dbg-pretty-print.js]
 [browser_dbg-pretty-print-console.js]
 [browser_dbg-pretty-print-paused.js]
 [browser_dbg-scopes-mutations.js]
 [browser_dbg-search-file.js]
 skip-if = os == "win" # Bug 1393121
-[browser_dbg-search-sources.js]
-skip-if = os == "win" # Bug 1393121
-[browser_dbg-search-symbols.js]
-skip-if = os == "win" # Bug 1393121
+[browser_dbg-quick-open.js]
+skip-if = true
 [browser_dbg-search-project.js]
 skip-if = true # Bug 1393121, 1393299
 [browser_dbg-sourcemaps.js]
 [browser_dbg-sourcemaps-reloading.js]
 [browser_dbg-sourcemaps2.js]
 [browser_dbg-sourcemaps-bogus.js]
 [browser_dbg-sources.js]
 [browser_dbg-tabs.js]
 [browser_dbg-toggling-tools.js]
 [browser_dbg-wasm-sourcemaps.js]
-skip-if = asan
+skip-if = true 
 [browser_dbg-reload.js]
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-breaking.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-breaking.js
@@ -7,16 +7,17 @@ add_task(async function() {
   const dbg = await initDebugger("doc-scripts.html");
   const { selectors: { getSelectedSource }, getState } = dbg;
 
   // Make sure we can set a top-level breakpoint and it will be hit on
   // reload.
   await addBreakpoint(dbg, "scripts.html", 18);
   reload(dbg);
   await waitForPaused(dbg);
+  await waitForLoadedSource(dbg, "doc-scripts.html");
   assertPausedLocation(dbg);
   await resume(dbg);
 
   const paused = waitForPaused(dbg);
 
   // Create an eval script that pauses itself.
   invokeInTab("doEval");
 
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-debugger-buttons.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-debugger-buttons.js
@@ -24,16 +24,17 @@ function clickStepOut(dbg) {
  *  4. stepOver to the end of a function
  *  5. stepUp at the end of a function
  */
 add_task(async function() {
   const dbg = await initDebugger("doc-debugger-statements.html");
 
   await reload(dbg);
   await waitForPaused(dbg);
+  await waitForLoadedSource(dbg, "debugger-statements.html");
   assertPausedLocation(dbg);
 
   // resume
   clickElement(dbg, "resume");
   await waitForPaused(dbg);
   assertPausedLocation(dbg);
 
   // step over
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-editor-highlight.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-editor-highlight.js
@@ -5,27 +5,34 @@
 // matter if the source text doesn't exist yet or even if the source
 // doesn't exist.
 
 add_task(async function() {
   const dbg = await initDebugger("doc-scripts.html");
   const { selectors: { getSource }, getState } = dbg;
   const sourceUrl = EXAMPLE_URL + "long.js";
 
+  async function waitForLoaded(dbg, srcUrl) {
+    return waitForState(
+      dbg,
+      state => findSource(dbg, srcUrl).loadedState == "loaded"
+    );
+  }
+
   // The source itself doesn't even exist yet, and using
   // `selectSourceURL` will set a pending request to load this source
   // and highlight a specific line.
-  dbg.actions.selectSourceURL(sourceUrl, { line: 66 });
+  dbg.actions.selectSourceURL(sourceUrl, { location: { line: 66 } });
 
   // Wait for the source text to load and make sure we're in the right
   // place.
-  await waitForDispatch(dbg, "LOAD_SOURCE_TEXT");
+  await waitForLoaded(dbg, sourceUrl);
 
   // TODO: revisit highlighting lines when the debugger opens
-  //assertHighlightLocation(dbg, "long.js", 66);
+  // assertHighlightLocation(dbg, "long.js", 66);
 
   // Jump to line 16 and make sure the editor scrolled.
   await selectSource(dbg, "long.js", 16);
   assertHighlightLocation(dbg, "long.js", 16);
 
   // Make sure only one line is ever highlighted and the flash
   // animation is cancelled on old lines.
   await selectSource(dbg, "long.js", 17);
@@ -40,12 +47,12 @@ add_task(async function() {
   // Test jumping to a line in a source that exists but hasn't been
   // loaded yet.
   selectSource(dbg, "simple1.js", 6);
 
   // Make sure the source is in the loading state, wait for it to be
   // fully loaded, and check the highlighted line.
   const simple1 = findSource(dbg, "simple1.js");
   ok(getSource(getState(), simple1.id).get("loadedState"));
-  await waitForDispatch(dbg, "LOAD_SOURCE_TEXT");
+  await waitForLoaded(dbg, "simple1.js");
   ok(getSource(getState(), simple1.id).get("text"));
   assertHighlightLocation(dbg, "simple1.js", 6);
 });
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-editor-select.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-editor-select.js
@@ -24,31 +24,35 @@ add_task(async function() {
 
   // Set the initial breakpoint.
   await addBreakpoint(dbg, simple1, 4);
   ok(!getSelectedSource(getState()), "No selected source");
 
   // Call the function that we set a breakpoint in.
   invokeInTab("main");
   await waitForPaused(dbg);
+  await waitForLoadedSource(dbg, "simple1");
   assertPausedLocation(dbg);
 
   // Step through to another file and make sure it's paused in the
   // right place.
   await stepIn(dbg);
+  await waitForLoadedSource(dbg, "simple2");
   assertPausedLocation(dbg);
 
   // Step back out to the initial file.
   await stepOut(dbg);
   await stepOut(dbg);
   assertPausedLocation(dbg);
   await resume(dbg);
 
   // Make sure that we can set a breakpoint on a line out of the
   // viewport, and that pausing there scrolls the editor to it.
   let longSrc = findSource(dbg, "long.js");
   await addBreakpoint(dbg, longSrc, 66);
 
   invokeInTab("testModel");
   await waitForPaused(dbg);
+  await waitForLoadedSource(dbg, "long.js");
+
   assertPausedLocation(dbg);
   ok(isElementVisible(dbg, "breakpoint"), "Breakpoint is visible");
 });
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-expressions.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-expressions.js
@@ -40,17 +40,17 @@ async function addExpression(dbg, input)
   findElementWithSelector(dbg, expressionSelectors.input).focus();
   type(dbg, input);
   pressKey(dbg, "Enter");
 
   await waitForDispatch(dbg, "EVALUATE_EXPRESSION");
 }
 
 async function editExpression(dbg, input) {
-  info("updating the expression");
+  info("Updating the expression");
   dblClickElement(dbg, "expressionNode", 1);
   // Position cursor reliably at the end of the text.
   pressKey(dbg, "End");
   type(dbg, input);
   pressKey(dbg, "Enter");
   await waitForDispatch(dbg, "EVALUATE_EXPRESSION");
 }
 
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-iframes.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-iframes.js
@@ -7,20 +7,22 @@
  *  2. pause in the iframe
  */
 add_task(async function() {
   const dbg = await initDebugger("doc-iframes.html");
 
   // test pausing in the main thread
   await reload(dbg);
   await waitForPaused(dbg);
+  await waitForLoadedSource(dbg, "doc-iframes.html");
   assertPausedLocation(dbg);
 
   // test pausing in the iframe
   await resume(dbg);
   await waitForPaused(dbg);
+  await waitForLoadedSource(dbg, "doc-debugger-statements.html");
   assertPausedLocation(dbg);
 
   // test pausing in the iframe
   await resume(dbg);
   await waitForPaused(dbg);
   assertPausedLocation(dbg);
 });
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-minified.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-minified.js
@@ -20,16 +20,17 @@ add_task(async function() {
 
   await waitForSources(dbg, "sum.js");
 
   await selectSource(dbg, "sum.js");
   await addBreakpoint(dbg, "sum.js", 2);
 
   invokeInTab("test");
   await waitForPaused(dbg);
+  await waitForMappedScopes(dbg);
 
   is(getScopeNodeLabel(dbg, 1), "sum");
   is(getScopeNodeLabel(dbg, 2), "<this>");
   is(getScopeNodeLabel(dbg, 3), "arguments");
 
   is(getScopeNodeLabel(dbg, 4), "first");
   is(getScopeNodeValue(dbg, 4), "40");
   is(getScopeNodeLabel(dbg, 5), "second");
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-navigation.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-navigation.js
@@ -16,16 +16,18 @@ add_task(async function() {
 
   invokeInTab("firstCall");
   await waitForPaused(dbg);
 
   await navigate(dbg, "doc-scripts.html", "simple1.js");
   await addBreakpoint(dbg, "simple1.js", 4);
   invokeInTab("main");
   await waitForPaused(dbg);
+  await waitForLoadedSource(dbg, "simple1");
+
   assertPausedLocation(dbg);
   is(countSources(dbg), 4, "4 sources are loaded.");
 
   await navigate(dbg, "about:blank");
   await waitForDispatch(dbg, "NAVIGATE");
   is(countSources(dbg), 0, "0 sources are loaded.");
   ok(!getPause(getState()), "No pause state exists");
 
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print.js
@@ -16,19 +16,23 @@ add_task(async function() {
 
   // this is not implemented yet
   // assertHighlightLocation(dbg, "math.min.js:formatted", 18);
 
   await addBreakpoint(dbg, ppSrc, 18);
 
   invokeInTab("arithmetic");
   await waitForPaused(dbg);
+
   assertPausedLocation(dbg);
+
   await stepOver(dbg);
+
   assertPausedLocation(dbg);
+
   await resume(dbg);
 
   // The pretty-print button should go away in the pretty-printed
   // source.
   ok(!findElement(dbg, "editorFooter"), "Footer is hidden");
 
   await selectSource(dbg, "math.min.js");
   ok(findElement(dbg, "editorFooter"), "Footer is hidden");
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-quick-open.js
@@ -0,0 +1,119 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+function assertEnabled(dbg) {
+  is(
+    dbg.selectors.getQuickOpenEnabled(dbg.getState()),
+    true,
+    "quickOpen enabled"
+  );
+}
+
+function assertDisabled(dbg) {
+  is(
+    dbg.selectors.getQuickOpenEnabled(dbg.getState()),
+    false,
+    "quickOpen disabled"
+  );
+}
+
+function assertLine(dbg, lineNumber) {
+  is(
+    dbg.selectors.getSelectedLocation(dbg.getState()).line,
+    lineNumber,
+    `goto line is ${lineNumber}`
+  );
+}
+
+function assertColumn(dbg, columnNumber) {
+  is(
+    dbg.selectors.getSelectedLocation(dbg.getState()).column,
+    columnNumber,
+    `goto column is ${columnNumber}`
+  );
+}
+
+function waitForSymbols(dbg, url) {
+  const source = findSource(dbg, url);
+  return waitForState(dbg, state => dbg.selectors.getSymbols(state, source.id));
+}
+
+async function waitToClose(dbg) {
+  pressKey(dbg, "Escape");
+  return new Promise(r => setTimeout(r, 200));
+}
+
+function resultCount(dbg) {
+  return findAllElements(dbg, "resultItems").length;
+}
+
+function quickOpen(dbg, query, shortcut = "quickOpen") {
+  pressKey(dbg, shortcut);
+  assertEnabled(dbg);
+  query !== "" && type(dbg, query);
+}
+
+// Testing quick open
+add_task(async function() {
+  const dbg = await initDebugger("doc-script-switching.html");
+
+  info("test opening and closing");
+  quickOpen(dbg, "");
+  pressKey(dbg, "Escape");
+  assertDisabled(dbg);
+
+  quickOpen(dbg, "sw");
+  pressKey(dbg, "Enter");
+
+  let source = dbg.selectors.getSelectedSource(dbg.getState());
+  ok(source.get("url").match(/switching-01/), "first source is selected");
+  await waitForSelectedSource(dbg, "switching-01");
+
+  info("Arrow keys and check to see if source is selected");
+  quickOpen(dbg, "sw");
+  is(resultCount(dbg), 2, "two file results");
+  pressKey(dbg, "Down");
+  pressKey(dbg, "Enter");
+
+  source = dbg.selectors.getSelectedSource(dbg.getState());
+  ok(source.get("url").match(/switching-02/), "second source is selected");
+  await waitForSelectedSource(dbg, "switching-02");
+  quickOpen(dbg, "sw");
+  pressKey(dbg, "Tab");
+  assertDisabled(dbg);
+
+  info("Testing function search");
+  quickOpen(dbg, "", "quickOpenFunc");
+  is(resultCount(dbg), 2, "two function results");
+
+  type(dbg, "x");
+  is(resultCount(dbg), 0, "no functions with 'x' in name");
+
+  pressKey(dbg, "Escape");
+  assertDisabled(dbg);
+
+  info("Testing variable search");
+  quickOpen(dbg, "sw2");
+  pressKey(dbg, "Enter");
+
+  quickOpen(dbg, "#");
+  is(resultCount(dbg), 1, "one variable result");
+  const results = findAllElements(dbg, "resultItems");
+  results.forEach(result => is(result.textContent, "x:13"));
+  await waitToClose(dbg);
+
+  info("Testing goto line:column");
+  assertLine(dbg, undefined);
+  assertColumn(dbg, undefined);
+  quickOpen(dbg, ":7:12");
+  pressKey(dbg, "Enter");
+  assertLine(dbg, 7);
+  assertColumn(dbg, 12);
+
+  info("Testing gotoSource");
+  quickOpen(dbg, "sw1:5");
+  pressKey(dbg, "Enter");
+  source = dbg.selectors.getSelectedSource(dbg.getState());
+  ok(source.get("url").match(/switching-01/), "first source is selected");
+  assertLine(dbg, 5);
+});
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-reload.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-reload.js
@@ -12,17 +12,17 @@ add_task(async function() {
 
   const sym = waitForDispatch(dbg, "SET_SYMBOLS");
   await selectSource(dbg, "sjs_code_reload");
   await sym;
 
   await addBreakpoint(dbg, "sjs_code_reload", 2);
 
   const sync = waitForDispatch(dbg, "SYNC_BREAKPOINT");
-  await reload(dbg,  "sjs_code_reload");
+  await reload(dbg, "sjs_code_reload");
   await sync;
 
   const breakpoints = dbg.selectors.getBreakpoints(dbg.getState());
   const breakpointList = breakpoints.valueSeq().toJS();
   const breakpoint = breakpointList[0];
 
   is(breakpointList.length, 1);
   is(breakpoint.location.line, 6);
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-scopes-mutations.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-scopes-mutations.js
@@ -26,16 +26,17 @@ function onLoadObjectProperties(dbg) {
 add_task(async function() {
   const dbg = await initDebugger("doc-script-mutate.html");
 
   toggleScopes(dbg);
 
   let onPaused = waitForPaused(dbg);
   invokeInTab("mutate");
   await onPaused;
+  await waitForLoadedSource(dbg, "script-mutate");
 
   is(
     getScopeNodeLabel(dbg, 2),
     "<this>",
     'The second element in the scope panel is "<this>"'
   );
   is(
     getScopeNodeLabel(dbg, 3),
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-scopes.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-scopes.js
@@ -11,16 +11,17 @@ function getLabel(dbg, index) {
 
 add_task(async function() {
   const dbg = await initDebugger("doc-script-switching.html");
 
   toggleScopes(dbg);
 
   invokeInTab("firstCall");
   await waitForPaused(dbg);
+  await waitForLoadedSource(dbg, "switching-02");
 
   is(getLabel(dbg, 1), "secondCall");
   is(getLabel(dbg, 2), "<this>");
   is(getLabel(dbg, 4), "foo()");
 
   toggleNode(dbg, 4);
   await waitForDispatch(dbg, "LOAD_OBJECT_PROPERTIES");
   is(getLabel(dbg, 5), "arguments");
deleted file mode 100644
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-search-sources.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-// Testing source search
-add_task(async function() {
-  const dbg = await initDebugger("doc-script-switching.html");
-
-  // test opening and closing
-  pressKey(dbg, "sourceSearch");
-  is(dbg.selectors.getActiveSearch(dbg.getState()), "source");
-  pressKey(dbg, "Escape");
-  is(dbg.selectors.getActiveSearch(dbg.getState()), null);
-
-  pressKey(dbg, "sourceSearch");
-  await waitForElement(dbg, "input");
-  findElementWithSelector(dbg, "input").focus();
-  type(dbg, "sw");
-  pressKey(dbg, "Enter");
-
-  await waitForDispatch(dbg, "LOAD_SOURCE_TEXT");
-  let source = dbg.selectors.getSelectedSource(dbg.getState());
-  ok(source.get("url").match(/switching-01/), "first source is selected");
-
-  // 2. arrow keys and check to see if source is selected
-  pressKey(dbg, "sourceSearch");
-  findElementWithSelector(dbg, "input").focus();
-  type(dbg, "sw");
-  pressKey(dbg, "Down");
-  pressKey(dbg, "Enter");
-
-  await waitForDispatch(dbg, "LOAD_SOURCE_TEXT");
-  source = dbg.selectors.getSelectedSource(dbg.getState());
-  ok(source.get("url").match(/switching-02/), "second source is selected");
-});
deleted file mode 100644
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-search-symbols.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-async function openFunctionSearch(dbg) {
-  synthesizeKeyShortcut("CmdOrCtrl+Shift+O");
-  return new Promise(r => setTimeout(r, 200));
-}
-
-function resultCount(dbg) {
-  return findAllElements(dbg, "resultItems").length;
-}
-
-// Testing function search
-add_task(async function() {
-  const dbg = await initDebugger("doc-script-switching.html", "switching-01");
-
-  await selectSource(dbg, "switching-01");
-
-  // test opening and closing
-  await openFunctionSearch(dbg);
-  is(dbg.selectors.getActiveSearch(dbg.getState()), "symbol");
-  pressKey(dbg, "Escape");
-  is(dbg.selectors.getActiveSearch(dbg.getState()), null);
-
-  await openFunctionSearch(dbg);
-  is(resultCount(dbg), 1);
-
-  type(dbg, "x");
-  is(resultCount(dbg), 0);
-});
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps.js
@@ -73,16 +73,18 @@ add_task(async function() {
   is(getBreakpoints(getState()).size, 2, "Two breakpoints exist");
   assertBreakpointExists(dbg, entrySrc, 15);
 
   invokeInTab("keepMeAlive");
   await waitForPaused(dbg);
   assertPausedLocation(dbg);
 
   await stepIn(dbg);
+  // await waitForMappedScopes(dbg);
   assertPausedLocation(dbg);
+
   await stepOver(dbg);
   assertPausedLocation(dbg);
 
   await stepOut(dbg);
   await stepOut(dbg);
   assertPausedLocation(dbg);
 });
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps2.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps2.js
@@ -1,16 +1,22 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
+
+function assertBpInGutter(dbg, lineNumber) {
+  const el = findElement(dbg, "breakpoint");
+  const bpLineNumber = +el.querySelector(".CodeMirror-linenumber").innerText;
+  is(bpLineNumber, lineNumber);
+}
+
 // Tests loading sourcemapped sources, setting breakpoints, and
 // stepping in them.
 
 // This source map does not have source contents, so it's fetched separately
-
 add_task(async function() {
   // NOTE: the CORS call makes the test run times inconsistent
   requestLongerTimeout(2);
 
   const dbg = await initDebugger("doc-sourcemaps2.html");
   const { selectors: { getBreakpoint, getBreakpoints }, getState } = dbg;
 
   await waitForSources(dbg, "main.js", "main.min.js");
@@ -23,13 +29,14 @@ add_task(async function() {
   // Test that breakpoint is not off by a line.
   await addBreakpoint(dbg, mainSrc, 4);
   is(getBreakpoints(getState()).size, 1, "One breakpoint exists");
   ok(
     getBreakpoint(getState(), { sourceId: mainSrc.id, line: 4, column: 2 }),
     "Breakpoint has correct line"
   );
 
+  assertBpInGutter(dbg, 4);
   invokeInTab("logMessage");
 
   await waitForPaused(dbg);
   assertPausedLocation(dbg);
 });
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-wasm-sourcemaps.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-wasm-sourcemaps.js
@@ -8,24 +8,27 @@ add_task(async function() {
   const dbg = await initDebugger("doc-wasm-sourcemaps.html");
 
   // NOTE: wait for page load -- attempt to fight the intermittent failure:
   // "A promise chain failed to handle a rejection: Debugger.Frame is not live"
   await waitForSource(dbg, "doc-wasm-sourcemaps");
 
   await reload(dbg);
   await waitForPaused(dbg);
+
+  await waitForLoadedSource(dbg, "doc-wasm-sourcemaps");
   assertPausedLocation(dbg);
 
   await waitForSource(dbg, "wasm-sourcemaps/average.c");
   await addBreakpoint(dbg, "wasm-sourcemaps/average.c", 12);
 
   clickElement(dbg, "resume");
 
   await waitForPaused(dbg);
+  await waitForLoadedSource(dbg, "average.c");
   assertPausedLocation(dbg);
 
   const frames = findAllElements(dbg, "frames");
   const firstFrameTitle = frames[0].querySelector(".title").textContent;
   is(firstFrameTitle, "(wasmcall)", "It shall be a wasm call");
   const firstFrameLocation = frames[0].querySelector(".location").textContent;
   is(
     firstFrameLocation.includes("average.c"),
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg_keyboard-shortcuts.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg_keyboard-shortcuts.js
@@ -25,17 +25,18 @@ function pressStepOut(dbg) {
   return waitForPaused(dbg);
 }
 
 add_task(async function() {
   const dbg = await initDebugger("doc-debugger-statements.html");
 
   await reload(dbg);
   await waitForPaused(dbg);
-  assertPausedLocation(dbg);
+  await waitForLoadedSource(dbg, "doc-debugger-statements.html");
+  assertPausedLocation(dbg, "doc-debugger-statements");
 
   await pressResume(dbg);
   assertPausedLocation(dbg);
 
   await pressStepIn(dbg);
   assertPausedLocation(dbg);
 
   await pressStepOut(dbg);
--- a/devtools/client/debugger/new/test/mochitest/head.js
+++ b/devtools/client/debugger/new/test/mochitest/head.js
@@ -144,24 +144,26 @@ function waitForThreadEvents(dbg, eventN
  * Waits for `predicate(state)` to be true. `state` is the redux app state.
  *
  * @memberof mochitest/waits
  * @param {Object} dbg
  * @param {Function} predicate
  * @return {Promise}
  * @static
  */
-function waitForState(dbg, predicate) {
+function waitForState(dbg, predicate, msg) {
   return new Promise(resolve => {
+    info(`Waiting for state change: ${msg || ""}`);
     if (predicate(dbg.store.getState())) {
       return resolve();
     }
 
     const unsubscribe = dbg.store.subscribe(() => {
       if (predicate(dbg.store.getState())) {
+        info(`Finished waiting for state change: ${msg || ""}`);
         unsubscribe();
         resolve();
       }
     });
   });
 }
 
 /**
@@ -211,27 +213,40 @@ function waitForSource(dbg, url) {
   });
 }
 
 async function waitForElement(dbg, selector) {
   await waitUntil(() => findElementWithSelector(dbg, selector));
   return findElementWithSelector(dbg, selector);
 }
 
-function waitForSelectedSource(dbg, sourceId) {
-  return waitForState(dbg, state => {
-    const source = dbg.selectors.getSelectedSource(state);
-    const isLoaded =
-      source && source.has("loadedState") && sourceUtils.isLoaded(source);
-    if (sourceId) {
-      return isLoaded && sourceId == source.get("id");
-    }
+function waitForSelectedSource(dbg, url) {
+  return waitForState(
+    dbg,
+    state => {
+      const source = dbg.selectors.getSelectedSource(state);
+      const isLoaded = source && sourceUtils.isLoaded(source);
+      if (!isLoaded) {
+        return false;
+      }
 
-    return isLoaded;
-  });
+      if (!url) {
+        return true;
+      }
+
+      const newSource = findSource(dbg, url);
+      if (newSource.id != source.get("id")) {
+        return false;
+      }
+
+      // wait for async work to be done
+      return dbg.selectors.hasSymbols(state, source.toJS());
+    },
+    "selected source"
+  );
 }
 
 /**
  * Assert that the debugger is paused at the correct location.
  *
  * @memberof mochitest/asserts
  * @param {Object} dbg
  * @param {String} source
@@ -247,16 +262,26 @@ function assertPausedLocation(dbg) {
   const pause = getPause(getState());
   const pauseLine = pause && pause.frame && pause.frame.location.line;
   assertDebugLine(dbg, pauseLine);
 }
 
 function assertDebugLine(dbg, line) {
   // Check the debug line
   const lineInfo = getCM(dbg).lineInfo(line - 1);
+  const source = dbg.selectors.getSelectedSource(dbg.getState());
+  if (source && source.get("loadedState") == "loading") {
+    const url = source.get("url");
+    ok(
+      false,
+      `Looks like the source ${url} is still loading. Try adding waitForLoadedSource in the test.`
+    );
+    return;
+  }
+
   ok(
     lineInfo.wrapClass.includes("debug-line"),
     "Line is highlighted as paused"
   );
 
   const markedSpans = lineInfo.handle.markedSpans;
   if (markedSpans && markedSpans.length > 0) {
     const marker = markedSpans[0].marker;
@@ -316,18 +341,38 @@ function isPaused(dbg) {
  * @memberof mochitest/waits
  * @param {Object} dbg
  * @static
  */
 async function waitForPaused(dbg) {
   // We want to make sure that we get both a real paused event and
   // that the state is fully populated. The client may do some more
   // work (call other client methods) before populating the state.
+  let loading = waitForDispatch(dbg, "LOAD_OBJECT_PROPERTIES");
   await waitForThreadEvents(dbg, "paused");
-  await waitForState(dbg, state => isTopFrameSelected(dbg, state));
+  await waitForState(dbg, state => isPaused(dbg));
+  await loading;
+}
+
+/**
+ * Waits for the debugger to be fully paused.
+ *
+ * @memberof mochitest/waits
+ * @param {Object} dbg
+ * @static
+ */
+async function waitForMappedScopes(dbg) {
+  await waitForState(
+    dbg,
+    state => {
+      const scopes = dbg.selectors.getScopes(state);
+      return scopes && scopes.sourceBindings;
+    },
+    "mapped scopes"
+  );
 }
 
 function isTopFrameSelected(dbg, state) {
   const pause = dbg.selectors.getPause(state);
 
   // Make sure we have the paused state.
   if (!pause) {
     return false;
@@ -431,30 +476,38 @@ function findSource(dbg, url) {
 
   if (!source) {
     throw new Error("Unable to find source: " + url);
   }
 
   return source.toJS();
 }
 
+function waitForLoadedSource(dbg, url) {
+  return waitForState(
+    dbg,
+    state => findSource(dbg, url).loadedState == "loaded",
+    `loaded source`
+  );
+}
+
 /**
  * Selects the source.
  *
  * @memberof mochitest/actions
  * @param {Object} dbg
  * @param {String} url
  * @param {Number} line
  * @return {Promise}
  * @static
  */
 function selectSource(dbg, url, line) {
   info("Selecting source: " + url);
   const source = findSource(dbg, url);
-  return dbg.actions.selectSource(source.id, { line });
+  return dbg.actions.selectSource(source.id, { location: { line } });
 }
 
 function closeTab(dbg, url) {
   info("Closing tab: " + url);
   const source = findSource(dbg, url);
   return dbg.actions.closeTab(source.url);
 }
 
@@ -506,17 +559,17 @@ function stepOut(dbg) {
  * @memberof mochitest/actions
  * @param {Object} dbg
  * @return {Promise}
  * @static
  */
 function resume(dbg) {
   info("Resuming");
   dbg.actions.resume();
-  return waitForState(dbg, state => !dbg.selectors.isPaused(state));
+  return waitForState(dbg, state => !dbg.selectors.isPaused(state), "resumed");
 }
 
 function deleteExpression(dbg, input) {
   info(`Delete expression "${input}"`);
   return dbg.actions.deleteExpression({ input });
 }
 
 /**
@@ -524,17 +577,19 @@ function deleteExpression(dbg, input) {
  *
  * @memberof mochitest/actions
  * @param {Object} dbg
  * @param {Array} sources
  * @return {Promise}
  * @static
  */
 function reload(dbg, ...sources) {
-  return dbg.client.reload().then(() => waitForSources(dbg, ...sources));
+  return dbg.client
+    .reload()
+    .then(() => waitForSources(dbg, ...sources), "reloaded");
 }
 
 /**
  * Navigates the debuggee to another url.
  *
  * @memberof mochitest/actions
  * @param {Object} dbg
  * @param {String} url
@@ -635,34 +690,35 @@ const isLinux = Services.appinfo.OS === 
 const isMac = Services.appinfo.OS === "Darwin";
 const cmdOrCtrl = isLinux ? { ctrlKey: true } : { metaKey: true };
 const shiftOrAlt = isMac
   ? { accelKey: true, shiftKey: true }
   : { accelKey: true, altKey: true };
 
 const cmdShift = isMac
   ? { accelKey: true, shiftKey: true, metaKey: true }
-  : { accelKey: true, altKey: true, ctrlKey: true };
+  : { accelKey: true, shiftKey: true, ctrlKey: true };
 
 // On Mac, going to beginning/end only works with meta+left/right.  On
 // Windows, it only works with home/end.  On Linux, apparently, either
 // ctrl+left/right or home/end work.
 const endKey = isMac
   ? { code: "VK_RIGHT", modifiers: cmdOrCtrl }
   : { code: "VK_END" };
 const startKey = isMac
   ? { code: "VK_LEFT", modifiers: cmdOrCtrl }
   : { code: "VK_HOME" };
 
 const keyMappings = {
   debugger: { code: "s", modifiers: shiftOrAlt },
   inspector: { code: "c", modifiers: shiftOrAlt },
-  sourceSearch: { code: "p", modifiers: cmdOrCtrl },
+  quickOpen: { code: "p", modifiers: cmdOrCtrl },
+  quickOpenFunc: { code: "o", modifiers: cmdShift },
+  quickOpenLine: { code: ":", modifiers: cmdOrCtrl },
   fileSearch: { code: "f", modifiers: cmdOrCtrl },
-  functionSearch: { code: "o", modifiers: cmdShift },
   Enter: { code: "VK_RETURN" },
   ShiftEnter: { code: "VK_RETURN", modifiers: shiftOrAlt },
   Up: { code: "VK_UP" },
   Down: { code: "VK_DOWN" },
   Right: { code: "VK_RIGHT" },
   Left: { code: "VK_LEFT" },
   End: endKey,
   Start: startKey,
--- a/devtools/client/jar.mn
+++ b/devtools/client/jar.mn
@@ -296,9 +296,18 @@ devtools.jar:
     skin/images/firebug/command-screenshot.svg (themes/images/firebug/command-screenshot.svg)
     skin/images/firebug/command-measure.svg (themes/images/firebug/command-measure.svg)
     skin/images/firebug/command-rulers.svg (themes/images/firebug/command-rulers.svg)
     skin/images/firebug/command-noautohide.svg (themes/images/firebug/command-noautohide.svg)
 
     # Debugger
     skin/images/debugger/arrow.svg (themes/images/debugger/arrow.svg)
     skin/images/debugger/blackBox.svg (themes/images/debugger/blackBox.svg)
+    skin/images/debugger/domain.svg (themes/images/debugger/domain.svg)
+    skin/images/debugger/file.svg (themes/images/debugger/file.svg)
+    skin/images/debugger/folder.svg (themes/images/debugger/folder.svg)
+    skin/images/debugger/pause-exceptions.svg (themes/images/debugger/pause-exceptions.svg)
+    skin/images/debugger/pause.svg (themes/images/debugger/pause.svg)
     skin/images/debugger/prettyPrint.svg (themes/images/debugger/prettyPrint.svg)
+    skin/images/debugger/resume.svg (themes/images/debugger/resume.svg)
+    skin/images/debugger/stepIn.svg (themes/images/debugger/stepIn.svg)
+    skin/images/debugger/stepOut.svg (themes/images/debugger/stepOut.svg)
+    skin/images/debugger/stepOver.svg (themes/images/debugger/stepOver.svg)
--- a/devtools/client/locales/en-US/debugger.properties
+++ b/devtools/client/locales/en-US/debugger.properties
@@ -382,18 +382,18 @@ editor.enableBreakpoint=Enable breakpoin
 # for removing a breakpoint on a line.
 editor.removeBreakpoint=Remove breakpoint
 
 # LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item
 # for setting a breakpoint condition on a line.
 editor.editBreakpoint=Edit breakpoint
 
 # LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context
-# menu item for adding/editing a breakpoint condition on a line.
-editor.addConditionalBreakpoint=Add/Edit conditional breakpoint
+# menu item for adding a breakpoint condition on a line.
+editor.addConditionalBreakpoint=Add conditional breakpoint
 editor.addConditionalBreakpoint.accesskey=c
 
 # LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for
 # input element inside ConditionalPanel component
 editor.conditionalPanel.placeholder=This breakpoint will pause when the expression is true
 
 # LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Tooltip text for
 # close button inside ConditionalPanel component
@@ -418,17 +418,18 @@ framework.enableGrouping.accesskey=u
 generated=Generated
 
 # LOCALIZATION NOTE (original): Source Map term for a debugger UI source location
 original=original
 
 # LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression
 # input element
 expressions.placeholder=Add watch expression
-expressions.placeholder.accesskey=e
+expressions.label=Add watch expression
+expressions.accesskey=e
 
 # LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item
 # for closing the selected tab below the mouse.
 sourceTabs.closeTab=Close tab
 sourceTabs.closeTab.accesskey=c
 
 # LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item
 # for closing the other tabs.
new file mode 100644
--- /dev/null
+++ b/devtools/client/themes/images/debugger/domain.svg
@@ -0,0 +1,7 @@
+<!-- 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 width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+  <path d="M9.05 4.634l-2.144.003-.116.116v1.445l.92.965.492.034.116-.116v-.617L9.13 5.7l.035-.95M12.482 10.38l-1.505-1.462H9.362l-.564.516-.034 1.108.72.768 1.323.034-.117-.116v1.2l.972 1.02.315.034.116-.116v-1.154l.422-.374.034-.927-.117.117h.26l.408-.36V10.5l-.125-.124-.575-.033"/>
+  <path d="M8.47 15.073c-3.088 0-5.6-2.513-5.6-5.602V9.4v-.003c0-.018 0-.018.002-.034l.182-.088.724.587.49.033.497.543-.034.9.317.383h.47l.114.096-.032 1.9.524.553h.105l.025-.338 1.004-.95.054-.474.53-.462v-.888l-.588-.038-1.118-1.155H4.48l-.154-.09V9.01l.155-.1h1.164v-.273l.12-.115.7.033.494-.443.034-.746-.624-.655h-.724v.28l-.11.07H4.64l-.114-.09.025-.64.48-.43v-.244h-.382c-.102 0-.152-.128-.08-.2 1.04-1.01 2.428-1.59 3.903-1.59 1.374 0 2.672.5 3.688 1.39.08.068.03.198-.075.198l-1.144-.034-.81.803.52.523v.16l-.382.388h-.158l-.176-.177v-.16l.076-.074-.252-.252-.37.362.53.53c.072.072.005.194-.096.194l-.752-.005v.844h.783L9.885 8l.16-.143h.16l.62.61v.267l.58.027.003.002V8.76l.18-.03 1.234 1.24.753-.708h.382l.116.108c0 .02.003.016.003.036v.065c0 3.09-2.515 5.603-5.605 5.603M8.47 3C4.904 3 2 5.903 2 9.47c0 3.57 2.903 6.472 6.47 6.472 3.57 0 6.472-2.903 6.472-6.47C14.942 5.9 12.04 3 8.472 3"/>
+</svg>
new file mode 100644
--- /dev/null
+++ b/devtools/client/themes/images/debugger/file.svg
@@ -0,0 +1,7 @@
+<!-- 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 width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+  <path d="M4 2v12h9V4.775L9.888 2H4zm0-1h5.888c.246 0 .483.09.666.254l3.112 2.774c.212.19.334.462.334.747V14c0 .552-.448 1-1 1H4c-.552 0-1-.448-1-1V2c0-.552.448-1 1-1z"/>
+  <path d="M9 1.5v4c0 .325.306.564.62.485l4-1c.27-.067.432-.338.365-.606-.067-.27-.338-.432-.606-.365l-4 1L10 5.5v-4c0-.276-.224-.5-.5-.5s-.5.224-.5.5z"/>
+</svg>
new file mode 100644
--- /dev/null
+++ b/devtools/client/themes/images/debugger/folder.svg
@@ -0,0 +1,6 @@
+<!-- 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 width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+  <path d="M2 5.193v7.652c0 .003-.002 0 .007 0H14v-7.69c0-.003.002 0-.007 0h-7.53v-2.15c0-.002-.004-.005-.01-.005H2.01C2 3 2 3 2 3.005V5.193zm-1 0V3.005C1 2.45 1.444 2 2.01 2h4.442c.558 0 1.01.45 1.01 1.005v1.15h6.53c.557 0 1.008.44 1.008 1v7.69c0 .553-.45 1-1.007 1H2.007c-.556 0-1.007-.44-1.007-1V5.193zM6.08 4.15H2v1h4.46v-1h-.38z" fill-rule="evenodd"/>
+</svg>
new file mode 100644
--- /dev/null
+++ b/devtools/client/themes/images/debugger/pause-exceptions.svg
@@ -0,0 +1,7 @@
+<!-- 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 width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+  <path d="M10.483 13.995H5.517l-3.512-3.512V5.516l3.512-3.512h4.966l3.512 3.512v4.967l-3.512 3.512zm4.37-9.042l-3.807-3.805A.503.503 0 0 0 10.691 1H5.309a.503.503 0 0 0-.356.148L1.147 4.953A.502.502 0 0 0 1 5.308v5.383c0 .134.053.262.147.356l3.806 3.806a.503.503 0 0 0 .356.147h5.382a.503.503 0 0 0 .355-.147l3.806-3.806A.502.502 0 0 0 15 10.69V5.308a.502.502 0 0 0-.147-.355z"/>
+  <path d="M10 10.5a.5.5 0 1 0 1 0v-5a.5.5 0 1 0-1 0v5zM5 10.5a.5.5 0 1 0 1 0v-5a.5.5 0 0 0-1 0v5z"/>
+</svg>
new file mode 100644
--- /dev/null
+++ b/devtools/client/themes/images/debugger/pause.svg
@@ -0,0 +1,8 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+  <g fill-rule="evenodd">
+    <path d="M5 12.503l.052-9a.5.5 0 0 0-1-.006l-.052 9a.5.5 0 0 0 1 .006zM12 12.497l-.05-9A.488.488 0 0 0 11.474 3a.488.488 0 0 0-.473.503l.05 9a.488.488 0 0 0 .477.497.488.488 0 0 0 .473-.503z"/>
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/devtools/client/themes/images/debugger/resume.svg
@@ -0,0 +1,6 @@
+<!-- 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 width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+  <path d="M6.925 12.5l7.4-5-7.4-5v10zM6 12.5v-10c0-.785.8-1.264 1.415-.848l7.4 5c.58.392.58 1.304 0 1.696l-7.4 5C6.8 13.764 6 13.285 6 12.5z" fill-rule="evenodd"/>
+</svg>
new file mode 100644
--- /dev/null
+++ b/devtools/client/themes/images/debugger/stepIn.svg
@@ -0,0 +1,8 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="16" height="16" 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"/>
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/devtools/client/themes/images/debugger/stepOut.svg
@@ -0,0 +1,8 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="16" height="16" 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"/>
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/devtools/client/themes/images/debugger/stepOver.svg
@@ -0,0 +1,9 @@
+<!-- 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 width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+  <g fill-rule="evenodd">
+    <path d="M13.297 6.912C12.595 4.39 10.167 2.5 7.398 2.5A5.898 5.898 0 0 0 1.5 8.398a.5.5 0 0 0 1 0A4.898 4.898 0 0 1 7.398 3.5c2.75 0 5.102 2.236 5.102 4.898v.004L8.669 7.029a.5.5 0 0 0-.338.942l4.462 1.598a.5.5 0 0 0 .651-.34.506.506 0 0 0 .02-.043l2-5a.5.5 0 1 0-.928-.372l-1.24 3.098z"/>
+    <circle cx="7" cy="12" r="1"/>
+  </g>
+</svg>
--- a/docshell/base/nsDocShellTreeOwner.h
+++ b/docshell/base/nsDocShellTreeOwner.h
@@ -23,34 +23,33 @@
 #include "nsWeakReference.h"
 #include "nsITimer.h"
 #include "nsIPrompt.h"
 #include "nsIAuthPrompt.h"
 #include "nsITooltipListener.h"
 #include "nsITooltipTextProvider.h"
 #include "nsCTooltipTextProvider.h"
 #include "nsIDroppedLinkHandler.h"
-#include "nsCommandHandler.h"
 
 namespace mozilla {
 namespace dom {
 class EventTarget;
 } // namespace dom
 } // namespace mozilla
 
 class nsWebBrowser;
 class ChromeTooltipListener;
 class ChromeContextMenuListener;
 
 // {6D10C180-6888-11d4-952B-0020183BF181}
 #define NS_ICDOCSHELLTREEOWNER_IID \
   { 0x6d10c180, 0x6888, 0x11d4, { 0x95, 0x2b, 0x0, 0x20, 0x18, 0x3b, 0xf1, 0x81 } }
 
 // This is a fake 'hidden' interface that nsDocShellTreeOwner implements.
-// Classes such as nsCommandHandler can QI for this interface to be sure that
+// Classes can QI for this interface to be sure that
 // they're dealing with a valid nsDocShellTreeOwner and not some other object
 // that implements nsIDocShellTreeOwner.
 class nsICDocShellTreeOwner : public nsISupports
 {
 public:
   NS_DECLARE_STATIC_IID_ACCESSOR(NS_ICDOCSHELLTREEOWNER_IID)
 };
 
@@ -60,17 +59,16 @@ class nsDocShellTreeOwner final : public
                                   public nsIBaseWindow,
                                   public nsIInterfaceRequestor,
                                   public nsIWebProgressListener,
                                   public nsIDOMEventListener,
                                   public nsICDocShellTreeOwner,
                                   public nsSupportsWeakReference
 {
   friend class nsWebBrowser;
-  friend class nsCommandHandler;
 
 public:
   NS_DECL_ISUPPORTS
 
   NS_DECL_NSIBASEWINDOW
   NS_DECL_NSIDOCSHELLTREEOWNER
   NS_DECL_NSIDOMEVENTLISTENER
   NS_DECL_NSIINTERFACEREQUESTOR
--- a/docshell/base/nsIDocShell.idl
+++ b/docshell/base/nsIDocShell.idl
@@ -7,16 +7,17 @@
 #include "domstubs.idl"
 #include "nsIDocShellTreeItem.idl"
 #include "nsIRequest.idl"
 
 %{ C++
 #include "js/TypeDecls.h"
 #include "mozilla/Maybe.h"
 #include "mozilla/NotNull.h"
+#include "nsCOMPtr.h"
 class nsPresContext;
 class nsIPresShell;
 namespace mozilla {
 class Encoding;
 class HTMLEditor;
 }
 %}
 
--- a/dom/asmjscache/AsmJSCache.cpp
+++ b/dom/asmjscache/AsmJSCache.cpp
@@ -62,23 +62,29 @@ namespace mozilla {
 
 MOZ_TYPE_SPECIFIC_SCOPED_POINTER_TEMPLATE(ScopedPRFileDesc, PRFileDesc, PR_Close);
 
 namespace dom {
 namespace asmjscache {
 
 namespace {
 
+class ParentRunnable;
+
 // Anything smaller should compile fast enough that caching will just add
 // overhead.
 static const size_t sMinCachedModuleLength = 10000;
 
 // The number of characters to hash into the Metadata::Entry::mFastHash.
 static const unsigned sNumFastHashChars = 4096;
 
+// Track all live parent actors.
+typedef nsTArray<const ParentRunnable*> ParentActorArray;
+StaticAutoPtr<ParentActorArray> sLiveParentActors;
+
 nsresult
 WriteMetadataFile(nsIFile* aMetadataFile, const Metadata& aMetadata)
 {
   int32_t openFlags = PR_WRONLY | PR_TRUNCATE | PR_CREATE_FILE;
 
   JS::BuildIdCharVector buildId;
   bool ok = GetBuildId(&buildId);
   NS_ENSURE_TRUE(ok, NS_ERROR_OUT_OF_MEMORY);
@@ -797,16 +803,23 @@ ParentRunnable::FinishOnOwningThread()
 {
   AssertIsOnOwningThread();
 
   // Per FileDescriptorHolder::Finish()'s comment, call before
   // releasing the directory lock.
   FileDescriptorHolder::Finish();
 
   mDirectoryLock = nullptr;
+
+  MOZ_ASSERT(sLiveParentActors);
+  sLiveParentActors->RemoveElement(this);
+
+  if (sLiveParentActors->IsEmpty()) {
+    sLiveParentActors = nullptr;
+  }
 }
 
 NS_IMETHODIMP
 ParentRunnable::Run()
 {
   nsresult rv;
 
   // All success/failure paths must eventually call Finish() to avoid leaving
@@ -1034,16 +1047,22 @@ AllocEntryParent(OpenMode aOpenMode,
   if (NS_WARN_IF(aPrincipalInfo.type() == PrincipalInfo::TNullPrincipalInfo)) {
     MOZ_ASSERT(false);
     return nullptr;
   }
 
   RefPtr<ParentRunnable> runnable =
     new ParentRunnable(aPrincipalInfo, aOpenMode, aWriteParams);
 
+  if (!sLiveParentActors) {
+    sLiveParentActors = new ParentActorArray();
+  }
+
+  sLiveParentActors->AppendElement(runnable);
+
   nsresult rv = NS_DispatchToMainThread(runnable);
   NS_ENSURE_SUCCESS(rv, nullptr);
 
   // Transfer ownership to IPDL.
   return runnable.forget().take();
 }
 
 void
@@ -1682,17 +1701,25 @@ public:
   { }
 
   void
   StopIdleMaintenance() override
   { }
 
   void
   ShutdownWorkThreads() override
-  { }
+  {
+    AssertIsOnBackgroundThread();
+
+    if (sLiveParentActors) {
+      MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() {
+        return !sLiveParentActors;
+      }));
+    }
+  }
 
 private:
   nsAutoRefCnt mRefCnt;
   NS_DECL_OWNINGTHREAD
 };
 
 NS_IMPL_ADDREF(asmjscache::Client)
 NS_IMPL_RELEASE(asmjscache::Client)
--- a/dom/ipc/TabChild.cpp
+++ b/dom/ipc/TabChild.cpp
@@ -31,17 +31,17 @@
 #include "mozilla/layers/APZCTreeManagerChild.h"
 #include "mozilla/layers/APZEventState.h"
 #include "mozilla/layers/ContentProcessController.h"
 #include "mozilla/layers/CompositorBridgeChild.h"
 #include "mozilla/layers/DoubleTapToZoom.h"
 #include "mozilla/layers/IAPZCTreeManager.h"
 #include "mozilla/layers/ImageBridgeChild.h"
 #include "mozilla/layers/InputAPZContext.h"
-#include "mozilla/layers/PLayerTransactionChild.h"
+#include "mozilla/layers/LayerTransactionChild.h"
 #include "mozilla/layers/ShadowLayers.h"
 #include "mozilla/layers/WebRenderLayerManager.h"
 #include "mozilla/layout/RenderFrameChild.h"
 #include "mozilla/layout/RenderFrameParent.h"
 #include "mozilla/plugins/PPluginWidgetChild.h"
 #include "mozilla/LookAndFeel.h"
 #include "mozilla/MouseEvents.h"
 #include "mozilla/Move.h"
@@ -2910,17 +2910,17 @@ TabChild::InitRenderingState(const Textu
 
     if (success) {
       MOZ_ASSERT(mLayersConnected == Some(true));
       // Succeeded to create "remote" layer manager
       ImageBridgeChild::IdentifyCompositorTextureHost(mTextureFactoryIdentifier);
       gfx::VRManagerChild::IdentifyTextureHost(mTextureFactoryIdentifier);
       InitAPZState();
     } else {
-      // Fallback to BasicManager
+      NS_WARNING("Fallback to BasicLayerManager");
       mLayersConnected = Some(false);
     }
 
     nsCOMPtr<nsIObserverService> observerService =
         mozilla::services::GetObserverService();
 
     if (observerService) {
         observerService->AddObserver(this,
@@ -2947,16 +2947,25 @@ TabChild::CreateRemoteLayerManager(mozil
     PLayerTransactionChild* shadowManager = aCompositorChild->SendPLayerTransactionConstructor(ignored, LayersId());
     if (shadowManager &&
         shadowManager->SendGetTextureFactoryIdentifier(&mTextureFactoryIdentifier) &&
         mTextureFactoryIdentifier.mParentBackend != LayersBackend::LAYERS_NONE)
     {
       success = true;
     }
     if (!success) {
+      // Since no LayerManager is associated with the tab's widget, we will never
+      // have an opportunity to destroy the PLayerTransaction on the next device
+      // or compositor reset. Therefore, we make sure to forcefully close it here.
+      // Failure to do so will cause the next layer tree to fail to attach due
+      // since the compositor requires the old layer tree to be disassociated.
+      if (shadowManager) {
+        static_cast<LayerTransactionChild*>(shadowManager)->Destroy();
+        shadowManager = nullptr;
+      }
       NS_WARNING("failed to allocate layer transaction");
     } else {
       success = mPuppetWidget->CreateRemoteLayerManager([&] (LayerManager* aLayerManager) -> bool {
         ShadowLayerForwarder* lf = aLayerManager->AsShadowForwarder();
         lf->SetShadowManager(shadowManager);
         lf->IdentifyTextureHost(mTextureFactoryIdentifier);
         return true;
       });
@@ -3294,17 +3303,19 @@ TabChild::ReinitRenderingForDeviceReset(
     if (ShadowLayerForwarder* fwd = clm->AsShadowForwarder()) {
       // Force the LayerTransactionChild to synchronously shutdown. It is
       // okay to do this early, we'll simply stop sending messages. This
       // step is necessary since otherwise the compositor will think we
       // are trying to attach two layer trees to the same ID.
       fwd->SynchronouslyShutdown();
     }
   } else {
-    return;
+    if (mLayersConnected.isNothing()) {
+      return;
+    }
   }
 
   // Proceed with destroying and recreating the layer manager.
   ReinitRendering();
 }
 
 void
 TabChild::CompositorUpdated(const TextureFactoryIdentifier& aNewIdentifier,
--- a/gfx/2d/2D.h
+++ b/gfx/2d/2D.h
@@ -82,16 +82,17 @@ struct FontInstancePlatformOptions;
 
 namespace gfx {
 class UnscaledFont;
 class ScaledFont;
 }
 
 namespace gfx {
 
+class AlphaBoxBlur;
 class ScaledFont;
 class SourceSurface;
 class DataSourceSurface;
 class DrawTarget;
 class DrawEventRecorder;
 class FilterNode;
 class LogForwarder;
 
@@ -1210,16 +1211,24 @@ public:
   /**
    * This balances a call to PushLayer and proceeds to blend the layer back
    * onto the background. This blend will blend the temporary surface back
    * onto the target in device space using POINT sampling and operator over.
    */
   virtual void PopLayer() { MOZ_CRASH("GFX: PopLayer"); }
 
   /**
+   * Perform an in-place blur operation. This is only supported on data draw
+   * targets.
+   */
+  virtual void Blur(const AlphaBoxBlur& aBlur) {
+    MOZ_CRASH("GFX: DoBlur");
+  }
+
+  /**
    * Create a SourceSurface optimized for use with this DrawTarget from
    * existing bitmap data in memory.
    *
    * The SourceSurface does not take ownership of aData, and may be freed at any time.
    */
   virtual already_AddRefed<SourceSurface> CreateSourceSurfaceFromData(unsigned char *aData,
                                                                       const IntSize &aSize,
                                                                       int32_t aStride,
@@ -1260,16 +1269,28 @@ public:
   virtual already_AddRefed<DrawTarget>
     CreateShadowDrawTarget(const IntSize &aSize, SurfaceFormat aFormat,
                            float aSigma) const
   {
     return CreateSimilarDrawTarget(aSize, aFormat);
   }
 
   /**
+   * Create a similar draw target, but if the draw target is not backed by a
+   * raster backend (for example, it is capturing or recording), force it to
+   * create a raster target instead. This is intended for code that wants to
+   * cache pixels, and would have no effect if it were caching a recording.
+   */
+  virtual RefPtr<DrawTarget>
+  CreateSimilarRasterTarget(const IntSize& aSize, SurfaceFormat aFormat) const
+  {
+    return CreateSimilarDrawTarget(aSize, aFormat);
+  }
+
+  /**
    * Create a path builder with the specified fillmode.
    *
    * We need the fill mode up front because of Direct2D.
    * ID2D1SimplifiedGeometrySink requires the fill mode
    * to be set before calling BeginFigure().
    */
   virtual already_AddRefed<PathBuilder> CreatePathBuilder(FillRule aFillRule = FillRule::FILL_WINDING) const = 0;
 
@@ -1511,16 +1532,19 @@ public:
    * Create a DrawTarget that captures the drawing commands and can be replayed
    * onto a compatible DrawTarget afterwards.
    *
    * @param aSize Size of the area this DT will capture.
    */
   static already_AddRefed<DrawTargetCapture>