diff options
author | Gregory Terzian <2792687+gterzian@users.noreply.github.com> | 2024-06-18 00:44:07 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-17 16:44:07 +0000 |
commit | 3d78d60619cb1eda22f4473c91c45cc6a7907244 (patch) | |
tree | da2072a41d0956187c55f0d456d8046d8d794114 /components/script/dom/resizeobserverentry.rs | |
parent | 3c1c395dfc60ca202834f9c708fffda71606bf1a (diff) | |
download | servo-3d78d60619cb1eda22f4473c91c45cc6a7907244.tar.gz servo-3d78d60619cb1eda22f4473c91c45cc6a7907244.zip |
implement basic infra for ResizeObserver (#31108)
Diffstat (limited to 'components/script/dom/resizeobserverentry.rs')
-rw-r--r-- | components/script/dom/resizeobserverentry.rs | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/components/script/dom/resizeobserverentry.rs b/components/script/dom/resizeobserverentry.rs new file mode 100644 index 00000000000..32670c01ef3 --- /dev/null +++ b/components/script/dom/resizeobserverentry.rs @@ -0,0 +1,120 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +use dom_struct::dom_struct; +use js::jsval::JSVal; + +use crate::dom::bindings::codegen::Bindings::ResizeObserverEntryBinding::ResizeObserverEntryMethods; +use crate::dom::bindings::reflector::{reflect_dom_object_with_proto, Reflector}; +use crate::dom::bindings::root::{Dom, DomRoot}; +use crate::dom::bindings::utils::to_frozen_array; +use crate::dom::domrectreadonly::DOMRectReadOnly; +use crate::dom::element::Element; +use crate::dom::resizeobserversize::ResizeObserverSize; +use crate::dom::window::Window; +use crate::script_runtime::JSContext as SafeJSContext; + +/// <https://drafts.csswg.org/resize-observer/#resize-observer-entry-interface> +#[dom_struct] +pub struct ResizeObserverEntry { + reflector_: Reflector, + /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-target> + target: Dom<Element>, + /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-contentrect> + content_rect: Dom<DOMRectReadOnly>, + /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-borderboxsize> + border_box_size: Vec<Dom<ResizeObserverSize>>, + /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-contentboxsize> + content_box_size: Vec<Dom<ResizeObserverSize>>, + /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-devicepixelcontentboxsize> + device_pixel_content_box_size: Vec<Dom<ResizeObserverSize>>, +} + +impl ResizeObserverEntry { + fn new_inherited( + target: &Element, + content_rect: &DOMRectReadOnly, + border_box_size: &[&ResizeObserverSize], + content_box_size: &[&ResizeObserverSize], + device_pixel_content_box_size: &[&ResizeObserverSize], + ) -> ResizeObserverEntry { + ResizeObserverEntry { + reflector_: Reflector::new(), + target: Dom::from_ref(target), + content_rect: Dom::from_ref(content_rect), + border_box_size: border_box_size + .iter() + .map(|size| Dom::from_ref(*size)) + .collect(), + content_box_size: content_box_size + .iter() + .map(|size| Dom::from_ref(*size)) + .collect(), + device_pixel_content_box_size: device_pixel_content_box_size + .iter() + .map(|size| Dom::from_ref(*size)) + .collect(), + } + } + + pub fn new( + window: &Window, + target: &Element, + content_rect: &DOMRectReadOnly, + border_box_size: &[&ResizeObserverSize], + content_box_size: &[&ResizeObserverSize], + device_pixel_content_box_size: &[&ResizeObserverSize], + ) -> DomRoot<ResizeObserverEntry> { + let entry = Box::new(ResizeObserverEntry::new_inherited( + target, + content_rect, + border_box_size, + content_box_size, + device_pixel_content_box_size, + )); + reflect_dom_object_with_proto(entry, window, None) + } +} + +impl ResizeObserverEntryMethods for ResizeObserverEntry { + /// https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-target + fn Target(&self) -> DomRoot<Element> { + DomRoot::from_ref(&*self.target) + } + + /// https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-contentrect + fn ContentRect(&self) -> DomRoot<DOMRectReadOnly> { + DomRoot::from_ref(&*self.content_rect) + } + + /// https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-borderboxsize + fn BorderBoxSize(&self, cx: SafeJSContext) -> JSVal { + let sizes: Vec<DomRoot<ResizeObserverSize>> = self + .border_box_size + .iter() + .map(|size| DomRoot::from_ref(&**size)) + .collect(); + to_frozen_array(sizes.as_slice(), cx) + } + + /// https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-contentboxsize + fn ContentBoxSize(&self, cx: SafeJSContext) -> JSVal { + let sizes: Vec<DomRoot<ResizeObserverSize>> = self + .content_box_size + .iter() + .map(|size| DomRoot::from_ref(&**size)) + .collect(); + to_frozen_array(sizes.as_slice(), cx) + } + + /// https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-devicepixelcontentboxsize + fn DevicePixelContentBoxSize(&self, cx: SafeJSContext) -> JSVal { + let sizes: Vec<DomRoot<ResizeObserverSize>> = self + .device_pixel_content_box_size + .iter() + .map(|size| DomRoot::from_ref(&**size)) + .collect(); + to_frozen_array(sizes.as_slice(), cx) + } +} |