Просмотр исходного кода

set a maximum of parallell requests to 32

Gildas 7 лет назад
Родитель
Сommit
05f386c55c
2 измененных файлов с 29 добавлено и 34 удалено
  1. 4 9
      extension/core/content/content.js
  2. 25 25
      lib/single-file/single-file-core.js

+ 4 - 9
extension/core/content/content.js

@@ -22,8 +22,6 @@
 
 this.singlefile.top = this.singlefile.top || (() => {
 
-	const PROGRESS_LOADED_COEFFICIENT = 2;
-
 	let processing = false;
 	browser.runtime.onMessage.addListener(async message => {
 		savePage(message);
@@ -125,7 +123,7 @@ this.singlefile.top = this.singlefile.top || (() => {
 		let selectionFound = false;
 		const ancestorElement = range.commonAncestorContainer != Node.ELEMENT_NODE ? range.commonAncestorContainer.parentElement : range.commonAncestorContainer;
 		ancestorElement.setAttribute(SELECTED_CONTENT_ROOT_ATTRIBUTE_NAME, "");
-		while (treeWalker.nextNode() && treeWalker.currentNode != range.endContainer) {			
+		while (treeWalker.nextNode() && treeWalker.currentNode != range.endContainer) {
 			if (treeWalker.currentNode == range.startContainer) {
 				selectionFound = true;
 			}
@@ -147,16 +145,13 @@ this.singlefile.top = this.singlefile.top || (() => {
 			options.framesData = await FrameTree.getFramesData();
 		}
 		options.jsEnabled = true;
-		let indexLoaded = 0, indexLoading = 0;
+		let indexLoaded = 0;
 		options.onprogress = event => {
-			if (event.type == event.RESOURCES_INITIALIZED || event.type == event.RESOURCE_LOADED || event.type == event.RESOURCE_LOADING) {
+			if (event.type == event.RESOURCES_INITIALIZED || event.type == event.RESOURCE_LOADED) {
 				if (event.type == event.RESOURCE_LOADED) {
 					indexLoaded = event.details.index;
 				}
-				if (event.type == event.RESOURCE_LOADING) {
-					indexLoading = event.details.index;
-				}
-				browser.runtime.sendMessage({ processProgress: true, index: (indexLoaded * PROGRESS_LOADED_COEFFICIENT) + indexLoading, maxIndex: event.details.max * (PROGRESS_LOADED_COEFFICIENT + 1) });
+				browser.runtime.sendMessage({ processProgress: true, index: indexLoaded, maxIndex: event.details.max });
 			} else if (event.type == event.PAGE_ENDED) {
 				browser.runtime.sendMessage({ processEnd: true });
 			}

+ 25 - 25
lib/single-file/single-file-core.js

@@ -56,13 +56,12 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 	const PAGE_LOADED = "page-loaded";
 	const RESOURCES_INITIALIZING = "resource-initializing";
 	const RESOURCES_INITIALIZED = "resources-initialized";
-	const RESOURCE_LOADING = "resource-loading";
 	const RESOURCE_LOADED = "resource-loaded";
 	const PAGE_ENDED = "page-ended";
 
 	class ProgressEvent {
 		constructor(type, details) {
-			return { type, details, PAGE_LOADING, PAGE_LOADED, RESOURCES_INITIALIZING, RESOURCES_INITIALIZED, RESOURCE_LOADING, RESOURCE_LOADED, PAGE_ENDED };
+			return { type, details, PAGE_LOADING, PAGE_LOADED, RESOURCES_INITIALIZING, RESOURCES_INITIALIZED, RESOURCE_LOADED, PAGE_ENDED };
 		}
 	}
 
@@ -132,10 +131,6 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 
 		async preparePageData() {
 			await this.processor.retrieveResources(
-				details => {
-					details.pageURL = this.options.url;
-					this.onprogress(new ProgressEvent(RESOURCE_LOADING, details));
-				},
 				details => {
 					details.pageURL = this.options.url;
 					this.onprogress(new ProgressEvent(RESOURCE_LOADED, details));
@@ -168,6 +163,7 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 	class BatchRequest {
 		constructor() {
 			this.requests = new Map();
+			this.MAX_REQUESTS = 32;
 		}
 
 		async addURL(resourceURL) {
@@ -185,25 +181,29 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 			return Array.from(this.requests.keys()).length;
 		}
 
-		async run(beforeListener, afterListener, options) {
+		async run(onloadListener, options) {
 			const resourceURLs = Array.from(this.requests.keys());
-			let indexResource = 1, indexAfterResource = 1;
-			return Promise.all(resourceURLs.map(async resourceURL => {
-				let error;
-				const resourceRequests = this.requests.get(resourceURL);
-				beforeListener({ index: indexResource, max: resourceURLs.length, url: resourceURL, error });
-				indexResource = indexResource + 1;
-				try {
-					const dataURI = await Download.getContent(resourceURL, { asDataURI: true, maxResourceSize: options.maxResourceSize, maxResourceSizeEnabled: options.maxResourceSizeEnabled });
-					resourceRequests.forEach(resourceRequest => resourceRequest.resolve(dataURI));
-				} catch (responseError) {
-					error = responseError;
-					resourceRequests.forEach(resourceRequest => resourceRequest.reject(error));
+			let indexResource = 0;
+			for (let requests = 0; requests < this.MAX_REQUESTS; requests++) {
+				await retrieveResourceContent(this.requests);
+			}
+
+			async function retrieveResourceContent(requests) {
+				const resourceURL = resourceURLs[indexResource];
+				if (resourceURL) {
+					const resourceRequests = requests.get(resourceURL);
+					indexResource = indexResource + 1;
+					try {
+						const dataURI = await Download.getContent(resourceURL, { asDataURI: true, maxResourceSize: options.maxResourceSize, maxResourceSizeEnabled: options.maxResourceSizeEnabled });
+						resourceRequests.forEach(resourceRequest => resourceRequest.resolve(dataURI));
+					} catch (error) {
+						resourceRequests.forEach(resourceRequest => resourceRequest.reject(error));
+					}
+					requests.delete(resourceURL);
+					onloadListener({ index: indexResource + 1, max: resourceURLs.length, url: resourceURL });
+					await retrieveResourceContent(requests);
 				}
-				afterListener({ index: indexAfterResource, max: resourceURLs.length, url: resourceURL, error });
-				indexAfterResource = indexAfterResource + 1;
-				this.requests.delete(resourceURL);
-			}));
+			}
 		}
 	}
 
@@ -243,8 +243,8 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 			await this.loadPage();
 		}
 
-		async retrieveResources(beforeListener, afterListener) {
-			await batchRequest.run(beforeListener, afterListener, this.options);
+		async retrieveResources(onloadListener) {
+			await batchRequest.run(onloadListener, this.options);
 		}
 
 		getPageData() {