/* * Copyright (c) 2023, Luke Wilde * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace Web::IntersectionObserver { struct IntersectionObserverEntryInit { // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-time HighResolutionTime::DOMHighResTimeStamp time { 0.0 }; // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-rootbounds Optional root_bounds; // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-boundingclientrect Geometry::DOMRectInit bounding_client_rect; // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-intersectionrect Geometry::DOMRectInit intersection_rect; // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-isintersecting bool is_intersecting { false }; // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-intersectionratio double intersection_ratio { 0.0 }; // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-target GC::Root target; }; class IntersectionObserverEntry final : public Bindings::PlatformObject { WEB_PLATFORM_OBJECT(IntersectionObserverEntry, Bindings::PlatformObject); GC_DECLARE_ALLOCATOR(IntersectionObserverEntry); public: static WebIDL::ExceptionOr> construct_impl(JS::Realm&, IntersectionObserverEntryInit const& options); virtual ~IntersectionObserverEntry() override; HighResolutionTime::DOMHighResTimeStamp time() const { return m_time; } GC::Ptr root_bounds() const { return m_root_bounds; } GC::Ref bounding_client_rect() const { return m_bounding_client_rect; } GC::Ref intersection_rect() const { return m_intersection_rect; } bool is_intersecting() const { return m_is_intersecting; } double intersection_ratio() const { return m_intersection_ratio; } GC::Ref target() const { return m_target; } private: IntersectionObserverEntry(JS::Realm&, HighResolutionTime::DOMHighResTimeStamp time, GC::Ptr root_bounds, GC::Ref bounding_client_rect, GC::Ref intersection_rect, bool is_intersecting, double intersection_ratio, GC::Ref target); virtual void initialize(JS::Realm&) override; virtual void visit_edges(JS::Cell::Visitor&) override; // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-time HighResolutionTime::DOMHighResTimeStamp m_time { 0.0 }; // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-rootbounds GC::Ptr m_root_bounds; // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-boundingclientrect GC::Ref m_bounding_client_rect; // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-intersectionrect GC::Ref m_intersection_rect; // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-isintersecting bool m_is_intersecting { false }; // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-intersectionratio double m_intersection_ratio { 0.0 }; // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-target GC::Ref m_target; }; }