From fd51b02f9d2b400f73887b88ea81099513cded87 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Sun, 3 Oct 2021 19:26:17 +0100 Subject: [PATCH] LibWeb: Implement Window::query_media_feature() This method provides the needed information to evaluate media queries. Every feature in Media Queries Level 4 is present, either as code or as a FIXME: https://www.w3.org/TR/mediaqueries-4/#media-descriptor-table There's a draft Level 5 which I have ignored for now. Some are unimplemented for now since we do not have access to the requested information. Some require StyleValue types that we do not yet support. Many are hard-coded for now since we do not (and may never) support monochrome or text-only displays for Browser. --- Userland/Libraries/LibWeb/DOM/Window.cpp | 44 ++++++++++++++++++++++++ Userland/Libraries/LibWeb/DOM/Window.h | 1 + 2 files changed, 45 insertions(+) diff --git a/Userland/Libraries/LibWeb/DOM/Window.cpp b/Userland/Libraries/LibWeb/DOM/Window.cpp index 79960998cf..0c48fb471f 100644 --- a/Userland/Libraries/LibWeb/DOM/Window.cpp +++ b/Userland/Libraries/LibWeb/DOM/Window.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2020-2021, Andreas Kling + * Copyright (c) 2021, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ @@ -287,6 +288,49 @@ NonnullRefPtr Window::match_media(String media) return CSS::MediaQueryList::create(associated_document(), parse_media_query_list(CSS::ParsingContext(associated_document()), media)); } +RefPtr Window::query_media_feature(FlyString const& name) const +{ + // FIXME: Many of these should be dependent on the hardware + + if (name.equals_ignoring_case("any-hover"sv)) + return CSS::IdentifierStyleValue::create(CSS::ValueID::Hover); + if (name.equals_ignoring_case("any-pointer"sv)) + return CSS::IdentifierStyleValue::create(CSS::ValueID::Fine); + // FIXME: aspect-ratio + if (name.equals_ignoring_case("color"sv)) + return CSS::NumericStyleValue::create(32); + if (name.equals_ignoring_case("color-gamut"sv)) + return CSS::IdentifierStyleValue::create(CSS::ValueID::Srgb); + if (name.equals_ignoring_case("color-index"sv)) + return CSS::NumericStyleValue::create(0); + // FIXME: device-aspect-ratio + // FIXME: device-height + // FIXME: device-width + if (name.equals_ignoring_case("grid"sv)) + return CSS::NumericStyleValue::create(0); + if (name.equals_ignoring_case("height"sv)) + return CSS::LengthStyleValue::create(CSS::Length::make_px(inner_height())); + if (name.equals_ignoring_case("hover"sv)) + return CSS::IdentifierStyleValue::create(CSS::ValueID::Hover); + if (name.equals_ignoring_case("monochrome"sv)) + return CSS::NumericStyleValue::create(0); + if (name.equals_ignoring_case("hover"sv)) + return CSS::IdentifierStyleValue::create(inner_height() >= inner_width() ? CSS::ValueID::Portrait : CSS::ValueID::Landscape); + if (name.equals_ignoring_case("overflow-block"sv)) + return CSS::IdentifierStyleValue::create(CSS::ValueID::Scroll); + // FIXME: overflow-inline + if (name.equals_ignoring_case("pointer"sv)) + return CSS::IdentifierStyleValue::create(CSS::ValueID::Fine); + // FIXME: resolution + if (name.equals_ignoring_case("scan"sv)) + return CSS::IdentifierStyleValue::create(CSS::ValueID::Progressive); + if (name.equals_ignoring_case("update"sv)) + return CSS::IdentifierStyleValue::create(CSS::ValueID::Fast); + if (name.equals_ignoring_case("width"sv)) + return CSS::LengthStyleValue::create(CSS::Length::make_px(inner_width())); + return {}; +} + // https://www.w3.org/TR/cssom-view/#dom-window-scrollx float Window::scroll_x() const { diff --git a/Userland/Libraries/LibWeb/DOM/Window.h b/Userland/Libraries/LibWeb/DOM/Window.h index 3ee7d723c4..f521879cab 100644 --- a/Userland/Libraries/LibWeb/DOM/Window.h +++ b/Userland/Libraries/LibWeb/DOM/Window.h @@ -84,6 +84,7 @@ public: NonnullRefPtr get_computed_style(DOM::Element&) const; NonnullRefPtr match_media(String); + RefPtr query_media_feature(FlyString const&) const; float scroll_x() const; float scroll_y() const;