diff --git a/Userland/Libraries/LibWeb/InProcessWebView.cpp b/Userland/Libraries/LibWeb/InProcessWebView.cpp index d5b91491a4..e659e724b7 100644 --- a/Userland/Libraries/LibWeb/InProcessWebView.cpp +++ b/Userland/Libraries/LibWeb/InProcessWebView.cpp @@ -51,6 +51,13 @@ String InProcessWebView::selected_text() const return page().focused_context().selected_text(); } +void InProcessWebView::set_preferred_color_scheme(CSS::PreferredColorScheme color_scheme) +{ + m_preferred_color_scheme = color_scheme; + if (auto* document = page().top_level_browsing_context().active_document()) + document->invalidate_style(); +} + void InProcessWebView::page_did_layout() { VERIFY(layout_root()); diff --git a/Userland/Libraries/LibWeb/InProcessWebView.h b/Userland/Libraries/LibWeb/InProcessWebView.h index b858840625..3cb56133ef 100644 --- a/Userland/Libraries/LibWeb/InProcessWebView.h +++ b/Userland/Libraries/LibWeb/InProcessWebView.h @@ -40,6 +40,7 @@ public: AK::URL url() const; + void set_preferred_color_scheme(CSS::PreferredColorScheme); void set_should_show_line_box_borders(bool value) { m_should_show_line_box_borders = value; } String selected_text() const; @@ -65,6 +66,7 @@ private: // ^Web::PageClient virtual Gfx::Palette palette() const override { return GUI::AbstractScrollableWidget::palette(); } virtual Gfx::IntRect screen_rect() const override { return GUI::Desktop::the().rect(); } + virtual CSS::PreferredColorScheme preferred_color_scheme() const override { return m_preferred_color_scheme; } virtual void page_did_change_title(const String&) override; virtual void page_did_set_document_in_top_level_browsing_context(DOM::Document*) override; virtual void page_did_start_loading(const AK::URL&) override; @@ -95,6 +97,7 @@ private: bool m_should_show_line_box_borders { false }; NonnullOwnPtr m_page; + CSS::PreferredColorScheme m_preferred_color_scheme { CSS::PreferredColorScheme::Auto }; }; } diff --git a/Userland/Libraries/LibWeb/OutOfProcessWebView.cpp b/Userland/Libraries/LibWeb/OutOfProcessWebView.cpp index 48a5b16243..292a31b3a1 100644 --- a/Userland/Libraries/LibWeb/OutOfProcessWebView.cpp +++ b/Userland/Libraries/LibWeb/OutOfProcessWebView.cpp @@ -489,4 +489,9 @@ void OutOfProcessWebView::set_content_filters(Vector filters) client().async_set_content_filters(filters); } +void OutOfProcessWebView::set_preferred_color_scheme(Web::CSS::PreferredColorScheme color_scheme) +{ + client().async_set_preferred_color_scheme(color_scheme); +} + } diff --git a/Userland/Libraries/LibWeb/OutOfProcessWebView.h b/Userland/Libraries/LibWeb/OutOfProcessWebView.h index 818edb2bdf..6acdbfce56 100644 --- a/Userland/Libraries/LibWeb/OutOfProcessWebView.h +++ b/Userland/Libraries/LibWeb/OutOfProcessWebView.h @@ -9,6 +9,7 @@ #include #include #include +#include #include namespace Web { @@ -52,6 +53,7 @@ public: String dump_layout_tree(); void set_content_filters(Vector); + void set_preferred_color_scheme(Web::CSS::PreferredColorScheme); void notify_server_did_layout(Badge, const Gfx::IntSize& content_size); void notify_server_did_paint(Badge, i32 bitmap_id); diff --git a/Userland/Libraries/LibWeb/Page/Page.cpp b/Userland/Libraries/LibWeb/Page/Page.cpp index 0a44879978..aa9e1be847 100644 --- a/Userland/Libraries/LibWeb/Page/Page.cpp +++ b/Userland/Libraries/LibWeb/Page/Page.cpp @@ -56,6 +56,11 @@ Gfx::IntRect Page::screen_rect() const return m_client.screen_rect(); } +CSS::PreferredColorScheme Page::preferred_color_scheme() const +{ + return m_client.preferred_color_scheme(); +} + bool Page::handle_mousewheel(const Gfx::IntPoint& position, unsigned button, unsigned modifiers, int wheel_delta) { return top_level_browsing_context().event_handler().handle_mousewheel(position, button, modifiers, wheel_delta); diff --git a/Userland/Libraries/LibWeb/Page/Page.h b/Userland/Libraries/LibWeb/Page/Page.h index db34d76b38..4af4be19bc 100644 --- a/Userland/Libraries/LibWeb/Page/Page.h +++ b/Userland/Libraries/LibWeb/Page/Page.h @@ -16,6 +16,7 @@ #include #include #include +#include #include namespace Web { @@ -56,6 +57,7 @@ public: Gfx::Palette palette() const; Gfx::IntRect screen_rect() const; + CSS::PreferredColorScheme preferred_color_scheme() 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; } @@ -74,6 +76,7 @@ class PageClient { public: virtual Gfx::Palette palette() const = 0; virtual Gfx::IntRect screen_rect() const = 0; + virtual CSS::PreferredColorScheme preferred_color_scheme() const = 0; virtual void page_did_set_document_in_top_level_browsing_context(DOM::Document*) { } virtual void page_did_change_title(const String&) { } virtual void page_did_start_loading(const AK::URL&) { } diff --git a/Userland/Services/WebContent/ClientConnection.cpp b/Userland/Services/WebContent/ClientConnection.cpp index 7456cc2e07..7787acbf5d 100644 --- a/Userland/Services/WebContent/ClientConnection.cpp +++ b/Userland/Services/WebContent/ClientConnection.cpp @@ -351,4 +351,9 @@ void ClientConnection::set_content_filters(Vector const& filters) Web::ContentFilter::the().add_pattern(filter); } +void ClientConnection::set_preferred_color_scheme(Web::CSS::PreferredColorScheme const& color_scheme) +{ + m_page_host->set_preferred_color_scheme(color_scheme); +} + } diff --git a/Userland/Services/WebContent/ClientConnection.h b/Userland/Services/WebContent/ClientConnection.h index 200ff744da..77c0a82f85 100644 --- a/Userland/Services/WebContent/ClientConnection.h +++ b/Userland/Services/WebContent/ClientConnection.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -57,6 +58,7 @@ private: virtual Messages::WebContentServer::GetHoveredNodeIdResponse get_hovered_node_id() override; virtual Messages::WebContentServer::DumpLayoutTreeResponse dump_layout_tree() override; virtual void set_content_filters(Vector const&) override; + virtual void set_preferred_color_scheme(Web::CSS::PreferredColorScheme const&) override; virtual void js_console_input(String const&) override; virtual void run_javascript(String const&) override; diff --git a/Userland/Services/WebContent/PageHost.cpp b/Userland/Services/WebContent/PageHost.cpp index 8a8858a469..69ccb31151 100644 --- a/Userland/Services/WebContent/PageHost.cpp +++ b/Userland/Services/WebContent/PageHost.cpp @@ -51,6 +51,13 @@ void PageHost::set_palette_impl(const Gfx::PaletteImpl& impl) m_palette_impl = impl; } +void PageHost::set_preferred_color_scheme(Web::CSS::PreferredColorScheme color_scheme) +{ + m_preferred_color_scheme = color_scheme; + if (auto* document = page().top_level_browsing_context().active_document()) + document->invalidate_style(); +} + Web::Layout::InitialContainingBlock* PageHost::layout_root() { auto* document = page().top_level_browsing_context().active_document(); diff --git a/Userland/Services/WebContent/PageHost.h b/Userland/Services/WebContent/PageHost.h index 1db072ede9..d8ac4c1e65 100644 --- a/Userland/Services/WebContent/PageHost.h +++ b/Userland/Services/WebContent/PageHost.h @@ -29,6 +29,7 @@ public: void set_palette_impl(const Gfx::PaletteImpl&); void set_viewport_rect(const Gfx::IntRect&); void set_screen_rects(const Vector& rects, size_t main_screen_index) { m_screen_rect = rects[main_screen_index]; }; + void set_preferred_color_scheme(Web::CSS::PreferredColorScheme); void set_should_show_line_box_borders(bool b) { m_should_show_line_box_borders = b; } @@ -36,6 +37,7 @@ private: // ^PageClient virtual Gfx::Palette palette() const override; virtual Gfx::IntRect screen_rect() const override { return m_screen_rect; } + virtual Web::CSS::PreferredColorScheme preferred_color_scheme() const override { return m_preferred_color_scheme; } virtual void page_did_invalidate(const Gfx::IntRect&) override; virtual void page_did_change_selection() override; virtual void page_did_request_cursor_change(Gfx::StandardCursor) override; @@ -75,6 +77,7 @@ private: RefPtr m_invalidation_coalescing_timer; Gfx::IntRect m_invalidation_rect; + Web::CSS::PreferredColorScheme m_preferred_color_scheme { Web::CSS::PreferredColorScheme::Auto }; }; } diff --git a/Userland/Services/WebContent/WebContentServer.ipc b/Userland/Services/WebContent/WebContentServer.ipc index 06583ae13f..1eda8ea559 100644 --- a/Userland/Services/WebContent/WebContentServer.ipc +++ b/Userland/Services/WebContent/WebContentServer.ipc @@ -1,6 +1,7 @@ #include #include #include +#include endpoint WebContentServer { @@ -41,5 +42,6 @@ endpoint WebContentServer select_all() =| set_content_filters(Vector filters) =| + set_preferred_color_scheme(Web::CSS::PreferredColorScheme color_scheme) =| }