Commit 2027bb3f authored by Vladimir Levin's avatar Vladimir Levin Committed by Commit Bot

FindInPage: Add UKM metrics for use of find-in-page as well as render-subtree.

This patch adds a UKM metric that tracks two boolean values recorded
once per (main frame's) document:
- Whether find-in-page happened on that page
- Whether a find-in-page activated a render-subtree element.

R=chrishtr@chromium.org, schenney@chromium.org

Bug: 1044299
Change-Id: I753702069fdad5d3145f7afe822ca638304470b2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2013744
Commit-Queue: vmpstr <vmpstr@chromium.org>
Reviewed-by: default avatarChris Harrelson <chrishtr@chromium.org>
Reviewed-by: default avatarStephen Chenney <schenney@chromium.org>
Reviewed-by: default avatarAlexei Svitkine <asvitkine@chromium.org>
Cr-Commit-Position: refs/heads/master@{#735061}
parent c98131dc
......@@ -468,6 +468,8 @@ void DisplayLockContext::CommitForActivationWithSignal(
StartCommit();
RecordActivationReason(reason_for_metrics);
if (reason_for_metrics == DisplayLockActivationReason::kFindInPage)
document_->MarkHasFindInPageRenderSubtreeActiveMatch();
if (!IsAttributeVersion(this)) {
css_is_activated_ = true;
......
......@@ -2649,6 +2649,38 @@ void Document::ApplyScrollRestorationLogic() {
View()->GetScrollableArea()->ApplyPendingHistoryRestoreScrollOffset();
}
void Document::MarkHasFindInPageRequest() {
// Note that although find-in-page requests happen in non-main frames, we only
// record the main frame results (per UKM policy). Additionally, we only
// record the event once.
if (had_find_in_page_request_ || !IsInMainFrame())
return;
auto* recorder = UkmRecorder();
DCHECK(recorder);
DCHECK(UkmSourceID() != ukm::kInvalidSourceId);
ukm::builders::Blink_FindInPage(UkmSourceID())
.SetDidSearch(true)
.Record(recorder);
had_find_in_page_request_ = true;
}
void Document::MarkHasFindInPageRenderSubtreeActiveMatch() {
// Note that although find-in-page in render-subtree requests happen in
// non-main frames, we only record the main frame results (per UKM policy).
// Additionally, we only record the event once.
if (had_find_in_page_render_subtree_active_match_ || !IsInMainFrame())
return;
auto* recorder = UkmRecorder();
DCHECK(recorder);
DCHECK(UkmSourceID() != ukm::kInvalidSourceId);
ukm::builders::Blink_FindInPage(UkmSourceID())
.SetDidHaveRenderSubtreeMatch(true)
.Record(recorder);
had_find_in_page_render_subtree_active_match_ = true;
}
void Document::UpdateStyleAndLayout(ForcedLayoutStatus status) {
DCHECK(IsMainThread());
LocalFrameView* frame_view = View();
......
......@@ -1645,6 +1645,9 @@ class CORE_EXPORT Document : public ContainerNode,
void ApplyScrollRestorationLogic();
void MarkHasFindInPageRequest();
void MarkHasFindInPageRenderSubtreeActiveMatch();
protected:
void ClearXMLVersion() { xml_version_ = String(); }
......@@ -1662,6 +1665,7 @@ class CORE_EXPORT Document : public ContainerNode,
friend class NthIndexCache;
FRIEND_TEST_ALL_PREFIXES(FrameFetchContextSubresourceFilterTest,
DuringOnFreeze);
FRIEND_TEST_ALL_PREFIXES(DocumentTest, FindInPageUkm);
class NetworkStateObserver;
Document(const DocumentInit& initization,
......@@ -2181,6 +2185,10 @@ class CORE_EXPORT Document : public ContainerNode,
bool in_forced_colors_mode_;
bool applying_scroll_restoration_logic_ = false;
// Records find-in-page metrics, which are sent to UKM on shutdown.
bool had_find_in_page_request_ = false;
bool had_find_in_page_render_subtree_active_match_ = false;
};
extern template class CORE_EXTERN_TEMPLATE_EXPORT Supplement<Document>;
......
......@@ -34,6 +34,7 @@
#include "base/strings/stringprintf.h"
#include "build/build_config.h"
#include "components/ukm/test_ukm_recorder.h"
#include "services/network/public/mojom/referrer_policy.mojom-blink.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -1259,6 +1260,44 @@ TEST_F(DocumentTest, DocumentPolicyFeaturePolicyCoexist) {
GetDocument().IsFeatureEnabled(unsupported_feature, report_option));
}
TEST_F(DocumentTest, FindInPageUkm) {
GetDocument().ukm_recorder_ = std::make_unique<ukm::TestUkmRecorder>();
auto* recorder =
static_cast<ukm::TestUkmRecorder*>(GetDocument().UkmRecorder());
EXPECT_EQ(recorder->entries_count(), 0u);
GetDocument().MarkHasFindInPageRequest();
EXPECT_EQ(recorder->entries_count(), 1u);
GetDocument().MarkHasFindInPageRequest();
EXPECT_EQ(recorder->entries_count(), 1u);
auto entries = recorder->GetEntriesByName("Blink.FindInPage");
EXPECT_EQ(entries.size(), 1u);
EXPECT_TRUE(ukm::TestUkmRecorder::EntryHasMetric(entries[0], "DidSearch"));
EXPECT_EQ(*ukm::TestUkmRecorder::GetEntryMetric(entries[0], "DidSearch"), 1);
EXPECT_FALSE(ukm::TestUkmRecorder::EntryHasMetric(
entries[0], "DidHaveRenderSubtreeMatch"));
GetDocument().MarkHasFindInPageRenderSubtreeActiveMatch();
EXPECT_EQ(recorder->entries_count(), 2u);
GetDocument().MarkHasFindInPageRenderSubtreeActiveMatch();
EXPECT_EQ(recorder->entries_count(), 2u);
entries = recorder->GetEntriesByName("Blink.FindInPage");
EXPECT_EQ(entries.size(), 2u);
EXPECT_TRUE(ukm::TestUkmRecorder::EntryHasMetric(entries[0], "DidSearch"));
EXPECT_EQ(*ukm::TestUkmRecorder::GetEntryMetric(entries[0], "DidSearch"), 1);
EXPECT_FALSE(ukm::TestUkmRecorder::EntryHasMetric(
entries[0], "DidHaveRenderSubtreeMatch"));
EXPECT_TRUE(ukm::TestUkmRecorder::EntryHasMetric(
entries[1], "DidHaveRenderSubtreeMatch"));
EXPECT_EQ(*ukm::TestUkmRecorder::GetEntryMetric(entries[1],
"DidHaveRenderSubtreeMatch"),
1);
EXPECT_FALSE(ukm::TestUkmRecorder::EntryHasMetric(entries[1], "DidSearch"));
}
/**
* Tests for viewport-fit propagation.
*/
......
......@@ -62,6 +62,10 @@ void FindInPage::Find(int request_id,
const String& search_text,
mojom::blink::FindOptionsPtr options) {
DCHECK(!search_text.IsEmpty());
// Record the fact that we have a find-in-page request.
frame_->GetFrame()->GetDocument()->MarkHasFindInPageRequest();
blink::WebPlugin* plugin = GetWebPluginForFind();
// Check if the plugin still exists in the document.
if (plugin) {
......
......@@ -1587,6 +1587,27 @@ be describing additional metrics about the same event.
</metric>
</event>
<event name="Blink.FindInPage" singular="True">
<owner>vmpstr@chromium.org</owner>
<owner>chrishtr@chromium.org</owner>
<owner>paint-dev@chromium.org</owner>
<summary>
Logged once per page; indicates the type of find-in-page behaviors users
utilizied.
</summary>
<metric name="DidHaveRenderSubtreeMatch">
<summary>
Boolean indicating whether there was an active match in render-subtree
locked elements.
</summary>
</metric>
<metric name="DidSearch">
<summary>
Boolean indicating that find-in-page happened.
</summary>
</metric>
</event>
<event name="Blink.PageLoad">
<owner>schenney@chromium.org</owner>
<owner>paint-dev@chromium.org</owner>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment