diff options
author | Linus Groh <mail@linusgroh.de> | 2021-04-04 00:14:39 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-04-04 00:37:54 +0200 |
commit | 340e1f4b2839e045b155f83f8a9b5a280035e1e4 (patch) | |
tree | 9cbbccdbf1faf79905d958e902d069fad79f67b5 | |
parent | e8739ddab76478b245b6c5c604988364a9191bd0 (diff) | |
download | serenity-340e1f4b2839e045b155f83f8a9b5a280035e1e4.zip |
LibWeb: Implement the Screen interface
https://drafts.csswg.org/cssom-view/#the-screen-interface
-rw-r--r-- | Userland/Libraries/LibWeb/Bindings/WindowObject.cpp | 10 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/Bindings/WindowObject.h | 1 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h | 3 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/CMakeLists.txt | 2 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/CSS/Screen.cpp | 45 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/CSS/Screen.h | 62 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/CSS/Screen.idl | 8 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/Window.cpp | 1 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/Window.h | 4 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/Forward.h | 2 |
10 files changed, 138 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObject.cpp b/Userland/Libraries/LibWeb/Bindings/WindowObject.cpp index 22f17862e6..6be2280f20 100644 --- a/Userland/Libraries/LibWeb/Bindings/WindowObject.cpp +++ b/Userland/Libraries/LibWeb/Bindings/WindowObject.cpp @@ -40,6 +40,7 @@ #include <LibWeb/Bindings/NavigatorObject.h> #include <LibWeb/Bindings/NodeWrapperFactory.h> #include <LibWeb/Bindings/PerformanceWrapper.h> +#include <LibWeb/Bindings/ScreenWrapper.h> #include <LibWeb/Bindings/WindowObject.h> #include <LibWeb/DOM/Document.h> #include <LibWeb/DOM/Event.h> @@ -67,6 +68,7 @@ void WindowObject::initialize_global_object() 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_property("screen", screen_getter, nullptr, JS::Attribute::Enumerable); define_native_property("innerWidth", inner_width_getter, nullptr, JS::Attribute::Enumerable); define_native_property("innerHeight", inner_height_getter, nullptr, JS::Attribute::Enumerable); define_native_function("alert", alert); @@ -371,6 +373,14 @@ JS_DEFINE_NATIVE_GETTER(WindowObject::performance_getter) return wrap(global_object, impl->performance()); } +JS_DEFINE_NATIVE_GETTER(WindowObject::screen_getter) +{ + auto* impl = impl_from(vm, global_object); + if (!impl) + return {}; + return wrap(global_object, impl->screen()); +} + JS_DEFINE_NATIVE_GETTER(WindowObject::event_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 94ffee1795..962b65fd68 100644 --- a/Userland/Libraries/LibWeb/Bindings/WindowObject.h +++ b/Userland/Libraries/LibWeb/Bindings/WindowObject.h @@ -82,6 +82,7 @@ private: JS_DECLARE_NATIVE_SETTER(document_setter); JS_DECLARE_NATIVE_GETTER(performance_getter); + JS_DECLARE_NATIVE_GETTER(screen_getter); JS_DECLARE_NATIVE_GETTER(event_getter); diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h index de560b6b26..f5b6b78254 100644 --- a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h +++ b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h @@ -217,6 +217,8 @@ #include <LibWeb/Bindings/SVGPathElementPrototype.h> #include <LibWeb/Bindings/SVGSVGElementConstructor.h> #include <LibWeb/Bindings/SVGSVGElementPrototype.h> +#include <LibWeb/Bindings/ScreenConstructor.h> +#include <LibWeb/Bindings/ScreenPrototype.h> #include <LibWeb/Bindings/ShadowRootConstructor.h> #include <LibWeb/Bindings/ShadowRootPrototype.h> #include <LibWeb/Bindings/StyleSheetConstructor.h> @@ -336,6 +338,7 @@ ADD_WINDOW_OBJECT_INTERFACE(Performance) \ ADD_WINDOW_OBJECT_INTERFACE(PerformanceTiming) \ ADD_WINDOW_OBJECT_INTERFACE(ProgressEvent) \ + ADD_WINDOW_OBJECT_INTERFACE(Screen) \ ADD_WINDOW_OBJECT_INTERFACE(ShadowRoot) \ ADD_WINDOW_OBJECT_INTERFACE(StyleSheet) \ ADD_WINDOW_OBJECT_INTERFACE(StyleSheetList) \ diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 490c996821..07107de5b7 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -26,6 +26,7 @@ set(SOURCES CSS/PropertyID.cpp CSS/PropertyID.h CSS/QuirksModeStyleSheetSource.cpp + CSS/Screen.cpp CSS/Selector.cpp CSS/SelectorEngine.cpp CSS/StyleInvalidator.cpp @@ -290,6 +291,7 @@ endfunction() libweb_js_wrapper(CSS/CSSStyleDeclaration) libweb_js_wrapper(CSS/CSSStyleSheet) +libweb_js_wrapper(CSS/Screen) libweb_js_wrapper(CSS/StyleSheet) libweb_js_wrapper(CSS/StyleSheetList) libweb_js_wrapper(DOM/CharacterData) diff --git a/Userland/Libraries/LibWeb/CSS/Screen.cpp b/Userland/Libraries/LibWeb/CSS/Screen.cpp new file mode 100644 index 0000000000..d895867774 --- /dev/null +++ b/Userland/Libraries/LibWeb/CSS/Screen.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2021, Linus Groh <mail@linusgroh.de> + * 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 <LibGfx/Rect.h> +#include <LibWeb/CSS/Screen.h> +#include <LibWeb/DOM/Document.h> +#include <LibWeb/DOM/Window.h> +#include <LibWeb/Page/Page.h> + +namespace Web::CSS { + +Screen::Screen(DOM::Window& window) + : m_window(window) +{ +} + +Gfx::IntRect Screen::screen_rect() const +{ + return m_window.document().page()->screen_rect(); +} + +} diff --git a/Userland/Libraries/LibWeb/CSS/Screen.h b/Userland/Libraries/LibWeb/CSS/Screen.h new file mode 100644 index 0000000000..36b8645140 --- /dev/null +++ b/Userland/Libraries/LibWeb/CSS/Screen.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2021, Linus Groh <mail@linusgroh.de> + * 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 <LibGfx/Rect.h> +#include <LibWeb/Bindings/Wrappable.h> +#include <LibWeb/Forward.h> + +namespace Web::CSS { + +class Screen final + : public RefCounted<Screen> + , public Bindings::Wrappable { + +public: + using WrapperType = Bindings::ScreenWrapper; + + static NonnullRefPtr<Screen> create(DOM::Window& window) + { + return adopt(*new Screen(window)); + } + + i32 width() const { return screen_rect().width(); } + i32 height() const { return screen_rect().height(); } + i32 avail_width() const { return screen_rect().width(); } + i32 avail_height() const { return screen_rect().height(); } + u32 color_depth() const { return 24; } + u32 pixel_depth() const { return 24; } + +private: + explicit Screen(DOM::Window&); + + Gfx::IntRect screen_rect() const; + + DOM::Window& m_window; +}; + +} diff --git a/Userland/Libraries/LibWeb/CSS/Screen.idl b/Userland/Libraries/LibWeb/CSS/Screen.idl new file mode 100644 index 0000000000..075ef57e32 --- /dev/null +++ b/Userland/Libraries/LibWeb/CSS/Screen.idl @@ -0,0 +1,8 @@ +interface Screen { + readonly attribute long availWidth; + readonly attribute long availHeight; + readonly attribute long width; + readonly attribute long height; + readonly attribute unsigned long colorDepth; + readonly attribute unsigned long pixelDepth; +}; diff --git a/Userland/Libraries/LibWeb/DOM/Window.cpp b/Userland/Libraries/LibWeb/DOM/Window.cpp index aa76a90c81..014c49ec0a 100644 --- a/Userland/Libraries/LibWeb/DOM/Window.cpp +++ b/Userland/Libraries/LibWeb/DOM/Window.cpp @@ -47,6 +47,7 @@ Window::Window(Document& document) : EventTarget(static_cast<Bindings::ScriptExecutionContext&>(document)) , m_document(document) , m_performance(make<HighResolutionTime::Performance>(*this)) + , m_screen(CSS::Screen::create(*this)) { } diff --git a/Userland/Libraries/LibWeb/DOM/Window.h b/Userland/Libraries/LibWeb/DOM/Window.h index 25d7138438..b7cd4fa147 100644 --- a/Userland/Libraries/LibWeb/DOM/Window.h +++ b/Userland/Libraries/LibWeb/DOM/Window.h @@ -32,6 +32,7 @@ #include <AK/RefPtr.h> #include <LibWeb/Bindings/WindowObject.h> #include <LibWeb/Bindings/Wrappable.h> +#include <LibWeb/CSS/Screen.h> #include <LibWeb/DOM/Event.h> #include <LibWeb/DOM/EventTarget.h> @@ -83,6 +84,8 @@ public: HighResolutionTime::Performance& performance() { return *m_performance; } + CSS::Screen& screen() { return *m_screen; } + const Event* current_event() const { return m_current_event; } void set_current_event(Event* event) { m_current_event = event; } @@ -96,6 +99,7 @@ private: HashMap<int, NonnullRefPtr<Timer>> m_timers; NonnullOwnPtr<HighResolutionTime::Performance> m_performance; + NonnullRefPtr<CSS::Screen> m_screen; RefPtr<Event> m_current_event; }; diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 2c66bff35a..a1f8e19484 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -35,6 +35,7 @@ class CSSStyleRule; class CSSStyleSheet; class ElementInlineCSSStyleDeclaration; class Length; +class Screen; class Selector; class StyleProperties; class StyleResolver; @@ -297,6 +298,7 @@ class NodeWrapper; class PerformanceTimingWrapper; class PerformanceWrapper; class ProgressEventWrapper; +class ScreenWrapper; class ScriptExecutionContext; class SubmitEventWrapper; class SVGElementWrapper; |