Commit 7aba141f authored by Jan Scheffler's avatar Jan Scheffler Committed by Commit Bot

[devtools] Fix LCP in Performance Timing

This patch adds the navigationId to LCP events to allow
reporting of LCP for every navigation.

Bug: chromium:1001010
Change-Id: If813f679d75c45bbb16a270576f5c9be0f47c772
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1790445
Commit-Queue: Jan Scheffler <janscheffler@google.com>
Reviewed-by: default avatarAlexei Filippov <alph@chromium.org>
Reviewed-by: default avatarSteve Kobes <skobes@chromium.org>
Reviewed-by: default avatarLiquan (Max) Gu <maxlg@chromium.org>
Reviewed-by: default avatarYang Guo <yangguo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#697507}
parent 9135ffb6
......@@ -3,7 +3,7 @@
// found in the LICENSE file.
#include "third_party/blink/renderer/core/paint/largest_contentful_paint_calculator.h"
#include "third_party/blink/renderer/core/inspector/identifiers_factory.h"
#include "third_party/blink/renderer/core/paint/image_element_timing.h"
namespace blink {
......@@ -189,6 +189,9 @@ LargestContentfulPaintCalculator::TextCandidateTraceData() {
value->SetInteger("candidateIndex", ++count_candidates_);
value->SetBoolean("isMainFrame",
window_performance_->GetFrame()->IsMainFrame());
auto* document = window_performance_->DomWindow()->document();
value->SetString("navigationId",
IdentifiersFactory::LoaderId(document->Loader()));
return value;
}
......@@ -201,6 +204,10 @@ LargestContentfulPaintCalculator::ImageCandidateTraceData() {
value->SetInteger("candidateIndex", ++count_candidates_);
value->SetBoolean("isMainFrame",
window_performance_->GetFrame()->IsMainFrame());
auto* document = window_performance_->DomWindow()->document();
value->SetString("navigationId",
IdentifiersFactory::LoaderId(document->Loader()));
return value;
}
......@@ -210,6 +217,10 @@ LargestContentfulPaintCalculator::InvalidationTraceData() {
value->SetInteger("candidateIndex", ++count_candidates_);
value->SetBoolean("isMainFrame",
window_performance_->GetFrame()->IsMainFrame());
auto* document = window_performance_->DomWindow()->document();
value->SetString("navigationId",
IdentifiersFactory::LoaderId(document->Loader()));
return value;
}
......
......@@ -548,11 +548,20 @@ Timeline.TimelineFlameChartDataProvider = class extends Common.Object {
// Only the LCP event with the largest candidate index is relevant.
// Do not record an LCP event if it is an invalidate event.
if (lcpEvents.length > 0) {
const winning_event = lcpEvents.reduce(function(a, b) {
return Number(a.args['data']['candidateIndex']) > Number(b.args['data']['candidateIndex']) ? a : b;
});
if (timelineModel.isLCPCandidateEvent(winning_event))
metricEvents.push(winning_event);
/** @type {!Map<string, !SDK.TracingModel.Event>} */
const lcpEventsByNavigationId = new Map();
for (const e of lcpEvents) {
const key = e.args['data']['navigationId'];
const previousLastEvent = lcpEventsByNavigationId.get(key);
if (!previousLastEvent || previousLastEvent.args['data']['candidateIndex'] < e.args['data']['candidateIndex'])
lcpEventsByNavigationId.set(key, e);
}
const latestCandidates = Array.from(lcpEventsByNavigationId.values());
const latestEvents = latestCandidates.filter(e => timelineModel.isLCPCandidateEvent(e));
metricEvents.push(...latestEvents);
}
metricEvents.sort(SDK.TracingModel.Event.compareStartTime);
......
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