mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-05-11 09:27:00 +02:00
Previously we were inconsistent by generating code for enum definitions but not generating code for dictionaries. With future changes to the IDL generator to expose helpers to convert to and from IDL values this produced circular depdendencies. To solve this problem, also generate the dictionary definitions in bindings headers.
104 lines
4.1 KiB
C++
104 lines
4.1 KiB
C++
/*
|
|
* Copyright (c) 2021, Tim Flynn <trflynn89@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Optional.h>
|
|
#include <LibGC/Root.h>
|
|
#include <LibWeb/Bindings/PlatformObject.h>
|
|
#include <LibWeb/IntersectionObserver/IntersectionObserverEntry.h>
|
|
#include <LibWeb/PixelUnits.h>
|
|
|
|
namespace Web::IntersectionObserver {
|
|
|
|
using NullableIntersectionObserverRoot = Variant<GC::Root<DOM::Element>, GC::Root<DOM::Document>, Empty>;
|
|
using IntersectionObserverRoot = NullableIntersectionObserverRoot;
|
|
|
|
struct ObservationTarget {
|
|
GC::Ref<DOM::Element> target;
|
|
Optional<size_t> previous_threshold_index;
|
|
bool previous_is_intersecting { false };
|
|
};
|
|
|
|
// https://w3c.github.io/IntersectionObserver/#intersection-observer-interface
|
|
class IntersectionObserver final : public Bindings::PlatformObject {
|
|
WEB_PLATFORM_OBJECT(IntersectionObserver, Bindings::PlatformObject);
|
|
GC_DECLARE_ALLOCATOR(IntersectionObserver);
|
|
|
|
public:
|
|
static constexpr bool OVERRIDES_FINALIZE = true;
|
|
|
|
static WebIDL::ExceptionOr<GC::Ref<IntersectionObserver>> construct_impl(JS::Realm&, GC::Ptr<WebIDL::CallbackType> callback, Bindings::IntersectionObserverInit const& options);
|
|
|
|
virtual ~IntersectionObserver() override;
|
|
|
|
void observe(DOM::Element& target);
|
|
void unobserve(DOM::Element& target);
|
|
void disconnect();
|
|
Vector<GC::Root<IntersectionObserverEntry>> take_records();
|
|
|
|
Vector<ObservationTarget>& observation_targets() { return m_observation_targets; }
|
|
Vector<ObservationTarget> const& observation_targets() const { return m_observation_targets; }
|
|
|
|
NullableIntersectionObserverRoot root() const;
|
|
String root_margin() const;
|
|
String scroll_margin() const;
|
|
Vector<CSS::LengthPercentage> const& scroll_margin_values() const { return m_scroll_margin; }
|
|
Vector<double> const& thresholds() const { return m_thresholds; }
|
|
long delay() const { return m_delay; }
|
|
bool track_visibility() const { return m_track_visibility; }
|
|
|
|
Variant<GC::Root<DOM::Element>, GC::Root<DOM::Document>> intersection_root() const;
|
|
GC::Ref<DOM::Node> intersection_root_node() const;
|
|
bool is_implicit_root() const { return !m_root; }
|
|
CSSPixelRect root_intersection_rectangle() const;
|
|
|
|
void queue_entry(Badge<DOM::Document>, GC::Ref<IntersectionObserverEntry>);
|
|
|
|
WebIDL::CallbackType& callback() { return *m_callback; }
|
|
|
|
private:
|
|
explicit IntersectionObserver(JS::Realm&, GC::Ptr<WebIDL::CallbackType> callback, IntersectionObserverRoot const& root, Vector<CSS::LengthPercentage> root_margin, Vector<CSS::LengthPercentage> scroll_margin, Vector<double>&& thresholds, double debug, bool track_visibility);
|
|
|
|
virtual void initialize(JS::Realm&) override;
|
|
virtual void visit_edges(JS::Cell::Visitor&) override;
|
|
virtual void finalize() override;
|
|
|
|
static Optional<Vector<CSS::LengthPercentage>> parse_a_margin(JS::Realm&, String);
|
|
|
|
// https://www.w3.org/TR/intersection-observer/#dom-intersectionobserver-callback-slot
|
|
GC::Ptr<WebIDL::CallbackType> m_callback;
|
|
|
|
// https://www.w3.org/TR/intersection-observer/#dom-intersectionobserver-root
|
|
GC::Ptr<DOM::Node> m_root;
|
|
|
|
// https://www.w3.org/TR/intersection-observer/#dom-intersectionobserver-rootmargin
|
|
Vector<CSS::LengthPercentage> m_root_margin;
|
|
|
|
// https://www.w3.org/TR/intersection-observer/#dom-intersectionobserver-scrollmargin
|
|
Vector<CSS::LengthPercentage> m_scroll_margin;
|
|
|
|
// https://www.w3.org/TR/intersection-observer/#dom-intersectionobserver-thresholds
|
|
Vector<double> m_thresholds;
|
|
|
|
// https://w3c.github.io/IntersectionObserver/#dom-intersectionobserver-delay
|
|
long m_delay;
|
|
|
|
// https://w3c.github.io/IntersectionObserver/#dom-intersectionobserver-trackvisibility
|
|
bool m_track_visibility;
|
|
|
|
// https://www.w3.org/TR/intersection-observer/#dom-intersectionobserver-queuedentries-slot
|
|
Vector<GC::Ref<IntersectionObserverEntry>> m_queued_entries;
|
|
|
|
// https://www.w3.org/TR/intersection-observer/#dom-intersectionobserver-observationtargets-slot
|
|
Vector<ObservationTarget> m_observation_targets;
|
|
|
|
// AD-HOC: This is the document where we've registered the IntersectionObserver.
|
|
GC::Weak<DOM::Document> m_document;
|
|
};
|
|
|
|
}
|