Skip to content

Commit

Permalink
[Merge to M115] Prerender: Record activation defer time per trigger
Browse files Browse the repository at this point in the history
This CL makes Navigation.Prerender.ActivationCommitDeferTime be recorded
per trigger type so that we can analyze if head-start time of
prerendering that heavily depends on trigger type is sufficient.

Previously this metric was recorded only when
PrerenderCommitDeferringCondition defers navigation. After this CL, the
metric is recorded even when it doesn't defer as zero delay so that we
can see the whole trend of delay due to this condition.

(cherry picked from commit 938494a)

Bug: 1449242
Change-Id: I494bae2145493f7407c0186c084b2b6725f28265
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4570158
Reviewed-by: Takashi Toyoshima <toyoshim@chromium.org>
Commit-Queue: Hiroki Nakagawa <nhiroki@chromium.org>
Reviewed-by: Lingqi Chi <lingqi@chromium.org>
Cr-Original-Commit-Position: refs/heads/main@{#1150378}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4592531
Cr-Commit-Position: refs/branch-heads/5790@{#395}
Cr-Branched-From: 1d71a33-refs/heads/main@{#1148114}
  • Loading branch information
nhiroki authored and Chromium LUCI CQ committed Jun 6, 2023
1 parent 9e8b218 commit c535590
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 8 deletions.
Expand Up @@ -4365,7 +4365,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
// "Navigation.Prerender.ActivationCommitDeferTime" histogram should be
// recorded as PrerenderCommitDeferringCondition defers the navigation.
histogram_tester().ExpectTotalCount(
"Navigation.Prerender.ActivationCommitDeferTime", 1u);
"Navigation.Prerender.ActivationCommitDeferTime.SpeculationRule", 1u);
}

// TODO(https://crbug.com/1182032): Now the File System Access API is not
Expand Down
Expand Up @@ -6,6 +6,8 @@

#include "base/memory/ptr_util.h"
#include "base/task/sequenced_task_runner.h"
#include "content/browser/preloading/prerender/prerender_host.h"
#include "content/browser/preloading/prerender/prerender_metrics.h"
#include "content/browser/renderer_host/frame_tree.h"
#include "content/browser/renderer_host/frame_tree_node.h"
#include "content/browser/renderer_host/navigation_request.h"
Expand Down Expand Up @@ -68,8 +70,16 @@ PrerenderCommitDeferringCondition::WillCommitNavigation(

// If there is no ongoing main frame navigation in prerender frame tree, the
// prerender activation is allowed to continue.
if (!prerender_frame_tree_node->HasNavigation())
if (!prerender_frame_tree_node->HasNavigation()) {
// Record the defer waiting time for PrerenderCommitDeferringCondition as no
// delay.
PrerenderHost& prerender_host =
PrerenderHost::GetFromFrameTreeNode(*prerender_frame_tree_node);
RecordPrerenderActivationCommitDeferTime(
base::TimeDelta(), prerender_host.trigger_type(),
prerender_host.embedder_histogram_suffix());
return Result::kProceed;
}

// Defer the prerender activation until the ongoing prerender main frame
// navigation commits.
Expand Down Expand Up @@ -108,8 +118,11 @@ void PrerenderCommitDeferringCondition::DidFinishNavigation(

// Record the defer waiting time for PrerenderCommitDeferringCondition.
base::TimeDelta delta = base::TimeTicks::Now() - defer_start_time_;
base::UmaHistogramTimes("Navigation.Prerender.ActivationCommitDeferTime",
delta);
PrerenderHost& prerender_host =
PrerenderHost::GetFromFrameTreeNode(*prerender_frame_tree_node);
RecordPrerenderActivationCommitDeferTime(
delta, prerender_host.trigger_type(),
prerender_host.embedder_histogram_suffix());
}
}

Expand Down
7 changes: 7 additions & 0 deletions content/browser/preloading/prerender/prerender_host.cc
Expand Up @@ -120,6 +120,13 @@ PrerenderHost* PrerenderHost::GetPrerenderHostFromFrameTreeNode(
}
}

// static
PrerenderHost& PrerenderHost::GetFromFrameTreeNode(
FrameTreeNode& frame_tree_node) {
CHECK(frame_tree_node.frame_tree().is_prerendering());
return *static_cast<PrerenderHost*>(frame_tree_node.frame_tree().delegate());
}

PrerenderHost::PrerenderHost(
const PrerenderAttributes& attributes,
WebContentsImpl& web_contents,
Expand Down
3 changes: 3 additions & 0 deletions content/browser/preloading/prerender/prerender_host.h
Expand Up @@ -102,6 +102,9 @@ class CONTENT_EXPORT PrerenderHost : public FrameTree::Delegate,
// frame_tree_node is in a prerendering tree.
static PrerenderHost* GetPrerenderHostFromFrameTreeNode(
FrameTreeNode& frame_tree_node);
// Similar to GetPrerenderHostFromFrameTreeNode() but `frame_tree_node` must
// be in prerendering.
static PrerenderHost& GetFromFrameTreeNode(FrameTreeNode& frame_tree_node);

// Checks whether two headers are the same in a case-insensitive and
// order-insensitive way.
Expand Down
10 changes: 10 additions & 0 deletions content/browser/preloading/prerender/prerender_metrics.cc
Expand Up @@ -441,4 +441,14 @@ void RecordPrerenderBackNavigationEligibility(
}
}

void RecordPrerenderActivationCommitDeferTime(
base::TimeDelta time_delta,
PrerenderTriggerType trigger_type,
const std::string& embedder_histogram_suffix) {
base::UmaHistogramTimes(
GenerateHistogramName("Navigation.Prerender.ActivationCommitDeferTime",
trigger_type, embedder_histogram_suffix),
time_delta);
}

} // namespace content
5 changes: 5 additions & 0 deletions content/browser/preloading/prerender/prerender_metrics.h
Expand Up @@ -196,6 +196,11 @@ void RecordPrerenderBackNavigationEligibility(
PrerenderBackNavigationEligibility eligibility,
PreloadingAttempt* preloading_attempt);

void RecordPrerenderActivationCommitDeferTime(
base::TimeDelta time_delta,
PrerenderTriggerType trigger_type,
const std::string& embedder_histogram_suffix);

} // namespace content

#endif // CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_METRICS_H_
15 changes: 11 additions & 4 deletions tools/metrics/histograms/metadata/navigation/histograms.xml
Expand Up @@ -1237,15 +1237,22 @@ Also used in tools/metrics/histograms/metadata/page/histograms.xml.
</summary>
</histogram>

<histogram name="Navigation.Prerender.ActivationCommitDeferTime" units="ms"
expires_after="2023-06-04">
<owner>sreejakshetty@chromium.org</owner>
<owner>altimin@chromium.org</owner>
<histogram
name="Navigation.Prerender.ActivationCommitDeferTime{PrerenderTriggerType}"
units="ms" expires_after="2023-11-23">
<owner>nhiroki@chromium.org</owner>
<owner>chrome-prerendering@chromium.org</owner>
<summary>
Measures time a PrerenderCommitDeferringCondition defers activation waiting
to commit an ongoing mainframe prerender navigation. Logged every time a
PrerenderCommitDeferringCondition defers navigation.

After 2023/05, this metric is used with PrerenderTriggerType key and records
even when PrerenderCommitDeferringCondition doesn't delay navigation as zero
delay. Previously the metric was only used without the key and recorded only
when PrerenderCommitDeferringCondition deferred navigation.
</summary>
<token key="PrerenderTriggerType" variants="PrerenderTriggerType"/>
</histogram>

<histogram name="Navigation.QueueTime.{Method}.{FrameType}" units="ms"
Expand Down

0 comments on commit c535590

Please sign in to comment.