IntersectionObserverEntry.h 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /*
  2. * Copyright (c) 2023, Luke Wilde <lukew@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <LibWeb/Bindings/PlatformObject.h>
  8. #include <LibWeb/Geometry/DOMRect.h>
  9. #include <LibWeb/HighResolutionTime/DOMHighResTimeStamp.h>
  10. namespace Web::IntersectionObserver {
  11. struct IntersectionObserverEntryInit {
  12. // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-time
  13. HighResolutionTime::DOMHighResTimeStamp time { 0.0 };
  14. // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-rootbounds
  15. Optional<Geometry::DOMRectInit> root_bounds;
  16. // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-boundingclientrect
  17. Geometry::DOMRectInit bounding_client_rect;
  18. // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-intersectionrect
  19. Geometry::DOMRectInit intersection_rect;
  20. // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-isintersecting
  21. bool is_intersecting { false };
  22. // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-intersectionratio
  23. double intersection_ratio { 0.0 };
  24. // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-target
  25. JS::Handle<DOM::Element> target;
  26. };
  27. class IntersectionObserverEntry final : public Bindings::PlatformObject {
  28. WEB_PLATFORM_OBJECT(IntersectionObserverEntry, Bindings::PlatformObject);
  29. JS_DECLARE_ALLOCATOR(IntersectionObserverEntry);
  30. public:
  31. static WebIDL::ExceptionOr<JS::NonnullGCPtr<IntersectionObserverEntry>> construct_impl(JS::Realm&, IntersectionObserverEntryInit const& options);
  32. virtual ~IntersectionObserverEntry() override;
  33. HighResolutionTime::DOMHighResTimeStamp time() const { return m_time; }
  34. JS::GCPtr<Geometry::DOMRectReadOnly> root_bounds() const { return m_root_bounds; }
  35. JS::NonnullGCPtr<Geometry::DOMRectReadOnly> bounding_client_rect() const { return m_bounding_client_rect; }
  36. JS::NonnullGCPtr<Geometry::DOMRectReadOnly> intersection_rect() const { return m_intersection_rect; }
  37. bool is_intersecting() const { return m_is_intersecting; }
  38. double intersection_ratio() const { return m_intersection_ratio; }
  39. JS::NonnullGCPtr<DOM::Element> target() const { return m_target; }
  40. private:
  41. IntersectionObserverEntry(JS::Realm&, HighResolutionTime::DOMHighResTimeStamp time, JS::GCPtr<Geometry::DOMRectReadOnly> root_bounds, JS::NonnullGCPtr<Geometry::DOMRectReadOnly> bounding_client_rect, JS::NonnullGCPtr<Geometry::DOMRectReadOnly> intersection_rect, bool is_intersecting, double intersection_ratio, JS::NonnullGCPtr<DOM::Element> target);
  42. virtual void initialize(JS::Realm&) override;
  43. virtual void visit_edges(JS::Cell::Visitor&) override;
  44. // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-time
  45. HighResolutionTime::DOMHighResTimeStamp m_time { 0.0 };
  46. // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-rootbounds
  47. JS::GCPtr<Geometry::DOMRectReadOnly> m_root_bounds;
  48. // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-boundingclientrect
  49. JS::NonnullGCPtr<Geometry::DOMRectReadOnly> m_bounding_client_rect;
  50. // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-intersectionrect
  51. JS::NonnullGCPtr<Geometry::DOMRectReadOnly> m_intersection_rect;
  52. // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-isintersecting
  53. bool m_is_intersecting { false };
  54. // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-intersectionratio
  55. double m_intersection_ratio { 0.0 };
  56. // https://www.w3.org/TR/intersection-observer/#dom-intersectionobserverentry-target
  57. JS::NonnullGCPtr<DOM::Element> m_target;
  58. };
  59. }