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