Explorar o código

rely on browser.* instead of chrome.* APIs

Gildas %!s(int64=7) %!d(string=hai) anos
pai
achega
82f1408a5e

+ 15 - 13
extension/core/scripts/bg/bg.js

@@ -18,20 +18,22 @@
  *   along with SingleFile.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/* global singlefile, chrome, FrameTree */
+/* global singlefile, FrameTree */
 
 (() => {
 
+	const browser = this.browser || this.chrome;
+
 	const STORE_URLS = ["https://chrome.google.com", "https://addons.mozilla.org"];
 	const MENU_ID_SAVE_PAGE = "save-page";
 	const MENU_ID_SAVE_SELECTED = "save-selected";
 
-	chrome.tabs.onActivated.addListener(activeInfo => chrome.tabs.get(activeInfo.tabId, tab => singlefile.ui.active(tab.id, isAllowedURL(tab.url))));
-	chrome.tabs.onCreated.addListener(tab => singlefile.ui.active(tab.id, isAllowedURL(tab.url)));
-	chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => singlefile.ui.active(tab.id, isAllowedURL(tab.url)));
-	chrome.tabs.onRemoved.addListener(tabId => singlefile.ui.removed(tabId));
+	browser.tabs.onActivated.addListener(activeInfo => browser.tabs.get(activeInfo.tabId, tab => singlefile.ui.active(tab.id, isAllowedURL(tab.url))));
+	browser.tabs.onCreated.addListener(tab => singlefile.ui.active(tab.id, isAllowedURL(tab.url)));
+	browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => singlefile.ui.active(tab.id, isAllowedURL(tab.url)));
+	browser.tabs.onRemoved.addListener(tabId => singlefile.ui.removed(tabId));
 
-	chrome.runtime.onMessage.addListener((request, sender) => {
+	browser.runtime.onMessage.addListener((request, sender) => {
 		if (request.processStart || request.processProgress) {
 			singlefile.ui.progress(sender.tab.id, request.index, request.maxIndex);
 		}
@@ -44,26 +46,26 @@
 		return false;
 	});
 
-	chrome.browserAction.onClicked.addListener(tab => {
+	browser.browserAction.onClicked.addListener(tab => {
 		if (isAllowedURL(tab.url)) {
-			chrome.tabs.query({ currentWindow: true, highlighted: true }, tabs => tabs.forEach(processTab));
+			browser.tabs.query({ currentWindow: true, highlighted: true }, tabs => tabs.forEach(processTab));
 		}
 	});
 
-	chrome.runtime.onInstalled.addListener(function () {
-		chrome.contextMenus.create({
+	browser.runtime.onInstalled.addListener(function () {
+		browser.contextMenus.create({
 			id: MENU_ID_SAVE_PAGE,
 			contexts: ["page"],
 			title: "Save page with SingleFile"
 		});
-		chrome.contextMenus.create({
+		browser.contextMenus.create({
 			id: MENU_ID_SAVE_SELECTED,
 			contexts: ["selection"],
 			title: "Save selection with SingleFile"
 		});
 	});
 
-	chrome.contextMenus.onClicked.addListener((event, tab) => {
+	browser.contextMenus.onClicked.addListener((event, tab) => {
 		if (event.menuItemId == MENU_ID_SAVE_PAGE) {
 			processTab(tab);
 		}
@@ -86,7 +88,7 @@
 	}
 
 	function processStart(tab, options) {
-		chrome.tabs.sendMessage(tab.id, { processStart: true, options });
+		browser.tabs.sendMessage(tab.id, { processStart: true, options });
 	}
 
 	function isAllowedURL(url) {

+ 8 - 6
extension/core/scripts/content/content.js

@@ -18,15 +18,17 @@
  *   along with SingleFile.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/* global chrome, SingleFile, singlefile, FrameTree, document, Blob, MouseEvent, getSelection */
+/* global SingleFile, singlefile, FrameTree, document, Blob, MouseEvent, getSelection */
 
 (() => {
 
+	const browser = this.browser || this.chrome;
+
 	const SELECTED_CONTENT_ATTRIBUTE_NAME = "data-single-file-selected-content";
 
 	let processing = false;
 
-	chrome.runtime.onMessage.addListener(request => {
+	browser.runtime.onMessage.addListener(request => {
 		if (request.processStart && !processing) {
 			processing = true;
 			fixInlineScripts();
@@ -45,7 +47,7 @@
 					processing = false;
 				})
 				.catch(error => {
-					chrome.runtime.sendMessage({ processError: true });
+					browser.runtime.sendMessage({ processError: true });
 					processing = false;
 					throw error;
 				});
@@ -117,21 +119,21 @@
 
 	function onProgress(event) {
 		if (event.type == event.RESOURCES_INITIALIZED) {
-			chrome.runtime.sendMessage({
+			browser.runtime.sendMessage({
 				processStart: true,
 				index: event.details.index,
 				maxIndex: event.details.max
 			});
 		}
 		if (event.type == event.RESOURCE_LOADED) {
-			chrome.runtime.sendMessage({
+			browser.runtime.sendMessage({
 				processProgress: true,
 				index: event.details.index,
 				maxIndex: event.details.max
 			});
 		}
 		if (event.type == event.PAGE_ENDED) {
-			chrome.runtime.sendMessage({ processEnd: true });
+			browser.runtime.sendMessage({ processEnd: true });
 		}
 	}
 

+ 4 - 2
extension/ui/scripts/bg/options.js

@@ -18,11 +18,13 @@
  *   along with SingleFile.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/* global chrome, document, addEventListener */
+/* global document, addEventListener */
 
 (() => {
 
-	const bgPage = chrome.extension.getBackgroundPage();
+	const browser = this.browser || this.chrome;
+
+	const bgPage = browser.extension.getBackgroundPage();
 	const removeHiddenInput = document.getElementById("removeHiddenInput");
 	const removeUnusedCSSRulesInput = document.getElementById("removeUnusedCSSRulesInput");
 	const removeFramesInput = document.getElementById("removeFramesInput");

+ 6 - 4
extension/ui/scripts/bg/ui.js

@@ -18,10 +18,12 @@
  *   along with SingleFile.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/* global singlefile, chrome */
+/* global singlefile */
 
 singlefile.ui = (() => {
 
+	const browser = this.browser || this.chrome;
+
 	const DEFAULT_ICON_PATH = "/extension/ui/resources/icon_19.png";
 	const WAIT_ICON_PATH_PREFIX = "/extension/ui/resources/icon_19_wait";
 	const DEFAULT_TITLE = "Process this page with SingleFile";
@@ -86,9 +88,9 @@ singlefile.ui = (() => {
 		},
 		active(tabId, isActive) {
 			if (isActive) {
-				chrome.browserAction.enable(tabId);
+				browser.browserAction.enable(tabId);
 			} else {
-				chrome.browserAction.disable(tabId);
+				browser.browserAction.disable(tabId);
 			}
 		}
 	};
@@ -116,7 +118,7 @@ singlefile.ui = (() => {
 		if (JSON.stringify(badgeTabs[tabId][property]) != JSON.stringify(value)) {
 			const browserActionParameter = { tabId };
 			badgeTabs[tabId][property] = browserActionParameter[property] = value;
-			return new Promise(resolve => chrome.browserAction[browserActionMethod](browserActionParameter, resolve));
+			return new Promise(resolve => browser.browserAction[browserActionMethod](browserActionParameter, resolve));
 		}
 	}
 

+ 4 - 2
lib/fetch/bg/fetch.js

@@ -18,15 +18,17 @@
  *   along with SingleFile.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/* global chrome, fetch */
+/* global fetch */
 
 (() => {
 
+	const browser = this.browser || this.chrome;
+
 	const fetchResponses = new Map();
 
 	let requestId = 1;
 
-	chrome.runtime.onMessage.addListener((request, sender, send) => {
+	browser.runtime.onMessage.addListener((request, sender, send) => {
 		if (request.method) {
 			if (request.method == "fetch") {
 				const responseId = requestId;

+ 9 - 7
lib/fetch/content/fetch.js

@@ -18,32 +18,34 @@
  *   along with SingleFile.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/* global window, chrome, Blob */
+/* global window, Blob */
 
 window.superFetch = (() => {
 
+	const browser = this.browser || this.chrome;
+
 	return async (url, options) => {
-		const responseFetch = await chromeRuntimeSendMessage({ method: "fetch", url, options });
+		const responseFetch = await sendMessage({ method: "fetch", url, options });
 		return {
 			headers: { get: headerName => responseFetch.headers[headerName] },
 			arrayBuffer: async () => {
-				const response = await chromeRuntimeSendMessage({ method: "fetch.array", requestId: responseFetch.responseId });
+				const response = await sendMessage({ method: "fetch.array", requestId: responseFetch.responseId });
 				return new Uint8Array(response.array).buffer;
 			},
 			blob: async () => {
-				const response = await chromeRuntimeSendMessage({ method: "fetch.array", requestId: responseFetch.responseId });
+				const response = await sendMessage({ method: "fetch.array", requestId: responseFetch.responseId });
 				return new Blob([new Uint8Array(response.array)]);
 			},
 			text: async () => {
-				const response = await chromeRuntimeSendMessage({ method: "fetch.text", requestId: responseFetch.responseId });
+				const response = await sendMessage({ method: "fetch.text", requestId: responseFetch.responseId });
 				return response.text;
 			}
 		};
 	};
 
-	function chromeRuntimeSendMessage(message) {
+	function sendMessage(message) {
 		return new Promise((resolve, reject) => {
-			chrome.runtime.sendMessage(message, response => {
+			browser.runtime.sendMessage(message, response => {
 				if (!response || response.error) {
 					reject(response && response.error);
 				} else {

+ 8 - 7
lib/frame-tree/bg/frame-tree.js

@@ -18,27 +18,28 @@
  *   along with SingleFile.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/* global chrome */
-
 this.FrameTree = (() => {
-	chrome.runtime.onMessage.addListener((message, sender) => {
+
+	const browser = this.browser || this.chrome;
+
+	browser.runtime.onMessage.addListener((message, sender) => {
 		if (message.method == "FrameTree.getDataRequest") {
-			chrome.tabs.sendMessage(sender.tab.id, { method: "FrameTree.getDataRequest", windowId: message.windowId, tabId: sender.tab.id });
+			browser.tabs.sendMessage(sender.tab.id, { method: "FrameTree.getDataRequest", windowId: message.windowId, tabId: sender.tab.id });
 		}
 		if (message.method == "FrameTree.getDataResponse") {
-			chrome.tabs.sendMessage(message.tabId, { method: "FrameTree.getDataResponse", windowId: message.windowId, content: message.content, baseURI: message.baseURI });
+			browser.tabs.sendMessage(message.tabId, { method: "FrameTree.getDataResponse", windowId: message.windowId, content: message.content, baseURI: message.baseURI });
 		}
 	});
 
 	return {
 		async initialize(tabId) {
 			return new Promise(resolve => {
-				chrome.runtime.onMessage.addListener(message => {
+				browser.runtime.onMessage.addListener(message => {
 					if (message.method == "FrameTree.initResponse") {
 						resolve();
 					}
 				});
-				chrome.tabs.sendMessage(tabId, { method: "FrameTree.initRequest", windowId: "0", index: 0 });
+				browser.tabs.sendMessage(tabId, { method: "FrameTree.initRequest", windowId: "0", index: 0 });
 			});
 		}
 	};

+ 8 - 6
lib/frame-tree/content/frame-tree.js

@@ -18,10 +18,12 @@
  *   along with SingleFile.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/* global chrome, window, top, document, HTMLHtmlElement, addEventListener */
+/* global window, top, document, HTMLHtmlElement, addEventListener */
 
 this.FrameTree = (() => {
 
+	const browser = this.browser || this.chrome;
+
 	const MESSAGE_PREFIX = "__FrameTree__";
 	const TIMEOUT_POST_MESSAGE = 1000;
 	const TIMEOUT_DATA_RESPONSE_MESSAGE = 1000;
@@ -34,7 +36,7 @@ this.FrameTree = (() => {
 	let dataRequestCallbacks;
 
 	if (window == top) {
-		chrome.runtime.onMessage.addListener(message => {
+		browser.runtime.onMessage.addListener(message => {
 			if (message.method == "FrameTree.initRequest" && document.documentElement instanceof HTMLHtmlElement) {
 				dataRequestCallbacks = new Map();
 				framesData = [];
@@ -45,9 +47,9 @@ this.FrameTree = (() => {
 			}
 		});
 	}
-	chrome.runtime.onMessage.addListener(message => {
+	browser.runtime.onMessage.addListener(message => {
 		if (message.method == "FrameTree.getDataRequest" && FrameTree.windowId == message.windowId) {
-			chrome.runtime.sendMessage({
+			browser.runtime.sendMessage({
 				method: "FrameTree.getDataResponse",
 				windowId: message.windowId,
 				tabId: message.tabId,
@@ -81,7 +83,7 @@ this.FrameTree = (() => {
 						windowId: frameData.windowId
 					}), "*");
 				} else {
-					chrome.runtime.sendMessage({
+					browser.runtime.sendMessage({
 						method: "FrameTree.getDataRequest",
 						windowId: frameData.windowId
 					});
@@ -116,7 +118,7 @@ this.FrameTree = (() => {
 					frameData.processed = true;
 				}
 				if (!pendingCount || pendingCount == 1) {
-					chrome.runtime.sendMessage({ method: "FrameTree.initResponse" });
+					browser.runtime.sendMessage({ method: "FrameTree.initResponse" });
 				}
 			}
 		} else {