#include "chrome/browser/translate/chrome_translate_client.h"
#include <memory>
#include <vector>
#include "base/check.h"
#include "base/feature_list.h"
#include "base/functional/bind.h"
#include "base/notreached.h"
#include "base/path_service.h"
#include "base/strings/string_split.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/language/accept_languages_service_factory.h"
#include "chrome/browser/language/language_model_manager_factory.h"
#include "chrome/browser/language/url_language_histogram_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_key.h"
#include "chrome/browser/translate/translate_model_service_factory.h"
#include "chrome/browser/translate/translate_ranker_factory.h"
#include "chrome/browser/translate/translate_service.h"
#include "chrome/browser/ui/translate/translate_bubble_factory.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/pref_names.h"
#include "chrome/grit/theme_resources.h"
#include "components/infobars/content/content_infobar_manager.h"
#include "components/language/core/browser/accept_languages_service.h"
#include "components/language/core/browser/language_model_manager.h"
#include "components/language/core/browser/pref_names.h"
#include "components/language_detection/content/browser/content_language_detection_driver.h"
#include "components/prefs/pref_service.h"
#include "components/translate/content/browser/content_translate_driver.h"
#include "components/translate/core/browser/language_state.h"
#include "components/translate/core/browser/page_translated_details.h"
#include "components/translate/core/browser/translate_browser_metrics.h"
#include "components/translate/core/browser/translate_download_manager.h"
#include "components/translate/core/browser/translate_infobar_delegate.h"
#include "components/translate/core/browser/translate_manager.h"
#include "components/translate/core/browser/translate_metrics_logger.h"
#include "components/translate/core/browser/translate_model_service.h"
#include "components/translate/core/browser/translate_prefs.h"
#include "components/translate/core/common/language_detection_details.h"
#include "components/translate/core/common/translate_util.h"
#include "components/variations/service/variations_service.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/web_contents.h"
#include "third_party/metrics_proto/translate_event.pb.h"
#include "ui/base/ui_base_features.h"
#include "url/gurl.h"
#if BUILDFLAG(IS_ANDROID)
#include "chrome/browser/android/android_theme_resources.h"
#include "chrome/browser/translate/android/auto_translate_snackbar_controller.h"
#include "components/translate/content/android/translate_message.h"
#include "content/public/browser/page.h"
#include "content/public/browser/visibility.h"
#else
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#endif
namespace {
TranslateEventProto;
#if !BUILDFLAG(IS_ANDROID)
TranslateEventProto::EventType BubbleResultToTranslateEvent(
ShowTranslateBubbleResult result) { … }
#endif
#if BUILDFLAG(IS_ANDROID)
bool IsMessageUISnackbarEnabled() {
constexpr base::FeatureParam<bool> kIsSnackbarEnabled(
&translate::kTranslateMessageUI,
translate::kTranslateMessageUISnackbarParam, true);
return kIsSnackbarEnabled.Get();
}
bool IsAutomaticTranslationType(translate::TranslationType type) {
return type == translate::TranslationType::kAutomaticTranslationByHref ||
type == translate::TranslationType::kAutomaticTranslationByLink ||
type == translate::TranslationType::kAutomaticTranslationByPref ||
type == translate::TranslationType::
kAutomaticTranslationToPredefinedTarget;
}
#endif
}
ChromeTranslateClient::ChromeTranslateClient(content::WebContents* web_contents)
: … { … }
ChromeTranslateClient::~ChromeTranslateClient() { … }
const translate::LanguageState& ChromeTranslateClient::GetLanguageState() { … }
std::unique_ptr<translate::TranslatePrefs>
ChromeTranslateClient::CreateTranslatePrefs(PrefService* prefs) { … }
language::AcceptLanguagesService*
ChromeTranslateClient::GetAcceptLanguagesService(
content::BrowserContext* browser_context) { … }
translate::TranslateManager* ChromeTranslateClient::GetManagerFromWebContents(
content::WebContents* web_contents) { … }
void ChromeTranslateClient::GetTranslateLanguages(
content::WebContents* web_contents,
std::string* source,
std::string* target,
bool for_display) { … }
translate::TranslateManager* ChromeTranslateClient::GetTranslateManager() { … }
bool ChromeTranslateClient::ShowTranslateUI(
translate::TranslateStep step,
const std::string& source_language,
const std::string& target_language,
translate::TranslateErrors error_type,
bool triggered_from_menu) { … }
translate::TranslateDriver* ChromeTranslateClient::GetTranslateDriver() { … }
PrefService* ChromeTranslateClient::GetPrefs() { … }
std::unique_ptr<translate::TranslatePrefs>
ChromeTranslateClient::GetTranslatePrefs() { … }
language::AcceptLanguagesService*
ChromeTranslateClient::GetAcceptLanguagesService() { … }
#if BUILDFLAG(IS_ANDROID)
int ChromeTranslateClient::GetInfobarIconID() const {
return IDR_ANDROID_INFOBAR_TRANSLATE;
}
void ChromeTranslateClient::ManualTranslateWhenReady() {
if (GetLanguageState().source_language().empty()) {
manual_translate_on_ready_ = true;
} else {
translate::TranslateManager* manager = GetTranslateManager();
manager->ShowTranslateUI(true,
true);
}
}
#endif
void ChromeTranslateClient::SetPredefinedTargetLanguage(
const std::string& translate_language_code,
bool should_auto_translate) { … }
bool ChromeTranslateClient::IsTranslatableURL(const GURL& url) { … }
void ChromeTranslateClient::WebContentsDestroyed() { … }
#if BUILDFLAG(IS_ANDROID)
void ChromeTranslateClient::PrimaryPageChanged(content::Page& page) {
if (auto_translate_snackbar_controller_ &&
auto_translate_snackbar_controller_->IsShowing()) {
auto_translate_snackbar_controller_->NativeDismissSnackbar();
}
}
void ChromeTranslateClient::OnVisibilityChanged(
content::Visibility visibility) {
if (auto_translate_snackbar_controller_ &&
auto_translate_snackbar_controller_->IsShowing() &&
visibility == content::Visibility::HIDDEN) {
auto_translate_snackbar_controller_->NativeDismissSnackbar();
}
}
#endif
void ChromeTranslateClient::OnLanguageDetermined(
const translate::LanguageDetectionDetails& details) { … }
#if !BUILDFLAG(IS_ANDROID)
ShowTranslateBubbleResult ChromeTranslateClient::ShowBubble(
translate::TranslateStep step,
const std::string& source_language,
const std::string& target_language,
translate::TranslateErrors error_type,
bool is_user_gesture) { … }
#endif
WEB_CONTENTS_USER_DATA_KEY_IMPL(ChromeTranslateClient);