/* 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::{CanGc, JSContext as SafeJSContext}; /// #[dom_struct] pub struct ResizeObserverEntry { reflector_: Reflector, /// target: Dom, /// content_rect: Dom, /// border_box_size: Vec>, /// content_box_size: Vec>, /// device_pixel_content_box_size: Vec>, } 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 { 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, CanGc::note()) } } impl ResizeObserverEntryMethods for ResizeObserverEntry { /// https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-target fn Target(&self) -> DomRoot { DomRoot::from_ref(&*self.target) } /// https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-contentrect fn ContentRect(&self) -> DomRoot { DomRoot::from_ref(&*self.content_rect) } /// https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-borderboxsize fn BorderBoxSize(&self, cx: SafeJSContext) -> JSVal { let sizes: Vec> = 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> = 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> = self .device_pixel_content_box_size .iter() .map(|size| DomRoot::from_ref(&**size)) .collect(); to_frozen_array(sizes.as_slice(), cx) } }