/* 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::rust::MutableHandleValue; use crate::dom::bindings::codegen::Bindings::ResizeObserverEntryBinding::ResizeObserverEntryMethods; use crate::dom::bindings::reflector::{Reflector, reflect_dom_object_with_proto}; 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(crate) 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(crate) fn new( window: &Window, target: &Element, content_rect: &DOMRectReadOnly, border_box_size: &[&ResizeObserverSize], content_box_size: &[&ResizeObserverSize], device_pixel_content_box_size: &[&ResizeObserverSize], can_gc: CanGc, ) -> 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, can_gc) } } impl ResizeObserverEntryMethods for ResizeObserverEntry { /// fn Target(&self) -> DomRoot { DomRoot::from_ref(&*self.target) } /// fn ContentRect(&self) -> DomRoot { DomRoot::from_ref(&*self.content_rect) } /// fn BorderBoxSize(&self, cx: SafeJSContext, can_gc: CanGc, retval: MutableHandleValue) { let sizes: Vec> = self .border_box_size .iter() .map(|size| DomRoot::from_ref(&**size)) .collect(); to_frozen_array(sizes.as_slice(), cx, retval, can_gc); } /// fn ContentBoxSize(&self, cx: SafeJSContext, can_gc: CanGc, retval: MutableHandleValue) { let sizes: Vec> = self .content_box_size .iter() .map(|size| DomRoot::from_ref(&**size)) .collect(); to_frozen_array(sizes.as_slice(), cx, retval, can_gc); } /// fn DevicePixelContentBoxSize( &self, cx: SafeJSContext, can_gc: CanGc, retval: MutableHandleValue, ) { let sizes: Vec> = self .device_pixel_content_box_size .iter() .map(|size| DomRoot::from_ref(&**size)) .collect(); to_frozen_array(sizes.as_slice(), cx, retval, can_gc); } }