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 }