summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWeb/DOM
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-02-03 22:47:50 +0100
committerAndreas Kling <kling@serenityos.org>2021-02-03 23:03:05 +0100
commita59b1825ce3ba5d6e6adf51ab2745c7212789c31 (patch)
tree8d7a09b0705fa05bb1d0921bf8400ca7d0aaa241 /Userland/Libraries/LibWeb/DOM
parentb43db4cc5027c7aa1c4780a8ab2851f4a5f1cca0 (diff)
downloadserenity-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.h5
-rw-r--r--Userland/Libraries/LibWeb/DOM/Document.idl71
-rw-r--r--Userland/Libraries/LibWeb/DOM/EventListener.h6
-rw-r--r--Userland/Libraries/LibWeb/DOM/EventTarget.h1
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;