blob: ebee91ada3fa09f2b9388f3e221952b1d24d62d7 [file] [log] [blame]
// Copyright 2017 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.
#include "chrome/browser/language/chrome_language_detection_client.h"
#include "base/logging.h"
#include "chrome/browser/language/url_language_histogram_factory.h"
#include "chrome/browser/translate/chrome_translate_client.h"
#include "components/language/core/browser/url_language_histogram.h"
#include "components/translate/core/common/language_detection_details.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
DEFINE_WEB_CONTENTS_USER_DATA_KEY(ChromeLanguageDetectionClient);
ChromeLanguageDetectionClient::ChromeLanguageDetectionClient(
content::WebContents* const web_contents)
: content::WebContentsObserver(web_contents),
language_histogram_(UrlLanguageHistogramFactory::GetForBrowserContext(
web_contents->GetBrowserContext())) {}
ChromeLanguageDetectionClient::~ChromeLanguageDetectionClient() = default;
// static
void ChromeLanguageDetectionClient::BindContentTranslateDriver(
translate::mojom::ContentTranslateDriverRequest request,
content::RenderFrameHost* const render_frame_host) {
// Only valid for the main frame.
if (render_frame_host->GetParent())
return;
content::WebContents* const web_contents =
content::WebContents::FromRenderFrameHost(render_frame_host);
if (!web_contents)
return;
// We try to bind to the driver, but if driver is not ready for now or totally
// not available for this render frame host, the request will be just dropped.
// This would cause the message pipe to be closed, which will raise a
// connection error on the peer side.
ChromeLanguageDetectionClient* const instance =
ChromeLanguageDetectionClient::FromWebContents(web_contents);
if (!instance)
return;
instance->bindings_.AddBinding(instance, std::move(request));
}
// translate::mojom::ContentTranslateDriver implementation.
void ChromeLanguageDetectionClient::RegisterPage(
translate::mojom::PagePtr page,
const translate::LanguageDetectionDetails& details,
const bool page_needs_translation) {
// If we have a language histogram (i.e. we're not in incognito), update it
// with the detected language of every page visited.
if (language_histogram_ && details.is_cld_reliable)
language_histogram_->OnPageVisited(details.cld_language);
ChromeTranslateClient* const translate_client =
ChromeTranslateClient::FromWebContents(web_contents());
if (!translate_client)
return;
translate_client->translate_driver().RegisterPage(std::move(page), details,
page_needs_translation);
}