script/dom/performance/
largestcontentfulpaint.rs1use base::cross_process_instant::CrossProcessInstant;
6use dom_struct::dom_struct;
7use script_traits::ProgressiveWebMetricType;
8use time::Duration;
9
10use super::performanceentry::PerformanceEntry;
11use crate::dom::bindings::codegen::Bindings::LargestContentfulPaintBinding::LargestContentfulPaintMethods;
12use crate::dom::bindings::codegen::Bindings::PerformanceBinding::DOMHighResTimeStamp;
13use crate::dom::bindings::reflector::{DomGlobal, reflect_dom_object};
14use crate::dom::bindings::root::DomRoot;
15use crate::dom::bindings::str::DOMString;
16use crate::dom::element::Element;
17use crate::dom::globalscope::GlobalScope;
18use crate::script_runtime::CanGc;
19
20#[dom_struct]
21pub(crate) struct LargestContentfulPaint {
22 entry: PerformanceEntry,
23 #[no_trace]
24 load_time: CrossProcessInstant,
25 #[no_trace]
26 render_time: CrossProcessInstant,
27 size: usize,
28 element: Option<DomRoot<Element>>,
29}
30
31impl LargestContentfulPaint {
32 pub(crate) fn new_inherited(
33 metric_type: ProgressiveWebMetricType,
34 render_time: CrossProcessInstant,
35 ) -> LargestContentfulPaint {
36 LargestContentfulPaint {
37 entry: PerformanceEntry::new_inherited(
38 DOMString::from(""),
39 DOMString::from("largest-contentful-paint"),
40 Some(render_time),
41 Duration::ZERO,
42 ),
43 load_time: CrossProcessInstant::epoch(),
44 render_time,
45 size: metric_type.area(),
46 element: None,
47 }
48 }
49
50 #[cfg_attr(crown, allow(crown::unrooted_must_root))]
51 pub(crate) fn new(
52 global: &GlobalScope,
53 metric_type: ProgressiveWebMetricType,
54 render_time: CrossProcessInstant,
55 can_gc: CanGc,
56 ) -> DomRoot<LargestContentfulPaint> {
57 let entry = LargestContentfulPaint::new_inherited(metric_type, render_time);
58 reflect_dom_object(Box::new(entry), global, can_gc)
59 }
60}
61
62impl LargestContentfulPaintMethods<crate::DomTypeHolder> for LargestContentfulPaint {
63 fn LoadTime(&self) -> DOMHighResTimeStamp {
65 self.global()
66 .performance()
67 .to_dom_high_res_time_stamp(self.load_time)
68 }
69
70 fn RenderTime(&self) -> DOMHighResTimeStamp {
72 self.global()
73 .performance()
74 .to_dom_high_res_time_stamp(self.render_time)
75 }
76
77 fn Size(&self) -> u32 {
79 self.size as u32
80 }
81
82 fn GetElement(&self) -> Option<DomRoot<Element>> {
84 self.element.clone()
85 }
86}