Commit 05d3fb8d authored by Weiliang Chen's avatar Weiliang Chen Committed by Chromium LUCI CQ

metrics: Make WebVitalMetrics Class Trivially Copyable

In order to use the WebVitalMetrics class with shared memory in the
follow up CLs, make the WebVitalMetrics class trivially copyable.

R=sadrul

Bug: 1151343
Change-Id: Ib613198bfc0b54667b4048ab9e2eefe16b4fbdf6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2602383Reviewed-by: default avatarSadrul Chowdhury <sadrul@chromium.org>
Reviewed-by: default avatarDavid Bokan <bokan@chromium.org>
Reviewed-by: default avatarweiliangc <weiliangc@chromium.org>
Commit-Queue: weiliangc <weiliangc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#841635}
parent a3ae2f56
......@@ -1097,10 +1097,11 @@ int HeadsUpDisplayLayerImpl::DrawSingleMetric(
int top,
std::string name,
const WebVitalMetrics::MetricsInfo& info,
bool has_value,
double value) const {
std::string value_str = "-";
SkColor metrics_color = DebugColors::HUDTitleColor();
if (value >= 0.f) {
if (has_value) {
value_str = ToStringTwoDecimalPrecision(value) + info.UnitToString();
if (value < info.green_threshold)
metrics_color = SK_ColorGREEN;
......@@ -1132,25 +1133,27 @@ SkRect HeadsUpDisplayLayerImpl::DrawWebVitalMetrics(PaintCanvas* canvas,
DrawGraphBackground(canvas, &flags, area);
int current_top = top + metrics_sizes.kTopPadding + metrics_sizes.kFontHeight;
double lcp_value = -1;
if (web_vital_metrics_ &&
web_vital_metrics_->largest_contentful_paint.has_value())
lcp_value = web_vital_metrics_->largest_contentful_paint->InSecondsF();
current_top = DrawSingleMetric(canvas, left, left + width, current_top,
"Largest Contentful Paint",
WebVitalMetrics::lcp_info, lcp_value);
double metric_value = 0.f;
bool has_lcp = web_vital_metrics_ && web_vital_metrics_->has_lcp;
if (has_lcp)
metric_value = web_vital_metrics_->largest_contentful_paint.InSecondsF();
current_top = DrawSingleMetric(
canvas, left, left + width, current_top, "Largest Contentful Paint",
WebVitalMetrics::lcp_info, has_lcp, metric_value);
double fid_value = -1;
if (web_vital_metrics_ && web_vital_metrics_->first_input_delay.has_value())
fid_value = web_vital_metrics_->first_input_delay->InMillisecondsF();
bool has_fid = web_vital_metrics_ && web_vital_metrics_->has_fid;
if (has_fid)
metric_value = web_vital_metrics_->first_input_delay.InMillisecondsF();
current_top = DrawSingleMetric(canvas, left, left + width, current_top,
"First Input Delay", WebVitalMetrics::fid_info,
fid_value);
has_fid, metric_value);
bool has_layout_shift = web_vital_metrics_ && web_vital_metrics_->has_cls;
if (has_layout_shift)
metric_value = web_vital_metrics_->layout_shift;
current_top = DrawSingleMetric(
canvas, left, left + width, current_top, "Cumulative Layout Shift",
WebVitalMetrics::cls_info,
web_vital_metrics_ ? web_vital_metrics_->layout_shift : -1);
WebVitalMetrics::cls_info, has_layout_shift, metric_value);
return area;
}
......
......@@ -143,6 +143,7 @@ class CC_EXPORT HeadsUpDisplayLayerImpl : public LayerImpl {
int top,
std::string name,
const WebVitalMetrics::MetricsInfo& info,
bool has_value,
double value) const;
SkRect DrawWebVitalMetrics(PaintCanvas* canvas,
int left,
......
......@@ -10,21 +10,4 @@ constexpr WebVitalMetrics::MetricsInfo WebVitalMetrics::lcp_info;
constexpr WebVitalMetrics::MetricsInfo WebVitalMetrics::fid_info;
constexpr WebVitalMetrics::MetricsInfo WebVitalMetrics::cls_info;
WebVitalMetrics::WebVitalMetrics() = default;
WebVitalMetrics::WebVitalMetrics(const WebVitalMetrics& other) = default;
bool WebVitalMetrics::HasValue() const {
if (largest_contentful_paint.has_value())
return true;
if (first_input_delay.has_value())
return true;
if (layout_shift > 0.f)
return true;
return false;
}
} // namespace cc
......@@ -14,14 +14,17 @@ namespace cc {
// Web Vital metrics reported from blink to be displayed with cc's HUD display.
struct CC_EXPORT WebVitalMetrics {
base::Optional<base::TimeDelta> largest_contentful_paint;
base::Optional<base::TimeDelta> first_input_delay;
bool has_lcp = false;
base::TimeDelta largest_contentful_paint;
bool has_fid = false;
base::TimeDelta first_input_delay;
bool has_cls = false;
double layout_shift = 0.f;
WebVitalMetrics();
WebVitalMetrics(const WebVitalMetrics& other);
WebVitalMetrics() = default;
WebVitalMetrics(const WebVitalMetrics& other) = default;
bool HasValue() const;
bool HasValue() const { return has_lcp || has_fid || has_cls; }
struct MetricsInfo {
double green_threshold;
......
......@@ -2119,22 +2119,28 @@ std::unique_ptr<cc::WebVitalMetrics> WebFrameWidgetImpl::GetWebVitalMetrics() {
// This class should be called at most once per commit.
WebPerformance perf = LocalRootImpl()->Performance();
auto metrics = std::make_unique<cc::WebVitalMetrics>();
if (perf.FirstInputDelay().has_value())
metrics->first_input_delay = *perf.FirstInputDelay();
if (perf.FirstInputDelay().has_value()) {
metrics->first_input_delay = perf.FirstInputDelay().value();
metrics->has_fid = true;
}
base::TimeTicks start = perf.NavigationStartAsMonotonicTime();
base::TimeTicks largest_contentful_paint =
perf.LargestContentfulPaintAsMonotonicTime();
if (largest_contentful_paint >= start)
if (largest_contentful_paint >= start) {
metrics->largest_contentful_paint = largest_contentful_paint - start;
metrics->has_lcp = true;
}
double layout_shift = LocalRootImpl()
->GetFrame()
->View()
->GetLayoutShiftTracker()
.WeightedScore();
if (layout_shift > 0.f)
if (layout_shift > 0.f) {
metrics->layout_shift = layout_shift;
metrics->has_cls = true;
}
if (!metrics->HasValue())
return nullptr;
......
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