Index: chrome/renderer/translate/translate_helper.cc |
diff --git a/chrome/renderer/translate/translate_helper.cc b/chrome/renderer/translate/translate_helper.cc |
index cffcfc55d92e040870ff44f43a00362d74e1cde9..8db0c92f7716ce5106f8ddaa35843b512ba03563 100644 |
--- a/chrome/renderer/translate/translate_helper.cc |
+++ b/chrome/renderer/translate/translate_helper.cc |
@@ -8,6 +8,7 @@ |
#include "base/compiler_specific.h" |
#include "base/logging.h" |
#include "base/message_loop/message_loop.h" |
+#include "base/metrics/histogram.h" |
#include "base/strings/string16.h" |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
@@ -17,6 +18,8 @@ |
#include "components/translate/core/common/translate_metrics.h" |
#include "components/translate/core/common/translate_util.h" |
#include "components/translate/core/language_detection/language_detection_util.h" |
+#include "content/public/common/content_constants.h" |
+#include "content/public/renderer/render_thread.h" |
#include "content/public/renderer/render_view.h" |
#include "extensions/common/constants.h" |
#include "extensions/renderer/extension_groups.h" |
@@ -140,17 +143,25 @@ void TranslateHelper::PageCapturedImpl(int page_seq_no, |
if (!main_frame || page_seq_no_ != page_seq_no) |
return; |
- // TODO(andrewhayden): UMA insertion point here: Track if data is available. |
- // TODO(andrewhayden): Retry insertion point here, retry till data available. |
if (!cld_data_provider_->IsCldDataAvailable()) { |
// We're in dynamic mode and CLD data isn't loaded. Retry when CLD data |
// is loaded, if ever. |
deferred_page_capture_ = true; |
deferred_page_seq_no_ = page_seq_no; |
deferred_contents_ = contents; |
+ RecordLanguageDetectionTiming(DEFERRED); |
return; |
} |
+ if (deferred_page_seq_no_ == -1) { |
+ // CLD data was available before language detection was requested. |
+ RecordLanguageDetectionTiming(ON_TIME); |
+ } else { |
+ // This is a request that was triggered because CLD data is now available |
+ // and was previously deferred. |
+ RecordLanguageDetectionTiming(RESUMED); |
+ } |
+ |
WebDocument document = main_frame->document(); |
std::string content_language = document.contentLanguage().utf8(); |
WebElement html_element = document.documentElement(); |
@@ -608,3 +619,30 @@ void TranslateHelper::OnCldDataAvailable() { |
deferred_contents_.clear(); // Clean up for sanity |
} |
} |
+ |
+void TranslateHelper::RecordLanguageDetectionTiming( |
+ LanguageDetectionTiming timing) { |
+ // The following comment is copied from page_load_histograms.cc, and applies |
+ // just as equally here: |
+ // |
+ // Since there are currently no guarantees that renderer histograms will be |
+ // sent to the browser, we initiate a PostTask here to be sure that we send |
+ // the histograms we generated. Without this call, pages that don't have an |
+ // on-close-handler might generate data that is lost when the renderer is |
+ // shutdown abruptly (perchance because the user closed the tab). |
+ DVLOG(1) << "Language detection timing: " << timing; |
+ UMA_HISTOGRAM_ENUMERATION("Translate.LanguageDetectionTiming", timing, |
+ LANGUAGE_DETECTION_TIMING_MAX_VALUE); |
+ |
+ // Note on performance: Under normal circumstances, this should get called |
+ // once per page load. The code will either manage to do it ON_TIME or will |
+ // be DEFERRED until CLD is ready. In the latter case, CLD is in dynamic mode |
+ // and may eventually become available, triggering the RESUMED event; after |
+ // this, everything should start being ON_TIME. This should never run more |
+ // than twice in a page load, under any conditions. |
+ // Also note that language detection is triggered off of a delay AFTER the |
+ // page load completed event has fired, making this very much off the critical |
+ // path. |
+ content::RenderThread::Get()->UpdateHistograms( |
+ content::kHistogramSynchronizerReservedSequenceNumber); |
+} |