Commit 12d4877b authored by Doug Arnett's avatar Doug Arnett Committed by Commit Bot

PerFrameTranslate: adds finch param support for main frame language detection

Adds new parameter within the TranslateSubFrames feature to control
whether language detection occurs over sub frames or just the main
frame. This will be used in a 3 arm Dev/Canary experiment that will
look at language detection latency.

Bug: 1096121
Change-Id: I4cb3fa997c070a4345584bbe8cfde29b25098d76
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2250339Reviewed-by: default avatarMegan Jablonski <megjablon@chromium.org>
Reviewed-by: default avatarScott Little <sclittle@chromium.org>
Commit-Queue: Doug Arnett <dougarnett@chromium.org>
Cr-Commit-Position: refs/heads/master@{#779913}
parent e45004c3
...@@ -1995,4 +1995,65 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerWithSubFrameSupportBrowserTest, ...@@ -1995,4 +1995,65 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerWithSubFrameSupportBrowserTest,
1); 1);
} }
class TranslateManagerWithMainFrameLanguageDetectionBrowserTest
: public TranslateManagerBrowserTest {
protected:
TranslateManagerWithMainFrameLanguageDetectionBrowserTest() {
// Enable sub frame translation but with sub frame language
// detection turned off.
scoped_feature_list_.InitAndEnableFeatureWithParameters(
translate::kTranslateSubFrames,
{std::make_pair("detect_language_in_sub_frames", "false")});
}
private:
base::test::ScopedFeatureList scoped_feature_list_;
DISALLOW_COPY_AND_ASSIGN(
TranslateManagerWithMainFrameLanguageDetectionBrowserTest);
};
// Test that iframes can be translated.
IN_PROC_BROWSER_TEST_F(
TranslateManagerWithMainFrameLanguageDetectionBrowserTest,
TranslateIframe) {
base::HistogramTester histograms;
SetTranslateScript(kTestValidScript);
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
// Open a new tab with a page in French.
AddTabAtIndex(
0, GURL(embedded_test_server()->GetURL("/translate/fr_iframe_test.html")),
ui::PAGE_TRANSITION_TYPED);
ResetObserver();
chrome_translate_client = GetChromeTranslateClient();
if (chrome_translate_client->GetLanguageState().original_language().empty())
WaitUntilLanguageDetermined();
EXPECT_EQ("fr",
chrome_translate_client->GetLanguageState().original_language());
// Translate the page through TranslateManager.
TranslateManager* manager = chrome_translate_client->GetTranslateManager();
manager->TranslatePage(
chrome_translate_client->GetLanguageState().original_language(), "en",
true);
WaitUntilPageTranslated();
EXPECT_FALSE(chrome_translate_client->GetLanguageState().translation_error());
EXPECT_EQ(TranslateErrors::NONE, GetPageTranslatedResult());
// 3 frames are translated.
histograms.ExpectBucketCount("Translate.TranslateFrameCount", 3, 1);
histograms.ExpectBucketCount("Translate.TranslateSubframe.SuccessPercentage",
100, 1);
histograms.ExpectTotalCount("Translate.TranslateSubframe.ErrorType", 0);
histograms.ExpectTotalCount("Translate.LanguageDetection.ContentLength", 1);
// But only the 54 characters of main frame are used for language detection.
histograms.ExpectBucketCount("Translate.LanguageDetection.ContentLength", 54,
1);
}
} // namespace translate } // namespace translate
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "components/translate/core/browser/translate_download_manager.h" #include "components/translate/core/browser/translate_download_manager.h"
#include "components/translate/core/browser/translate_manager.h" #include "components/translate/core/browser/translate_manager.h"
#include "components/translate/core/common/translate_metrics.h" #include "components/translate/core/common/translate_metrics.h"
#include "components/translate/core/common/translate_util.h"
#include "components/translate/core/language_detection/language_detection_util.h" #include "components/translate/core/language_detection/language_detection_util.h"
#include "components/ukm/content/source_url_recorder.h" #include "components/ukm/content/source_url_recorder.h"
#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_context.h"
...@@ -301,11 +302,20 @@ void PerFrameContentTranslateDriver::DOMContentLoaded( ...@@ -301,11 +302,20 @@ void PerFrameContentTranslateDriver::DOMContentLoaded(
// Main frame loaded, set new sequence number. // Main frame loaded, set new sequence number.
page_seq_no_ = IncrementSeqNo(page_seq_no_); page_seq_no_ = IncrementSeqNo(page_seq_no_);
translate_manager()->set_current_seq_no(page_seq_no_); translate_manager()->set_current_seq_no(page_seq_no_);
// Start language detection now if not waiting for sub frames
// to load to use for detection.
if (!translate::IsSubFrameLanguageDetectionEnabled() &&
translate::IsTranslatableURL(web_contents()->GetURL())) {
StartLanguageDetection();
}
} }
void PerFrameContentTranslateDriver::DocumentOnLoadCompletedInMainFrame() { void PerFrameContentTranslateDriver::DocumentOnLoadCompletedInMainFrame() {
if (translate::IsTranslatableURL(web_contents()->GetURL())) if (translate::IsSubFrameLanguageDetectionEnabled() &&
translate::IsTranslatableURL(web_contents()->GetURL())) {
StartLanguageDetection(); StartLanguageDetection();
}
} }
void PerFrameContentTranslateDriver::StartLanguageDetection() { void PerFrameContentTranslateDriver::StartLanguageDetection() {
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/command_line.h" #include "base/command_line.h"
#include "base/feature_list.h" #include "base/feature_list.h"
#include "base/metrics/field_trial_params.h"
#include "base/stl_util.h" #include "base/stl_util.h"
#include "components/language/core/common/locale_util.h" #include "components/language/core/common/locale_util.h"
#include "components/translate/core/common/translate_switches.h" #include "components/translate/core/common/translate_switches.h"
...@@ -18,6 +19,14 @@ ...@@ -18,6 +19,14 @@
namespace translate { namespace translate {
namespace {
// Parameter for TranslateSubFrames feature to determine whether language
// detection should include the sub frames (or just the main frame).
const char kDetectLanguageInSubFrames[] = "detect_language_in_sub_frames";
} // namespace
const char kSecurityOrigin[] = "https://translate.googleapis.com/"; const char kSecurityOrigin[] = "https://translate.googleapis.com/";
const base::Feature kTranslateSubFrames{"TranslateSubFrames", const base::Feature kTranslateSubFrames{"TranslateSubFrames",
...@@ -37,4 +46,10 @@ bool IsSubFrameTranslationEnabled() { ...@@ -37,4 +46,10 @@ bool IsSubFrameTranslationEnabled() {
return base::FeatureList::IsEnabled(kTranslateSubFrames); return base::FeatureList::IsEnabled(kTranslateSubFrames);
} }
bool IsSubFrameLanguageDetectionEnabled() {
return base::FeatureList::IsEnabled(kTranslateSubFrames) &&
base::GetFieldTrialParamByFeatureAsBool(
kTranslateSubFrames, kDetectLanguageInSubFrames, true);
}
} // namespace translate } // namespace translate
...@@ -28,6 +28,9 @@ GURL GetTranslateSecurityOrigin(); ...@@ -28,6 +28,9 @@ GURL GetTranslateSecurityOrigin();
// Return whether sub frame translation is enabled. // Return whether sub frame translation is enabled.
bool IsSubFrameTranslationEnabled(); bool IsSubFrameTranslationEnabled();
// Return whether sub frame language detection is enabled.
bool IsSubFrameLanguageDetectionEnabled();
} // namespace translate } // namespace translate
#endif // COMPONENTS_TRANSLATE_CORE_COMMON_TRANSLATE_UTIL_H_ #endif // COMPONENTS_TRANSLATE_CORE_COMMON_TRANSLATE_UTIL_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment