From 340e1f4b2839e045b155f83f8a9b5a280035e1e4 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Sun, 4 Apr 2021 00:14:39 +0200 Subject: LibWeb: Implement the Screen interface https://drafts.csswg.org/cssom-view/#the-screen-interface --- .../Libraries/LibWeb/Bindings/WindowObject.cpp | 10 ++++ Userland/Libraries/LibWeb/Bindings/WindowObject.h | 1 + .../Libraries/LibWeb/Bindings/WindowObjectHelper.h | 3 ++ Userland/Libraries/LibWeb/CMakeLists.txt | 2 + Userland/Libraries/LibWeb/CSS/Screen.cpp | 45 ++++++++++++++++ Userland/Libraries/LibWeb/CSS/Screen.h | 62 ++++++++++++++++++++++ Userland/Libraries/LibWeb/CSS/Screen.idl | 8 +++ Userland/Libraries/LibWeb/DOM/Window.cpp | 1 + Userland/Libraries/LibWeb/DOM/Window.h | 4 ++ Userland/Libraries/LibWeb/Forward.h | 2 + 10 files changed, 138 insertions(+) create mode 100644 Userland/Libraries/LibWeb/CSS/Screen.cpp create mode 100644 Userland/Libraries/LibWeb/CSS/Screen.h create mode 100644 Userland/Libraries/LibWeb/CSS/Screen.idl 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 #include #include +#include #include #include #include @@ -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 #include #include +#include +#include #include #include #include @@ -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 + * 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 + +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 + * 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::CSS { + +class Screen final + : public RefCounted + , public Bindings::Wrappable { + +public: + using WrapperType = Bindings::ScreenWrapper; + + static NonnullRefPtr 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(document)) , m_document(document) , m_performance(make(*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 #include #include +#include #include #include @@ -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> m_timers; NonnullOwnPtr m_performance; + NonnullRefPtr m_screen; RefPtr 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; -- cgit v1.2.3