mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 06:37:43 +00:00
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.
This commit is contained in:
parent
b43db4cc50
commit
a59b1825ce
15 changed files with 391 additions and 2 deletions
|
@ -904,6 +904,7 @@ void generate_prototype_implementation(const IDL::Interface& interface)
|
|||
#include <LibWeb/DOM/Element.h>
|
||||
#include <LibWeb/DOM/EventListener.h>
|
||||
#include <LibWeb/DOM/Window.h>
|
||||
#include <LibWeb/HTML/EventHandler.h>
|
||||
#include <LibWeb/HTML/HTMLElement.h>
|
||||
#include <LibWeb/NavigationTiming/PerformanceTiming.h>
|
||||
#include <LibWeb/Origin.h>
|
||||
|
@ -1096,6 +1097,18 @@ static @fully_qualified_name@* impl_from(JS::VM& vm, JS::GlobalObject& global_ob
|
|||
auto @cpp_name@ = @js_name@@js_suffix@.to_u32(global_object);
|
||||
if (vm.exception())
|
||||
@return_statement@
|
||||
)~~~");
|
||||
} else if (parameter.type.name == "EventHandler") {
|
||||
// x.onfoo = function() { ... }
|
||||
scoped_generator.append(R"~~~(
|
||||
HTML::EventHandler @cpp_name@;
|
||||
if (@js_name@@js_suffix@.is_function()) {
|
||||
@cpp_name@.callback = JS::make_handle(&@js_name@@js_suffix@.as_function());
|
||||
} else if (@js_name@@js_suffix@.is_string()) {
|
||||
@cpp_name@.string = @js_name@@js_suffix@.as_string().string();
|
||||
} else {
|
||||
@return_statement@
|
||||
}
|
||||
)~~~");
|
||||
} else {
|
||||
dbgln("Unimplemented JS-to-C++ conversion: {}", parameter.type.name);
|
||||
|
@ -1173,6 +1186,10 @@ static @fully_qualified_name@* impl_from(JS::VM& vm, JS::GlobalObject& global_ob
|
|||
} else if (return_type.name == "Uint8ClampedArray") {
|
||||
scoped_generator.append(R"~~~(
|
||||
return retval;
|
||||
)~~~");
|
||||
} else if (return_type.name == "EventHandler") {
|
||||
scoped_generator.append(R"~~~(
|
||||
return retval.callback.cell();
|
||||
)~~~");
|
||||
} else {
|
||||
scoped_generator.append(R"~~~(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue