1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-22 16:35:08 +00:00

LibWeb: Split JS wrapper constructors into construct/initialize

This commit is contained in:
Andreas Kling 2020-06-20 17:28:13 +02:00
parent 06e29fac57
commit 03da70c7d0
31 changed files with 107 additions and 55 deletions

View file

@ -47,9 +47,13 @@ CanvasRenderingContext2DWrapper* wrap(JS::Heap& heap, CanvasRenderingContext2D&
return static_cast<CanvasRenderingContext2DWrapper*>(wrap_impl(heap, impl)); return static_cast<CanvasRenderingContext2DWrapper*>(wrap_impl(heap, impl));
} }
CanvasRenderingContext2DWrapper::CanvasRenderingContext2DWrapper(CanvasRenderingContext2D& impl) CanvasRenderingContext2DWrapper::CanvasRenderingContext2DWrapper(JS::GlobalObject& global_object, CanvasRenderingContext2D& impl)
: Wrapper(*interpreter().global_object().object_prototype()) : Wrapper(*global_object.object_prototype())
, m_impl(impl) , m_impl(impl)
{
}
void CanvasRenderingContext2DWrapper::initialize(JS::Interpreter&, JS::GlobalObject&)
{ {
define_native_function("fillRect", fill_rect, 4); define_native_function("fillRect", fill_rect, 4);
define_native_function("scale", scale, 2); define_native_function("scale", scale, 2);

View file

@ -33,7 +33,8 @@ namespace Bindings {
class CanvasRenderingContext2DWrapper final : public Wrapper { class CanvasRenderingContext2DWrapper final : public Wrapper {
public: public:
explicit CanvasRenderingContext2DWrapper(CanvasRenderingContext2D&); CanvasRenderingContext2DWrapper(JS::GlobalObject&, CanvasRenderingContext2D&);
virtual void initialize(JS::Interpreter&, JS::GlobalObject&) override;
virtual ~CanvasRenderingContext2DWrapper() override; virtual ~CanvasRenderingContext2DWrapper() override;
CanvasRenderingContext2D& impl() { return m_impl; } CanvasRenderingContext2D& impl() { return m_impl; }

View file

@ -38,8 +38,12 @@
namespace Web { namespace Web {
namespace Bindings { namespace Bindings {
DocumentWrapper::DocumentWrapper(Document& document) DocumentWrapper::DocumentWrapper(JS::GlobalObject& global_object, Document& document)
: NodeWrapper(document) : NodeWrapper(global_object, document)
{
}
void DocumentWrapper::initialize(JS::Interpreter&, JS::GlobalObject&)
{ {
define_native_function("getElementById", get_element_by_id, 1); define_native_function("getElementById", get_element_by_id, 1);
define_native_function("querySelector", query_selector, 1); define_native_function("querySelector", query_selector, 1);

View file

@ -33,7 +33,8 @@ namespace Bindings {
class DocumentWrapper : public NodeWrapper { class DocumentWrapper : public NodeWrapper {
public: public:
explicit DocumentWrapper(Document&); DocumentWrapper(JS::GlobalObject&, Document&);
virtual void initialize(JS::Interpreter&, JS::GlobalObject&) override;
virtual ~DocumentWrapper() override; virtual ~DocumentWrapper() override;
Document& node(); Document& node();

View file

@ -38,8 +38,12 @@
namespace Web { namespace Web {
namespace Bindings { namespace Bindings {
ElementWrapper::ElementWrapper(Element& element) ElementWrapper::ElementWrapper(JS::GlobalObject& global_object, Element& element)
: NodeWrapper(element) : NodeWrapper(global_object, element)
{
}
void ElementWrapper::initialize(JS::Interpreter&, JS::GlobalObject&)
{ {
define_native_property("innerHTML", inner_html_getter, inner_html_setter); define_native_property("innerHTML", inner_html_getter, inner_html_setter);
define_native_property("id", id_getter, id_setter); define_native_property("id", id_getter, id_setter);

View file

@ -33,7 +33,8 @@ namespace Bindings {
class ElementWrapper : public NodeWrapper { class ElementWrapper : public NodeWrapper {
public: public:
explicit ElementWrapper(Element&); ElementWrapper(JS::GlobalObject&, Element&);
virtual void initialize(JS::Interpreter&, JS::GlobalObject&) override;
virtual ~ElementWrapper() override; virtual ~ElementWrapper() override;
Element& node(); Element& node();

View file

@ -33,8 +33,8 @@
namespace Web { namespace Web {
namespace Bindings { namespace Bindings {
EventListenerWrapper::EventListenerWrapper(EventListener& impl) EventListenerWrapper::EventListenerWrapper(JS::GlobalObject& global_object, EventListener& impl)
: Wrapper(*interpreter().global_object().object_prototype()) : Wrapper(*global_object.object_prototype())
, m_impl(impl) , m_impl(impl)
{ {
} }

View file

@ -33,7 +33,7 @@ namespace Bindings {
class EventListenerWrapper final : public Wrapper { class EventListenerWrapper final : public Wrapper {
public: public:
explicit EventListenerWrapper(EventListener&); EventListenerWrapper(JS::GlobalObject&, EventListener&);
virtual ~EventListenerWrapper() override; virtual ~EventListenerWrapper() override;
EventListener& impl() { return *m_impl; } EventListener& impl() { return *m_impl; }

View file

@ -38,9 +38,13 @@
namespace Web { namespace Web {
namespace Bindings { namespace Bindings {
EventTargetWrapper::EventTargetWrapper(EventTarget& impl) EventTargetWrapper::EventTargetWrapper(JS::GlobalObject& global_object, EventTarget& impl)
: Wrapper(*interpreter().global_object().object_prototype()) : Wrapper(*global_object.object_prototype())
, m_impl(impl) , m_impl(impl)
{
}
void EventTargetWrapper::initialize(JS::Interpreter&, JS::GlobalObject&)
{ {
define_native_function("addEventListener", add_event_listener, 2); define_native_function("addEventListener", add_event_listener, 2);
} }

View file

@ -33,7 +33,8 @@ namespace Bindings {
class EventTargetWrapper : public Wrapper { class EventTargetWrapper : public Wrapper {
public: public:
explicit EventTargetWrapper(EventTarget&); EventTargetWrapper(JS::GlobalObject&, EventTarget&);
virtual void initialize(JS::Interpreter&, JS::GlobalObject&) override;
virtual ~EventTargetWrapper() override; virtual ~EventTargetWrapper() override;
EventTarget& impl() { return *m_impl; } EventTarget& impl() { return *m_impl; }

View file

@ -40,8 +40,8 @@ EventWrapper* wrap(JS::Heap& heap, Event& event)
return static_cast<EventWrapper*>(wrap_impl(heap, event)); return static_cast<EventWrapper*>(wrap_impl(heap, event));
} }
EventWrapper::EventWrapper(Event& event) EventWrapper::EventWrapper(JS::GlobalObject& global_object, Event& event)
: Wrapper(*interpreter().global_object().object_prototype()) : Wrapper(*global_object.object_prototype())
, m_event(event) , m_event(event)
{ {
} }

View file

@ -33,7 +33,7 @@ namespace Bindings {
class EventWrapper : public Wrapper { class EventWrapper : public Wrapper {
public: public:
explicit EventWrapper(Event&); EventWrapper(JS::GlobalObject&, Event&);
virtual ~EventWrapper() override; virtual ~EventWrapper() override;
Event& event() { return m_event; } Event& event() { return m_event; }

View file

@ -38,8 +38,12 @@
namespace Web { namespace Web {
namespace Bindings { namespace Bindings {
HTMLCanvasElementWrapper::HTMLCanvasElementWrapper(HTMLCanvasElement& element) HTMLCanvasElementWrapper::HTMLCanvasElementWrapper(JS::GlobalObject& global_object, HTMLCanvasElement& element)
: ElementWrapper(element) : ElementWrapper(global_object, element)
{
}
void HTMLCanvasElementWrapper::initialize(JS::Interpreter&, JS::GlobalObject&)
{ {
define_native_function("getContext", get_context, 1); define_native_function("getContext", get_context, 1);

View file

@ -33,7 +33,8 @@ namespace Bindings {
class HTMLCanvasElementWrapper : public ElementWrapper { class HTMLCanvasElementWrapper : public ElementWrapper {
public: public:
explicit HTMLCanvasElementWrapper(HTMLCanvasElement&); HTMLCanvasElementWrapper(JS::GlobalObject&, HTMLCanvasElement&);
virtual void initialize(JS::Interpreter&, JS::GlobalObject&) override;
virtual ~HTMLCanvasElementWrapper() override; virtual ~HTMLCanvasElementWrapper() override;
HTMLCanvasElement& node(); HTMLCanvasElement& node();

View file

@ -35,8 +35,8 @@
namespace Web { namespace Web {
namespace Bindings { namespace Bindings {
HTMLImageElementWrapper::HTMLImageElementWrapper(HTMLImageElement& element) HTMLImageElementWrapper::HTMLImageElementWrapper(JS::GlobalObject& global_object, HTMLImageElement& element)
: ElementWrapper(element) : ElementWrapper(global_object, element)
{ {
} }

View file

@ -33,7 +33,7 @@ namespace Bindings {
class HTMLImageElementWrapper : public ElementWrapper { class HTMLImageElementWrapper : public ElementWrapper {
public: public:
explicit HTMLImageElementWrapper(HTMLImageElement&); HTMLImageElementWrapper(JS::GlobalObject&, HTMLImageElement&);
virtual ~HTMLImageElementWrapper() override; virtual ~HTMLImageElementWrapper() override;
HTMLImageElement& node(); HTMLImageElement& node();

View file

@ -40,9 +40,13 @@ ImageDataWrapper* wrap(JS::Heap& heap, ImageData& event)
return static_cast<ImageDataWrapper*>(wrap_impl(heap, event)); return static_cast<ImageDataWrapper*>(wrap_impl(heap, event));
} }
ImageDataWrapper::ImageDataWrapper(ImageData& impl) ImageDataWrapper::ImageDataWrapper(JS::GlobalObject& global_object, ImageData& impl)
: Wrapper(*interpreter().global_object().object_prototype()) : Wrapper(*global_object.object_prototype())
, m_impl(impl) , m_impl(impl)
{
}
void ImageDataWrapper::initialize(JS::Interpreter&, JS::GlobalObject&)
{ {
define_native_property("width", width_getter, nullptr); define_native_property("width", width_getter, nullptr);
define_native_property("height", height_getter, nullptr); define_native_property("height", height_getter, nullptr);

View file

@ -33,7 +33,8 @@ namespace Bindings {
class ImageDataWrapper : public Wrapper { class ImageDataWrapper : public Wrapper {
public: public:
explicit ImageDataWrapper(ImageData&); ImageDataWrapper(JS::GlobalObject&, ImageData&);
virtual void initialize(JS::Interpreter&, JS::GlobalObject&) override;
virtual ~ImageDataWrapper() override; virtual ~ImageDataWrapper() override;
ImageData& impl() { return m_impl; } ImageData& impl() { return m_impl; }

View file

@ -35,8 +35,12 @@
namespace Web { namespace Web {
namespace Bindings { namespace Bindings {
LocationObject::LocationObject() LocationObject::LocationObject(JS::GlobalObject& global_object)
: Object(interpreter().global_object().object_prototype()) : Object(global_object.object_prototype())
{
}
void LocationObject::initialize(JS::Interpreter&, JS::GlobalObject&)
{ {
u8 attr = JS::Attribute::Writable | JS::Attribute::Enumerable; u8 attr = JS::Attribute::Writable | JS::Attribute::Enumerable;
define_native_property("href", href_getter, href_setter, attr); define_native_property("href", href_getter, href_setter, attr);

View file

@ -34,7 +34,8 @@ namespace Bindings {
class LocationObject final : public JS::Object { class LocationObject final : public JS::Object {
public: public:
LocationObject(); explicit LocationObject(JS::GlobalObject&);
virtual void initialize(JS::Interpreter&, JS::GlobalObject&) override;
virtual ~LocationObject() override; virtual ~LocationObject() override;
private: private:

View file

@ -35,8 +35,12 @@
namespace Web { namespace Web {
namespace Bindings { namespace Bindings {
MouseEventWrapper::MouseEventWrapper(MouseEvent& event) MouseEventWrapper::MouseEventWrapper(JS::GlobalObject& global_object, MouseEvent& event)
: EventWrapper(event) : EventWrapper(global_object, event)
{
}
void MouseEventWrapper::initialize(JS::Interpreter&, JS::GlobalObject&)
{ {
define_native_property("offsetX", offset_x_getter, nullptr); define_native_property("offsetX", offset_x_getter, nullptr);
define_native_property("offsetY", offset_y_getter, nullptr); define_native_property("offsetY", offset_y_getter, nullptr);

View file

@ -33,7 +33,8 @@ namespace Bindings {
class MouseEventWrapper : public EventWrapper { class MouseEventWrapper : public EventWrapper {
public: public:
explicit MouseEventWrapper(MouseEvent&); MouseEventWrapper(JS::GlobalObject&, MouseEvent&);
virtual void initialize(JS::Interpreter&, JS::GlobalObject&) override;
virtual ~MouseEventWrapper() override; virtual ~MouseEventWrapper() override;
MouseEvent& event(); MouseEvent& event();

View file

@ -34,19 +34,23 @@
namespace Web { namespace Web {
namespace Bindings { namespace Bindings {
NavigatorObject::NavigatorObject() NavigatorObject::NavigatorObject(JS::GlobalObject& global_object)
: Object(interpreter().global_object().object_prototype()) : Object(global_object.object_prototype())
{ {
auto* languages = JS::Array::create(interpreter().global_object()); }
void NavigatorObject::initialize(JS::Interpreter& interpreter, JS::GlobalObject& global_object)
{
auto* languages = JS::Array::create(global_object);
languages->indexed_properties().append(js_string(heap(), "en-US")); languages->indexed_properties().append(js_string(heap(), "en-US"));
define_property("appCodeName", js_string(heap(), "Mozilla")); define_property("appCodeName", js_string(interpreter.heap(), "Mozilla"));
define_property("appName", js_string(heap(), "Netscape")); define_property("appName", js_string(interpreter.heap(), "Netscape"));
define_property("appVersion", js_string(heap(), "4.0")); define_property("appVersion", js_string(interpreter.heap(), "4.0"));
define_property("language", languages->get(0)); define_property("language", languages->get(0));
define_property("languages", languages); define_property("languages", languages);
define_property("platform", js_string(heap(), "SerenityOS")); define_property("platform", js_string(interpreter.heap(), "SerenityOS"));
define_property("product", js_string(heap(), "Gecko")); define_property("product", js_string(interpreter.heap(), "Gecko"));
define_native_property("userAgent", user_agent_getter, nullptr); define_native_property("userAgent", user_agent_getter, nullptr);
} }

View file

@ -34,7 +34,8 @@ namespace Bindings {
class NavigatorObject final : public JS::Object { class NavigatorObject final : public JS::Object {
public: public:
NavigatorObject(); NavigatorObject(JS::GlobalObject&);
virtual void initialize(JS::Interpreter&, JS::GlobalObject&) override;
virtual ~NavigatorObject() override; virtual ~NavigatorObject() override;
private: private:

View file

@ -52,10 +52,14 @@ NodeWrapper* wrap(JS::Heap& heap, Node& node)
return static_cast<NodeWrapper*>(wrap_impl(heap, node)); return static_cast<NodeWrapper*>(wrap_impl(heap, node));
} }
NodeWrapper::NodeWrapper(Node& node) NodeWrapper::NodeWrapper(JS::GlobalObject& global_object, Node& node)
: EventTargetWrapper(node) : EventTargetWrapper(global_object, node)
{ {
put("nodeName", JS::js_string(heap(), node.node_name())); }
void NodeWrapper::initialize(JS::Interpreter& interpreter, JS::GlobalObject&)
{
put("nodeName", JS::js_string(interpreter.heap(), node().node_name()));
} }
NodeWrapper::~NodeWrapper() NodeWrapper::~NodeWrapper()

View file

@ -33,7 +33,8 @@ namespace Bindings {
class NodeWrapper : public EventTargetWrapper { class NodeWrapper : public EventTargetWrapper {
public: public:
explicit NodeWrapper(Node&); NodeWrapper(JS::GlobalObject&, Node&);
virtual void initialize(JS::Interpreter&, JS::GlobalObject&) override;
virtual ~NodeWrapper() override; virtual ~NodeWrapper() override;
Node& node(); Node& node();

View file

@ -60,8 +60,8 @@ void WindowObject::initialize()
define_native_function("requestAnimationFrame", request_animation_frame, 1); define_native_function("requestAnimationFrame", request_animation_frame, 1);
define_native_function("cancelAnimationFrame", cancel_animation_frame, 1); define_native_function("cancelAnimationFrame", cancel_animation_frame, 1);
define_property("navigator", heap().allocate<NavigatorObject>(*this), JS::Attribute::Enumerable | JS::Attribute::Configurable); define_property("navigator", heap().allocate<NavigatorObject>(*this, *this), JS::Attribute::Enumerable | JS::Attribute::Configurable);
define_property("location", heap().allocate<LocationObject>(*this), JS::Attribute::Enumerable | JS::Attribute::Configurable); define_property("location", heap().allocate<LocationObject>(*this, *this), JS::Attribute::Enumerable | JS::Attribute::Configurable);
m_xhr_prototype = heap().allocate<XMLHttpRequestPrototype>(*this, *this); m_xhr_prototype = heap().allocate<XMLHttpRequestPrototype>(*this, *this);
m_xhr_constructor = heap().allocate<XMLHttpRequestConstructor>(*this, *this); m_xhr_constructor = heap().allocate<XMLHttpRequestConstructor>(*this, *this);

View file

@ -49,8 +49,10 @@ private:
template<class NativeObject> template<class NativeObject>
inline Wrapper* wrap_impl(JS::Heap& heap, NativeObject& native_object) inline Wrapper* wrap_impl(JS::Heap& heap, NativeObject& native_object)
{ {
if (!native_object.wrapper()) if (!native_object.wrapper()) {
native_object.set_wrapper(*heap.allocate<typename NativeObject::WrapperType>(heap.interpreter().global_object(), native_object)); auto& global_object = heap.interpreter().global_object();
native_object.set_wrapper(*heap.allocate<typename NativeObject::WrapperType>(global_object, global_object, native_object));
}
return native_object.wrapper(); return native_object.wrapper();
} }

View file

@ -64,7 +64,7 @@ JS::Value XMLHttpRequestConstructor::call(JS::Interpreter& interpreter)
JS::Value XMLHttpRequestConstructor::construct(JS::Interpreter& interpreter) JS::Value XMLHttpRequestConstructor::construct(JS::Interpreter& interpreter)
{ {
auto& window = static_cast<WindowObject&>(global_object()); auto& window = static_cast<WindowObject&>(global_object());
return interpreter.heap().allocate<XMLHttpRequestWrapper>(window, XMLHttpRequest::create(window.impl())); return interpreter.heap().allocate<XMLHttpRequestWrapper>(window, window, XMLHttpRequest::create(window.impl()));
} }
} }

View file

@ -41,10 +41,10 @@ XMLHttpRequestWrapper* wrap(JS::Heap& heap, XMLHttpRequest& impl)
return static_cast<XMLHttpRequestWrapper*>(wrap_impl(heap, impl)); return static_cast<XMLHttpRequestWrapper*>(wrap_impl(heap, impl));
} }
XMLHttpRequestWrapper::XMLHttpRequestWrapper(XMLHttpRequest& impl) XMLHttpRequestWrapper::XMLHttpRequestWrapper(JS::GlobalObject& global_object, XMLHttpRequest& impl)
: EventTargetWrapper(impl) : EventTargetWrapper(global_object, impl)
{ {
set_prototype(static_cast<WindowObject&>(interpreter().global_object()).xhr_prototype()); set_prototype(static_cast<WindowObject&>(global_object).xhr_prototype());
} }
XMLHttpRequestWrapper::~XMLHttpRequestWrapper() XMLHttpRequestWrapper::~XMLHttpRequestWrapper()

View file

@ -33,7 +33,7 @@ namespace Bindings {
class XMLHttpRequestWrapper final : public EventTargetWrapper { class XMLHttpRequestWrapper final : public EventTargetWrapper {
public: public:
explicit XMLHttpRequestWrapper(XMLHttpRequest&); XMLHttpRequestWrapper(JS::GlobalObject&, XMLHttpRequest&);
virtual ~XMLHttpRequestWrapper() override; virtual ~XMLHttpRequestWrapper() override;
XMLHttpRequest& impl(); XMLHttpRequest& impl();