Sfoglia il codice sorgente

add ability to receive external messages
(fix #1186)

Gildas 2 anni fa
parent
commit
23b183876f
3 ha cambiato i file con 113 aggiunte e 11 eliminazioni
  1. 78 0
      src/core/bg/external-messages.js
  2. 4 10
      src/core/bg/index.js
  3. 31 1
      src/ui/pages/help.html

+ 78 - 0
src/core/bg/external-messages.js

@@ -0,0 +1,78 @@
+/*
+ * Copyright 2010-2020 Gildas Lormeau
+ * contact : gildas.lormeau <at> gmail.com
+ *
+ * This file is part of SingleFile.
+ *
+ *   The code in this file is free software: you can redistribute it and/or
+ *   modify it under the terms of the GNU Affero General Public License
+ *   (GNU AGPL) as published by the Free Software Foundation, either version 3
+ *   of the License, or (at your option) any later version.
+ *
+ *   The code in this file 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 Affero
+ *   General Public License for more details.
+ *
+ *   As additional permission under GNU AGPL version 3 section 7, you may
+ *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
+ *   AGPL normally required by section 4, provided you include this license
+ *   notice and a URL through which recipients can access the Corresponding
+ *   Source.
+ */
+
+/* global browser */
+
+import * as autosave from "./autosave.js";
+import * as business from "./business.js";
+import "./../../lib/single-file/background.js";
+
+const ACTION_SAVE_PAGE = "save-page";
+const ACTION_EDIT_AND_SAVE_PAGE = "edit-and-save-page";
+const ACTION_SAVE_SELECTED_LINKS = "save-selected-links";
+const ACTION_SAVE_SELECTED = "save-selected-content";
+const ACTION_SAVE_SELECTED_TABS = "save-selected-tabs";
+const ACTION_SAVE_UNPINNED_TABS = "save-unpinned-tabs";
+const ACTION_SAVE_ALL_TABS = "save-all-tabs";
+
+export { onMessage };
+
+async function onMessage(message, sender) {
+	if (message == ACTION_SAVE_PAGE) {
+		const tabs = await browser.tabs.query({ currentWindow: true, active: true });
+		tabs.length = 1;
+		business.saveTabs(tabs);
+	} else if (message == ACTION_EDIT_AND_SAVE_PAGE) {
+		const tabs = await browser.tabs.query({ currentWindow: true, active: true });
+		tabs.length = 1;
+		business.saveTabs(tabs, { openEditor: true });
+	} else if (message == ACTION_SAVE_SELECTED_LINKS) {
+		const tabs = await browser.tabs.query({ currentWindow: true, active: true });
+		business.saveSelectedLinks(tabs[0]);
+	} else if (message == ACTION_SAVE_SELECTED) {
+		const tabs = await browser.tabs.query({ currentWindow: true, active: true });
+		business.saveTabs(tabs, { selected: true });
+	} else if (message == ACTION_SAVE_SELECTED_TABS) {
+		const tabs = await queryTabs({ currentWindow: true, highlighted: true });
+		business.saveTabs(tabs);
+	} else if (message == ACTION_SAVE_UNPINNED_TABS) {
+		const tabs = await queryTabs({ currentWindow: true, pinned: false });
+		business.saveTabs(tabs);
+	} else if (message == ACTION_SAVE_ALL_TABS) {
+		const tabs = await queryTabs({ currentWindow: true });
+		business.saveTabs(tabs);
+	} else if (message.method) {
+		const tabs = await browser.tabs.query({ currentWindow: true, active: true });
+		const currentTab = tabs[0];
+		if (currentTab) {
+			return autosave.onMessageExternal(message, currentTab, sender);
+		} else {
+			return false;
+		}
+	}
+}
+
+async function queryTabs(options) {
+	const tabs = await browser.tabs.query(options);
+	return tabs.sort((tab1, tab2) => tab1.index - tab2.index);
+}

+ 4 - 10
src/core/bg/index.js

@@ -34,6 +34,7 @@ import * as editor from "./editor.js";
 import * as requests from "./requests.js";
 import * as tabsData from "./tabs-data.js";
 import * as tabs from "./tabs.js";
+import * as externalMesssages from "./external-messages.js";
 import * as ui from "./../../ui/bg/index.js";
 import "./../../lib/single-file/background.js";
 
@@ -75,14 +76,7 @@ browser.runtime.onMessage.addListener((message, sender) => {
 		return bootstrap.onMessage(message, sender);
 	}
 });
+
 if (browser.runtime.onMessageExternal) {
-	browser.runtime.onMessageExternal.addListener(async (message, sender) => {
-		const tabs = await browser.tabs.query({ currentWindow: true, active: true });
-		const currentTab = tabs[0];
-		if (currentTab) {
-			return autosave.onMessageExternal(message, currentTab, sender);
-		} else {
-			return false;
-		}
-	});
-}
+	browser.runtime.onMessageExternal.addListener(externalMesssages.onMessage);
+}

+ 31 - 1
src/ui/pages/help.html

@@ -18,7 +18,8 @@
 		</div> <span id="index"> <a href="#getting-started">Getting started</a> - <a href="#general-notes">Additional
 				notes</a> - <a href="#options">Options description</a> - <a href="#annotation-editor">Annotation
 				editor</a> - <a href="#notes">Technical notes</a> - <a href="#template-variables">Template variables</a>
-			- <a href="#known-issues">Known issues</a> - <a href="#unknown-issues">Troubleshooting unknown issues</a> -
+			- <a href="#external-messages">Integration with other extensions</a> - <a href="#known-issues">Known
+				issues</a> - <a href="#unknown-issues">Troubleshooting unknown issues</a> -
 			<a href="#contributors">Contributors</a> </span>
 		<hr>
 		<ol>
@@ -835,6 +836,35 @@
 					<li><code>{profile-name}</code>: the name of the profile used to save the page</li>
 				</ul>
 			</li>
+			<li>
+				<a id="external-messages">Integration with other extensions</a>
+				<p>SingleFile can receive messages from other extensions. The messages must be sent to the extension ID
+					of SingleFile and must be a string containing one of the following values:
+				<ul>
+					<li>
+						<code>"save-page"</code>: save the current page
+					</li>
+					<li>
+						<code>"edit-and-save-page"</code>: edit the current page in the annotation editor and save it
+					</li>
+					<li>
+						<code>"save-selected-links"</code>: save the selected links
+					</li>
+					<li>
+						<code>"save-selected-content"</code>: save the selected content
+					</li>
+					<li>
+						<code>"save-selected-tabs"</code>: save the selected tabs
+					</li>
+					<li>
+						<code>"save-unpinned-tabs"</code>: save the unpinned tabs
+					</li>
+					<li>
+						<code>"save-all-tabs"</code>: save all the tabs
+					</li>
+				</ul>
+				</p>
+			</li>
 			<li><a id="notes">Technical notes</a>
 				<ul>
 					<li>All images are converted into <a href="http://en.wikipedia.org/wiki/Base64"