Pārlūkot izejas kodu

improve perf in Firefox (see #1492)

Gildas 1 gadu atpakaļ
vecāks
revīzija
6b6459db01
3 mainītis faili ar 15 papildinājumiem un 18 dzēšanām
  1. 7 7
      src/core/bg/downloads.js
  2. 4 7
      src/core/common/download.js
  3. 4 4
      src/lib/yabson/yabson.js

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

@@ -130,17 +130,17 @@ async function downloadTabPage(message, tab) {
 			return { error: true };
 		}
 	} else if (message.compressContent) {
-		let blobParts = tabData.get(tabId);
-		const type = message.mimeType;
-		if (!blobParts) {
-			blobParts = [];
-			tabData.set(tabId, blobParts);
+		let parser = tabData.get(tabId);
+		if (!parser) {
+			parser = yabson.getParser();
+			tabData.set(tabId, parser);
 		}
 		if (message.data) {
-			blobParts.push(new Uint8Array(message.data));
+			await parser.next(new Uint8Array(message.data));
 		} else {
 			tabData.delete(tabId);
-			const message = await yabson.parse(new Uint8Array((await new Blob(blobParts, { type }).arrayBuffer())));
+			const result = await parser.next();
+			const message = result.value;
 			await downloadCompressedContent(message, tab);
 		}
 	} else {

+ 4 - 7
src/core/common/download.js

@@ -118,17 +118,14 @@ async function downloadPage(pageData, options) {
 			message.embeddedImage = embeddedImage;
 			message.blobURL = null;
 			message.pageData = pageData;
-			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;
+			const serializer = yabson.getSerializer(message);
+			for await (const chunk of serializer) {
 				await browser.runtime.sendMessage({
 					method: "downloads.download",
 					compressContent: true,
-					data
+					data: Array.from(chunk)
 				});
-			} while (data.length);
+			}
 			await browser.runtime.sendMessage({
 				method: "downloads.download",
 				compressContent: true,

+ 4 - 4
src/lib/yabson/yabson.js

@@ -218,10 +218,10 @@ class WriteStream {
 	async append(array) {
 		if (this.offset + array.length > this.value.length) {
 			const offset = this.value.length - this.offset;
-			await this.append(array.subarray(0, offset));
+			await this.append(new Uint8Array(array).subarray(0, offset));
 			await this.appendData({ value: this.value });
 			this.offset = 0;
-			await this.append(array.subarray(offset));
+			await this.append(new Uint8Array(array).subarray(offset));
 		} else {
 			this.value.set(array, this.offset);
 			this.offset += array.length;
@@ -230,7 +230,7 @@ class WriteStream {
 
 	async flush() {
 		if (this.offset) {
-			await this.appendData({ value: this.value.subarray(0, this.offset), done: true });
+			await this.appendData({ value: new Uint8Array(this.value).subarray(0, this.offset), done: true });
 		}
 	}
 }
@@ -503,7 +503,7 @@ class ReadStream {
 
 	async consume(size) {
 		if (this.offset + size > this.value.length) {
-			const pending = this.value.subarray(this.offset, this.value.length);
+			const pending = new Uint8Array(this.value).subarray(this.offset, this.value.length);
 			const value = await this.consumeData();
 			if (pending.length + value.length != this.value.length) {
 				this.value = new Uint8Array(pending.length + value.length);