Record when text selection is in iframe

Bug: 1139864
Change-Id: I17686adaf4241202e400acb18f6c8fc8b6a83a7c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2513290
Commit-Queue: Gayane Petrosyan <[email protected]>
Reviewed-by: sebsg <[email protected]>
Reviewed-by: Scott Violet <[email protected]>
Cr-Commit-Position: refs/heads/master@{#824048}
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index d3013f5c..48077f0 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -4029,6 +4029,7 @@
       "//components/services/app_service/public/cpp:intents",
       "//components/services/app_service/public/cpp:preferred_apps",
       "//components/services/app_service/public/cpp:publisher",
+      "//components/shared_highlighting/core/common",
       "//components/soda:constants",
       "//components/ukm/content",
       "//components/web_modal",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index 1a3da83..e81266d 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -242,6 +242,7 @@
   "+components/safe_browsing",
   "+components/safe_search_api",
   "+components/schema_org",
+  "+components/shared_highlighting/core/common",
   "+components/search",
   "+components/search_engines",
   "+components/search_provider_logos",
diff --git a/chrome/browser/renderer_context_menu/copy_link_to_text_menu_observer.cc b/chrome/browser/renderer_context_menu/copy_link_to_text_menu_observer.cc
index 7e866d5..0879021d2 100644
--- a/chrome/browser/renderer_context_menu/copy_link_to_text_menu_observer.cc
+++ b/chrome/browser/renderer_context_menu/copy_link_to_text_menu_observer.cc
@@ -10,6 +10,7 @@
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/renderer_context_menu/render_view_context_menu_proxy.h"
+#include "components/shared_highlighting/core/common/shared_highlighting_metrics.h"
 #include "content/public/browser/context_menu_params.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/web_contents.h"
@@ -71,6 +72,7 @@
     return;
 
   if (main_frame != proxy_->GetWebContents()->GetFocusedFrame()) {
+    shared_highlighting::LogGenerateErrorIFrame();
     OnGeneratedSelector(std::make_unique<ui::DataTransferEndpoint>(
                             main_frame->GetLastCommittedOrigin()),
                         std::string());
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 49093a4..8271fe5 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
@@ -73,6 +73,7 @@
 
     public void requestSelector() {
         if (mTab.getWebContents().getMainFrame() != mTab.getWebContents().getFocusedFrame()) {
+            LinkToTextMetricsBridge.logGenerateErrorIFrame();
             onSelectorReady(INVALID_SELECTOR);
             return;
         }
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
index 3457136..a622eb24 100644
--- 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
@@ -22,10 +22,15 @@
         LinkToTextMetricsBridgeJni.get().logGenerateErrorTabCrash();
     }
 
+    public static void logGenerateErrorIFrame() {
+        LinkToTextMetricsBridgeJni.get().logGenerateErrorIFrame();
+    }
+
     @NativeMethods
     interface Natives {
         void logGenerateErrorTabHidden();
         void logGenerateErrorOmniboxNavigation();
         void logGenerateErrorTabCrash();
+        void logGenerateErrorIFrame();
     }
 }
diff --git a/chrome/browser/share/link_to_text_metrics_bridge.cc b/chrome/browser/share/link_to_text_metrics_bridge.cc
index dc3019ee..5a91d22b 100644
--- a/chrome/browser/share/link_to_text_metrics_bridge.cc
+++ b/chrome/browser/share/link_to_text_metrics_bridge.cc
@@ -19,3 +19,7 @@
 static void JNI_LinkToTextMetricsBridge_LogGenerateErrorTabCrash(JNIEnv* env) {
   shared_highlighting::LogGenerateErrorTabCrash();
 }
+
+static void JNI_LinkToTextMetricsBridge_LogGenerateErrorIFrame(JNIEnv* env) {
+  shared_highlighting::LogGenerateErrorIFrame();
+}
diff --git a/components/shared_highlighting/core/common/shared_highlighting_metrics.cc b/components/shared_highlighting/core/common/shared_highlighting_metrics.cc
index d7ff94c1..809d83f 100644
--- a/components/shared_highlighting/core/common/shared_highlighting_metrics.cc
+++ b/components/shared_highlighting/core/common/shared_highlighting_metrics.cc
@@ -66,4 +66,8 @@
 void LogGenerateErrorTabCrash() {
   LogLinkGenerationErrorReason(LinkGenerationError::kTabCrash);
 }
+
+void LogGenerateErrorIFrame() {
+  LogLinkGenerationErrorReason(LinkGenerationError::kIFrame);
+}
 }  // 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 6a0856c..da1b339b 100644
--- a/components/shared_highlighting/core/common/shared_highlighting_metrics.h
+++ b/components/shared_highlighting/core/common/shared_highlighting_metrics.h
@@ -28,7 +28,10 @@
   // Catch-all bucket.
   kUnknown = 9,
 
-  kMaxValue = kUnknown
+  // Selection happened on iframe.
+  kIFrame = 10,
+
+  kMaxValue = kIFrame
 };
 
 // These values are persisted to logs. Entries should not be renumbered and
@@ -72,6 +75,10 @@
 // Records when tab crashes before generation is complete.
 void LogGenerateErrorTabCrash();
 
+// Records when link generation was not completed because selection happened on
+// iframe.
+void LogGenerateErrorIFrame();
+
 }  // namespace shared_highlighting
 
 #endif  // COMPONENTS_SHARED_HIGHLIGHTING_CORE_COMMON_SHARED_HIGHLIGHTING_METRICS_H_
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 9f0db44..9fd3b111 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
@@ -48,7 +48,9 @@
 
     kUnknown,
 
-    kMaxValue = kUnknown
+    kIFrame,
+
+    kMaxValue = kIFrame
   };
   explicit TextFragmentSelectorGenerator() = default;
 
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 30ad443a..71147e92 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -40909,6 +40909,7 @@
   <int value="7" label="Omnibox navigation"/>
   <int value="8" label="Tab crash"/>
   <int value="9" label="Unknown"/>
+  <int value="10" label="Iframe"/>
 </enum>
 
 <enum name="LinkMonitorFailureType">