script/dom/resizeobserver/
resizeobserverentry.rs1use 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#[dom_struct]
21pub(crate) struct ResizeObserverEntry {
22 reflector_: Reflector,
23 target: Dom<Element>,
25 content_rect: Dom<DOMRectReadOnly>,
27 border_box_size: Vec<Dom<ResizeObserverSize>>,
29 content_box_size: Vec<Dom<ResizeObserverSize>>,
31 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 fn Target(&self) -> DomRoot<Element> {
85 DomRoot::from_ref(&*self.target)
86 }
87
88 fn ContentRect(&self) -> DomRoot<DOMRectReadOnly> {
90 DomRoot::from_ref(&*self.content_rect)
91 }
92
93 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 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 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}