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

fixed implementation of pending saves on Firefox

Former-commit-id: 85738418f48dfbda82fe1740888ed91ddf598a94
Gildas 6 лет назад
Родитель
Сommit
d4c3ecc21a

+ 7 - 5
extension/core/bg/autosave.js

@@ -118,11 +118,12 @@ singlefile.extension.core.bg.autosave = (() => {
 		options.incognito = tab.incognito;
 		options.tabId = tabId;
 		options.tabIndex = tab.index;
-		const pageData = await singlefile.extension.getPageData(options, null, null);
-		if (options.includeInfobar) {
-			await singlefile.common.ui.content.infobar.includeScript(pageData);
-		}
+		let pageData;
 		try {
+			pageData = await singlefile.extension.getPageData(options, null, null);
+			if (options.includeInfobar) {
+				await singlefile.common.ui.content.infobar.includeScript(pageData);
+			}
 			const blob = new Blob([pageData.content], { type: "text/html" });
 			if (options.saveToGDrive) {
 				await singlefile.extension.core.bg.downloads.uploadPage(tab.id, pageData.filename, blob, options, {});
@@ -131,7 +132,8 @@ singlefile.extension.core.bg.autosave = (() => {
 				await singlefile.extension.core.bg.downloads.downloadPage(pageData, options);
 			}
 		} finally {
-			if (pageData.url) {
+			singlefile.extension.core.bg.business.onSaveEnd(tab.id);
+			if (pageData && pageData.url) {
 				URL.revokeObjectURL(pageData.url);
 			}
 		}

+ 32 - 18
extension/core/bg/business.js

@@ -54,10 +54,25 @@ singlefile.extension.core.bg.business = (() => {
 		getTabsInfo: () => ({ pending: Array.from(pendingSaves).map(mapSaveInfo), processing: Array.from(currentSaves).map(mapSaveInfo) }),
 		getTabInfo: tabId => currentSaves.get(tabId) || pendingSaves.get(tabId),
 		setCancelCallback: (tabId, cancelCallback) => {
-			const tabInfo = currentSaves.get(tabId);
-			if (tabInfo) {
-				tabInfo.cancel = cancelCallback;
+			const saveInfo = currentSaves.get(tabId);
+			if (saveInfo) {
+				saveInfo.cancel = cancelCallback;
 			}
+		},
+		onSaveEnd: (tabId, autoClose) => {
+			if (autoClose) {
+				singlefile.extension.core.bg.tabs.remove(tabId);
+			}
+			const saveInfo = currentSaves.get(tabId);
+			if (saveInfo) {
+				saveInfo.resolve();
+			}
+		},
+		onTabUpdated: tabId => {
+			cancelTab(tabId);
+		},
+		onTabRemoved: tabId => {
+			cancelTab(tabId);
 		}
 	};
 
@@ -99,6 +114,13 @@ singlefile.extension.core.bg.business = (() => {
 					console.log(error); // eslint-disable-line no-console
 					ui.onError(tabId);
 				}
+			} finally {
+				currentSaves.delete(tabId);
+				if (pendingSaves.size) {
+					const [tabId, { tab, method, resolve, reject, options }] = Array.from(pendingSaves)[0];
+					pendingSaves.delete(tabId);
+					requestSaveTab(tab, method, options, resolve, reject);
+				}
 			}
 		}
 	}
@@ -110,15 +132,19 @@ singlefile.extension.core.bg.business = (() => {
 		await saveTabs([tab], options);
 	}
 
-	async function cancelTab(tabId) {
+	function cancelTab(tabId) {
 		try {
 			if (currentSaves.has(tabId)) {
 				const saveInfo = currentSaves.get(tabId);
 				saveInfo.cancelled = true;
 				singlefile.extension.core.bg.tabs.sendMessage(tabId, { method: "content.cancelSave" });
+				if (saveInfo.method == "content.autosave") {
+					singlefile.extension.ui.bg.main.onEnd(tabId, true);
+				}
 				if (saveInfo.cancel) {
 					saveInfo.cancel();
 				}
+				saveInfo.resolve();
 			}
 			if (pendingSaves.has(tabId)) {
 				const saveInfo = pendingSaves.get(tabId);
@@ -135,26 +161,14 @@ singlefile.extension.core.bg.business = (() => {
 
 		async function requestSaveTab(tab, method, options, resolve, reject) {
 			if (currentSaves.size < maxParallelWorkers) {
-				currentSaves.set(tab.id, { tab, options, resolve, reject });
+				currentSaves.set(tab.id, { tab, options, method, resolve, reject });
 				try {
 					await singlefile.extension.core.bg.tabs.sendMessage(tab.id, { method, options });
-					resolve();
 				} catch (error) {
 					reject(error);
-				} finally {
-					currentSaves.delete(tab.id);
-					next();
 				}
 			} else {
-				pendingSaves.set(tab.id, { tab, options, resolve, reject });
-			}
-		}
-
-		function next() {
-			if (pendingSaves.size) {
-				const [tabId, { tab, resolve, reject, options }] = Array.from(pendingSaves)[0];
-				pendingSaves.delete(tabId);
-				requestSaveTab(tab, method, options, resolve, reject);
+				pendingSaves.set(tab.id, { tab, options, method, resolve, reject });
 			}
 		}
 	}

+ 5 - 6
extension/core/bg/downloads.js

@@ -60,16 +60,14 @@ singlefile.extension.core.bg.downloads = (() => {
 			return {};
 		}
 		if (message.method.endsWith(".end")) {
-			if (message.autoClose) {
-				singlefile.extension.core.bg.tabs.remove(sender.tab.id);
-			}
+			singlefile.extension.core.bg.business.onSaveEnd(sender.tab.id, message.autoClose);
 			return {};
 		}
 		if (message.method.endsWith(".getInfo")) {
 			return singlefile.extension.core.bg.business.getTabsInfo();
 		}
 		if (message.method.endsWith(".cancel")) {
-			await singlefile.extension.core.bg.business.cancelTab(message.tabId);
+			singlefile.extension.core.bg.business.cancelTab(message.tabId);
 			return {};
 		}
 	}
@@ -128,7 +126,7 @@ singlefile.extension.core.bg.downloads = (() => {
 						singlefile.extension.ui.bg.main.onEnd(tab.id);
 					} catch (error) {
 						if (error.message && error.message == "upload_cancelled") {
-							await singlefile.extension.core.bg.business.cancelTab(tab.id);
+							singlefile.extension.core.bg.business.cancelTab(tab.id);
 						} else {
 							console.error(error); // eslint-disable-line no-console
 							singlefile.extension.ui.bg.main.onError(tab.id);
@@ -170,7 +168,8 @@ singlefile.extension.core.bg.downloads = (() => {
 	async function uploadPage(tabId, filename, blob, authOptions, uploadOptions) {
 		try {
 			await getAuthInfo(authOptions);
-			if (!singlefile.extension.core.bg.business.getTabInfo(tabId).cancelled) {
+			const saveInfo = singlefile.extension.core.bg.business.getTabInfo(tabId);
+			if (saveInfo && !saveInfo.cancelled) {
 				const uploadInfo = await gDrive.upload(filename, blob, uploadOptions);
 				singlefile.extension.core.bg.business.setCancelCallback(tabId, uploadInfo.cancelUpload);
 				return await uploadInfo.uploadPromise;

+ 2 - 0
extension/core/bg/tabs.js

@@ -143,6 +143,7 @@ singlefile.extension.core.bg.tabs = (() => {
 	function onTabUpdated(tabId, changeInfo, tab) {
 		if (changeInfo.status == "loading") {
 			singlefile.extension.ui.bg.main.onTabUpdated(tabId, changeInfo, tab);
+			singlefile.extension.core.bg.business.onTabUpdated(tabId, changeInfo, tab);
 		}
 		if (changeInfo.status == "complete") {
 			singlefile.extension.core.bg.autosave.onTabUpdated(tabId, changeInfo, tab);
@@ -153,6 +154,7 @@ singlefile.extension.core.bg.tabs = (() => {
 	function onTabRemoved(tabId) {
 		singlefile.extension.core.bg.tabsData.onTabRemoved(tabId);
 		singlefile.extension.core.bg.editor.onTabRemoved(tabId);
+		singlefile.extension.core.bg.business.onTabRemoved(tabId);
 	}
 
 })();