diff options
author | droger@chromium.org <droger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-09 19:05:05 +0000 |
---|---|---|
committer | droger@chromium.org <droger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-09 19:05:05 +0000 |
commit | 3f3a65fe54ba1ffad797a44401ffd42d9de9ffce (patch) | |
tree | b4ef7b030c6c6a181dd222c55d108b18be42e053 /components/translate | |
parent | caace87499af099ae2bc43d03eb9444200bee2e9 (diff) | |
download | chromium_src-3f3a65fe54ba1ffad797a44401ffd42d9de9ffce.zip chromium_src-3f3a65fe54ba1ffad797a44401ffd42d9de9ffce.tar.gz chromium_src-3f3a65fe54ba1ffad797a44401ffd42d9de9ffce.tar.bz2 |
Move LanguageUsageMetrics and TranslateBrowserMetrics to components
LanguageUsageMetrics is moved to its own component because it is used
both in the translate component and directly in the browser.
TranslateBrowserMetrics is moved to the translate component.
BUG=331509
TBR=jochen
Review URL: https://codereview.chromium.org/131203002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@243946 0039d316-1c4b-4281-b951-d872f2087c98
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)); +} |