diff --git a/.eslintrc b/.eslintrc index cd1da2b6..57cedd6d 100644 --- a/.eslintrc +++ b/.eslintrc @@ -10,7 +10,7 @@ "standard" ], "globals": { - "chrome": false, + "browser": false, }, "rules": { "block-scoped-var": "error", diff --git a/src/background/background.js b/src/background/background.js index 654f71e8..624b5c85 100644 --- a/src/background/background.js +++ b/src/background/background.js @@ -118,9 +118,9 @@ function main() { // NOTE: "This event is not triggered for temporarily installed add-ons." // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/runtime/onInstalled#Compatibility_notes - if (chrome.runtime.onInstalled) { + if (browser.runtime.onInstalled) { // NOTE: the onInstalled listener can't be added asynchronously - chrome.runtime.onInstalled.addListener(onExtensionInstalledHandler); + browser.runtime.onInstalled.addListener(onExtensionInstalledHandler); } else { onExtensionInstalledHandler(); } @@ -152,27 +152,27 @@ function main() { }()); (function addChromeListeners() { - chrome.tabs.onRemoved.addListener(() => talkieBackground.onTabRemovedHandler()); - chrome.tabs.onUpdated.addListener(() => talkieBackground.onTabUpdatedHandler()); + browser.tabs.onRemoved.addListener(() => talkieBackground.onTabRemovedHandler()); + browser.tabs.onUpdated.addListener(() => talkieBackground.onTabUpdatedHandler()); // NOTE: not supported in Firefox (2017-03-15). // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/runtime/onSuspend#Browser_compatibility - if (chrome.runtime.onSuspend) { - chrome.runtime.onSuspend.addListener(() => talkieBackground.onExtensionSuspendHandler()); + if (browser.runtime.onSuspend) { + browser.runtime.onSuspend.addListener(() => talkieBackground.onExtensionSuspendHandler()); } // NOTE: used when the popup has been disabled. - chrome.browserAction.onClicked.addListener(() => talkieBackground.startStopSpeakSelectionOnPage()); + browser.browserAction.onClicked.addListener(() => talkieBackground.startStopSpeakSelectionOnPage()); - chrome.contextMenus.onClicked.addListener((info) => contextMenuManager.contextMenuClickAction(info)); + browser.contextMenus.onClicked.addListener((info) => contextMenuManager.contextMenuClickAction(info)); // NOTE: might throw an unexpected error in Firefox due to command configuration in manifest.json. // Does not seem to happen in Chrome. // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/commands/onCommand try { - chrome.commands.onCommand.addListener((command) => shortcutKeyManager.handler(command)); + browser.commands.onCommand.addListener((command) => shortcutKeyManager.handler(command)); } catch (error) { - logError("chrome.commands.onCommand.addListener(...)", error); + logError("browser.commands.onCommand.addListener(...)", error); } }()); diff --git a/src/background/button-popup-manager.js b/src/background/button-popup-manager.js index cf414085..8b522e54 100644 --- a/src/background/button-popup-manager.js +++ b/src/background/button-popup-manager.js @@ -20,8 +20,8 @@ along with Talkie. If not, see . export default class ButtonPopupManager { constructor() { - this.buttonDefaultTitle = chrome.i18n.getMessage("buttonDefaultTitle"); - this.buttonStopTitle = chrome.i18n.getMessage("buttonStopTitle"); + this.buttonDefaultTitle = browser.i18n.getMessage("buttonDefaultTitle"); + this.buttonStopTitle = browser.i18n.getMessage("buttonStopTitle"); } disablePopup() { @@ -29,13 +29,13 @@ export default class ButtonPopupManager { popup: "", }; - chrome.browserAction.setPopup(disablePopupOptions); + browser.browserAction.setPopup(disablePopupOptions); const disableIconTitleOptions = { title: this.buttonStopTitle, }; - chrome.browserAction.setTitle(disableIconTitleOptions); + browser.browserAction.setTitle(disableIconTitleOptions); }; enablePopup() { @@ -43,12 +43,12 @@ export default class ButtonPopupManager { popup: "src/popup/popup.html", }; - chrome.browserAction.setPopup(enablePopupOptions); + browser.browserAction.setPopup(enablePopupOptions); const enableIconTitleOptions = { title: this.buttonDefaultTitle, }; - chrome.browserAction.setTitle(enableIconTitleOptions); + browser.browserAction.setTitle(enableIconTitleOptions); }; } diff --git a/src/background/context-menu-manager.js b/src/background/context-menu-manager.js index 8cbe1e1e..f5e35b5c 100644 --- a/src/background/context-menu-manager.js +++ b/src/background/context-menu-manager.js @@ -33,35 +33,35 @@ export default class ContextMenuManager { this.contextMenuOptionsCollection = { selectionContextMenuStartStop: { id: "talkie-context-menu-start-stop", - title: chrome.i18n.getMessage("contextMenuStartStopText"), + title: browser.i18n.getMessage("contextMenuStartStopText"), contexts: [ "selection", ], }, buttonContextMenuStartStopDescription: { id: "start-stop", - title: chrome.i18n.getMessage("commandStartStopDescription"), + title: browser.i18n.getMessage("commandStartStopDescription"), contexts: [ "browser_action", ], }, buttonContextMenuOpenWebsiteMainDescription: { id: "open-website-main", - title: chrome.i18n.getMessage("commandOpenWebsiteMainDescription"), + title: browser.i18n.getMessage("commandOpenWebsiteMainDescription"), contexts: [ "browser_action", ], }, buttonContextMenuOpenWebsiteChromeWebStoreDescription: { id: "open-website-chromewebstore", - title: chrome.i18n.getMessage("commandOpenWebsiteChromeWebStoreDescription"), + title: browser.i18n.getMessage("commandOpenWebsiteChromeWebStoreDescription"), contexts: [ "browser_action", ], }, buttonContextMenuOpenWebsiteDonateDescription: { id: "open-website-donate", - title: chrome.i18n.getMessage("commandOpenWebsiteDonateDescription"), + title: browser.i18n.getMessage("commandOpenWebsiteDonateDescription"), contexts: [ "browser_action", ], @@ -75,11 +75,11 @@ export default class ContextMenuManager { try { log("Start", "Creating context menu", contextMenuOptions); - chrome.contextMenus.create( + browser.contextMenus.create( contextMenuOptions, () => { - if (chrome.runtime.lastError) { - return reject(chrome.runtime.lastError); + if (browser.runtime.lastError) { + return reject(browser.runtime.lastError); } log("Done", "Creating context menu", contextMenuOptions); diff --git a/src/background/icon-manager.js b/src/background/icon-manager.js index 35378ba0..f4e4daac 100644 --- a/src/background/icon-manager.js +++ b/src/background/icon-manager.js @@ -52,11 +52,11 @@ export default class IconManager { path: paths, }; - chrome.browserAction.setIcon( + browser.browserAction.setIcon( details, () => { - if (chrome.runtime.lastError) { - return reject(chrome.runtime.lastError); + if (browser.runtime.lastError) { + return reject(browser.runtime.lastError); } log("Done", "Changing icon to", name); diff --git a/src/background/language.js b/src/background/language.js index c6a84f61..c0e94589 100644 --- a/src/background/language.js +++ b/src/background/language.js @@ -41,26 +41,26 @@ import { } from "../shared/configuration"; const noTextSelectedMessage = { - text: chrome.i18n.getMessage("noTextSelectedMessage"), + text: browser.i18n.getMessage("noTextSelectedMessage"), effectiveLanguage: messagesLocale, }; const noVoiceForLanguageDetectedMessage = { - text: chrome.i18n.getMessage("noVoiceForLanguageDetectedMessage"), - effectiveLanguage: chrome.i18n.getMessage("noVoiceForLanguageDetectedMessageLanguage"), + text: browser.i18n.getMessage("noVoiceForLanguageDetectedMessage"), + effectiveLanguage: browser.i18n.getMessage("noVoiceForLanguageDetectedMessageLanguage"), }; export const detectPageLanguage = () => new Promise( (resolve, reject) => { try { - chrome.tabs.detectLanguage((language) => { - // https://developer.chrome.com/extensions/tabs#method-detectLanguage - if (chrome.runtime.lastError) { + browser.tabs.detectLanguage((language) => { + // https://developer.browser.com/extensions/tabs#method-detectLanguage + if (browser.runtime.lastError) { // https://github.com/joelpurra/talkie/issues/3 // NOTE: It seems the Vivaldi browser doesn't (yet/always) support detectLanguage. // As this is not critical, just log the error and resolve with null. - // return reject(chrome.runtime.lastError); - logError("detectPageLanguage", chrome.runtime.lastError); + // return reject(browser.runtime.lastError); + logError("detectPageLanguage", browser.runtime.lastError); return resolve(null); } @@ -83,17 +83,17 @@ export const detectPageLanguage = () => new Promise( const detectTextLanguage = (text) => new Promise( (resolve, reject) => { try { - if (!("detectLanguage" in chrome.i18n)) { + if (!("detectLanguage" in browser.i18n)) { // NOTE: text-based language detection is only used as a fallback. log("detectTextLanguage", "Browser does not support detecting text language"); return resolve(null); } - chrome.i18n.detectLanguage(text, (result) => { - // https://developer.chrome.com/extensions/i18n#method-detectLanguage - if (chrome.runtime.lastError) { - return reject(chrome.runtime.lastError); + browser.i18n.detectLanguage(text, (result) => { + // https://developer.browser.com/extensions/i18n#method-detectLanguage + if (browser.runtime.lastError) { + return reject(browser.runtime.lastError); } // The language fallback value is "und", so treat it as no language. diff --git a/src/background/suspension-manager.js b/src/background/suspension-manager.js index ff6d488c..28f4728c 100644 --- a/src/background/suspension-manager.js +++ b/src/background/suspension-manager.js @@ -42,7 +42,7 @@ export default class SuspensionManager { name: this.preventSuspensionPortName, }; - this.executeConnectFromContentCode = `var talkiePreventSuspensionPort = chrome.runtime.connect(${JSON.stringify(this.preventSuspensionConnectOptions)}); var preventExtensionSuspendConnectFromContentResult = { name: talkiePreventSuspensionPort.name }; preventExtensionSuspendConnectFromContentResult`; + this.executeConnectFromContentCode = `var talkiePreventSuspensionPort = browser.runtime.connect(${JSON.stringify(this.preventSuspensionConnectOptions)}); var preventExtensionSuspendConnectFromContentResult = { name: talkiePreventSuspensionPort.name }; preventExtensionSuspendConnectFromContentResult`; } executeConnectFromContent() { @@ -74,7 +74,7 @@ export default class SuspensionManager { return; } - // NOTE: the chrome.runtime.onConnect event is triggered once per frame on the page. + // NOTE: the browser.runtime.onConnect event is triggered once per frame on the page. // Save the first port, ignore the rest. if (this.preventSuspensionProducingPort !== null) { return; @@ -87,7 +87,7 @@ export default class SuspensionManager { this.preventSuspensionIntervalId = setInterval(messageProducer, 1000); }; - chrome.runtime.onConnect.addListener(onConnectProducingHandler); + browser.runtime.onConnect.addListener(onConnectProducingHandler); log("Done", "preventExtensionSuspend"); @@ -103,7 +103,7 @@ export default class SuspensionManager { if (this.preventSuspensionProducingPort !== null) { try { - // https://developer.chrome.com/extensions/runtime#type-Port + // https://developer.browser.com/extensions/runtime#type-Port // NOTE: should work irregardless if the port was connected or not. this.preventSuspensionProducingPort.disconnect(); } catch (error) { diff --git a/src/background/talkie-background.js b/src/background/talkie-background.js index 5c6edbe7..d9df759b 100644 --- a/src/background/talkie-background.js +++ b/src/background/talkie-background.js @@ -46,7 +46,7 @@ export default class TalkieBackground { this.speakingStatus = speakingStatus; this.notAbleToSpeakTextFromThisSpecialTab = { - text: chrome.i18n.getMessage("notAbleToSpeakTextFromThisSpecialTab"), + text: browser.i18n.getMessage("notAbleToSpeakTextFromThisSpecialTab"), effectiveLanguage: messagesLocale, }; } @@ -155,7 +155,7 @@ export default class TalkieBackground { return this.speakingStatus.isSpeakingTabId(tabId) .then((isTabSpeaking) => { // NOTE: changeInfo only has properties which have changed. - // https://developer.chrome.com/extensions/tabs#event-onUpdated + // https://developer.browser.com/extensions/tabs#event-onUpdated if (isTabSpeaking && changeInfo.url) { return this.talkieSpeaker.stopSpeaking() .then(() => this.speakingStatus.setTabIsDoneSpeaking(tabId)); diff --git a/src/frontend/shared-frontend.js b/src/frontend/shared-frontend.js index ee115007..96fa794c 100644 --- a/src/frontend/shared-frontend.js +++ b/src/frontend/shared-frontend.js @@ -51,7 +51,7 @@ const translateWindow = () => promiseTry( const translationId = element.getAttribute(translateAttributeName); if (typeof translationId === "string" && translationId.length > 0) { - const translated = chrome.i18n.getMessage(translationId); + const translated = browser.i18n.getMessage(translationId); if (typeof translated === "string") { element.textContent = translated; @@ -96,14 +96,14 @@ const addLinkClickHandlers = () => promiseTry( const addOptionsLinkClickHandlers = () => promiseTry( () => { - // https://developer.chrome.com/extensions/optionsV2#linking + // https://developer.browser.com/extensions/optionsV2#linking const optionsLinks = Array.from(document.querySelectorAll("[href='" + urls.options + "']")); optionsLinks.forEach((optionsLink) => { optionsLink.onclick = (event) => { event.preventDefault(); - chrome.runtime.openOptionsPage(); + browser.runtime.openOptionsPage(); return false; }; diff --git a/src/options/options.html b/src/options/options.html index a26c3f7e..c912cbd6 100644 --- a/src/options/options.html +++ b/src/options/options.html @@ -58,13 +58,13 @@