diff options
Diffstat (limited to 'components/translate')
4 files changed, 350 insertions, 1 deletions
diff --git a/components/translate/DEPS b/components/translate/DEPS index 8f4bfc0..c2106de 100644 --- a/components/translate/DEPS +++ b/components/translate/DEPS @@ -1,4 +1,8 @@ include_rules = [ - # translate is used on iOS, which cannot depend on content. + "+components/language_usage_metrics", + + # Translate is a layered component; subdirectories must explicitly introduce + # the ability to use the content layer as appropriate. "-content", + "-components/translate/content", ] diff --git a/components/translate/core/browser/translate_browser_metrics.cc b/components/translate/core/browser/translate_browser_metrics.cc new file mode 100644 index 0000000..c0d3357d --- /dev/null +++ b/components/translate/core/browser/translate_browser_metrics.cc @@ -0,0 +1,94 @@ +// 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. + +#include "components/translate/core/browser/translate_browser_metrics.h" + +#include <string> + +#include "base/basictypes.h" +#include "base/metrics/histogram.h" +#include "base/metrics/sparse_histogram.h" +#include "components/language_usage_metrics/language_usage_metrics.h" + +namespace { + +// Constant string values to indicate UMA names. All entries should have +// a corresponding index in MetricsNameIndex and an entry in |kMetricsEntries|. +const char kTranslateInitiationStatus[] = + "Translate.InitiationStatus.v2"; +const char kTranslateReportLanguageDetectionError[] = + "Translate.ReportLanguageDetectionError"; +const char kTranslateLocalesOnDisabledByPrefs[] = + "Translate.LocalesOnDisabledByPrefs"; +const char kTranslateUndisplayableLanguage[] = + "Translate.UndisplayableLanguage"; +const char kTranslateUnsupportedLanguageAtInitiation[] = + "Translate.UnsupportedLanguageAtInitiation"; + +struct MetricsEntry { + TranslateBrowserMetrics::MetricsNameIndex index; + const char* const name; +}; + +// This entry table should be updated when new UMA items are added. +const MetricsEntry kMetricsEntries[] = { + { TranslateBrowserMetrics::UMA_INITIATION_STATUS, + kTranslateInitiationStatus }, + { TranslateBrowserMetrics::UMA_LANGUAGE_DETECTION_ERROR, + kTranslateReportLanguageDetectionError }, + { TranslateBrowserMetrics::UMA_LOCALES_ON_DISABLED_BY_PREFS, + kTranslateLocalesOnDisabledByPrefs }, + { TranslateBrowserMetrics::UMA_UNDISPLAYABLE_LANGUAGE, + kTranslateUndisplayableLanguage }, + { TranslateBrowserMetrics::UMA_UNSUPPORTED_LANGUAGE_AT_INITIATION, + kTranslateUnsupportedLanguageAtInitiation }, +}; + +COMPILE_ASSERT(arraysize(kMetricsEntries) == TranslateBrowserMetrics::UMA_MAX, + arraysize_of_kMetricsEntries_should_be_UMA_MAX); + +} // namespace + +namespace TranslateBrowserMetrics { + +void ReportInitiationStatus(InitiationStatusType type) { + UMA_HISTOGRAM_ENUMERATION(kTranslateInitiationStatus, + type, + INITIATION_STATUS_MAX); +} + +void ReportLanguageDetectionError() { + UMA_HISTOGRAM_BOOLEAN(kTranslateReportLanguageDetectionError, true); +} + +void ReportLocalesOnDisabledByPrefs(const std::string& locale) { + UMA_HISTOGRAM_SPARSE_SLOWLY( + kTranslateLocalesOnDisabledByPrefs, + language_usage_metrics::LanguageUsageMetrics::ToLanguageCode(locale)); +} + +void ReportUndisplayableLanguage(const std::string& language) { + int language_code = + language_usage_metrics::LanguageUsageMetrics::ToLanguageCode(language); + UMA_HISTOGRAM_SPARSE_SLOWLY(kTranslateUndisplayableLanguage, + language_code); +} + +void ReportUnsupportedLanguageAtInitiation(const std::string& language) { + int language_code = + language_usage_metrics::LanguageUsageMetrics::ToLanguageCode(language); + UMA_HISTOGRAM_SPARSE_SLOWLY(kTranslateUnsupportedLanguageAtInitiation, + language_code); +} + +const char* GetMetricsName(MetricsNameIndex index) { + for (size_t i = 0; i < arraysize(kMetricsEntries); ++i) { + if (kMetricsEntries[i].index == index) + return kMetricsEntries[i].name; + } + NOTREACHED(); + return NULL; +} + +} // namespace TranslateBrowserMetrics diff --git a/components/translate/core/browser/translate_browser_metrics.h b/components/translate/core/browser/translate_browser_metrics.h new file mode 100644 index 0000000..0d76e7b --- /dev/null +++ b/components/translate/core/browser/translate_browser_metrics.h @@ -0,0 +1,64 @@ +// 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_CORE_BROWSER_TRANSLATE_BROWSER_METRICS_H_ +#define COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_BROWSER_METRICS_H_ + +#include <string> + +namespace TranslateBrowserMetrics { + +// An indexing type to query each UMA entry name via GetMetricsName() function. +// Note: |kMetricsEntries| should be updated when a new entry is added here. +enum MetricsNameIndex { + UMA_INITIATION_STATUS, + UMA_LANGUAGE_DETECTION_ERROR, + UMA_LOCALES_ON_DISABLED_BY_PREFS, + UMA_UNDISPLAYABLE_LANGUAGE, + UMA_UNSUPPORTED_LANGUAGE_AT_INITIATION, + UMA_MAX, +}; + +// When Chrome Translate is ready to translate a page, one of following reason +// decide the next browser action. +// Note: Don't insert any item. It will change reporting UMA value, and break +// the UMA dashboard page. Insteads, append it at the end of enum as suggested +// below. +enum InitiationStatusType { + INITIATION_STATUS_DISABLED_BY_PREFS, + INITIATION_STATUS_DISABLED_BY_SWITCH, + INITIATION_STATUS_DISABLED_BY_CONFIG, + INITIATION_STATUS_LANGUAGE_IS_NOT_SUPPORTED, + INITIATION_STATUS_URL_IS_NOT_SUPPORTED, + INITIATION_STATUS_SIMILAR_LANGUAGES, + INITIATION_STATUS_ACCEPT_LANGUAGES, + INITIATION_STATUS_AUTO_BY_CONFIG, + INITIATION_STATUS_AUTO_BY_LINK, + INITIATION_STATUS_SHOW_INFOBAR, + INITIATION_STATUS_MIME_TYPE_IS_NOT_SUPPORTED, + // Insert new items here. + INITIATION_STATUS_MAX, +}; + +// Called when Chrome Translate is initiated to report a reason of the next +// browser action. +void ReportInitiationStatus(InitiationStatusType type); + +// Called when Chrome opens the URL so that the user sends an error feedback. +void ReportLanguageDetectionError(); + +void ReportLocalesOnDisabledByPrefs(const std::string& locale); + +// Called when Chrome Translate server sends the language list which includes +// a undisplayable language in the user's locale. +void ReportUndisplayableLanguage(const std::string& language); + +void ReportUnsupportedLanguageAtInitiation(const std::string& language); + +// Provides UMA entry names for unit tests. +const char* GetMetricsName(MetricsNameIndex index); + +} // namespace TranslateBrowserMetrics + +#endif // COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_BROWSER_METRICS_H_ diff --git a/components/translate/core/browser/translate_browser_metrics_unittest.cc b/components/translate/core/browser/translate_browser_metrics_unittest.cc new file mode 100644 index 0000000..404014f --- /dev/null +++ b/components/translate/core/browser/translate_browser_metrics_unittest.cc @@ -0,0 +1,187 @@ +// 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. + +#include "components/translate/core/browser/translate_browser_metrics.h" + +#include "base/basictypes.h" +#include "base/memory/scoped_ptr.h" +#include "base/metrics/histogram.h" +#include "base/metrics/histogram_samples.h" +#include "base/metrics/statistics_recorder.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/platform_test.h" + +using base::HistogramBase; +using base::HistogramSamples; +using base::StatisticsRecorder; + +namespace { + +class MetricsRecorder { + public: + explicit MetricsRecorder(const char* key) : key_(key) { + StatisticsRecorder::Initialize(); + + HistogramBase* histogram = StatisticsRecorder::FindHistogram(key_); + if (histogram) + base_samples_ = histogram->SnapshotSamples(); + } + + void CheckInitiationStatus(int expected_disabled_by_prefs, + int expected_disabled_by_switch, + int expected_disabled_by_config, + int expected_language_is_not_supported, + int expected_mime_type_is_not_supported, + int expected_url_is_not_supported, + int expected_similar_languages, + int expected_accept_languages, + int expected_auto_by_config, + int expected_auto_by_link, + int expected_show_infobar) { + Snapshot(); + + EXPECT_EQ(expected_disabled_by_prefs, GetCountWithoutSnapshot( + TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_PREFS)); + EXPECT_EQ(expected_disabled_by_switch, GetCountWithoutSnapshot( + TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_SWITCH)); + EXPECT_EQ(expected_disabled_by_config, GetCountWithoutSnapshot( + TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_CONFIG)); + EXPECT_EQ(expected_language_is_not_supported, GetCountWithoutSnapshot( + TranslateBrowserMetrics::INITIATION_STATUS_LANGUAGE_IS_NOT_SUPPORTED)); + EXPECT_EQ(expected_mime_type_is_not_supported, GetCountWithoutSnapshot( + TranslateBrowserMetrics::INITIATION_STATUS_MIME_TYPE_IS_NOT_SUPPORTED)); + EXPECT_EQ(expected_url_is_not_supported, GetCountWithoutSnapshot( + TranslateBrowserMetrics::INITIATION_STATUS_URL_IS_NOT_SUPPORTED)); + EXPECT_EQ(expected_similar_languages, GetCountWithoutSnapshot( + TranslateBrowserMetrics::INITIATION_STATUS_SIMILAR_LANGUAGES)); + EXPECT_EQ(expected_accept_languages, GetCountWithoutSnapshot( + TranslateBrowserMetrics::INITIATION_STATUS_ACCEPT_LANGUAGES)); + EXPECT_EQ(expected_auto_by_config, GetCountWithoutSnapshot( + TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_CONFIG)); + EXPECT_EQ(expected_auto_by_link, GetCountWithoutSnapshot( + TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_LINK)); + EXPECT_EQ(expected_show_infobar, GetCountWithoutSnapshot( + TranslateBrowserMetrics::INITIATION_STATUS_SHOW_INFOBAR)); + } + + HistogramBase::Count GetTotalCount() { + Snapshot(); + if (!samples_.get()) + return 0; + HistogramBase::Count count = samples_->TotalCount(); + if (!base_samples_.get()) + return count; + return count - base_samples_->TotalCount(); + } + + HistogramBase::Count GetCount(HistogramBase::Sample value) { + Snapshot(); + return GetCountWithoutSnapshot(value); + } + + private: + void Snapshot() { + HistogramBase* histogram = StatisticsRecorder::FindHistogram(key_); + if (!histogram) + return; + samples_ = histogram->SnapshotSamples(); + } + + HistogramBase::Count GetCountWithoutSnapshot(HistogramBase::Sample value) { + if (!samples_.get()) + return 0; + HistogramBase::Count count = samples_->GetCount(value); + if (!base_samples_.get()) + return count; + return count - base_samples_->GetCount(value); + } + + std::string key_; + scoped_ptr<HistogramSamples> base_samples_; + scoped_ptr<HistogramSamples> samples_; + + DISALLOW_COPY_AND_ASSIGN(MetricsRecorder); +}; + +} // namespace + +TEST(TranslateBrowserMetricsTest, ReportInitiationStatus) { + MetricsRecorder recorder(TranslateBrowserMetrics::GetMetricsName( + TranslateBrowserMetrics::UMA_INITIATION_STATUS)); + + recorder.CheckInitiationStatus(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + TranslateBrowserMetrics::ReportInitiationStatus( + TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_PREFS); + recorder.CheckInitiationStatus(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + TranslateBrowserMetrics::ReportInitiationStatus( + TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_SWITCH); + recorder.CheckInitiationStatus(1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0); + TranslateBrowserMetrics::ReportInitiationStatus( + TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_CONFIG); + recorder.CheckInitiationStatus(1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0); + TranslateBrowserMetrics::ReportInitiationStatus( + TranslateBrowserMetrics::INITIATION_STATUS_LANGUAGE_IS_NOT_SUPPORTED); + recorder.CheckInitiationStatus(1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0); + TranslateBrowserMetrics::ReportInitiationStatus( + TranslateBrowserMetrics::INITIATION_STATUS_MIME_TYPE_IS_NOT_SUPPORTED); + recorder.CheckInitiationStatus(1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0); + TranslateBrowserMetrics::ReportInitiationStatus( + TranslateBrowserMetrics::INITIATION_STATUS_URL_IS_NOT_SUPPORTED); + recorder.CheckInitiationStatus(1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0); + TranslateBrowserMetrics::ReportInitiationStatus( + TranslateBrowserMetrics::INITIATION_STATUS_SIMILAR_LANGUAGES); + recorder.CheckInitiationStatus(1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0); + TranslateBrowserMetrics::ReportInitiationStatus( + TranslateBrowserMetrics::INITIATION_STATUS_ACCEPT_LANGUAGES); + recorder.CheckInitiationStatus(1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0); + TranslateBrowserMetrics::ReportInitiationStatus( + TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_CONFIG); + recorder.CheckInitiationStatus(1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0); + TranslateBrowserMetrics::ReportInitiationStatus( + TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_LINK); + recorder.CheckInitiationStatus(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0); + TranslateBrowserMetrics::ReportInitiationStatus( + TranslateBrowserMetrics::INITIATION_STATUS_SHOW_INFOBAR); + recorder.CheckInitiationStatus(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1); +} + +TEST(TranslateBrowserMetricsTest, ReportLanguageDetectionError) { + MetricsRecorder recorder(TranslateBrowserMetrics::GetMetricsName( + TranslateBrowserMetrics::UMA_LANGUAGE_DETECTION_ERROR)); + EXPECT_EQ(0, recorder.GetTotalCount()); + TranslateBrowserMetrics::ReportLanguageDetectionError(); + EXPECT_EQ(1, recorder.GetTotalCount()); + +} + + +TEST(TranslateBrowserMetricsTest, ReportedLocalesOnDisabledByPrefs) { + const int ENGLISH = 25966; + + MetricsRecorder recorder(TranslateBrowserMetrics::GetMetricsName( + TranslateBrowserMetrics::UMA_LOCALES_ON_DISABLED_BY_PREFS)); + EXPECT_EQ(0, recorder.GetTotalCount()); + TranslateBrowserMetrics::ReportLocalesOnDisabledByPrefs("en"); + EXPECT_EQ(1, recorder.GetCount(ENGLISH)); +} + +TEST(TranslateBrowserMetricsTest, ReportedUndisplayableLanguage) { + const int ENGLISH = 25966; + + MetricsRecorder recorder(TranslateBrowserMetrics::GetMetricsName( + TranslateBrowserMetrics::UMA_UNDISPLAYABLE_LANGUAGE)); + EXPECT_EQ(0, recorder.GetTotalCount()); + TranslateBrowserMetrics::ReportUndisplayableLanguage("en"); + EXPECT_EQ(1, recorder.GetCount(ENGLISH)); +} + +TEST(TranslateBrowserMetricsTest, ReportedUnsupportedLanguageAtInitiation) { + const int ENGLISH = 25966; + + MetricsRecorder recorder(TranslateBrowserMetrics::GetMetricsName( + TranslateBrowserMetrics::UMA_UNSUPPORTED_LANGUAGE_AT_INITIATION)); + EXPECT_EQ(0, recorder.GetTotalCount()); + TranslateBrowserMetrics::ReportUnsupportedLanguageAtInitiation("en"); + EXPECT_EQ(1, recorder.GetCount(ENGLISH)); +} |