7#pragma push_macro("None")
10#include <Ultralight/CAPI/CAPI_DOMEvent.h>
11#include <Ultralight/CAPI/CAPI_DOMTriggers.h>
14#include <Ultralight/detail/InjectionFilter.h>
17#include <Ultralight/dom/detail/Receivers.h>
33 Fn& fn = *
static_cast<Fn*
>(user_data);
34 CallListener(
"DOM-ready or restore hook", [&] {
35 if constexpr (std::is_invocable_v<Fn&, Document>)
36 fn(Document::FromBorrowed(document));
54 return static_cast<AttachFlags>(
static_cast<unsigned>(a) |
static_cast<unsigned>(b));
67 "dom::AttachFlags must mirror ULDOMTriggersAttachFlags");
278 if (
this != &other) {
279 ulDestroyDOMTriggers(handle_);
280 handle_ = other.handle_;
281 other.handle_ =
nullptr;
298 explicit operator bool()
const {
return handle_ !=
nullptr; }
337 template <
typename F>
338 bool On(std::string_view selector, std::string_view type, F&& callback,
340 using Fn = std::decay_t<F>;
341 static_assert(detail::InvocableWithEvent<Fn, Element> || std::is_invocable_v<Fn&, Element>
342 || std::is_invocable_v<Fn&>,
343 "On takes a callable invocable with (dom::Event, dom::Element), "
344 "(dom::Element), or ()");
345 detail::CString sel(selector);
346 detail::CString t(type);
348 return ulDOMTriggersOn(handle_, sel.c_str(), t.c_str(),
static_cast<unsigned>(flags),
349 &detail::DelegatedThunk<Fn>,
new Fn(std::forward<F>(callback)),
350 &detail::DeleteCallable<Fn>);
375 template <
typename C,
typename M>
376 requires(std::is_class_v<C> && std::is_member_function_pointer_v<M>
378 bool On(std::string_view selector, std::string_view type, C& receiver, M method,
380 return On(selector, type, detail::WrapBorrowedMember(receiver, method), flags);
403 template <
typename H,
typename M>
405 bool On(std::string_view selector, std::string_view type, H holder, M method,
407 return On(selector, type, detail::WrapHolderMember(std::move(holder), method), flags);
420 template <
typename F>
422 using Fn = std::decay_t<F>;
423 static_assert(std::is_invocable_v<Fn&, Document> || std::is_invocable_v<Fn&>,
424 "OnDOMReady takes a callable invocable with (dom::Document) or ()");
426 ulDOMTriggersOnDOMReady(handle_, &detail::ReadyThunk<Fn>,
new Fn(std::forward<F>(callback)),
427 &detail::DeleteCallable<Fn>);
439 template <
typename F>
441 using Fn = std::decay_t<F>;
442 static_assert(std::is_invocable_v<Fn&, Document> || std::is_invocable_v<Fn&>,
443 "OnRestore takes a callable invocable with (dom::Document) or ()");
445 ulDOMTriggersOnRestore(handle_, &detail::ReadyThunk<Fn>,
new Fn(std::forward<F>(callback)),
446 &detail::DeleteCallable<Fn>);
473 return view && handle_
475 options.origin_rules.data(), options.origin_rules.size());
518 return Triggers(handle ? ulCreateDOMTriggersBorrowedRef(handle) :
nullptr, AdoptTag {});
553 static dom::InjectionRequest ToRequest(View* view,
555 return { view, request.triggers, request.origin, request.is_main_frame,
556 request.rules_allow };
558 static void ReportException(
const char* what) {
559 ulDOMReportCallbackException(
"DOM triggers injection filter", what);
606 using Fn = std::decay_t<F>;
607 static_assert(std::is_invocable_r_v<bool, Fn&, const InjectionRequest&>,
608 "dom::SetInjectionFilter takes a callable invocable as "
609 "bool(const dom::InjectionRequest&)");
612 using Adapter = ultralight::detail::InjectionFilterAdapter<Fn, ULDOMTriggersInjectionRequest>;
614 new Adapter { std::forward<F>(filter), view },
634#pragma pop_macro("None")
AdoptTag
Definition JSRetainPtr.h:48
struct C_DOMTriggers * ULDOMTriggers
Opaque handle to a set of DOM event listeners and DOM-ready hooks.
Definition View.h:46
struct C_DOMDocument * ULDOMDocument
Opaque handle to a page's DOM document.
Definition View.h:39
struct ULDOMTriggersInjectionRequest ULDOMTriggersInjectionRequest
The details a DOM triggers injection filter decides on.
Definition View.h:67
A list of origin patterns that controls which pages get an attached API.
Definition OriginRules.h:90
Web-page container rendered to an offscreen surface.
Definition View.h:483
virtual void SetDOMTriggersInjectionFilter(DOMTriggersInjectionFilter filter, void *user_data, void(*destroy_user_data)(void *))=0
Set a filter that decides whether an attached set of DOM listeners is applied to a page.
virtual bool AttachDOMTriggers(ULDOMTriggers triggers, unsigned flags=0, const char *const *origin_rules=nullptr, size_t num_origin_rules=0)=0
Attach a set of DOM listeners to this View.
virtual void DetachDOMTriggers(ULDOMTriggers triggers)=0
Detach a set of DOM listeners from this View.
void OnRestore(F &&callback)
Add a hook that runs each time a page that gets the set is restored from the back-forward cache (Conf...
Definition Triggers.h:440
ULDOMTriggers raw() const
Get the C handle, for passing to the <Ultralight/CAPI/CAPI_DOMTriggers.h> functions.
Definition Triggers.h:527
Triggers & operator=(const Triggers &)=delete
bool AttachTo(View *view, const AttachOptions &options={})
Attach this set to a View.
Definition Triggers.h:472
ULDOMTriggers LeakRef()
Give up ownership of the C handle and return it.
Definition Triggers.h:534
~Triggers()
Release this object's reference to the set.
Definition Triggers.h:292
Triggers & operator=(Triggers &&other) noexcept
Move assignment (releases the set this object held, then takes over other's).
Definition Triggers.h:277
static Triggers Adopt(ULDOMTriggers handle)
Wrap a C handle you own, taking ownership of it.
Definition Triggers.h:503
Triggers(Triggers &&other) noexcept
Move constructor (other becomes empty).
Definition Triggers.h:268
Triggers(const Triggers &)=delete
bool On(std::string_view selector, std::string_view type, C &receiver, M method, EventListenerFlags flags=EventListenerFlags::None)
Add a selector listener that calls a member function on a borrowed receiver (no forwarding lambda nee...
Definition Triggers.h:378
bool On(std::string_view selector, std::string_view type, H holder, M method, EventListenerFlags flags=EventListenerFlags::None)
Add a selector listener that calls a member function through a holder (a shared_ptr,...
Definition Triggers.h:405
void OnDOMReady(F &&callback)
Add a hook that runs on each page that gets the set, once its document has finished parsing.
Definition Triggers.h:421
static Triggers FromBorrowed(ULDOMTriggers handle)
Wrap a C handle someone else owns, without owning the set (eg, the triggers member of a dom::Injectio...
Definition Triggers.h:517
Triggers()
Create a new set of DOM listeners.
Definition Triggers.h:258
bool On(std::string_view selector, std::string_view type, F &&callback, EventListenerFlags flags=EventListenerFlags::None)
Add a listener for events on elements matching a CSS selector.
Definition Triggers.h:338
void DetachFrom(View *view)
Detach this set from a View.
Definition Triggers.h:488
Whether or not the DOM API can hold an object through H (ignoring const and references),...
Definition Holders.h:41
Direct C++ access to modify page elements and handle events.
void SetInjectionFilter(View *view, F &&filter)
Set a View's DOM triggers filter with a C++ callable (the typed form of View::SetDOMTriggersInjection...
Definition Triggers.h:605
constexpr EventListenerFlags & operator|=(EventListenerFlags &a, EventListenerFlags b)
Definition EventListener.h:65
constexpr EventListenerFlags operator|(EventListenerFlags a, EventListenerFlags b)
Definition EventListener.h:61
EventListenerFlags
Options for adding an event listener, as flags (addEventListener() and On()).
Definition EventListener.h:41
@ None
Definition EventListener.h:42
void ClearInjectionFilter(View *view)
Remove a View's DOM triggers filter, so the origin rules alone decide which pages get each set.
Definition Triggers.h:626
AttachFlags
The flags for Triggers::AttachTo() (the typed form of ULDOMTriggersAttachFlags).
Definition Triggers.h:48
@ AllFrames
Add the listeners to subframes too.
Definition Triggers.h:50
@ None
Add the listeners to the main frame only.
Definition Triggers.h:49
constexpr AttachFlags AllFrames
Add the listeners to subframes too (shorthand for AttachFlags::AllFrames).
Definition Triggers.h:64
Root namespace for every public Ultralight type, function, and enumeration.
@ None
Definition Anchor.h:36
Options for Triggers::AttachTo().
Definition Triggers.h:78
OriginRules origin_rules
The origin rules for the pages that get the listeners.
Definition Triggers.h:88
AttachFlags flags
The attach flags (see AttachFlags).
Definition Triggers.h:82
Information passed to a DOM triggers filter callback.
Definition Triggers.h:113
const char * origin
The page's security origin, serialized (eg, "https://example.com", or "null" for an opaque origin).
Definition Triggers.h:129
bool rules_allow
Whether or not the origin rules allow the page.
Definition Triggers.h:139
bool is_main_frame
Whether or not the page is in the View's main frame.
Definition Triggers.h:134
ULDOMTriggers triggers
The set of DOM listeners being decided on.
Definition Triggers.h:123
View * view
The View loading the page (the View you set the filter on).
Definition Triggers.h:117