Răsfoiți Sursa

made message passing easier to follow

Gildas 6 ani în urmă
părinte
comite
d8748d94d0

+ 3 - 3
extension/core/bg/autosave.js

@@ -31,11 +31,11 @@ singlefile.autosave = (() => {
 	};
 
 	async function onMessage(message, sender) {
-		if (message.initAutoSave) {
+		if (message.method.endsWith(".init")) {
 			const [options, autoSaveEnabled] = await Promise.all([singlefile.config.getOptions(sender.tab.url, true), isEnabled(sender.tab)]);
 			return { options, autoSaveEnabled };
 		}
-		if (message.autoSaveContent) {
+		if (message.method.endsWith(".save")) {
 			return saveContent(message, sender.tab);
 		}
 	}
@@ -73,7 +73,7 @@ singlefile.autosave = (() => {
 		return Promise.all(tabs.map(async tab => {
 			try {
 				const [options, autoSaveEnabled] = await Promise.all([singlefile.config.getOptions(tab.url, true), isEnabled(tab)]);
-				await singlefile.tabs.sendMessage(tab.id, { initAutoSave: true, autoSaveEnabled, options });
+				await singlefile.tabs.sendMessage(tab.id, { method: "content.init", autoSaveEnabled, options });
 			} catch (error) {
 				/* ignored */
 			}

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

@@ -77,7 +77,7 @@ singlefile.core = (() => {
 				if (options.autoSave) {
 					const options = await singlefile.config.getOptions(tab.url, true);
 					if (singlefile.autosave.isEnabled(tab)) {
-						await singlefile.tabs.sendMessage(tab.id, { autoSavePage: true, options });
+						await singlefile.tabs.sendMessage(tab.id, { method: "content.autosave", options });
 					}
 				} else {
 					singlefile.ui.button.onInitialize(tabId, options, 1);
@@ -103,7 +103,7 @@ singlefile.core = (() => {
 						if (mergedOptions.frameId) {
 							await browser.tabs.executeScript(tab.id, { code: "document.documentElement.dataset.requestedFrameId = true", frameId: mergedOptions.frameId, matchAboutBlank: true, runAt: "document_start" });
 						}
-						await singlefile.tabs.sendMessage(tab.id, { savePage: true, options: mergedOptions });
+						await singlefile.tabs.sendMessage(tab.id, { method: "content.save", options: mergedOptions });
 					} else {
 						singlefile.ui.button.onForbiddenDomain(tabId, options);
 					}

+ 15 - 15
extension/core/bg/data/config.js

@@ -139,52 +139,52 @@ singlefile.config = (() => {
 	}
 
 	async function onMessage(message) {
-		if (message.deleteRules) {
+		if (message.method.endsWith(".deleteRules")) {
 			await deleteRules(message.profileName);
 		}
-		if (message.deleteRule) {
+		if (message.method.endsWith(".deleteRule")) {
 			await deleteRule(message.url);
 		}
-		if (message.addRule) {
+		if (message.method.endsWith(".addRule")) {
 			await addRule(message.url, message.profileName, message.autoSaveProfileName);
 		}
-		if (message.createProfile) {
+		if (message.method.endsWith(".createProfile")) {
 			await createProfile(message.profileName);
 		}
-		if (message.renameProfile) {
+		if (message.method.endsWith(".renameProfile")) {
 			await renameProfile(message.profileName, message.newProfileName);
 		}
-		if (message.deleteProfile) {
+		if (message.method.endsWith(".deleteProfile")) {
 			await deleteProfile(message.profileName);
 		}
-		if (message.resetProfiles) {
+		if (message.method.endsWith(".resetProfiles")) {
 			await resetProfiles();
 		}
-		if (message.resetProfile) {
+		if (message.method.endsWith(".resetProfile")) {
 			await resetProfile(message.profileName);
 		}
-		if (message.importConfig) {
+		if (message.method.endsWith(".importConfig")) {
 			await importConfig(message.config);
 		}
-		if (message.updateProfile) {
+		if (message.method.endsWith(".updateProfile")) {
 			await updateProfile(message.profileName, message.profile);
 		}
-		if (message.updateRule) {
+		if (message.method.endsWith(".updateRule")) {
 			await updateRule(message.url, message.newUrl, message.profileName, message.autoSaveProfileName);
 		}
-		if (message.getConfigConstants) {
+		if (message.method.endsWith(".getConstants")) {
 			return {
 				DISABLED_PROFILE_NAME,
 				DEFAULT_PROFILE_NAME
 			};
 		}
-		if (message.getRules) {
+		if (message.method.endsWith(".getRules")) {
 			return getRules();
 		}
-		if (message.getProfiles) {
+		if (message.method.endsWith(".getProfiles")) {
 			return getProfiles();
 		}
-		if (message.exportConfig) {
+		if (message.method.endsWith(".exportConfig")) {
 			return exportConfig();
 		}
 		return {};

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

@@ -33,10 +33,10 @@ singlefile.tabsData = (() => {
 	};
 
 	async function onMessage(message) {
-		if (message.getTabsData) {
+		if (message.method.endsWith(".get")) {
 			return getPersistent();
 		}
-		if (message.setTabsData) {
+		if (message.method.endsWith(".set")) {
 			return setPersistent(message.tabsData);
 		}
 	}

+ 36 - 34
extension/core/bg/download.js

@@ -30,46 +30,48 @@ singlefile.download = (() => {
 	};
 
 	function onMessage(message, sender) {
-		if (message.truncated) {
-			let partialContent = partialContents.get(sender.tab.id);
-			if (!partialContent) {
-				partialContent = [];
-				partialContents.set(sender.tab.id, partialContent);
-			}
-			partialContent.push(message.content);
-			if (message.finished) {
-				partialContents.delete(sender.tab.id);
-				if (message.saveToClipboard) {
-					message.content = partialContent.join("");
+		if (message.method.endsWith(".download")) {
+			if (message.truncated) {
+				let partialContent = partialContents.get(sender.tab.id);
+				if (!partialContent) {
+					partialContent = [];
+					partialContents.set(sender.tab.id, partialContent);
+				}
+				partialContent.push(message.content);
+				if (message.finished) {
+					partialContents.delete(sender.tab.id);
+					if (message.saveToClipboard) {
+						message.content = partialContent.join("");
+					} else {
+						message.url = URL.createObjectURL(new Blob(partialContent, { type: "text/html" }));
+					}
 				} else {
-					message.url = URL.createObjectURL(new Blob(partialContent, { type: "text/html" }));
+					return Promise.resolve({});
 				}
-			} else {
-				return Promise.resolve({});
+			} else if (message.content && !message.saveToClipboard) {
+				message.url = URL.createObjectURL(new Blob([message.content], { type: "text/html" }));
 			}
-		} else if (message.content && !message.saveToClipboard) {
-			message.url = URL.createObjectURL(new Blob([message.content], { type: "text/html" }));
-		}
-		if (message.saveToClipboard) {
-			saveToClipboard(message);
-		} else {
-			return downloadPage(message, { confirmFilename: message.confirmFilename, incognito: sender.tab.incognito, filenameConflictAction: message.filenameConflictAction })
-				.catch(error => {
-					if (error.message) {
-						if (error.message.includes("'incognito'")) {
-							return downloadPage(message, { confirmFilename: message.confirmFilename, filenameConflictAction: message.filenameConflictAction });
-						} else if (error.message == "conflictAction prompt not yet implemented") {
-							return downloadPage(message, { confirmFilename: message.confirmFilename });
-						} else if (error.message.includes("illegal characters")) {
-							message.filename = message.filename.replace(/,/g, "_");
-							return downloadPage(message, { confirmFilename: message.confirmFilename, incognito: sender.tab.incognito, filenameConflictAction: message.filenameConflictAction });
+			if (message.saveToClipboard) {
+				saveToClipboard(message);
+			} else {
+				return downloadPage(message, { confirmFilename: message.confirmFilename, incognito: sender.tab.incognito, filenameConflictAction: message.filenameConflictAction })
+					.catch(error => {
+						if (error.message) {
+							if (error.message.includes("'incognito'")) {
+								return downloadPage(message, { confirmFilename: message.confirmFilename, filenameConflictAction: message.filenameConflictAction });
+							} else if (error.message == "conflictAction prompt not yet implemented") {
+								return downloadPage(message, { confirmFilename: message.confirmFilename });
+							} else if (error.message.includes("illegal characters")) {
+								message.filename = message.filename.replace(/,/g, "_");
+								return downloadPage(message, { confirmFilename: message.confirmFilename, incognito: sender.tab.incognito, filenameConflictAction: message.filenameConflictAction });
+							} else {
+								throw error;
+							}
 						} else {
 							throw error;
 						}
-					} else {
-						throw error;
-					}
-				});
+					});
+			}
 		}
 	}
 

+ 6 - 8
extension/core/bg/messages.js

@@ -23,24 +23,22 @@
 singlefile.messages = (() => {
 
 	browser.runtime.onMessage.addListener((message, sender) => {
-		if (message.loadFileURI || message.savePage) {
+		if (message.method.startsWith("tabs.")) {
 			return singlefile.tabs.onMessage(message, sender);
 		}
-		if (message.download) {
+		if (message.method.startsWith("downloads.")) {
 			return singlefile.download.onMessage(message, sender);
 		}
-		if (message.initAutoSave || message.autoSaveContent) {
+		if (message.method.startsWith("autosave.")) {
 			return singlefile.autosave.onMessage(message, sender);
 		}
-		if (message.loadURL || message.processProgress || message.processEnd || message.processError || message.processCancelled || message.refreshMenu) {
+		if (message.method.startsWith("ui.")) {
 			return singlefile.ui.onMessage(message, sender);
 		}
-		if (message.getConfigConstants || message.deleteRules || message.deleteRule || message.addRule || message.getRules ||
-			message.createProfile || message.renameProfile || message.deleteProfile || message.resetProfiles || message.getProfiles ||
-			message.resetProfile || message.exportConfig || message.importConfig || message.updateProfile || message.updateRule) {
+		if (message.method.startsWith("config.")) {
 			return singlefile.config.onMessage(message, sender);
 		}
-		if (message.getTabsData || message.setTabsData) {
+		if (message.method.startsWith("tabsData.")) {
 			return singlefile.tabsData.onMessage(message, sender);
 		}
 	});

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

@@ -32,13 +32,10 @@ singlefile.tabs = (() => {
 		sendMessage: (tabId, message, options) => browser.tabs.sendMessage(tabId, message, options)
 	};
 
-	async function onMessage(message, sender) {
-		if (message.loadFileURI) {
+	async function onMessage(message) {
+		if (message.method.endsWith(".loadFileURI")) {
 			return singlefile.config.getOptions(message.url);
 		}
-		if (message.savePage) {
-			return singlefile.tabs.sendMessage(sender.tab.id, message, { frameId: 0 });
-		}
 	}
 
 	function onTabCreated(tab) {

+ 6 - 6
extension/core/content/content-bootstrap.js

@@ -23,17 +23,17 @@
 this.singlefile.bootstrap = this.singlefile.bootstrap || (async () => {
 
 	let unloadListenerAdded, options, autoSaveEnabled, autoSaveTimeout, autoSavingPage;
-	browser.runtime.sendMessage({ initAutoSave: true }).then(message => {
+	browser.runtime.sendMessage({ method: "autosave.init" }).then(message => {
 		options = message.options;
 		autoSaveEnabled = message.autoSaveEnabled;
 		refresh();
 	});
 	browser.runtime.onMessage.addListener(message => onMessage(message));
-	browser.runtime.sendMessage({ loadURL: true });
+	browser.runtime.sendMessage({ method: "ui.loadURL" });
 	return {};
 
 	async function onMessage(message) {
-		if (message.autoSavePage) {
+		if (message.method == "content.autosave") {
 			autoSavingPage = false;
 			singlefile.pageAutoSaved = false;
 			options = message.options;
@@ -42,7 +42,7 @@ this.singlefile.bootstrap = this.singlefile.bootstrap || (async () => {
 				setTimeout(() => onMessage(message), options.autoSaveRepeatDelay * 1000);
 			}
 		}
-		if (message.initAutoSave) {
+		if (message.method == "content.init") {
 			options = message.options;
 			autoSaveEnabled = message.autoSaveEnabled;
 			refresh();
@@ -64,7 +64,7 @@ this.singlefile.bootstrap = this.singlefile.bootstrap || (async () => {
 					framesData = await frameTree.getAsync(options);
 				}
 				browser.runtime.sendMessage({
-					autoSaveContent: true,
+					method: "autosave.save",
 					content: docHelper.serialize(document, false),
 					canvasData: docData.canvasData,
 					fontsData: docData.fontsData,
@@ -103,7 +103,7 @@ this.singlefile.bootstrap = this.singlefile.bootstrap || (async () => {
 			const docData = docHelper.preProcessDoc(document, window, options);
 			if (this.frameTree && !options.removeFrames) {
 				browser.runtime.sendMessage({
-					autoSaveContent: true,
+					method: "autosave.save",
 					content: docHelper.serialize(document),
 					canvasData: docData.canvasData,
 					fontsData: docData.fontsData,

+ 7 - 17
extension/core/content/content.js

@@ -18,30 +18,20 @@
  *   along with SingleFile.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/* global browser, SingleFileBrowser, singlefile, frameTree, document, MouseEvent, addEventListener, window, lazyLoader, URL, setTimeout, docHelper, Blob */
+/* global browser, SingleFileBrowser, singlefile, frameTree, document, MouseEvent, window, lazyLoader, URL, setTimeout, docHelper, Blob */
 
 this.singlefile.top = this.singlefile.top || (() => {
 
-	const MESSAGE_PREFIX = "__SingleFile__::";
 	const MAX_CONTENT_SIZE = 64 * (1024 * 1024);
 	const SingleFile = SingleFileBrowser.getClass();
 
 	let processing = false;
 
 	browser.runtime.onMessage.addListener(message => {
-		if (message.savePage) {
+		if (message.method == "content.save") {
 			savePage(message);
 		}
 	});
-
-	addEventListener("message", event => {
-		if (typeof event.data == "string" && event.data.startsWith(MESSAGE_PREFIX)) {
-			const message = JSON.parse(event.data.substring(MESSAGE_PREFIX.length));
-			if (message.savePage) {
-				savePage(message);
-			}
-		}
-	});
 	return true;
 
 	async function savePage(message) {
@@ -58,10 +48,10 @@ this.singlefile.top = this.singlefile.top || (() => {
 					await downloadPage(page, options);
 				} catch (error) {
 					console.error(error); // eslint-disable-line no-console
-					browser.runtime.sendMessage({ processError: true, error, options: {} });
+					browser.runtime.sendMessage({ method: "ui.processError", error, options: {} });
 				}
 			} else {
-				browser.runtime.sendMessage({ processCancelled: true, options: {} });
+				browser.runtime.sendMessage({ method: "ui.processCancelled", options: {} });
 			}
 			processing = false;
 		}
@@ -101,12 +91,12 @@ this.singlefile.top = this.singlefile.top || (() => {
 				if (event.type == event.RESOURCE_LOADED) {
 					index++;
 				}
-				browser.runtime.sendMessage({ processProgress: true, index, maxIndex, options: {} });
+				browser.runtime.sendMessage({ method: "ui.processProgress", index, maxIndex, options: {} });
 				if (options.shadowEnabled) {
 					singlefile.ui.onLoadResource(index, maxIndex);
 				}
 			} if (event.type == event.PAGE_ENDED) {
-				browser.runtime.sendMessage({ processEnd: true, options: {} });
+				browser.runtime.sendMessage({ method: "ui.processEnd", options: {} });
 			} else if (options.shadowEnabled && !event.detail.frame) {
 				if (event.type == event.PAGE_LOADING) {
 					singlefile.ui.onPageLoading();
@@ -168,7 +158,7 @@ this.singlefile.top = this.singlefile.top || (() => {
 		if (options.backgroundSave) {
 			let response;
 			for (let blockIndex = 0; !response && (blockIndex * MAX_CONTENT_SIZE < page.content.length); blockIndex++) {
-				const message = { download: true, confirmFilename: options.confirmFilename, filenameConflictAction: options.filenameConflictAction, filename: page.filename, saveToClipboard: options.saveToClipboard };
+				const message = { method: "downloads.download", confirmFilename: options.confirmFilename, filenameConflictAction: options.filenameConflictAction, filename: page.filename, saveToClipboard: options.saveToClipboard };
 				message.truncated = page.content.length > MAX_CONTENT_SIZE;
 				if (message.truncated) {
 					message.finished = (blockIndex + 1) * MAX_CONTENT_SIZE > page.content.length;

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

@@ -24,9 +24,10 @@ singlefile.ui = (() => {
 
 	return {
 		onMessage(message, sender) {
-			if (message.refreshMenu) {
+			if (message.method.endsWith(".refreshMenu")) {
 				return singlefile.ui.menu.onMessage(message, sender);
-			} else {
+			}
+			if (message.method.endsWith(".loadURL")) {
 				return singlefile.ui.button.onMessage(message, sender);
 			}
 		},

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

@@ -63,24 +63,24 @@ singlefile.ui.button = (() => {
 	};
 
 	function onMessage(message, sender) {
-		if (message.loadURL) {
+		if (message.method.endsWith(".loadURL")) {
 			onLoad(sender.tab.id);
 		}
-		if (message.processProgress) {
+		if (message.method.endsWith(".processProgress")) {
 			if (message.maxIndex) {
 				onProgress(sender.tab.id, message.index, message.maxIndex, message.options);
 			}
 		}
-		if (message.processEnd) {
+		if (message.method.endsWith(".processEnd")) {
 			onEnd(sender.tab.id, message.options);
 		}
-		if (message.processError) {
+		if (message.method.endsWith(".processError")) {
 			if (message.error) {
 				console.error("Initialization error", message.error); // eslint-disable-line no-console
 			}
 			onError(sender.tab.id, message.options);
 		}
-		if (message.processCancelled) {
+		if (message.method.endsWith(".processCancelled")) {
 			onCancelled(sender.tab.id, message.options);
 		}
 	}
@@ -101,7 +101,7 @@ singlefile.ui.button = (() => {
 		refresh(tabId, getProperties({}, "", DEFAULT_COLOR, BUTTON_DEFAULT_TOOLTIP_MESSAGE));
 	}
 
-	function onInitialize(tabId, options, step) {		
+	function onInitialize(tabId, options, step) {
 		refresh(tabId, getProperties(options, BUTTON_INITIALIZING_BADGE_MESSAGE, step == 1 ? DEFAULT_COLOR : [4, 229, 36, 255], BUTTON_INITIALIZING_TOOLTIP_MESSAGE + " (" + step + "/2)", WAIT_ICON_PATH_PREFIX + "0.png"));
 	}
 

+ 5 - 3
extension/ui/bg/ui-menu.js

@@ -72,8 +72,10 @@ singlefile.ui.menu = (() => {
 		refresh: createMenus
 	};
 
-	function onMessage() {
-		createMenus();
+	function onMessage(message) {
+		if (message.method.endsWith("refreshMenu")) {
+			createMenus();
+		}
 	}
 
 	function onTabUpdated(tabId, changeInfo, tab) {
@@ -362,7 +364,7 @@ singlefile.ui.menu = (() => {
 		const tabsData = await singlefile.tabsData.get(tab.id);
 		await singlefile.autosave.refreshTabs();
 		singlefile.ui.button.refresh(tab);
-		browser.runtime.sendMessage({ refreshOptions: true, profileName: tabsData.profileName });
+		browser.runtime.sendMessage({ method: "options.refresh", profileName: tabsData.profileName });
 	}
 
 	async function refreshTab(tab) {

+ 24 - 24
extension/ui/bg/ui-options.js

@@ -22,7 +22,7 @@
 
 (async () => {
 
-	const { DEFAULT_PROFILE_NAME, DISABLED_PROFILE_NAME } = await browser.runtime.sendMessage({ getConfigConstants: true });
+	const { DEFAULT_PROFILE_NAME, DISABLED_PROFILE_NAME } = await browser.runtime.sendMessage({ method: "config.getConstants" });
 	const removeHiddenElementsLabel = document.getElementById("removeHiddenElementsLabel");
 	const removeUnusedStylesLabel = document.getElementById("removeUnusedStylesLabel");
 	const removeUnusedFontsLabel = document.getElementById("removeUnusedFontsLabel");
@@ -149,7 +149,7 @@
 
 	let sidePanelDisplay;
 	browser.runtime.onMessage.addListener(message => {
-		if (message.refreshOptions || (message.refreshOptionsPanel && sidePanelDisplay)) {
+		if (message.method == "options.refresh" || (message.method == "options.refreshPanel" && sidePanelDisplay)) {
 			refresh(message.profileName);
 		}
 	});
@@ -165,7 +165,7 @@
 	};
 	rulesDeleteAllButton.addEventListener("click", async () => {
 		if (await confirm(browser.i18n.getMessage("optionsDeleteDisplayedRulesConfirm"))) {
-			await browser.runtime.sendMessage({ deleteRules: true, profileName: !showAllProfilesInput.checked && profileNamesInput.value });
+			await browser.runtime.sendMessage({ method: "config.deleteRules", profileName: !showAllProfilesInput.checked && profileNamesInput.value });
 			await refresh();
 			refreshExternalComponents();
 		}
@@ -173,7 +173,7 @@
 	createURLElement.onsubmit = async event => {
 		event.preventDefault();
 		try {
-			await browser.runtime.sendMessage({ addRule: true, url: ruleUrlInput.value, profileName: ruleProfileInput.value, autoSaveProfileName: ruleAutoSaveProfileInput.value });
+			await browser.runtime.sendMessage({ method: "config.addRule", url: ruleUrlInput.value, profileName: ruleProfileInput.value, autoSaveProfileName: ruleAutoSaveProfileInput.value });
 			ruleUrlInput.value = "";
 			ruleProfileInput.value = ruleAutoSaveProfileInput.value = DEFAULT_PROFILE_NAME;
 			autoSaveProfileChanged = false;
@@ -186,14 +186,14 @@
 	};
 	ruleUrlInput.onclick = ruleUrlInput.onkeyup = ruleUrlInput.onchange = async () => {
 		ruleAddButton.disabled = !ruleUrlInput.value;
-		const rules = await browser.runtime.sendMessage({ getRules: true });
+		const rules = await browser.runtime.sendMessage({ method: "config.getRules" });
 		if (rules.find(rule => rule.url == ruleUrlInput.value)) {
 			ruleAddButton.disabled = true;
 		}
 	};
 	ruleEditUrlInput.onclick = ruleEditUrlInput.onkeyup = ruleEditUrlInput.onchange = async () => {
 		ruleEditButton.disabled = !ruleEditUrlInput.value;
-		const rules = await browser.runtime.sendMessage({ getRules: true });
+		const rules = await browser.runtime.sendMessage({ method: "config.getRules" });
 		if (rules.find(rule => rule.url == ruleEditUrlInput.value)) {
 			ruleEditButton.disabled = true;
 		}
@@ -225,7 +225,7 @@
 		const profileName = await prompt(browser.i18n.getMessage("profileAddPrompt"));
 		if (profileName) {
 			try {
-				await browser.runtime.sendMessage({ createProfile: true, profileName });
+				await browser.runtime.sendMessage({ method: "config.createProfile", profileName });
 				if (sidePanelDisplay) {
 					await refresh();
 				} else {
@@ -240,7 +240,7 @@
 	deleteProfileButton.addEventListener("click", async () => {
 		if (await confirm(browser.i18n.getMessage("profileDeleteConfirm"))) {
 			try {
-				await browser.runtime.sendMessage({ deleteProfile: true, profileName: profileNamesInput.value });
+				await browser.runtime.sendMessage({ method: "config.deleteProfile", profileName: profileNamesInput.value });
 				profileNamesInput.value = null;
 				await refresh();
 				refreshExternalComponents();
@@ -253,7 +253,7 @@
 		const profileName = await prompt(browser.i18n.getMessage("profileRenamePrompt"), profileNamesInput.value);
 		if (profileName) {
 			try {
-				await browser.runtime.sendMessage({ renameProfile: true, profileName: profileNamesInput.value, newProfileName: profileName });
+				await browser.runtime.sendMessage({ method: "config.renameProfile", profileName: profileNamesInput.value, newProfileName: profileName });
 				await refresh(profileName);
 				refreshExternalComponents();
 			} catch (error) {
@@ -265,12 +265,12 @@
 		const choice = await reset();
 		if (choice) {
 			if (choice == "all") {
-				await browser.runtime.sendMessage({ resetProfiles: true });
+				await browser.runtime.sendMessage({ method: "config.resetProfiles" });
 				await refresh(DEFAULT_PROFILE_NAME);
 				refreshExternalComponents();
 			}
 			if (choice == "current") {
-				await browser.runtime.sendMessage({ resetProfile: true, profileName: profileNamesInput.value });
+				await browser.runtime.sendMessage({ method: "config.resetProfile", profileName: profileNamesInput.value });
 				await refresh();
 				refreshExternalComponents();
 			}
@@ -278,7 +278,7 @@
 		}
 	}, false);
 	exportButton.addEventListener("click", async () => {
-		await browser.runtime.sendMessage({ exportConfig: true });
+		await browser.runtime.sendMessage({ method: "config.exportConfig" });
 	}, false);
 	importButton.addEventListener("click", () => {
 		fileInput.onchange = async () => {
@@ -290,7 +290,7 @@
 					reader.addEventListener("error", reject, false);
 				});
 				const config = JSON.parse(serializedConfig);
-				await browser.runtime.sendMessage({ importConfig: true, config });
+				await browser.runtime.sendMessage({ method: "config.importConfig", config });
 				await refresh(DEFAULT_PROFILE_NAME);
 				fileInput.value = "";
 			}
@@ -338,10 +338,10 @@
 			if (target == profileNamesInput) {
 				await refresh(profileNamesInput.value);
 				if (sidePanelDisplay) {
-					const tabsData = await browser.runtime.sendMessage({ getTabsData: true });
+					const tabsData = await browser.runtime.sendMessage({ method: "tabsData.get" });
 					tabsData.profileName = profileNamesInput.value;
-					await browser.runtime.sendMessage({ setTabsData: true, tabsData });
-					await browser.runtime.sendMessage({ refreshMenu: true });
+					await browser.runtime.sendMessage({ method: "tabsData.set", tabsData });
+					await browser.runtime.sendMessage({ method: "ui.refreshMenu" });
 				}
 			} else {
 				await refresh();
@@ -428,14 +428,14 @@
 		sidePanelDisplay = true;
 		document.querySelector(".options-title").remove();
 		document.documentElement.classList.add("side-panel");
-		const tabsData = await browser.runtime.sendMessage({ getTabsData: true });
+		const tabsData = await browser.runtime.sendMessage({ method: "tabsData.get" });
 		refresh(tabsData.profileName);
 	} else {
 		refresh();
 	}
 
 	async function refresh(profileName) {
-		const [profiles, rules] = await Promise.all([browser.runtime.sendMessage({ getProfiles: true }), browser.runtime.sendMessage({ getRules: true })]);
+		const [profiles, rules] = await Promise.all([browser.runtime.sendMessage({ method: "config.getProfiles" }), browser.runtime.sendMessage({ method: "config.getRules" })]);
 		const selectedProfileName = profileName || profileNamesInput.value || DEFAULT_PROFILE_NAME;
 		Array.from(profileNamesInput.childNodes).forEach(node => node.remove());
 		const profileNames = Object.keys(profiles);
@@ -494,7 +494,7 @@
 				ruleDeleteButton.title = browser.i18n.getMessage("optionsDeleteRuleTooltip");
 				ruleDeleteButton.addEventListener("click", async () => {
 					if (await confirm(browser.i18n.getMessage("optionsDeleteRuleConfirm"))) {
-						await browser.runtime.sendMessage({ deleteRule: true, url: rule.url });
+						await browser.runtime.sendMessage({ method: "config.deleteRule", url: rule.url });
 						await refresh();
 						refreshExternalComponents();
 					}
@@ -512,7 +512,7 @@
 						editURLElement.onsubmit = async event => {
 							event.preventDefault();
 							rulesElement.appendChild(editURLElement);
-							await browser.runtime.sendMessage({ updateRule: true, url: rule.url, newUrl: ruleEditUrlInput.value, profileName: ruleEditProfileInput.value, autoSaveProfileName: ruleEditAutoSaveProfileInput.value });
+							await browser.runtime.sendMessage({ method: "config.updateRule", url: rule.url, newUrl: ruleEditUrlInput.value, profileName: ruleEditProfileInput.value, autoSaveProfileName: ruleEditAutoSaveProfileInput.value });
 							await refresh();
 							refreshExternalComponents();
 							ruleUrlInput.focus();
@@ -588,7 +588,7 @@
 	async function update() {
 		await pendingSave;
 		pendingSave = browser.runtime.sendMessage({
-			updateProfile: true,
+			method: "config.updateProfile",
 			profileName: profileNamesInput.value,
 			profile: {
 				removeHiddenElements: removeHiddenElementsInput.checked,
@@ -633,11 +633,11 @@
 	}
 
 	async function refreshExternalComponents() {
-		await browser.runtime.sendMessage({ refreshMenu: true });
+		await browser.runtime.sendMessage({ method: "ui.refreshMenu" });
 		if (sidePanelDisplay) {
-			await browser.runtime.sendMessage({ refreshOptions: true, profileName: profileNamesInput.value });
+			await browser.runtime.sendMessage({ method: "options.refresh", profileName: profileNamesInput.value });
 		} else {
-			await browser.runtime.sendMessage({ refreshOptionsPanel: true, profileName: profileNamesInput.value });
+			await browser.runtime.sendMessage({ method: "options.refreshPanel", profileName: profileNamesInput.value });
 		}
 	}
 

+ 1 - 1
extension/ui/content/infobar.js

@@ -44,7 +44,7 @@ this.singlefile.infobar = this.singlefile.infobar || (() => {
 		if (singleFileComment) {
 			const info = singleFileComment.textContent.split("\n");
 			const [, , url, saveDate, ...infoData] = info;
-			const options = await browser.runtime.sendMessage({ loadFileURI: true, url });
+			const options = await browser.runtime.sendMessage({ method: "tabs.loadFileURI", url });
 			if (options.displayInfobar) {
 				initInfobar(url, saveDate, infoData);
 			}