summaryrefslogtreecommitdiffstats
path: root/components/translate
diff options
context:
space:
mode:
authordroger@chromium.org <droger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-09 19:05:05 +0000
committerdroger@chromium.org <droger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-09 19:05:05 +0000
commit3f3a65fe54ba1ffad797a44401ffd42d9de9ffce (patch)
treeb4ef7b030c6c6a181dd222c55d108b18be42e053 /components/translate
parentcaace87499af099ae2bc43d03eb9444200bee2e9 (diff)
downloadchromium_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')
-rw-r--r--components/translate/DEPS6
-rw-r--r--components/translate/core/browser/translate_browser_metrics.cc94
-rw-r--r--components/translate/core/browser/translate_browser_metrics.h64
-rw-r--r--components/translate/core/browser/translate_browser_metrics_unittest.cc187
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));
+}