Jelajahi Sumber

clicking "save page" on a link saves it in a new temp tab (fix #262)

Former-commit-id: 1811870afadae9fd265a42c625bdf146c172140f
Gildas 6 tahun lalu
induk
melakukan
d3cd68674b

+ 7 - 0
extension/core/bg/business.js

@@ -45,6 +45,7 @@ singlefile.extension.core.bg.business = (() => {
 	return {
 		isSavingTab: tab => currentSaves.has(tab.id),
 		saveTab,
+		saveLink,
 		cancelTab
 	};
 
@@ -83,6 +84,12 @@ singlefile.extension.core.bg.business = (() => {
 		}
 	}
 
+	async function saveLink(url) {
+		const tabs = singlefile.extension.core.bg.tabs;
+		const tab = await tabs.create({ url, active: false });
+		await saveTab(tab, { autoClose: true });
+	}
+
 	async function cancelTab(tab) {
 		try {
 			singlefile.extension.core.bg.tabs.sendMessage(tab.id, { method: "content.cancelSave" });

+ 20 - 0
extension/core/bg/tabs.js

@@ -31,6 +31,26 @@ singlefile.extension.core.bg.tabs = (() => {
 	return {
 		onMessage,
 		get: options => browser.tabs.query(options),
+		create: async createProperties => {
+			const tab = await browser.tabs.create(createProperties);
+			return new Promise((resolve, reject) => {
+				browser.tabs.onUpdated.addListener(onTabUpdated);
+				browser.tabs.onRemoved.addListener(onTabRemoved);
+				function onTabUpdated(tabId, changeInfo) {
+					if (tabId == tab.id && changeInfo.status == "complete") {
+						resolve(tab);
+						browser.tabs.onUpdated.removeListener(onTabUpdated);
+						browser.tabs.onRemoved.removeListener(onTabRemoved);
+					}
+				}
+				function onTabRemoved(tabId) {
+					if (tabId == tab.id) {
+						reject();
+						browser.tabs.onRemoved.removeListener(onTabRemoved);
+					}
+				}
+			});
+		},
 		sendMessage: (tabId, message, options) => browser.tabs.sendMessage(tabId, message, options),
 		remove: tabId => browser.tabs.remove(tabId)
 	};

+ 13 - 2
extension/lib/browser-polyfill/chrome-browser-polyfill.js

@@ -275,10 +275,12 @@
 					addListener: listener => nativeAPI.tabs.onActivated.addListener(listener)
 				},
 				onUpdated: {
-					addListener: listener => nativeAPI.tabs.onUpdated.addListener(listener)
+					addListener: listener => nativeAPI.tabs.onUpdated.addListener(listener),
+					removeListener: listener => nativeAPI.tabs.onUpdated.removeListener(listener)
 				},
 				onRemoved: {
-					addListener: listener => nativeAPI.tabs.onRemoved.addListener(listener)
+					addListener: listener => nativeAPI.tabs.onRemoved.addListener(listener),
+					removeListener: listener => nativeAPI.tabs.onRemoved.removeListener(listener)
 				},
 				executeScript: (tabId, details) => new Promise((resolve, reject) => {
 					nativeAPI.tabs.executeScript(tabId, details, () => {
@@ -310,6 +312,15 @@
 						}
 					});
 				}),
+				create: createProperties => new Promise((resolve, reject) => {
+					nativeAPI.tabs.create(createProperties, tab => {
+						if (nativeAPI.runtime.lastError) {
+							reject(nativeAPI.runtime.lastError);
+						} else {
+							resolve(tab);
+						}
+					});
+				}),
 				get: options => new Promise((resolve, reject) => {
 					nativeAPI.tabs.get(options, tab => {
 						if (nativeAPI.runtime.lastError) {

+ 5 - 1
extension/ui/bg/ui-menus.js

@@ -320,7 +320,11 @@ singlefile.extension.ui.bg.menus = (() => {
 			createMenus();
 			menus.onClicked.addListener(async (event, tab) => {
 				if (event.menuItemId == MENU_ID_SAVE_PAGE) {
-					business.saveTab(tab);
+					if (event.linkUrl) {
+						business.saveLink(event.linkUrl);
+					} else {
+						business.saveTab(tab);
+					}
 				}
 				if (event.menuItemId == MENU_ID_SAVE_SELECTED) {
 					business.saveTab(tab, { selected: true });