Explorar el Código

improve performance (fix #1282)

Gildas hace 2 años
padre
commit
9f089212dd
Se han modificado 2 ficheros con 20 adiciones y 15 borrados
  1. 10 9
      src/core/bg/downloads.js
  2. 10 6
      src/core/common/download.js

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

@@ -38,7 +38,7 @@ import { download } from "./download-util.js";
 import * as yabson from "./../../lib/yabson/yabson.js";
 
 const partialContents = new Map();
-const parsers = new Map();
+const tabData = new Map();
 const MIMETYPE_HTML = "text/html";
 const GDRIVE_CLIENT_ID = "207618107333-7tjs1im1pighftpoepea2kvkubnfjj44.apps.googleusercontent.com";
 const GDRIVE_CLIENT_KEY = "VQJ8Gq8Vxx72QyxPyeLtWvUt";
@@ -112,15 +112,16 @@ async function downloadTabPage(message, tab) {
 			return { error: true };
 		}
 	} else if (message.compressContent) {
-		let parser = parsers.get(tabId);
-		if (!parser) {
-			parser = yabson.getParser();
-			parsers.set(tabId, parser);
+		let blobParts = tabData.get(tabId);
+		if (!blobParts) {
+			blobParts = [];
+			tabData.set(tabId, blobParts);
 		}
-		let result = await parser.next(message.data);
-		if (result.done) {
-			const message = result.value;
-			parsers.delete(tabId);
+		if (message.data) {
+			blobParts.push(new Uint8Array(message.data));
+		} else {
+			tabData.delete(tabId);
+			const message = await yabson.parse(new Uint8Array((await new Blob(blobParts).arrayBuffer())));
 			await downloadCompressedContent(message, tab);
 		}
 	} else {

+ 10 - 6
src/core/common/download.js

@@ -25,7 +25,7 @@
 
 import * as yabson from "./../../lib/yabson/yabson.js";
 
-const MAX_CONTENT_SIZE = 32 * (1024 * 1024);
+const MAX_CONTENT_SIZE = 16 * (1024 * 1024);
 
 export {
 	downloadPage
@@ -76,21 +76,25 @@ async function downloadPage(pageData, options) {
 		foregroundSave: options.foregroundSave
 	};
 	if (options.compressContent) {
-		const blobURL = URL.createObjectURL(new Blob([await yabson.serialize(pageData)], { type: "application/octet-stream" }));
+		const blob = new Blob([await yabson.serialize(pageData)], { type: "application/octet-stream" });
+		const blobURL = URL.createObjectURL(blob);
 		message.blobURL = blobURL;
 		const result = await browser.runtime.sendMessage(message);
 		URL.revokeObjectURL(blobURL);
 		if (result.error) {
 			message.blobURL = null;
 			message.pageData = pageData;
-			const serializer = yabson.getSerializer(message);
-			for await (const data of serializer) {
+			let data, indexData = 0;
+			const dataArray = await yabson.serialize(message);
+			do {
+				data = Array.from(dataArray.slice(indexData, indexData + MAX_CONTENT_SIZE));
+				indexData += MAX_CONTENT_SIZE;
 				await browser.runtime.sendMessage({
 					method: "downloads.download",
 					compressContent: true,
-					data: Array.from(data)
+					data
 				});
-			}
+			} while (data.length);
 			await browser.runtime.sendMessage({
 				method: "downloads.download",
 				compressContent: true