Browse Source

fix mime type

Gildas 2 years ago
parent
commit
0579e71a9d

+ 5 - 5
src/core/bg/autosave.js

@@ -169,13 +169,13 @@ async function saveContent(message, tab) {
 					options.filenameConflictAction = testSkip.filenameConflictAction;
 					options.filenameConflictAction = testSkip.filenameConflictAction;
 				}
 				}
 				if (!skipped) {
 				if (!skipped) {
-					let { content } = pageData;
+					let { content, mimeType: type } = pageData;
 					if (options.compressContent) {
 					if (options.compressContent) {
-						content = new Blob([new Uint8Array(content)], { type: "text/html" });
+						content = new Blob([new Uint8Array(content)], { type });
 					}
 					}
 					if (options.saveToGDrive) {
 					if (options.saveToGDrive) {
 						if (!(content instanceof Blob)) {
 						if (!(content instanceof Blob)) {
-							content = new Blob([content], { type: "text/html" });
+							content = new Blob([content], { type });
 						}
 						}
 						await downloads.saveToGDrive(message.taskId, downloads.encodeSharpCharacter(pageData.filename), content, options, {
 						await downloads.saveToGDrive(message.taskId, downloads.encodeSharpCharacter(pageData.filename), content, options, {
 							forceWebAuthFlow: options.forceWebAuthFlow
 							forceWebAuthFlow: options.forceWebAuthFlow
@@ -184,7 +184,7 @@ async function saveContent(message, tab) {
 						});
 						});
 					} if (options.saveToDropbox) {
 					} if (options.saveToDropbox) {
 						if (!(content instanceof Blob)) {
 						if (!(content instanceof Blob)) {
-							content = new Blob([content], { type: "text/html" });
+							content = new Blob([content], { type });
 						}
 						}
 						await downloads.saveToDropbox(message.taskId, downloads.encodeSharpCharacter(pageData.filename), content, {
 						await downloads.saveToDropbox(message.taskId, downloads.encodeSharpCharacter(pageData.filename), content, {
 							filenameConflictAction: options.filenameConflictAction
 							filenameConflictAction: options.filenameConflictAction
@@ -205,7 +205,7 @@ async function saveContent(message, tab) {
 						});
 						});
 					} else {
 					} else {
 						if (!(content instanceof Blob)) {
 						if (!(content instanceof Blob)) {
-							content = new Blob([content], { type: "text/html" });
+							content = new Blob([content], { type });
 						}
 						}
 						pageData.url = URL.createObjectURL(content);
 						pageData.url = URL.createObjectURL(content);
 						await downloads.downloadPage(pageData, options);
 						await downloads.downloadPage(pageData, options);

+ 17 - 10
src/core/bg/downloads.js

@@ -40,7 +40,6 @@ import * as yabson from "./../../lib/yabson/yabson.js";
 
 
 const partialContents = new Map();
 const partialContents = new Map();
 const tabData = new Map();
 const tabData = new Map();
-const MIMETYPE_HTML = "text/html";
 const SCOPES = ["https://www.googleapis.com/auth/drive.file"];
 const SCOPES = ["https://www.googleapis.com/auth/drive.file"];
 const CONFLICT_ACTION_SKIP = "skip";
 const CONFLICT_ACTION_SKIP = "skip";
 const CONFLICT_ACTION_UNIQUIFY = "uniquify";
 const CONFLICT_ACTION_UNIQUIFY = "uniquify";
@@ -130,6 +129,7 @@ async function downloadTabPage(message, tab) {
 		}
 		}
 	} else if (message.compressContent) {
 	} else if (message.compressContent) {
 		let blobParts = tabData.get(tabId);
 		let blobParts = tabData.get(tabId);
+		const type = message.mimeType;
 		if (!blobParts) {
 		if (!blobParts) {
 			blobParts = [];
 			blobParts = [];
 			tabData.set(tabId, blobParts);
 			tabData.set(tabId, blobParts);
@@ -138,7 +138,7 @@ async function downloadTabPage(message, tab) {
 			blobParts.push(new Uint8Array(message.data));
 			blobParts.push(new Uint8Array(message.data));
 		} else {
 		} else {
 			tabData.delete(tabId);
 			tabData.delete(tabId);
-			const message = await yabson.parse(new Uint8Array((await new Blob(blobParts).arrayBuffer())));
+			const message = await yabson.parse(new Uint8Array((await new Blob(blobParts, { type }).arrayBuffer())));
 			await downloadCompressedContent(message, tab);
 			await downloadCompressedContent(message, tab);
 		}
 		}
 	} else {
 	} else {
@@ -185,7 +185,7 @@ async function downloadContent(contents, tab, incognito, message) {
 			} else if (message.saveWithWebDAV) {
 			} else if (message.saveWithWebDAV) {
 				response = await saveWithWebDAV(message.taskId, encodeSharpCharacter(message.filename), contents.join(""), message.webDAVURL, message.webDAVUser, message.webDAVPassword, { filenameConflictAction: message.filenameConflictAction, prompt });
 				response = await saveWithWebDAV(message.taskId, encodeSharpCharacter(message.filename), contents.join(""), message.webDAVURL, message.webDAVUser, message.webDAVPassword, { filenameConflictAction: message.filenameConflictAction, prompt });
 			} else if (message.saveToGDrive) {
 			} else if (message.saveToGDrive) {
-				await saveToGDrive(message.taskId, encodeSharpCharacter(message.filename), new Blob(contents, { type: MIMETYPE_HTML }), {
+				await saveToGDrive(message.taskId, encodeSharpCharacter(message.filename), new Blob(contents, { type: message.mimeType }), {
 					forceWebAuthFlow: message.forceWebAuthFlow
 					forceWebAuthFlow: message.forceWebAuthFlow
 				}, {
 				}, {
 					onProgress: (offset, size) => ui.onUploadProgress(tabId, offset, size),
 					onProgress: (offset, size) => ui.onUploadProgress(tabId, offset, size),
@@ -193,7 +193,7 @@ async function downloadContent(contents, tab, incognito, message) {
 					prompt
 					prompt
 				});
 				});
 			} else if (message.saveToDropbox) {
 			} else if (message.saveToDropbox) {
-				await saveToDropbox(message.taskId, encodeSharpCharacter(message.filename), new Blob(contents, { type: MIMETYPE_HTML }), {
+				await saveToDropbox(message.taskId, encodeSharpCharacter(message.filename), new Blob(contents, { type: message.mimeType }), {
 					onProgress: (offset, size) => ui.onUploadProgress(tabId, offset, size),
 					onProgress: (offset, size) => ui.onUploadProgress(tabId, offset, size),
 					filenameConflictAction: message.filenameConflictAction,
 					filenameConflictAction: message.filenameConflictAction,
 					prompt
 					prompt
@@ -211,7 +211,7 @@ async function downloadContent(contents, tab, incognito, message) {
 					filenameConflictAction: message.filenameConflictAction
 					filenameConflictAction: message.filenameConflictAction
 				});
 				});
 			} else {
 			} else {
-				message.url = URL.createObjectURL(new Blob(contents, { type: MIMETYPE_HTML }));
+				message.url = URL.createObjectURL(new Blob(contents, { type: message.mimeType }));
 				response = await downloadPage(message, {
 				response = await downloadPage(message, {
 					confirmFilename: message.confirmFilename,
 					confirmFilename: message.confirmFilename,
 					incognito,
 					incognito,
@@ -227,7 +227,7 @@ async function downloadContent(contents, tab, incognito, message) {
 			}
 			}
 			ui.onEnd(tabId);
 			ui.onEnd(tabId);
 			if (message.openSavedPage && !message.openEditor) {
 			if (message.openSavedPage && !message.openEditor) {
-				const createTabProperties = { active: true, url: "/src/ui/pages/viewer.html?blobURI=" + URL.createObjectURL(new Blob(contents, { type: MIMETYPE_HTML })), windowId: tab.windowId };
+				const createTabProperties = { active: true, url: "/src/ui/pages/viewer.html?blobURI=" + URL.createObjectURL(new Blob(contents, { type: message.mimeType })), windowId: tab.windowId };
 				if (tab.index != null) {
 				if (tab.index != null) {
 					createTabProperties.index = tab.index + 1;
 					createTabProperties.index = tab.index + 1;
 				}
 				}
@@ -289,7 +289,7 @@ async function downloadCompressedContent(message, tab) {
 					embeddedImage: message.embeddedImage
 					embeddedImage: message.embeddedImage
 				});
 				});
 			} else if (message.foregroundSave || !message.backgroundSave || message.sharePage) {
 			} else if (message.foregroundSave || !message.backgroundSave || message.sharePage) {
-				const response = await downloadPageForeground(message.taskId, message.filename, blob, tabId, {
+				const response = await downloadPageForeground(message.taskId, message.filename, blob, pageData.mimeType, tabId, {
 					foregroundSave: true,
 					foregroundSave: true,
 					sharePage: message.sharePage
 					sharePage: message.sharePage
 				});
 				});
@@ -540,14 +540,21 @@ function saveToClipboard(pageData) {
 	document.removeEventListener(command, listener);
 	document.removeEventListener(command, listener);
 
 
 	function listener(event) {
 	function listener(event) {
-		event.clipboardData.setData(MIMETYPE_HTML, pageData.content);
+		event.clipboardData.setData(pageData.mimeType, pageData.content);
 		event.clipboardData.setData("text/plain", pageData.content);
 		event.clipboardData.setData("text/plain", pageData.content);
 		event.preventDefault();
 		event.preventDefault();
 	}
 	}
 }
 }
 
 
-async function downloadPageForeground(taskId, filename, content, tabId, { foregroundSave, sharePage }) {
-	const serializer = yabson.getSerializer({ filename, taskId, foregroundSave, sharePage, content: await content.arrayBuffer() });
+async function downloadPageForeground(taskId, filename, content, mimeType, tabId, { foregroundSave, sharePage }) {
+	const serializer = yabson.getSerializer({
+		filename,
+		taskId,
+		foregroundSave,
+		sharePage,
+		content: await content.arrayBuffer(),
+		mimeType
+	});
 	for await (const data of serializer) {
 	for await (const data of serializer) {
 		await browser.tabs.sendMessage(tabId, {
 		await browser.tabs.sendMessage(tabId, {
 			method: "content.download",
 			method: "content.download",

+ 11 - 9
src/core/common/download.js

@@ -64,6 +64,7 @@ async function downloadPage(pageData, options) {
 		confirmFilename: options.confirmFilename,
 		confirmFilename: options.confirmFilename,
 		filenameConflictAction: options.filenameConflictAction,
 		filenameConflictAction: options.filenameConflictAction,
 		filename: pageData.filename,
 		filename: pageData.filename,
+		mimeType: pageData.mimeType,
 		saveToClipboard: options.saveToClipboard,
 		saveToClipboard: options.saveToClipboard,
 		saveToGDrive: options.saveToGDrive,
 		saveToGDrive: options.saveToGDrive,
 		saveToDropbox: options.saveToDropbox,
 		saveToDropbox: options.saveToDropbox,
@@ -103,7 +104,7 @@ async function downloadPage(pageData, options) {
 		sharePage: options.sharePage
 		sharePage: options.sharePage
 	};
 	};
 	if (options.compressContent) {
 	if (options.compressContent) {
-		const blob = new Blob([await yabson.serialize(pageData)], { type: "application/octet-stream" });
+		const blob = new Blob([await yabson.serialize(pageData)], { type: pageData.mimeType });
 		const blobURL = URL.createObjectURL(blob);
 		const blobURL = URL.createObjectURL(blob);
 		message.blobURL = blobURL;
 		message.blobURL = blobURL;
 		const result = await browser.runtime.sendMessage(message);
 		const result = await browser.runtime.sendMessage(message);
@@ -125,7 +126,8 @@ async function downloadPage(pageData, options) {
 			} while (data.length);
 			} while (data.length);
 			await browser.runtime.sendMessage({
 			await browser.runtime.sendMessage({
 				method: "downloads.download",
 				method: "downloads.download",
-				compressContent: true
+				compressContent: true,
+				mimeType: pageData.mimeType
 			});
 			});
 		}
 		}
 		if (options.backgroundSave) {
 		if (options.backgroundSave) {
@@ -133,7 +135,7 @@ async function downloadPage(pageData, options) {
 		}
 		}
 	} else {
 	} else {
 		if ((options.backgroundSave && !options.sharePage) || options.openEditor || options.saveToGDrive || options.saveToGitHub || options.saveWithCompanion || options.saveWithWebDAV || options.saveToDropbox) {
 		if ((options.backgroundSave && !options.sharePage) || options.openEditor || options.saveToGDrive || options.saveToGitHub || options.saveWithCompanion || options.saveWithWebDAV || options.saveToDropbox) {
-			const blobURL = URL.createObjectURL(new Blob([pageData.content], { type: "text/html" }));
+			const blobURL = URL.createObjectURL(new Blob([pageData.content], { type: pageData.mimeType }));
 			message.blobURL = blobURL;
 			message.blobURL = blobURL;
 			const result = await browser.runtime.sendMessage(message);
 			const result = await browser.runtime.sendMessage(message);
 			URL.revokeObjectURL(blobURL);
 			URL.revokeObjectURL(blobURL);
@@ -157,7 +159,7 @@ async function downloadPage(pageData, options) {
 				await downloadPageForeground(pageData, options);
 				await downloadPageForeground(pageData, options);
 			}
 			}
 			if (options.openSavedPage) {
 			if (options.openSavedPage) {
-				open(URL.createObjectURL(new Blob([pageData.content], { type: "text/html" })));
+				open(URL.createObjectURL(new Blob([pageData.content], { type: pageData.mimeType })));
 			}
 			}
 			browser.runtime.sendMessage({ method: "ui.processEnd" });
 			browser.runtime.sendMessage({ method: "ui.processEnd" });
 		}
 		}
@@ -172,7 +174,7 @@ async function downloadPageForeground(pageData, options) {
 		if (pageData.filename && pageData.filename.length) {
 		if (pageData.filename && pageData.filename.length) {
 			const link = document.createElement("a");
 			const link = document.createElement("a");
 			link.download = pageData.filename;
 			link.download = pageData.filename;
-			link.href = URL.createObjectURL(new Blob([pageData.content], { type: "text/html" }));
+			link.href = URL.createObjectURL(new Blob([pageData.content], { type: pageData.mimeType }));
 			link.dispatchEvent(new MouseEvent("click"));
 			link.dispatchEvent(new MouseEvent("click"));
 			return new Promise(resolve => setTimeout(() => { URL.revokeObjectURL(link.href); resolve(); }, 1000));
 			return new Promise(resolve => setTimeout(() => { URL.revokeObjectURL(link.href); resolve(); }, 1000));
 		}
 		}
@@ -184,7 +186,7 @@ async function sharePage(pageData, options) {
 	debugger;
 	debugger;
 	const cancelled = await sharePageBar.display(options.selected);
 	const cancelled = await sharePageBar.display(options.selected);
 	if (!cancelled) {
 	if (!cancelled) {
-		const data = { files: [new File([pageData.content], pageData.filename, { type: "text/html" })] };
+		const data = { files: [new File([pageData.content], pageData.filename, { type: pageData.mimeType })] };
 		try {
 		try {
 			await navigator.share(data);
 			await navigator.share(data);
 			sharePageBar.hide();
 			sharePageBar.hide();
@@ -199,15 +201,15 @@ async function sharePage(pageData, options) {
 	}
 	}
 }
 }
 
 
-function saveToClipboard(page) {
+function saveToClipboard(pageData) {
 	const command = "copy";
 	const command = "copy";
 	document.addEventListener(command, listener);
 	document.addEventListener(command, listener);
 	document.execCommand(command);
 	document.execCommand(command);
 	document.removeEventListener(command, listener);
 	document.removeEventListener(command, listener);
 
 
 	function listener(event) {
 	function listener(event) {
-		event.clipboardData.setData("text/html", page.content);
-		event.clipboardData.setData("text/plain", page.content);
+		event.clipboardData.setData(pageData.mimeType, pageData.content);
+		event.clipboardData.setData("text/plain", pageData.content);
 		event.preventDefault();
 		event.preventDefault();
 	}
 	}
 }
 }

+ 5 - 2
src/ui/bg/ui-editor.js

@@ -304,6 +304,7 @@ addEventListener("message", event => {
 					pageData.viewport = message.viewport;
 					pageData.viewport = message.viewport;
 					pageData.url = message.url;
 					pageData.url = message.url;
 					pageData.filename = message.filename || tabData.filename;
 					pageData.filename = message.filename || tabData.filename;
+					pageData.mimeType = "text/html";
 					if (message.foregroundSave) {
 					if (message.foregroundSave) {
 						tabData.options.backgroundSave = false;
 						tabData.options.backgroundSave = false;
 						tabData.options.foregroundSave = true;
 						tabData.options.foregroundSave = true;
@@ -313,7 +314,8 @@ addEventListener("message", event => {
 		} else {
 		} else {
 			const pageData = {
 			const pageData = {
 				content: message.content,
 				content: message.content,
-				filename: message.filename || tabData.filename
+				filename: message.filename || tabData.filename,
+				mimeType: "text/html"
 			};
 			};
 			tabData.options.compressContent = false;
 			tabData.options.compressContent = false;
 			download.downloadPage(pageData, tabData.options);
 			download.downloadPage(pageData, tabData.options);
@@ -430,12 +432,13 @@ async function downloadContent(message) {
 				method: "download",
 				method: "download",
 				filename: result.value.filename,
 				filename: result.value.filename,
 				content: Array.from(new Uint8Array(result.value.content)),
 				content: Array.from(new Uint8Array(result.value.content)),
+				mimeType: result.value.mimeType,
 				sharePage: result.value.sharePage
 				sharePage: result.value.sharePage
 			}), "*");
 			}), "*");
 		} else {
 		} else {
 			const link = document.createElement("a");
 			const link = document.createElement("a");
 			link.download = result.value.filename;
 			link.download = result.value.filename;
-			link.href = URL.createObjectURL(new Blob([result.value.content]), "text/html");
+			link.href = URL.createObjectURL(new Blob([result.value.content], { type: result.value.mimeType }));
 			link.dispatchEvent(new MouseEvent("click"));
 			link.dispatchEvent(new MouseEvent("click"));
 			URL.revokeObjectURL(link.href);
 			URL.revokeObjectURL(link.href);
 		}
 		}

+ 11 - 2
src/ui/content/content-ui-editor-web.js

@@ -1109,7 +1109,11 @@ pre code {
 				} else {
 				} else {
 					if (message.foregroundSave || message.sharePage) {
 					if (message.foregroundSave || message.sharePage) {
 						try {
 						try {
-							await downloadPageForeground({ content, filename: filename || message.filename }, { sharePage: message.sharePage });
+							await downloadPageForeground({
+								content,
+								filename: filename || message.filename,
+								mimeType: "text/html"
+							}, { sharePage: message.sharePage });
 						} catch (error) {
 						} catch (error) {
 							console.log(error); // eslint-disable-line no-console
 							console.log(error); // eslint-disable-line no-console
 							window.parent.postMessage(JSON.stringify({ method: "onError", error: error.message }), "*");
 							window.parent.postMessage(JSON.stringify({ method: "onError", error: error.message }), "*");
@@ -1138,8 +1142,13 @@ pre code {
 				}), "*");
 				}), "*");
 			}
 			}
 			if (message.method == "download") {
 			if (message.method == "download") {
+				debugger;
 				try {
 				try {
-					await downloadPageForeground({ content: message.content, filename: message.filename }, { sharePage: message.sharePage });
+					await downloadPageForeground({
+						content: message.content,
+						filename: message.filename,
+						mimeType: message.mimeType
+					}, { sharePage: message.sharePage });
 				} catch (error) {
 				} catch (error) {
 					console.log(error); // eslint-disable-line no-console
 					console.log(error); // eslint-disable-line no-console
 					window.parent.postMessage(JSON.stringify({ method: "onError", error: error.message }), "*");
 					window.parent.postMessage(JSON.stringify({ method: "onError", error: error.message }), "*");