Map CSS value ID to system color in the UI process
authorpvollan@apple.com <pvollan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 10 Jan 2020 23:39:54 +0000 (23:39 +0000)
committerpvollan@apple.com <pvollan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 10 Jan 2020 23:39:54 +0000 (23:39 +0000)
https://bugs.webkit.org/show_bug.cgi?id=204314

Reviewed by Dean Jackson.

Source/WebCore:

Currently, RenderThemeIOS is mapping CSS value IDs to system colors in the WebContent process. This mapping leads to
invoking selectors on UITraitCollection and UIColor, which will send messages to the runningboard daemon. Since we
will be blocking access to this daemon in the WebContent process, this mapping should be moved to the UI process.
The UI process will create a mapping between CSS value IDs and system colors, and pass it to the WebContent process.

Test: fast/css/ios/system-color-for-css-value.html

* WebCore.xcodeproj/project.pbxproj:
* css/StyleColor.h:
* css/parser/CSSPropertyParser.h:
* rendering/CSSValueKey.h: Added.
(WebCore::operator==):
(WebCore::CSSValueKey::encode const):
(WebCore::CSSValueKey::decode):
(WebCore::CSSValueKey::hash const):
(WTF::CSSValueKeyHash::hash):
(WTF::CSSValueKeyHash::equal):
(WTF::HashTraits<WebCore::CSSValueKey>::emptyValue):
(WTF::HashTraits<WebCore::CSSValueKey>::constructDeletedValue):
(WTF::HashTraits<WebCore::CSSValueKey>::isDeletedValue):
* rendering/RenderThemeIOS.h:
* rendering/RenderThemeIOS.mm:
(WebCore::cssValueIDSelectorList):
(WebCore::systemColorFromCSSValueID):
(WebCore::globalCSSValueToSystemColorMap):
(WebCore::RenderThemeIOS::getOrCreateCSSValueToSystemColorMap):
(WebCore::RenderThemeIOS::setCSSValueToSystemColorMap):
(WebCore::RenderThemeIOS::systemColor const):
* testing/Internals.cpp:
(WebCore::Internals::systemColorForCSSValue):
* testing/Internals.h:
* testing/Internals.idl:

Source/WebKit:

Create mapping between CSS value IDs and system colors in the UI process and send to the WebContent process
on process startup.

* Shared/WebProcessCreationParameters.cpp:
(WebKit::WebProcessCreationParameters::encode const):
(WebKit::WebProcessCreationParameters::decode):
* Shared/WebProcessCreationParameters.h:
* UIProcess/Cocoa/WebProcessPoolCocoa.mm:
(WebKit::WebProcessPool::platformInitializeWebProcess):
* WebProcess/cocoa/WebProcessCocoa.mm:
(WebKit::WebProcess::platformInitializeWebProcess):

LayoutTests:

* TestExpectations:
* fast/css/ios: Added.
* fast/css/ios/system-color-for-css-value-expected.txt: Added.
* fast/css/ios/system-color-for-css-value.html: Added.
* platform/ios/TestExpectations:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@254373 268f45cc-cd09-0410-ab3c-d52691b4dbfc

20 files changed:
LayoutTests/ChangeLog
LayoutTests/TestExpectations
LayoutTests/fast/css/ios/system-color-for-css-value-expected.txt [new file with mode: 0644]
LayoutTests/fast/css/ios/system-color-for-css-value.html [new file with mode: 0644]
LayoutTests/platform/ios/TestExpectations
Source/WebCore/ChangeLog
Source/WebCore/WebCore.xcodeproj/project.pbxproj
Source/WebCore/css/StyleColor.h
Source/WebCore/css/parser/CSSPropertyParser.h
Source/WebCore/rendering/CSSValueKey.h [new file with mode: 0644]
Source/WebCore/rendering/RenderThemeIOS.h
Source/WebCore/rendering/RenderThemeIOS.mm
Source/WebCore/testing/Internals.cpp
Source/WebCore/testing/Internals.h
Source/WebCore/testing/Internals.idl
Source/WebKit/ChangeLog
Source/WebKit/Shared/WebProcessCreationParameters.cpp
Source/WebKit/Shared/WebProcessCreationParameters.h
Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm
Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm

index f43c8b8..c6dd49a 100644 (file)
@@ -1,3 +1,16 @@
+2020-01-09  Per Arne Vollan  <pvollan@apple.com>
+
+        Map CSS value ID to system color in the UI process
+        https://bugs.webkit.org/show_bug.cgi?id=204314
+
+        Reviewed by Dean Jackson.
+
+        * TestExpectations:
+        * fast/css/ios: Added.
+        * fast/css/ios/system-color-for-css-value-expected.txt: Added.
+        * fast/css/ios/system-color-for-css-value.html: Added.
+        * platform/ios/TestExpectations:
+
 2020-01-10  Pablo Saavedra  <psaavedra@igalia.com>
 
         [WPE][GTK] Gardening after r254357
index e44aefd..bf443ab 100644 (file)
@@ -23,6 +23,7 @@ editing/pasteboard/gtk [ Skip ]
 editing/selection/ios [ Skip ]
 editing/undo-manager [ Skip ]
 tiled-drawing [ Skip ]
+fast/css/ios [ Skip ]
 fast/css/watchos [ Skip ]
 fast/dom/Window/watchos [ Skip ]
 fast/forms/select/mac-wk2 [ Skip ]
diff --git a/LayoutTests/fast/css/ios/system-color-for-css-value-expected.txt b/LayoutTests/fast/css/ios/system-color-for-css-value-expected.txt
new file mode 100644 (file)
index 0000000..29bb412
--- /dev/null
@@ -0,0 +1,41 @@
+Test that system colors for CSS values are correct.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS internals.systemColorForCSSValue('-apple-system-label', true, false) is 'rgb(255, 255, 255)'
+PASS internals.systemColorForCSSValue('-apple-system-header-text', true, false) is 'rgb(255, 255, 255)'
+PASS internals.systemColorForCSSValue('-apple-system-secondary-label', true, false) is 'rgba(235, 235, 245, 0.6)'
+PASS internals.systemColorForCSSValue('-apple-system-tertiary-label', true, false) is 'rgba(235, 235, 245, 0.298)'
+PASS internals.systemColorForCSSValue('-apple-system-quaternary-label', true, false) is 'rgba(235, 235, 245, 0.18)'
+PASS internals.systemColorForCSSValue('-apple-system-placeholder-text', true, false) is 'rgba(235, 235, 245, 0.298)'
+PASS internals.systemColorForCSSValue('-webkit-control-background', true, false) is 'rgb(0, 0, 0)'
+PASS internals.systemColorForCSSValue('-apple-system-control-background', true, false) is 'rgb(0, 0, 0)'
+PASS internals.systemColorForCSSValue('-apple-system-text-background', true, false) is 'rgb(0, 0, 0)'
+PASS internals.systemColorForCSSValue('-apple-system-background', true, false) is 'rgb(0, 0, 0)'
+PASS internals.systemColorForCSSValue('-apple-system-secondary-background', true, false) is 'rgb(28, 28, 30)'
+PASS internals.systemColorForCSSValue('-apple-system-tertiary-background', true, false) is 'rgb(44, 44, 46)'
+PASS internals.systemColorForCSSValue('-apple-system-grouped-background', true, false) is 'rgb(0, 0, 0)'
+PASS internals.systemColorForCSSValue('-apple-system-secondary-grouped-background', true, false) is 'rgb(28, 28, 30)'
+PASS internals.systemColorForCSSValue('-apple-system-tertiary-grouped-background', true, false) is 'rgb(44, 44, 46)'
+PASS internals.systemColorForCSSValue('-apple-system-grid', true, false) is 'rgba(84, 84, 88, 0.6)'
+PASS internals.systemColorForCSSValue('-apple-system-separator', true, false) is 'rgba(84, 84, 88, 0.6)'
+PASS internals.systemColorForCSSValue('-apple-system-container-border', true, false) is 'rgba(84, 84, 88, 0.6)'
+PASS internals.systemColorForCSSValue('-apple-system-selected-content-background', true, false) is 'rgb(58, 58, 60)'
+PASS internals.systemColorForCSSValue('-apple-system-unemphasized-selected-content-background', true, false) is 'rgb(58, 58, 60)'
+PASS internals.systemColorForCSSValue('-apple-system-brown', true, false) is 'rgb(172, 142, 104)'
+PASS internals.systemColorForCSSValue('-apple-system-indigo', true, false) is 'rgb(94, 92, 230)'
+PASS internals.systemColorForCSSValue('-apple-system-teal', true, false) is 'rgb(100, 210, 255)'
+PASS internals.systemColorForCSSValue('-apple-wireless-playback-target-active', true, false) is 'rgb(10, 132, 255)'
+PASS internals.systemColorForCSSValue('-apple-system-blue', true, false) is 'rgb(10, 132, 255)'
+PASS internals.systemColorForCSSValue('-apple-system-gray', true, false) is 'rgb(142, 142, 147)'
+PASS internals.systemColorForCSSValue('-apple-system-green', true, false) is 'rgb(48, 209, 88)'
+PASS internals.systemColorForCSSValue('-apple-system-orange', true, false) is 'rgb(255, 159, 10)'
+PASS internals.systemColorForCSSValue('-apple-system-pink', true, false) is 'rgb(255, 55, 95)'
+PASS internals.systemColorForCSSValue('-apple-system-purple', true, false) is 'rgb(191, 90, 242)'
+PASS internals.systemColorForCSSValue('-apple-system-red', true, false) is 'rgb(255, 69, 58)'
+PASS internals.systemColorForCSSValue('-apple-system-yellow', true, false) is 'rgb(255, 214, 10)'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/css/ios/system-color-for-css-value.html b/LayoutTests/fast/css/ios/system-color-for-css-value.html
new file mode 100644 (file)
index 0000000..85aaf41
--- /dev/null
@@ -0,0 +1,49 @@
+<html>
+<head id="head">
+<script src="../../../resources/js-test-pre.js"></script>
+</head>
+<body >
+<script>
+    
+description("Test that system colors for CSS values are correct.");
+
+if (window.internals) {
+    shouldBe("internals.systemColorForCSSValue('-apple-system-label', true, false)", "'rgb(255, 255, 255)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-header-text', true, false)", "'rgb(255, 255, 255)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-secondary-label', true, false)", "'rgba(235, 235, 245, 0.6)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-tertiary-label', true, false)", "'rgba(235, 235, 245, 0.298)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-quaternary-label', true, false)", "'rgba(235, 235, 245, 0.18)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-placeholder-text', true, false)", "'rgba(235, 235, 245, 0.298)'");
+    shouldBe("internals.systemColorForCSSValue('-webkit-control-background', true, false)", "'rgb(0, 0, 0)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-control-background', true, false)", "'rgb(0, 0, 0)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-text-background', true, false)", "'rgb(0, 0, 0)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-background', true, false)", "'rgb(0, 0, 0)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-secondary-background', true, false)", "'rgb(28, 28, 30)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-tertiary-background', true, false)", "'rgb(44, 44, 46)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-grouped-background', true, false)", "'rgb(0, 0, 0)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-secondary-grouped-background', true, false)", "'rgb(28, 28, 30)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-tertiary-grouped-background', true, false)", "'rgb(44, 44, 46)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-grid', true, false)", "'rgba(84, 84, 88, 0.6)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-separator', true, false)", "'rgba(84, 84, 88, 0.6)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-container-border', true, false)", "'rgba(84, 84, 88, 0.6)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-selected-content-background', true, false)", "'rgb(58, 58, 60)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-unemphasized-selected-content-background', true, false)", "'rgb(58, 58, 60)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-brown', true, false)", "'rgb(172, 142, 104)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-indigo', true, false)", "'rgb(94, 92, 230)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-teal', true, false)", "'rgb(100, 210, 255)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-wireless-playback-target-active', true, false)", "'rgb(10, 132, 255)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-blue', true, false)", "'rgb(10, 132, 255)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-gray', true, false)", "'rgb(142, 142, 147)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-green', true, false)", "'rgb(48, 209, 88)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-orange', true, false)", "'rgb(255, 159, 10)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-pink', true, false)", "'rgb(255, 55, 95)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-purple', true, false)", "'rgb(191, 90, 242)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-red', true, false)", "'rgb(255, 69, 58)'");
+    shouldBe("internals.systemColorForCSSValue('-apple-system-yellow', true, false)", "'rgb(255, 214, 10)'");
+}
+
+</script>
+
+<script src="../../../resources/js-test-post.js"></script>
+</body>
+</html>
index 827beaf..f7679ee 100644 (file)
@@ -13,6 +13,7 @@ media/ios [ Pass ]
 quicklook [ Pass ]
 swipe [ Pass ]
 
+fast/css/ios [ Pass ]
 fast/media/ios [ Pass ]
 
 fast/forms/textarea/ios [ Pass ]
@@ -3458,4 +3459,4 @@ webkit.org/b/203416 imported/w3c/web-platform-tests/css/css-transitions/properti
 
 webkit.org/b/204757 imported/w3c/web-platform-tests/fetch/api/request/destination/fetch-destination-no-load-event.https.html [ Pass Failure ]
 
-webkit.org/b/205309 scrollingcoordinator/ios/scroll-position-after-reattach.html [ ImageonlyFailure ]
\ No newline at end of file
+webkit.org/b/205309 scrollingcoordinator/ios/scroll-position-after-reattach.html [ ImageOnlyFailure ]
index bbb091c..4a4b180 100644 (file)
@@ -1,3 +1,43 @@
+2020-01-09  Per Arne Vollan  <pvollan@apple.com>
+
+        Map CSS value ID to system color in the UI process
+        https://bugs.webkit.org/show_bug.cgi?id=204314
+
+        Reviewed by Dean Jackson.
+
+        Currently, RenderThemeIOS is mapping CSS value IDs to system colors in the WebContent process. This mapping leads to
+        invoking selectors on UITraitCollection and UIColor, which will send messages to the runningboard daemon. Since we
+        will be blocking access to this daemon in the WebContent process, this mapping should be moved to the UI process.
+        The UI process will create a mapping between CSS value IDs and system colors, and pass it to the WebContent process.
+
+        Test: fast/css/ios/system-color-for-css-value.html
+
+        * WebCore.xcodeproj/project.pbxproj:
+        * css/StyleColor.h:
+        * css/parser/CSSPropertyParser.h:
+        * rendering/CSSValueKey.h: Added.
+        (WebCore::operator==):
+        (WebCore::CSSValueKey::encode const):
+        (WebCore::CSSValueKey::decode):
+        (WebCore::CSSValueKey::hash const):
+        (WTF::CSSValueKeyHash::hash):
+        (WTF::CSSValueKeyHash::equal):
+        (WTF::HashTraits<WebCore::CSSValueKey>::emptyValue):
+        (WTF::HashTraits<WebCore::CSSValueKey>::constructDeletedValue):
+        (WTF::HashTraits<WebCore::CSSValueKey>::isDeletedValue):
+        * rendering/RenderThemeIOS.h:
+        * rendering/RenderThemeIOS.mm:
+        (WebCore::cssValueIDSelectorList):
+        (WebCore::systemColorFromCSSValueID):
+        (WebCore::globalCSSValueToSystemColorMap):
+        (WebCore::RenderThemeIOS::getOrCreateCSSValueToSystemColorMap):
+        (WebCore::RenderThemeIOS::setCSSValueToSystemColorMap):
+        (WebCore::RenderThemeIOS::systemColor const):
+        * testing/Internals.cpp:
+        (WebCore::Internals::systemColorForCSSValue):
+        * testing/Internals.h:
+        * testing/Internals.idl:
+
 2020-01-10  Antti Koivisto  <antti@apple.com>
 
         [LFC][Integration] Fix accessibility/deleting-iframe-destroys-axcache.html and accessibility/div-within-anchors-causes-crash.html
index 6e28b57..9bb8431 100644 (file)
                E3B2F0ED1D7F4CA300B0C9D1 /* LoadableScript.h in Headers */ = {isa = PBXBuildFile; fileRef = E3B2F0E71D7F35EC00B0C9D1 /* LoadableScript.h */; settings = {ATTRIBUTES = (Private, ); }; };
                E3B2F0EE1D7F4CA900B0C9D1 /* LoadableScriptClient.h in Headers */ = {isa = PBXBuildFile; fileRef = E3B2F0E81D7F35EC00B0C9D1 /* LoadableScriptClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
                E3B2F0F01D7F4CB500B0C9D1 /* LoadableClassicScript.h in Headers */ = {isa = PBXBuildFile; fileRef = E3B2F0E41D7F35EC00B0C9D1 /* LoadableClassicScript.h */; settings = {ATTRIBUTES = (Private, ); }; };
+               E3BBC24723835526006EC39F /* CSSValueKey.h in Headers */ = {isa = PBXBuildFile; fileRef = E3BBC2452383551A006EC39F /* CSSValueKey.h */; settings = {ATTRIBUTES = (Private, ); }; };
                E3C99A091DC3D41C00794AD3 /* DOMJITCheckDOM.h in Headers */ = {isa = PBXBuildFile; fileRef = E3C99A081DC3D41700794AD3 /* DOMJITCheckDOM.h */; };
                E3C9AECB2113149900419B92 /* JSMicrotaskCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = E3C9AEC92113147400419B92 /* JSMicrotaskCallback.h */; };
                E3E4E2A81E3B17100023BB8A /* ScriptElementCachedScriptFetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = E3E4E2A61E3B16FC0023BB8A /* ScriptElementCachedScriptFetcher.h */; settings = {ATTRIBUTES = (Private, ); }; };
                E3B2F0E81D7F35EC00B0C9D1 /* LoadableScriptClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LoadableScriptClient.h; sourceTree = "<group>"; };
                E3B2F0E91D7F3D3C00B0C9D1 /* LoadableScript.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LoadableScript.cpp; sourceTree = "<group>"; };
                E3B7C0621DC3415A001FB0B8 /* JSDocumentDOMJIT.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDocumentDOMJIT.cpp; sourceTree = "<group>"; };
+               E3BBC2452383551A006EC39F /* CSSValueKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSValueKey.h; sourceTree = "<group>"; };
                E3BC827322530221005276DE /* NodeList.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = NodeList.cpp; sourceTree = "<group>"; };
                E3BF19E122AF2F55009C9926 /* XMLHttpRequestProgressEvent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = XMLHttpRequestProgressEvent.cpp; sourceTree = "<group>"; };
                E3BF19E322AF2FA5009C9926 /* OverconstrainedErrorEvent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = OverconstrainedErrorEvent.cpp; sourceTree = "<group>"; };
                                9392F14B0AD1861B00691BD4 /* CounterNode.h */,
                                0F53FB81213B1BB800C40D34 /* CSSFilter.cpp */,
                                0F53FB83213B1BB800C40D34 /* CSSFilter.h */,
+                               E3BBC2452383551A006EC39F /* CSSValueKey.h */,
                                A8CFF6CA0A1561CD000A4234 /* EllipsisBox.cpp */,
                                A8CFF6BD0A156118000A4234 /* EllipsisBox.h */,
                                E4A8D21522578DA000A8463C /* EventRegion.cpp */,
                                DD7CDF250A23CF9800069928 /* CSSUnknownRule.h in Headers */,
                                BC7D8FF01BD03B6400FFE540 /* CSSUnsetValue.h in Headers */,
                                A80E6CEE0A1989CA007FB8C5 /* CSSValue.h in Headers */,
+                               E3BBC24723835526006EC39F /* CSSValueKey.h in Headers */,
                                6565815109D13043000E61D7 /* CSSValueKeywords.h in Headers */,
                                A80E6CE90A1989CA007FB8C5 /* CSSValueList.h in Headers */,
                                E49BD9FA131FD2ED003C56F0 /* CSSValuePool.h in Headers */,
index 1448ade..800343a 100644 (file)
@@ -60,7 +60,7 @@ public:
 
     static Color colorFromKeyword(CSSValueID, OptionSet<Options>);
     static bool isColorKeyword(CSSValueID);
-    static bool isSystemColor(CSSValueID);
+    WEBCORE_EXPORT static bool isSystemColor(CSSValueID);
 
 private:
     Color m_color;
index c67c202..b7e19fb 100644 (file)
@@ -122,7 +122,7 @@ private:
 };
 
 CSSPropertyID cssPropertyID(StringView);
-CSSValueID cssValueKeywordID(StringView);
+WEBCORE_EXPORT CSSValueID cssValueKeywordID(StringView);
 bool isCustomPropertyName(const String&);
 
 #if PLATFORM(IOS_FAMILY)
diff --git a/Source/WebCore/rendering/CSSValueKey.h b/Source/WebCore/rendering/CSSValueKey.h
new file mode 100644 (file)
index 0000000..af8cab7
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2020 Apple Inc. 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 APPLE INC. AND ITS 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 APPLE INC. OR ITS 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 "CSSValueKeywords.h"
+
+namespace WebCore {
+
+struct CSSValueKey {
+
+    unsigned hash() const;
+
+    template<class Encoder> void encode(Encoder&) const;
+    template<class Decoder> static Optional<CSSValueKey> decode(Decoder&);
+
+    unsigned cssValueID;
+    bool useDarkAppearance;
+    bool useElevatedUserInterfaceLevel;
+};
+
+inline bool operator==(const CSSValueKey& a, const CSSValueKey& b)
+{
+    return a.cssValueID == b.cssValueID && a.useDarkAppearance == b.useDarkAppearance && a.useElevatedUserInterfaceLevel == b.useElevatedUserInterfaceLevel;
+}
+
+template<class Encoder>
+void CSSValueKey::encode(Encoder& encoder) const
+{
+    encoder << cssValueID;
+    encoder << useDarkAppearance;
+    encoder << useElevatedUserInterfaceLevel;
+}
+
+template<class Decoder>
+Optional<CSSValueKey> CSSValueKey::decode(Decoder& decoder)
+{
+    Optional<unsigned> cssValueID;
+    decoder >> cssValueID;
+    if (!cssValueID)
+        return WTF::nullopt;
+    Optional<bool> useDarkAppearance;
+    decoder >> useDarkAppearance;
+    if (!useDarkAppearance)
+        return WTF::nullopt;
+    Optional<bool> useElevatedUserInterfaceLevel;
+    decoder >> useElevatedUserInterfaceLevel;
+    if (!useElevatedUserInterfaceLevel)
+        return WTF::nullopt;
+    return { { WTFMove(*cssValueID), WTFMove(*useDarkAppearance), WTFMove(*useElevatedUserInterfaceLevel) } };
+}
+
+inline unsigned CSSValueKey::hash() const
+{
+    return cssValueID;
+}
+
+} // namespace WebCore
+
+namespace WTF {
+
+struct CSSValueKeyHash {
+    static unsigned hash(const WebCore::CSSValueKey& key) { return key.hash(); }
+    static bool equal(const WebCore::CSSValueKey& a, const WebCore::CSSValueKey& b) { return a == b; }
+    static const bool safeToCompareToEmptyOrDeleted = true;
+};
+
+template<> struct HashTraits<WebCore::CSSValueKey> : GenericHashTraits<WebCore::CSSValueKey> {
+    static WebCore::CSSValueKey emptyValue() { return WebCore::CSSValueKey { WebCore::CSSValueInvalid, false, false}; }
+    static void constructDeletedValue(WebCore::CSSValueKey& slot) { slot = WebCore::CSSValueKey { WebCore::CSSValueInvalid, true, true};}
+    static bool isDeletedValue(const WebCore::CSSValueKey& slot) { return slot.cssValueID == WebCore::CSSValueInvalid && slot.useDarkAppearance && slot.useElevatedUserInterfaceLevel; }
+};
+
+template<> struct DefaultHash<WebCore::CSSValueKey> {
+    typedef CSSValueKeyHash Hash;
+};
+
+} // namespace WTF
index 9362cb8..a432c8b 100644 (file)
@@ -27,6 +27,7 @@
 
 #if PLATFORM(IOS_FAMILY)
 
+#include "CSSValueKey.h"
 #include "RenderThemeCocoa.h"
 
 #if USE(SYSTEM_PREVIEW)
@@ -59,6 +60,11 @@ public:
     void paintSystemPreviewBadge(Image&, const PaintInfo&, const FloatRect&) override;
 #endif
 
+    using CSSValueToSystemColorMap = HashMap<CSSValueKey, Color>;
+
+    WEBCORE_EXPORT static const CSSValueToSystemColorMap& cssValueToSystemColorMap();
+    WEBCORE_EXPORT static void setCSSValueToSystemColorMap(CSSValueToSystemColorMap&&);
+    
 protected:
     LengthBox popupInternalPaddingBox(const RenderStyle&) const override;
     
index e28c9c8..51835e4 100644 (file)
@@ -31,6 +31,7 @@
 #import "BitmapImage.h"
 #import "CSSPrimitiveValue.h"
 #import "CSSToLengthConversionData.h"
+#import "CSSValueKey.h"
 #import "CSSValueKeywords.h"
 #import "ColorIOS.h"
 #import "DateComponents.h"
@@ -1430,6 +1431,113 @@ String RenderThemeIOS::mediaControlsBase64StringForIconNameAndType(const String&
 
 #endif // ENABLE(VIDEO)
 
+struct CSSValueIDAndSelector {
+    CSSValueID cssValueID;
+    SEL selector;
+};
+
+static const Vector<CSSValueIDAndSelector>& cssValueIDSelectorList()
+{
+    static NeverDestroyed<Vector<CSSValueIDAndSelector>> cssValueIDSelectorList;
+
+    static std::once_flag initializeOnce;
+    std::call_once(
+        initializeOnce,
+        [] {
+        cssValueIDSelectorList.get() = Vector(std::initializer_list<CSSValueIDAndSelector> {
+#if HAVE(OS_DARK_MODE_SUPPORT)
+            { CSSValueText, @selector(labelColor) },
+            { CSSValueAppleSystemLabel, @selector(labelColor) },
+            { CSSValueAppleSystemHeaderText, @selector(labelColor) },
+            { CSSValueAppleSystemSecondaryLabel, @selector(secondaryLabelColor) },
+            { CSSValueAppleSystemTertiaryLabel, @selector(tertiaryLabelColor) },
+            { CSSValueAppleSystemQuaternaryLabel, @selector(quaternaryLabelColor) },
+            { CSSValueAppleSystemPlaceholderText, @selector(placeholderTextColor) },
+            { CSSValueWebkitControlBackground, @selector(systemBackgroundColor) },
+            { CSSValueAppleSystemControlBackground, @selector(systemBackgroundColor) },
+            { CSSValueAppleSystemTextBackground, @selector(systemBackgroundColor) },
+            { CSSValueAppleSystemBackground, @selector(systemBackgroundColor) },
+            { CSSValueAppleSystemSecondaryBackground, @selector(secondarySystemBackgroundColor) },
+            { CSSValueAppleSystemTertiaryBackground, @selector(tertiarySystemBackgroundColor) },
+            { CSSValueAppleSystemGroupedBackground, @selector(systemGroupedBackgroundColor) },
+            { CSSValueAppleSystemSecondaryGroupedBackground, @selector(secondarySystemGroupedBackgroundColor) },
+            { CSSValueAppleSystemTertiaryGroupedBackground, @selector(tertiarySystemGroupedBackgroundColor) },
+            { CSSValueAppleSystemGrid, @selector(separatorColor) },
+            { CSSValueAppleSystemSeparator, @selector(separatorColor) },
+            { CSSValueAppleSystemContainerBorder, @selector(separatorColor) },
+            { CSSValueAppleSystemSelectedContentBackground, @selector(tableCellDefaultSelectionTintColor) },
+            { CSSValueAppleSystemUnemphasizedSelectedContentBackground, @selector(tableCellDefaultSelectionTintColor) },
+            { CSSValueAppleSystemBrown, @selector(systemBrownColor) },
+            { CSSValueAppleSystemIndigo, @selector(systemIndigoColor) },
+#endif
+            { CSSValueAppleSystemTeal, @selector(systemTealColor) },
+            { CSSValueAppleWirelessPlaybackTargetActive, @selector(systemBlueColor) },
+            { CSSValueAppleSystemBlue, @selector(systemBlueColor) },
+            { CSSValueAppleSystemGray, @selector(systemGrayColor) },
+            { CSSValueAppleSystemGreen, @selector(systemGreenColor) },
+            { CSSValueAppleSystemOrange, @selector(systemOrangeColor) },
+            { CSSValueAppleSystemPink, @selector(systemPinkColor) },
+            { CSSValueAppleSystemPurple, @selector(systemPurpleColor) },
+            { CSSValueAppleSystemRed, @selector(systemRedColor) },
+            { CSSValueAppleSystemYellow, @selector(systemYellowColor) }
+        });
+    });
+
+    return cssValueIDSelectorList;
+}
+
+static Optional<Color> systemColorFromCSSValueID(CSSValueID cssValueID, bool useDarkAppearance, bool useElevatedUserInterfaceLevel)
+{
+    LocalCurrentTraitCollection localTraitCollection(useDarkAppearance, useElevatedUserInterfaceLevel);
+
+    auto cssColorToSelector = [cssValueID] () -> SEL {
+        for (auto& cssValueIDSelector : cssValueIDSelectorList()) {
+            if (cssValueIDSelector.cssValueID == cssValueID)
+                return cssValueIDSelector.selector;
+        }
+        return nullptr;
+    };
+
+    if (auto selector = cssColorToSelector()) {
+        if (auto color = wtfObjCMsgSend<UIColor *>(PAL::getUIColorClass(), selector))
+            return Color(color.CGColor, Color::Semantic);
+    }
+    return WTF::nullopt;
+}
+
+
+static RenderThemeIOS::CSSValueToSystemColorMap& globalCSSValueToSystemColorMap()
+{
+    static NeverDestroyed<RenderThemeIOS::CSSValueToSystemColorMap> colorMap;
+    return colorMap;
+}
+
+const RenderThemeIOS::CSSValueToSystemColorMap& RenderThemeIOS::cssValueToSystemColorMap()
+{
+    static NeverDestroyed<CSSValueToSystemColorMap> map;
+
+    static std::once_flag onceFlag;
+    std::call_once(
+        onceFlag,
+        [] {
+        for (auto& cssValueIDSelector : cssValueIDSelectorList()) {
+            for (bool useDarkAppearance : { false, true }) {
+                for (bool useElevatedUserInterfaceLevel : { false, true }) {
+                    if (auto color = systemColorFromCSSValueID(cssValueIDSelector.cssValueID, useDarkAppearance, useElevatedUserInterfaceLevel))
+                        map.get().add(CSSValueKey { cssValueIDSelector.cssValueID, useDarkAppearance, useElevatedUserInterfaceLevel }, *color);
+                }
+            }
+        }
+    });
+
+    return map;
+}
+
+void RenderThemeIOS::setCSSValueToSystemColorMap(CSSValueToSystemColorMap&& colorMap)
+{
+    globalCSSValueToSystemColorMap() = WTFMove(colorMap);
+}
+
 Color RenderThemeIOS::systemColor(CSSValueID cssValueID, OptionSet<StyleColor::Options> options) const
 {
     const bool forVisitedLink = options.contains(StyleColor::Options::ForVisitedLink);
@@ -1446,79 +1554,15 @@ Color RenderThemeIOS::systemColor(CSSValueID cssValueID, OptionSet<StyleColor::O
     return cache.systemStyleColors.ensure(cssValueID, [this, cssValueID, options] () -> Color {
         const bool useDarkAppearance = options.contains(StyleColor::Options::UseDarkAppearance);
         const bool useElevatedUserInterfaceLevel = options.contains(StyleColor::Options::UseElevatedUserInterfaceLevel);
-        LocalCurrentTraitCollection localTraitCollection(useDarkAppearance, useElevatedUserInterfaceLevel);
-
-        auto cssColorToSelector = [cssValueID] () -> SEL {
-            switch (cssValueID) {
-#if HAVE(OS_DARK_MODE_SUPPORT)
-            case CSSValueText:
-            case CSSValueAppleSystemLabel:
-            case CSSValueAppleSystemHeaderText:
-                return @selector(labelColor);
-            case CSSValueAppleSystemSecondaryLabel:
-                return @selector(secondaryLabelColor);
-            case CSSValueAppleSystemTertiaryLabel:
-                return @selector(tertiaryLabelColor);
-            case CSSValueAppleSystemQuaternaryLabel:
-                return @selector(quaternaryLabelColor);
-            case CSSValueAppleSystemPlaceholderText:
-                return @selector(placeholderTextColor);
-            case CSSValueWebkitControlBackground:
-            case CSSValueAppleSystemControlBackground:
-            case CSSValueAppleSystemTextBackground:
-            case CSSValueAppleSystemBackground:
-                return @selector(systemBackgroundColor);
-            case CSSValueAppleSystemSecondaryBackground:
-                return @selector(secondarySystemBackgroundColor);
-            case CSSValueAppleSystemTertiaryBackground:
-                return @selector(tertiarySystemBackgroundColor);
-            case CSSValueAppleSystemGroupedBackground:
-                return @selector(systemGroupedBackgroundColor);
-            case CSSValueAppleSystemSecondaryGroupedBackground:
-                return @selector(secondarySystemGroupedBackgroundColor);
-            case CSSValueAppleSystemTertiaryGroupedBackground:
-                return @selector(tertiarySystemGroupedBackgroundColor);
-            case CSSValueAppleSystemGrid:
-            case CSSValueAppleSystemSeparator:
-            case CSSValueAppleSystemContainerBorder:
-                return @selector(separatorColor);
-            case CSSValueAppleSystemSelectedContentBackground:
-            case CSSValueAppleSystemUnemphasizedSelectedContentBackground:
-                return @selector(tableCellDefaultSelectionTintColor);
-            case CSSValueAppleSystemBrown:
-                return @selector(systemBrownColor);
-            case CSSValueAppleSystemIndigo:
-                return @selector(systemIndigoColor);
-#endif
-            case CSSValueAppleSystemTeal:
-                return @selector(systemTealColor);
-            case CSSValueAppleWirelessPlaybackTargetActive:
-            case CSSValueAppleSystemBlue:
-                return @selector(systemBlueColor);
-            case CSSValueAppleSystemGray:
-                return @selector(systemGrayColor);
-            case CSSValueAppleSystemGreen:
-                return @selector(systemGreenColor);
-            case CSSValueAppleSystemOrange:
-                return @selector(systemOrangeColor);
-            case CSSValueAppleSystemPink:
-                return @selector(systemPinkColor);
-            case CSSValueAppleSystemPurple:
-                return @selector(systemPurpleColor);
-            case CSSValueAppleSystemRed:
-                return @selector(systemRedColor);
-            case CSSValueAppleSystemYellow:
-                return @selector(systemYellowColor);
-            default:
-                return nullptr;
-            }
-        };
-
-        if (auto selector = cssColorToSelector()) {
-            if (auto color = wtfObjCMsgSend<UIColor *>(PAL::getUIColorClass(), selector))
-                return Color(color.CGColor, Color::Semantic);
+        if (!globalCSSValueToSystemColorMap().isEmpty()) {
+            auto it = globalCSSValueToSystemColorMap().find(CSSValueKey { cssValueID, useDarkAppearance, useElevatedUserInterfaceLevel });
+            if (it == globalCSSValueToSystemColorMap().end())
+                return RenderTheme::systemColor(cssValueID, options);
+            return Color(it->value.rgb(), Color::Semantic);
         }
-
+        auto color = systemColorFromCSSValueID(cssValueID, useDarkAppearance, useElevatedUserInterfaceLevel);
+        if (color)
+            return *color;
         return RenderTheme::systemColor(cssValueID, options);
     }).iterator->value;
 }
index 73a235d..c2b2044 100644 (file)
@@ -39,6 +39,7 @@
 #include "CSSAnimationController.h"
 #include "CSSKeyframesRule.h"
 #include "CSSMediaRule.h"
+#include "CSSPropertyParser.h"
 #include "CSSStyleRule.h"
 #include "CSSSupportsRule.h"
 #include "CacheStorageConnection.h"
 #include "RenderLayerBacking.h"
 #include "RenderLayerCompositor.h"
 #include "RenderMenuList.h"
+#include "RenderTheme.h"
 #include "RenderTreeAsText.h"
 #include "RenderView.h"
 #include "RenderedDocumentMarker.h"
@@ -5419,4 +5421,18 @@ String Internals::windowLocationHost(DOMWindow& window)
     return window.location().host();
 }
 
+String Internals::systemColorForCSSValue(const String& cssValue, bool useDarkModeAppearance, bool useElevatedUserInterfaceLevel)
+{
+    CSSValueID id = cssValueKeywordID(cssValue);
+    RELEASE_ASSERT(StyleColor::isSystemColor(id));
+
+    OptionSet<StyleColor::Options> options;
+    if (useDarkModeAppearance)
+        options.add(StyleColor::Options::UseDarkAppearance);
+    if (useElevatedUserInterfaceLevel)
+        options.add(StyleColor::Options::UseElevatedUserInterfaceLevel);
+    
+    return RenderTheme::singleton().systemColor(id, options).cssText();
+}
+
 } // namespace WebCore
index 3b1902e..5bdb0e3 100644 (file)
@@ -924,6 +924,8 @@ public:
 
     String windowLocationHost(DOMWindow&);
 
+    String systemColorForCSSValue(const String& cssValue, bool useDarkModeAppearance, bool useElevatedUserInterfaceLevel);
+
 private:
     explicit Internals(Document&);
     Document* contextDocument() const;
index b598218..119e40f 100644 (file)
@@ -831,4 +831,6 @@ enum CompositingPolicy {
 
     boolean hasSandboxMachLookupAccessToGlobalName(DOMString process, DOMString service);
     boolean hasSandboxMachLookupAccessToXPCServiceName(DOMString process, DOMString service);
+    
+    DOMString systemColorForCSSValue(DOMString cssValue, boolean useDarkModeAppearance, boolean useElevatedUserInterfaceLevel);
 };
index 5181d04..2e38cf0 100644 (file)
@@ -1,3 +1,22 @@
+2020-01-09  Per Arne Vollan  <pvollan@apple.com>
+
+        Map CSS value ID to system color in the UI process
+        https://bugs.webkit.org/show_bug.cgi?id=204314
+
+        Reviewed by Dean Jackson.
+
+        Create mapping between CSS value IDs and system colors in the UI process and send to the WebContent process
+        on process startup.
+
+        * Shared/WebProcessCreationParameters.cpp:
+        (WebKit::WebProcessCreationParameters::encode const):
+        (WebKit::WebProcessCreationParameters::decode):
+        * Shared/WebProcessCreationParameters.h:
+        * UIProcess/Cocoa/WebProcessPoolCocoa.mm:
+        (WebKit::WebProcessPool::platformInitializeWebProcess):
+        * WebProcess/cocoa/WebProcessCocoa.mm:
+        (WebKit::WebProcess::platformInitializeWebProcess):
+
 2020-01-10  Mark Lam  <mark.lam@apple.com>
 
         Gardening: simple build fix after r254119.
index 13ab091..3d35dc7 100644 (file)
@@ -170,6 +170,7 @@ void WebProcessCreationParameters::encode(IPC::Encoder& encoder) const
 
 #if PLATFORM(IOS_FAMILY)
     encoder << currentUserInterfaceIdiomIsPad;
+    encoder << cssValueToSystemColorMap;
 #endif
 }
 
@@ -437,6 +438,12 @@ bool WebProcessCreationParameters::decode(IPC::Decoder& decoder, WebProcessCreat
 #if PLATFORM(IOS_FAMILY)
     if (!decoder.decode(parameters.currentUserInterfaceIdiomIsPad))
         return false;
+
+    Optional<WebCore::RenderThemeIOS::CSSValueToSystemColorMap> cssValueToSystemColorMap;
+    decoder >> cssValueToSystemColorMap;
+    if (!cssValueToSystemColorMap)
+        return false;
+    parameters.cssValueToSystemColorMap = WTFMove(*cssValueToSystemColorMap);
 #endif
 
     return true;
index 1511578..496cfc9 100644 (file)
 #include <WebCore/SoupNetworkProxySettings.h>
 #endif
 
+#if PLATFORM(IOS_FAMILY)
+#include <WebCore/RenderThemeIOS.h>
+#endif
+
 namespace API {
 class Data;
 }
@@ -208,6 +212,7 @@ struct WebProcessCreationParameters {
 
 #if PLATFORM(IOS_FAMILY)
     bool currentUserInterfaceIdiomIsPad { false };
+    WebCore::RenderThemeIOS::CSSValueToSystemColorMap cssValueToSystemColorMap;
 #endif
 };
 
index b3c1132..fae64f8 100644 (file)
@@ -353,6 +353,7 @@ void WebProcessPool::platformInitializeWebProcess(const WebProcessProxy& process
     
 #if PLATFORM(IOS_FAMILY)
     parameters.currentUserInterfaceIdiomIsPad = currentUserInterfaceIdiomIsPad();
+    parameters.cssValueToSystemColorMap = RenderThemeIOS::cssValueToSystemColorMap();
 #endif
 }
 
index 776e248..67e9886 100644 (file)
@@ -259,6 +259,10 @@ void WebProcess::platformInitializeWebProcess(WebProcessCreationParameters& para
         SandboxExtension::consumePermanently(*parameters.neSessionManagerExtensionHandle);
     NetworkExtensionContentFilter::setHasConsumedSandboxExtensions(parameters.neHelperExtensionHandle.hasValue() && parameters.neSessionManagerExtensionHandle.hasValue());
 #endif
+
+#if PLATFORM(IOS_FAMILY)
+    RenderThemeIOS::setCSSValueToSystemColorMap(WTFMove(parameters.cssValueToSystemColorMap));
+#endif
 }
 
 void WebProcess::platformSetWebsiteDataStoreParameters(WebProcessDataStoreParameters&& parameters)