mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 21:42:43 +00:00 
			
		
		
		
	LibWeb: Add a DOM Event class (instead of events being simple strings)
This patch adds the Event base class, along with a MouseEvent subclass. We now dispatch MouseEvent objects for mousedown, mouseup and mousemove and these objects have the .offsetX and .offsetY properties. Both of those properties are hard-coded at the moment. This will be fixed in the next patch. :^)
This commit is contained in:
		
							parent
							
								
									b196665131
								
							
						
					
					
						commit
						4dde36844b
					
				
					 15 changed files with 311 additions and 10 deletions
				
			
		
							
								
								
									
										51
									
								
								Libraries/LibWeb/Bindings/EventWrapper.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								Libraries/LibWeb/Bindings/EventWrapper.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | ||||||
|  | /*
 | ||||||
|  |  * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> | ||||||
|  |  * All rights reserved. | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, this | ||||||
|  |  *    list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  *    this list of conditions and the following disclaimer in the documentation | ||||||
|  |  *    and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||||
|  |  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||||||
|  |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||||
|  |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||||||
|  |  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  |  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||||||
|  |  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  |  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <LibWeb/Bindings/EventWrapper.h> | ||||||
|  | #include <LibWeb/Bindings/MouseEventWrapper.h> | ||||||
|  | #include <LibWeb/DOM/MouseEvent.h> | ||||||
|  | 
 | ||||||
|  | namespace Web { | ||||||
|  | namespace Bindings { | ||||||
|  | 
 | ||||||
|  | EventWrapper* wrap(JS::Heap& heap, Event& event) | ||||||
|  | { | ||||||
|  |     if (event.is_mouse_event()) | ||||||
|  |         return static_cast<EventWrapper*>(wrap_impl(heap, static_cast<MouseEvent&>(event))); | ||||||
|  |     return static_cast<EventWrapper*>(wrap_impl(heap, event)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | EventWrapper::EventWrapper(Event& event) | ||||||
|  |     : m_event(event) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | EventWrapper::~EventWrapper() | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | } | ||||||
							
								
								
									
										51
									
								
								Libraries/LibWeb/Bindings/EventWrapper.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								Libraries/LibWeb/Bindings/EventWrapper.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | ||||||
|  | /*
 | ||||||
|  |  * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> | ||||||
|  |  * All rights reserved. | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, this | ||||||
|  |  *    list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  *    this list of conditions and the following disclaimer in the documentation | ||||||
|  |  *    and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||||
|  |  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||||||
|  |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||||
|  |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||||||
|  |  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  |  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||||||
|  |  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  |  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <LibWeb/Bindings/Wrapper.h> | ||||||
|  | 
 | ||||||
|  | namespace Web { | ||||||
|  | namespace Bindings { | ||||||
|  | 
 | ||||||
|  | class EventWrapper : public Wrapper { | ||||||
|  | public: | ||||||
|  |     explicit EventWrapper(Event&); | ||||||
|  |     virtual ~EventWrapper() override; | ||||||
|  | 
 | ||||||
|  |     Event& event() { return m_event; } | ||||||
|  |     const Event& event() const { return m_event; } | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     virtual const char* class_name() const override { return "EventWrapper"; } | ||||||
|  | 
 | ||||||
|  |     NonnullRefPtr<Event> m_event; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | EventWrapper* wrap(JS::Heap&, Event&); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | } | ||||||
							
								
								
									
										67
									
								
								Libraries/LibWeb/Bindings/MouseEventWrapper.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								Libraries/LibWeb/Bindings/MouseEventWrapper.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,67 @@ | ||||||
|  | /*
 | ||||||
|  |  * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> | ||||||
|  |  * All rights reserved. | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, this | ||||||
|  |  *    list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  *    this list of conditions and the following disclaimer in the documentation | ||||||
|  |  *    and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||||
|  |  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||||||
|  |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||||
|  |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||||||
|  |  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  |  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||||||
|  |  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  |  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <AK/Function.h> | ||||||
|  | #include <LibJS/Runtime/Function.h> | ||||||
|  | #include <LibWeb/Bindings/MouseEventWrapper.h> | ||||||
|  | #include <LibWeb/DOM/MouseEvent.h> | ||||||
|  | 
 | ||||||
|  | namespace Web { | ||||||
|  | namespace Bindings { | ||||||
|  | 
 | ||||||
|  | MouseEventWrapper::MouseEventWrapper(MouseEvent& event) | ||||||
|  |     : EventWrapper(event) | ||||||
|  | { | ||||||
|  |     put_native_property( | ||||||
|  |         "offsetX", | ||||||
|  |         [this](JS::Object*) { | ||||||
|  |             return JS::Value(this->event().offset_x()); | ||||||
|  |         }, | ||||||
|  |         nullptr); | ||||||
|  |     put_native_property( | ||||||
|  |         "offsetY", | ||||||
|  |         [this](JS::Object*) { | ||||||
|  |             return JS::Value(this->event().offset_y()); | ||||||
|  |         }, | ||||||
|  |         nullptr); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | MouseEventWrapper::~MouseEventWrapper() | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const MouseEvent& MouseEventWrapper::event() const | ||||||
|  | { | ||||||
|  |     return static_cast<const MouseEvent&>(EventWrapper::event()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | MouseEvent& MouseEventWrapper::event() | ||||||
|  | { | ||||||
|  |     return static_cast<MouseEvent&>(EventWrapper::event()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | } | ||||||
							
								
								
									
										47
									
								
								Libraries/LibWeb/Bindings/MouseEventWrapper.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								Libraries/LibWeb/Bindings/MouseEventWrapper.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,47 @@ | ||||||
|  | /*
 | ||||||
|  |  * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> | ||||||
|  |  * All rights reserved. | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, this | ||||||
|  |  *    list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  *    this list of conditions and the following disclaimer in the documentation | ||||||
|  |  *    and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||||
|  |  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||||||
|  |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||||
|  |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||||||
|  |  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  |  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||||||
|  |  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  |  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <LibWeb/Bindings/EventWrapper.h> | ||||||
|  | 
 | ||||||
|  | namespace Web { | ||||||
|  | namespace Bindings { | ||||||
|  | 
 | ||||||
|  | class MouseEventWrapper : public EventWrapper { | ||||||
|  | public: | ||||||
|  |     explicit MouseEventWrapper(MouseEvent&); | ||||||
|  |     virtual ~MouseEventWrapper() override; | ||||||
|  | 
 | ||||||
|  |     MouseEvent& event(); | ||||||
|  |     const MouseEvent& event() const; | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     virtual const char* class_name() const override { return "MouseEventWrapper"; } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | } | ||||||
							
								
								
									
										0
									
								
								Libraries/LibWeb/DOM/Event.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								Libraries/LibWeb/DOM/Event.cpp
									
										
									
									
									
										Normal file
									
								
							
							
								
								
									
										36
									
								
								Libraries/LibWeb/DOM/Event.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								Libraries/LibWeb/DOM/Event.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,36 @@ | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <AK/RefCounted.h> | ||||||
|  | #include <AK/String.h> | ||||||
|  | #include <LibWeb/Bindings/Wrappable.h> | ||||||
|  | 
 | ||||||
|  | namespace Web { | ||||||
|  | 
 | ||||||
|  | class Event | ||||||
|  |     : public RefCounted<Event> | ||||||
|  |     , public Bindings::Wrappable { | ||||||
|  | public: | ||||||
|  |     using WrapperType = Bindings::EventWrapper; | ||||||
|  | 
 | ||||||
|  |     static NonnullRefPtr<Event> create(String event_name) | ||||||
|  |     { | ||||||
|  |         return adopt(*new Event(move(event_name))); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     virtual ~Event() {} | ||||||
|  | 
 | ||||||
|  |     const String& name() const { return m_event_name; } | ||||||
|  | 
 | ||||||
|  |     virtual bool is_mouse_event() const { return false; } | ||||||
|  | 
 | ||||||
|  | protected: | ||||||
|  |     Event(String event_name) | ||||||
|  |         : m_event_name(move(event_name)) | ||||||
|  |     { | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     String m_event_name; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -45,7 +45,7 @@ public: | ||||||
| 
 | 
 | ||||||
|     void add_event_listener(String event_name, NonnullRefPtr<EventListener>); |     void add_event_listener(String event_name, NonnullRefPtr<EventListener>); | ||||||
| 
 | 
 | ||||||
|     virtual void dispatch_event(String event_name) = 0; |     virtual void dispatch_event(NonnullRefPtr<Event>) = 0; | ||||||
| 
 | 
 | ||||||
|     struct EventListenerRegistration { |     struct EventListenerRegistration { | ||||||
|         String event_name; |         String event_name; | ||||||
|  |  | ||||||
							
								
								
									
										0
									
								
								Libraries/LibWeb/DOM/MouseEvent.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								Libraries/LibWeb/DOM/MouseEvent.cpp
									
										
									
									
									
										Normal file
									
								
							
							
								
								
									
										36
									
								
								Libraries/LibWeb/DOM/MouseEvent.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								Libraries/LibWeb/DOM/MouseEvent.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,36 @@ | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <LibWeb/DOM/Event.h> | ||||||
|  | 
 | ||||||
|  | namespace Web { | ||||||
|  | 
 | ||||||
|  | class MouseEvent final : public Event { | ||||||
|  | public: | ||||||
|  |     using WrapperType = Bindings::MouseEventWrapper; | ||||||
|  | 
 | ||||||
|  |     static NonnullRefPtr<MouseEvent> create(String event_name, i32 offset_x, i32 offset_y) | ||||||
|  |     { | ||||||
|  |         return adopt(*new MouseEvent(move(event_name), offset_x, offset_y)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     virtual ~MouseEvent() override {} | ||||||
|  | 
 | ||||||
|  |     i32 offset_x() const { return m_offset_x; } | ||||||
|  |     i32 offset_y() const { return m_offset_y; } | ||||||
|  | 
 | ||||||
|  | protected: | ||||||
|  |     MouseEvent(String event_name, i32 offset_x, i32 offset_y) | ||||||
|  |         : Event(move(event_name)) | ||||||
|  |         , m_offset_x(offset_x) | ||||||
|  |         , m_offset_y(offset_y) | ||||||
|  |     { | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     virtual bool is_mouse_event() const override { return true; } | ||||||
|  | 
 | ||||||
|  |     i32 m_offset_x { 0 }; | ||||||
|  |     i32 m_offset_y { 0 }; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -29,9 +29,11 @@ | ||||||
| #include <LibJS/Interpreter.h> | #include <LibJS/Interpreter.h> | ||||||
| #include <LibJS/Runtime/Function.h> | #include <LibJS/Runtime/Function.h> | ||||||
| #include <LibJS/Runtime/ScriptFunction.h> | #include <LibJS/Runtime/ScriptFunction.h> | ||||||
|  | #include <LibWeb/Bindings/EventWrapper.h> | ||||||
| #include <LibWeb/Bindings/NodeWrapper.h> | #include <LibWeb/Bindings/NodeWrapper.h> | ||||||
| #include <LibWeb/CSS/StyleResolver.h> | #include <LibWeb/CSS/StyleResolver.h> | ||||||
| #include <LibWeb/DOM/Element.h> | #include <LibWeb/DOM/Element.h> | ||||||
|  | #include <LibWeb/DOM/Event.h> | ||||||
| #include <LibWeb/DOM/EventListener.h> | #include <LibWeb/DOM/EventListener.h> | ||||||
| #include <LibWeb/DOM/HTMLAnchorElement.h> | #include <LibWeb/DOM/HTMLAnchorElement.h> | ||||||
| #include <LibWeb/DOM/Node.h> | #include <LibWeb/DOM/Node.h> | ||||||
|  | @ -123,21 +125,22 @@ bool Node::is_link() const | ||||||
|     return enclosing_link->has_attribute("href"); |     return enclosing_link->has_attribute("href"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Node::dispatch_event(String event_name) | void Node::dispatch_event(NonnullRefPtr<Event> event) | ||||||
| { | { | ||||||
|     for (auto& listener : listeners()) { |     for (auto& listener : listeners()) { | ||||||
|         if (listener.event_name == event_name) { |         if (listener.event_name == event->name()) { | ||||||
|             auto* function = const_cast<EventListener&>(*listener.listener).function(); |             auto* function = const_cast<EventListener&>(*listener.listener).function(); | ||||||
|             static_cast<const JS::ScriptFunction*>(function)->body().dump(0); |             static_cast<const JS::ScriptFunction*>(function)->body().dump(0); | ||||||
|             auto* this_value = wrap(function->heap(), *this); |             auto* this_value = wrap(function->heap(), *this); | ||||||
|             dbg() << "calling event listener with this=" << this_value; |             dbg() << "calling event listener with this=" << this_value; | ||||||
|             document().interpreter().call(function, this_value, {}); |             auto* event_wrapper = wrap(function->heap(), *event); | ||||||
|  |             document().interpreter().call(function, this_value, { event_wrapper }); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // FIXME: This is a hack. We should follow the real rules of event bubbling.
 |     // FIXME: This is a hack. We should follow the real rules of event bubbling.
 | ||||||
|     if (parent()) |     if (parent()) | ||||||
|         parent()->dispatch_event(move(event_name)); |         parent()->dispatch_event(move(event)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -68,7 +68,7 @@ public: | ||||||
|     // ^EventTarget
 |     // ^EventTarget
 | ||||||
|     virtual void ref_event_target() final { ref(); } |     virtual void ref_event_target() final { ref(); } | ||||||
|     virtual void unref_event_target() final { unref(); } |     virtual void unref_event_target() final { unref(); } | ||||||
|     virtual void dispatch_event(String event_name) final; |     virtual void dispatch_event(NonnullRefPtr<Event>) final; | ||||||
| 
 | 
 | ||||||
|     virtual ~Node(); |     virtual ~Node(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -31,21 +31,25 @@ namespace Web { | ||||||
| class CanvasRenderingContext2D; | class CanvasRenderingContext2D; | ||||||
| class Document; | class Document; | ||||||
| class Element; | class Element; | ||||||
|  | class Event; | ||||||
| class EventListener; | class EventListener; | ||||||
| class EventTarget; | class EventTarget; | ||||||
| class Frame; | class Frame; | ||||||
| class HTMLElement; | class HTMLElement; | ||||||
| class HTMLCanvasElement; | class HTMLCanvasElement; | ||||||
| class HtmlView; | class HtmlView; | ||||||
|  | class MouseEvent; | ||||||
| class Node; | class Node; | ||||||
| 
 | 
 | ||||||
| namespace Bindings { | namespace Bindings { | ||||||
| 
 | 
 | ||||||
| class CanvasRenderingContext2DWrapper; | class CanvasRenderingContext2DWrapper; | ||||||
| class DocumentWrapper; | class DocumentWrapper; | ||||||
|  | class EventWrapper; | ||||||
| class EventListenerWrapper; | class EventListenerWrapper; | ||||||
| class EventTargetWrapper; | class EventTargetWrapper; | ||||||
| class HTMLCanvasElementWrapper; | class HTMLCanvasElementWrapper; | ||||||
|  | class MouseEventWrapper; | ||||||
| class NodeWrapper; | class NodeWrapper; | ||||||
| class Wrappable; | class Wrappable; | ||||||
| class Wrapper; | class Wrapper; | ||||||
|  |  | ||||||
|  | @ -36,6 +36,7 @@ | ||||||
| #include <LibWeb/DOM/ElementFactory.h> | #include <LibWeb/DOM/ElementFactory.h> | ||||||
| #include <LibWeb/DOM/HTMLAnchorElement.h> | #include <LibWeb/DOM/HTMLAnchorElement.h> | ||||||
| #include <LibWeb/DOM/HTMLImageElement.h> | #include <LibWeb/DOM/HTMLImageElement.h> | ||||||
|  | #include <LibWeb/DOM/MouseEvent.h> | ||||||
| #include <LibWeb/DOM/Text.h> | #include <LibWeb/DOM/Text.h> | ||||||
| #include <LibWeb/Dump.h> | #include <LibWeb/Dump.h> | ||||||
| #include <LibWeb/Frame.h> | #include <LibWeb/Frame.h> | ||||||
|  | @ -184,7 +185,7 @@ void HtmlView::mousemove_event(GUI::MouseEvent& event) | ||||||
| #endif | #endif | ||||||
|                 is_hovering_link = true; |                 is_hovering_link = true; | ||||||
|             } |             } | ||||||
|             const_cast<Node*>(node)->dispatch_event("mousemove"); |             const_cast<Node*>(node)->dispatch_event(MouseEvent::create("mousemove", 2, 3)); | ||||||
|         } |         } | ||||||
|         if (m_in_mouse_selection) { |         if (m_in_mouse_selection) { | ||||||
|             layout_root()->selection().set_end({ result.layout_node, result.index_in_node }); |             layout_root()->selection().set_end({ result.layout_node, result.index_in_node }); | ||||||
|  | @ -235,7 +236,7 @@ void HtmlView::mousedown_event(GUI::MouseEvent& event) | ||||||
|                     m_in_mouse_selection = true; |                     m_in_mouse_selection = true; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             const_cast<Node*>(node)->dispatch_event("mousedown"); |             const_cast<Node*>(node)->dispatch_event(MouseEvent::create("mousedown", 2, 3)); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     if (hovered_node_changed) |     if (hovered_node_changed) | ||||||
|  | @ -251,7 +252,7 @@ void HtmlView::mouseup_event(GUI::MouseEvent& event) | ||||||
|     auto result = layout_root()->hit_test(to_content_position(event.position())); |     auto result = layout_root()->hit_test(to_content_position(event.position())); | ||||||
|     if (result.layout_node) { |     if (result.layout_node) { | ||||||
|         if (auto* node = result.layout_node->node()) |         if (auto* node = result.layout_node->node()) | ||||||
|             const_cast<Node*>(node)->dispatch_event("mouseup"); |             const_cast<Node*>(node)->dispatch_event(MouseEvent::create("mouseup", 2, 3)); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (event.button() == GUI::MouseButton::Left) { |     if (event.button() == GUI::MouseButton::Left) { | ||||||
|  |  | ||||||
|  | @ -1,9 +1,11 @@ | ||||||
| LIBWEB_OBJS = \
 | LIBWEB_OBJS = \
 | ||||||
|     Bindings/CanvasRenderingContext2DWrapper.o \
 |     Bindings/CanvasRenderingContext2DWrapper.o \
 | ||||||
|     Bindings/DocumentWrapper.o \
 |     Bindings/DocumentWrapper.o \
 | ||||||
|  |     Bindings/EventWrapper.o \
 | ||||||
|     Bindings/EventListenerWrapper.o \
 |     Bindings/EventListenerWrapper.o \
 | ||||||
|     Bindings/EventTargetWrapper.o \
 |     Bindings/EventTargetWrapper.o \
 | ||||||
|     Bindings/HTMLCanvasElementWrapper.o \
 |     Bindings/HTMLCanvasElementWrapper.o \
 | ||||||
|  |     Bindings/MouseEventWrapper.o \
 | ||||||
|     Bindings/NodeWrapper.o \
 |     Bindings/NodeWrapper.o \
 | ||||||
|     Bindings/Wrappable.o \
 |     Bindings/Wrappable.o \
 | ||||||
|     CSS/DefaultStyleSheetSource.o \
 |     CSS/DefaultStyleSheetSource.o \
 | ||||||
|  | @ -23,6 +25,7 @@ LIBWEB_OBJS = \ | ||||||
|     DOM/DocumentType.o \
 |     DOM/DocumentType.o \
 | ||||||
|     DOM/Element.o \
 |     DOM/Element.o \
 | ||||||
|     DOM/ElementFactory.o \
 |     DOM/ElementFactory.o \
 | ||||||
|  |     DOM/Event.o \
 | ||||||
|     DOM/EventListener.o \
 |     DOM/EventListener.o \
 | ||||||
|     DOM/EventTarget.o \
 |     DOM/EventTarget.o \
 | ||||||
|     DOM/HTMLAnchorElement.o \
 |     DOM/HTMLAnchorElement.o \
 | ||||||
|  | @ -43,6 +46,7 @@ LIBWEB_OBJS = \ | ||||||
|     DOM/HTMLScriptElement.o \
 |     DOM/HTMLScriptElement.o \
 | ||||||
|     DOM/HTMLStyleElement.o \
 |     DOM/HTMLStyleElement.o \
 | ||||||
|     DOM/HTMLTitleElement.o \
 |     DOM/HTMLTitleElement.o \
 | ||||||
|  |     DOM/MouseEvent.o \
 | ||||||
|     DOM/Node.o \
 |     DOM/Node.o \
 | ||||||
|     DOM/ParentNode.o \
 |     DOM/ParentNode.o \
 | ||||||
|     DOM/Text.o \
 |     DOM/Text.o \
 | ||||||
|  |  | ||||||
|  | @ -32,6 +32,7 @@ | ||||||
| #include <LibWeb/DOM/DocumentType.h> | #include <LibWeb/DOM/DocumentType.h> | ||||||
| #include <LibWeb/DOM/Element.h> | #include <LibWeb/DOM/Element.h> | ||||||
| #include <LibWeb/DOM/ElementFactory.h> | #include <LibWeb/DOM/ElementFactory.h> | ||||||
|  | #include <LibWeb/DOM/Event.h> | ||||||
| #include <LibWeb/DOM/Text.h> | #include <LibWeb/DOM/Text.h> | ||||||
| #include <LibWeb/Parser/HTMLParser.h> | #include <LibWeb/Parser/HTMLParser.h> | ||||||
| #include <ctype.h> | #include <ctype.h> | ||||||
|  | @ -378,7 +379,7 @@ RefPtr<Document> parse_html_document(const StringView& html, const URL& url) | ||||||
|     }; |     }; | ||||||
|     fire_insertion_callbacks(document); |     fire_insertion_callbacks(document); | ||||||
| 
 | 
 | ||||||
|     document->dispatch_event("DOMContentLoaded"); |     document->dispatch_event(Event::create("DOMContentLoaded")); | ||||||
| 
 | 
 | ||||||
|     return document; |     return document; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling