From f07eaa19399d92f87a3c25dd7ff5c0b994b30b11 Mon Sep 17 00:00:00 2001 From: Brandon T Date: Fri, 28 Feb 2025 18:10:18 -0500 Subject: [PATCH 1/2] Fix translate on iPad when in Desktop User-Agent and History changes with Page Cache --- .../BraveTranslateTabHelper.swift | 2 ++ .../BrowserViewController/BVC+Translate.swift | 2 +- .../Scripts/Sandboxed/BraveTranslateScript.js | 20 ++++++++++++++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/ios/brave-ios/Sources/Brave/Frontend/Brave Translate/BraveTranslateTabHelper.swift b/ios/brave-ios/Sources/Brave/Frontend/Brave Translate/BraveTranslateTabHelper.swift index a2a0da178ca9..54c25a4388dd 100644 --- a/ios/brave-ios/Sources/Brave/Frontend/Brave Translate/BraveTranslateTabHelper.swift +++ b/ios/brave-ios/Sources/Brave/Frontend/Brave Translate/BraveTranslateTabHelper.swift @@ -67,6 +67,8 @@ class BraveTranslateTabHelper: NSObject { self.url = url self.isTranslationReady = false self.canShowToast = false + self.currentLanguageInfo = BraveTranslateLanguageInfo() + self.translationTask = nil self.delegate?.updateTranslateURLBar(tab: self.tab, state: .unavailable) } } diff --git a/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+Translate.swift b/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+Translate.swift index 69932cca69ff..e6f821e600f7 100644 --- a/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+Translate.swift +++ b/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+Translate.swift @@ -51,7 +51,7 @@ extension BrowserViewController: BraveTranslateScriptHandlerDelegate { // Ensure url bar is expanded before presenting a popover on it toolbarVisibilityViewModel.toolbarState = .expanded - DispatchQueue.main.async { + DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { let popover = PopoverController( content: OnboardingTranslateView( onContinueButtonPressed: { [weak self, weak tab] in diff --git a/ios/brave-ios/Sources/Brave/Frontend/UserContent/UserScripts/Scripts_Dynamic/Scripts/Sandboxed/BraveTranslateScript.js b/ios/brave-ios/Sources/Brave/Frontend/UserContent/UserScripts/Scripts_Dynamic/Scripts/Sandboxed/BraveTranslateScript.js index 9b6d6223291b..c773c8835e3c 100644 --- a/ios/brave-ios/Sources/Brave/Frontend/UserContent/UserScripts/Scripts_Dynamic/Scripts/Sandboxed/BraveTranslateScript.js +++ b/ios/brave-ios/Sources/Brave/Frontend/UserContent/UserScripts/Scripts_Dynamic/Scripts/Sandboxed/BraveTranslateScript.js @@ -21,9 +21,27 @@ Object.defineProperty(window.__firefox__, "$", { "getRawPageSource": (function() { return document.documentElement.outerText; }), + "hasNoTranslate": (function() { + for (const metaTag of document.getElementsByTagName('meta')) { + if (metaTag.name === 'google') { + if (metaTag.content === 'notranslate' || + metaTag.getAttribute('value') === 'notranslate') { + return true; + } + } + } + return false; + }), + "isSameLanguage": (function() { + let userLanguage = (navigator.language || navigator.userLanguage).split('-')[0]; + let pageLanguage = document.documentElement.lang + return userLanguage == pageLanguage; + }), "checkTranslate": (function() { try { - if ((cr.googleTranslate.libReady || cr.googleTranslate.finished) && !cr.googleTranslate.readyCallback) { + if ((cr.googleTranslate.libReady || cr.googleTranslate.finished) && + !cr.googleTranslate.readyCallback && + !window.__firefox__.$.isSameLanguage()) { window.webkit.messageHandlers["$"].postMessage({ "command": "ready" }); From c22520a15ac0d7ff66818e5138c0fcfc13ee1c8f Mon Sep 17 00:00:00 2001 From: Brandon T Date: Fri, 28 Feb 2025 18:44:39 -0500 Subject: [PATCH 2/2] Fix a bug in Brave's Javascript on iOS 16.4.1 where it does NOT see global const variables in a function callback! --- .../Scripts/Sandboxed/BraveTranslateScript.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/ios/brave-ios/Sources/Brave/Frontend/UserContent/UserScripts/Scripts_Dynamic/Scripts/Sandboxed/BraveTranslateScript.js b/ios/brave-ios/Sources/Brave/Frontend/UserContent/UserScripts/Scripts_Dynamic/Scripts/Sandboxed/BraveTranslateScript.js index c773c8835e3c..3696fc2817d1 100644 --- a/ios/brave-ios/Sources/Brave/Frontend/UserContent/UserScripts/Scripts_Dynamic/Scripts/Sandboxed/BraveTranslateScript.js +++ b/ios/brave-ios/Sources/Brave/Frontend/UserContent/UserScripts/Scripts_Dynamic/Scripts/Sandboxed/BraveTranslateScript.js @@ -151,10 +151,10 @@ try { } }; - const emptySvgDataUrl = 'data:image/svg+xml;base64,' + btoa(''); - // Make replacements in loading .js files. function processJavascript(text) { + const emptySvgDataUrl = 'data:image/svg+xml;base64,' + btoa(''); + // Replace gen204 telemetry requests with loading an empty svg. text = text.replaceAll('"//"+po+"/gen204?"+Bo(b)', '"' + emptySvgDataUrl + '"'); @@ -166,6 +166,8 @@ try { // Make replacements in loading .css files. function processCSS(text) { + const emptySvgDataUrl = 'data:image/svg+xml;base64,' + btoa(''); + // Used in the injected elements, that are currently not visible. Replace it // to hide the loading error in devtools (because of CSP). text = text.replaceAll('//www.gstatic.com/images/branding/product/2x/translate_24dp.png', emptySvgDataUrl); @@ -309,17 +311,17 @@ try { xhr.send(); } - // The styles to hide root elements that are injected by the scripts in the DOM. - // Currently they are always invisible. The styles are added in case of changes - // in future versions. - const braveExtraStyles = `.goog-te-spinner-pos, #goog-gt-tt {display: none;}` - // An overridden version of onLoadCSS from translate.js. // The differences: // 1. change url via rewriteUrl(); // 2. process the loaded styles via processCSS(). // 3. Add braveExtraStyles in the end. cr.googleTranslate.onLoadCSS = function(url) { + // The styles to hide root elements that are injected by the scripts in the DOM. + // Currently they are always invisible. The styles are added in case of changes + // in future versions. + const braveExtraStyles = `.goog-te-spinner-pos, #goog-gt-tt {display: none;}` + const xhr = new XMLHttpRequest(); xhr.open('GET', rewriteUrl(url), true); xhr.onreadystatechange = function() {