summaryrefslogtreecommitdiffstats
path: root/components/translate
diff options
context:
space:
mode:
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));
+}