diff options
author | Andreas Kling <kling@serenityos.org> | 2021-02-03 22:47:50 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-02-03 23:03:05 +0100 |
commit | a59b1825ce3ba5d6e6adf51ab2745c7212789c31 (patch) | |
tree | 8d7a09b0705fa05bb1d0921bf8400ca7d0aaa241 /Userland/Libraries/LibWeb/DOM | |
parent | b43db4cc5027c7aa1c4780a8ab2851f4a5f1cca0 (diff) | |
download | serenity-a59b1825ce3ba5d6e6adf51ab2745c7212789c31.zip |
LibWeb: Basic implementation of global event handlers :^)
Document and HTMLElement now inherit from HTML::GlobalEventHandlers
which allows them to support "onfoo" event handler attributes.
These are assignable both via IDL attributes and content attributes.
Event listeners constructed this way get a special "attribute" flag
on them so we know which one to replace if you reassign them.
This also allows them to coexist with EventTarget.addEventListener().
This is all a bit sloppy, but it works decently for a first cut.
The Window object should also inherit GlobalEventHandlers, but since
we don't generate it from IDL, I haven't taken that step here.
Also this would be a lot nicer if we supported IDL mixins.
Diffstat (limited to 'Userland/Libraries/LibWeb/DOM')
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/Document.h | 5 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/Document.idl | 71 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/EventListener.h | 6 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/EventTarget.h | 1 |
4 files changed, 82 insertions, 1 deletions
diff --git a/Userland/Libraries/LibWeb/DOM/Document.h b/Userland/Libraries/LibWeb/DOM/Document.h index be7050b2cc..0f19fefdfd 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.h +++ b/Userland/Libraries/LibWeb/DOM/Document.h @@ -55,6 +55,7 @@ enum class QuirksMode { class Document : public ParentNode , public NonElementParentNode<Document> + , public HTML::GlobalEventHandlers , public Bindings::ScriptExecutionContext { public: using WrapperType = Bindings::DocumentWrapper; @@ -233,8 +234,12 @@ public: private: explicit Document(const URL&); + // ^DOM::Node virtual RefPtr<Layout::Node> create_layout_node() override; + // ^HTML::GlobalEventHandlers + virtual EventTarget& global_event_handlers_to_event_target() final { return *this; } + void tear_down_layout_tree(); void increment_referencing_node_count() diff --git a/Userland/Libraries/LibWeb/DOM/Document.idl b/Userland/Libraries/LibWeb/DOM/Document.idl index 9aa2878d62..bd405a48bb 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.idl +++ b/Userland/Libraries/LibWeb/DOM/Document.idl @@ -36,4 +36,75 @@ interface Document : Node { attribute DOMString title; + // FIXME: These should all come from a GlobalEventHandlers mixin + attribute EventHandler onabort; + attribute EventHandler onauxclick; + attribute EventHandler onblur; + attribute EventHandler oncancel; + attribute EventHandler oncanplay; + attribute EventHandler oncanplaythrough; + attribute EventHandler onchange; + attribute EventHandler onclick; + attribute EventHandler onclose; + attribute EventHandler oncontextmenu; + attribute EventHandler oncuechange; + attribute EventHandler ondblclick; + attribute EventHandler ondrag; + attribute EventHandler ondragend; + attribute EventHandler ondragenter; + attribute EventHandler ondragleave; + attribute EventHandler ondragover; + attribute EventHandler ondragstart; + attribute EventHandler ondrop; + attribute EventHandler ondurationchange; + attribute EventHandler onemptied; + attribute EventHandler onended; + + // FIXME: Should be an OnErrorEventHandler + attribute EventHandler onerror; + + attribute EventHandler onfocus; + attribute EventHandler onformdata; + attribute EventHandler oninput; + attribute EventHandler oninvalid; + attribute EventHandler onkeydown; + attribute EventHandler onkeypress; + attribute EventHandler onkeyup; + attribute EventHandler onload; + attribute EventHandler onloadeddata; + attribute EventHandler onloadedmetadata; + attribute EventHandler onloadstart; + attribute EventHandler onmousedown; + [LegacyLenientThis] attribute EventHandler onmouseenter; + [LegacyLenientThis] attribute EventHandler onmouseleave; + attribute EventHandler onmousemove; + attribute EventHandler onmouseout; + attribute EventHandler onmouseover; + attribute EventHandler onmouseup; + attribute EventHandler onpause; + attribute EventHandler onplay; + attribute EventHandler onplaying; + attribute EventHandler onprogress; + attribute EventHandler onratechange; + attribute EventHandler onreset; + attribute EventHandler onresize; + attribute EventHandler onscroll; + attribute EventHandler onsecuritypolicyviolation; + attribute EventHandler onseeked; + attribute EventHandler onseeking; + attribute EventHandler onselect; + attribute EventHandler onslotchange; + attribute EventHandler onstalled; + attribute EventHandler onsubmit; + attribute EventHandler onsuspend; + attribute EventHandler ontimeupdate; + attribute EventHandler ontoggle; + attribute EventHandler onvolumechange; + attribute EventHandler onwaiting; + attribute EventHandler onwebkitanimationend; + attribute EventHandler onwebkitanimationiteration; + attribute EventHandler onwebkitanimationstart; + attribute EventHandler onwebkittransitionend; + attribute EventHandler onwheel; + }; diff --git a/Userland/Libraries/LibWeb/DOM/EventListener.h b/Userland/Libraries/LibWeb/DOM/EventListener.h index 1d5705c2b6..377d3899be 100644 --- a/Userland/Libraries/LibWeb/DOM/EventListener.h +++ b/Userland/Libraries/LibWeb/DOM/EventListener.h @@ -38,8 +38,9 @@ class EventListener public: using WrapperType = Bindings::EventListenerWrapper; - explicit EventListener(JS::Handle<JS::Function> function) + explicit EventListener(JS::Handle<JS::Function> function, bool is_attribute = false) : m_function(move(function)) + , m_attribute(is_attribute) { } @@ -60,6 +61,8 @@ public: bool removed() const { return m_removed; } void set_removed(bool removed) { m_removed = removed; } + bool is_attribute() const { return m_attribute; } + private: FlyString m_type; JS::Handle<JS::Function> m_function; @@ -67,6 +70,7 @@ private: bool m_passive { false }; bool m_once { false }; bool m_removed { false }; + bool m_attribute { false }; }; } diff --git a/Userland/Libraries/LibWeb/DOM/EventTarget.h b/Userland/Libraries/LibWeb/DOM/EventTarget.h index f03d4a4fb2..af1a1d7b0c 100644 --- a/Userland/Libraries/LibWeb/DOM/EventTarget.h +++ b/Userland/Libraries/LibWeb/DOM/EventTarget.h @@ -61,6 +61,7 @@ public: NonnullRefPtr<EventListener> listener; }; + Vector<EventListenerRegistration>& listeners() { return m_listeners; } const Vector<EventListenerRegistration>& listeners() const { return m_listeners; } Function<void(const Event&)> activation_behaviour; |