Преглед изворни кода

added handler to enable/disable auto-save from SingleFile Auto-Save

Gildas пре 7 година
родитељ
комит
b7cd61b8f1
3 измењених фајлова са 76 додато и 21 уклоњено
  1. 20 19
      extension/core/bg/core.js
  2. 37 0
      extension/ui/bg/ui-button.js
  3. 19 2
      lib/browser-polyfill/custom-browser-polyfill.js

+ 20 - 19
extension/core/bg/core.js

@@ -83,31 +83,32 @@ singlefile.core = (() => {
 		if (request.processContent) {
 			processBackgroundTab(sender.tab, request);
 		}
-	});
+	});	
 	browser.tabs.onRemoved.addListener(async tabId => {
 		const tabsData = await singlefile.storage.get();
 		delete tabsData[tabId];
 		await singlefile.storage.set(tabsData);
 	});
 
-	return {
-		async processTab(tab, processOptions = {}) {
-			const options = await singlefile.config.get();
-			Object.keys(processOptions).forEach(key => options[key] = processOptions[key]);
-			return new Promise(async (resolve, reject) => {
-				const processPromise = processStart(tab, options);
-				try {
-					await processPromise;
-				} catch (error) {
-					reject(error);
-				}
-				resolve();
-			});
-		},
-		isAllowedURL(url) {
-			return url && (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("file://")) && !FORBIDDEN_URLS.find(storeUrl => url.startsWith(storeUrl));
-		}
-	};
+	return { processTab, isAllowedURL };	
+
+	async function processTab(tab, processOptions) {
+		const options = await singlefile.config.get();
+		Object.keys(processOptions).forEach(key => options[key] = processOptions[key]);
+		return new Promise(async (resolve, reject) => {
+			const processPromise = processStart(tab, options);
+			try {
+				await processPromise;
+			} catch (error) {
+				reject(error);
+			}
+			resolve();
+		});
+	}
+
+	function isAllowedURL(url) {
+		return url && (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("file://")) && !FORBIDDEN_URLS.find(storeUrl => url.startsWith(storeUrl));
+	}
 
 	async function processBackgroundTab(tab, message) {
 		const options = await singlefile.config.get();

+ 37 - 0
extension/ui/bg/ui-button.js

@@ -60,6 +60,17 @@ singlefile.ui.button = (() => {
 			onError(sender.tab.id, request.options);
 		}
 	});
+	if (browser.runtime.onMessageExternal) {
+		browser.runtime.onMessageExternal.addListener(async message => {
+			if (message.method == "enableAutoSave") {
+				setAutoSaveActiveTabEnabled(message.enabled);
+			}
+			if (message.method == "isAutoSaveEnabled") {
+				return isAutoSaveEnabled();
+			}
+		});
+	}
+
 	return {
 		onInitialize,
 		onProgress,
@@ -68,6 +79,32 @@ singlefile.ui.button = (() => {
 		refresh: (tabId, options) => refresh(tabId, getProperties(tabId, options))
 	};
 
+	async function setAutoSaveActiveTabEnabled(enabled) {
+		const tabs = await browser.tabs.query({ currentWindow: true, active: true });
+		const tab = tabs[0];
+		if (tab) {
+			const tabId = tab.id;
+			const tabsData = await singlefile.storage.get();
+			if (!tabsData[tabId]) {
+				tabsData[tabId] = {};
+			}
+			tabsData[tabId].autoSave = enabled;
+			await singlefile.storage.set(tabsData);
+			refresh(tabId, getProperties(tabId, { autoSave: enabled }));
+		}
+	}
+
+	async function isAutoSaveEnabled() {
+		const tabs = await browser.tabs.query({ currentWindow: true, active: true });
+		const tab = tabs[0];
+		if (tab && singlefile.core.isAllowedURL(tab.url)) {
+			const tabId = tab.id;
+			const tabsData = await singlefile.storage.get();
+			return tabsData.autoSaveAll || (tabsData.autoSaveUnpinned && !tab.pinned) || (tabsData[tabId] && tabsData[tabId].autoSave);
+		}
+		return false;
+	}
+
 	function onInitialize(tabId, options, step) {
 		refresh(tabId, getProperties(tabId, options, "•••", step == 1 ? DEFAULT_COLOR : [4, 229, 36, 255], "Initializing SingleFile (" + step + "/2)"));
 	}

+ 19 - 2
lib/browser-polyfill/custom-browser-polyfill.js

@@ -163,8 +163,25 @@
 								});
 							return true;
 						}
-					}),
-					removeListener: () => { }
+					})
+				},
+				onMessageExternal: {
+					addListener: listener => chrome.runtime.onMessageExternal.addListener((message, sender, sendResponse) => {
+						const response = listener(message, sender);
+						if (response && typeof response.then == "function") {
+							response
+								.then(response => {
+									if (response !== undefined) {
+										try {
+											sendResponse(response);
+										} catch (error) {
+											/* ignored */
+										}
+									}
+								});
+							return true;
+						}
+					})
 				},
 				sendMessage: message => new Promise((resolve, reject) =>
 					chrome.runtime.sendMessage(message, response => {