From 6489c407786296e76f6e39ce38de28ec0a22e8fc Mon Sep 17 00:00:00 2001 From: Hai Phan Date: Sat, 14 Aug 2021 13:37:25 -0700 Subject: [PATCH] fix GoogleTranslate --- _locales/en/messages.json | 3 +++ js/defaults.js | 4 ++++ js/events.js | 24 ++++++++++++++++++++++++ js/firefox-perm.js | 1 + js/popup.js | 14 ++++++++++++-- js/speech.js | 1 + js/tts-engines.js | 6 +++++- manifest.json | 1 + 8 files changed, 51 insertions(+), 3 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 595156bf..f2546d45 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -104,6 +104,9 @@ "error_wavenet_auth_required": { "message": "You need to grant additional [permissions](auth-wavenet) to enable Google Wavenet voices" }, + "error_gtranslate_auth_required": { + "message": "You need to grant additional [permissions](auth-gtranslate) to enable Google Translate voices" + }, "error_user_gesture_required": { "message": "Click [here](user-gesture) to start" }, diff --git a/js/defaults.js b/js/defaults.js index 4270e078..5432b05f 100644 --- a/js/defaults.js +++ b/js/defaults.js @@ -26,6 +26,10 @@ var config = { permissions: ["webRequest"], origins: ["https://*/"] }, + gtranslatePerms: { + permissions: ["webRequest", "webRequestBlocking"], + origins: ["https://translate.google.com/*"] + }, } var defaults = { diff --git a/js/events.js b/js/events.js index 9ae97311..f1fef24f 100644 --- a/js/events.js +++ b/js/events.js @@ -6,6 +6,11 @@ silenceLoop.loop = true; brapi.runtime.onInstalled.addListener(installContextMenus); if (getBrowser() == "firefox") brapi.runtime.onStartup.addListener(installContextMenus); +hasPermissions(config.gtranslatePerms) + .then(function(granted) { + if (granted) authGoogleTranslate() + }) + /** * IPC handlers @@ -289,6 +294,25 @@ function authWavenet() { }) } +function authGoogleTranslate() { + console.info("Installing GoogleTranslate XHR hook") + brapi.webRequest.onBeforeSendHeaders.removeListener(googleTranslateXhrHook) + brapi.webRequest.onBeforeSendHeaders.addListener(googleTranslateXhrHook, { + urls: config.gtranslatePerms.origins, + types: ["xmlhttprequest"] + }, [ + "blocking", "requestHeaders" + ]) +} + +function googleTranslateXhrHook(details) { + var header = details.requestHeaders.find(function(h) {return h.name == "Sec-Fetch-Site"}) + if (header && header.value == "cross-site") header.value = "none" + return { + requestHeaders: details.requestHeaders + } +} + function userGestureActivate() { var audio = document.createElement("AUDIO"); audio.src = "data:audio/wav;base64,UklGRjIAAABXQVZFZm10IBIAAAABAAEAQB8AAEAfAAABAAgAAABmYWN0BAAAAAAAAABkYXRhAAAAAA=="; diff --git a/js/firefox-perm.js b/js/firefox-perm.js index 0d70e579..6b6d3f6a 100644 --- a/js/firefox-perm.js +++ b/js/firefox-perm.js @@ -10,6 +10,7 @@ $(function() { if (granted) { $("#success").show(); if (query.then == "auth-wavenet") getBackgroundPage().then(callMethod("authWavenet")).then(closeThisTab); + else if (query.then == "auth-gtranslate") getBackgroundPage().then(callMethod("authGoogleTranslate")) } else $("#error").show(); }) diff --git a/js/popup.js b/js/popup.js index 5b8e9e2e..19546c49 100644 --- a/js/popup.js +++ b/js/popup.js @@ -58,8 +58,10 @@ function handleError(err) { break; case "#auth-wavenet": if (getBrowser() == "firefox") { - createTab(brapi.runtime.getURL("firefox-perm.html") + "?perms=" + encodeURIComponent(JSON.stringify(config.wavenetPerms)) + "&then=auth-wavenet"); - window.close(); + createTab(brapi.runtime.getURL("firefox-perm.html") + "?perms=" + encodeURIComponent(JSON.stringify(config.wavenetPerms)) + "&then=auth-wavenet") + .then(function() { + window.close() + }) break; } requestPermissions(config.wavenetPerms) @@ -67,6 +69,14 @@ function handleError(err) { if (granted) bgPageInvoke("authWavenet"); }) break; + case "#auth-gtranslate": + if (getBrowser() == "firefox") { + createTab(brapi.runtime.getURL("firefox-perm.html") + "?perms=" + encodeURIComponent(JSON.stringify(config.gtranslatePerms)) + "&then=auth-gtranslate") + .then(function() { + window.close() + }) + } + break; case "#user-gesture": getBackgroundPage() .then(callMethod("userGestureActivate")) diff --git a/js/speech.js b/js/speech.js index 4b15b528..525a1343 100644 --- a/js/speech.js +++ b/js/speech.js @@ -32,6 +32,7 @@ function Speech(texts, options) { return googleTranslateTtsEngine.ready() .then(function() {return googleTranslateTtsEngine}) .catch(function(err) { + if (/^{/.test(err.message)) throw err console.error(err); options.voice.autoSelect = true; return remoteTtsEngine; diff --git a/js/tts-engines.js b/js/tts-engines.js index 92e77c02..687dbc97 100644 --- a/js/tts-engines.js +++ b/js/tts-engines.js @@ -372,7 +372,11 @@ function GoogleTranslateTtsEngine() { var isSpeaking = false; var speakPromise; this.ready = function() { - return googleTranslateReady(); + return hasPermissions(config.gtranslatePerms) + .then(function(granted) { + if (!granted) throw new Error(JSON.stringify({code: "error_gtranslate_auth_required"})) + }) + .then(googleTranslateReady) }; this.speak = function(utterance, options, onEvent) { if (!options.volume) options.volume = 1; diff --git a/manifest.json b/manifest.json index e77a645d..48ad1731 100644 --- a/manifest.json +++ b/manifest.json @@ -34,6 +34,7 @@ ], "optional_permissions": [ "webRequest", + "webRequestBlocking", "webNavigation", "http://*/", "https://*/",