1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
|
// Copyright 2011 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_TRANSLATE_CONTENT_RENDERER_TRANSLATE_AGENT_H_
#define COMPONENTS_TRANSLATE_CONTENT_RENDERER_TRANSLATE_AGENT_H_
#include <memory>
#include <optional>
#include <string>
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/weak_ptr.h"
#include "base/task/single_thread_task_runner.h"
#include "base/time/time.h"
#include "components/language_detection/content/renderer/language_detection_agent.h"
#include "components/translate/content/common/translate.mojom.h"
#include "components/translate/core/common/translate_errors.h"
#include "components/translate/core/language_detection/language_detection_model.h"
#include "content/public/renderer/render_frame_observer.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "url/gurl.h"
namespace blink {
class WebLocalFrame;
}
namespace translate {
// This class deals with page translation.
// There is one TranslateAgent per RenderView.
class TranslateAgent : public content::RenderFrameObserver,
public mojom::TranslateAgent {
public:
TranslateAgent(content::RenderFrame* render_frame, int world_id);
TranslateAgent(const TranslateAgent&) = delete;
TranslateAgent& operator=(const TranslateAgent&) = delete;
~TranslateAgent() override;
// Informs us that the page's text has been extracted.
void PageCaptured(scoped_refptr<const base::RefCountedString16> contents);
// Updates page registration in translate driver.
void RenewPageRegistration();
// Lets the translation system know that we are preparing to navigate to
// the specified URL. If there is anything that can or should be done before
// this URL loads, this is the time to prepare for it.
void PrepareForUrl(const GURL& url);
// mojom::TranslateAgent implementation.
void TranslateFrame(const std::string& translate_script,
const std::string& source_lang,
const std::string& target_lang,
TranslateFrameCallback callback) override;
void RevertTranslation() override;
// Set the language detection model for used by |this|. For testing only.
void SeedLanguageDetectionModelForTesting(base::File model_file);
protected:
// Returns true if the translate library is available, meaning the JavaScript
// has already been injected in that page.
virtual bool IsTranslateLibAvailable();
// Returns true if the translate library has been initialized successfully.
virtual bool IsTranslateLibReady();
// Returns true if the translation script has finished translating the page.
virtual bool HasTranslationFinished();
// Returns true if the translation script has reported an error performing the
// translation.
virtual bool HasTranslationFailed();
// Returns the error code generated in translate library.
virtual int64_t GetErrorCode();
// Starts the translation by calling the translate library. This method
// should only be called when the translate script has been injected in the
// page. Returns false if the call failed immediately.
virtual bool StartTranslation();
// Asks the Translate element in the page what the language of the page is.
// Can only be called if a translation has happened and was successful.
// Returns the language code on success, an empty string on failure.
virtual std::string GetPageSourceLanguage();
// Adjusts a delay time for a posted task. This is overridden in tests to do
// tasks immediately by returning 0.
virtual base::TimeDelta AdjustDelay(int delay_in_milliseconds);
// Executes the JavaScript code in |script| in the main frame of RenderView.
virtual void ExecuteScript(const std::string& script);
// Executes the JavaScript code in |script| in the main frame of RenderView,
// and returns the boolean returned by the script evaluation if the script was
// run successfully. Otherwise, returns |fallback| value.
virtual bool ExecuteScriptAndGetBoolResult(const std::string& script,
bool fallback);
// Executes the JavaScript code in |script| in the main frame of RenderView,
// and returns the string returned by the script evaluation if the script was
// run successfully. Otherwise, returns empty string.
virtual std::string ExecuteScriptAndGetStringResult(
const std::string& script);
// Executes the JavaScript code in |script| in the main frame of RenderView.
// and returns the number returned by the script evaluation if the script was
// run successfully. Otherwise, returns 0.0.
virtual double ExecuteScriptAndGetDoubleResult(const std::string& script);
// Executes the JavaScript code in |script| in the main frame of RenderView.
// and returns the integer value returned by the script evaluation if the
// script was run successfully. Otherwise, returns 0.
virtual int64_t ExecuteScriptAndGetIntegerResult(const std::string& script);
private:
FRIEND_TEST_ALL_PREFIXES(TranslateAgentTest, TestBuildTranslationScript);
// Converts language code to the one used in server supporting list.
static void ConvertLanguageCodeSynonym(std::string* code);
// Builds the translation JS used to translate from source_lang to
// target_lang.
static std::string BuildTranslationScript(const std::string& source_lang,
const std::string& target_lang);
const mojo::Remote<mojom::ContentTranslateDriver>& GetTranslateHandler();
// Cleanups all states and pending callbacks associated with the current
// running page translation.
void ResetPage();
// RenderFrameObserver implementation.
void OnDestruct() override;
// Cancels any translation that is currently being performed. This does not
// revert existing translations.
void CancelPendingTranslation();
// Checks if the current running page translation is finished or errored and
// notifies the browser accordingly. If the translation has not terminated,
// posts a task to check again later.
void CheckTranslateStatus();
// Called by TranslatePage to do the actual translation. |count| is used to
// limit the number of retries.
void TranslatePageImpl(int count);
// Sends a message to the browser to notify it that the translation failed
// with |error|.
void NotifyBrowserTranslationFailed(TranslateErrors error);
// Convenience method to access the main frame. Can return nullptr, typically
// if the page is being closed.
blink::WebLocalFrame* GetMainFrame();
// The states associated with the current translation.
TranslateFrameCallback translate_callback_pending_;
std::string source_lang_;
std::string target_lang_;
// The world ID to use for script execution.
int world_id_;
// The page content length at language detection time. Recorded to UMA when a
// user translates the page.
size_t page_contents_length_ = 0;
// The task runner responsible for the translation task, freezing it
// when the frame is backgrounded.
scoped_refptr<base::SingleThreadTaskRunner> translate_task_runner_;
// The Mojo pipe for communication with the browser process. Due to a
// refactor, the other end of the pipe is now attached to a
// LanguageDetectionTabHelper (which implements the ContentTranslateDriver
// Mojo interface).
mojo::Remote<mojom::ContentTranslateDriver> translate_handler_;
const raw_ref<translate::LanguageDetectionModel>
translate_language_detection_model_;
// Same lifetime as this.
raw_ptr<language_detection::LanguageDetectionAgent> language_detection_agent_;
std::optional<LanguageDetectionDetails> last_details_;
mojo::Receiver<mojom::TranslateAgent> receiver_{this};
// Method factory used to make calls to TranslatePageImpl.
base::WeakPtrFactory<TranslateAgent> weak_method_factory_{this};
// Weak pointer factory used to provide references to the translate host.
base::WeakPtrFactory<TranslateAgent> weak_pointer_factory_{this};
};
} // namespace translate
#endif // COMPONENTS_TRANSLATE_CONTENT_RENDERER_TRANSLATE_AGENT_H_
|