Commit c7a7c55c authored by Max Curran's avatar Max Curran Committed by Chromium LUCI CQ

Added way to track user's high level interactions with the Translate UI.

This CL adds the methods to track the user's first interactions with the
Translate UI, and the total number of interactions over the course of a
page load. These values will later be logged to UKM. The CL includes the
Translate compact infobar UI, but the bubble UI will be added in a later
CL.

Full design doc: https://docs.google.com/document/d/1dyWh1Xw5VgUA00VA-5PTgKQ6ItziPBnSyeDR8saJ9vM/edit?usp=sharing

Bug: 1114868
Change-Id: I03b3945c2af1c05431907b1eb15fef5e4b1a5fbf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2572129
Commit-Queue: Max Curran <curranmax@chromium.org>
Reviewed-by: default avatarMatthew Jones <mdjones@chromium.org>
Reviewed-by: default avatarRyan Sturm <ryansturm@chromium.org>
Reviewed-by: default avatarScott Little <sclittle@chromium.org>
Cr-Commit-Position: refs/heads/master@{#840830}
parent 0d7453cf
...@@ -89,6 +89,10 @@ class MockTranslateMetricsLoggerContainer ...@@ -89,6 +89,10 @@ class MockTranslateMetricsLoggerContainer
mock_translate_metrics_logger_->LogTargetLanguage(target_language_code); mock_translate_metrics_logger_->LogTargetLanguage(target_language_code);
} }
void LogUIInteraction(translate::UIInteraction ui_interaction) override {
mock_translate_metrics_logger_->LogUIInteraction(ui_interaction);
}
private: private:
translate::testing::MockTranslateMetricsLogger* translate::testing::MockTranslateMetricsLogger*
mock_translate_metrics_logger_; // Weak. mock_translate_metrics_logger_; // Weak.
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "chrome/browser/infobars/infobar_service.h" #include "chrome/browser/infobars/infobar_service.h"
#include "components/translate/content/android/translate_utils.h" #include "components/translate/content/android/translate_utils.h"
#include "components/translate/core/browser/translate_infobar_delegate.h" #include "components/translate/core/browser/translate_infobar_delegate.h"
#include "components/translate/core/browser/translate_metrics_logger.h"
#include "components/variations/variations_associated_data.h" #include "components/variations/variations_associated_data.h"
#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_context.h"
...@@ -96,10 +97,12 @@ void TranslateCompactInfoBar::ProcessButton(int action) { ...@@ -96,10 +97,12 @@ void TranslateCompactInfoBar::ProcessButton(int action) {
Java_TranslateCompactInfoBar_setAutoAlwaysTranslate(env, Java_TranslateCompactInfoBar_setAutoAlwaysTranslate(env,
GetJavaInfoBar()); GetJavaInfoBar());
} }
delegate->ReportUIInteraction(translate::UIInteraction::kTranslate);
} else if (action == } else if (action ==
infobars::InfoBarAndroid::ACTION_TRANSLATE_SHOW_ORIGINAL) { infobars::InfoBarAndroid::ACTION_TRANSLATE_SHOW_ORIGINAL) {
action_flags_ |= FLAG_REVERT; action_flags_ |= FLAG_REVERT;
delegate->RevertWithoutClosingInfobar(); delegate->RevertWithoutClosingInfobar();
delegate->ReportUIInteraction(translate::UIInteraction::kRevert);
} else { } else {
DCHECK_EQ(infobars::InfoBarAndroid::ACTION_NONE, action); DCHECK_EQ(infobars::InfoBarAndroid::ACTION_NONE, action);
} }
...@@ -124,11 +127,15 @@ void TranslateCompactInfoBar::ApplyStringTranslateOption( ...@@ -124,11 +127,15 @@ void TranslateCompactInfoBar::ApplyStringTranslateOption(
base::android::ConvertJavaStringToUTF8(env, value); base::android::ConvertJavaStringToUTF8(env, value);
if (delegate->original_language_code().compare(source_code) != 0) if (delegate->original_language_code().compare(source_code) != 0)
delegate->UpdateOriginalLanguage(source_code); delegate->UpdateOriginalLanguage(source_code);
delegate->ReportUIInteraction(
translate::UIInteraction::kChangeSourceLanguage);
} else if (option == translate::TranslateUtils::OPTION_TARGET_CODE) { } else if (option == translate::TranslateUtils::OPTION_TARGET_CODE) {
std::string target_code = std::string target_code =
base::android::ConvertJavaStringToUTF8(env, value); base::android::ConvertJavaStringToUTF8(env, value);
if (delegate->target_language_code().compare(target_code) != 0) if (delegate->target_language_code().compare(target_code) != 0)
delegate->UpdateTargetLanguage(target_code); delegate->UpdateTargetLanguage(target_code);
delegate->ReportUIInteraction(
translate::UIInteraction::kChangeTargetLanguage);
} else { } else {
DCHECK(false); DCHECK(false);
} }
...@@ -145,6 +152,8 @@ void TranslateCompactInfoBar::ApplyBoolTranslateOption( ...@@ -145,6 +152,8 @@ void TranslateCompactInfoBar::ApplyBoolTranslateOption(
action_flags_ |= FLAG_ALWAYS_TRANSLATE; action_flags_ |= FLAG_ALWAYS_TRANSLATE;
delegate->ToggleAlwaysTranslate(); delegate->ToggleAlwaysTranslate();
} }
delegate->ReportUIInteraction(
translate::UIInteraction::kAlwaysTranslateLanguage);
} else if (option == translate::TranslateUtils::OPTION_NEVER_TRANSLATE) { } else if (option == translate::TranslateUtils::OPTION_NEVER_TRANSLATE) {
if (value && delegate->IsTranslatableLanguageByPrefs()) { if (value && delegate->IsTranslatableLanguageByPrefs()) {
action_flags_ |= FLAG_NEVER_LANGUAGE; action_flags_ |= FLAG_NEVER_LANGUAGE;
...@@ -152,6 +161,8 @@ void TranslateCompactInfoBar::ApplyBoolTranslateOption( ...@@ -152,6 +161,8 @@ void TranslateCompactInfoBar::ApplyBoolTranslateOption(
RemoveSelf(); RemoveSelf();
delegate->OnInfoBarClosedByUser(); delegate->OnInfoBarClosedByUser();
} }
delegate->ReportUIInteraction(
translate::UIInteraction::kNeverTranslateLanguage);
} else if (option == translate::TranslateUtils::OPTION_NEVER_TRANSLATE_SITE) { } else if (option == translate::TranslateUtils::OPTION_NEVER_TRANSLATE_SITE) {
if (value && !delegate->IsSiteOnNeverPromptList()) { if (value && !delegate->IsSiteOnNeverPromptList()) {
action_flags_ |= FLAG_NEVER_SITE; action_flags_ |= FLAG_NEVER_SITE;
...@@ -159,6 +170,8 @@ void TranslateCompactInfoBar::ApplyBoolTranslateOption( ...@@ -159,6 +170,8 @@ void TranslateCompactInfoBar::ApplyBoolTranslateOption(
RemoveSelf(); RemoveSelf();
delegate->OnInfoBarClosedByUser(); delegate->OnInfoBarClosedByUser();
} }
delegate->ReportUIInteraction(
translate::UIInteraction::kNeverTranslateSite);
} else { } else {
DCHECK(false); DCHECK(false);
} }
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <string> #include <string>
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "components/translate/core/browser/translate_metrics_logger_impl.h"
#include "components/translate/core/common/translate_errors.h" #include "components/translate/core/common/translate_errors.h"
// The model for the Translate bubble UX. This manages the user's manipulation // The model for the Translate bubble UX. This manages the user's manipulation
...@@ -123,6 +124,10 @@ class TranslateBubbleModel { ...@@ -123,6 +124,10 @@ class TranslateBubbleModel {
// True if the site of the current page can be blocklisted. // True if the site of the current page can be blocklisted.
virtual bool CanBlocklistSite() = 0; virtual bool CanBlocklistSite() = 0;
// Reports a high level UI interaction to the centralzied
// TranslateMetricsLogger.
virtual void ReportUIInteraction(translate::UIInteraction ui_interaction) = 0;
}; };
#endif // CHROME_BROWSER_UI_TRANSLATE_TRANSLATE_BUBBLE_MODEL_H_ #endif // CHROME_BROWSER_UI_TRANSLATE_TRANSLATE_BUBBLE_MODEL_H_
...@@ -151,3 +151,8 @@ bool TranslateBubbleModelImpl::IsPageTranslatedInCurrentLanguages() const { ...@@ -151,3 +151,8 @@ bool TranslateBubbleModelImpl::IsPageTranslatedInCurrentLanguages() const {
ui_delegate_->GetTargetLanguageCode() == ui_delegate_->GetTargetLanguageCode() ==
language_state.current_language(); language_state.current_language();
} }
void TranslateBubbleModelImpl::ReportUIInteraction(
translate::UIInteraction ui_interaction) {
ui_delegate_->ReportUIInteraction(ui_interaction);
}
...@@ -54,6 +54,7 @@ class TranslateBubbleModelImpl : public TranslateBubbleModel { ...@@ -54,6 +54,7 @@ class TranslateBubbleModelImpl : public TranslateBubbleModel {
void OnBubbleClosing() override; void OnBubbleClosing() override;
bool IsPageTranslatedInCurrentLanguages() const override; bool IsPageTranslatedInCurrentLanguages() const override;
bool CanBlocklistSite() override; bool CanBlocklistSite() override;
void ReportUIInteraction(translate::UIInteraction ui_interaction) override;
private: private:
std::unique_ptr<translate::TranslateUIDelegate> ui_delegate_; std::unique_ptr<translate::TranslateUIDelegate> ui_delegate_;
......
...@@ -412,6 +412,8 @@ bool TranslateBubbleView::IsCommandIdEnabled(int command_id) const { ...@@ -412,6 +412,8 @@ bool TranslateBubbleView::IsCommandIdEnabled(int command_id) const {
void TranslateBubbleView::ExecuteCommand(int command_id, int event_flags) { void TranslateBubbleView::ExecuteCommand(int command_id, int event_flags) {
switch (command_id) { switch (command_id) {
case OptionsMenuItem::ALWAYS_TRANSLATE_LANGUAGE: case OptionsMenuItem::ALWAYS_TRANSLATE_LANGUAGE:
model_->ReportUIInteraction(
translate::UIInteraction::kAlwaysTranslateLanguage);
should_always_translate_ = !should_always_translate_; should_always_translate_ = !should_always_translate_;
model_->SetAlwaysTranslate(should_always_translate_); model_->SetAlwaysTranslate(should_always_translate_);
if (should_always_translate_) { if (should_always_translate_) {
...@@ -427,6 +429,8 @@ void TranslateBubbleView::ExecuteCommand(int command_id, int event_flags) { ...@@ -427,6 +429,8 @@ void TranslateBubbleView::ExecuteCommand(int command_id, int event_flags) {
break; break;
case OptionsMenuItem::NEVER_TRANSLATE_LANGUAGE: case OptionsMenuItem::NEVER_TRANSLATE_LANGUAGE:
model_->ReportUIInteraction(
translate::UIInteraction::kNeverTranslateLanguage);
should_never_translate_language_ = !should_never_translate_language_; should_never_translate_language_ = !should_never_translate_language_;
if (should_never_translate_language_) { if (should_never_translate_language_) {
should_always_translate_ = false; should_always_translate_ = false;
...@@ -441,6 +445,8 @@ void TranslateBubbleView::ExecuteCommand(int command_id, int event_flags) { ...@@ -441,6 +445,8 @@ void TranslateBubbleView::ExecuteCommand(int command_id, int event_flags) {
break; break;
case OptionsMenuItem::NEVER_TRANSLATE_SITE: case OptionsMenuItem::NEVER_TRANSLATE_SITE:
model_->ReportUIInteraction(
translate::UIInteraction::kNeverTranslateSite);
should_never_translate_site_ = !should_never_translate_site_; should_never_translate_site_ = !should_never_translate_site_;
if (should_never_translate_site_) { if (should_never_translate_site_) {
translate::ReportUiAction(translate::NEVER_TRANSLATE_SITE_MENU_CLICKED); translate::ReportUiAction(translate::NEVER_TRANSLATE_SITE_MENU_CLICKED);
...@@ -471,6 +477,9 @@ void TranslateBubbleView::OnWidgetClosing(views::Widget* widget) { ...@@ -471,6 +477,9 @@ void TranslateBubbleView::OnWidgetClosing(views::Widget* widget) {
views::Widget::ClosedReason::kCloseButtonClicked) { views::Widget::ClosedReason::kCloseButtonClicked) {
model_->DeclineTranslation(); model_->DeclineTranslation();
translate::ReportUiAction(translate::CLOSE_BUTTON_CLICKED); translate::ReportUiAction(translate::CLOSE_BUTTON_CLICKED);
model_->ReportUIInteraction(translate::UIInteraction::kCloseUIExplicitly);
} else {
model_->ReportUIInteraction(translate::UIInteraction::kCloseUILostFocus);
} }
} }
...@@ -520,12 +529,14 @@ views::View* TranslateBubbleView::GetCurrentView() const { ...@@ -520,12 +529,14 @@ views::View* TranslateBubbleView::GetCurrentView() const {
} }
void TranslateBubbleView::Translate() { void TranslateBubbleView::Translate() {
model_->ReportUIInteraction(translate::UIInteraction::kTranslate);
model_->Translate(); model_->Translate();
SwitchView(TranslateBubbleModel::VIEW_STATE_TRANSLATING); SwitchView(TranslateBubbleModel::VIEW_STATE_TRANSLATING);
translate::ReportUiAction(translate::TRANSLATE_BUTTON_CLICKED); translate::ReportUiAction(translate::TRANSLATE_BUTTON_CLICKED);
} }
void TranslateBubbleView::ShowOriginal() { void TranslateBubbleView::ShowOriginal() {
model_->ReportUIInteraction(translate::UIInteraction::kRevert);
model_->RevertTranslation(); model_->RevertTranslation();
SwitchView(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE); SwitchView(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE);
translate::ReportUiAction(translate::SHOW_ORIGINAL_BUTTON_CLICKED); translate::ReportUiAction(translate::SHOW_ORIGINAL_BUTTON_CLICKED);
...@@ -552,6 +563,7 @@ void TranslateBubbleView::ConfirmAdvancedOptions() { ...@@ -552,6 +563,7 @@ void TranslateBubbleView::ConfirmAdvancedOptions() {
} }
void TranslateBubbleView::SourceLanguageChanged() { void TranslateBubbleView::SourceLanguageChanged() {
model_->ReportUIInteraction(translate::UIInteraction::kChangeSourceLanguage);
model_->UpdateOriginalLanguageIndex( model_->UpdateOriginalLanguageIndex(
source_language_combobox_->GetSelectedIndex() - 1); source_language_combobox_->GetSelectedIndex() - 1);
UpdateAdvancedView(); UpdateAdvancedView();
...@@ -559,6 +571,7 @@ void TranslateBubbleView::SourceLanguageChanged() { ...@@ -559,6 +571,7 @@ void TranslateBubbleView::SourceLanguageChanged() {
} }
void TranslateBubbleView::TargetLanguageChanged() { void TranslateBubbleView::TargetLanguageChanged() {
model_->ReportUIInteraction(translate::UIInteraction::kChangeTargetLanguage);
model_->UpdateTargetLanguageIndex( model_->UpdateTargetLanguageIndex(
target_language_combobox_->GetSelectedIndex()); target_language_combobox_->GetSelectedIndex());
UpdateAdvancedView(); UpdateAdvancedView();
...@@ -566,6 +579,8 @@ void TranslateBubbleView::TargetLanguageChanged() { ...@@ -566,6 +579,8 @@ void TranslateBubbleView::TargetLanguageChanged() {
} }
void TranslateBubbleView::AlwaysTranslatePressed() { void TranslateBubbleView::AlwaysTranslatePressed() {
model_->ReportUIInteraction(
translate::UIInteraction::kAlwaysTranslateLanguage);
should_always_translate_ = GetAlwaysTranslateCheckbox()->GetChecked(); should_always_translate_ = GetAlwaysTranslateCheckbox()->GetChecked();
translate::ReportUiAction(should_always_translate_ translate::ReportUiAction(should_always_translate_
? translate::ALWAYS_TRANSLATE_CHECKED ? translate::ALWAYS_TRANSLATE_CHECKED
...@@ -1040,7 +1055,8 @@ std::unique_ptr<views::Button> TranslateBubbleView::CreateCloseButton() { ...@@ -1040,7 +1055,8 @@ std::unique_ptr<views::Button> TranslateBubbleView::CreateCloseButton() {
views::BubbleFrameView::CreateCloseButton(base::BindRepeating( views::BubbleFrameView::CreateCloseButton(base::BindRepeating(
[](View* view) { [](View* view) {
translate::ReportUiAction(translate::CLOSE_BUTTON_CLICKED); translate::ReportUiAction(translate::CLOSE_BUTTON_CLICKED);
view->GetWidget()->Close(); view->GetWidget()->CloseWithReason(
views::Widget::ClosedReason::kCloseButtonClicked);
}, },
base::Unretained(this))); base::Unretained(this)));
close_button->SetVisible(true); close_button->SetVisible(true);
......
...@@ -145,6 +145,8 @@ class MockTranslateBubbleModel : public TranslateBubbleModel { ...@@ -145,6 +145,8 @@ class MockTranslateBubbleModel : public TranslateBubbleModel {
void SetCanBlocklistSite(bool value) { can_blocklist_site_ = value; } void SetCanBlocklistSite(bool value) { can_blocklist_site_ = value; }
void ReportUIInteraction(translate::UIInteraction ui_interaction) override {}
TranslateBubbleViewStateTransition view_state_transition_; TranslateBubbleViewStateTransition view_state_transition_;
translate::TranslateErrors::Type error_type_; translate::TranslateErrors::Type error_type_;
int original_language_index_; int original_language_index_;
......
...@@ -42,6 +42,7 @@ class MockTranslateMetricsLogger : public TranslateMetricsLogger { ...@@ -42,6 +42,7 @@ class MockTranslateMetricsLogger : public TranslateMetricsLogger {
MOCK_METHOD2(LogInitialSourceLanguage, void(const std::string&, bool)); MOCK_METHOD2(LogInitialSourceLanguage, void(const std::string&, bool));
MOCK_METHOD1(LogSourceLanguage, void(const std::string&)); MOCK_METHOD1(LogSourceLanguage, void(const std::string&));
MOCK_METHOD1(LogTargetLanguage, void(const std::string&)); MOCK_METHOD1(LogTargetLanguage, void(const std::string&));
MOCK_METHOD1(LogUIInteraction, void(UIInteraction));
private: private:
base::WeakPtrFactory<MockTranslateMetricsLogger> weak_method_factory_{this}; base::WeakPtrFactory<MockTranslateMetricsLogger> weak_method_factory_{this};
......
...@@ -430,6 +430,7 @@ int TranslateInfoBarDelegate::GetIconId() const { ...@@ -430,6 +430,7 @@ int TranslateInfoBarDelegate::GetIconId() const {
void TranslateInfoBarDelegate::InfoBarDismissed() { void TranslateInfoBarDelegate::InfoBarDismissed() {
OnInfoBarClosedByUser(); OnInfoBarClosedByUser();
ReportUIInteraction(UIInteraction::kCloseUIExplicitly);
bool declined = false; bool declined = false;
bool has_observer = false; bool has_observer = false;
...@@ -482,4 +483,9 @@ void TranslateInfoBarDelegate::OnInfoBarClosedByUser() { ...@@ -482,4 +483,9 @@ void TranslateInfoBarDelegate::OnInfoBarClosedByUser() {
ui_delegate_.OnUIClosedByUser(); ui_delegate_.OnUIClosedByUser();
} }
void TranslateInfoBarDelegate::ReportUIInteraction(
UIInteraction ui_interaction) {
ui_delegate_.ReportUIInteraction(ui_interaction);
}
} // namespace translate } // namespace translate
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "base/observer_list_types.h" #include "base/observer_list_types.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "components/infobars/core/infobar_delegate.h" #include "components/infobars/core/infobar_delegate.h"
#include "components/translate/core/browser/translate_metrics_logger.h"
#include "components/translate/core/browser/translate_prefs.h" #include "components/translate/core/browser/translate_prefs.h"
#include "components/translate/core/browser/translate_step.h" #include "components/translate/core/browser/translate_step.h"
#include "components/translate/core/browser/translate_ui_delegate.h" #include "components/translate/core/browser/translate_ui_delegate.h"
...@@ -227,6 +228,9 @@ class TranslateInfoBarDelegate : public infobars::InfoBarDelegate { ...@@ -227,6 +228,9 @@ class TranslateInfoBarDelegate : public infobars::InfoBarDelegate {
// and the user selects to never translate the language. // and the user selects to never translate the language.
void OnInfoBarClosedByUser(); void OnInfoBarClosedByUser();
// Records a high level UI interaction.
void ReportUIInteraction(UIInteraction ui_interaction);
// InfoBarDelegate: // InfoBarDelegate:
infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override; infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override;
int GetIconId() const override; int GetIconId() const override;
......
...@@ -57,6 +57,20 @@ enum class TriggerDecision { ...@@ -57,6 +57,20 @@ enum class TriggerDecision {
kMaxValue = kAutomaticTranslationByPref, kMaxValue = kAutomaticTranslationByPref,
}; };
enum class UIInteraction {
kUninitialized = 0,
kTranslate = 1,
kRevert = 2,
kAlwaysTranslateLanguage = 3,
kChangeSourceLanguage = 4,
kChangeTargetLanguage = 5,
kNeverTranslateLanguage = 6,
kNeverTranslateSite = 7,
kCloseUIExplicitly = 8,
kCloseUILostFocus = 9,
kMaxValue = kCloseUILostFocus,
};
// TranslateMetricsLogger tracks and logs various UKM and UMA metrics for Chrome // TranslateMetricsLogger tracks and logs various UKM and UMA metrics for Chrome
// Translate over the course of a page load. // Translate over the course of a page load.
class TranslateMetricsLogger { class TranslateMetricsLogger {
...@@ -98,6 +112,9 @@ class TranslateMetricsLogger { ...@@ -98,6 +112,9 @@ class TranslateMetricsLogger {
bool is_in_users_content_language) = 0; bool is_in_users_content_language) = 0;
virtual void LogSourceLanguage(const std::string& source_language_code) = 0; virtual void LogSourceLanguage(const std::string& source_language_code) = 0;
virtual void LogTargetLanguage(const std::string& target_language_code) = 0; virtual void LogTargetLanguage(const std::string& target_language_code) = 0;
// Records the user's high level interactions with the Translate UI.
virtual void LogUIInteraction(UIInteraction ui_interaction) = 0;
}; };
} // namespace translate } // namespace translate
......
...@@ -244,6 +244,14 @@ void TranslateMetricsLoggerImpl::LogTargetLanguage( ...@@ -244,6 +244,14 @@ void TranslateMetricsLoggerImpl::LogTargetLanguage(
current_target_language_ = target_language_code; current_target_language_ = target_language_code;
} }
void TranslateMetricsLoggerImpl::LogUIInteraction(
UIInteraction ui_interaction) {
if (first_ui_interaction_ == UIInteraction::kUninitialized)
first_ui_interaction_ = ui_interaction;
num_ui_interactions_++;
}
TranslateState TranslateMetricsLoggerImpl::ConvertToTranslateState( TranslateState TranslateMetricsLoggerImpl::ConvertToTranslateState(
bool is_translated, bool is_translated,
bool is_ui_shown, bool is_ui_shown,
......
...@@ -55,6 +55,7 @@ class NullTranslateMetricsLogger : public TranslateMetricsLogger { ...@@ -55,6 +55,7 @@ class NullTranslateMetricsLogger : public TranslateMetricsLogger {
bool is_in_users_content_languages) override {} bool is_in_users_content_languages) override {}
void LogSourceLanguage(const std::string& source_language_code) override {} void LogSourceLanguage(const std::string& source_language_code) override {}
void LogTargetLanguage(const std::string& target_language_code) override {} void LogTargetLanguage(const std::string& target_language_code) override {}
void LogUIInteraction(UIInteraction ui_interaction) override {}
}; };
class TranslateManager; class TranslateManager;
...@@ -97,6 +98,7 @@ class TranslateMetricsLoggerImpl : public TranslateMetricsLogger { ...@@ -97,6 +98,7 @@ class TranslateMetricsLoggerImpl : public TranslateMetricsLogger {
bool is_in_users_content_languages) override; bool is_in_users_content_languages) override;
void LogSourceLanguage(const std::string& source_language_code) override; void LogSourceLanguage(const std::string& source_language_code) override;
void LogTargetLanguage(const std::string& target_language_code) override; void LogTargetLanguage(const std::string& target_language_code) override;
void LogUIInteraction(UIInteraction ui_interaction) override;
// TODO(curranmax): Add appropriate functions for the Translate code to log // TODO(curranmax): Add appropriate functions for the Translate code to log
// relevant events. https://crbug.com/1114868. // relevant events. https://crbug.com/1114868.
...@@ -186,6 +188,11 @@ class TranslateMetricsLoggerImpl : public TranslateMetricsLogger { ...@@ -186,6 +188,11 @@ class TranslateMetricsLoggerImpl : public TranslateMetricsLogger {
TranslateErrors::Type first_translate_error_type_ = TranslateErrors::NONE; TranslateErrors::Type first_translate_error_type_ = TranslateErrors::NONE;
int num_translate_errors_ = 0; int num_translate_errors_ = 0;
// Tracks the user's high level interaction with the Translate UI over the
// course of a page load.
UIInteraction first_ui_interaction_ = UIInteraction::kUninitialized;
int num_ui_interactions_ = 0;
base::WeakPtrFactory<TranslateMetricsLoggerImpl> weak_method_factory_{this}; base::WeakPtrFactory<TranslateMetricsLoggerImpl> weak_method_factory_{this};
}; };
......
...@@ -67,6 +67,14 @@ class TranslateMetricsLoggerImplTest : public ::testing::Test { ...@@ -67,6 +67,14 @@ class TranslateMetricsLoggerImplTest : public ::testing::Test {
expected_max_time_to_translate); expected_max_time_to_translate);
} }
void CheckUIInteractions(UIInteraction expected_first_ui_interaction,
int expected_num_ui_interactions) {
EXPECT_EQ(translate_metrics_logger_->first_ui_interaction_,
expected_first_ui_interaction);
EXPECT_EQ(translate_metrics_logger_->num_ui_interactions_,
expected_num_ui_interactions);
}
private: private:
// Test target. // Test target.
std::unique_ptr<TranslateMetricsLoggerImpl> translate_metrics_logger_; std::unique_ptr<TranslateMetricsLoggerImpl> translate_metrics_logger_;
...@@ -540,6 +548,26 @@ TEST_F(TranslateMetricsLoggerImplTest, LogMaxTimeToTranslate) { ...@@ -540,6 +548,26 @@ TEST_F(TranslateMetricsLoggerImplTest, LogMaxTimeToTranslate) {
CheckMaxTimeToTranslate(base::TimeDelta::FromSeconds(400)); CheckMaxTimeToTranslate(base::TimeDelta::FromSeconds(400));
} }
TEST_F(TranslateMetricsLoggerImplTest, LogUIInteraction) {
const UIInteraction kUIInteractions[] = {
UIInteraction::kTranslate,
UIInteraction::kRevert,
UIInteraction::kAlwaysTranslateLanguage,
UIInteraction::kChangeSourceLanguage,
UIInteraction::kChangeTargetLanguage,
UIInteraction::kNeverTranslateLanguage,
UIInteraction::kNeverTranslateSite,
UIInteraction::kCloseUIExplicitly,
UIInteraction::kCloseUILostFocus};
for (auto ui_interaction : kUIInteractions) {
translate_metrics_logger()->LogUIInteraction(ui_interaction);
}
translate_metrics_logger()->RecordMetrics(true);
CheckUIInteractions(kUIInteractions[0], 9);
}
} // namespace testing } // namespace testing
} // namespace translate } // namespace translate
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
#include "components/translate/core/browser/translate_download_manager.h" #include "components/translate/core/browser/translate_download_manager.h"
#include "components/translate/core/browser/translate_driver.h" #include "components/translate/core/browser/translate_driver.h"
#include "components/translate/core/browser/translate_manager.h" #include "components/translate/core/browser/translate_manager.h"
#include "components/translate/core/browser/translate_metrics_logger.h"
#include "components/translate/core/browser/translate_prefs.h" #include "components/translate/core/browser/translate_prefs.h"
#include "components/translate/core/common/translate_constants.h" #include "components/translate/core/common/translate_constants.h"
#include "components/variations/variations_associated_data.h" #include "components/variations/variations_associated_data.h"
...@@ -397,4 +396,11 @@ void TranslateUIDelegate::OnUIClosedByUser() { ...@@ -397,4 +396,11 @@ void TranslateUIDelegate::OnUIClosedByUser() {
translate_manager_->GetActiveTranslateMetricsLogger()->LogUIChange(false); translate_manager_->GetActiveTranslateMetricsLogger()->LogUIChange(false);
} }
void TranslateUIDelegate::ReportUIInteraction(UIInteraction ui_interaction) {
if (translate_manager_) {
translate_manager_->GetActiveTranslateMetricsLogger()->LogUIInteraction(
ui_interaction);
}
}
} // namespace translate } // namespace translate
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "components/translate/core/browser/translate_metrics_logger.h"
#include "components/translate/core/common/translate_errors.h" #include "components/translate/core/common/translate_errors.h"
namespace translate { namespace translate {
...@@ -141,6 +142,9 @@ class TranslateUIDelegate { ...@@ -141,6 +142,9 @@ class TranslateUIDelegate {
// this site, and the user selects to never translate this language. // this site, and the user selects to never translate this language.
void OnUIClosedByUser(); void OnUIClosedByUser();
// Records a high level UI interaction.
void ReportUIInteraction(UIInteraction ui_interaction);
private: private:
FRIEND_TEST_ALL_PREFIXES(TranslateUIDelegateTest, GetPageHost); FRIEND_TEST_ALL_PREFIXES(TranslateUIDelegateTest, GetPageHost);
......
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