From 21f0ba5a03640ae0bfa3a6fbe42cdac8d4f557f2 Mon Sep 17 00:00:00 2001 From: Abe Jellinek Date: Mon, 5 Jan 2026 10:43:06 -0800 Subject: [PATCH] Reader: Support blob argument to onSaveImageAs() --- chrome/content/zotero/xpcom/reader.js | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/chrome/content/zotero/xpcom/reader.js b/chrome/content/zotero/xpcom/reader.js index 23a0e15d5e..531b19c695 100644 --- a/chrome/content/zotero/xpcom/reader.js +++ b/chrome/content/zotero/xpcom/reader.js @@ -477,7 +477,7 @@ class ReaderInstance { this.displayError(e); } }, - onSaveImageAs: async (dataURL) => { + onSaveImageAs: async (dataURLOrBlob) => { try { let fp = new FilePicker(); fp.init(this._iframeWindow, Zotero.getString('reader-save-image-as'), fp.modeSave); @@ -486,15 +486,22 @@ class ReaderInstance { let rv = await fp.show(); if (rv === fp.returnOK || rv === fp.returnReplace) { let outputPath = fp.file; - let parts = dataURL.split(','); - if (parts[0].includes('base64')) { - let bstr = atob(parts[1]); - let n = bstr.length; - let u8arr = new Uint8Array(n); - while (n--) { - u8arr[n] = bstr.charCodeAt(n); + if (typeof dataURLOrBlob === 'string') { + let parts = dataURLOrBlob.split(','); + if (parts[0].includes('base64')) { + let bstr = atob(parts[1]); + let n = bstr.length; + let u8arr = new Uint8Array(n); + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + await IOUtils.write(outputPath, u8arr); } - await OS.File.writeAtomic(outputPath, u8arr); + } + else { + let arrayBuffer = await dataURLOrBlob.arrayBuffer(); + let u8arr = new Uint8Array(arrayBuffer); + await IOUtils.write(outputPath, u8arr); } } }