tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

service_worker.sys.mjs (1893B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 import { WorkerTargetWatcherClass } from "resource://devtools/server/connectors/js-process-actor/target-watchers/worker.sys.mjs";
      6 import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
      7 
      8 const lazy = {};
      9 XPCOMUtils.defineLazyServiceGetter(
     10  lazy,
     11  "wdm",
     12  "@mozilla.org/dom/workers/workerdebuggermanager;1",
     13  Ci.nsIWorkerDebuggerManager
     14 );
     15 
     16 class ServiceWorkerTargetWatcherClass extends WorkerTargetWatcherClass {
     17  constructor() {
     18    super("service_worker");
     19  }
     20  // replicate WorkerTargetWatcherClass private attribute
     21  #workerTargetType = "service_worker";
     22 
     23  /**
     24   * Called whenever the debugged browser element navigates to a new page
     25   * and the URL's host changes.
     26   * This is used to maintain the list of active Service Worker targets
     27   * based on that host name.
     28   *
     29   * @param {object} watcherDataObject
     30   *        See ContentProcessWatcherRegistry
     31   */
     32  async updateBrowserElementHost(watcherDataObject) {
     33    const { sessionData } = watcherDataObject;
     34 
     35    // Create target actor matching this new host.
     36    // Note that we may be navigating to the same host name and the target will already exist.
     37    const promises = [];
     38    for (const dbg of lazy.wdm.getWorkerDebuggerEnumerator()) {
     39      const alreadyCreated = watcherDataObject.workers[
     40        this.#workerTargetType
     41      ].some(info => info.dbg === dbg);
     42      if (
     43        this.shouldHandleWorker(sessionData, dbg, "service_worker") &&
     44        !alreadyCreated
     45      ) {
     46        promises.push(this.createWorkerTargetActor(watcherDataObject, dbg));
     47      }
     48    }
     49    await Promise.all(promises);
     50  }
     51 }
     52 
     53 export const ServiceWorkerTargetWatcher = new ServiceWorkerTargetWatcherClass();