diff --git a/Libraries/LibWeb/Bindings/WindowObject.cpp b/Libraries/LibWeb/Bindings/WindowObject.cpp index 714ef9be4e..26b6ba1311 100644 --- a/Libraries/LibWeb/Bindings/WindowObject.cpp +++ b/Libraries/LibWeb/Bindings/WindowObject.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -62,6 +63,7 @@ void WindowObject::initialize() define_property("frames", this, JS::Attribute::Enumerable); define_property("self", this, JS::Attribute::Enumerable); define_native_property("document", document_getter, document_setter, JS::Attribute::Enumerable); + define_native_property("performance", performance_getter, nullptr, JS::Attribute::Enumerable); define_native_function("alert", alert); define_native_function("confirm", confirm); define_native_function("setInterval", set_interval, 1); @@ -325,5 +327,13 @@ JS_DEFINE_NATIVE_SETTER(WindowObject::document_setter) UNUSED_PARAM(value); } +JS_DEFINE_NATIVE_GETTER(WindowObject::performance_getter) +{ + auto* impl = impl_from(vm, global_object); + if (!impl) + return {}; + return wrap(global_object, impl->performance()); +} + } } diff --git a/Libraries/LibWeb/Bindings/WindowObject.h b/Libraries/LibWeb/Bindings/WindowObject.h index 7feee05818..bddabf3334 100644 --- a/Libraries/LibWeb/Bindings/WindowObject.h +++ b/Libraries/LibWeb/Bindings/WindowObject.h @@ -56,6 +56,8 @@ private: JS_DECLARE_NATIVE_GETTER(document_getter); JS_DECLARE_NATIVE_SETTER(document_setter); + JS_DECLARE_NATIVE_GETTER(performance_getter); + JS_DECLARE_NATIVE_FUNCTION(alert); JS_DECLARE_NATIVE_FUNCTION(confirm); JS_DECLARE_NATIVE_FUNCTION(set_interval); diff --git a/Libraries/LibWeb/CMakeLists.txt b/Libraries/LibWeb/CMakeLists.txt index 2e1b395e31..27fc076af6 100644 --- a/Libraries/LibWeb/CMakeLists.txt +++ b/Libraries/LibWeb/CMakeLists.txt @@ -129,6 +129,7 @@ set(SOURCES HTML/Parser/HTMLTokenizer.cpp HTML/Parser/ListOfActiveFormattingElements.cpp HTML/Parser/StackOfOpenElements.cpp + HighResolutionTime/Performance.cpp InProcessWebView.cpp Layout/BoxModelMetrics.cpp Layout/LayoutBlock.cpp @@ -298,6 +299,7 @@ libweb_js_wrapper(HTML/HTMLUListElement) libweb_js_wrapper(HTML/HTMLUnknownElement) libweb_js_wrapper(HTML/HTMLVideoElement) libweb_js_wrapper(HTML/ImageData) +libweb_js_wrapper(HighResolutionTime/Performance) libweb_js_wrapper(UIEvents/MouseEvent) libweb_js_wrapper(UIEvents/UIEvent) diff --git a/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp b/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp index d224249f81..287e1488e5 100644 --- a/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp +++ b/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp @@ -290,7 +290,7 @@ int main(int argc, char** argv) return 1; } - if (namespace_.is_one_of("DOM", "HTML", "UIEvents")) { + if (namespace_.is_one_of("DOM", "HTML", "UIEvents", "HighResolutionTime")) { StringBuilder builder; builder.append(namespace_); builder.append("::"); @@ -379,6 +379,8 @@ static void generate_header(const IDL::Interface& interface) out() << "#include "; out() << "#elif __has_include()"; out() << "#include "; + out() << "#elif __has_include()"; + out() << "#include "; out() << "#endif"; if (wrapper_base_class != "Wrapper") diff --git a/Libraries/LibWeb/DOM/Window.cpp b/Libraries/LibWeb/DOM/Window.cpp index 1bfce5ad6a..05868bcf86 100644 --- a/Libraries/LibWeb/DOM/Window.cpp +++ b/Libraries/LibWeb/DOM/Window.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -42,6 +43,7 @@ NonnullRefPtr Window::create_with_document(Document& document) Window::Window(Document& document) : m_document(document) + , m_performance(make(*this)) { } diff --git a/Libraries/LibWeb/DOM/Window.h b/Libraries/LibWeb/DOM/Window.h index ed70bed472..9844141286 100644 --- a/Libraries/LibWeb/DOM/Window.h +++ b/Libraries/LibWeb/DOM/Window.h @@ -64,6 +64,8 @@ public: i32 allocate_timer_id(Badge); void timer_did_fire(Badge, Timer&); + HighResolutionTime::Performance& performance() { return *m_performance; } + private: explicit Window(Document&); @@ -72,6 +74,8 @@ private: IDAllocator m_timer_id_allocator; HashMap> m_timers; + + NonnullOwnPtr m_performance; }; } diff --git a/Libraries/LibWeb/Forward.h b/Libraries/LibWeb/Forward.h index bba27d94c0..a8f7b2ed8a 100644 --- a/Libraries/LibWeb/Forward.h +++ b/Libraries/LibWeb/Forward.h @@ -132,6 +132,10 @@ class HTMLVideoElement; class ImageData; } +namespace Web::HighResolutionTime { +class Performance; +} + namespace Web { class EventHandler; class Frame; @@ -242,6 +246,7 @@ class ImageDataWrapper; class LocationObject; class MouseEventWrapper; class NodeWrapper; +class PerformanceWrapper; class ScriptExecutionContext; class TextWrapper; class UIEventWrapper; diff --git a/Libraries/LibWeb/HighResolutionTime/Performance.cpp b/Libraries/LibWeb/HighResolutionTime/Performance.cpp new file mode 100644 index 0000000000..0567260a63 --- /dev/null +++ b/Libraries/LibWeb/HighResolutionTime/Performance.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2020, Andreas Kling + * 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 +#include +#include +#include +#include +#include + +namespace Web::HighResolutionTime { + +Performance::Performance(DOM::Window& window) + : DOM::EventTarget(static_cast(window.document())) + , m_window(window) +{ + m_timer.start(); +} + +Performance::~Performance() +{ +} + +void Performance::ref_event_target() +{ + m_window.ref(); +} + +void Performance::unref_event_target() +{ + m_window.unref(); +} + +void Performance::dispatch_event(NonnullRefPtr event) +{ + DOM::EventDispatcher::dispatch(*this, event); +} + +Bindings::EventTargetWrapper* Performance::create_wrapper(JS::GlobalObject& global_object) +{ + return Bindings::wrap(global_object, *this); +} + +} diff --git a/Libraries/LibWeb/HighResolutionTime/Performance.h b/Libraries/LibWeb/HighResolutionTime/Performance.h new file mode 100644 index 0000000000..588652400d --- /dev/null +++ b/Libraries/LibWeb/HighResolutionTime/Performance.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020, Andreas Kling + * 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 +#include +#include + +namespace Web::HighResolutionTime { + +class Performance final + : public DOM::EventTarget + , public Bindings::Wrappable { +public: + using WrapperType = Bindings::PerformanceWrapper; + + explicit Performance(DOM::Window&); + ~Performance(); + + double now() const { return m_timer.elapsed(); } + + virtual void ref_event_target() override; + virtual void unref_event_target() override; + + virtual void dispatch_event(NonnullRefPtr) override; + virtual Bindings::EventTargetWrapper* create_wrapper(JS::GlobalObject&) override; + +private: + DOM::Window& m_window; + Core::ElapsedTimer m_timer; +}; + +} diff --git a/Libraries/LibWeb/HighResolutionTime/Performance.idl b/Libraries/LibWeb/HighResolutionTime/Performance.idl new file mode 100644 index 0000000000..33a0656167 --- /dev/null +++ b/Libraries/LibWeb/HighResolutionTime/Performance.idl @@ -0,0 +1,3 @@ +interface Performance : EventTarget { + double now(); +}