diff options
author | Linus Groh <mail@linusgroh.de> | 2021-09-12 11:39:09 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-09-12 15:53:48 +0200 |
commit | 7991077284adfb50353a37a49b7730142ac96034 (patch) | |
tree | 2c7984b7674ff22791ee62a267da416c2f41dc1b /Userland/Libraries/LibWeb/Bindings | |
parent | a05c998e69b2b7e524c70b34c9b5c44c48ef64ea (diff) | |
download | serenity-7991077284adfb50353a37a49b7730142ac96034.zip |
LibWeb: Implement window.event as a [Replaceable] property
This is the result of debugging React DOM, which would throw a TypeError
when assigning to window.event in strict mode and then not complete
rendering - here:
https://github.com/facebook/react/blob/cae6350/packages/shared/invokeGuardedCallbackImpl.js#L134
With this change, the following minimal React example now works!
<div id="app"></div>
<script src="react.development.js"></script>
<script src="react-dom.development.js"></script>
<script>
ReactDOM.render(
React.createElement("h1", null, "Hello World"),
document.getElementById("app")
);
</script>
Diffstat (limited to 'Userland/Libraries/LibWeb/Bindings')
-rw-r--r-- | Userland/Libraries/LibWeb/Bindings/WindowObject.cpp | 8 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/Bindings/WindowObject.h | 1 |
2 files changed, 8 insertions, 1 deletions
diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObject.cpp b/Userland/Libraries/LibWeb/Bindings/WindowObject.cpp index 1f9b174e1b..989db89812 100644 --- a/Userland/Libraries/LibWeb/Bindings/WindowObject.cpp +++ b/Userland/Libraries/LibWeb/Bindings/WindowObject.cpp @@ -24,6 +24,7 @@ #include <LibWeb/Bindings/NavigatorObject.h> #include <LibWeb/Bindings/NodeWrapperFactory.h> #include <LibWeb/Bindings/PerformanceWrapper.h> +#include <LibWeb/Bindings/Replaceable.h> #include <LibWeb/Bindings/ScreenWrapper.h> #include <LibWeb/Bindings/WindowObject.h> #include <LibWeb/DOM/Document.h> @@ -89,7 +90,7 @@ void WindowObject::initialize_global_object() define_native_function("scrollBy", scroll_by, 2, attr); // Legacy - define_native_accessor("event", event_getter, {}, JS::Attribute::Enumerable); + define_native_accessor("event", event_getter, event_setter, JS::Attribute::Enumerable); define_direct_property("navigator", heap().allocate<NavigatorObject>(*this, *this), JS::Attribute::Enumerable | JS::Attribute::Configurable); define_direct_property("location", heap().allocate<LocationObject>(*this, *this), JS::Attribute::Enumerable | JS::Attribute::Configurable); @@ -439,6 +440,11 @@ JS_DEFINE_NATIVE_FUNCTION(WindowObject::event_getter) return wrap(global_object, const_cast<DOM::Event&>(*impl->current_event())); } +JS_DEFINE_NATIVE_FUNCTION(WindowObject::event_setter) +{ + REPLACEABLE_PROPERTY_SETTER(WindowObject, event); +} + JS_DEFINE_NATIVE_FUNCTION(WindowObject::inner_width_getter) { auto* impl = impl_from(vm, global_object); diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObject.h b/Userland/Libraries/LibWeb/Bindings/WindowObject.h index d574546740..7a5f014980 100644 --- a/Userland/Libraries/LibWeb/Bindings/WindowObject.h +++ b/Userland/Libraries/LibWeb/Bindings/WindowObject.h @@ -68,6 +68,7 @@ private: JS_DECLARE_NATIVE_FUNCTION(screen_getter); JS_DECLARE_NATIVE_FUNCTION(event_getter); + JS_DECLARE_NATIVE_FUNCTION(event_setter); JS_DECLARE_NATIVE_FUNCTION(inner_width_getter); JS_DECLARE_NATIVE_FUNCTION(inner_height_getter); |