Index: chrome/renderer/translate/translate_helper.h |
diff --git a/chrome/renderer/translate/translate_helper.h b/chrome/renderer/translate/translate_helper.h |
index 1c357bf9e606308f1a6f2d9ff8fc487733b2c55e..fc2fc758365d6f281d9f8ae924ab9b1e6d42388e 100644 |
--- a/chrome/renderer/translate/translate_helper.h |
+++ b/chrome/renderer/translate/translate_helper.h |
@@ -28,7 +28,53 @@ class RendererCldDataProvider; |
// This class deals with page translation. |
// There is one TranslateHelper per RenderView. |
- |
+// |
+// This class provides metrics that allow tracking the user experience impact |
+// of non-static CldDataProvider implementations. For background on the data |
+// providers, please refer to the following documentation: |
+// http://www.chromium.org/developers/how-tos/compact-language-detector-cld-data-source-configuration |
+// |
+// Available metrics (from the LanguageDetectionTiming enum): |
+// 1. ON_TIME |
+// Recorded if PageCaptured(...) is invoked after CLD is available. This is |
+// the ideal case, indicating that CLD is available before it is needed. |
+// 2. DEFERRED |
+// Recorded if PageCaptured(...) is invoked before CLD is available. |
+// Sub-optimal case indicating that CLD wasn't available when it was needed, |
+// so the request for detection has been deferred until CLD is available or |
+// until the user navigates to a different page. |
+// 3. RESUMED |
+// Recorded if CLD becomes available after a language detection request was |
+// deferred, but before the user navigated to a different page. Language |
+// detection is ultimately completed, it just didn't happen on time. |
+// |
+// Note that there is NOT a metric that records the number of times that |
+// language detection had to be aborted because CLD never became available in |
+// time. This is because there is no reasonable way to cover all the cases |
+// under which this could occur, particularly the destruction of the renderer |
+// for which this object was created. However, this value can be synthetically |
+// derived, using the logic below. |
+// |
+// Every page load that triggers language detection will result in the |
+// recording of exactly one of the first two events: ON_TIME or DEFERRED. If |
+// CLD is available in time to satisfy the request, the third event (RESUMED) |
+// will be recorded; thus, the number of times when language detection |
+// ultimately fails because CLD isn't ever available is implied as the number of |
+// times that detection is deferred minus the number of times that language |
+// detection is late: |
+// |
+// count(FAILED) ~= count(DEFERRED) - count(RESUMED) |
+// |
+// Note that this is not 100% accurate: some renderer process are so short-lived |
+// that language detection wouldn't have been relevant anyway, and so a failure |
+// to detect the language in a timely manner might be completely innocuous. The |
+// overall problem with language detection is that it isn't possible to know |
+// whether it was required or not until after it has been performed! |
+// |
+// We use histograms for recording these metrics. On Android, the renderer can |
+// be killed without the chance to clean up or transmit these histograms, |
+// leading to dropped metrics. To work around this, this method forces an IPC |
+// message to be sent to the browser process immediately. |
class TranslateHelper : public content::RenderViewObserver { |
public: |
explicit TranslateHelper(content::RenderView* render_view); |
@@ -113,6 +159,13 @@ class TranslateHelper : public content::RenderViewObserver { |
FRIEND_TEST_ALL_PREFIXES(TranslateHelperTest, SimilarLanguageCode); |
FRIEND_TEST_ALL_PREFIXES(TranslateHelperTest, WellKnownWrongConfiguration); |
+ enum LanguageDetectionTiming { |
+ ON_TIME, // Language detection was performed as soon as it was requested |
+ DEFERRED, // Language detection couldn't be performed when it was requested |
+ RESUMED, // A deferred language detection attempt was completed later |
+ LANGUAGE_DETECTION_TIMING_MAX_VALUE // The bounding value for this enum |
+ }; |
+ |
// Converts language code to the one used in server supporting list. |
static void ConvertLanguageCodeSynonym(std::string* code); |
@@ -167,6 +220,11 @@ class TranslateHelper : public content::RenderViewObserver { |
// Callback triggered when CLD data becomes available. |
void OnCldDataAvailable(); |
+ // Record the timing of language detection, immediately sending an IPC-based |
+ // histogram delta update to the browser process in case the hosting renderer |
+ // process terminates before the metrics would otherwise be transferred. |
+ void RecordLanguageDetectionTiming(LanguageDetectionTiming timing); |
+ |
// An ever-increasing sequence number of the current page, used to match up |
// translation requests with responses. |
int page_seq_no_; |