Changeset 287030 in webkit


Ignore:
Timestamp:
Dec 14, 2021 10:20:24 AM (7 months ago)
Author:
dino@apple.com
Message:

Allow override of system's preferred color scheme
https://bugs.webkit.org/show_bug.cgi?id=234199
<rdar://problem/86366044>

Reviewed by Tim Horton.

Source/WebCore:

Use a user-specified preference for color-scheme before reading
the system value.

  • css/MediaQueryEvaluator.cpp:

(WebCore::prefersColorSchemeEvaluate): If the document loader was given
a preference, use that when evaluating the media query.

  • loader/DocumentLoader.cpp: New property - colorSchemePreference.

(WebCore::DocumentLoader::colorSchemePreference const):

  • loader/DocumentLoader.h:

(WebCore::DocumentLoader::setColorSchemePreference):

  • dom/Document.cpp:

(WebCore::Document::useDarkAppearance const): Check the DocumentLoader here too.

Source/WebKit:

Expose new Private API that allows the user to give an explicit per-page preference
for light or dark color schemes rather than reading the system value.

  • Scripts/webkit/messages.py:

(headers_for_type): Add header for DocumentLoader.

  • Shared/WebsitePoliciesData.cpp: Encode the new value in the policies sent

to the Web Process.
(WebKit::WebsitePoliciesData::encode const):
(WebKit::WebsitePoliciesData::decode):
(WebKit::WebsitePoliciesData::applyToDocumentLoader):

  • Shared/WebsitePoliciesData.h:
  • UIProcess/API/APIWebsitePolicies.cpp: Expose a new policy "colorSchemePreference".

(API::WebsitePolicies::copy const):
(API::WebsitePolicies::data):

  • UIProcess/API/APIWebsitePolicies.h:
  • UIProcess/API/Cocoa/WKWebpagePreferences.mm: Expose a new private API "_colorSchemePreference".

(-[WKWebpagePreferences _colorSchemePreference]):
(-[WKWebpagePreferences _setColorSchemePreference:]):

  • UIProcess/API/Cocoa/WKWebpagePreferencesPrivate.h:

Tools:

New API test that checks the color-scheme after
explicitly setting it.

  • TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
  • TestWebKitAPI/Tests/WebKit/color-scheme.html: Added. Note: Xcode was

being difficult and wouldn't let me put this file in the right order
for the Copy Build Phase :(

  • TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm:
Location:
trunk
Files:
1 added
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r287028 r287030  
     12021-12-11  Dean Jackson  <dino@apple.com>
     2
     3        Allow override of system's preferred color scheme
     4        https://bugs.webkit.org/show_bug.cgi?id=234199
     5        <rdar://problem/86366044>
     6
     7        Reviewed by Tim Horton.
     8
     9        Use a user-specified preference for color-scheme before reading
     10        the system value.
     11
     12        * css/MediaQueryEvaluator.cpp:
     13        (WebCore::prefersColorSchemeEvaluate): If the document loader was given
     14        a preference, use that when evaluating the media query.
     15        * loader/DocumentLoader.cpp: New property - colorSchemePreference.
     16        (WebCore::DocumentLoader::colorSchemePreference const):
     17        * loader/DocumentLoader.h:
     18        (WebCore::DocumentLoader::setColorSchemePreference):
     19        * dom/Document.cpp:
     20        (WebCore::Document::useDarkAppearance const): Check the DocumentLoader here too.
     21
    1222021-12-14  Alan Bujtas  <zalan@apple.com>
    223
  • trunk/Source/WebCore/css/MediaQueryEvaluator.cpp

    r286123 r287030  
    3636#include "Chrome.h"
    3737#include "ChromeClient.h"
     38#include "DocumentLoader.h"
    3839#include "Frame.h"
    3940#include "FrameView.h"
     
    808809
    809810    auto keyword = downcast<CSSPrimitiveValue>(*value).valueID();
    810     bool useDarkAppearance = frame.page()->useDarkAppearance();
     811    bool useDarkAppearance = [&] () -> auto {
     812        if (frame.document()->loader()) {
     813            auto colorSchemePreference = frame.document()->loader()->colorSchemePreference();
     814            if (colorSchemePreference != ColorSchemePreference::NoPreference)
     815                return colorSchemePreference == ColorSchemePreference::Dark;
     816        }
     817
     818        return frame.page()->useDarkAppearance();
     819    }();
    811820
    812821    switch (keyword) {
  • trunk/Source/WebCore/dom/Document.cpp

    r286772 r287030  
    75957595#endif
    75967596
     7597    if (DocumentLoader* documentLoader = loader()) {
     7598        auto colorSchemePreference = documentLoader->colorSchemePreference();
     7599        if (colorSchemePreference != ColorSchemePreference::NoPreference)
     7600            return colorSchemePreference == ColorSchemePreference::Dark;
     7601    }
     7602
    75977603    bool pageUsesDarkAppearance = false;
    75987604    if (Page* documentPage = page())
  • trunk/Source/WebCore/loader/DocumentLoader.cpp

    r287021 r287030  
    14121412}
    14131413
     1414ColorSchemePreference DocumentLoader::colorSchemePreference() const
     1415{
     1416    return m_colorSchemePreference;
     1417}
     1418
    14141419void DocumentLoader::attachToFrame(Frame& frame)
    14151420{
  • trunk/Source/WebCore/loader/DocumentLoader.h

    r287021 r287030  
    153153};
    154154
     155enum class ColorSchemePreference : uint8_t {
     156    NoPreference,
     157    Light,
     158    Dark
     159};
     160
    155161DECLARE_ALLOCATOR_WITH_HEAP_IDENTIFIER(DocumentLoader);
    156162class DocumentLoader
     
    354360    ModalContainerObservationPolicy modalContainerObservationPolicy() const { return m_modalContainerObservationPolicy; }
    355361    void setModalContainerObservationPolicy(ModalContainerObservationPolicy policy) { m_modalContainerObservationPolicy = policy; }
     362
     363    WEBCORE_EXPORT ColorSchemePreference colorSchemePreference() const;
     364    void setColorSchemePreference(ColorSchemePreference preference) { m_colorSchemePreference = preference; }
    356365
    357366    void addSubresourceLoader(ResourceLoader&);
     
    680689    MouseEventPolicy m_mouseEventPolicy { MouseEventPolicy::Default };
    681690    ModalContainerObservationPolicy m_modalContainerObservationPolicy { ModalContainerObservationPolicy::Disabled };
     691    ColorSchemePreference m_colorSchemePreference { ColorSchemePreference::NoPreference };
    682692
    683693#if ENABLE(SERVICE_WORKER)
     
    805815};
    806816
     817template<> struct EnumTraits<WebCore::ColorSchemePreference> {
     818    using values = EnumValues<
     819        WebCore::ColorSchemePreference,
     820        WebCore::ColorSchemePreference::NoPreference,
     821        WebCore::ColorSchemePreference::Light,
     822        WebCore::ColorSchemePreference::Dark
     823    >;
     824};
     825
    807826} // namespace WTF
  • trunk/Source/WebKit/ChangeLog

    r287021 r287030  
     12021-12-11  Dean Jackson  <dino@apple.com>
     2
     3        Allow override of system's preferred color scheme
     4        https://bugs.webkit.org/show_bug.cgi?id=234199
     5        <rdar://problem/86366044>
     6
     7        Reviewed by Tim Horton.
     8
     9        Expose new Private API that allows the user to give an explicit per-page preference
     10        for light or dark color schemes rather than reading the system value.
     11
     12        * Scripts/webkit/messages.py:
     13        (headers_for_type): Add header for DocumentLoader.
     14
     15        * Shared/WebsitePoliciesData.cpp: Encode the new value in the policies sent
     16        to the Web Process.
     17        (WebKit::WebsitePoliciesData::encode const):
     18        (WebKit::WebsitePoliciesData::decode):
     19        (WebKit::WebsitePoliciesData::applyToDocumentLoader):
     20        * Shared/WebsitePoliciesData.h:
     21
     22        * UIProcess/API/APIWebsitePolicies.cpp: Expose a new policy "colorSchemePreference".
     23        (API::WebsitePolicies::copy const):
     24        (API::WebsitePolicies::data):
     25        * UIProcess/API/APIWebsitePolicies.h:
     26
     27        * UIProcess/API/Cocoa/WKWebpagePreferences.mm: Expose a new private API "_colorSchemePreference".
     28        (-[WKWebpagePreferences _colorSchemePreference]):
     29        (-[WKWebpagePreferences _setColorSchemePreference:]):
     30        * UIProcess/API/Cocoa/WKWebpagePreferencesPrivate.h:
     31
    1322021-12-14  Jean-Yves Avenard  <jya@apple.com>
    233
  • trunk/Source/WebKit/Scripts/webkit/messages.py

    r286944 r287030  
    757757        'WebCore::COEPDisposition': ['<WebCore/CrossOriginEmbedderPolicy.h>'],
    758758        'WebCore::COOPDisposition': ['<WebCore/CrossOriginOpenerPolicy.h>'],
     759        'WebCore::ColorSchemePreference': ['<WebCore/DocumentLoader.h>'],
    759760        'WebCore::CompositeOperator': ['<WebCore/GraphicsTypes.h>'],
    760761        'WebCore::CreateNewGroupForHighlight': ['<WebCore/AppHighlight.h>'],
  • trunk/Source/WebKit/Shared/WebsitePoliciesData.cpp

    r286831 r287030  
    5656    encoder << mouseEventPolicy;
    5757    encoder << modalContainerObservationPolicy;
     58    encoder << colorSchemePreference;
    5859    encoder << idempotentModeAutosizingOnlyHonorsPercentages;
    5960}
     
    151152    decoder >> modalContainerObservationPolicy;
    152153    if (!modalContainerObservationPolicy)
     154        return std::nullopt;
     155
     156    std::optional<WebCore::ColorSchemePreference> colorSchemePreference;
     157    decoder >> colorSchemePreference;
     158    if (!colorSchemePreference)
    153159        return std::nullopt;
    154160
     
    179185        WTFMove(*mouseEventPolicy),
    180186        WTFMove(*modalContainerObservationPolicy),
     187        WTFMove(*colorSchemePreference),
    181188        WTFMove(*idempotentModeAutosizingOnlyHonorsPercentages),
    182189    } };
     
    304311
    305312    documentLoader.setModalContainerObservationPolicy(websitePolicies.modalContainerObservationPolicy);
     313    documentLoader.setColorSchemePreference(websitePolicies.colorSchemePreference);
    306314    documentLoader.setAllowContentChangeObserverQuirk(websitePolicies.allowContentChangeObserverQuirk);
    307315    documentLoader.setIdempotentModeAutosizingOnlyHonorsPercentages(websitePolicies.idempotentModeAutosizingOnlyHonorsPercentages);
  • trunk/Source/WebKit/Shared/WebsitePoliciesData.h

    r286831 r287030  
    7373    WebCore::MouseEventPolicy mouseEventPolicy { WebCore::MouseEventPolicy::Default };
    7474    WebCore::ModalContainerObservationPolicy modalContainerObservationPolicy { WebCore::ModalContainerObservationPolicy::Disabled };
     75    WebCore::ColorSchemePreference colorSchemePreference { WebCore::ColorSchemePreference::NoPreference };
    7576    bool idempotentModeAutosizingOnlyHonorsPercentages { false };
    7677
  • trunk/Source/WebKit/UIProcess/API/APIWebsitePolicies.cpp

    r286831 r287030  
    7878    policies->setMouseEventPolicy(m_mouseEventPolicy);
    7979    policies->setModalContainerObservationPolicy(m_modalContainerObservationPolicy);
     80    policies->setColorSchemePreference(m_colorSchemePreference);
    8081    return policies;
    8182}
     
    124125        m_mouseEventPolicy,
    125126        m_modalContainerObservationPolicy,
     127        m_colorSchemePreference,
    126128        m_idempotentModeAutosizingOnlyHonorsPercentages
    127129    };
  • trunk/Source/WebKit/UIProcess/API/APIWebsitePolicies.h

    r286831 r287030  
    133133    bool isCaptivePortalModeExplicitlySet() const { return !!m_captivePortalModeEnabled; }
    134134
     135    WebCore::ColorSchemePreference colorSchemePreference() const { return m_colorSchemePreference; }
     136    void setColorSchemePreference(WebCore::ColorSchemePreference colorSchemePreference) { m_colorSchemePreference = colorSchemePreference; }
     137
    135138    WebCore::MouseEventPolicy mouseEventPolicy() const { return m_mouseEventPolicy; }
    136139    void setMouseEventPolicy(WebCore::MouseEventPolicy policy) { m_mouseEventPolicy = policy; }
     
    172175    bool m_idempotentModeAutosizingOnlyHonorsPercentages { false };
    173176    std::optional<bool> m_captivePortalModeEnabled;
     177    WebCore::ColorSchemePreference m_colorSchemePreference { WebCore::ColorSchemePreference::NoPreference };
    174178};
    175179
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebpagePreferences.mm

    r286831 r287030  
    502502}
    503503
     504- (_WKWebsiteColorSchemePreference)_colorSchemePreference
     505{
     506    switch (_websitePolicies->colorSchemePreference()) {
     507    case WebCore::ColorSchemePreference::NoPreference:
     508        return _WKWebsiteColorSchemePreferenceNoPreference;
     509    case WebCore::ColorSchemePreference::Light:
     510        return _WKWebsiteColorSchemePreferenceLight;
     511    case WebCore::ColorSchemePreference::Dark:
     512        return _WKWebsiteColorSchemePreferenceDark;
     513    }
     514}
     515
     516- (void)_setColorSchemePreference:(_WKWebsiteColorSchemePreference)value
     517{
     518    switch (value) {
     519    case _WKWebsiteColorSchemePreferenceNoPreference:
     520        _websitePolicies->setColorSchemePreference(WebCore::ColorSchemePreference::NoPreference);
     521        break;
     522    case _WKWebsiteColorSchemePreferenceLight:
     523        _websitePolicies->setColorSchemePreference(WebCore::ColorSchemePreference::Light);
     524        break;
     525    case _WKWebsiteColorSchemePreferenceDark:
     526        _websitePolicies->setColorSchemePreference(WebCore::ColorSchemePreference::Dark);
     527        break;
     528    }
     529}
     530
    504531#if PLATFORM(IOS_FAMILY)
    505532
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebpagePreferencesPrivate.h

    r286831 r287030  
    7070} WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
    7171
     72// Allow overriding the system color-scheme with a per-website preference.
     73typedef NS_OPTIONS(NSUInteger, _WKWebsiteColorSchemePreference) {
     74    _WKWebsiteColorSchemePreferenceNoPreference,
     75    _WKWebsiteColorSchemePreferenceLight,
     76    _WKWebsiteColorSchemePreferenceDark,
     77} WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
     78
    7279@class _WKCustomHeaderFields;
    7380@class WKUserContentController;
     
    97104@property (nonatomic, setter=_setCaptivePortalModeEnabled:) BOOL _captivePortalModeEnabled WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
    98105
     106@property (nonatomic, setter=_setColorSchemePreference:) _WKWebsiteColorSchemePreference _colorSchemePreference;
     107
    99108@end
  • trunk/Tools/ChangeLog

    r287025 r287030  
     12021-12-11  Dean Jackson  <dino@apple.com>
     2
     3        Allow override of system's preferred color scheme
     4        https://bugs.webkit.org/show_bug.cgi?id=234199
     5        <rdar://problem/86366044>
     6
     7        Reviewed by Tim Horton.
     8
     9        New API test that checks the color-scheme after
     10        explicitly setting it.
     11
     12        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
     13        * TestWebKitAPI/Tests/WebKit/color-scheme.html: Added. Note: Xcode was
     14        being difficult and wouldn't let me put this file in the right order
     15        for the Copy Build Phase :(
     16        * TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm:
     17
    1182021-12-14  Angelos Oikonomopoulos  <angelos@igalia.com>
    219
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r286911 r287030  
    177177                3128A8152376413300D90D40 /* image.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 3128A814237640FD00D90D40 /* image.html */; };
    178178                313C3A0221E567C300DBA86E /* SystemPreviewBlobNaming.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 313C3A0121E5677A00DBA86E /* SystemPreviewBlobNaming.html */; };
     179                31903C912765077400363472 /* color-scheme.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 31903C902764FE1400363472 /* color-scheme.html */; };
    179180                31B76E4523299BDC007FED2C /* system-preview-trigger.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 31B76E4423299BA3007FED2C /* system-preview-trigger.html */; };
    180181                31E9BDA1247F4C62002E51A2 /* WebGLPrepareDisplayOnWebThread.mm in Sources */ = {isa = PBXBuildFile; fileRef = 31E9BDA0247F4C62002E51A2 /* WebGLPrepareDisplayOnWebThread.mm */; };
     
    12581259                                9BAE177B22E2BBFB00DF3098 /* cocoa-writer-markup-with-system-fonts.html in Copy Resources */,
    12591260                                E5036F78211BC25400BFDBE2 /* color-drop.html in Copy Resources */,
     1261                                31903C912765077400363472 /* color-scheme.html in Copy Resources */,
    12601262                                0F16BED82304A1F300B4A167 /* composited.html in Copy Resources */,
    12611263                                F4B825D81EF4DBFB006E417F /* compressed-files.zip in Copy Resources */,
     
    18511853                3128A814237640FD00D90D40 /* image.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = image.html; sourceTree = "<group>"; };
    18521854                313C3A0121E5677A00DBA86E /* SystemPreviewBlobNaming.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = SystemPreviewBlobNaming.html; sourceTree = "<group>"; };
     1855                31903C902764FE1400363472 /* color-scheme.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "color-scheme.html"; sourceTree = "<group>"; };
    18531856                31B76E4223298E2B007FED2C /* SystemPreview.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SystemPreview.mm; sourceTree = "<group>"; };
    18541857                31B76E4423299BA3007FED2C /* system-preview-trigger.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = "system-preview-trigger.html"; sourceTree = "<group>"; };
     
    46004603                                1A50AA1F1A2A4EA500F4C345 /* close-from-within-create-page.html */,
    46014604                                9B270FED1DDC25FD002D53F3 /* closed-shadow-tree-test.html */,
     4605                                31903C902764FE1400363472 /* color-scheme.html */,
    46024606                                5C9E56861DF9148E00C9EE33 /* contentBlockerCheck.html */,
    46034607                                F4034FA2275D5449003A81F8 /* cookie-consent-basic.html */,
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm

    r286040 r287030  
    17881788    EXPECT_WK_STREQ([uiDelegate waitForAlert], "testAlert3");
    17891789}
     1790
     1791TEST(WebpagePreferences, UserExplicitlyPrefersColorSchemeLight)
     1792{
     1793    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     1794
     1795    configuration.get().defaultWebpagePreferences._colorSchemePreference = _WKWebsiteColorSchemePreferenceLight;
     1796
     1797    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
     1798
     1799    [webView loadTestPageNamed:@"color-scheme"];
     1800    [webView waitForMessage:@"light-detected"];
     1801}
     1802
     1803TEST(WebpagePreferences, UserExplicitlyPrefersColorSchemeDark)
     1804{
     1805    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     1806
     1807    configuration.get().defaultWebpagePreferences._colorSchemePreference = _WKWebsiteColorSchemePreferenceDark;
     1808
     1809    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
     1810
     1811    [webView loadTestPageNamed:@"color-scheme"];
     1812    [webView waitForMessage:@"dark-detected"];
     1813}
Note: See TracChangeset for help on using the changeset viewer.