[go: nahoru, domu]

blob: 595a5b4db11aacaced60e8362466b288b2777b5a [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_TRANSLATE_CONTENT_BROWSER_CONTENT_TRANSLATE_DRIVER_H_
#define COMPONENTS_TRANSLATE_CONTENT_BROWSER_CONTENT_TRANSLATE_DRIVER_H_
#include <map>
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/time/time.h"
#include "components/translate/content/common/translate.mojom.h"
#include "components/translate/core/browser/translate_driver.h"
#include "components/translate/core/common/translate_errors.h"
#include "content/public/browser/web_contents_observer.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/metrics/public/cpp/ukm_source_id.h"
namespace content {
class WebContents;
} // namespace content
namespace language {
class UrlLanguageHistogram;
} // namespace language
namespace translate {
struct LanguageDetectionDetails;
class TranslateManager;
class TranslateModelService;
// Content implementation of TranslateDriver.
class ContentTranslateDriver : public TranslateDriver,
public translate::mojom::ContentTranslateDriver,
public content::WebContentsObserver {
public:
class TranslationObserver : public base::CheckedObserver {
public:
// Handles when the value of IsPageTranslated is changed.
virtual void OnIsPageTranslatedChanged(content::WebContents* source) {}
// Handles when the value of translate_enabled is changed.
virtual void OnTranslateEnabledChanged(content::WebContents* source) {}
// Called when the page has been translated.
virtual void OnPageTranslated(const std::string& source_lang,
const std::string& translated_lang,
translate::TranslateErrors::Type error_type) {
}
};
ContentTranslateDriver(content::WebContents& web_contents,
language::UrlLanguageHistogram* url_language_histogram,
TranslateModelService* translate_model_service);
ContentTranslateDriver(const ContentTranslateDriver&) = delete;
ContentTranslateDriver& operator=(const ContentTranslateDriver&) = delete;
~ContentTranslateDriver() override;
// Adds or removes observers.
void AddTranslationObserver(TranslationObserver* observer);
void RemoveTranslationObserver(TranslationObserver* observer);
// Number of attempts before waiting for a page to be fully reloaded.
void set_translate_max_reload_attempts(int attempts) {
max_reload_check_attempts_ = attempts;
}
// Sets the TranslateManager associated with this driver.
void set_translate_manager(TranslateManager* manager) {
translate_manager_ = manager;
}
// Initiates translation once the page is finished loading.
void InitiateTranslation(const std::string& page_lang, int attempt);
// TranslateDriver methods.
void OnIsPageTranslatedChanged() override;
void OnTranslateEnabledChanged() override;
bool IsLinkNavigation() override;
void TranslatePage(int page_seq_no,
const std::string& translate_script,
const std::string& source_lang,
const std::string& target_lang) override;
void RevertTranslation(int page_seq_no) override;
bool IsIncognito() override;
const std::string& GetContentsMimeType() override;
const GURL& GetLastCommittedURL() override;
const GURL& GetVisibleURL() override;
ukm::SourceId GetUkmSourceId() override;
bool HasCurrentPage() override;
void OpenUrlInNewTab(const GURL& url) override;
// content::WebContentsObserver implementation.
void DidFinishNavigation(
content::NavigationHandle* navigation_handle) override;
void OnPageTranslated(bool cancelled,
const std::string& source_lang,
const std::string& translated_lang,
TranslateErrors::Type error_type);
// Adds a receiver in |receivers_| for the passed |receiver|.
void AddReceiver(
mojo::PendingReceiver<translate::mojom::ContentTranslateDriver> receiver);
// Called when a page has been loaded and can be potentially translated.
void RegisterPage(
mojo::PendingRemote<translate::mojom::TranslateAgent> translate_agent,
const translate::LanguageDetectionDetails& details,
bool page_level_translation_critiera_met) override;
// translate::mojom::ContentTranslateDriver implementation:
void GetLanguageDetectionModel(
GetLanguageDetectionModelCallback callback) override;
protected:
const base::ObserverList<TranslationObserver, true>& translation_observers()
const {
return translation_observers_;
}
TranslateManager* translate_manager() const { return translate_manager_; }
language::UrlLanguageHistogram* language_histogram() const {
return language_histogram_;
}
bool IsAutoHrefTranslateAllOriginsEnabled() const;
private:
void OnPageAway(int page_seq_no);
void InitiateTranslationIfReload(
content::NavigationHandle* navigation_handle);
// Notifies |this| that the translate model service is available for model
// requests or is invalidating existing requests specified by |is_available|.
// |callback| will be either forwarded to a request to get the actual model
// file or will be run with an empty file if the translate model service is
// rejecting requests.
void OnLanguageModelFileAvailabilityChanged(
GetLanguageDetectionModelCallback callback,
bool is_available);
raw_ptr<TranslateManager> translate_manager_;
base::ObserverList<TranslationObserver, true> translation_observers_;
// Max number of attempts before checking if a page has been reloaded.
int max_reload_check_attempts_;
// Records mojo connections with all current alive pages.
int next_page_seq_no_;
// mojo::Remote<TranslateAgent> is the connection between this driver and a
// TranslateAgent (which are per RenderFrame). Each TranslateAgent has a
// |binding_| member, representing the other end of this pipe.
std::map<int, mojo::Remote<mojom::TranslateAgent>> translate_agents_;
// Histogram to be notified about detected language of every page visited. Not
// owned here.
const raw_ptr<language::UrlLanguageHistogram> language_histogram_;
// ContentTranslateDriver is a singleton per web contents but multiple render
// frames may be contained in a single web contents. TranslateAgents get the
// other end of this receiver in the form of a ContentTranslateDriver.
mojo::ReceiverSet<translate::mojom::ContentTranslateDriver> receivers_;
// Time when the navigation was finished (i.e., DidFinishNavigation
// in the main frame). This is used to know a duration time to when the
// page language is determined.
base::TimeTicks finish_navigation_time_;
// The service that provides the model files needed for translate. Not owned
// but guaranteed to outlive |this|.
const raw_ptr<TranslateModelService> translate_model_service_;
base::WeakPtrFactory<ContentTranslateDriver> weak_pointer_factory_{this};
};
} // namespace translate
#endif // COMPONENTS_TRANSLATE_CONTENT_BROWSER_CONTENT_TRANSLATE_DRIVER_H_