Jelajahi Sumber

use blob URIs when supported

Gildas 2 tahun lalu
induk
melakukan
0f8ea0ebe1
2 mengubah file dengan 53 tambahan dan 39 penghapusan
  1. 7 0
      src/core/bg/downloads.js
  2. 46 39
      src/core/common/download.js

+ 7 - 0
src/core/bg/downloads.js

@@ -94,6 +94,13 @@ async function onMessage(message, sender) {
 
 async function downloadTabPage(message, tab) {
 	let contents;
+	if (message.blobURL) {
+		try {
+			message.content = await (await fetch(message.blobURL)).text();
+		} catch (error) {
+			return { error: true };
+		}
+	}
 	if (message.truncated) {
 		contents = partialContents.get(tab.id);
 		if (!contents) {

+ 46 - 39
src/core/common/download.js

@@ -34,46 +34,53 @@ async function downloadPage(pageData, options) {
 		pageData.content = "\ufeff" + pageData.content;
 	}
 	if (options.backgroundSave || options.openEditor || options.saveToGDrive || options.saveToGitHub || options.saveWithCompanion || options.saveWithWebDAV) {
-		for (let blockIndex = 0; blockIndex * MAX_CONTENT_SIZE < pageData.content.length; blockIndex++) {
-			const message = {
-				method: "downloads.download",
-				taskId: options.taskId,
-				confirmFilename: options.confirmFilename,
-				filenameConflictAction: options.filenameConflictAction,
-				filename: pageData.filename,
-				saveToClipboard: options.saveToClipboard,
-				saveToGDrive: options.saveToGDrive,
-				saveWithWebDAV: options.saveWithWebDAV,
-				webDAVURL: options.webDAVURL,
-				webDAVUser: options.webDAVUser,
-				webDAVPassword: options.webDAVPassword,
-				saveToGitHub: options.saveToGitHub,
-				githubToken: options.githubToken,
-				githubUser: options.githubUser,
-				githubRepository: options.githubRepository,
-				githubBranch: options.githubBranch,
-				saveWithCompanion: options.saveWithCompanion,
-				forceWebAuthFlow: options.forceWebAuthFlow,
-				filenameReplacementCharacter: options.filenameReplacementCharacter,
-				openEditor: options.openEditor,
-				openSavedPage: options.openSavedPage,
-				compressHTML: options.compressHTML,
-				backgroundSave: options.backgroundSave,
-				bookmarkId: options.bookmarkId,
-				replaceBookmarkURL: options.replaceBookmarkURL,
-				applySystemTheme: options.applySystemTheme,
-				defaultEditorMode: options.defaultEditorMode,
-				includeInfobar: options.includeInfobar,
-				warnUnsavedPage: options.warnUnsavedPage
-			};
-			message.truncated = pageData.content.length > MAX_CONTENT_SIZE;
-			if (message.truncated) {
-				message.finished = (blockIndex + 1) * MAX_CONTENT_SIZE > pageData.content.length;
-				message.content = pageData.content.substring(blockIndex * MAX_CONTENT_SIZE, (blockIndex + 1) * MAX_CONTENT_SIZE);
-			} else {
-				message.content = pageData.content;
+		const blobURL = URL.createObjectURL(new Blob([pageData.content], { type: "text/html" }));
+		const message = {
+			method: "downloads.download",
+			taskId: options.taskId,
+			confirmFilename: options.confirmFilename,
+			filenameConflictAction: options.filenameConflictAction,
+			filename: pageData.filename,
+			saveToClipboard: options.saveToClipboard,
+			saveToGDrive: options.saveToGDrive,
+			saveWithWebDAV: options.saveWithWebDAV,
+			webDAVURL: options.webDAVURL,
+			webDAVUser: options.webDAVUser,
+			webDAVPassword: options.webDAVPassword,
+			saveToGitHub: options.saveToGitHub,
+			githubToken: options.githubToken,
+			githubUser: options.githubUser,
+			githubRepository: options.githubRepository,
+			githubBranch: options.githubBranch,
+			saveWithCompanion: options.saveWithCompanion,
+			forceWebAuthFlow: options.forceWebAuthFlow,
+			filenameReplacementCharacter: options.filenameReplacementCharacter,
+			openEditor: options.openEditor,
+			openSavedPage: options.openSavedPage,
+			compressHTML: options.compressHTML,
+			backgroundSave: options.backgroundSave,
+			bookmarkId: options.bookmarkId,
+			replaceBookmarkURL: options.replaceBookmarkURL,
+			applySystemTheme: options.applySystemTheme,
+			defaultEditorMode: options.defaultEditorMode,
+			includeInfobar: options.includeInfobar,
+			warnUnsavedPage: options.warnUnsavedPage,
+			blobURL
+		};
+		const result = await browser.runtime.sendMessage(message);
+		URL.revokeObjectURL(blobURL);
+		if (result.error) {
+			message.blobURL = null;
+			for (let blockIndex = 0; blockIndex * MAX_CONTENT_SIZE < pageData.content.length; blockIndex++) {
+				message.truncated = pageData.content.length > MAX_CONTENT_SIZE;
+				if (message.truncated) {
+					message.finished = (blockIndex + 1) * MAX_CONTENT_SIZE > pageData.content.length;
+					message.content = pageData.content.substring(blockIndex * MAX_CONTENT_SIZE, (blockIndex + 1) * MAX_CONTENT_SIZE);
+				} else {
+					message.content = pageData.content;
+				}
+				await browser.runtime.sendMessage(message);
 			}
-			await browser.runtime.sendMessage(message);
 		}
 	} else {
 		if (options.saveToClipboard) {