|
|
@@ -18,90 +18,97 @@
|
|
|
* along with SingleFile. If not, see <http://www.gnu.org/licenses/>.
|
|
|
*/
|
|
|
|
|
|
-/* global navigator, chrome */
|
|
|
+/* global navigator */
|
|
|
|
|
|
(() => {
|
|
|
|
|
|
const isChrome = navigator.userAgent.includes("Chrome");
|
|
|
+ const isEdge = navigator.userAgent.includes("Edge");
|
|
|
|
|
|
const FEATURE_TESTS = {};
|
|
|
|
|
|
- if (isChrome && !this.browser) {
|
|
|
- this.browser = {
|
|
|
+ let browserAPI;
|
|
|
+ if ((isChrome && !this.browser) || isEdge) {
|
|
|
+ if (isEdge) {
|
|
|
+ browserAPI = this.browser;
|
|
|
+ } else {
|
|
|
+ browserAPI = this.chrome;
|
|
|
+ }
|
|
|
+ this.__defineGetter__("browser", () => ({
|
|
|
browserAction: {
|
|
|
onClicked: {
|
|
|
- addListener: listener => chrome.browserAction.onClicked.addListener(listener)
|
|
|
+ addListener: listener => browserAPI.browserAction.onClicked.addListener(listener)
|
|
|
},
|
|
|
- enable: tabId => chrome.browserAction.enable(tabId),
|
|
|
- disable: tabId => chrome.browserAction.disable(tabId),
|
|
|
+ enable: tabId => browserAPI.browserAction.enable(tabId),
|
|
|
+ disable: tabId => browserAPI.browserAction.disable(tabId),
|
|
|
setBadgeText: options => new Promise((resolve, reject) => {
|
|
|
- if (chrome.runtime.lastError) {
|
|
|
- reject(chrome.runtime.lastError);
|
|
|
+ if (browserAPI.runtime.lastError) {
|
|
|
+ reject(browserAPI.runtime.lastError);
|
|
|
} else {
|
|
|
try {
|
|
|
if (!FEATURE_TESTS["browserAction.setBadgeText"] || !FEATURE_TESTS["browserAction.setBadgeText"].callbackNotSupported) {
|
|
|
- chrome.browserAction.setBadgeText(options, resolve);
|
|
|
+ browserAPI.browserAction.setBadgeText(options, resolve);
|
|
|
} else {
|
|
|
- chrome.browserAction.setBadgeText(options);
|
|
|
+ browserAPI.browserAction.setBadgeText(options);
|
|
|
resolve();
|
|
|
}
|
|
|
} catch (error) {
|
|
|
FEATURE_TESTS["browserAction.setBadgeText"] = { callbackNotSupported: false };
|
|
|
- chrome.browserAction.setBadgeText(options);
|
|
|
+ browserAPI.browserAction.setBadgeText(options);
|
|
|
resolve();
|
|
|
}
|
|
|
}
|
|
|
}),
|
|
|
setBadgeBackgroundColor: options => new Promise((resolve, reject) => {
|
|
|
- if (chrome.runtime.lastError) {
|
|
|
- reject(chrome.runtime.lastError);
|
|
|
+ if (browserAPI.runtime.lastError) {
|
|
|
+ reject(browserAPI.runtime.lastError);
|
|
|
} else {
|
|
|
try {
|
|
|
if (!FEATURE_TESTS["browserAction.setBadgeBackgroundColor"] || !FEATURE_TESTS["browserAction.setBadgeBackgroundColor"].callbackNotSupported) {
|
|
|
- chrome.browserAction.setBadgeBackgroundColor(options, resolve);
|
|
|
+ browserAPI.browserAction.setBadgeBackgroundColor(options, resolve);
|
|
|
} else {
|
|
|
- chrome.browserAction.setBadgeBackgroundColor(options);
|
|
|
+ browserAPI.browserAction.setBadgeBackgroundColor(options);
|
|
|
resolve();
|
|
|
}
|
|
|
} catch (error) {
|
|
|
FEATURE_TESTS["browserAction.setBadgeBackgroundColor"] = { callbackNotSupported: false };
|
|
|
- chrome.browserAction.setBadgeBackgroundColor(options);
|
|
|
+ browserAPI.browserAction.setBadgeBackgroundColor(options);
|
|
|
resolve();
|
|
|
}
|
|
|
}
|
|
|
}),
|
|
|
setTitle: options => new Promise((resolve, reject) => {
|
|
|
- if (chrome.runtime.lastError) {
|
|
|
- reject(chrome.runtime.lastError);
|
|
|
+ if (browserAPI.runtime.lastError) {
|
|
|
+ reject(browserAPI.runtime.lastError);
|
|
|
} else {
|
|
|
try {
|
|
|
if (!FEATURE_TESTS["browserAction.setTitle"] || !FEATURE_TESTS["browserAction.setTitle"].callbackNotSupported) {
|
|
|
- chrome.browserAction.setTitle(options, resolve);
|
|
|
+ browserAPI.browserAction.setTitle(options, resolve);
|
|
|
} else {
|
|
|
- chrome.browserAction.setTitle(options);
|
|
|
+ browserAPI.browserAction.setTitle(options);
|
|
|
resolve();
|
|
|
}
|
|
|
} catch (error) {
|
|
|
FEATURE_TESTS["browserAction.setTitle"] = { callbackNotSupported: false };
|
|
|
- chrome.browserAction.setTitle(options);
|
|
|
+ browserAPI.browserAction.setTitle(options);
|
|
|
resolve();
|
|
|
}
|
|
|
}
|
|
|
}),
|
|
|
setIcon: options => new Promise((resolve, reject) => {
|
|
|
- if (chrome.runtime.lastError) {
|
|
|
- reject(chrome.runtime.lastError);
|
|
|
+ if (browserAPI.runtime.lastError) {
|
|
|
+ reject(browserAPI.runtime.lastError);
|
|
|
} else {
|
|
|
try {
|
|
|
if (!FEATURE_TESTS["browserAction.setIcon"] || !FEATURE_TESTS["browserAction.setIcon"].callbackNotSupported) {
|
|
|
- chrome.browserAction.setIcon(options, resolve);
|
|
|
+ browserAPI.browserAction.setIcon(options, resolve);
|
|
|
} else {
|
|
|
- chrome.browserAction.setIcon(options);
|
|
|
+ browserAPI.browserAction.setIcon(options);
|
|
|
resolve();
|
|
|
}
|
|
|
} catch (error) {
|
|
|
FEATURE_TESTS["browserAction.setIcon"] = { callbackNotSupported: false };
|
|
|
- chrome.browserAction.setIcon(options);
|
|
|
+ browserAPI.browserAction.setIcon(options);
|
|
|
resolve();
|
|
|
}
|
|
|
}
|
|
|
@@ -109,40 +116,40 @@
|
|
|
},
|
|
|
downloads: {
|
|
|
download: options => new Promise((resolve, reject) => {
|
|
|
- chrome.downloads.download(options, downloadId => {
|
|
|
- if (chrome.runtime.lastError) {
|
|
|
- reject(chrome.runtime.lastError);
|
|
|
+ browserAPI.downloads.download(options, downloadId => {
|
|
|
+ if (browserAPI.runtime.lastError) {
|
|
|
+ reject(browserAPI.runtime.lastError);
|
|
|
} else {
|
|
|
resolve(downloadId);
|
|
|
}
|
|
|
});
|
|
|
}),
|
|
|
onChanged: {
|
|
|
- addListener: listener => chrome.downloads.onChanged.addListener(listener),
|
|
|
- removeListener: listener => chrome.downloads.onChanged.removeListener(listener)
|
|
|
+ addListener: listener => browserAPI.downloads.onChanged.addListener(listener),
|
|
|
+ removeListener: listener => browserAPI.downloads.onChanged.removeListener(listener)
|
|
|
}
|
|
|
},
|
|
|
i18n: {
|
|
|
- getMessage: (messageName, substitutions) => chrome.i18n.getMessage(messageName, substitutions)
|
|
|
+ getMessage: (messageName, substitutions) => browserAPI.i18n.getMessage(messageName, substitutions)
|
|
|
},
|
|
|
menus: {
|
|
|
onClicked: {
|
|
|
- addListener: listener => chrome.contextMenus.onClicked.addListener(listener)
|
|
|
+ addListener: listener => browserAPI.contextMenus.onClicked.addListener(listener)
|
|
|
},
|
|
|
- create: options => chrome.contextMenus.create(options),
|
|
|
+ create: options => browserAPI.contextMenus.create(options),
|
|
|
update: (menuItemId, options) => new Promise((resolve, reject) => {
|
|
|
- chrome.contextMenus.update(menuItemId, options, () => {
|
|
|
- if (chrome.runtime.lastError) {
|
|
|
- reject(chrome.runtime.lastError);
|
|
|
+ browserAPI.contextMenus.update(menuItemId, options, () => {
|
|
|
+ if (browserAPI.runtime.lastError) {
|
|
|
+ reject(browserAPI.runtime.lastError);
|
|
|
} else {
|
|
|
resolve();
|
|
|
}
|
|
|
});
|
|
|
}),
|
|
|
removeAll: () => new Promise((resolve, reject) => {
|
|
|
- chrome.contextMenus.removeAll(() => {
|
|
|
- if (chrome.runtime.lastError) {
|
|
|
- reject(chrome.runtime.lastError);
|
|
|
+ browserAPI.contextMenus.removeAll(() => {
|
|
|
+ if (browserAPI.runtime.lastError) {
|
|
|
+ reject(browserAPI.runtime.lastError);
|
|
|
} else {
|
|
|
resolve();
|
|
|
}
|
|
|
@@ -151,7 +158,7 @@
|
|
|
},
|
|
|
runtime: {
|
|
|
onMessage: {
|
|
|
- addListener: listener => chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|
|
+ addListener: listener => browserAPI.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|
|
const response = listener(message, sender);
|
|
|
if (response && typeof response.then == "function") {
|
|
|
response
|
|
|
@@ -169,7 +176,7 @@
|
|
|
})
|
|
|
},
|
|
|
onMessageExternal: {
|
|
|
- addListener: listener => chrome.runtime.onMessageExternal.addListener((message, sender, sendResponse) => {
|
|
|
+ addListener: listener => browserAPI.runtime.onMessageExternal.addListener((message, sender, sendResponse) => {
|
|
|
const response = listener(message, sender);
|
|
|
if (response && typeof response.then == "function") {
|
|
|
response
|
|
|
@@ -187,12 +194,12 @@
|
|
|
})
|
|
|
},
|
|
|
sendMessage: message => new Promise((resolve, reject) =>
|
|
|
- chrome.runtime.sendMessage(message, response => {
|
|
|
- if (chrome.runtime.lastError) {
|
|
|
- if (chrome.runtime.lastError.message == "The message port closed before a response was received.") {
|
|
|
+ browserAPI.runtime.sendMessage(message, response => {
|
|
|
+ if (browserAPI.runtime.lastError) {
|
|
|
+ if (browserAPI.runtime.lastError.message == "The message port closed before a response was received.") {
|
|
|
resolve();
|
|
|
} else {
|
|
|
- reject(chrome.runtime.lastError);
|
|
|
+ reject(browserAPI.runtime.lastError);
|
|
|
}
|
|
|
} else {
|
|
|
resolve(response);
|
|
|
@@ -200,43 +207,43 @@
|
|
|
})
|
|
|
),
|
|
|
getBackgroundPage: () => new Promise((resolve, reject) =>
|
|
|
- chrome.runtime.getBackgroundPage(bgPage => {
|
|
|
- if (chrome.runtime.lastError) {
|
|
|
- reject(chrome.runtime.lastError);
|
|
|
+ browserAPI.runtime.getBackgroundPage(bgPage => {
|
|
|
+ if (browserAPI.runtime.lastError) {
|
|
|
+ reject(browserAPI.runtime.lastError);
|
|
|
} else {
|
|
|
resolve(bgPage);
|
|
|
}
|
|
|
})
|
|
|
),
|
|
|
- getURL: (path) => chrome.runtime.getURL(path),
|
|
|
+ getURL: (path) => browserAPI.runtime.getURL(path),
|
|
|
get lastError() {
|
|
|
- return chrome.runtime.lastError;
|
|
|
+ return browserAPI.runtime.lastError;
|
|
|
}
|
|
|
},
|
|
|
storage: {
|
|
|
local: {
|
|
|
set: value => new Promise((resolve, reject) => {
|
|
|
- chrome.storage.local.set(value, () => {
|
|
|
- if (chrome.runtime.lastError) {
|
|
|
- reject(chrome.runtime.lastError);
|
|
|
+ browserAPI.storage.local.set(value, () => {
|
|
|
+ if (browserAPI.runtime.lastError) {
|
|
|
+ reject(browserAPI.runtime.lastError);
|
|
|
} else {
|
|
|
resolve();
|
|
|
}
|
|
|
});
|
|
|
}),
|
|
|
get: () => new Promise((resolve, reject) => {
|
|
|
- chrome.storage.local.get(value => {
|
|
|
- if (chrome.runtime.lastError) {
|
|
|
- reject(chrome.runtime.lastError);
|
|
|
+ browserAPI.storage.local.get(null, value => {
|
|
|
+ if (browserAPI.runtime.lastError) {
|
|
|
+ reject(browserAPI.runtime.lastError);
|
|
|
} else {
|
|
|
resolve(value);
|
|
|
}
|
|
|
});
|
|
|
}),
|
|
|
clear: () => new Promise((resolve, reject) => {
|
|
|
- chrome.storage.local.clear(() => {
|
|
|
- if (chrome.runtime.lastError) {
|
|
|
- reject(chrome.runtime.lastError);
|
|
|
+ browserAPI.storage.local.clear(() => {
|
|
|
+ if (browserAPI.runtime.lastError) {
|
|
|
+ reject(browserAPI.runtime.lastError);
|
|
|
} else {
|
|
|
resolve();
|
|
|
}
|
|
|
@@ -246,33 +253,33 @@
|
|
|
},
|
|
|
tabs: {
|
|
|
onCreated: {
|
|
|
- addListener: listener => chrome.tabs.onCreated.addListener(listener)
|
|
|
+ addListener: listener => browserAPI.tabs.onCreated.addListener(listener)
|
|
|
},
|
|
|
onActivated: {
|
|
|
- addListener: listener => chrome.tabs.onActivated.addListener(listener)
|
|
|
+ addListener: listener => browserAPI.tabs.onActivated.addListener(listener)
|
|
|
},
|
|
|
onUpdated: {
|
|
|
- addListener: listener => chrome.tabs.onUpdated.addListener(listener)
|
|
|
+ addListener: listener => browserAPI.tabs.onUpdated.addListener(listener)
|
|
|
},
|
|
|
onRemoved: {
|
|
|
- addListener: listener => chrome.tabs.onRemoved.addListener(listener)
|
|
|
+ addListener: listener => browserAPI.tabs.onRemoved.addListener(listener)
|
|
|
},
|
|
|
executeScript: (tabId, details) => new Promise((resolve, reject) => {
|
|
|
- chrome.tabs.executeScript(tabId, details, () => {
|
|
|
- if (chrome.runtime.lastError) {
|
|
|
- reject(chrome.runtime.lastError);
|
|
|
+ browserAPI.tabs.executeScript(tabId, details, () => {
|
|
|
+ if (browserAPI.runtime.lastError) {
|
|
|
+ reject(browserAPI.runtime.lastError);
|
|
|
} else {
|
|
|
resolve();
|
|
|
}
|
|
|
});
|
|
|
}),
|
|
|
sendMessage: (tabId, message, options = {}) => new Promise((resolve, reject) =>
|
|
|
- chrome.tabs.sendMessage(tabId, message, options, response => {
|
|
|
- if (chrome.runtime.lastError) {
|
|
|
- if (chrome.runtime.lastError.message == "The message port closed before a response was received.") {
|
|
|
+ browserAPI.tabs.sendMessage(tabId, message, options, response => {
|
|
|
+ if (browserAPI.runtime.lastError) {
|
|
|
+ if (browserAPI.runtime.lastError.message == "The message port closed before a response was received.") {
|
|
|
resolve();
|
|
|
} else {
|
|
|
- reject(chrome.runtime.lastError);
|
|
|
+ reject(browserAPI.runtime.lastError);
|
|
|
}
|
|
|
} else {
|
|
|
resolve(response);
|
|
|
@@ -280,25 +287,25 @@
|
|
|
})
|
|
|
),
|
|
|
query: options => new Promise((resolve, reject) => {
|
|
|
- chrome.tabs.query(options, tabs => {
|
|
|
- if (chrome.runtime.lastError) {
|
|
|
- reject(chrome.runtime.lastError);
|
|
|
+ browserAPI.tabs.query(options, tabs => {
|
|
|
+ if (browserAPI.runtime.lastError) {
|
|
|
+ reject(browserAPI.runtime.lastError);
|
|
|
} else {
|
|
|
resolve(tabs);
|
|
|
}
|
|
|
});
|
|
|
}),
|
|
|
get: options => new Promise((resolve, reject) => {
|
|
|
- chrome.tabs.get(options, tab => {
|
|
|
- if (chrome.runtime.lastError) {
|
|
|
- reject(chrome.runtime.lastError);
|
|
|
+ browserAPI.tabs.get(options, tab => {
|
|
|
+ if (browserAPI.runtime.lastError) {
|
|
|
+ reject(browserAPI.runtime.lastError);
|
|
|
} else {
|
|
|
resolve(tab);
|
|
|
}
|
|
|
});
|
|
|
})
|
|
|
}
|
|
|
- };
|
|
|
+ }));
|
|
|
}
|
|
|
|
|
|
})();
|