tor-browser

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

ASRouterParent.sys.mjs (2947B)


      1 /* vim: set ts=2 sw=2 sts=2 et tw=80: */
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 // We use importESModule here instead of static import so that
      7 // the Karma test environment won't choke on this module, since
      8 // it doesn't seem to understand using static import for sys.mjs
      9 // files.
     10 // eslint-disable-next-line mozilla/use-static-import
     11 const { ASRouterNewTabHook } = ChromeUtils.importESModule(
     12  "resource:///modules/asrouter/ASRouterNewTabHook.sys.mjs"
     13 );
     14 
     15 import { ASRouterDefaultConfig } from "resource:///modules/asrouter/ASRouterDefaultConfig.sys.mjs";
     16 
     17 export class ASRouterTabs {
     18  constructor({ asRouterNewTabHook }) {
     19    this.actors = new Set();
     20    this.destroy = () => {};
     21    // This is one of several entrypoints to ASRouter Initialization. There is
     22    // another one in BrowserGlue, and another in BackgroundTaskUtils.
     23    asRouterNewTabHook.createInstance(ASRouterDefaultConfig());
     24    this.loadingMessageHandler = asRouterNewTabHook
     25      .getInstance()
     26      .then(initializer => {
     27        const parentProcessMessageHandler = initializer.connect({
     28          clearChildMessages: ids => this.messageAll("ClearMessages", ids),
     29          clearChildProviders: ids => this.messageAll("ClearProviders", ids),
     30          updateAdminState: state => this.messageAll("UpdateAdminState", state),
     31        });
     32        this.destroy = () => {
     33          initializer.disconnect();
     34        };
     35        return parentProcessMessageHandler;
     36      });
     37  }
     38 
     39  get size() {
     40    return this.actors.size;
     41  }
     42 
     43  messageAll(message, data) {
     44    return Promise.all(
     45      [...this.actors].map(a => a.sendAsyncMessage(message, data))
     46    );
     47  }
     48 
     49  registerActor(actor) {
     50    this.actors.add(actor);
     51  }
     52 
     53  unregisterActor(actor) {
     54    this.actors.delete(actor);
     55  }
     56 }
     57 
     58 const defaultTabsFactory = () =>
     59  new ASRouterTabs({ asRouterNewTabHook: ASRouterNewTabHook });
     60 
     61 export class ASRouterParent extends JSWindowActorParent {
     62  static tabs = null;
     63 
     64  static nextTabId = 0;
     65 
     66  constructor({ tabsFactory } = { tabsFactory: defaultTabsFactory }) {
     67    super();
     68    this.tabsFactory = tabsFactory;
     69  }
     70 
     71  actorCreated() {
     72    ASRouterParent.tabs = ASRouterParent.tabs || this.tabsFactory();
     73    this.tabsFactory = null;
     74    this.tabId = ++ASRouterParent.nextTabId;
     75    ASRouterParent.tabs.registerActor(this);
     76  }
     77 
     78  didDestroy() {
     79    ASRouterParent.tabs.unregisterActor(this);
     80    if (ASRouterParent.tabs.size < 1) {
     81      ASRouterParent.tabs.destroy();
     82      ASRouterParent.tabs = null;
     83    }
     84  }
     85 
     86  getTab() {
     87    return {
     88      id: this.tabId,
     89      browser: this.browsingContext.embedderElement,
     90    };
     91  }
     92 
     93  receiveMessage({ name, data }) {
     94    return ASRouterParent.tabs.loadingMessageHandler.then(handler => {
     95      return handler.handleMessage(name, data, this.getTab());
     96    });
     97  }
     98 }