Skip to content

Commit

Permalink
Use Javascript callbacks to know when to translate
Browse files Browse the repository at this point in the history
  • Loading branch information
Brandon-T committed Feb 25, 2025
1 parent faf35c9 commit 0176850
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -183,12 +183,6 @@ class BraveTranslateTabHelper: NSObject {
let translationSession = self.translationSession ?? BraveTranslateSession()
let isTranslationRequest = BraveTranslateSession.isPhraseTranslationRequest(request)

// We cannot process translation requests when translation is not enabled
// Other requests like fetching the core script and css can be processed
if Preferences.Translate.translateEnabled.value != true && isTranslationRequest {
throw BraveTranslateError.translateDisabled
}

// The message is for HTML or CSS request
if self.translationSession == nil
&& isTranslationRequest
Expand Down Expand Up @@ -331,10 +325,6 @@ class BraveTranslateTabHelper: NSObject {
state: isTranslationSupported ? .available : .unavailable
)

if !isTranslationSupported {
return
}

try Task.checkCancellation()

// Check if the user can view the translation onboarding
Expand Down Expand Up @@ -363,6 +353,14 @@ class BraveTranslateTabHelper: NSObject {

// User enabled translation via onboarding
if translateEnabled == true {
// Lazy loading. Load the translate script if needed.
_ = try await tab.webView?.callAsyncJavaScript(
"return await window.__firefox__.\(BraveTranslateScriptHandler.namespace).loadTranslateScript();",
arguments: [:],
contentWorld: BraveTranslateScriptHandler.scriptSandbox
)

// Automatically translate
startTranslation(canShowToast: true)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,11 @@ class BraveTranslateScriptHandler: NSObject, TabContentScript {
body: [String: Any]
) async throws -> (Any?, String?) {
if command == "load_brave_translate_script" {
let script = try await BraveTranslateScriptHandler.elementScriptTask.value
return (script, nil)
if Preferences.Translate.translateEnabled.value == true {
let script = try await BraveTranslateScriptHandler.elementScriptTask.value
return (script, nil)
}
return (nil, BraveTranslateError.translateDisabled.rawValue)
}

if command == "ready" {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,21 +33,42 @@ Object.defineProperty(window.__firefox__, "$<brave_translate_script>", {
}, 100);
}),
"loadTranslateScript": (function() {
if (window.__firefox__.$<brave_translate_script>.translateScriptLoaded) {
return;
}

window.webkit.messageHandlers["$<message_handler>"].postMessage({
"command": "load_brave_translate_script"
}).then((script) => {
try {
new Function(script).call(window /*this*/);
window.__firefox__.$<brave_translate_script>.translateScriptLoaded = true
} catch (error) {
cr.googleTranslate.onTranslateElementError(error);
return new Promise((resolve, reject) => {
if (window.__firefox__.$<brave_translate_script>.translateScriptLoaded) {
return resolve();
}
}).catch((error) => {
cr.googleTranslate.onTranslateElementError(error);

window.webkit.messageHandlers["$<message_handler>"].postMessage({
"command": "load_brave_translate_script"
}).then((script) => {
try {
cr.googleTranslate.readyCallback = () => {
cr.googleTranslate.readyCallback = null;
resolve();
}

new Function(script).call(window /*this*/);
window.__firefox__.$<brave_translate_script>.translateScriptLoaded = true;

if ((cr.googleTranslate.libReady || cr.googleTranslate.finished) && cr.googleTranslate.readyCallback) {
cr.googleTranslate.readyCallback = null;
resolve();
}

setTimeout(() => {
if (cr.googleTranslate.readyCallback) {
cr.googleTranslate.readyCallback = null;
resolve();
}
}, 3000);
} catch (error) {
cr.googleTranslate.onTranslateElementError(error);
reject(error);
}
}).catch((error) => {
cr.googleTranslate.onTranslateElementError(error);
reject(error);
});
});
})
}
Expand Down

0 comments on commit 0176850

Please sign in to comment.