[Merge-87][SH-Clank] Add histograms for cases when tab becomes unavailable.

(cherry picked from commit 1ef9f56f7daca1ce928e1fc6d9e1a56998123ea5)

Bug: 1129652
Change-Id: I02b0ce1774df6c552fa5154df765135d6c81441a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2472262
Reviewed-by: Kyle Milka <[email protected]>
Reviewed-by: David Bokan <[email protected]>
Reviewed-by: sebsg <[email protected]>
Commit-Queue: Gayane Petrosyan <[email protected]>
Cr-Original-Commit-Position: refs/heads/master@{#817551}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2485631
Reviewed-by: Gayane Petrosyan <[email protected]>
Cr-Commit-Position: refs/branch-heads/4280@{#495}
Cr-Branched-From: ea420fb963f9658c9969b6513c56b8f47efa1a2a-refs/heads/master@{#812852}
diff --git a/chrome/browser/share/BUILD.gn b/chrome/browser/share/BUILD.gn
index 331fc7d..a6bd40aa 100644
--- a/chrome/browser/share/BUILD.gn
+++ b/chrome/browser/share/BUILD.gn
@@ -11,6 +11,7 @@
     "bitmap_download_request.cc",
     "features.cc",
     "features.h",
+    "link_to_text_metrics_bridge.cc",
     "qr_code_generation_request.cc",
     "qr_code_generation_request.h",
   ]
@@ -19,6 +20,7 @@
     "//chrome/browser/share/android:jni_headers",
     "//chrome/services/qrcode_generator/public/cpp",
     "//chrome/services/qrcode_generator/public/mojom",
+    "//components/shared_highlighting/core/common",
     "//content/public/browser",
     "//skia",
     "//ui/gfx",
diff --git a/chrome/browser/share/DEPS b/chrome/browser/share/DEPS
index 8010860..be66cce 100644
--- a/chrome/browser/share/DEPS
+++ b/chrome/browser/share/DEPS
@@ -22,6 +22,7 @@
   "+components/browser_ui/share/android",
   "+components/browser_ui/android/bottomsheet",
   "+components/infobars/android",
+  "+components/shared_highlighting/core/common",
   "+content/public/android/java/src/org/chromium/content_public/browser/RenderWidgetHostView.java",
   "+content/public/android/java/src/org/chromium/content_public/browser/WebContents.java",
 ]
diff --git a/chrome/browser/share/android/BUILD.gn b/chrome/browser/share/android/BUILD.gn
index f433a032..fa9c377 100644
--- a/chrome/browser/share/android/BUILD.gn
+++ b/chrome/browser/share/android/BUILD.gn
@@ -35,6 +35,7 @@
 generate_jni("jni_headers") {
   sources = [
     "java/src/org/chromium/chrome/browser/share/BitmapDownloadRequest.java",
+    "java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextMetricsBridge.java",
     "java/src/org/chromium/chrome/browser/share/qrcode/QRCodeGenerationRequest.java",
     "java/src/org/chromium/chrome/browser/share/send_tab_to_self/NotificationManager.java",
     "java/src/org/chromium/chrome/browser/share/send_tab_to_self/SendTabToSelfAndroidBridge.java",
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinator.java
index 81eec08..274cea4 100644
--- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinator.java
+++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinator.java
@@ -110,18 +110,21 @@
     // Discard results if tab is not on foreground anymore.
     @Override
     public void onHidden(Tab tab, @TabHidingType int type) {
+        LinkToTextMetricsBridge.logGenerateErrorTabHidden();
         cleanup();
     }
 
     // Discard results if tab content is changed by typing new URL in omnibox.
     @Override
     public void onUpdateUrl(Tab tab, String url) {
+        LinkToTextMetricsBridge.logGenerateErrorOmniboxNavigation();
         cleanup();
     }
 
     // Discard results if tab content crashes.
     @Override
     public void onCrash(Tab tab) {
+        LinkToTextMetricsBridge.logGenerateErrorTabCrash();
         cleanup();
     }
 
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextMetricsBridge.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextMetricsBridge.java
new file mode 100644
index 0000000..3457136
--- /dev/null
+++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextMetricsBridge.java
@@ -0,0 +1,31 @@
+// Copyright 2020 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.
+
+package org.chromium.chrome.browser.share.link_to_text;
+
+import org.chromium.base.annotations.NativeMethods;
+
+/**
+ * A Java API for recording Link to Text metrics.
+ */
+public class LinkToTextMetricsBridge {
+    public static void logGenerateErrorTabHidden() {
+        LinkToTextMetricsBridgeJni.get().logGenerateErrorTabHidden();
+    }
+
+    public static void logGenerateErrorOmniboxNavigation() {
+        LinkToTextMetricsBridgeJni.get().logGenerateErrorOmniboxNavigation();
+    }
+
+    public static void logGenerateErrorTabCrash() {
+        LinkToTextMetricsBridgeJni.get().logGenerateErrorTabCrash();
+    }
+
+    @NativeMethods
+    interface Natives {
+        void logGenerateErrorTabHidden();
+        void logGenerateErrorOmniboxNavigation();
+        void logGenerateErrorTabCrash();
+    }
+}
diff --git a/chrome/browser/share/android/java_sources.gni b/chrome/browser/share/android/java_sources.gni
index 00f7a02b..8c7ba34 100644
--- a/chrome/browser/share/android/java_sources.gni
+++ b/chrome/browser/share/android/java_sources.gni
@@ -8,6 +8,7 @@
   "//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/BitmapDownloadRequest.java",
   "//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/clipboard/ClipboardImageFileProvider.java",
   "//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinator.java",
+  "//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextMetricsBridge.java",
   "//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QRCodeGenerationRequest.java",
   "//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeCoordinator.java",
   "//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeDialog.java",
diff --git a/chrome/browser/share/link_to_text_metrics_bridge.cc b/chrome/browser/share/link_to_text_metrics_bridge.cc
new file mode 100644
index 0000000..dc3019ee
--- /dev/null
+++ b/chrome/browser/share/link_to_text_metrics_bridge.cc
@@ -0,0 +1,21 @@
+// Copyright 2020 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 <jni.h>
+
+#include "chrome/browser/share/android/jni_headers/LinkToTextMetricsBridge_jni.h"
+#include "components/shared_highlighting/core/common/shared_highlighting_metrics.h"
+
+static void JNI_LinkToTextMetricsBridge_LogGenerateErrorTabHidden(JNIEnv* env) {
+  shared_highlighting::LogGenerateErrorTabHidden();
+}
+
+static void JNI_LinkToTextMetricsBridge_LogGenerateErrorOmniboxNavigation(
+    JNIEnv* env) {
+  shared_highlighting::LogGenerateErrorOmniboxNavigation();
+}
+
+static void JNI_LinkToTextMetricsBridge_LogGenerateErrorTabCrash(JNIEnv* env) {
+  shared_highlighting::LogGenerateErrorTabCrash();
+}
diff --git a/components/shared_highlighting/core/common/shared_highlighting_metrics.cc b/components/shared_highlighting/core/common/shared_highlighting_metrics.cc
index 9713358..30f4136d 100644
--- a/components/shared_highlighting/core/common/shared_highlighting_metrics.cc
+++ b/components/shared_highlighting/core/common/shared_highlighting_metrics.cc
@@ -47,4 +47,18 @@
   base::UmaHistogramCounts100("TextFragmentAnchor.SelectorCount", count);
 }
 
+void LogGenerateErrorTabHidden() {
+  base::UmaHistogramEnumeration("SharedHighlights.LinkGenerated.Error",
+                                LinkGenerationError::kTabHidden);
+}
+
+void LogGenerateErrorOmniboxNavigation() {
+  base::UmaHistogramEnumeration("SharedHighlights.LinkGenerated.Error",
+                                LinkGenerationError::kOmniboxNavigation);
+}
+
+void LogGenerateErrorTabCrash() {
+  base::UmaHistogramEnumeration("SharedHighlights.LinkGenerated.Error",
+                                LinkGenerationError::kTabCrash);
+}
 }  // namespace shared_highlighting
diff --git a/components/shared_highlighting/core/common/shared_highlighting_metrics.h b/components/shared_highlighting/core/common/shared_highlighting_metrics.h
index 14a12cc..cb1e9826 100644
--- a/components/shared_highlighting/core/common/shared_highlighting_metrics.h
+++ b/components/shared_highlighting/core/common/shared_highlighting_metrics.h
@@ -18,7 +18,11 @@
   kContextLimitReached,
   kEmptySelection,
 
-  kMaxValue = kEmptySelection,
+  kTabHidden,
+  kOmniboxNavigation,
+  kTabCrash,
+
+  kMaxValue = kTabCrash
 };
 
 // Update corresponding |TextFragmentLinkOpenSource| in enums.xml.
@@ -45,6 +49,15 @@
 // Records the total |count| of text fragment selectors in the URL param.
 void LogTextFragmentSelectorCount(int count);
 
+// Records when tab is hidden before generation is complete.
+void LogGenerateErrorTabHidden();
+
+// Records when new navigation happens on the tab by user typing in the omnibox.
+void LogGenerateErrorOmniboxNavigation();
+
+// Records when tab crashes before generation is complete.
+void LogGenerateErrorTabCrash();
+
 }  // namespace shared_highlighting
 
 #endif  // COMPONENTS_SHARED_HIGHLIGHTING_CORE_COMMON_SHARED_HIGHLIGHTING_METRICS_H_
\ No newline at end of file
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.h b/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.h
index 487c4b2..902d757 100644
--- a/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.h
+++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.h
@@ -40,7 +40,13 @@
     kContextLimitReached,
     kEmptySelection,
 
-    kMaxValue = kContextLimitReached
+    // Recorded from browser/java side when tab or its content becomes
+    // unavailable. Added here to keep in sync with the enums.xml values.
+    kTabHidden,
+    kOmniboxNavigation,
+    kTabCrash,
+
+    kMaxValue = kTabCrash
   };
   explicit TextFragmentSelectorGenerator() = default;
 
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index d2229e3..e0f0197 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -40268,6 +40268,9 @@
   <int value="3" label="Available context exhausted"/>
   <int value="4" label="Context word limit reached"/>
   <int value="5" label="Empty selection"/>
+  <int value="6" label="Tab hidden"/>
+  <int value="7" label="Omnibox navigation"/>
+  <int value="8" label="Tab crash"/>
 </enum>
 
 <enum name="LinkMonitorFailureType">