فهرست منبع

fix ZIP support in the editor in Safari

Gildas 2 سال پیش
والد
کامیت
270d729d0d
4فایلهای تغییر یافته به همراه42 افزوده شده و 24 حذف شده
  1. 4 2
      src/core/bg/downloads.js
  2. 2 1
      src/core/common/download.js
  3. 19 7
      src/ui/bg/ui-editor.js
  4. 17 14
      src/ui/content/content-ui-editor-web.js

+ 4 - 2
src/core/bg/downloads.js

@@ -251,6 +251,8 @@ async function downloadCompressedContent(message, tab) {
 		if (message.openEditor) {
 			ui.onEdit(tabId);
 			await editor.open({ tabIndex: tab.index + 1, filename: message.filename, content: Array.from(new Uint8Array(await blob.arrayBuffer())), compressContent: true });
+		} else if (message.foregroundSave) {
+			await downloadPageForeground(message.taskId, message.filename, blob, tabId, message.foregroundSave);
 		} else {
 			try {
 				const prompt = filename => promptFilename(tabId, filename);
@@ -446,8 +448,8 @@ function saveToClipboard(pageData) {
 	}
 }
 
-async function downloadPageForeground(taskId, filename, content, tabId) {
-	const serializer = yabson.getSerializer({ filename, taskId, content: await content.arrayBuffer() });
+async function downloadPageForeground(taskId, filename, content, tabId, foregroundSave) {
+	const serializer = yabson.getSerializer({ filename, taskId, foregroundSave, content: await content.arrayBuffer() });
 	for await (const data of serializer) {
 		await browser.tabs.sendMessage(tabId, {
 			method: "content.download",

+ 2 - 1
src/core/common/download.js

@@ -72,7 +72,8 @@ async function downloadPage(pageData, options) {
 		insertCanonicalLink: options.insertCanonicalLink,
 		insertMetaNoIndex: options.insertMetaNoIndex,
 		password: options.password,
-		compressContent: options.compressContent
+		compressContent: options.compressContent,
+		foregroundSave: options.foregroundSave
 	};
 	if (options.compressContent) {
 		const blobURL = URL.createObjectURL(new Blob([await yabson.serialize(pageData)], { type: "application/octet-stream" }));

+ 19 - 7
src/ui/bg/ui-editor.js

@@ -270,7 +270,7 @@ addEventListener("message", event => {
 	if (message.method == "setContent") {
 		tabData.options.openEditor = false;
 		tabData.options.openSavedPage = false;
-		if (message.compressContent) {	
+		if (message.compressContent) {
 			tabData.options.compressContent = true;
 			if (tabData.selfExtractingArchive !== undefined) {
 				tabData.options.selfExtractingArchive = tabData.selfExtractingArchive;
@@ -289,7 +289,11 @@ addEventListener("message", event => {
 					pageData.viewport = message.viewport;
 					pageData.url = message.url;
 					pageData.filename = tabData.filename;
-					download.downloadPage(pageData, tabData.options);
+					if (message.foregroundSave) {
+						tabData.options.backgroundSave = false;
+						tabData.options.foregroundSave = true;
+					}
+					return download.downloadPage(pageData, tabData.options);
 				});
 		} else {
 			const pageData = {
@@ -395,11 +399,19 @@ async function downloadContent(message) {
 	const result = await downloadParser.next(message.data);
 	if (result.done) {
 		downloadParser = null;
-		const link = document.createElement("a");
-		link.download = result.value.filename;
-		link.href = URL.createObjectURL(new Blob([result.value.content]), "text/html");
-		link.dispatchEvent(new MouseEvent("click"));
-		URL.revokeObjectURL(link.href);
+		if (result.value.foregroundSave) {
+			editorElement.contentWindow.postMessage(JSON.stringify({
+				method: "download",
+				filename: result.value.filename,
+				content: Array.from(new Uint8Array(result.value.content))
+			}), "*");
+		} else {
+			const link = document.createElement("a");
+			link.download = result.value.filename;
+			link.href = URL.createObjectURL(new Blob([result.value.content]), "text/html");
+			link.dispatchEvent(new MouseEvent("click"));
+			URL.revokeObjectURL(link.href);
+		}
 		return browser.runtime.sendMessage({ method: "downloads.end", taskId: result.value.taskId }).then(() => ({}));
 	} else {
 		return Promise.resolve({});

+ 17 - 14
src/ui/content/content-ui-editor-web.js

@@ -1073,20 +1073,17 @@ pre code {
 				content = content.replace(/<script data-template-shadow-root src.*?<\/script>/g, initScriptContent);
 			}
 			if (pageCompressContent) {
-				if (message.foregroundSave) {
-					alert("Foreground save not supported for compressed content");
-				} else {
-					const viewport = document.head.querySelector("meta[name=viewport]");
-					window.parent.postMessage(JSON.stringify({
-						method: "setContent",
-						content,
-						title: document.title,
-						doctype: singlefile.helper.getDoctypeString(document),
-						url: pageUrl,
-						viewport: viewport ? viewport.content : null,
-						compressContent: true
-					}), "*");
-				}
+				const viewport = document.head.querySelector("meta[name=viewport]");
+				window.parent.postMessage(JSON.stringify({
+					method: "setContent",
+					content,
+					title: document.title,
+					doctype: singlefile.helper.getDoctypeString(document),
+					url: pageUrl,
+					viewport: viewport ? viewport.content : null,
+					compressContent: true,
+					foregroundSave: message.foregroundSave
+				}), "*");
 			} else {
 				if (message.foregroundSave) {
 					if (message.filename && message.filename.length) {
@@ -1110,6 +1107,12 @@ pre code {
 		if (message.method == "displayInfobar") {
 			singlefile.helper.displayIcon(document, true);
 		}
+		if (message.method == "download") {
+			const link = document.createElement("a");
+			link.download = message.filename;
+			link.href = URL.createObjectURL(new Blob([new Uint8Array(message.content)], { type: "text/html" }));
+			link.dispatchEvent(new MouseEvent("click"));
+		}
 	};
 	window.onresize = reflowNotes;
 	document.ondragover = event => event.preventDefault();