Bug 1548438 - Repeatedly refreshing causes the UI to go blank. r=loganfsmyth
authorJason Laster <jlaster@mozilla.com>
Mon, 06 May 2019 15:01:02 +0000
changeset 472698 4ae270b9ed1d22d2246944990122c2792055b98c
parent 472697 d4287abd610551e73c0228959db59f4ca4f22c74
child 472699 afb54f703345de55f066e105ab254fa80526c3de
push id35976
push useropoprus@mozilla.com
push dateMon, 06 May 2019 21:44:12 +0000
treeherdermozilla-central@e9f5f01d8b8e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersloganfsmyth
bugs1548438
milestone68.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1548438 - Repeatedly refreshing causes the UI to go blank. r=loganfsmyth Differential Revision: https://phabricator.services.mozilla.com/D29605
devtools/client/debugger/dist/parser-worker.js
devtools/client/debugger/dist/pretty-print-worker.js
devtools/client/debugger/dist/search-worker.js
devtools/client/debugger/dist/vendors.js
devtools/client/debugger/packages/devtools-utils/src/tests/worker-utils.js
devtools/client/debugger/packages/devtools-utils/src/worker-utils.js
devtools/client/debugger/src/actions/navigation.js
devtools/client/debugger/src/actions/sources/newSources.js
devtools/client/debugger/src/utils/source-queue.js
devtools/client/debugger/test/mochitest/browser.ini
devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-reloading-quickly.js
devtools/client/shared/components/reps/reps.css
devtools/client/shared/source-map/index.js
devtools/client/shared/source-map/worker.js
--- a/devtools/client/debugger/dist/parser-worker.js
+++ b/devtools/client/debugger/dist/parser-worker.js
@@ -6468,17 +6468,17 @@ function networkRequest(url, opts) {
 }
 
 module.exports = networkRequest;
 
 /***/ }),
 /* 14 */
 /***/ (function(module, exports) {
 
-function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
 
 function WorkerDispatcher() {
   this.msgId = 1;
   this.worker = null;
 } /* This Source Code Form is subject to the terms of the Mozilla Public
    * License, v. 2.0. If a copy of the MPL was not distributed with this
    * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
@@ -6583,72 +6583,19 @@ function workerHandler(publicInterface) 
         return { error: error.toString() };
       }
     })).then(results => {
       self.postMessage({ id, results });
     });
   };
 }
 
-function streamingWorkerHandler(publicInterface, { timeout = 100 } = {}, worker = self) {
-  let streamingWorker = (() => {
-    var _ref = _asyncToGenerator(function* (id, tasks) {
-      let isWorking = true;
-
-      const timeoutId = setTimeout(function () {
-        isWorking = false;
-      }, timeout);
-
-      const results = [];
-      while (tasks.length !== 0 && isWorking) {
-        const { callback, context, args } = tasks.shift();
-        const result = yield callback.call(context, args);
-        results.push(result);
-      }
-      worker.postMessage({ id, status: "pending", data: results });
-      clearTimeout(timeoutId);
-
-      if (tasks.length !== 0) {
-        yield streamingWorker(id, tasks);
-      }
-    });
-
-    return function streamingWorker(_x, _x2) {
-      return _ref.apply(this, arguments);
-    };
-  })();
-
-  return (() => {
-    var _ref2 = _asyncToGenerator(function* (msg) {
-      const { id, method, args } = msg.data;
-      const workerMethod = publicInterface[method];
-      if (!workerMethod) {
-        console.error(`Could not find ${method} defined in worker.`);
-      }
-      worker.postMessage({ id, status: "start" });
-
-      try {
-        const tasks = workerMethod(args);
-        yield streamingWorker(id, tasks);
-        worker.postMessage({ id, status: "done" });
-      } catch (error) {
-        worker.postMessage({ id, status: "error", error });
-      }
-    });
-
-    return function (_x3) {
-      return _ref2.apply(this, arguments);
-    };
-  })();
-}
-
 module.exports = {
   WorkerDispatcher,
-  workerHandler,
-  streamingWorkerHandler
+  workerHandler
 };
 
 /***/ }),
 /* 15 */
 /***/ (function(module, exports) {
 
 var g;
 
--- a/devtools/client/debugger/dist/pretty-print-worker.js
+++ b/devtools/client/debugger/dist/pretty-print-worker.js
@@ -525,17 +525,17 @@ function networkRequest(url, opts) {
 
 module.exports = networkRequest;
 
 /***/ }),
 
 /***/ 14:
 /***/ (function(module, exports) {
 
-function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
 
 function WorkerDispatcher() {
   this.msgId = 1;
   this.worker = null;
 } /* This Source Code Form is subject to the terms of the Mozilla Public
    * License, v. 2.0. If a copy of the MPL was not distributed with this
    * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
@@ -640,72 +640,19 @@ function workerHandler(publicInterface) 
         return { error: error.toString() };
       }
     })).then(results => {
       self.postMessage({ id, results });
     });
   };
 }
 
-function streamingWorkerHandler(publicInterface, { timeout = 100 } = {}, worker = self) {
-  let streamingWorker = (() => {
-    var _ref = _asyncToGenerator(function* (id, tasks) {
-      let isWorking = true;
-
-      const timeoutId = setTimeout(function () {
-        isWorking = false;
-      }, timeout);
-
-      const results = [];
-      while (tasks.length !== 0 && isWorking) {
-        const { callback, context, args } = tasks.shift();
-        const result = yield callback.call(context, args);
-        results.push(result);
-      }
-      worker.postMessage({ id, status: "pending", data: results });
-      clearTimeout(timeoutId);
-
-      if (tasks.length !== 0) {
-        yield streamingWorker(id, tasks);
-      }
-    });
-
-    return function streamingWorker(_x, _x2) {
-      return _ref.apply(this, arguments);
-    };
-  })();
-
-  return (() => {
-    var _ref2 = _asyncToGenerator(function* (msg) {
-      const { id, method, args } = msg.data;
-      const workerMethod = publicInterface[method];
-      if (!workerMethod) {
-        console.error(`Could not find ${method} defined in worker.`);
-      }
-      worker.postMessage({ id, status: "start" });
-
-      try {
-        const tasks = workerMethod(args);
-        yield streamingWorker(id, tasks);
-        worker.postMessage({ id, status: "done" });
-      } catch (error) {
-        worker.postMessage({ id, status: "error", error });
-      }
-    });
-
-    return function (_x3) {
-      return _ref2.apply(this, arguments);
-    };
-  })();
-}
-
 module.exports = {
   WorkerDispatcher,
-  workerHandler,
-  streamingWorkerHandler
+  workerHandler
 };
 
 /***/ }),
 
 /***/ 32:
 /***/ (function(module, exports, __webpack_require__) {
 
 /* -*- Mode: js; js-indent-level: 2; -*- */
--- a/devtools/client/debugger/dist/search-worker.js
+++ b/devtools/client/debugger/dist/search-worker.js
@@ -196,17 +196,17 @@ function networkRequest(url, opts) {
 
 module.exports = networkRequest;
 
 /***/ }),
 
 /***/ 14:
 /***/ (function(module, exports) {
 
-function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
 
 function WorkerDispatcher() {
   this.msgId = 1;
   this.worker = null;
 } /* This Source Code Form is subject to the terms of the Mozilla Public
    * License, v. 2.0. If a copy of the MPL was not distributed with this
    * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
@@ -311,72 +311,19 @@ function workerHandler(publicInterface) 
         return { error: error.toString() };
       }
     })).then(results => {
       self.postMessage({ id, results });
     });
   };
 }
 
-function streamingWorkerHandler(publicInterface, { timeout = 100 } = {}, worker = self) {
-  let streamingWorker = (() => {
-    var _ref = _asyncToGenerator(function* (id, tasks) {
-      let isWorking = true;
-
-      const timeoutId = setTimeout(function () {
-        isWorking = false;
-      }, timeout);
-
-      const results = [];
-      while (tasks.length !== 0 && isWorking) {
-        const { callback, context, args } = tasks.shift();
-        const result = yield callback.call(context, args);
-        results.push(result);
-      }
-      worker.postMessage({ id, status: "pending", data: results });
-      clearTimeout(timeoutId);
-
-      if (tasks.length !== 0) {
-        yield streamingWorker(id, tasks);
-      }
-    });
-
-    return function streamingWorker(_x, _x2) {
-      return _ref.apply(this, arguments);
-    };
-  })();
-
-  return (() => {
-    var _ref2 = _asyncToGenerator(function* (msg) {
-      const { id, method, args } = msg.data;
-      const workerMethod = publicInterface[method];
-      if (!workerMethod) {
-        console.error(`Could not find ${method} defined in worker.`);
-      }
-      worker.postMessage({ id, status: "start" });
-
-      try {
-        const tasks = workerMethod(args);
-        yield streamingWorker(id, tasks);
-        worker.postMessage({ id, status: "done" });
-      } catch (error) {
-        worker.postMessage({ id, status: "error", error });
-      }
-    });
-
-    return function (_x3) {
-      return _ref2.apply(this, arguments);
-    };
-  })();
-}
-
 module.exports = {
   WorkerDispatcher,
-  workerHandler,
-  streamingWorkerHandler
+  workerHandler
 };
 
 /***/ }),
 
 /***/ 15:
 /***/ (function(module, exports) {
 
 var g;
--- a/devtools/client/debugger/dist/vendors.js
+++ b/devtools/client/debugger/dist/vendors.js
@@ -1304,17 +1304,17 @@ function networkRequest(url, opts) {
 
 module.exports = networkRequest;
 
 /***/ }),
 
 /***/ 14:
 /***/ (function(module, exports) {
 
-function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
 
 function WorkerDispatcher() {
   this.msgId = 1;
   this.worker = null;
 } /* This Source Code Form is subject to the terms of the Mozilla Public
    * License, v. 2.0. If a copy of the MPL was not distributed with this
    * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
@@ -1419,72 +1419,19 @@ function workerHandler(publicInterface) 
         return { error: error.toString() };
       }
     })).then(results => {
       self.postMessage({ id, results });
     });
   };
 }
 
-function streamingWorkerHandler(publicInterface, { timeout = 100 } = {}, worker = self) {
-  let streamingWorker = (() => {
-    var _ref = _asyncToGenerator(function* (id, tasks) {
-      let isWorking = true;
-
-      const timeoutId = setTimeout(function () {
-        isWorking = false;
-      }, timeout);
-
-      const results = [];
-      while (tasks.length !== 0 && isWorking) {
-        const { callback, context, args } = tasks.shift();
-        const result = yield callback.call(context, args);
-        results.push(result);
-      }
-      worker.postMessage({ id, status: "pending", data: results });
-      clearTimeout(timeoutId);
-
-      if (tasks.length !== 0) {
-        yield streamingWorker(id, tasks);
-      }
-    });
-
-    return function streamingWorker(_x, _x2) {
-      return _ref.apply(this, arguments);
-    };
-  })();
-
-  return (() => {
-    var _ref2 = _asyncToGenerator(function* (msg) {
-      const { id, method, args } = msg.data;
-      const workerMethod = publicInterface[method];
-      if (!workerMethod) {
-        console.error(`Could not find ${method} defined in worker.`);
-      }
-      worker.postMessage({ id, status: "start" });
-
-      try {
-        const tasks = workerMethod(args);
-        yield streamingWorker(id, tasks);
-        worker.postMessage({ id, status: "done" });
-      } catch (error) {
-        worker.postMessage({ id, status: "error", error });
-      }
-    });
-
-    return function (_x3) {
-      return _ref2.apply(this, arguments);
-    };
-  })();
-}
-
 module.exports = {
   WorkerDispatcher,
-  workerHandler,
-  streamingWorkerHandler
+  workerHandler
 };
 
 /***/ }),
 
 /***/ 15:
 /***/ (function(module, exports) {
 
 var g;
--- a/devtools/client/debugger/packages/devtools-utils/src/tests/worker-utils.js
+++ b/devtools/client/debugger/packages/devtools-utils/src/tests/worker-utils.js
@@ -1,17 +1,13 @@
 /* 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 {
-  WorkerDispatcher,
-  workerHandler,
-  streamingWorkerHandler
-} = require("../worker-utils");
+const { WorkerDispatcher, workerHandler } = require("../worker-utils");
 
 describe("worker utils", () => {
   it("starts a worker", () => {
     const dispatcher = new WorkerDispatcher();
     global.Worker = jest.fn();
     dispatcher.start("foo");
     expect(dispatcher.worker).toEqual(global.Worker.mock.instances[0]);
   });
@@ -143,61 +139,8 @@ describe("worker utils", () => {
     const resp = task("bar");
     resp.catch(e => expect(e).toEqual("Oops, The worker has shutdown!"));
 
     const listener = addEventListenerMock.mock.calls[0][1];
     dispatcher.stop();
     listener({ data: { id: 1 } });
   });
 });
-
-it("streams a task", async () => {
-  jest.useRealTimers();
-
-  const postMessageMock = jest.fn();
-
-  const worker = {
-    postMessage: postMessageMock
-  };
-
-  function makeTasks() {
-    return [
-      {
-        callback: () => new Promise(resolve => setTimeout(() => resolve(1), 50))
-      },
-      {
-        callback: () => new Promise(resolve => setTimeout(() => resolve(2), 50))
-      }
-    ];
-  }
-
-  const _workerHandler = streamingWorkerHandler(
-    { makeTasks },
-    { timeout: 25 },
-    worker
-  );
-
-  const id = 1;
-  const task = _workerHandler({
-    data: { id, method: "makeTasks", calls: [[]] }
-  });
-  await task;
-
-  expect(postMessageMock.mock.calls).toHaveLength(4);
-  expect(postMessageMock.mock.calls[0][0]).toEqual({
-    id,
-    status: "start"
-  });
-  expect(postMessageMock.mock.calls[1][0]).toEqual({
-    id,
-    status: "pending",
-    data: [1]
-  });
-  expect(postMessageMock.mock.calls[2][0]).toEqual({
-    id,
-    status: "pending",
-    data: [2]
-  });
-  expect(postMessageMock.mock.calls[3][0]).toEqual({
-    id,
-    status: "done"
-  });
-});
--- a/devtools/client/debugger/packages/devtools-utils/src/worker-utils.js
+++ b/devtools/client/debugger/packages/devtools-utils/src/worker-utils.js
@@ -125,57 +125,12 @@ function workerHandler(publicInterface: 
         }
       })
     ).then(results => {
       self.postMessage({ id, results });
     });
   };
 }
 
-function streamingWorkerHandler(
-  publicInterface: Object,
-  { timeout = 100 }: Object = {},
-  worker: Object = self
-) {
-  async function streamingWorker(id, tasks) {
-    let isWorking = true;
-
-    const timeoutId = setTimeout(() => {
-      isWorking = false;
-    }, timeout);
-
-    const results = [];
-    while (tasks.length !== 0 && isWorking) {
-      const { callback, context, args } = tasks.shift();
-      const result = await callback.call(context, args);
-      results.push(result);
-    }
-    worker.postMessage({ id, status: "pending", data: results });
-    clearTimeout(timeoutId);
-
-    if (tasks.length !== 0) {
-      await streamingWorker(id, tasks);
-    }
-  }
-
-  return async function(msg: Message) {
-    const { id, method, args } = msg.data;
-    const workerMethod = publicInterface[method];
-    if (!workerMethod) {
-      console.error(`Could not find ${method} defined in worker.`);
-    }
-    worker.postMessage({ id, status: "start" });
-
-    try {
-      const tasks = workerMethod(args);
-      await streamingWorker(id, tasks);
-      worker.postMessage({ id, status: "done" });
-    } catch (error) {
-      worker.postMessage({ id, status: "error", error });
-    }
-  };
-}
-
 module.exports = {
   WorkerDispatcher,
-  workerHandler,
-  streamingWorkerHandler
+  workerHandler
 };
--- a/devtools/client/debugger/src/actions/navigation.js
+++ b/devtools/client/debugger/src/actions/navigation.js
@@ -29,36 +29,30 @@ import type { Action, ThunkArgs } from "
  */
 
 /**
  * @memberof actions/navigation
  * @static
  */
 export function willNavigate(event: Object) {
   return function({ dispatch, getState, client, sourceMaps }: ThunkArgs) {
+    sourceQueue.clear();
     sourceMaps.clearSourceMaps();
     clearWasmStates();
     clearDocuments();
     clearSymbols();
     clearASTs();
     clearScopes();
     clearSources();
     client.detachWorkers();
-    dispatch(navigate(event.url));
-  };
-}
-
-export function navigate(url: string) {
-  return async function({ dispatch, getState }: ThunkArgs) {
-    sourceQueue.clear();
     const thread = getMainThread(getState());
 
     dispatch({
       type: "NAVIGATE",
-      mainThread: { ...thread, url }
+      mainThread: { ...thread, url: event.url }
     });
   };
 }
 
 export function connect(url: string, actor: string, canRewind: boolean) {
   return async function({ dispatch }: ThunkArgs) {
     await dispatch(updateWorkers());
     dispatch(
--- a/devtools/client/debugger/src/actions/sources/newSources.js
+++ b/devtools/client/debugger/src/actions/sources/newSources.js
@@ -38,56 +38,62 @@ import {
   getPendingSelectedLocation,
   getPendingBreakpointsForSource,
   getContext,
   isSourceLoadingOrLoaded
 } from "../../selectors";
 
 import { prefs } from "../../utils/prefs";
 import sourceQueue from "../../utils/source-queue";
-import { ContextError } from "../../utils/context";
+import { validateNavigateContext, ContextError } from "../../utils/context";
 
 import type {
   Source,
   SourceId,
   Context,
   OriginalSourceData,
   GeneratedSourceData,
   QueuedSourceData
 } from "../../types";
 import type { Action, ThunkArgs } from "../types";
 
 function loadSourceMaps(cx: Context, sources: Source[]) {
   return async function({
     dispatch,
     sourceMaps
-  }: ThunkArgs): Promise<Promise<Source>[]> {
-    const sourceList = await Promise.all(
-      sources.map(async ({ id }) => {
-        const originalSources = await dispatch(loadSourceMap(cx, id));
-        sourceQueue.queueSources(
-          originalSources.map(data => ({
-            type: "original",
-            data
-          }))
-        );
-        return originalSources;
-      })
-    );
+  }: ThunkArgs): Promise<?(Promise<Source>[])> {
+    try {
+      const sourceList = await Promise.all(
+        sources.map(async ({ id }) => {
+          const originalSources = await dispatch(loadSourceMap(cx, id));
+          sourceQueue.queueSources(
+            originalSources.map(data => ({
+              type: "original",
+              data
+            }))
+          );
+          return originalSources;
+        })
+      );
 
-    await sourceQueue.flush();
+      await sourceQueue.flush();
 
-    // We would like to sync breakpoints after we are done
-    // loading source maps as sometimes generated and original
-    // files share the same paths.
-    for (const source of sources) {
-      dispatch(checkPendingBreakpoints(cx, source.id));
+      // We would like to sync breakpoints after we are done
+      // loading source maps as sometimes generated and original
+      // files share the same paths.
+      for (const source of sources) {
+        dispatch(checkPendingBreakpoints(cx, source.id));
+      }
+
+      return flatten(sourceList);
+    } catch (error) {
+      if (!(error instanceof ContextError)) {
+        throw error;
+      }
     }
-
-    return flatten(sourceList);
   };
 }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function loadSourceMap(cx: Context, sourceId: SourceId) {
@@ -132,16 +138,17 @@ function loadSourceMap(cx: Context, sour
           type: "CLEAR_SOURCE_MAP_URL",
           cx,
           sourceId
         }: Action)
       );
       return [];
     }
 
+    validateNavigateContext(getState(), cx);
     return urls.map(url => ({
       id: generatedToOriginalId(source.id, url),
       url
     }));
   };
 }
 
 // If a request has been made to show this source, go ahead and
--- a/devtools/client/debugger/src/utils/source-queue.js
+++ b/devtools/client/debugger/src/utils/source-queue.js
@@ -31,10 +31,13 @@ export default {
   queueSources: (sources: QueuedSourceData[]) => {
     if (sources.length > 0) {
       queuedSources = queuedSources.concat(sources);
       queue();
     }
   },
 
   flush: () => Promise.all([queue.flush(), currentWork]),
-  clear: () => queue.cancel()
+  clear: () => {
+    queuedSources = [];
+    queue.cancel();
+  }
 };
--- a/devtools/client/debugger/test/mochitest/browser.ini
+++ b/devtools/client/debugger/test/mochitest/browser.ini
@@ -762,16 +762,17 @@ skip-if = os == "win"
 [browser_dbg-search-project.js]
 [browser_dbg-blackbox-original.js]
 [browser_dbg-sourcemaps.js]
 [browser_dbg-sourcemaps-breakpoints.js]
 [browser_dbg-sourcemaps-disabled.js]
 [browser_dbg-sourcemaps-reload.js]
 skip-if = os == "win" || (verify) # Bug 1434792
 [browser_dbg-sourcemaps-reloading.js]
+[browser_dbg-sourcemaps-reloading-quickly.js]
 [browser_dbg-sourcemaps2.js]
 [browser_dbg-sourcemaps3.js]
 [browser_dbg-sourcemaps-bogus.js]
 skip-if = os == 'linux' && !asan # bug 1447118
 [browser_dbg-sources.js]
 [browser_dbg-sources-arrow-keys.js]
 [browser_dbg-sources-named-eval.js]
 [browser_dbg-sources-querystring.js]
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-reloading-quickly.js
@@ -0,0 +1,27 @@
+/* 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/>. */
+
+/*
+ * Test reloading an original file while the sourcemap is loading.
+ * The test passes when the selected source is visible after two reloads.
+ */
+add_task(async function() {
+  const dbg = await initDebugger("doc-sourcemaps.html");
+
+  await waitForSources(dbg, "entry.js");
+  await selectSource(dbg, "entry.js");
+
+  await reload(dbg);
+  await waitForSources(dbg, "bundle.js");
+
+  await reload(dbg);
+  await waitForLoadedSource(dbg, "entry.js");
+
+  ok(
+    getCM(dbg)
+      .getValue()
+      .includes("window.keepMeAlive"),
+    "Original source text loaded correctly"
+  );
+});
--- a/devtools/client/shared/components/reps/reps.css
+++ b/devtools/client/shared/components/reps/reps.css
@@ -350,30 +350,27 @@ button.open-inspector {
 .open-inspector:hover {
   background-color: var(--theme-icon-checked-color);
 }
 
 /******************************************************************************/
 /* Jump to definition button */
 
 button.jump-definition {
+  mask: url("resource://devtools/client/shared/components/reps/images/jump-definition.svg")
+    no-repeat;
   display: inline-block;
+  background-color: var(--theme-icon-color);
   height: 16px;
   margin-left: 0.25em;
   vertical-align: middle;
-  background: 0% 50% url("resource://devtools/client/shared/components/reps/images/jump-definition.svg")
-    no-repeat;
-  border-color: transparent;
-  stroke: var(--theme-icon-color);
-  -moz-context-properties: stroke;
-  cursor: pointer;
 }
 
 .jump-definition:hover {
-  stroke: var(--theme-icon-checked-color);
+  background-color: var(--theme-icon-checked-color);
 }
 
 /******************************************************************************/
 /* Invoke getter button */
 
 button.invoke-getter {
   mask: url("resource://devtools/client/shared/components/reps/images/input.svg")
     no-repeat;
@@ -441,16 +438,13 @@ button.invoke-getter {
   margin-inline-start: -1px;
 }
 
 /* Focused styles */
 .tree.object-inspector .tree-node.focused * {
   color: inherit;
 }
 
+.tree-node.focused button.jump-definition,
 .tree-node.focused button.open-inspector,
 .tree-node.focused button.invoke-getter {
   background-color: currentColor;
 }
-
-.tree-node.focused .jump-definition.focused {
-  stroke: var(--theme-selection-background);
-}
--- a/devtools/client/shared/source-map/index.js
+++ b/devtools/client/shared/source-map/index.js
@@ -399,17 +399,17 @@ function networkRequest(url, opts) {
 
 module.exports = networkRequest;
 
 /***/ }),
 
 /***/ 14:
 /***/ (function(module, exports) {
 
-function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
 
 function WorkerDispatcher() {
   this.msgId = 1;
   this.worker = null;
 } /* This Source Code Form is subject to the terms of the Mozilla Public
    * License, v. 2.0. If a copy of the MPL was not distributed with this
    * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
@@ -514,72 +514,19 @@ function workerHandler(publicInterface) 
         return { error: error.toString() };
       }
     })).then(results => {
       self.postMessage({ id, results });
     });
   };
 }
 
-function streamingWorkerHandler(publicInterface, { timeout = 100 } = {}, worker = self) {
-  let streamingWorker = (() => {
-    var _ref = _asyncToGenerator(function* (id, tasks) {
-      let isWorking = true;
-
-      const timeoutId = setTimeout(function () {
-        isWorking = false;
-      }, timeout);
-
-      const results = [];
-      while (tasks.length !== 0 && isWorking) {
-        const { callback, context, args } = tasks.shift();
-        const result = yield callback.call(context, args);
-        results.push(result);
-      }
-      worker.postMessage({ id, status: "pending", data: results });
-      clearTimeout(timeoutId);
-
-      if (tasks.length !== 0) {
-        yield streamingWorker(id, tasks);
-      }
-    });
-
-    return function streamingWorker(_x, _x2) {
-      return _ref.apply(this, arguments);
-    };
-  })();
-
-  return (() => {
-    var _ref2 = _asyncToGenerator(function* (msg) {
-      const { id, method, args } = msg.data;
-      const workerMethod = publicInterface[method];
-      if (!workerMethod) {
-        console.error(`Could not find ${method} defined in worker.`);
-      }
-      worker.postMessage({ id, status: "start" });
-
-      try {
-        const tasks = workerMethod(args);
-        yield streamingWorker(id, tasks);
-        worker.postMessage({ id, status: "done" });
-      } catch (error) {
-        worker.postMessage({ id, status: "error", error });
-      }
-    });
-
-    return function (_x3) {
-      return _ref2.apply(this, arguments);
-    };
-  })();
-}
-
 module.exports = {
   WorkerDispatcher,
-  workerHandler,
-  streamingWorkerHandler
+  workerHandler
 };
 
 /***/ }),
 
 /***/ 182:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
--- a/devtools/client/shared/source-map/worker.js
+++ b/devtools/client/shared/source-map/worker.js
@@ -443,17 +443,17 @@ function networkRequest(url, opts) {
 
 module.exports = networkRequest;
 
 /***/ }),
 
 /***/ 14:
 /***/ (function(module, exports) {
 
-function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
 
 function WorkerDispatcher() {
   this.msgId = 1;
   this.worker = null;
 } /* This Source Code Form is subject to the terms of the Mozilla Public
    * License, v. 2.0. If a copy of the MPL was not distributed with this
    * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
@@ -558,72 +558,19 @@ function workerHandler(publicInterface) 
         return { error: error.toString() };
       }
     })).then(results => {
       self.postMessage({ id, results });
     });
   };
 }
 
-function streamingWorkerHandler(publicInterface, { timeout = 100 } = {}, worker = self) {
-  let streamingWorker = (() => {
-    var _ref = _asyncToGenerator(function* (id, tasks) {
-      let isWorking = true;
-
-      const timeoutId = setTimeout(function () {
-        isWorking = false;
-      }, timeout);
-
-      const results = [];
-      while (tasks.length !== 0 && isWorking) {
-        const { callback, context, args } = tasks.shift();
-        const result = yield callback.call(context, args);
-        results.push(result);
-      }
-      worker.postMessage({ id, status: "pending", data: results });
-      clearTimeout(timeoutId);
-
-      if (tasks.length !== 0) {
-        yield streamingWorker(id, tasks);
-      }
-    });
-
-    return function streamingWorker(_x, _x2) {
-      return _ref.apply(this, arguments);
-    };
-  })();
-
-  return (() => {
-    var _ref2 = _asyncToGenerator(function* (msg) {
-      const { id, method, args } = msg.data;
-      const workerMethod = publicInterface[method];
-      if (!workerMethod) {
-        console.error(`Could not find ${method} defined in worker.`);
-      }
-      worker.postMessage({ id, status: "start" });
-
-      try {
-        const tasks = workerMethod(args);
-        yield streamingWorker(id, tasks);
-        worker.postMessage({ id, status: "done" });
-      } catch (error) {
-        worker.postMessage({ id, status: "error", error });
-      }
-    });
-
-    return function (_x3) {
-      return _ref2.apply(this, arguments);
-    };
-  })();
-}
-
 module.exports = {
   WorkerDispatcher,
-  workerHandler,
-  streamingWorkerHandler
+  workerHandler
 };
 
 /***/ }),
 
 /***/ 15:
 /***/ (function(module, exports) {
 
 var g;