mirror of
https://github.com/servo/servo
synced 2026-05-13 02:17:06 +02:00
Steps for calculating LCP: 1. When the pref for `largest_contentful_paint_enabled` is enabled, `LargestContentfulPaintCandidateCollector` is created once per LayoutThread using `viewport_size`. 2. While building the `display_list`, it send the pre-calculated `clip_rect` and `bounds` to `LCPCollector` along with `transform` and `LCPCandidateType` for `visual_rect` calculation for `LCPCandidates`. 3. After `visual_rect` calculation, update the `lcp_candidate` based on `area` of `visual_rect` and send it to `compositor`. 4. Then among `lcp_candidates`, we find out the `largest_contentful_paint` and send it to `paint_metric` 5. In addition to above `LCP` also uses `PaintMetricState` to save console from spamming with duplicate entries. This PR includes following commits better segregation of code 1. Add `LargestContentfulPaintCandidate` struct 2. Add `LargestContentfulPaintCandidateCollector` 6. Collect the `LargestContentfulPaintCandidates`when feature is enabled. 7. Send the `LargestContentfulPaintCandidates` to compositor 8. Add `LargestContentfulPaintCalculator` 9. Calculates the `LargestContentfulPaint` 10. Send `LCP` to `PaintMetrics` 11. Disable `LCP` feature on user interaction Elements considered for LCP in this PR: - Image element - An element with background image Reference: https://github.com/servo/servo/pull/38041 Testing: Tested using [perf-analysis-tools](https://github.com/servo/perf-analysis-tools) See attached screenshot. Fixes: None Perfetto <img width="2566" height="1151" alt="Screenshot from 2025-10-16 11-37-41" src="https://github.com/user-attachments/assets/96e4f933-b39c-4ac7-833c-46dcc0c1671e" /> Console Output of Metric <img width="1784" height="282" alt="Screenshot from 2025-10-16 11-33-16" src="https://github.com/user-attachments/assets/441746a5-92ae-47c6-9022-f49114f23a2d" /> --------- Signed-off-by: Shubham Gupta <shubham.gupta@chromium.org> Co-authored-by: boluochoufeng <1355990831@qq.com>