Bug 1772095 - Part 4: Use plain object for lazy getter in mobile/android/modules/geckoview/. r=geckoview-reviewers,agi

Differential Revision: https://phabricator.services.mozilla.com/D147996
This commit is contained in:
Tooru Fujisawa 2022-06-02 10:43:44 +00:00
Родитель d37d7fac1b
Коммит 50161bda46
16 изменённых файлов: 254 добавлений и 190 удалений

Просмотреть файл

@ -13,26 +13,28 @@ const { GeckoViewUtils } = ChromeUtils.import(
"resource://gre/modules/GeckoViewUtils.jsm"
);
XPCOMUtils.defineLazyModuleGetters(this, {
const lazy = {};
XPCOMUtils.defineLazyModuleGetters(lazy, {
AppConstants: "resource://gre/modules/AppConstants.jsm",
EventDispatcher: "resource://gre/modules/Messaging.jsm",
Services: "resource://gre/modules/Services.jsm",
});
ChromeUtils.defineModuleGetter(this, "OS", "resource://gre/modules/osfile.jsm");
ChromeUtils.defineModuleGetter(lazy, "OS", "resource://gre/modules/osfile.jsm");
const { debug, warn } = GeckoViewUtils.initLogging("ChildCrashHandler");
function getDir(name) {
const uAppDataPath = Services.dirsvc.get("UAppData", Ci.nsIFile).path;
return OS.Path.join(uAppDataPath, "Crash Reports", name);
const uAppDataPath = lazy.Services.dirsvc.get("UAppData", Ci.nsIFile).path;
return lazy.OS.Path.join(uAppDataPath, "Crash Reports", name);
}
function getPendingMinidump(id) {
const pendingDir = getDir("pending");
return [".dmp", ".extra"].map(suffix => {
return OS.Path.join(pendingDir, `${id}${suffix}`);
return lazy.OS.Path.join(pendingDir, `${id}${suffix}`);
});
}
@ -54,7 +56,7 @@ var ChildCrashHandler = {
if (
!aSubject.get("abnormal") ||
!AppConstants.MOZ_CRASHREPORTER ||
!lazy.AppConstants.MOZ_CRASHREPORTER ||
disableReporting
) {
return;
@ -64,7 +66,7 @@ var ChildCrashHandler = {
// to report the crash.
const dumpID = aSubject.get("dumpID");
if (!dumpID) {
Services.telemetry
lazy.Services.telemetry
.getHistogramById("FX_CONTENT_CRASH_DUMP_UNAVAILABLE")
.add(1);
return;
@ -79,7 +81,7 @@ var ChildCrashHandler = {
? "BACKGROUND_CHILD"
: "FOREGROUND_CHILD";
EventDispatcher.instance.sendRequest({
lazy.EventDispatcher.instance.sendRequest({
type: "GeckoView:ChildCrashReport",
minidumpPath,
extrasPath,

Просмотреть файл

@ -11,8 +11,10 @@ const { XPCOMUtils } = ChromeUtils.import(
"resource://gre/modules/XPCOMUtils.jsm"
);
const lazy = {};
XPCOMUtils.defineLazyServiceGetter(
this,
lazy,
"MessageLoop",
"@mozilla.org/message-loop;1",
"nsIMessageLoop"
@ -96,7 +98,7 @@ var Impl = {
if (nextDue !== undefined) {
// Schedule the next idle, if we still have pending inits.
MessageLoop.postIdleTask(
lazy.MessageLoop.postIdleTask(
() => this.onIdle(),
Math.max(0, nextDue - time)
);
@ -121,7 +123,7 @@ var Impl = {
if (!this.pendingInits.length) {
// Schedule for the first idle.
MessageLoop.postIdleTask(() => this.onIdle(), wait);
lazy.MessageLoop.postIdleTask(() => this.onIdle(), wait);
}
this.pendingInits.push(init);
return init;

Просмотреть файл

@ -20,12 +20,14 @@ const { GeckoViewUtils } = ChromeUtils.import(
"resource://gre/modules/GeckoViewUtils.jsm"
);
XPCOMUtils.defineLazyModuleGetters(this, {
const lazy = {};
XPCOMUtils.defineLazyModuleGetters(lazy, {
EventDispatcher: "resource://gre/modules/Messaging.jsm",
GeckoViewPrompter: "resource://gre/modules/GeckoViewPrompter.jsm",
});
XPCOMUtils.defineLazyGetter(this, "LoginInfo", () =>
XPCOMUtils.defineLazyGetter(lazy, "LoginInfo", () =>
Components.Constructor(
"@mozilla.org/login-manager/loginInfo;1",
"nsILoginInfo",
@ -62,7 +64,7 @@ class LoginEntry {
}
toLoginInfo() {
const info = new LoginInfo(
const info = new lazy.LoginInfo(
this.origin,
this.formActionOrigin,
this.httpRealm,
@ -325,7 +327,7 @@ const GeckoViewAutocomplete = {
fetchLogins(aDomain = null) {
debug`fetchLogins for ${aDomain ?? "All domains"}`;
return EventDispatcher.instance.sendRequestForResult({
return lazy.EventDispatcher.instance.sendRequestForResult({
type: "GeckoView:Autocomplete:Fetch:Login",
domain: aDomain,
});
@ -344,7 +346,7 @@ const GeckoViewAutocomplete = {
fetchCreditCards() {
debug`fetchCreditCards`;
return EventDispatcher.instance.sendRequestForResult({
return lazy.EventDispatcher.instance.sendRequestForResult({
type: "GeckoView:Autocomplete:Fetch:CreditCard",
});
},
@ -364,7 +366,7 @@ const GeckoViewAutocomplete = {
fetchAddresses() {
debug`fetchAddresses`;
return EventDispatcher.instance.sendRequestForResult({
return lazy.EventDispatcher.instance.sendRequestForResult({
type: "GeckoView:Autocomplete:Fetch:Address",
});
},
@ -378,7 +380,7 @@ const GeckoViewAutocomplete = {
onCreditCardSave(aCreditCard) {
debug`onCreditCardSave ${aCreditCard}`;
EventDispatcher.instance.sendRequest({
lazy.EventDispatcher.instance.sendRequest({
type: "GeckoView:Autocomplete:Save:CreditCard",
creditCard: aCreditCard,
});
@ -393,7 +395,7 @@ const GeckoViewAutocomplete = {
onAddressSave(aAddress) {
debug`onAddressSave ${aAddress}`;
EventDispatcher.instance.sendRequest({
lazy.EventDispatcher.instance.sendRequest({
type: "GeckoView:Autocomplete:Save:Address",
address: aAddress,
});
@ -409,7 +411,7 @@ const GeckoViewAutocomplete = {
onLoginSave(aLogin) {
debug`onLoginSave ${aLogin}`;
EventDispatcher.instance.sendRequest({
lazy.EventDispatcher.instance.sendRequest({
type: "GeckoView:Autocomplete:Save:Login",
login: aLogin,
});
@ -426,7 +428,7 @@ const GeckoViewAutocomplete = {
onLoginPasswordUsed(aLogin) {
debug`onLoginUsed ${aLogin}`;
EventDispatcher.instance.sendRequest({
lazy.EventDispatcher.instance.sendRequest({
type: "GeckoView:Autocomplete:Used:Login",
usedFields: UsedField.PASSWORD,
login: aLogin,
@ -453,7 +455,7 @@ const GeckoViewAutocomplete = {
return;
}
const prompt = new GeckoViewPrompter(aBrowser.ownerGlobal);
const prompt = new lazy.GeckoViewPrompter(aBrowser.ownerGlobal);
prompt.asyncShowPrompt(
{
type: "Autocomplete:Select:Login",
@ -493,7 +495,7 @@ const GeckoViewAutocomplete = {
return;
}
const prompt = new GeckoViewPrompter(aBrowser.ownerGlobal);
const prompt = new lazy.GeckoViewPrompter(aBrowser.ownerGlobal);
prompt.asyncShowPrompt(
{
type: "Autocomplete:Select:CreditCard",
@ -533,7 +535,7 @@ const GeckoViewAutocomplete = {
return;
}
const prompt = new GeckoViewPrompter(aBrowser.ownerGlobal);
const prompt = new lazy.GeckoViewPrompter(aBrowser.ownerGlobal);
prompt.asyncShowPrompt(
{
type: "Autocomplete:Select:Address",

Просмотреть файл

@ -12,7 +12,9 @@ const { GeckoViewUtils } = ChromeUtils.import(
"resource://gre/modules/GeckoViewUtils.jsm"
);
XPCOMUtils.defineLazyModuleGetters(this, {
const lazy = {};
XPCOMUtils.defineLazyModuleGetters(lazy, {
Services: "resource://gre/modules/Services.jsm",
});
@ -49,7 +51,7 @@ var GeckoViewConsole = {
observe(aSubject, aTopic, aData) {
if (aTopic == "nsPref:changed") {
this.enabled = Services.prefs.getBoolPref(aData, false);
this.enabled = lazy.Services.prefs.getBoolPref(aData, false);
}
},
@ -80,9 +82,9 @@ var GeckoViewConsole = {
flag,
"content javascript"
);
Services.console.logMessage(consoleMsg);
lazy.Services.console.logMessage(consoleMsg);
} else if (aMessage.level == "trace") {
const bundle = Services.strings.createBundle(
const bundle = lazy.Services.strings.createBundle(
"chrome://browser/locale/browser.properties"
);
const args = aMessage.arguments;
@ -112,30 +114,30 @@ var GeckoViewConsole = {
"\n";
});
Services.console.logStringMessage(body);
lazy.Services.console.logStringMessage(body);
} else if (aMessage.level == "time" && aMessage.arguments) {
const bundle = Services.strings.createBundle(
const bundle = lazy.Services.strings.createBundle(
"chrome://browser/locale/browser.properties"
);
const body = bundle.formatStringFromName("timer.start", [
aMessage.arguments.name,
]);
Services.console.logStringMessage(body);
lazy.Services.console.logStringMessage(body);
} else if (aMessage.level == "timeEnd" && aMessage.arguments) {
const bundle = Services.strings.createBundle(
const bundle = lazy.Services.strings.createBundle(
"chrome://browser/locale/browser.properties"
);
const body = bundle.formatStringFromName("timer.end", [
aMessage.arguments.name,
aMessage.arguments.duration,
]);
Services.console.logStringMessage(body);
lazy.Services.console.logStringMessage(body);
} else if (
["group", "groupCollapsed", "groupEnd"].includes(aMessage.level)
) {
// Do nothing yet
} else {
Services.console.logStringMessage(joinedArguments);
lazy.Services.console.logStringMessage(joinedArguments);
}
},

Просмотреть файл

@ -13,7 +13,9 @@ const { XPCOMUtils } = ChromeUtils.import(
"resource://gre/modules/XPCOMUtils.jsm"
);
XPCOMUtils.defineLazyModuleGetters(this, {
const lazy = {};
XPCOMUtils.defineLazyModuleGetters(lazy, {
Services: "resource://gre/modules/Services.jsm",
});
@ -59,8 +61,8 @@ class GeckoViewContent extends GeckoViewModule {
this.window.addEventListener("pagetitlechanged", this);
this.window.addEventListener("pageinfo", this);
Services.obs.addObserver(this, "oop-frameloader-crashed");
Services.obs.addObserver(this, "ipc:content-shutdown");
lazy.Services.obs.addObserver(this, "oop-frameloader-crashed");
lazy.Services.obs.addObserver(this, "ipc:content-shutdown");
}
onDisable() {
@ -84,8 +86,8 @@ class GeckoViewContent extends GeckoViewModule {
this.window.removeEventListener("pagetitlechanged", this);
this.window.removeEventListener("pageinfo", this);
Services.obs.removeObserver(this, "oop-frameloader-crashed");
Services.obs.removeObserver(this, "ipc:content-shutdown");
lazy.Services.obs.removeObserver(this, "oop-frameloader-crashed");
lazy.Services.obs.removeObserver(this, "ipc:content-shutdown");
}
get actor() {

Просмотреть файл

@ -13,13 +13,15 @@ const { XPCOMUtils } = ChromeUtils.import(
"resource://gre/modules/XPCOMUtils.jsm"
);
XPCOMUtils.defineLazyModuleGetters(this, {
const lazy = {};
XPCOMUtils.defineLazyModuleGetters(lazy, {
E10SUtils: "resource://gre/modules/E10SUtils.jsm",
LoadURIDelegate: "resource://gre/modules/LoadURIDelegate.jsm",
Services: "resource://gre/modules/Services.jsm",
});
XPCOMUtils.defineLazyGetter(this, "ReferrerInfo", () =>
XPCOMUtils.defineLazyGetter(lazy, "ReferrerInfo", () =>
Components.Constructor(
"@mozilla.org/referrer-info;1",
"nsIReferrerInfo",
@ -45,10 +47,10 @@ const HEADER_FILTER_UNRESTRICTED_UNSAFE = 2;
const createReferrerInfo = aReferrer => {
let referrerUri;
try {
referrerUri = Services.io.newURI(aReferrer);
referrerUri = lazy.Services.io.newURI(aReferrer);
} catch (ignored) {}
return new ReferrerInfo(Ci.nsIReferrerInfo.EMPTY, true, referrerUri);
return new lazy.ReferrerInfo(Ci.nsIReferrerInfo.EMPTY, true, referrerUri);
};
function convertFlags(aFlags) {
@ -109,7 +111,7 @@ class GeckoViewNavigation extends GeckoViewModule {
// There may be a GeckoViewNavigation module in another window waiting for
// us to create a browser so it can set openWindowInfo, so allow them to do
// that now.
Services.obs.notifyObservers(this.window, "geckoview-window-created");
lazy.Services.obs.notifyObservers(this.window, "geckoview-window-created");
}
onInit() {
@ -185,7 +187,7 @@ class GeckoViewNavigation extends GeckoViewModule {
let triggeringPrincipal, referrerInfo, csp;
if (referrerSessionId) {
const referrerWindow = Services.ww.getWindowByName(
const referrerWindow = lazy.Services.ww.getWindowByName(
referrerSessionId,
this.window
);
@ -196,7 +198,7 @@ class GeckoViewNavigation extends GeckoViewModule {
? referrerWindow.browser.referrerInfo.referrerPolicy
: Ci.nsIReferrerInfo.EMPTY;
referrerInfo = new ReferrerInfo(
referrerInfo = new lazy.ReferrerInfo(
referrerPolicy,
true,
referrerWindow.browser.documentURI
@ -212,12 +214,12 @@ class GeckoViewNavigation extends GeckoViewModule {
// Always use the system principal as the triggering principal
// for user-initiated (ie. no referrer session and not external)
// loads. See discussion in bug 1573860.
triggeringPrincipal = Services.scriptSecurityManager.getSystemPrincipal();
triggeringPrincipal = lazy.Services.scriptSecurityManager.getSystemPrincipal();
}
}
if (!triggeringPrincipal) {
triggeringPrincipal = Services.scriptSecurityManager.createNullPrincipal(
triggeringPrincipal = lazy.Services.scriptSecurityManager.createNullPrincipal(
{}
);
}
@ -235,7 +237,9 @@ class GeckoViewNavigation extends GeckoViewModule {
}
if (additionalHeaders != "") {
additionalHeaders = E10SUtils.makeInputStream(additionalHeaders);
additionalHeaders = lazy.E10SUtils.makeInputStream(
additionalHeaders
);
} else {
additionalHeaders = null;
}
@ -310,14 +314,17 @@ class GeckoViewNavigation extends GeckoViewModule {
aSubject.browser.setAttribute("remote", "false");
aSubject.browser.removeAttribute("remoteType");
}
Services.obs.removeObserver(handler, "geckoview-window-created");
lazy.Services.obs.removeObserver(
handler,
"geckoview-window-created"
);
resolve(aSubject);
}
},
};
// This event is emitted from createBrowser() in geckoview.js
Services.obs.addObserver(handler, "geckoview-window-created");
lazy.Services.obs.addObserver(handler, "geckoview-window-created");
});
}
@ -329,7 +336,7 @@ class GeckoViewNavigation extends GeckoViewModule {
return null;
}
const newSessionId = Services.uuid
const newSessionId = lazy.Services.uuid
.generateUUID()
.toString()
.slice(1, -1)
@ -368,7 +375,7 @@ class GeckoViewNavigation extends GeckoViewModule {
);
// Wait indefinitely for app to respond with a browser or null
Services.tm.spinEventLoopUntil(
lazy.Services.tm.spinEventLoopUntil(
"GeckoViewNavigation.jsm:handleNewSession",
() => this.window.closed || browser !== undefined
);
@ -388,7 +395,7 @@ class GeckoViewNavigation extends GeckoViewModule {
where=${aWhere} flags=${aFlags}`;
if (
LoadURIDelegate.load(
lazy.LoadURIDelegate.load(
this.window,
this.eventDispatcher,
aUri,
@ -428,7 +435,7 @@ class GeckoViewNavigation extends GeckoViewModule {
}
if (
LoadURIDelegate.load(
lazy.LoadURIDelegate.load(
this.window,
this.eventDispatcher,
aUri,
@ -471,7 +478,7 @@ class GeckoViewNavigation extends GeckoViewModule {
where=${where} flags=${flags}`;
if (
LoadURIDelegate.load(
lazy.LoadURIDelegate.load(
this.window,
this.eventDispatcher,
uri,
@ -564,8 +571,8 @@ class GeckoViewNavigation extends GeckoViewModule {
serializePermission({ type, capability, principal }) {
const { URI, originAttributes, privateBrowsingId } = principal;
return {
uri: Services.io.createExposableURI(URI).displaySpec,
principal: E10SUtils.serializePrincipal(principal),
uri: lazy.Services.io.createExposableURI(URI).displaySpec,
principal: lazy.E10SUtils.serializePrincipal(principal),
perm: type,
value: capability,
contextId: originAttributes.geckoViewSessionContextId,
@ -580,7 +587,7 @@ class GeckoViewNavigation extends GeckoViewModule {
let fixedURI = aLocationURI;
try {
fixedURI = Services.io.createExposableURI(aLocationURI);
fixedURI = lazy.Services.io.createExposableURI(aLocationURI);
} catch (ex) {}
// We manually fire the initial about:blank messages to make sure that we
@ -595,7 +602,7 @@ class GeckoViewNavigation extends GeckoViewModule {
const { contentPrincipal } = this.browser;
let permissions;
if (contentPrincipal) {
const rawPerms = Services.perms.getAllForPrincipal(contentPrincipal);
const rawPerms = lazy.Services.perms.getAllForPrincipal(contentPrincipal);
permissions = rawPerms.map(this.serializePermission);
// The only way for apps to set permissions is to get hold of an existing

Просмотреть файл

@ -14,7 +14,9 @@ const { XPCOMUtils } = ChromeUtils.import(
"resource://gre/modules/XPCOMUtils.jsm"
);
XPCOMUtils.defineLazyModuleGetters(this, {
const lazy = {};
XPCOMUtils.defineLazyModuleGetters(lazy, {
Services: "resource://gre/modules/Services.jsm",
});
@ -55,14 +57,14 @@ class GeckoViewProcessHangMonitor extends GeckoViewModule {
onInit() {
debug`onInit`;
Services.obs.addObserver(this, "process-hang-report");
Services.obs.addObserver(this, "clear-hang-report");
lazy.Services.obs.addObserver(this, "process-hang-report");
lazy.Services.obs.addObserver(this, "clear-hang-report");
}
onDestroy() {
debug`onDestroy`;
Services.obs.removeObserver(this, "process-hang-report");
Services.obs.removeObserver(this, "clear-hang-report");
lazy.Services.obs.removeObserver(this, "process-hang-report");
lazy.Services.obs.removeObserver(this, "clear-hang-report");
}
onEnable() {
@ -123,7 +125,9 @@ class GeckoViewProcessHangMonitor extends GeckoViewModule {
*/
get WAIT_EXPIRATION_TIME() {
try {
return Services.prefs.getIntPref("browser.hangNotification.waitPeriod");
return lazy.Services.prefs.getIntPref(
"browser.hangNotification.waitPeriod"
);
} catch (ex) {
return 10000;
}

Просмотреть файл

@ -14,21 +14,23 @@ const { XPCOMUtils } = ChromeUtils.import(
"resource://gre/modules/XPCOMUtils.jsm"
);
const lazy = {};
XPCOMUtils.defineLazyServiceGetter(
this,
lazy,
"OverrideService",
"@mozilla.org/security/certoverride;1",
"nsICertOverrideService"
);
XPCOMUtils.defineLazyServiceGetter(
this,
lazy,
"IDNService",
"@mozilla.org/network/idn-service;1",
"nsIIDNService"
);
XPCOMUtils.defineLazyModuleGetters(this, {
XPCOMUtils.defineLazyModuleGetters(lazy, {
BrowserTelemetryUtils: "resource://gre/modules/BrowserTelemetryUtils.jsm",
HistogramStopwatch: "resource://gre/modules/GeckoViewTelemetry.jsm",
});
@ -140,7 +142,7 @@ var IdentityHandler = {
} catch (e) {}
try {
result.host = IDNService.convertToDisplayIDN(uri.host, {});
result.host = lazy.IDNService.convertToDisplayIDN(uri.host, {});
} catch (e) {
result.host = uri.host;
}
@ -150,7 +152,7 @@ var IdentityHandler = {
result.certificate = aBrowser.securityUI.secInfo.serverCert.getBase64DERString();
try {
result.securityException = OverrideService.hasMatchingOverride(
result.securityException = lazy.OverrideService.hasMatchingOverride(
uri.host,
uri.port,
{},
@ -188,9 +190,12 @@ class ProgressTracker extends Tracker {
constructor(aModule) {
super(aModule);
const window = aModule.browser.ownerGlobal;
this.pageLoadProbe = new HistogramStopwatch("GV_PAGE_LOAD_MS", window);
this.pageReloadProbe = new HistogramStopwatch("GV_PAGE_RELOAD_MS", window);
this.pageLoadProgressProbe = new HistogramStopwatch(
this.pageLoadProbe = new lazy.HistogramStopwatch("GV_PAGE_LOAD_MS", window);
this.pageReloadProbe = new lazy.HistogramStopwatch(
"GV_PAGE_RELOAD_MS",
window
);
this.pageLoadProgressProbe = new lazy.HistogramStopwatch(
"GV_PAGE_LOAD_PROGRESS_MS",
window
);
@ -440,7 +445,7 @@ class StateTracker extends Tracker {
success: aIsSuccess,
});
BrowserTelemetryUtils.recordSiteOriginTelemetry(
lazy.BrowserTelemetryUtils.recordSiteOriginTelemetry(
Services.wm.getEnumerator("navigator:geckoview"),
true
);

Просмотреть файл

@ -14,8 +14,10 @@ const { XPCOMUtils } = ChromeUtils.import(
"resource://gre/modules/XPCOMUtils.jsm"
);
const lazy = {};
XPCOMUtils.defineLazyServiceGetter(
this,
lazy,
"PushNotifier",
"@mozilla.org/push/Notifier;1",
"nsIPushNotifier"
@ -52,7 +54,7 @@ const GeckoViewPushController = {
}
if (!data) {
PushNotifier.notifyPush(url, principal, "");
lazy.PushNotifier.notifyPush(url, principal, "");
return;
}
@ -60,7 +62,7 @@ const GeckoViewPushController = {
ChromeUtils.base64URLDecode(data, { padding: "ignore" })
);
PushNotifier.notifyPushWithData(url, principal, "", payload);
lazy.PushNotifier.notifyPushWithData(url, principal, "", payload);
break;
}
case "GeckoView:PushSubscriptionChanged": {
@ -68,7 +70,7 @@ const GeckoViewPushController = {
const [url, principal] = createScopeAndPrincipal(scope);
PushNotifier.notifySubscriptionChange(url, principal);
lazy.PushNotifier.notifySubscriptionChange(url, principal);
break;
}
}

Просмотреть файл

@ -13,24 +13,26 @@ const { GeckoViewUtils } = ChromeUtils.import(
"resource://gre/modules/GeckoViewUtils.jsm"
);
XPCOMUtils.defineLazyModuleGetters(this, {
const lazy = {};
XPCOMUtils.defineLazyModuleGetters(lazy, {
Services: "resource://gre/modules/Services.jsm",
});
XPCOMUtils.defineLazyGetter(this, "require", () => {
XPCOMUtils.defineLazyGetter(lazy, "require", () => {
const { require } = ChromeUtils.import(
"resource://devtools/shared/loader/Loader.jsm"
);
return require;
});
XPCOMUtils.defineLazyGetter(this, "DevToolsServer", () => {
const { DevToolsServer } = require("devtools/server/devtools-server");
XPCOMUtils.defineLazyGetter(lazy, "DevToolsServer", () => {
const { DevToolsServer } = lazy.require("devtools/server/devtools-server");
return DevToolsServer;
});
XPCOMUtils.defineLazyGetter(this, "SocketListener", () => {
const { SocketListener } = require("devtools/shared/security/socket");
XPCOMUtils.defineLazyGetter(lazy, "SocketListener", () => {
const { SocketListener } = lazy.require("devtools/shared/security/socket");
return SocketListener;
});
@ -42,7 +44,7 @@ var GeckoViewRemoteDebugger = {
return;
}
if (Services.prefs.getBoolPref(aData, false)) {
if (lazy.Services.prefs.getBoolPref(aData, false)) {
this.onEnable();
} else {
this.onDisable();
@ -61,16 +63,16 @@ var GeckoViewRemoteDebugger = {
}
debug`onEnable`;
DevToolsServer.init();
DevToolsServer.registerAllActors();
const {
createRootActor,
} = require("resource://gre/modules/dbg-browser-actors.js");
DevToolsServer.setRootActor(createRootActor);
DevToolsServer.allowChromeProcess = true;
DevToolsServer.chromeWindowType = "navigator:geckoview";
lazy.DevToolsServer.init();
lazy.DevToolsServer.registerAllActors();
const { createRootActor } = lazy.require(
"resource://gre/modules/dbg-browser-actors.js"
);
lazy.DevToolsServer.setRootActor(createRootActor);
lazy.DevToolsServer.allowChromeProcess = true;
lazy.DevToolsServer.chromeWindowType = "navigator:geckoview";
// Force the Server to stay alive even if there are no connections at the moment.
DevToolsServer.keepAlive = true;
lazy.DevToolsServer.keepAlive = true;
// Socket address for USB remote debugger expects
// @ANDROID_PACKAGE_NAME/firefox-debugger-socket.
@ -110,14 +112,19 @@ var GeckoViewRemoteDebugger = {
class USBRemoteDebugger {
start(aPortOrPath) {
try {
const AuthenticatorType = DevToolsServer.Authenticators.get("PROMPT");
const AuthenticatorType = lazy.DevToolsServer.Authenticators.get(
"PROMPT"
);
const authenticator = new AuthenticatorType.Server();
authenticator.allowConnection = this.allowConnection.bind(this);
const socketOptions = {
authenticator,
portOrPath: aPortOrPath,
};
this._listener = new SocketListener(DevToolsServer, socketOptions);
this._listener = new lazy.SocketListener(
lazy.DevToolsServer,
socketOptions
);
this._listener.open();
debug`USB remote debugger - listening on ${aPortOrPath}`;
} catch (e) {
@ -140,12 +147,12 @@ class USBRemoteDebugger {
allowConnection(aSession) {
if (!this._listener) {
return DevToolsServer.AuthenticationResult.DENY;
return lazy.DevToolsServer.AuthenticationResult.DENY;
}
if (aSession.server.port) {
return DevToolsServer.AuthenticationResult.DENY;
return lazy.DevToolsServer.AuthenticationResult.DENY;
}
return DevToolsServer.AuthenticationResult.ALLOW;
return lazy.DevToolsServer.AuthenticationResult.ALLOW;
}
}

Просмотреть файл

@ -14,7 +14,9 @@ const { XPCOMUtils } = ChromeUtils.import(
"resource://gre/modules/XPCOMUtils.jsm"
);
XPCOMUtils.defineLazyModuleGetters(this, {
const lazy = {};
XPCOMUtils.defineLazyModuleGetters(lazy, {
Services: "resource://gre/modules/Services.jsm",
});

Просмотреть файл

@ -14,25 +14,27 @@ const { XPCOMUtils } = ChromeUtils.import(
"resource://gre/modules/XPCOMUtils.jsm"
);
XPCOMUtils.defineLazyModuleGetters(this, {
const lazy = {};
XPCOMUtils.defineLazyModuleGetters(lazy, {
Services: "resource://gre/modules/Services.jsm",
});
XPCOMUtils.defineLazyGetter(this, "MOBILE_USER_AGENT", function() {
XPCOMUtils.defineLazyGetter(lazy, "MOBILE_USER_AGENT", function() {
return Cc["@mozilla.org/network/protocol;1?name=http"].getService(
Ci.nsIHttpProtocolHandler
).userAgent;
});
XPCOMUtils.defineLazyGetter(this, "DESKTOP_USER_AGENT", function() {
return MOBILE_USER_AGENT.replace(
XPCOMUtils.defineLazyGetter(lazy, "DESKTOP_USER_AGENT", function() {
return lazy.MOBILE_USER_AGENT.replace(
/Android \d.+?; [a-zA-Z]+/,
"X11; Linux x86_64"
).replace(/Gecko\/[0-9\.]+/, "Gecko/20100101");
});
XPCOMUtils.defineLazyGetter(this, "VR_USER_AGENT", function() {
return MOBILE_USER_AGENT.replace(/Mobile/, "Mobile VR");
XPCOMUtils.defineLazyGetter(lazy, "VR_USER_AGENT", function() {
return lazy.MOBILE_USER_AGENT.replace(/Mobile/, "Mobile VR");
});
// This needs to match GeckoSessionSettings.java
@ -62,7 +64,7 @@ class GeckoViewSettings extends GeckoViewModule {
switch (aEvent) {
case "GeckoView:GetUserAgent": {
aCallback.onSuccess(this.customUserAgent ?? MOBILE_USER_AGENT);
aCallback.onSuccess(this.customUserAgent ?? lazy.MOBILE_USER_AGENT);
}
}
}
@ -101,10 +103,10 @@ class GeckoViewSettings extends GeckoViewModule {
return this.userAgentOverride;
}
if (this.userAgentMode === USER_AGENT_MODE_DESKTOP) {
return DESKTOP_USER_AGENT;
return lazy.DESKTOP_USER_AGENT;
}
if (this.userAgentMode === USER_AGENT_MODE_VR) {
return VR_USER_AGENT;
return lazy.VR_USER_AGENT;
}
return null;
}

Просмотреть файл

@ -18,7 +18,9 @@ const { ExtensionUtils } = ChromeUtils.import(
const { ExtensionError } = ExtensionUtils;
XPCOMUtils.defineLazyModuleGetters(this, {
const lazy = {};
XPCOMUtils.defineLazyModuleGetters(lazy, {
EventDispatcher: "resource://gre/modules/Messaging.jsm",
Services: "resource://gre/modules/Services.jsm",
mobileWindowTracker: "resource://gre/modules/GeckoViewWebExtension.jsm",
@ -86,7 +88,7 @@ const GeckoViewTabBridge = {
debug`openOptionsPage for extensionId ${extensionId}`;
try {
await EventDispatcher.instance.sendRequestForResult({
await lazy.EventDispatcher.instance.sendRequestForResult({
type: "GeckoView:WebExtension:OpenOptionsPage",
extensionId,
});
@ -115,7 +117,7 @@ const GeckoViewTabBridge = {
async createNewTab({ extensionId, createProperties } = {}) {
debug`createNewTab`;
const newSessionId = Services.uuid
const newSessionId = lazy.Services.uuid
.generateUUID()
.toString()
.slice(1, -1)
@ -130,22 +132,27 @@ const GeckoViewTabBridge = {
aTopic === "geckoview-window-created" &&
aSubject.name === newSessionId
) {
Services.obs.removeObserver(handler, "geckoview-window-created");
lazy.Services.obs.removeObserver(
handler,
"geckoview-window-created"
);
resolve(aSubject);
}
},
};
Services.obs.addObserver(handler, "geckoview-window-created");
lazy.Services.obs.addObserver(handler, "geckoview-window-created");
});
let didOpenSession = false;
try {
didOpenSession = await EventDispatcher.instance.sendRequestForResult({
type: "GeckoView:WebExtension:NewTab",
extensionId,
createProperties,
newSessionId,
});
didOpenSession = await lazy.EventDispatcher.instance.sendRequestForResult(
{
type: "GeckoView:WebExtension:NewTab",
extensionId,
createProperties,
newSessionId,
}
);
} catch (errorMessage) {
// The error message coming from GeckoView is about :NewTab not being
// registered so we need to have one that's extension friendly here.
@ -216,7 +223,7 @@ class GeckoViewTab extends GeckoViewModule {
switch (aEvent) {
case "GeckoView:WebExtension:SetTabActive": {
const { active } = aData;
mobileWindowTracker.setTabActive(this.window, active);
lazy.mobileWindowTracker.setTabActive(this.window, active);
break;
}
}

Просмотреть файл

@ -7,7 +7,9 @@ const { XPCOMUtils } = ChromeUtils.import(
"resource://gre/modules/XPCOMUtils.jsm"
);
XPCOMUtils.defineLazyModuleGetters(this, {
const lazy = {};
XPCOMUtils.defineLazyModuleGetters(lazy, {
AndroidLog: "resource://gre/modules/AndroidLog.jsm",
EventDispatcher: "resource://gre/modules/Messaging.jsm",
Log: "resource://gre/modules/Log.jsm",
@ -20,7 +22,7 @@ var EXPORTED_SYMBOLS = ["GeckoViewUtils"];
* A formatter that does not prepend time/name/level information to messages,
* because those fields are logged separately when using the Android logger.
*/
class AndroidFormatter extends Log.BasicFormatter {
class AndroidFormatter extends lazy.Log.BasicFormatter {
format(message) {
return this.formatText(message);
}
@ -30,20 +32,20 @@ class AndroidFormatter extends Log.BasicFormatter {
* AndroidAppender
* Logs to Android logcat using AndroidLog.jsm
*/
class AndroidAppender extends Log.Appender {
class AndroidAppender extends lazy.Log.Appender {
constructor(aFormatter) {
super(aFormatter || new AndroidFormatter());
this._name = "AndroidAppender";
// Map log level to AndroidLog.foo method.
this._mapping = {
[Log.Level.Fatal]: "e",
[Log.Level.Error]: "e",
[Log.Level.Warn]: "w",
[Log.Level.Info]: "i",
[Log.Level.Config]: "d",
[Log.Level.Debug]: "d",
[Log.Level.Trace]: "v",
[lazy.Log.Level.Fatal]: "e",
[lazy.Log.Level.Error]: "e",
[lazy.Log.Level.Warn]: "w",
[lazy.Log.Level.Info]: "i",
[lazy.Log.Level.Config]: "d",
[lazy.Log.Level.Debug]: "d",
[lazy.Log.Level.Trace]: "v",
};
}
@ -56,7 +58,7 @@ class AndroidAppender extends Log.Appender {
// leading "Gecko" here. Also strip dots to save space.
const tag = aMessage.loggerName.replace(/^Gecko|\./g, "");
const msg = this._formatter.format(aMessage);
AndroidLog[this._mapping[aMessage.level]](tag, msg);
lazy.AndroidLog[this._mapping[aMessage.level]](tag, msg);
}
}
@ -109,13 +111,15 @@ var GeckoViewUtils = {
if (observers) {
const observer = (subject, topic, data) => {
Services.obs.removeObserver(observer, topic);
lazy.Services.obs.removeObserver(observer, topic);
if (!once) {
Services.obs.addObserver(scope[name], topic);
lazy.Services.obs.addObserver(scope[name], topic);
}
scope[name].observe(subject, topic, data); // Explicitly notify new observer
};
observers.forEach(topic => Services.obs.addObserver(observer, topic));
observers.forEach(topic =>
lazy.Services.obs.addObserver(observer, topic)
);
}
if (!this.IS_PARENT_PROCESS) {
@ -134,21 +138,21 @@ var GeckoViewUtils = {
names.forEach(msg => target.addMessageListener(msg, listener));
};
if (ppmm) {
addMMListener(Services.ppmm, ppmm);
addMMListener(lazy.Services.ppmm, ppmm);
}
if (mm) {
addMMListener(Services.mm, mm);
addMMListener(lazy.Services.mm, mm);
}
if (ged) {
const listener = (event, data, callback) => {
EventDispatcher.instance.unregisterListener(listener, event);
lazy.EventDispatcher.instance.unregisterListener(listener, event);
if (!once) {
EventDispatcher.instance.registerListener(scope[name], event);
lazy.EventDispatcher.instance.registerListener(scope[name], event);
}
scope[name].onEvent(event, data, callback);
};
EventDispatcher.instance.registerListener(listener, ged);
lazy.EventDispatcher.instance.registerListener(listener, ged);
}
},
@ -234,7 +238,9 @@ var GeckoViewUtils = {
scope,
name,
(prefs, observer) => {
prefs.forEach(pref => Services.prefs.addObserver(pref.name, observer));
prefs.forEach(pref =>
lazy.Services.prefs.addObserver(pref.name, observer)
);
prefs.forEach(pref => {
if (pref.default === undefined) {
return;
@ -242,26 +248,26 @@ var GeckoViewUtils = {
let value;
switch (typeof pref.default) {
case "string":
value = Services.prefs.getCharPref(pref.name, pref.default);
value = lazy.Services.prefs.getCharPref(pref.name, pref.default);
break;
case "number":
value = Services.prefs.getIntPref(pref.name, pref.default);
value = lazy.Services.prefs.getIntPref(pref.name, pref.default);
break;
case "boolean":
value = Services.prefs.getBoolPref(pref.name, pref.default);
value = lazy.Services.prefs.getBoolPref(pref.name, pref.default);
break;
}
if (pref.default !== value) {
// Notify observer if value already changed from default.
observer(Services.prefs, "nsPref:changed", pref.name);
observer(lazy.Services.prefs, "nsPref:changed", pref.name);
}
});
},
(handlers, observer, args) => {
if (!once) {
Services.prefs.removeObserver(args[2], observer);
lazy.Services.prefs.removeObserver(args[2], observer);
handlers.forEach(handler =>
Services.prefs.addObserver(args[2], observer)
lazy.Services.prefs.addObserver(args[2], observer)
);
}
handlers.forEach(handler => handler.observe(...args));
@ -314,11 +320,11 @@ var GeckoViewUtils = {
try {
if (!this.IS_PARENT_PROCESS) {
const mm = this.getContentFrameMessageManager(aWin.top || aWin);
return mm && EventDispatcher.forMessageManager(mm);
return mm && lazy.EventDispatcher.forMessageManager(mm);
}
const win = this.getChromeWindow(aWin.top || aWin);
if (!win.closed) {
return win.WindowEventDispatcher || EventDispatcher.for(win);
return win.WindowEventDispatcher || lazy.EventDispatcher.for(win);
}
} catch (e) {}
return null;
@ -356,7 +362,7 @@ var GeckoViewUtils = {
this._log(log.logger, level, strings, exprs);
XPCOMUtils.defineLazyGetter(log, "logger", _ => {
const logger = Log.repository.getLogger(tag);
const logger = lazy.Log.repository.getLogger(tag);
logger.parent = this.rootLogger;
return logger;
});
@ -370,7 +376,7 @@ var GeckoViewUtils = {
get rootLogger() {
if (!this._rootLogger) {
this._rootLogger = Log.repository.getLogger("GeckoView");
this._rootLogger = lazy.Log.repository.getLogger("GeckoView");
this._rootLogger.addAppender(new AndroidAppender());
this._rootLogger.manageLevelFromPref("geckoview.logging");
}
@ -387,7 +393,7 @@ var GeckoViewUtils = {
);
}
if (aLogger.level > Log.Level.Numbers[aLevel]) {
if (aLogger.level > lazy.Log.Level.Numbers[aLevel]) {
// Log disabled.
return;
}
@ -432,5 +438,7 @@ var GeckoViewUtils = {
XPCOMUtils.defineLazyGetter(
GeckoViewUtils,
"IS_PARENT_PROCESS",
_ => Services.appinfo.processType == Services.appinfo.PROCESS_TYPE_DEFAULT
_ =>
lazy.Services.appinfo.processType ==
lazy.Services.appinfo.PROCESS_TYPE_DEFAULT
);

Просмотреть файл

@ -28,7 +28,9 @@ const PRIVATE_BROWSING_PERMISSION = {
origins: [],
};
XPCOMUtils.defineLazyModuleGetters(this, {
const lazy = {};
XPCOMUtils.defineLazyModuleGetters(lazy, {
AddonManager: "resource://gre/modules/AddonManager.jsm",
EventDispatcher: "resource://gre/modules/Messaging.jsm",
Extension: "resource://gre/modules/Extension.jsm",
@ -40,7 +42,7 @@ XPCOMUtils.defineLazyModuleGetters(this, {
});
XPCOMUtils.defineLazyServiceGetter(
this,
lazy,
"mimeService",
"@mozilla.org/mime;1",
"nsIMIMEService"
@ -134,10 +136,10 @@ class ExtensionActionHelper {
eventDispatcherFor(aTabId) {
if (!aTabId) {
return EventDispatcher.instance;
return lazy.EventDispatcher.instance;
}
const windowId = GeckoViewTabBridge.tabIdToWindowId(aTabId);
const windowId = lazy.GeckoViewTabBridge.tabIdToWindowId(aTabId);
const window = this.windowTracker.getWindow(windowId);
return window.WindowEventDispatcher;
}
@ -155,7 +157,7 @@ class EmbedderPort {
constructor(portId, messenger) {
this.id = portId;
this.messenger = messenger;
this.dispatcher = EventDispatcher.byName(`port:${portId}`);
this.dispatcher = lazy.EventDispatcher.byName(`port:${portId}`);
this.dispatcher.registerListener(this, [
"GeckoView:WebExtension:PortMessageFromApp",
"GeckoView:WebExtension:PortDisconnect",
@ -224,7 +226,7 @@ class GeckoViewConnection {
// No dispatcher means this message is coming from a background script,
// use the global event handler
return EventDispatcher.instance;
return lazy.EventDispatcher.instance;
} else if (
this.sender.envType === "content_child" &&
this.allowContentMessaging
@ -277,7 +279,7 @@ async function filterPromptPermissions(aPermissions) {
}
const promptPermissions = [];
for (const permission of aPermissions) {
if (!(await Extension.shouldPromptFor(permission))) {
if (!(await lazy.Extension.shouldPromptFor(permission))) {
continue;
}
promptPermissions.push(permission);
@ -333,7 +335,8 @@ async function exportExtension(aAddon, aPermissions, aSourceURI) {
creatorName = name;
creatorURL = url;
}
const openOptionsPageInTab = optionsType === AddonManager.OPTIONS_TYPE_TAB;
const openOptionsPageInTab =
optionsType === lazy.AddonManager.OPTIONS_TYPE_TAB;
const disabledFlags = [];
if (userDisabled) {
disabledFlags.push("userDisabled");
@ -384,11 +387,11 @@ class ExtensionInstallListener {
this.installId = aInstallId;
this.resolve = result => {
aResolve(result);
EventDispatcher.instance.unregisterListener(this, [
lazy.EventDispatcher.instance.unregisterListener(this, [
"GeckoView:WebExtension:CancelInstall",
]);
};
EventDispatcher.instance.registerListener(this, [
lazy.EventDispatcher.instance.registerListener(this, [
"GeckoView:WebExtension:CancelInstall",
]);
}
@ -471,7 +474,7 @@ class ExtensionInstallListener {
if (id != addonId) {
return;
}
Management.off("ready", onReady);
lazy.Management.off("ready", onReady);
const extension = await exportExtension(
aAddon,
aAddon.userPermissions,
@ -479,7 +482,7 @@ class ExtensionInstallListener {
);
this.resolve({ extension });
};
Management.on("ready", onReady);
lazy.Management.on("ready", onReady);
}
}
@ -493,7 +496,7 @@ class ExtensionPromptObserver {
const { sourceURI } = aInstall;
const { permissions } = aInfo;
const extension = await exportExtension(aAddon, permissions, sourceURI);
const response = await EventDispatcher.instance.sendRequestForResult({
const response = await lazy.EventDispatcher.instance.sendRequestForResult({
type: "GeckoView:WebExtension:InstallPrompt",
extension,
});
@ -506,7 +509,7 @@ class ExtensionPromptObserver {
}
async optionalPermissionPrompt(aExtensionId, aPermissions, resolve) {
const response = await EventDispatcher.instance.sendRequestForResult({
const response = await lazy.EventDispatcher.instance.sendRequestForResult({
type: "GeckoView:WebExtension:OptionalPrompt",
extensionId: aExtensionId,
permissions: aPermissions,
@ -562,7 +565,7 @@ class MobileWindowTracker extends EventEmitter {
if (aActive) {
this._topWindow = Cu.getWeakReference(aWindow);
const isPrivate = PrivateBrowsingUtils.isBrowserPrivate(browser);
const isPrivate = lazy.PrivateBrowsingUtils.isBrowserPrivate(browser);
if (!isPrivate) {
this._topNonPBWindow = this._topWindow;
}
@ -586,7 +589,7 @@ async function updatePromptHandler(aInfo) {
const newPerms = aInfo.addon.userPermissions;
const difference = Extension.comparePermissions(oldPerms, newPerms);
const difference = lazy.Extension.comparePermissions(oldPerms, newPerms);
// We only care about permissions that we can prompt the user for
const newPermissions = await filterPromptPermissions(difference.permissions);
@ -602,7 +605,7 @@ async function updatePromptHandler(aInfo) {
oldPerms
);
const updatedExtension = await exportExtension(aInfo.addon, newPerms);
const response = await EventDispatcher.instance.sendRequestForResult({
const response = await lazy.EventDispatcher.instance.sendRequestForResult({
type: "GeckoView:WebExtension:UpdatePrompt",
currentlyInstalled,
updatedExtension,
@ -625,14 +628,14 @@ var GeckoViewWebExtension = {
// We pretend devtools installed/uninstalled this addon so we don't
// have to add an API just for internal testing.
// TODO: assert this is under a test
EventDispatcher.instance.sendRequest({
lazy.EventDispatcher.instance.sendRequest({
type: "GeckoView:WebExtension:DebuggerListUpdated",
});
break;
}
case "devtools-installed-addon": {
EventDispatcher.instance.sendRequest({
lazy.EventDispatcher.instance.sendRequest({
type: "GeckoView:WebExtension:DebuggerListUpdated",
});
break;
@ -641,7 +644,7 @@ var GeckoViewWebExtension = {
},
async extensionById(aId) {
const addon = await AddonManager.getAddonByID(aId);
const addon = await lazy.AddonManager.getAddonByID(aId);
if (!addon) {
debug`Could not find extension with id=${aId}`;
return null;
@ -650,11 +653,11 @@ var GeckoViewWebExtension = {
},
async ensureBuiltIn(aUri, aId) {
await AddonManager.readyPromise;
await lazy.AddonManager.readyPromise;
// Although the add-on is privileged in practice due to it being installed
// as a built-in extension, we pass isPrivileged=false since the exact flag
// doesn't matter as we are only using ExtensionData to read the version.
const extensionData = new ExtensionData(aUri, false);
const extensionData = new lazy.ExtensionData(aUri, false);
const [extensionVersion, extension] = await Promise.all([
extensionData.getExtensionVersionWithoutValidation(),
this.extensionById(aId),
@ -673,14 +676,14 @@ var GeckoViewWebExtension = {
},
async installBuiltIn(aUri) {
await AddonManager.readyPromise;
const addon = await AddonManager.installBuiltinAddon(aUri.spec);
await lazy.AddonManager.readyPromise;
const addon = await lazy.AddonManager.installBuiltinAddon(aUri.spec);
const exported = await exportExtension(addon, addon.userPermissions, aUri);
return { extension: exported };
},
async installWebExtension(aInstallId, aUri) {
const install = await AddonManager.getInstallForURL(aUri.spec, {
const install = await lazy.AddonManager.getInstallForURL(aUri.spec, {
telemetryInfo: {
source: "geckoview-app",
},
@ -692,8 +695,8 @@ var GeckoViewWebExtension = {
});
const systemPrincipal = Services.scriptSecurityManager.getSystemPrincipal();
const mimeType = mimeService.getTypeFromURI(aUri);
AddonManager.installAddonFromWebpage(
const mimeType = lazy.mimeService.getTypeFromURI(aUri);
lazy.AddonManager.installAddonFromWebpage(
mimeType,
null,
systemPrincipal,
@ -705,9 +708,9 @@ var GeckoViewWebExtension = {
async setPrivateBrowsingAllowed(aId, aAllowed) {
if (aAllowed) {
await ExtensionPermissions.add(aId, PRIVATE_BROWSING_PERMISSION);
await lazy.ExtensionPermissions.add(aId, PRIVATE_BROWSING_PERMISSION);
} else {
await ExtensionPermissions.remove(aId, PRIVATE_BROWSING_PERMISSION);
await lazy.ExtensionPermissions.remove(aId, PRIVATE_BROWSING_PERMISSION);
}
// Reload the extension if it is already enabled. This ensures any change
@ -821,7 +824,10 @@ var GeckoViewWebExtension = {
resolve(null);
},
};
aAddon.findUpdates(listener, AddonManager.UPDATE_WHEN_USER_REQUESTED);
aAddon.findUpdates(
listener,
lazy.AddonManager.UPDATE_WHEN_USER_REQUESTED
);
});
},
@ -1048,8 +1054,10 @@ var GeckoViewWebExtension = {
case "GeckoView:WebExtension:List": {
try {
await AddonManager.readyPromise;
const addons = await AddonManager.getAddonsByTypes(["extension"]);
await lazy.AddonManager.readyPromise;
const addons = await lazy.AddonManager.getAddonsByTypes([
"extension",
]);
const extensions = await Promise.all(
addons.map(addon =>
exportExtension(addon, addon.userPermissions, null)

Просмотреть файл

@ -13,7 +13,9 @@ const { GeckoViewUtils } = ChromeUtils.import(
"resource://gre/modules/GeckoViewUtils.jsm"
);
XPCOMUtils.defineLazyModuleGetters(this, {
const lazy = {};
XPCOMUtils.defineLazyModuleGetters(lazy, {
Services: "resource://gre/modules/Services.jsm",
});
@ -51,7 +53,7 @@ const LoadURIDelegate = {
handled = false;
}
);
Services.tm.spinEventLoopUntil(
lazy.Services.tm.spinEventLoopUntil(
"LoadURIDelegate.jsm:load",
() => aWindow.closed || handled !== undefined
);
@ -80,7 +82,7 @@ const LoadURIDelegate = {
aEventDispatcher.sendRequestForResult(msg).then(
response => {
try {
errorPageURI = response ? Services.io.newURI(response) : null;
errorPageURI = response ? lazy.Services.io.newURI(response) : null;
} catch (e) {
warn`Failed to parse URI '${response}`;
errorPageURI = null;
@ -92,7 +94,7 @@ const LoadURIDelegate = {
Components.returnCode = Cr.NS_ERROR_ABORT;
}
);
Services.tm.spinEventLoopUntil(
lazy.Services.tm.spinEventLoopUntil(
"LoadURIDelegate.jsm:handleLoadError",
() => aWindow.closed || errorPageURI !== undefined
);