script/dom/performance/
largestcontentfulpaint.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5use 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    /// <https://www.w3.org/TR/largest-contentful-paint/#dom-largestcontentfulpaint-loadtime>
64    fn LoadTime(&self) -> DOMHighResTimeStamp {
65        self.global()
66            .performance()
67            .to_dom_high_res_time_stamp(self.load_time)
68    }
69
70    /// <https://www.w3.org/TR/largest-contentful-paint/#dom-largestcontentfulpaint-rendertime>
71    fn RenderTime(&self) -> DOMHighResTimeStamp {
72        self.global()
73            .performance()
74            .to_dom_high_res_time_stamp(self.render_time)
75    }
76
77    /// <https://www.w3.org/TR/largest-contentful-paint/#dom-largestcontentfulpaint-size>
78    fn Size(&self) -> u32 {
79        self.size as u32
80    }
81
82    /// <https://www.w3.org/TR/largest-contentful-paint/#dom-largestcontentfulpaint-element>
83    fn GetElement(&self) -> Option<DomRoot<Element>> {
84        self.element.clone()
85    }
86}