Jelajahi Sumber

fix regression when saing multiple tabs

Gildas 5 tahun lalu
induk
melakukan
faa66093ad
1 mengubah file dengan 31 tambahan dan 9 penghapusan
  1. 31 9
      extension/lib/single-file/lazy/bg/lazy-timeout.js

+ 31 - 9
extension/lib/single-file/lazy/bg/lazy-timeout.js

@@ -31,29 +31,51 @@
 
 	browser.runtime.onMessage.addListener((message, sender) => {
 		if (message.method == "singlefile.lazyTimeout.setTimeout") {
-			const previousTimeoutId = timeouts.get(message.type);
-			if (previousTimeoutId) {
-				clearTimeout(previousTimeoutId);
+			let tabTimeouts = timeouts.get(sender.tab.id);
+			if (tabTimeouts) {
+				const previousTimeoutId = tabTimeouts.get(message.type);
+				if (previousTimeoutId) {
+					clearTimeout(previousTimeoutId);
+				}
 			}
 			const timeoutId = setTimeout(async () => {
 				try {
-					timeouts.delete(message.type);
+					const tabTimeouts = timeouts.get(sender.tab.id);
+					if (tabTimeouts) {
+						deleteTimeout(tabTimeouts, sender.tab.id, message.type);
+					}
 					await browser.tabs.sendMessage(sender.tab.id, { method: "singlefile.lazyTimeout.onTimeout", type: message.type });
 				} catch (error) {
 					// ignored
 				}
 			}, message.delay);
-			timeouts.set(message.type, timeoutId);
+			if (!tabTimeouts) {
+				tabTimeouts = new Map();
+				timeouts.set(sender.tab.id, tabTimeouts);
+			}
+			tabTimeouts.set(message.type, timeoutId);
 			return Promise.resolve({});
 		}
 		if (message.method == "singlefile.lazyTimeout.clearTimeout") {
-			const timeoutId = timeouts.get(message.type);
-			if (timeoutId) {
-				clearTimeout(timeoutId);
+			let tabTimeouts = timeouts.get(sender.tab.id);
+			if (tabTimeouts) {
+				const timeoutId = tabTimeouts.get(message.type);
+				if (timeoutId) {
+					clearTimeout(timeoutId);
+				}
+				deleteTimeout(tabTimeouts, sender.tab.id, message.type);
 			}
-			timeouts.delete(message.type);
 			return Promise.resolve({});
 		}
 	});
 
+	browser.tabs.onRemoved.addListener(tabId => timeouts.delete(tabId));
+
+	function deleteTimeout(tabTimeouts, tabId, type) {
+		tabTimeouts.delete(type);
+		if (!tabTimeouts.size) {
+			timeouts.delete(tabId);
+		}
+	}
+
 })();