LibWeb/UIEvents: Implement InputEvent

This commit is contained in:
Jamie Mansfield 2024-07-18 19:35:14 +01:00 committed by Andreas Kling
parent 60d9c3929c
commit 9fce70069d
Notes: github-actions[bot] 2024-10-08 09:46:48 +00:00
9 changed files with 106 additions and 0 deletions

View file

@ -7,6 +7,7 @@ source_set("UIEvents") {
sources = [
"EventNames.cpp",
"FocusEvent.cpp",
"InputEvent.cpp",
"KeyboardEvent.cpp",
"MouseEvent.cpp",
"PointerEvent.cpp",

View file

@ -331,6 +331,7 @@ standard_idl_files = [
"//Userland/Libraries/LibWeb/SVG/SVGTSpanElement.idl",
"//Userland/Libraries/LibWeb/SVG/SVGUseElement.idl",
"//Userland/Libraries/LibWeb/UIEvents/FocusEvent.idl",
"//Userland/Libraries/LibWeb/UIEvents/InputEvent.idl",
"//Userland/Libraries/LibWeb/UIEvents/KeyboardEvent.idl",
"//Userland/Libraries/LibWeb/UIEvents/MouseEvent.idl",
"//Userland/Libraries/LibWeb/UIEvents/PointerEvent.idl",

View file

@ -197,6 +197,7 @@ IdleDeadline
Image
ImageBitmap
ImageData
InputEvent
Int16Array
Int32Array
Int8Array

View file

@ -707,6 +707,7 @@ set(SOURCES
Selection/Selection.cpp
UIEvents/EventNames.cpp
UIEvents/FocusEvent.cpp
UIEvents/InputEvent.cpp
UIEvents/KeyboardEvent.cpp
UIEvents/MouseEvent.cpp
UIEvents/PointerEvent.cpp

View file

@ -726,6 +726,7 @@ class SVGTitleElement;
}
namespace Web::UIEvents {
class InputEvent;
class KeyboardEvent;
class MouseEvent;
class PointerEvent;

View file

@ -0,0 +1,36 @@
/*
* Copyright (c) 2024, Jamie Mansfield <jmansfield@cadixdev.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibWeb/Bindings/InputEventPrototype.h>
#include <LibWeb/Bindings/Intrinsics.h>
#include <LibWeb/UIEvents/InputEvent.h>
namespace Web::UIEvents {
JS_DEFINE_ALLOCATOR(InputEvent);
WebIDL::ExceptionOr<JS::NonnullGCPtr<InputEvent>> InputEvent::construct_impl(JS::Realm& realm, FlyString const& event_name, InputEventInit const& event_init)
{
return realm.heap().allocate<InputEvent>(realm, realm, event_name, event_init);
}
InputEvent::InputEvent(JS::Realm& realm, FlyString const& event_name, InputEventInit const& event_init)
: UIEvent(realm, event_name, event_init)
, m_data(event_init.data)
, m_is_composing(event_init.is_composing)
, m_input_type(event_init.input_type)
{
}
InputEvent::~InputEvent() = default;
void InputEvent::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(InputEvent);
}
}

View file

@ -0,0 +1,47 @@
/*
* Copyright (c) 2024, Jamie Mansfield <jmansfield@cadixdev.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibWeb/UIEvents/UIEvent.h>
namespace Web::UIEvents {
struct InputEventInit : public UIEventInit {
Optional<String> data;
bool is_composing { false };
String input_type {};
};
class InputEvent final : public UIEvent {
WEB_PLATFORM_OBJECT(InputEvent, UIEvent);
JS_DECLARE_ALLOCATOR(InputEvent);
public:
static WebIDL::ExceptionOr<JS::NonnullGCPtr<InputEvent>> construct_impl(JS::Realm&, FlyString const& event_name, InputEventInit const& event_init);
virtual ~InputEvent() override;
// https://w3c.github.io/uievents/#dom-inputevent-data
Optional<String> data() const { return m_data; }
// https://w3c.github.io/uievents/#dom-inputevent-iscomposing
bool is_composing() const { return m_is_composing; }
// https://w3c.github.io/uievents/#dom-inputevent-inputtype
String input_type() const { return m_input_type; }
private:
InputEvent(JS::Realm&, FlyString const& event_name, InputEventInit const&);
virtual void initialize(JS::Realm&) override;
Optional<String> m_data;
bool m_is_composing;
String m_input_type;
};
}

View file

@ -0,0 +1,17 @@
#import <UIEvents/UIEvent.idl>
// https://w3c.github.io/uievents/#inputevent
[Exposed=Window]
interface InputEvent : UIEvent {
constructor(DOMString type, optional InputEventInit eventInitDict = {});
readonly attribute USVString? data;
readonly attribute boolean isComposing;
readonly attribute DOMString inputType;
};
// https://w3c.github.io/uievents/#dictdef-inputeventinit
dictionary InputEventInit : UIEventInit {
DOMString? data = null;
boolean isComposing = false;
DOMString inputType = "";
};

View file

@ -317,6 +317,7 @@ libweb_js_bindings(SVG/SVGUseElement)
libweb_js_bindings(Selection/Selection)
libweb_js_bindings(StorageAPI/StorageManager)
libweb_js_bindings(UIEvents/FocusEvent)
libweb_js_bindings(UIEvents/InputEvent)
libweb_js_bindings(UIEvents/KeyboardEvent)
libweb_js_bindings(UIEvents/MouseEvent)
libweb_js_bindings(UIEvents/PointerEvent)