diff --git a/Userland/Libraries/LibWeb/HTML/HTMLElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLElement.cpp
index 170d18fd94..344c3de16c 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLElement.cpp
@@ -389,4 +389,24 @@ void HTMLElement::focus()
// 5. Unmark the element as locked for focus.
m_locked_for_focus = false;
}
+
+// https://html.spec.whatwg.org/multipage/interaction.html#dom-click
+void HTMLElement::click()
+{
+ // FIXME: 1. If this element is a form control that is disabled, then return.
+
+ // 2. If this element's click in progress flag is set, then return.
+ if (m_click_in_progress)
+ return;
+
+ // 3. Set this element's click in progress flag.
+ m_click_in_progress = true;
+
+ // FIXME: 4. Fire a synthetic pointer event named click at this element, with the not trusted flag set.
+ dispatch_event(DOM::Event::create("click"));
+
+ // 5. Unset this element's click in progress flag.
+ m_click_in_progress = false;
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLElement.h b/Userland/Libraries/LibWeb/HTML/HTMLElement.h
index de419a4780..5240025a2a 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLElement.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2020, Andreas Kling
+ * Copyright (c) 2018-2022, Andreas Kling
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -42,6 +42,8 @@ public:
void focus();
+ void click();
+
protected:
virtual void parse_attribute(const FlyString& name, const String& value) override;
@@ -60,6 +62,9 @@ private:
// https://html.spec.whatwg.org/multipage/interaction.html#locked-for-focus
bool m_locked_for_focus { false };
+
+ // https://html.spec.whatwg.org/multipage/interaction.html#click-in-progress-flag
+ bool m_click_in_progress { false };
};
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLElement.idl b/Userland/Libraries/LibWeb/HTML/HTMLElement.idl
index 25c931932d..41c8643d3f 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLElement.idl
+++ b/Userland/Libraries/LibWeb/HTML/HTMLElement.idl
@@ -7,6 +7,8 @@ interface HTMLElement : Element {
attribute DOMString contentEditable;
+ undefined click();
+
// FIXME: Support the optional FocusOptions parameter.
undefined focus();