diff options
Diffstat (limited to 'components/script/dom/intersectionobserverentry.rs')
-rw-r--r-- | components/script/dom/intersectionobserverentry.rs | 105 |
1 files changed, 92 insertions, 13 deletions
diff --git a/components/script/dom/intersectionobserverentry.rs b/components/script/dom/intersectionobserverentry.rs index 759b950cb50..7bd46e4cac2 100644 --- a/components/script/dom/intersectionobserverentry.rs +++ b/components/script/dom/intersectionobserverentry.rs @@ -2,6 +2,8 @@ * 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 std::cell::Cell; + use dom_struct::dom_struct; use js::rust::HandleObject; @@ -9,7 +11,8 @@ use super::bindings::codegen::Bindings::IntersectionObserverEntryBinding::{ IntersectionObserverEntryInit, IntersectionObserverEntryMethods, }; use super::bindings::num::Finite; -use crate::dom::bindings::reflector::{DomGlobal, Reflector, reflect_dom_object_with_proto}; +use crate::dom::bindings::codegen::Bindings::DOMRectReadOnlyBinding::DOMRectInit; +use crate::dom::bindings::reflector::{Reflector, reflect_dom_object_with_proto}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::domrectreadonly::DOMRectReadOnly; use crate::dom::element::Element; @@ -22,24 +25,100 @@ use crate::script_runtime::CanGc; #[dom_struct] pub(crate) struct IntersectionObserverEntry { reflector_: Reflector, + // <https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-time> + time: Cell<Finite<f64>>, + // <https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-rootbounds> + root_bounds: Option<Dom<DOMRectReadOnly>>, + // <https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-boundingclientrect> + bounding_client_rect: Dom<DOMRectReadOnly>, + // <https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-intersectionrect> + intersection_rect: Dom<DOMRectReadOnly>, + // <https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-isintersecting> + is_intersecting: Cell<bool>, + // <https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-isvisible> + is_visible: Cell<bool>, + // <https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-intersectionratio> + intersection_ratio: Cell<Finite<f64>>, + // <https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-target> target: Dom<Element>, } impl IntersectionObserverEntry { - pub(crate) fn new_inherited(init: &IntersectionObserverEntryInit) -> Self { + #[allow(clippy::too_many_arguments)] + fn new_inherited( + time: Finite<f64>, + root_bounds: Option<&DOMRectReadOnly>, + bounding_client_rect: &DOMRectReadOnly, + intersection_rect: &DOMRectReadOnly, + is_intersecting: bool, + is_visible: bool, + intersection_ratio: Finite<f64>, + target: &Element, + ) -> Self { Self { reflector_: Reflector::new(), - target: init.target.as_traced(), + target: Dom::from_ref(target), + time: Cell::new(time), + root_bounds: root_bounds.map(Dom::from_ref), + bounding_client_rect: Dom::from_ref(bounding_client_rect), + intersection_rect: Dom::from_ref(intersection_rect), + is_intersecting: Cell::new(is_intersecting), + is_visible: Cell::new(is_visible), + intersection_ratio: Cell::new(intersection_ratio), } } - fn new( + #[allow(clippy::too_many_arguments)] + pub(crate) fn new( + window: &Window, + proto: Option<HandleObject>, + time: Finite<f64>, + root_bounds: Option<&DOMRectReadOnly>, + bounding_client_rect: &DOMRectReadOnly, + intersection_rect: &DOMRectReadOnly, + is_intersecting: bool, + is_visible: bool, + intersection_ratio: Finite<f64>, + target: &Element, + can_gc: CanGc, + ) -> DomRoot<Self> { + let observer = Box::new(Self::new_inherited( + time, + root_bounds, + bounding_client_rect, + intersection_rect, + is_intersecting, + is_visible, + intersection_ratio, + target, + )); + reflect_dom_object_with_proto(observer, window, proto, can_gc) + } + + fn new_from_dictionary( window: &Window, proto: Option<HandleObject>, init: &IntersectionObserverEntryInit, can_gc: CanGc, ) -> DomRoot<Self> { - let observer = Box::new(Self::new_inherited(init)); + let domrectreadonly_from_dictionary = |dictionary: &DOMRectInit| { + DOMRectReadOnly::new_from_dictionary( + window.as_global_scope(), + proto, + dictionary, + can_gc, + ) + }; + let observer = Box::new(Self::new_inherited( + init.time, + Some(&*domrectreadonly_from_dictionary(&init.rootBounds)), + &domrectreadonly_from_dictionary(&init.boundingClientRect), + &domrectreadonly_from_dictionary(&init.intersectionRect), + init.isIntersecting, + init.isVisible, + init.intersectionRatio, + &init.target, + )); reflect_dom_object_with_proto(observer, window, proto, can_gc) } } @@ -51,7 +130,7 @@ impl IntersectionObserverEntryMethods<crate::DomTypeHolder> for IntersectionObse /// /// <https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-time> fn Time(&self) -> Finite<f64> { - Finite::new(0.).unwrap() + self.time.get() } /// > For a same-origin-domain target, this will be the root intersection rectangle. @@ -61,14 +140,14 @@ impl IntersectionObserverEntryMethods<crate::DomTypeHolder> for IntersectionObse /// /// <https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-rootbounds> fn GetRootBounds(&self) -> Option<DomRoot<DOMRectReadOnly>> { - None + self.root_bounds.as_ref().map(|rect| rect.as_rooted()) } /// > A DOMRectReadOnly obtained by getting the bounding box for target. /// /// <https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-boundingclientrect> fn BoundingClientRect(&self) -> DomRoot<DOMRectReadOnly> { - DOMRectReadOnly::new(&self.global(), None, 0., 0., 0., 0., CanGc::note()) + self.bounding_client_rect.as_rooted() } /// > boundingClientRect, intersected by each of target's ancestors' clip rects (up to @@ -78,7 +157,7 @@ impl IntersectionObserverEntryMethods<crate::DomTypeHolder> for IntersectionObse /// /// <https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-intersectionrect> fn IntersectionRect(&self) -> DomRoot<DOMRectReadOnly> { - DOMRectReadOnly::new(&self.global(), None, 0., 0., 0., 0., CanGc::note()) + self.intersection_rect.as_rooted() } /// > True if the target intersects with the root; false otherwise. This flag makes it @@ -90,14 +169,14 @@ impl IntersectionObserverEntryMethods<crate::DomTypeHolder> for IntersectionObse /// /// <https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-isintersecting> fn IsIntersecting(&self) -> bool { - false + self.is_intersecting.get() } /// > Contains the result of running the visibility algorithm on target. /// /// <https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-isvisible> fn IsVisible(&self) -> bool { - false + self.is_visible.get() } /// > If the boundingClientRect has non-zero area, this will be the ratio of @@ -106,7 +185,7 @@ impl IntersectionObserverEntryMethods<crate::DomTypeHolder> for IntersectionObse /// /// <https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-intersectionratio> fn IntersectionRatio(&self) -> Finite<f64> { - Finite::new(0.).unwrap() + self.intersection_ratio.get() } /// > The Element whose intersection with the intersection root changed. @@ -123,6 +202,6 @@ impl IntersectionObserverEntryMethods<crate::DomTypeHolder> for IntersectionObse can_gc: CanGc, init: &IntersectionObserverEntryInit, ) -> DomRoot<IntersectionObserverEntry> { - Self::new(window, proto, init, can_gc) + Self::new_from_dictionary(window, proto, init, can_gc) } } |