Extract zoteroPrint()
This commit is contained in:
parent
7f993a1528
commit
a473002663
4 changed files with 90 additions and 23 deletions
|
@ -34,3 +34,16 @@ ChromeUtils.registerWindowActor("FeedAbstract", {
|
|||
},
|
||||
messageManagerGroups: ["feedAbstract"]
|
||||
});
|
||||
|
||||
ChromeUtils.registerWindowActor("ZoteroPrint", {
|
||||
parent: {
|
||||
moduleURI: "chrome://zotero/content/actors/ZoteroPrintParent.jsm"
|
||||
},
|
||||
child: {
|
||||
moduleURI: "chrome://zotero/content/actors/ZoteroPrintChild.jsm",
|
||||
events: {
|
||||
pageshow: {}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
|
26
chrome/content/zotero/actors/ZoteroPrintChild.jsm
Normal file
26
chrome/content/zotero/actors/ZoteroPrintChild.jsm
Normal file
|
@ -0,0 +1,26 @@
|
|||
var EXPORTED_SYMBOLS = ["ZoteroPrintChild"];
|
||||
|
||||
|
||||
class ZoteroPrintChild extends JSWindowActorChild {
|
||||
actorCreated() {
|
||||
Cu.exportFunction(
|
||||
() => new this.contentWindow.Promise(
|
||||
(resolve, reject) => this._sendZoteroPrint().then(resolve, reject)
|
||||
),
|
||||
this.contentWindow,
|
||||
{ defineAs: "zoteroPrint" }
|
||||
);
|
||||
}
|
||||
|
||||
async handleEvent(event) {
|
||||
switch (event.type) {
|
||||
case "pageshow": {
|
||||
// We just need this to trigger actor creation
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async _sendZoteroPrint() {
|
||||
await this.sendQuery("zoteroPrint");
|
||||
}
|
||||
}
|
51
chrome/content/zotero/actors/ZoteroPrintParent.jsm
Normal file
51
chrome/content/zotero/actors/ZoteroPrintParent.jsm
Normal file
|
@ -0,0 +1,51 @@
|
|||
var EXPORTED_SYMBOLS = ["ZoteroPrintParent"];
|
||||
|
||||
const { XPCOMUtils } = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
|
||||
XPCOMUtils.defineLazyModuleGetters(this, {
|
||||
Services: "resource://gre/modules/Services.jsm",
|
||||
});
|
||||
|
||||
ChromeUtils.defineESModuleGetters(this, {
|
||||
Zotero: "chrome://zotero/content/zotero.mjs",
|
||||
});
|
||||
|
||||
class ZoteroPrintParent extends JSWindowActorParent {
|
||||
async receiveMessage({ name, data }) {
|
||||
switch (name) {
|
||||
case "zoteroPrint": {
|
||||
await this.zoteroPrint(data || {});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A custom print function to work around Zotero 7 printing issues
|
||||
* @param {Object} [options]
|
||||
* @param {Object} [options.overrideSettings] PrintUtils.getPrintSettings() settings to override
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async zoteroPrint(options = {}) {
|
||||
let win = Zotero.getMainWindow();
|
||||
if (win) {
|
||||
let { PrintUtils } = win;
|
||||
let settings = PrintUtils.getPrintSettings("", false);
|
||||
Object.assign(settings, options.overrideSettings || {});
|
||||
let doPrint = await PrintUtils.handleSystemPrintDialog(
|
||||
this.browsingContext.topChromeWindow, false, settings
|
||||
);
|
||||
if (doPrint) {
|
||||
let printPromise = this.browsingContext.print(settings);
|
||||
// An ugly hack to close the browser window that has a static clone
|
||||
// of the content that is being printed. Without this, the window
|
||||
// will be open while transferring the content into system print queue,
|
||||
// which can take time for large PDF files
|
||||
let win = Services.wm.getMostRecentWindow("navigator:browser");
|
||||
if (win?.document?.getElementById('statuspanel')) {
|
||||
win.close();
|
||||
}
|
||||
await printPromise;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -162,29 +162,6 @@ class ReaderInstance {
|
|||
|
||||
await this._waitForReader();
|
||||
|
||||
// A custom print function to work around Zotero 7 printing issues
|
||||
this._iframeWindow.wrappedJSObject.zoteroPrint = async () => {
|
||||
let win = Zotero.getMainWindow();
|
||||
if (win) {
|
||||
let { PrintUtils } = win;
|
||||
let settings = PrintUtils.getPrintSettings("", false);
|
||||
let doPrint = await PrintUtils.handleSystemPrintDialog(
|
||||
this._iframeWindow.browsingContext.topChromeWindow, false, settings
|
||||
);
|
||||
if (doPrint) {
|
||||
this._iframeWindow.browsingContext.print(settings);
|
||||
// An ugly hack to close the browser window that has a static clone
|
||||
// of the content that is being printed. Without this, the window
|
||||
// will be open while transferring the content into system print queue,
|
||||
// which can take time for large PDF files
|
||||
let win = Services.wm.getMostRecentWindow("navigator:browser");
|
||||
if (win?.document?.getElementById('statuspanel')) {
|
||||
win.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
this._iframeWindow.addEventListener('customEvent', (event) => {
|
||||
let data = event.detail.wrappedJSObject;
|
||||
let append = data.append;
|
||||
|
|
Loading…
Reference in a new issue