Przeglądaj źródła

extracted storage.js from ui.js

Gildas 7 lat temu
rodzic
commit
d9c9db1ec8

+ 65 - 0
extension/core/bg/storage.js

@@ -0,0 +1,65 @@
+/*
+ * Copyright 2018 Gildas Lormeau
+ * contact : gildas.lormeau <at> gmail.com
+ * 
+ * This file is part of SingleFile.
+ *
+ *   SingleFile is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU Lesser General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   SingleFile is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU Lesser General Public License for more details.
+ *
+ *   You should have received a copy of the GNU Lesser General Public License
+ *   along with SingleFile.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* global browser, singlefile */
+
+singlefile.storage = (() => {
+
+	let persistentData;
+	let temporaryData;
+	getPersistent().then(tabsData => persistentData = tabsData);
+	return {
+		getTemporary,
+		get: getPersistent,
+		set: setPersistent
+	};
+
+	function getTemporary() {
+		if (temporaryData) {
+			return temporaryData;
+		} else {
+			return {};
+		}
+	}
+
+	async function getPersistent() {
+		if (persistentData) {
+			return persistentData;
+		} else {
+			const config = await browser.storage.local.get();
+			persistentData = config.tabsData || {};
+			await cleanup();
+			return persistentData;
+		}
+	}
+
+	async function setPersistent(tabsData) {
+		await browser.storage.local.set({ tabsData });
+	}
+
+	async function cleanup() {
+		if (persistentData) {
+			const tabs = await browser.tabs.query({});
+			Object.keys(persistentData).filter(tabId => !tabs.find(tab => tab.id == tabId)).forEach(tabId => delete persistentData[tabId]);
+			await browser.storage.local.set({ tabsData: persistentData });
+		}
+	}
+
+})();

+ 2 - 2
extension/ui/bg/ui-autosave.js

@@ -23,7 +23,7 @@
 singlefile.ui.autosave = (() => {
 
 	browser.tabs.onUpdated.addListener(async (tabId, changeInfo, tab) => {
-		const [config, tabsData] = await Promise.all([singlefile.config.get(), singlefile.ui.getPersistentTabsData()]);
+		const [config, tabsData] = await Promise.all([singlefile.config.get(), singlefile.storage.get()]);
 		if ((config.autoSaveLoad || config.autoSaveLoadOrUnload) && (tabsData.autoSaveAll || (tabsData.autoSaveUnpinned && !tab.pinned) || (tabsData[tab.id] && tabsData[tab.id].autoSave))) {
 			if (changeInfo.status == "complete") {
 				singlefile.ui.processTab(tab, { autoSave: true });
@@ -52,7 +52,7 @@ singlefile.ui.autosave = (() => {
 	}
 
 	async function isEnabled(tabId) {
-		const tabsData = await singlefile.ui.getPersistentTabsData();
+		const tabsData = await singlefile.storage.get();
 		return tabsData.autoSaveAll || tabsData.autoSaveUnpinned || (tabsData[tabId] && tabsData[tabId].autoSave);
 	}
 

+ 1 - 1
extension/ui/bg/ui-button.js

@@ -118,7 +118,7 @@ singlefile.ui.button = (() => {
 	}
 
 	async function refresh(tabId, tabData) {
-		const tabsData = await singlefile.ui.getTemporaryTabsData();
+		const tabsData = await singlefile.storage.getTemporary();
 		if (!tabsData[tabId]) {
 			tabsData[tabId] = {};
 		}

+ 10 - 11
extension/ui/bg/ui-menu.js

@@ -168,32 +168,31 @@ singlefile.ui.menu = (() => {
 					tabs.forEach(tab => singlefile.ui.isAllowedURL(tab.url) && singlefile.ui.processTab(tab));
 				}
 				if (event.menuItemId == MENU_ID_AUTO_SAVE_TAB) {
-					const tabsData = await singlefile.ui.getPersistentTabsData();
+					const tabsData = await singlefile.storage.get();
 					if (!tabsData[tab.id]) {
 						tabsData[tab.id] = {};
 					}
 					tabsData[tab.id].autoSave = event.checked;
-					await singlefile.ui.setPersistentData(tabsData);
-					await singlefile.ui.autosave.refresh();
-					singlefile.ui.button.refresh(tab.id, { autoSave: true });
+					await singlefile.storage.set(tabsData);
+					refreshExternalComponents(tab.id, { autoSave: true });
 				}
 				if (event.menuItemId == MENU_ID_AUTO_SAVE_DISABLED) {
-					const tabsData = await singlefile.ui.getPersistentTabsData();
+					const tabsData = await singlefile.storage.get();
 					Object.keys(tabsData).forEach(tabId => tabsData[tabId].autoSave = false);
 					tabsData.autoSaveUnpinned = tabsData.autoSaveAll = false;
-					await singlefile.ui.setPersistentData(tabsData);
+					await singlefile.storage.set(tabsData);
 					refreshExternalComponents(tab.id, { autoSave: false });
 				}
 				if (event.menuItemId == MENU_ID_AUTO_SAVE_ALL) {
-					const tabsData = await singlefile.ui.getPersistentTabsData();
+					const tabsData = await singlefile.storage.get();
 					tabsData.autoSaveAll = event.checked;
-					await singlefile.ui.setPersistentData(tabsData);
+					await singlefile.storage.set(tabsData);
 					refreshExternalComponents(tab.id, { autoSave: true });
 				}
 				if (event.menuItemId == MENU_ID_AUTO_SAVE_UNPINNED) {
-					const tabsData = await singlefile.ui.getPersistentTabsData();
+					const tabsData = await singlefile.storage.get();
 					tabsData.autoSaveUnpinned = event.checked;
-					await singlefile.ui.setPersistentData(tabsData);
+					await singlefile.storage.set(tabsData);
 					refreshExternalComponents(tab.id, { autoSave: true });
 				}
 			});
@@ -208,7 +207,7 @@ singlefile.ui.menu = (() => {
 	}
 
 	async function refreshState(tab) {
-		const tabsData = await singlefile.ui.getPersistentTabsData();
+		const tabsData = await singlefile.storage.get();
 		if (BROWSER_MENUS_API_SUPPORTED) {
 			try {
 				const disabled = Boolean(!tabsData[tab.id] || !tabsData[tab.id].autoSave);

+ 3 - 42
extension/ui/bg/ui.js

@@ -24,22 +24,14 @@ singlefile.ui = (() => {
 
 	const FORBIDDEN_URLS = ["https://chrome.google.com", "https://addons.mozilla.org"];
 
-	let persistentTabsData;
-	let temporaryTabsData;
-
-	getPersistentTabsData().then(tabsData => persistentTabsData = tabsData);
-
 	browser.tabs.onRemoved.addListener(async tabId => {
-		const tabsData = await getPersistentTabsData();
+		const tabsData = await singlefile.storage.get();
 		delete tabsData[tabId];
-		await browser.storage.local.set({ tabsData });
+		await singlefile.storage.set(tabsData);
 	});
 	return {
 		processTab,
-		isAllowedURL,
-		getTemporaryTabsData,
-		getPersistentTabsData,
-		setPersistentData
+		isAllowedURL
 	};
 
 	async function processTab(tab, options = {}) {
@@ -58,35 +50,4 @@ singlefile.ui = (() => {
 		return url && (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("file://")) && !FORBIDDEN_URLS.find(storeUrl => url.startsWith(storeUrl));
 	}
 
-	function getTemporaryTabsData() {
-		if (temporaryTabsData) {
-			return temporaryTabsData;
-		} else {
-			return {};
-		}
-	}
-
-	async function setPersistentData(tabsData) {
-		await browser.storage.local.set({ tabsData });
-	}
-
-	async function getPersistentTabsData() {
-		if (persistentTabsData) {
-			return persistentTabsData;
-		} else {
-			const config = await browser.storage.local.get();
-			persistentTabsData = config.tabsData || {};
-			await cleanupPersistentTabsData();
-			return persistentTabsData;
-		}
-	}
-
-	async function cleanupPersistentTabsData() {
-		if (persistentTabsData) {
-			const tabs = await browser.tabs.query({});
-			Object.keys(persistentTabsData).filter(tabId => !tabs.find(tab => tab.id == tabId)).forEach(tabId => delete persistentTabsData[tabId]);
-			await browser.storage.local.set({ tabsData: persistentTabsData });
-		}
-	}
-
 })();

+ 1 - 0
manifest.json

@@ -43,6 +43,7 @@
 			"lib/browser-polyfill/custom-browser-polyfill.js",
 			"lib/fetch/bg/fetch.js",
 			"extension/index.js",
+			"extension/core/bg/storage.js",
 			"extension/core/bg/config.js",
 			"extension/core/bg/bg.js",
 			"extension/ui/bg/ui.js",