GeckoViewModule.sys.mjs (4141B)
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 { GeckoViewUtils } from "resource://gre/modules/GeckoViewUtils.sys.mjs"; 6 7 const { debug, warn } = GeckoViewUtils.initLogging("Module"); 8 9 export class GeckoViewModule { 10 static initLogging(aModuleName) { 11 const tag = aModuleName.replace("GeckoView", ""); 12 return GeckoViewUtils.initLogging(tag); 13 } 14 15 constructor(aModuleInfo) { 16 this._info = aModuleInfo; 17 18 this._isContentLoaded = false; 19 this._eventProxy = new EventProxy(this, this.eventDispatcher); 20 21 this.onInitBrowser(); 22 } 23 24 get name() { 25 return this._info.name; 26 } 27 28 get enabled() { 29 return this._info.enabled; 30 } 31 32 get window() { 33 return this.moduleManager.window; 34 } 35 36 getActor(aActorName) { 37 return this.moduleManager.getActor(aActorName); 38 } 39 40 get browser() { 41 return this.moduleManager.browser; 42 } 43 44 get messageManager() { 45 return this.moduleManager.messageManager; 46 } 47 48 get eventDispatcher() { 49 return this.moduleManager.eventDispatcher; 50 } 51 52 get settings() { 53 return this.moduleManager.settings; 54 } 55 56 get moduleManager() { 57 return this._info.manager; 58 } 59 60 // Override to initialize the browser before it is bound to the window. 61 onInitBrowser() {} 62 63 // Override to cleanup when the browser is destroyed. 64 onDestroyBrowser() {} 65 66 // Override to initialize module. 67 onInit() {} 68 69 // Override to cleanup when the window is closed 70 onDestroy() {} 71 72 // Override to detect settings change. Access settings via this.settings. 73 onSettingsUpdate() {} 74 75 // Override to enable module after setting a Java delegate. 76 onEnable() {} 77 78 // Override to disable module after clearing the Java delegate. 79 onDisable() {} 80 81 // Override to perform actions when content module has started loading; 82 // by default, pause events so events that depend on content modules can work. 83 onLoadContentModule() { 84 this._eventProxy.enableQueuing(true); 85 } 86 87 // Override to perform actions when content module has finished loading; 88 // by default, un-pause events and flush queued events. 89 onContentModuleLoaded() { 90 this._eventProxy.enableQueuing(false); 91 this._eventProxy.dispatchQueuedEvents(); 92 } 93 94 registerListener(aEventList) { 95 this._eventProxy.registerListener(aEventList); 96 } 97 98 unregisterListener(aEventList) { 99 this._eventProxy.unregisterListener(aEventList); 100 } 101 } 102 103 class EventProxy { 104 constructor(aListener, aEventDispatcher) { 105 this.listener = aListener; 106 this.eventDispatcher = aEventDispatcher; 107 this._eventQueue = []; 108 this._registeredEvents = []; 109 this._enableQueuing = false; 110 } 111 112 registerListener(aEventList) { 113 debug`registerListener ${aEventList}`; 114 this.eventDispatcher.registerListener(this, aEventList); 115 this._registeredEvents = this._registeredEvents.concat(aEventList); 116 } 117 118 unregisterListener(aEventList) { 119 debug`unregisterListener`; 120 if (this._registeredEvents.length === 0) { 121 return; 122 } 123 124 if (!aEventList) { 125 this.eventDispatcher.unregisterListener(this, this._registeredEvents); 126 this._registeredEvents = []; 127 } else { 128 this.eventDispatcher.unregisterListener(this, aEventList); 129 this._registeredEvents = this._registeredEvents.filter( 130 e => !aEventList.includes(e) 131 ); 132 } 133 } 134 135 onEvent(aEvent, aData) { 136 if (this._enableQueuing) { 137 debug`queue ${aEvent}, data=${aData}`; 138 this._eventQueue.unshift(arguments); 139 } else { 140 this._dispatch(...arguments); 141 } 142 } 143 144 enableQueuing(aEnable) { 145 debug`enableQueuing ${aEnable}`; 146 this._enableQueuing = aEnable; 147 } 148 149 _dispatch(aEvent, aData) { 150 debug`dispatch ${aEvent}, data=${aData}`; 151 if (this.listener.onEvent) { 152 this.listener.onEvent(...arguments); 153 } else { 154 this.listener(...arguments); 155 } 156 } 157 158 dispatchQueuedEvents() { 159 debug`dispatchQueued`; 160 while (this._eventQueue.length) { 161 const args = this._eventQueue.pop(); 162 this._dispatch(...args); 163 } 164 } 165 }