update: main window hooks
This commit is contained in:
parent
b48953f405
commit
1e12c84ba6
85
addon/bootstrap.js
vendored
85
addon/bootstrap.js
vendored
@ -5,86 +5,11 @@
|
|||||||
* [2] https://www.zotero.org/support/dev/zotero_7_for_developers
|
* [2] https://www.zotero.org/support/dev/zotero_7_for_developers
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (typeof Zotero == "undefined") {
|
|
||||||
var Zotero;
|
|
||||||
}
|
|
||||||
|
|
||||||
var chromeHandle;
|
var chromeHandle;
|
||||||
|
|
||||||
var windowListener;
|
|
||||||
|
|
||||||
// In Zotero 6, bootstrap methods are called before Zotero is initialized, and using include.js
|
|
||||||
// to get the Zotero XPCOM service would risk breaking Zotero startup. Instead, wait for the main
|
|
||||||
// Zotero window to open and get the Zotero object from there.
|
|
||||||
//
|
|
||||||
// In Zotero 7, bootstrap methods are not called until Zotero is initialized, and the 'Zotero' is
|
|
||||||
// automatically made available.
|
|
||||||
async function waitForZotero() {
|
|
||||||
await new Promise(async (resolve) => {
|
|
||||||
if (typeof Zotero != "undefined") {
|
|
||||||
resolve();
|
|
||||||
}
|
|
||||||
|
|
||||||
const { Services } = ChromeUtils.import(
|
|
||||||
"resource://gre/modules/Services.jsm",
|
|
||||||
);
|
|
||||||
const windows = Services.wm.getEnumerator("navigator:browser");
|
|
||||||
let found = false;
|
|
||||||
while (windows.hasMoreElements()) {
|
|
||||||
let win = windows.getNext();
|
|
||||||
if (win.Zotero) {
|
|
||||||
Zotero = win.Zotero;
|
|
||||||
found = true;
|
|
||||||
resolve();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
windowListener = {
|
|
||||||
onOpenWindow: function (aWindow) {
|
|
||||||
// Wait for the window to finish loading
|
|
||||||
const domWindow = aWindow
|
|
||||||
.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
||||||
.getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow);
|
|
||||||
domWindow.addEventListener(
|
|
||||||
"load",
|
|
||||||
async function () {
|
|
||||||
domWindow.removeEventListener("load", arguments.callee, false);
|
|
||||||
if (!found && domWindow.Zotero) {
|
|
||||||
Zotero = domWindow.Zotero;
|
|
||||||
resolve();
|
|
||||||
} else if (
|
|
||||||
domWindow.location.href ===
|
|
||||||
"chrome://zotero/content/zoteroPane.xhtml"
|
|
||||||
) {
|
|
||||||
// Call the hook for the main window load event
|
|
||||||
// Note that this is not called the first time the window is opened
|
|
||||||
// (when Zotero is initialized), but only when the window is re-opened
|
|
||||||
// after being closed
|
|
||||||
await Zotero.__addonInstance__?.hooks.onMainWindowLoad(domWindow);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
false,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
onCloseWindow: function (aWindow) {
|
|
||||||
const domWindow = aWindow
|
|
||||||
.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
||||||
.getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow);
|
|
||||||
if (
|
|
||||||
domWindow.location.href === "chrome://zotero/content/zoteroPane.xhtml"
|
|
||||||
) {
|
|
||||||
Zotero.__addonInstance__?.hooks.onMainWindowUnload(domWindow);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
Services.wm.addListener(windowListener);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function install(data, reason) {}
|
function install(data, reason) {}
|
||||||
|
|
||||||
async function startup({ id, version, resourceURI, rootURI }, reason) {
|
async function startup({ id, version, resourceURI, rootURI }, reason) {
|
||||||
await waitForZotero();
|
|
||||||
await Zotero.initializationPromise;
|
await Zotero.initializationPromise;
|
||||||
|
|
||||||
// String 'rootURI' introduced in Zotero 7
|
// String 'rootURI' introduced in Zotero 7
|
||||||
@ -117,6 +42,14 @@ async function startup({ id, version, resourceURI, rootURI }, reason) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function onMainWindowLoad(window) {
|
||||||
|
Zotero.__addonInstance__?.hooks.onMainWindowLoad(window);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function onMainWindowUnload(window) {
|
||||||
|
Zotero.__addonInstance__?.hooks.onMainWindowUnload(window);
|
||||||
|
}
|
||||||
|
|
||||||
function shutdown({ id, version, resourceURI, rootURI }, reason) {
|
function shutdown({ id, version, resourceURI, rootURI }, reason) {
|
||||||
if (reason === APP_SHUTDOWN) {
|
if (reason === APP_SHUTDOWN) {
|
||||||
return;
|
return;
|
||||||
@ -128,7 +61,7 @@ function shutdown({ id, version, resourceURI, rootURI }, reason) {
|
|||||||
Components.interfaces.nsISupports,
|
Components.interfaces.nsISupports,
|
||||||
).wrappedJSObject;
|
).wrappedJSObject;
|
||||||
}
|
}
|
||||||
Zotero.__addonInstance__.hooks.onShutdown();
|
Zotero.__addonInstance__?.hooks.onShutdown();
|
||||||
|
|
||||||
Cc["@mozilla.org/intl/stringbundle;1"]
|
Cc["@mozilla.org/intl/stringbundle;1"]
|
||||||
.getService(Components.interfaces.nsIStringBundleService)
|
.getService(Components.interfaces.nsIStringBundleService)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user