script/dom/
resizeobserverentry.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 dom_struct::dom_struct;
6use js::rust::MutableHandleValue;
7
8use crate::dom::bindings::codegen::Bindings::ResizeObserverEntryBinding::ResizeObserverEntryMethods;
9use crate::dom::bindings::reflector::{Reflector, reflect_dom_object_with_proto};
10use crate::dom::bindings::root::{Dom, DomRoot};
11use crate::dom::bindings::utils::to_frozen_array;
12use crate::dom::domrectreadonly::DOMRectReadOnly;
13use crate::dom::element::Element;
14use crate::dom::resizeobserversize::ResizeObserverSize;
15use crate::dom::window::Window;
16use crate::script_runtime::{CanGc, JSContext as SafeJSContext};
17
18/// <https://drafts.csswg.org/resize-observer/#resize-observer-entry-interface>
19#[dom_struct]
20pub(crate) struct ResizeObserverEntry {
21    reflector_: Reflector,
22    /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-target>
23    target: Dom<Element>,
24    /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-contentrect>
25    content_rect: Dom<DOMRectReadOnly>,
26    /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-borderboxsize>
27    border_box_size: Vec<Dom<ResizeObserverSize>>,
28    /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-contentboxsize>
29    content_box_size: Vec<Dom<ResizeObserverSize>>,
30    /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-devicepixelcontentboxsize>
31    device_pixel_content_box_size: Vec<Dom<ResizeObserverSize>>,
32}
33
34impl ResizeObserverEntry {
35    fn new_inherited(
36        target: &Element,
37        content_rect: &DOMRectReadOnly,
38        border_box_size: &[&ResizeObserverSize],
39        content_box_size: &[&ResizeObserverSize],
40        device_pixel_content_box_size: &[&ResizeObserverSize],
41    ) -> ResizeObserverEntry {
42        ResizeObserverEntry {
43            reflector_: Reflector::new(),
44            target: Dom::from_ref(target),
45            content_rect: Dom::from_ref(content_rect),
46            border_box_size: border_box_size
47                .iter()
48                .map(|size| Dom::from_ref(*size))
49                .collect(),
50            content_box_size: content_box_size
51                .iter()
52                .map(|size| Dom::from_ref(*size))
53                .collect(),
54            device_pixel_content_box_size: device_pixel_content_box_size
55                .iter()
56                .map(|size| Dom::from_ref(*size))
57                .collect(),
58        }
59    }
60
61    pub(crate) fn new(
62        window: &Window,
63        target: &Element,
64        content_rect: &DOMRectReadOnly,
65        border_box_size: &[&ResizeObserverSize],
66        content_box_size: &[&ResizeObserverSize],
67        device_pixel_content_box_size: &[&ResizeObserverSize],
68        can_gc: CanGc,
69    ) -> DomRoot<ResizeObserverEntry> {
70        let entry = Box::new(ResizeObserverEntry::new_inherited(
71            target,
72            content_rect,
73            border_box_size,
74            content_box_size,
75            device_pixel_content_box_size,
76        ));
77        reflect_dom_object_with_proto(entry, window, None, can_gc)
78    }
79}
80
81impl ResizeObserverEntryMethods<crate::DomTypeHolder> for ResizeObserverEntry {
82    /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-target>
83    fn Target(&self) -> DomRoot<Element> {
84        DomRoot::from_ref(&*self.target)
85    }
86
87    /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-contentrect>
88    fn ContentRect(&self) -> DomRoot<DOMRectReadOnly> {
89        DomRoot::from_ref(&*self.content_rect)
90    }
91
92    /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-borderboxsize>
93    fn BorderBoxSize(&self, cx: SafeJSContext, can_gc: CanGc, retval: MutableHandleValue) {
94        let sizes: Vec<DomRoot<ResizeObserverSize>> = self
95            .border_box_size
96            .iter()
97            .map(|size| DomRoot::from_ref(&**size))
98            .collect();
99        to_frozen_array(sizes.as_slice(), cx, retval, can_gc);
100    }
101
102    /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-contentboxsize>
103    fn ContentBoxSize(&self, cx: SafeJSContext, can_gc: CanGc, retval: MutableHandleValue) {
104        let sizes: Vec<DomRoot<ResizeObserverSize>> = self
105            .content_box_size
106            .iter()
107            .map(|size| DomRoot::from_ref(&**size))
108            .collect();
109        to_frozen_array(sizes.as_slice(), cx, retval, can_gc);
110    }
111
112    /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-devicepixelcontentboxsize>
113    fn DevicePixelContentBoxSize(
114        &self,
115        cx: SafeJSContext,
116        can_gc: CanGc,
117        retval: MutableHandleValue,
118    ) {
119        let sizes: Vec<DomRoot<ResizeObserverSize>> = self
120            .device_pixel_content_box_size
121            .iter()
122            .map(|size| DomRoot::from_ref(&**size))
123            .collect();
124        to_frozen_array(sizes.as_slice(), cx, retval, can_gc);
125    }
126}