From 099b77d60f6c30b4d533872fda29ea6d660ed358 Mon Sep 17 00:00:00 2001 From: Luke Warlow Date: Thu, 13 Jun 2024 16:15:59 +0200 Subject: [PATCH] LibWeb: Add motion preference This adds a motion preference to the browser UI similar to the existing ones for color scheme and contrast. Both AppKit UI and Qt UI has this new preference. The auto value is currently the same as NoPreference, follow-ups can address wiring that up to the actual preference for the OS. --- .../AppKit/Application/ApplicationDelegate.h | 2 + .../AppKit/Application/ApplicationDelegate.mm | 56 +++++++++++++++++++ Ladybird/AppKit/UI/LadybirdWebView.h | 2 + Ladybird/AppKit/UI/LadybirdWebView.mm | 7 ++- Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp | 13 ++++- Ladybird/AppKit/UI/LadybirdWebViewBridge.h | 7 ++- Ladybird/Qt/BrowserWindow.cpp | 46 +++++++++++++++ Ladybird/Qt/BrowserWindow.h | 3 + .../Userland/Libraries/LibWeb/CSS/BUILD.gn | 1 + Userland/Libraries/LibWeb/CMakeLists.txt | 1 + .../Libraries/LibWeb/CSS/PreferredMotion.cpp | 33 +++++++++++ .../Libraries/LibWeb/CSS/PreferredMotion.h | 22 ++++++++ Userland/Libraries/LibWeb/HTML/Window.cpp | 12 +++- Userland/Libraries/LibWeb/Page/Page.cpp | 5 ++ Userland/Libraries/LibWeb/Page/Page.h | 3 + .../LibWeb/SVG/SVGDecodedImageData.h | 1 + .../LibWebView/ViewImplementation.cpp | 5 ++ .../Libraries/LibWebView/ViewImplementation.h | 1 + .../WebContent/ConnectionFromClient.cpp | 6 ++ .../WebContent/ConnectionFromClient.h | 2 + Userland/Services/WebContent/PageClient.cpp | 7 +++ Userland/Services/WebContent/PageClient.h | 3 + .../Services/WebContent/WebContentServer.ipc | 2 + Userland/Services/WebWorker/PageHost.cpp | 5 ++ Userland/Services/WebWorker/PageHost.h | 1 + 25 files changed, 238 insertions(+), 8 deletions(-) create mode 100644 Userland/Libraries/LibWeb/CSS/PreferredMotion.cpp create mode 100644 Userland/Libraries/LibWeb/CSS/PreferredMotion.h diff --git a/Ladybird/AppKit/Application/ApplicationDelegate.h b/Ladybird/AppKit/Application/ApplicationDelegate.h index 95449b7b69f..65dabeacd9d 100644 --- a/Ladybird/AppKit/Application/ApplicationDelegate.h +++ b/Ladybird/AppKit/Application/ApplicationDelegate.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -48,6 +49,7 @@ - (Optional const&)webdriverContentIPCPath; - (Web::CSS::PreferredColorScheme)preferredColorScheme; - (Web::CSS::PreferredContrast)preferredContrast; +- (Web::CSS::PreferredMotion)preferredMotion; - (WebView::SearchEngine const&)searchEngine; @end diff --git a/Ladybird/AppKit/Application/ApplicationDelegate.mm b/Ladybird/AppKit/Application/ApplicationDelegate.mm index 22cd91cda50..1193fcc2718 100644 --- a/Ladybird/AppKit/Application/ApplicationDelegate.mm +++ b/Ladybird/AppKit/Application/ApplicationDelegate.mm @@ -31,6 +31,7 @@ Web::CSS::PreferredColorScheme m_preferred_color_scheme; Web::CSS::PreferredContrast m_preferred_contrast; + Web::CSS::PreferredMotion m_preferred_motion; WebView::SearchEngine m_search_engine; } @@ -90,6 +91,7 @@ m_preferred_color_scheme = Web::CSS::PreferredColorScheme::Auto; m_preferred_contrast = Web::CSS::PreferredContrast::Auto; + m_preferred_motion = Web::CSS::PreferredMotion::Auto; m_search_engine = WebView::default_search_engine(); // Reduce the tooltip delay, as the default delay feels quite long. @@ -168,6 +170,11 @@ return m_preferred_contrast; } +- (Web::CSS::PreferredMotion)preferredMotion +{ + return m_preferred_motion; +} + - (WebView::SearchEngine const&)searchEngine { return m_search_engine; @@ -297,6 +304,32 @@ } } +- (void)setAutoPreferredMotion:(id)sender +{ + m_preferred_motion = Web::CSS::PreferredMotion::Auto; + [self broadcastPreferredMotionUpdate]; +} + +- (void)setNoPreferencePreferredMotion:(id)sender +{ + m_preferred_motion = Web::CSS::PreferredMotion::NoPreference; + [self broadcastPreferredMotionUpdate]; +} + +- (void)setReducePreferredMotion:(id)sender +{ + m_preferred_motion = Web::CSS::PreferredMotion::Reduce; + [self broadcastPreferredMotionUpdate]; +} + +- (void)broadcastPreferredMotionUpdate +{ + for (TabController* controller in self.managed_tabs) { + auto* tab = (Tab*)[controller window]; + [[tab web_view] setPreferredMotion:m_preferred_motion]; + } +} + - (void)setSearchEngine:(id)sender { auto* item = (NSMenuItem*)sender; @@ -452,6 +485,22 @@ keyEquivalent:@""]; [contrast_menu_item setSubmenu:contrast_menu]; + auto* motion_menu = [[NSMenu alloc] init]; + [motion_menu addItem:[[NSMenuItem alloc] initWithTitle:@"Auto" + action:@selector(setAutoPreferredMotion:) + keyEquivalent:@""]]; + [motion_menu addItem:[[NSMenuItem alloc] initWithTitle:@"No Preference" + action:@selector(setNoPreferencePreferredMotion:) + keyEquivalent:@""]]; + [motion_menu addItem:[[NSMenuItem alloc] initWithTitle:@"Reduce" + action:@selector(setReducePreferredMotion:) + keyEquivalent:@""]]; + + auto* motion_menu_item = [[NSMenuItem alloc] initWithTitle:@"Motion" + action:nil + keyEquivalent:@""]; + [motion_menu_item setSubmenu:motion_menu]; + auto* zoom_menu = [[NSMenu alloc] init]; [zoom_menu addItem:[[NSMenuItem alloc] initWithTitle:@"Zoom In" action:@selector(zoomIn:) @@ -470,6 +519,7 @@ [submenu addItem:color_scheme_menu_item]; [submenu addItem:contrast_menu_item]; + [submenu addItem:motion_menu_item]; [submenu addItem:zoom_menu_item]; [submenu addItem:[NSMenuItem separatorItem]]; @@ -695,6 +745,12 @@ [item setState:(m_preferred_contrast == Web::CSS::PreferredContrast::More) ? NSControlStateValueOn : NSControlStateValueOff]; } else if ([item action] == @selector(setNoPreferencePreferredContrast:)) { [item setState:(m_preferred_contrast == Web::CSS::PreferredContrast::NoPreference) ? NSControlStateValueOn : NSControlStateValueOff]; + } else if ([item action] == @selector(setAutoPreferredMotion:)) { + [item setState:(m_preferred_motion == Web::CSS::PreferredMotion::Auto) ? NSControlStateValueOn : NSControlStateValueOff]; + } else if ([item action] == @selector(setNoPreferencePreferredMotion:)) { + [item setState:(m_preferred_motion == Web::CSS::PreferredMotion::NoPreference) ? NSControlStateValueOn : NSControlStateValueOff]; + } else if ([item action] == @selector(setReducePreferredMotion:)) { + [item setState:(m_preferred_motion == Web::CSS::PreferredMotion::Reduce) ? NSControlStateValueOn : NSControlStateValueOff]; } else if ([item action] == @selector(setSearchEngine:)) { auto title = Ladybird::ns_string_to_string([item title]); [item setState:(m_search_engine.name == title) ? NSControlStateValueOn : NSControlStateValueOff]; diff --git a/Ladybird/AppKit/UI/LadybirdWebView.h b/Ladybird/AppKit/UI/LadybirdWebView.h index 58f6f2bd628..6800e2ea167 100644 --- a/Ladybird/AppKit/UI/LadybirdWebView.h +++ b/Ladybird/AppKit/UI/LadybirdWebView.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -64,6 +65,7 @@ - (void)setPreferredColorScheme:(Web::CSS::PreferredColorScheme)color_scheme; - (void)setPreferredContrast:(Web::CSS::PreferredContrast)contrast; +- (void)setPreferredMotion:(Web::CSS::PreferredMotion)motion; - (void)findInPage:(NSString*)query caseSensitivity:(CaseSensitivity)case_sensitivity; diff --git a/Ladybird/AppKit/UI/LadybirdWebView.mm b/Ladybird/AppKit/UI/LadybirdWebView.mm index da870a3059b..a9752f28081 100644 --- a/Ladybird/AppKit/UI/LadybirdWebView.mm +++ b/Ladybird/AppKit/UI/LadybirdWebView.mm @@ -104,7 +104,7 @@ struct HideCursor { // This returns device pixel ratio of the screen the window is opened in auto device_pixel_ratio = [[NSScreen mainScreen] backingScaleFactor]; - m_web_view_bridge = MUST(Ladybird::WebViewBridge::create(move(screen_rects), device_pixel_ratio, [delegate webContentOptions], [delegate webdriverContentIPCPath], [delegate preferredColorScheme], [delegate preferredContrast])); + m_web_view_bridge = MUST(Ladybird::WebViewBridge::create(move(screen_rects), device_pixel_ratio, [delegate webContentOptions], [delegate webdriverContentIPCPath], [delegate preferredColorScheme], [delegate preferredContrast], [delegate preferredMotion])); [self setWebViewCallbacks]; m_web_view_bridge->initialize_client(); @@ -226,6 +226,11 @@ struct HideCursor { m_web_view_bridge->set_preferred_contrast(contrast); } +- (void)setPreferredMotion:(Web::CSS::PreferredMotion)motion +{ + m_web_view_bridge->set_preferred_motion(motion); +} + - (void)debugRequest:(ByteString const&)request argument:(ByteString const&)argument { m_web_view_bridge->debug_request(request, argument); diff --git a/Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp b/Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp index b34c3ecb31f..5f7f874df0f 100644 --- a/Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp +++ b/Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp @@ -23,17 +23,18 @@ static T scale_for_device(T size, float device_pixel_ratio) return size.template to_type().scaled(device_pixel_ratio).template to_type(); } -ErrorOr> WebViewBridge::create(Vector screen_rects, float device_pixel_ratio, WebContentOptions const& web_content_options, Optional webdriver_content_ipc_path, Web::CSS::PreferredColorScheme preferred_color_scheme, Web::CSS::PreferredContrast preferred_contrast) +ErrorOr> WebViewBridge::create(Vector screen_rects, float device_pixel_ratio, WebContentOptions const& web_content_options, Optional webdriver_content_ipc_path, Web::CSS::PreferredColorScheme preferred_color_scheme, Web::CSS::PreferredContrast preferred_contrast, Web::CSS::PreferredMotion preferred_motion) { - return adopt_nonnull_own_or_enomem(new (nothrow) WebViewBridge(move(screen_rects), device_pixel_ratio, web_content_options, move(webdriver_content_ipc_path), preferred_color_scheme, preferred_contrast)); + return adopt_nonnull_own_or_enomem(new (nothrow) WebViewBridge(move(screen_rects), device_pixel_ratio, web_content_options, move(webdriver_content_ipc_path), preferred_color_scheme, preferred_contrast, preferred_motion)); } -WebViewBridge::WebViewBridge(Vector screen_rects, float device_pixel_ratio, WebContentOptions const& web_content_options, Optional webdriver_content_ipc_path, Web::CSS::PreferredColorScheme preferred_color_scheme, Web::CSS::PreferredContrast preferred_contrast) +WebViewBridge::WebViewBridge(Vector screen_rects, float device_pixel_ratio, WebContentOptions const& web_content_options, Optional webdriver_content_ipc_path, Web::CSS::PreferredColorScheme preferred_color_scheme, Web::CSS::PreferredContrast preferred_contrast, Web::CSS::PreferredMotion preferred_motion) : m_screen_rects(move(screen_rects)) , m_web_content_options(web_content_options) , m_webdriver_content_ipc_path(move(webdriver_content_ipc_path)) , m_preferred_color_scheme(preferred_color_scheme) , m_preferred_contrast(preferred_contrast) + , m_preferred_motion(preferred_motion) { m_device_pixel_ratio = device_pixel_ratio; } @@ -81,6 +82,12 @@ void WebViewBridge::set_preferred_contrast(Web::CSS::PreferredContrast contrast) client().async_set_preferred_contrast(m_client_state.page_index, contrast); } +void WebViewBridge::set_preferred_motion(Web::CSS::PreferredMotion motion) +{ + m_preferred_motion = motion; + client().async_set_preferred_motion(m_client_state.page_index, motion); +} + void WebViewBridge::enqueue_input_event(Web::MouseEvent event) { event.position = to_content_position(event.position.to_type()).to_type(); diff --git a/Ladybird/AppKit/UI/LadybirdWebViewBridge.h b/Ladybird/AppKit/UI/LadybirdWebViewBridge.h index 6c4db2c4f84..fc33fb2eef7 100644 --- a/Ladybird/AppKit/UI/LadybirdWebViewBridge.h +++ b/Ladybird/AppKit/UI/LadybirdWebViewBridge.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -21,7 +22,7 @@ namespace Ladybird { class WebViewBridge final : public WebView::ViewImplementation { public: - static ErrorOr> create(Vector screen_rects, float device_pixel_ratio, WebContentOptions const&, Optional webdriver_content_ipc_path, Web::CSS::PreferredColorScheme, Web::CSS::PreferredContrast); + static ErrorOr> create(Vector screen_rects, float device_pixel_ratio, WebContentOptions const&, Optional webdriver_content_ipc_path, Web::CSS::PreferredColorScheme, Web::CSS::PreferredContrast, Web::CSS::PreferredMotion); virtual ~WebViewBridge() override; virtual void initialize_client(CreateNewClient = CreateNewClient::Yes) override; @@ -43,6 +44,7 @@ public: void update_palette(); void set_preferred_color_scheme(Web::CSS::PreferredColorScheme); void set_preferred_contrast(Web::CSS::PreferredContrast); + void set_preferred_motion(Web::CSS::PreferredMotion); void enqueue_input_event(Web::MouseEvent); void enqueue_input_event(Web::KeyEvent); @@ -57,7 +59,7 @@ public: Function on_zoom_level_changed; private: - WebViewBridge(Vector screen_rects, float device_pixel_ratio, WebContentOptions const&, Optional webdriver_content_ipc_path, Web::CSS::PreferredColorScheme, Web::CSS::PreferredContrast); + WebViewBridge(Vector screen_rects, float device_pixel_ratio, WebContentOptions const&, Optional webdriver_content_ipc_path, Web::CSS::PreferredColorScheme, Web::CSS::PreferredContrast, Web::CSS::PreferredMotion); virtual void update_zoom() override; virtual Web::DevicePixelSize viewport_size() const override; @@ -72,6 +74,7 @@ private: Web::CSS::PreferredColorScheme m_preferred_color_scheme { Web::CSS::PreferredColorScheme::Auto }; Web::CSS::PreferredContrast m_preferred_contrast { Web::CSS::PreferredContrast::Auto }; + Web::CSS::PreferredMotion m_preferred_motion { Web::CSS::PreferredMotion::Auto }; }; } diff --git a/Ladybird/Qt/BrowserWindow.cpp b/Ladybird/Qt/BrowserWindow.cpp index 66e8421f8c1..5ceddf04a0e 100644 --- a/Ladybird/Qt/BrowserWindow.cpp +++ b/Ladybird/Qt/BrowserWindow.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -278,6 +279,30 @@ BrowserWindow::BrowserWindow(Vector const& initial_urls, WebView::Cook auto_contrast->setChecked(true); + auto* motion_menu = view_menu->addMenu("&Motion"); + + auto* motion_group = new QActionGroup(this); + + auto* auto_motion = new QAction("&Auto", this); + auto_motion->setCheckable(true); + motion_group->addAction(auto_motion); + motion_menu->addAction(auto_motion); + QObject::connect(auto_motion, &QAction::triggered, this, &BrowserWindow::enable_auto_motion); + + auto* reduce_motion = new QAction("&Reduce", this); + reduce_motion->setCheckable(true); + motion_group->addAction(reduce_motion); + motion_menu->addAction(reduce_motion); + QObject::connect(reduce_motion, &QAction::triggered, this, &BrowserWindow::enable_reduce_motion); + + auto* no_preference_motion = new QAction("&No Preference", this); + no_preference_motion->setCheckable(true); + motion_group->addAction(no_preference_motion); + motion_menu->addAction(no_preference_motion); + QObject::connect(no_preference_motion, &QAction::triggered, this, &BrowserWindow::enable_no_preference_motion); + + auto_motion->setChecked(true); + auto* show_menubar = new QAction("Show &Menubar", this); show_menubar->setCheckable(true); show_menubar->setChecked(Settings::the()->show_menubar()); @@ -975,6 +1000,27 @@ void BrowserWindow::enable_no_preference_contrast() }); } +void BrowserWindow::enable_auto_motion() +{ + for_each_tab([](auto& tab) { + tab.view().set_preferred_motion(Web::CSS::PreferredMotion::Auto); + }); +} + +void BrowserWindow::enable_no_preference_motion() +{ + for_each_tab([](auto& tab) { + tab.view().set_preferred_motion(Web::CSS::PreferredMotion::NoPreference); + }); +} + +void BrowserWindow::enable_reduce_motion() +{ + for_each_tab([](auto& tab) { + tab.view().set_preferred_motion(Web::CSS::PreferredMotion::Reduce); + }); +} + void BrowserWindow::zoom_in() { if (!m_current_tab) diff --git a/Ladybird/Qt/BrowserWindow.h b/Ladybird/Qt/BrowserWindow.h index 529ce92da2c..ea3ac180161 100644 --- a/Ladybird/Qt/BrowserWindow.h +++ b/Ladybird/Qt/BrowserWindow.h @@ -124,6 +124,9 @@ public slots: void enable_less_contrast(); void enable_more_contrast(); void enable_no_preference_contrast(); + void enable_auto_motion(); + void enable_no_preference_motion(); + void enable_reduce_motion(); void zoom_in(); void zoom_out(); void reset_zoom(); diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/CSS/BUILD.gn b/Meta/gn/secondary/Userland/Libraries/LibWeb/CSS/BUILD.gn index e0201858179..780aa63e0a1 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibWeb/CSS/BUILD.gn +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/CSS/BUILD.gn @@ -47,6 +47,7 @@ source_set("CSS") { "PercentageOr.cpp", "PreferredColorScheme.cpp", "PreferredContrast.cpp", + "PreferredMotion.cpp", "Ratio.cpp", "Resolution.cpp", "ResolvedCSSStyleDeclaration.cpp", diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 9ee7acbfbac..35a181da671 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -83,6 +83,7 @@ set(SOURCES CSS/PercentageOr.cpp CSS/PreferredColorScheme.cpp CSS/PreferredContrast.cpp + CSS/PreferredMotion.cpp CSS/Ratio.cpp CSS/Resolution.cpp CSS/ResolvedCSSStyleDeclaration.cpp diff --git a/Userland/Libraries/LibWeb/CSS/PreferredMotion.cpp b/Userland/Libraries/LibWeb/CSS/PreferredMotion.cpp new file mode 100644 index 00000000000..3ea8cec0732 --- /dev/null +++ b/Userland/Libraries/LibWeb/CSS/PreferredMotion.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024, the Ladybird developers. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include + +namespace Web::CSS { + +PreferredMotion preferred_motion_from_string(StringView value) +{ + if (value.equals_ignoring_ascii_case("no-preference"sv)) + return PreferredMotion::NoPreference; + if (value.equals_ignoring_ascii_case("reduce"sv)) + return PreferredMotion::Reduce; + return PreferredMotion::Auto; +} + +StringView preferred_motion_to_string(PreferredMotion value) +{ + switch (value) { + case PreferredMotion::Auto: + return "auto"sv; + case PreferredMotion::NoPreference: + return "no-preference"sv; + case PreferredMotion::Reduce: + return "reduce"sv; + } + VERIFY_NOT_REACHED(); +} + +} diff --git a/Userland/Libraries/LibWeb/CSS/PreferredMotion.h b/Userland/Libraries/LibWeb/CSS/PreferredMotion.h new file mode 100644 index 00000000000..cef43be371a --- /dev/null +++ b/Userland/Libraries/LibWeb/CSS/PreferredMotion.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2024, the Ladybird developers. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::CSS { + +enum class PreferredMotion { + Auto, + NoPreference, + Reduce, +}; + +PreferredMotion preferred_motion_from_string(StringView); +StringView preferred_motion_to_string(PreferredMotion); + +} diff --git a/Userland/Libraries/LibWeb/HTML/Window.cpp b/Userland/Libraries/LibWeb/HTML/Window.cpp index adeac5a4f32..41a27df7bcf 100644 --- a/Userland/Libraries/LibWeb/HTML/Window.cpp +++ b/Userland/Libraries/LibWeb/HTML/Window.cpp @@ -354,8 +354,16 @@ Optional Window::query_media_feature(CSS::MediaFeatureID // FIXME: Make this a preference return CSS::MediaFeatureValue(CSS::ValueID::NoPreference); case CSS::MediaFeatureID::PrefersReducedMotion: - // FIXME: Make this a preference - return CSS::MediaFeatureValue(CSS::ValueID::NoPreference); + switch (page().preferred_motion()) { + case CSS::PreferredMotion::NoPreference: + return CSS::MediaFeatureValue(CSS::ValueID::NoPreference); + case CSS::PreferredMotion::Reduce: + return CSS::MediaFeatureValue(CSS::ValueID::Reduce); + case CSS::PreferredMotion::Auto: + default: + // FIXME: Fallback to system settings + return CSS::MediaFeatureValue(CSS::ValueID::NoPreference); + } case CSS::MediaFeatureID::PrefersReducedTransparency: // FIXME: Make this a preference return CSS::MediaFeatureValue(CSS::ValueID::NoPreference); diff --git a/Userland/Libraries/LibWeb/Page/Page.cpp b/Userland/Libraries/LibWeb/Page/Page.cpp index 37cc4723410..022ab3aa80d 100644 --- a/Userland/Libraries/LibWeb/Page/Page.cpp +++ b/Userland/Libraries/LibWeb/Page/Page.cpp @@ -117,6 +117,11 @@ CSS::PreferredContrast Page::preferred_contrast() const return m_client->preferred_contrast(); } +CSS::PreferredMotion Page::preferred_motion() const +{ + return m_client->preferred_motion(); +} + CSSPixelPoint Page::device_to_css_point(DevicePixelPoint point) const { return { diff --git a/Userland/Libraries/LibWeb/Page/Page.h b/Userland/Libraries/LibWeb/Page/Page.h index 061f0149998..b02865e3395 100644 --- a/Userland/Libraries/LibWeb/Page/Page.h +++ b/Userland/Libraries/LibWeb/Page/Page.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -104,6 +105,7 @@ public: CSSPixelRect web_exposed_screen_area() const; CSS::PreferredColorScheme preferred_color_scheme() const; CSS::PreferredContrast preferred_contrast() const; + CSS::PreferredMotion preferred_motion() const; bool is_same_origin_policy_enabled() const { return m_same_origin_policy_enabled; } void set_same_origin_policy_enabled(bool b) { m_same_origin_policy_enabled = b; } @@ -287,6 +289,7 @@ public: virtual double device_pixels_per_css_pixel() const = 0; virtual CSS::PreferredColorScheme preferred_color_scheme() const = 0; virtual CSS::PreferredContrast preferred_contrast() const = 0; + virtual CSS::PreferredMotion preferred_motion() const = 0; virtual void paint_next_frame() = 0; virtual void paint(DevicePixelRect const&, Gfx::Bitmap&, PaintOptions = {}) = 0; virtual void page_did_change_title(ByteString const&) { } diff --git a/Userland/Libraries/LibWeb/SVG/SVGDecodedImageData.h b/Userland/Libraries/LibWeb/SVG/SVGDecodedImageData.h index 0c8217110de..c4ae5c99856 100644 --- a/Userland/Libraries/LibWeb/SVG/SVGDecodedImageData.h +++ b/Userland/Libraries/LibWeb/SVG/SVGDecodedImageData.h @@ -73,6 +73,7 @@ public: virtual double device_pixels_per_css_pixel() const override { return 1.0; } virtual CSS::PreferredColorScheme preferred_color_scheme() const override { return m_host_page->client().preferred_color_scheme(); } virtual CSS::PreferredContrast preferred_contrast() const override { return m_host_page->client().preferred_contrast(); } + virtual CSS::PreferredMotion preferred_motion() const override { return m_host_page->client().preferred_motion(); } virtual void request_file(FileRequest) override { } virtual void paint_next_frame() override { } virtual void paint(DevicePixelRect const&, Gfx::Bitmap&, Web::PaintOptions = {}) override { } diff --git a/Userland/Libraries/LibWebView/ViewImplementation.cpp b/Userland/Libraries/LibWebView/ViewImplementation.cpp index dfa8149b152..4d477541bc2 100644 --- a/Userland/Libraries/LibWebView/ViewImplementation.cpp +++ b/Userland/Libraries/LibWebView/ViewImplementation.cpp @@ -162,6 +162,11 @@ void ViewImplementation::set_preferred_contrast(Web::CSS::PreferredContrast cont client().async_set_preferred_contrast(page_id(), contrast); } +void ViewImplementation::set_preferred_motion(Web::CSS::PreferredMotion motion) +{ + client().async_set_preferred_motion(page_id(), motion); +} + ByteString ViewImplementation::selected_text() { return client().get_selected_text(page_id()); diff --git a/Userland/Libraries/LibWebView/ViewImplementation.h b/Userland/Libraries/LibWebView/ViewImplementation.h index 03b6b452b8e..22d2983a9c0 100644 --- a/Userland/Libraries/LibWebView/ViewImplementation.h +++ b/Userland/Libraries/LibWebView/ViewImplementation.h @@ -63,6 +63,7 @@ public: void set_preferred_color_scheme(Web::CSS::PreferredColorScheme); void set_preferred_contrast(Web::CSS::PreferredContrast); + void set_preferred_motion(Web::CSS::PreferredMotion); ByteString selected_text(); Optional selected_text_with_whitespace_collapsed(); diff --git a/Userland/Services/WebContent/ConnectionFromClient.cpp b/Userland/Services/WebContent/ConnectionFromClient.cpp index 45c20f534d6..2bdf6cae636 100644 --- a/Userland/Services/WebContent/ConnectionFromClient.cpp +++ b/Userland/Services/WebContent/ConnectionFromClient.cpp @@ -941,6 +941,12 @@ void ConnectionFromClient::set_preferred_contrast(u64 page_id, Web::CSS::Preferr page->set_preferred_contrast(contrast); } +void ConnectionFromClient::set_preferred_motion(u64 page_id, Web::CSS::PreferredMotion const& motion) +{ + if (auto page = this->page(page_id); page.has_value()) + page->set_preferred_motion(motion); +} + void ConnectionFromClient::set_has_focus(u64 page_id, bool has_focus) { if (auto page = this->page(page_id); page.has_value()) diff --git a/Userland/Services/WebContent/ConnectionFromClient.h b/Userland/Services/WebContent/ConnectionFromClient.h index 3c587b8fee1..9f62af40325 100644 --- a/Userland/Services/WebContent/ConnectionFromClient.h +++ b/Userland/Services/WebContent/ConnectionFromClient.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -90,6 +91,7 @@ private: virtual void set_proxy_mappings(u64 page_id, Vector const&, HashMap const&) override; virtual void set_preferred_color_scheme(u64 page_id, Web::CSS::PreferredColorScheme const&) override; virtual void set_preferred_contrast(u64 page_id, Web::CSS::PreferredContrast const&) override; + virtual void set_preferred_motion(u64 page_id, Web::CSS::PreferredMotion const&) override; virtual void set_has_focus(u64 page_id, bool) override; virtual void set_is_scripting_enabled(u64 page_id, bool) override; virtual void set_device_pixels_per_css_pixel(u64 page_id, float) override; diff --git a/Userland/Services/WebContent/PageClient.cpp b/Userland/Services/WebContent/PageClient.cpp index 21772acbbf0..65e9f006e20 100644 --- a/Userland/Services/WebContent/PageClient.cpp +++ b/Userland/Services/WebContent/PageClient.cpp @@ -164,6 +164,13 @@ void PageClient::set_preferred_contrast(Web::CSS::PreferredContrast contrast) document->invalidate_style(); } +void PageClient::set_preferred_motion(Web::CSS::PreferredMotion motion) +{ + m_preferred_motion = motion; + if (auto* document = page().top_level_browsing_context().active_document()) + document->invalidate_style(); +} + void PageClient::set_is_scripting_enabled(bool is_scripting_enabled) { page().set_is_scripting_enabled(is_scripting_enabled); diff --git a/Userland/Services/WebContent/PageClient.h b/Userland/Services/WebContent/PageClient.h index 77e2d801fd9..c5cfaec131c 100644 --- a/Userland/Services/WebContent/PageClient.h +++ b/Userland/Services/WebContent/PageClient.h @@ -51,6 +51,7 @@ public: void set_device_pixels_per_css_pixel(float device_pixels_per_css_pixel) { m_device_pixels_per_css_pixel = device_pixels_per_css_pixel; } void set_preferred_color_scheme(Web::CSS::PreferredColorScheme); void set_preferred_contrast(Web::CSS::PreferredContrast); + void set_preferred_motion(Web::CSS::PreferredMotion); void set_should_show_line_box_borders(bool b) { m_should_show_line_box_borders = b; } void set_has_focus(bool); void set_is_scripting_enabled(bool); @@ -98,6 +99,7 @@ private: virtual Web::DevicePixelRect screen_rect() const override { return m_screen_rect; } virtual Web::CSS::PreferredColorScheme preferred_color_scheme() const override { return m_preferred_color_scheme; } virtual Web::CSS::PreferredContrast preferred_contrast() const override { return m_preferred_contrast; } + virtual Web::CSS::PreferredMotion preferred_motion() const override { return m_preferred_motion; } virtual void page_did_request_cursor_change(Gfx::StandardCursor) override; virtual void page_did_layout() override; virtual void page_did_change_title(ByteString const&) override; @@ -184,6 +186,7 @@ private: Web::CSS::PreferredColorScheme m_preferred_color_scheme { Web::CSS::PreferredColorScheme::Auto }; Web::CSS::PreferredContrast m_preferred_contrast { Web::CSS::PreferredContrast::NoPreference }; + Web::CSS::PreferredMotion m_preferred_motion { Web::CSS::PreferredMotion::NoPreference }; RefPtr m_webdriver; diff --git a/Userland/Services/WebContent/WebContentServer.ipc b/Userland/Services/WebContent/WebContentServer.ipc index 85b535982b4..e9f3652648e 100644 --- a/Userland/Services/WebContent/WebContentServer.ipc +++ b/Userland/Services/WebContent/WebContentServer.ipc @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -79,6 +80,7 @@ endpoint WebContentServer set_proxy_mappings(u64 page_id, Vector proxies, HashMap mappings) =| set_preferred_color_scheme(u64 page_id, Web::CSS::PreferredColorScheme color_scheme) =| set_preferred_contrast(u64 page_id, Web::CSS::PreferredContrast contrast) =| + set_preferred_motion(u64 page_id, Web::CSS::PreferredMotion motion) =| set_has_focus(u64 page_id, bool has_focus) =| set_is_scripting_enabled(u64 page_id, bool is_scripting_enabled) =| set_device_pixels_per_css_pixel(u64 page_id, float device_pixels_per_css_pixel) =| diff --git a/Userland/Services/WebWorker/PageHost.cpp b/Userland/Services/WebWorker/PageHost.cpp index fa1a446ef0e..21f76ebf57b 100644 --- a/Userland/Services/WebWorker/PageHost.cpp +++ b/Userland/Services/WebWorker/PageHost.cpp @@ -72,6 +72,11 @@ Web::CSS::PreferredContrast PageHost::preferred_contrast() const return Web::CSS::PreferredContrast::Auto; } +Web::CSS::PreferredMotion PageHost::preferred_motion() const +{ + return Web::CSS::PreferredMotion::Auto; +} + void PageHost::paint(Web::DevicePixelRect const&, Gfx::Bitmap&, Web::PaintOptions) { } diff --git a/Userland/Services/WebWorker/PageHost.h b/Userland/Services/WebWorker/PageHost.h index 21631da97e6..8fa1100cd65 100644 --- a/Userland/Services/WebWorker/PageHost.h +++ b/Userland/Services/WebWorker/PageHost.h @@ -30,6 +30,7 @@ public: virtual double device_pixels_per_css_pixel() const override; virtual Web::CSS::PreferredColorScheme preferred_color_scheme() const override; virtual Web::CSS::PreferredContrast preferred_contrast() const override; + virtual Web::CSS::PreferredMotion preferred_motion() const override; virtual void paint_next_frame() override {}; virtual void paint(Web::DevicePixelRect const&, Gfx::Bitmap&, Web::PaintOptions = {}) override; virtual void request_file(Web::FileRequest) override;