Parcourir la source

cancel task when clicking the cancel button of the "Save as" dialog (fix #1490)

Gildas il y a 1 an
Parent
commit
fca326ed1f

+ 1 - 1
src/core/bg/business.js

@@ -60,7 +60,7 @@ export {
 	onSaveEnd,
 	onSaveEnd,
 	onInit,
 	onInit,
 	onTabReplaced,
 	onTabReplaced,
-	cancelTab as onTabRemoved
+	cancelTab as cancel
 };
 };
 
 
 async function saveSelectedLinks(tab) {
 async function saveSelectedLinks(tab) {

+ 23 - 22
src/core/bg/download-util.js

@@ -39,6 +39,28 @@ export {
 
 
 async function download(downloadInfo, replacementCharacter) {
 async function download(downloadInfo, replacementCharacter) {
 	let downloadId;
 	let downloadId;
+	const result = new Promise((resolve, reject) => {
+		browser.downloads.onChanged.addListener(onChanged);
+
+		function onChanged(event) {
+			if (event.id == downloadId && event.state) {
+				if (event.state.current == STATE_DOWNLOAD_COMPLETE) {
+					browser.downloads.search({ id: downloadId })
+						.then(downloadItems => resolve({ filename: downloadItems[0] && downloadItems[0].filename }))
+						.catch(() => resolve({}));
+					browser.downloads.onChanged.removeListener(onChanged);
+				}
+				if (event.state.current == STATE_DOWNLOAD_INTERRUPTED) {
+					if (event.error && event.error.current == STATE_ERROR_CANCELED_CHROMIUM) {
+						resolve({ cancelled: true });
+					} else {
+						reject(new Error(event.state.current));
+					}
+					browser.downloads.onChanged.removeListener(onChanged);
+				}
+			}
+		}
+	});
 	try {
 	try {
 		downloadId = await browser.downloads.download(downloadInfo);
 		downloadId = await browser.downloads.download(downloadInfo);
 	} catch (error) {
 	} catch (error) {
@@ -72,26 +94,5 @@ async function download(downloadInfo, replacementCharacter) {
 			throw error;
 			throw error;
 		}
 		}
 	}
 	}
-	return new Promise((resolve, reject) => {
-		browser.downloads.onChanged.addListener(onChanged);
-
-		function onChanged(event) {
-			if (event.id == downloadId && event.state) {
-				if (event.state.current == STATE_DOWNLOAD_COMPLETE) {
-					browser.downloads.search({ id: downloadId })
-						.then(downloadItems => resolve({ filename: downloadItems[0] && downloadItems[0].filename }))
-						.catch(() => resolve({}));
-					browser.downloads.onChanged.removeListener(onChanged);
-				}
-				if (event.state.current == STATE_DOWNLOAD_INTERRUPTED) {
-					if (event.error && event.error.current == STATE_ERROR_CANCELED_CHROMIUM) {
-						resolve({});
-					} else {
-						reject(new Error(event.state.current));
-					}
-					browser.downloads.onChanged.removeListener(onChanged);
-				}
-			}
-		}
-	});
+	return result;
 }
 }

+ 8 - 1
src/core/bg/downloads.js

@@ -101,7 +101,11 @@ async function onMessage(message, sender) {
 		return business.getTasksInfo();
 		return business.getTasksInfo();
 	}
 	}
 	if (message.method.endsWith(".cancel")) {
 	if (message.method.endsWith(".cancel")) {
-		business.cancelTask(message.taskId);
+		if (message.taskId) {
+			business.cancelTask(message.taskId);
+		} else {
+			business.cancel(sender.tab.id);
+		}
 		return {};
 		return {};
 	}
 	}
 	if (message.method.endsWith(".cancelAll")) {
 	if (message.method.endsWith(".cancelAll")) {
@@ -556,6 +560,9 @@ async function downloadPage(pageData, options) {
 		}
 		}
 		return { url };
 		return { url };
 	}
 	}
+	if (downloadData.cancelled) {
+		business.cancelTask(pageData.taskId);
+	}
 }
 }
 
 
 function saveToClipboard(pageData) {
 function saveToClipboard(pageData) {

+ 1 - 1
src/core/bg/tabs.js

@@ -106,9 +106,9 @@ async function onTabActivated(activeInfo) {
 }
 }
 
 
 function onTabRemoved(tabId) {
 function onTabRemoved(tabId) {
+	business.cancel(tabId);
 	tabsData.remove(tabId);
 	tabsData.remove(tabId);
 	editor.onTabRemoved(tabId);
 	editor.onTabRemoved(tabId);
-	business.onTabRemoved(tabId);
 	autosave.onTabRemoved(tabId);
 	autosave.onTabRemoved(tabId);
 }
 }
 
 

+ 8 - 2
src/core/content/content.js

@@ -169,9 +169,15 @@ async function savePage(message) {
 				const pageData = await processPage(options);
 				const pageData = await processPage(options);
 				if (pageData) {
 				if (pageData) {
 					if (((!options.backgroundSave && !options.saveToClipboard) || options.saveToGDrive || options.saveToGitHub || options.saveWithCompanion || options.saveWithWebDAV || options.saveToDropbox || options.saveToRestFormApi) && options.confirmFilename) {
 					if (((!options.backgroundSave && !options.saveToClipboard) || options.saveToGDrive || options.saveToGitHub || options.saveWithCompanion || options.saveWithWebDAV || options.saveToDropbox || options.saveToRestFormApi) && options.confirmFilename) {
-						pageData.filename = ui.prompt("Save as", pageData.filename) || pageData.filename;
+						const filename = ui.prompt("Save as", pageData.filename);
+						if (filename) {
+							pageData.filename = filename;
+							await download.downloadPage(pageData, options);
+						} else {
+							browser.runtime.sendMessage({ method: "downloads.cancel" });
+							browser.runtime.sendMessage({ method: "ui.processCancelled" });
+						}
 					}
 					}
-					await download.downloadPage(pageData, options);
 				}
 				}
 			} catch (error) {
 			} catch (error) {
 				if (!processor.cancelled) {
 				if (!processor.cancelled) {