Add main window hooks for plugins (#3238)

This commit is contained in:
windingwind 2023-07-31 17:09:33 +08:00 committed by GitHub
parent 6dcc70f531
commit ef7916b320
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 8 deletions

View file

@ -20,7 +20,12 @@
"Services": false, "Services": false,
"XPCOMUtils": false, "XPCOMUtils": false,
"XRegExp": false, "XRegExp": false,
"XULElement": false "XULElement": false,
"Cu": false,
"ChromeWorker": false,
"Localization": false,
"L10nFileSource": false,
"L10nRegistry": false,
}, },
"extends": [ "extends": [
"@zotero", "@zotero",

View file

@ -26,7 +26,6 @@
Zotero.Plugins = new function () { Zotero.Plugins = new function () {
var { AddonManager } = ChromeUtils.import("resource://gre/modules/AddonManager.jsm"); var { AddonManager } = ChromeUtils.import("resource://gre/modules/AddonManager.jsm");
var { XPIInstall } = ChromeUtils.import("resource://gre/modules/addons/XPIInstall.jsm");
var scopes = new Map(); var scopes = new Map();
var observers = new Set(); var observers = new Set();
var addonVersions = new Map(); var addonVersions = new Map();
@ -39,7 +38,9 @@ Zotero.Plugins = new function () {
ADDON_INSTALL: 5, ADDON_INSTALL: 5,
ADDON_UNINSTALL: 6, ADDON_UNINSTALL: 6,
ADDON_UPGRADE: 7, ADDON_UPGRADE: 7,
ADDON_DOWNGRADE: 8 ADDON_DOWNGRADE: 8,
MAIN_WINDOW_LOAD: 9,
MAIN_WINDOW_UNLOAD: 10,
}; };
@ -64,6 +65,39 @@ Zotero.Plugins = new function () {
await _callMethod(addon, 'shutdown', REASONS.APP_SHUTDOWN); await _callMethod(addon, 'shutdown', REASONS.APP_SHUTDOWN);
} }
}); });
const mainWindowListener = {
onOpenWindow: function (xulWindow) {
let domWindow = xulWindow.docShell.domWindow;
async function onload() {
domWindow.removeEventListener("load", onload, false);
if (
domWindow.location.href
!== "chrome://zotero/content/zoteroPane.xhtml"
) {
return;
}
let { addons } = await AddonManager.getActiveAddons(["extension"]);
for (let addon of addons) {
await _callMethod(addon, 'onMainWindowLoad', REASONS.MAIN_WINDOW_LOAD, { window: domWindow });
}
}
domWindow.addEventListener("load", onload, false);
},
onCloseWindow: async function (xulWindow) {
let domWindow = xulWindow.docShell.domWindow;
if (
domWindow.location.href !== "chrome://zotero/content/zoteroPane.xhtml"
) {
return;
}
let { addons } = await AddonManager.getActiveAddons(["extension"]);
for (let addon of addons) {
await _callMethod(addon, 'onMainWindowUnload', REASONS.MAIN_WINDOW_LOAD, { window: domWindow });
}
},
};
Services.wm.addListener(mainWindowListener);
}; };
@ -136,7 +170,7 @@ Zotero.Plugins = new function () {
* *
* https://searchfox.org/mozilla-esr60/source/toolkit/mozapps/extensions/internal/XPIProvider.jsm#4343 * https://searchfox.org/mozilla-esr60/source/toolkit/mozapps/extensions/internal/XPIProvider.jsm#4343
*/ */
async function _callMethod(addon, method, reason) { async function _callMethod(addon, method, reason, extraParams) {
try { try {
let id = addon.id; let id = addon.id;
Zotero.debug(`Calling bootstrap method '${method}' for plugin ${id} ` Zotero.debug(`Calling bootstrap method '${method}' for plugin ${id} `
@ -160,6 +194,9 @@ Zotero.Plugins = new function () {
version: addon.version, version: addon.version,
rootURI: addon.getResourceURI().spec rootURI: addon.getResourceURI().spec
}; };
if (extraParams) {
Object.assign(params, extraParams);
}
let result; let result;
try { try {
result = func.call(scope, params, reason); result = func.call(scope, params, reason);
@ -267,7 +304,7 @@ Zotero.Plugins = new function () {
branch.setIntPref(pref, value); branch.setIntPref(pref, value);
break; break;
default: default:
Zotero.logError(`Invalid type '${typeof(value)}' for pref '${pref}'`); Zotero.logError(`Invalid type '${typeof value}' for pref '${pref}'`);
} }
} }
}; };
@ -288,7 +325,7 @@ Zotero.Plugins = new function () {
function clearDefaultPrefs(addon) { function clearDefaultPrefs(addon) {
var branch = Services.prefs.getDefaultBranch(""); var branch = Services.prefs.getDefaultBranch("");
var obj = { var obj = {
pref(pref, value) { pref(pref, _value) {
if (!branch.prefHasUserValue(pref)) { if (!branch.prefHasUserValue(pref)) {
branch.deleteBranch(pref); branch.deleteBranch(pref);
} }
@ -336,7 +373,7 @@ Zotero.Plugins = new function () {
function getVersionChangeReason(oldVersion, newVersion) { function getVersionChangeReason(oldVersion, newVersion) {
return Zotero.Utilities.semverCompare(oldVersion, newVersion) <= 0 return Zotero.Utilities.semverCompare(oldVersion, newVersion) <= 0
? REASONS.ADDON_UPGRADE ? REASONS.ADDON_UPGRADE
: REASONS.ADDON_DOWNGRADE : REASONS.ADDON_DOWNGRADE;
} }