Skip to main content

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