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();