Changeset 253530 in webkit


Ignore:
Timestamp:
Dec 14, 2019 3:37:15 PM (4 years ago)
Author:
pvollan@apple.com
Message:

Map CSS value ID to system color in the UI process
https://bugs.webkit.org/show_bug.cgi?id=204314
<rdar://problem/57295392>
Source/WebCore:

Reviewed by Brent Fulgham.

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.

No new tests, covered by existing tests.

  • WebCore.xcodeproj/project.pbxproj:
  • 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::createCSSValueToSystemColorMap):
(WebCore::RenderThemeIOS::setCSSValueToSystemColorMap):
(WebCore::RenderThemeIOS::systemColor const):

Source/WebKit:

Reviewed by Brent Fulgham.

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

No new tests, covered by existing tests.

  • 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):

Location:
trunk/Source
Files:
1 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r253526 r253530  
     12019-12-14  Per Arne Vollan  <pvollan@apple.com>
     2
     3        Map CSS value ID to system color in the UI process
     4        https://bugs.webkit.org/show_bug.cgi?id=204314
     5        <rdar://problem/57295392>
     6
     7        Reviewed by Brent Fulgham.
     8
     9        Currently, RenderThemeIOS is mapping CSS value IDs to system colors in the WebContent process. This mapping leads to
     10        invoking selectors on UITraitCollection and UIColor, which will send messages to the runningboard daemon. Since we
     11        will be blocking access to this daemon in the WebContent process, this mapping should be moved to the UI process.
     12        The UI process will create a mapping between CSS value IDs and system colors, and pass it to the WebContent process.
     13
     14        No new tests, covered by existing tests.
     15
     16        * WebCore.xcodeproj/project.pbxproj:
     17        * rendering/CSSValueKey.h: Added.
     18        (WebCore::operator==):
     19        (WebCore::CSSValueKey::encode const):
     20        (WebCore::CSSValueKey::decode):
     21        (WebCore::CSSValueKey::hash const):
     22        (WTF::CSSValueKeyHash::hash):
     23        (WTF::CSSValueKeyHash::equal):
     24        (WTF::HashTraits<WebCore::CSSValueKey>::emptyValue):
     25        (WTF::HashTraits<WebCore::CSSValueKey>::constructDeletedValue):
     26        (WTF::HashTraits<WebCore::CSSValueKey>::isDeletedValue):
     27        * rendering/RenderThemeIOS.h:
     28        * rendering/RenderThemeIOS.mm:
     29        (WebCore::cssValueIDSelectorList):
     30        (WebCore::systemColorFromCSSValueID):
     31        (WebCore::globalCSSValueToSystemColorMap):
     32        (WebCore::RenderThemeIOS::createCSSValueToSystemColorMap):
     33        (WebCore::RenderThemeIOS::setCSSValueToSystemColorMap):
     34        (WebCore::RenderThemeIOS::systemColor const):
     35
    1362019-12-14  Zalan Bujtas  <zalan@apple.com>
    237
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r253497 r253530  
    47954795                E3B2F0EE1D7F4CA900B0C9D1 /* LoadableScriptClient.h in Headers */ = {isa = PBXBuildFile; fileRef = E3B2F0E81D7F35EC00B0C9D1 /* LoadableScriptClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
    47964796                E3B2F0F01D7F4CB500B0C9D1 /* LoadableClassicScript.h in Headers */ = {isa = PBXBuildFile; fileRef = E3B2F0E41D7F35EC00B0C9D1 /* LoadableClassicScript.h */; settings = {ATTRIBUTES = (Private, ); }; };
     4797                E3BBC24723835526006EC39F /* CSSValueKey.h in Headers */ = {isa = PBXBuildFile; fileRef = E3BBC2452383551A006EC39F /* CSSValueKey.h */; settings = {ATTRIBUTES = (Private, ); }; };
    47974798                E3C99A091DC3D41C00794AD3 /* DOMJITCheckDOM.h in Headers */ = {isa = PBXBuildFile; fileRef = E3C99A081DC3D41700794AD3 /* DOMJITCheckDOM.h */; };
    47984799                E3C9AECB2113149900419B92 /* JSMicrotaskCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = E3C9AEC92113147400419B92 /* JSMicrotaskCallback.h */; };
     
    1512815129                E3B2F0E91D7F3D3C00B0C9D1 /* LoadableScript.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LoadableScript.cpp; sourceTree = "<group>"; };
    1512915130                E3B7C0621DC3415A001FB0B8 /* JSDocumentDOMJIT.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDocumentDOMJIT.cpp; sourceTree = "<group>"; };
     15131                E3BBC2452383551A006EC39F /* CSSValueKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSValueKey.h; sourceTree = "<group>"; };
    1513015132                E3BC827322530221005276DE /* NodeList.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = NodeList.cpp; sourceTree = "<group>"; };
    1513115133                E3BF19E122AF2F55009C9926 /* XMLHttpRequestProgressEvent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = XMLHttpRequestProgressEvent.cpp; sourceTree = "<group>"; };
     
    2764927651                                0F53FB81213B1BB800C40D34 /* CSSFilter.cpp */,
    2765027652                                0F53FB83213B1BB800C40D34 /* CSSFilter.h */,
     27653                                E3BBC2452383551A006EC39F /* CSSValueKey.h */,
    2765127654                                A8CFF6CA0A1561CD000A4234 /* EllipsisBox.cpp */,
    2765227655                                A8CFF6BD0A156118000A4234 /* EllipsisBox.h */,
     
    2952929532                                BC7D8FF01BD03B6400FFE540 /* CSSUnsetValue.h in Headers */,
    2953029533                                A80E6CEE0A1989CA007FB8C5 /* CSSValue.h in Headers */,
     29534                                E3BBC24723835526006EC39F /* CSSValueKey.h in Headers */,
    2953129535                                6565815109D13043000E61D7 /* CSSValueKeywords.h in Headers */,
    2953229536                                A80E6CE90A1989CA007FB8C5 /* CSSValueList.h in Headers */,
  • trunk/Source/WebCore/rendering/RenderThemeIOS.h

    r252308 r253530  
    2828#if PLATFORM(IOS_FAMILY)
    2929
     30#include "CSSValueKey.h"
    3031#include "RenderThemeCocoa.h"
    3132
     
    6061#endif
    6162
     63    WEBCORE_EXPORT static const HashMap<CSSValueKey, Color>& getOrCreateCSSValueToSystemColorMap();
     64    WEBCORE_EXPORT static void setCSSValueToSystemColorMap(HashMap<CSSValueKey, Color>&&);
     65   
    6266protected:
    6367    LengthBox popupInternalPaddingBox(const RenderStyle&) const override;
  • trunk/Source/WebCore/rendering/RenderThemeIOS.mm

    r252392 r253530  
    3232#import "CSSPrimitiveValue.h"
    3333#import "CSSToLengthConversionData.h"
     34#import "CSSValueKey.h"
    3435#import "CSSValueKeywords.h"
    3536#import "ColorIOS.h"
     
    14311432#endif // ENABLE(VIDEO)
    14321433
     1434struct CSSValueIDAndSelector {
     1435    CSSValueID cssValueID;
     1436    SEL selector;
     1437};
     1438
     1439static const Vector<CSSValueIDAndSelector>& cssValueIDSelectorList()
     1440{
     1441    static NeverDestroyed<Vector<CSSValueIDAndSelector>> cssValueIDSelectorList;
     1442
     1443    static std::once_flag initializeOnce;
     1444    std::call_once(
     1445        initializeOnce,
     1446        [] {
     1447        cssValueIDSelectorList.get() = Vector(std::initializer_list<CSSValueIDAndSelector> {
     1448#if HAVE(OS_DARK_MODE_SUPPORT)
     1449            { CSSValueText, @selector(labelColor) },
     1450            { CSSValueAppleSystemLabel, @selector(labelColor) },
     1451            { CSSValueAppleSystemHeaderText, @selector(labelColor) },
     1452            { CSSValueAppleSystemSecondaryLabel, @selector(secondaryLabelColor) },
     1453            { CSSValueAppleSystemTertiaryLabel, @selector(tertiaryLabelColor) },
     1454            { CSSValueAppleSystemQuaternaryLabel, @selector(quaternaryLabelColor) },
     1455            { CSSValueAppleSystemPlaceholderText, @selector(placeholderTextColor) },
     1456            { CSSValueWebkitControlBackground, @selector(systemBackgroundColor) },
     1457            { CSSValueAppleSystemControlBackground, @selector(systemBackgroundColor) },
     1458            { CSSValueAppleSystemTextBackground, @selector(systemBackgroundColor) },
     1459            { CSSValueAppleSystemBackground, @selector(systemBackgroundColor) },
     1460            { CSSValueAppleSystemSecondaryBackground, @selector(secondarySystemBackgroundColor) },
     1461            { CSSValueAppleSystemTertiaryBackground, @selector(tertiarySystemBackgroundColor) },
     1462            { CSSValueAppleSystemGroupedBackground, @selector(systemGroupedBackgroundColor) },
     1463            { CSSValueAppleSystemSecondaryGroupedBackground, @selector(secondarySystemGroupedBackgroundColor) },
     1464            { CSSValueAppleSystemTertiaryGroupedBackground, @selector(tertiarySystemGroupedBackgroundColor) },
     1465            { CSSValueAppleSystemGrid, @selector(separatorColor) },
     1466            { CSSValueAppleSystemSeparator, @selector(separatorColor) },
     1467            { CSSValueAppleSystemContainerBorder, @selector(separatorColor) },
     1468            { CSSValueAppleSystemSelectedContentBackground, @selector(tableCellDefaultSelectionTintColor) },
     1469            { CSSValueAppleSystemUnemphasizedSelectedContentBackground, @selector(tableCellDefaultSelectionTintColor) },
     1470            { CSSValueAppleSystemBrown, @selector(systemBrownColor) },
     1471            { CSSValueAppleSystemIndigo, @selector(systemIndigoColor) },
     1472#endif
     1473            { CSSValueAppleSystemTeal, @selector(systemTealColor) },
     1474            { CSSValueAppleWirelessPlaybackTargetActive, @selector(systemBlueColor) },
     1475            { CSSValueAppleSystemBlue, @selector(systemBlueColor) },
     1476            { CSSValueAppleSystemGray, @selector(systemGrayColor) },
     1477            { CSSValueAppleSystemGreen, @selector(systemGreenColor) },
     1478            { CSSValueAppleSystemOrange, @selector(systemOrangeColor) },
     1479            { CSSValueAppleSystemPink, @selector(systemPinkColor) },
     1480            { CSSValueAppleSystemPurple, @selector(systemPurpleColor) },
     1481            { CSSValueAppleSystemRed, @selector(systemRedColor) },
     1482            { CSSValueAppleSystemYellow, @selector(systemYellowColor) }
     1483        });
     1484    });
     1485
     1486    return cssValueIDSelectorList;
     1487}
     1488
     1489static Optional<Color> systemColorFromCSSValueID(CSSValueID cssValueID, bool useDarkAppearance, bool useElevatedUserInterfaceLevel)
     1490{
     1491    LocalCurrentTraitCollection localTraitCollection(useDarkAppearance, useElevatedUserInterfaceLevel);
     1492
     1493    auto cssColorToSelector = [cssValueID] () -> SEL {
     1494        for (auto& cssValueIDSelector : cssValueIDSelectorList()) {
     1495            if (cssValueIDSelector.cssValueID == cssValueID)
     1496                return cssValueIDSelector.selector;
     1497        }
     1498        return nullptr;
     1499    };
     1500
     1501    if (auto selector = cssColorToSelector()) {
     1502        if (auto color = wtfObjCMsgSend<UIColor *>(PAL::getUIColorClass(), selector))
     1503            return Color(color.CGColor, Color::Semantic);
     1504    }
     1505    return WTF::nullopt;
     1506}
     1507
     1508
     1509static HashMap<CSSValueKey, Color>& globalCSSValueToSystemColorMap()
     1510{
     1511    static NeverDestroyed<HashMap<CSSValueKey, Color>> colorMap;
     1512    return colorMap;
     1513}
     1514
     1515const HashMap<CSSValueKey, Color>& RenderThemeIOS::getOrCreateCSSValueToSystemColorMap()
     1516{
     1517    static NeverDestroyed<HashMap<CSSValueKey, Color>> map;
     1518
     1519    static std::once_flag onceFlag;
     1520    std::call_once(
     1521        onceFlag,
     1522        [] {
     1523        for (auto& cssValueIDSelector : cssValueIDSelectorList()) {
     1524            for (bool useDarkAppearance : { false, true }) {
     1525                for (bool useElevatedUserInterfaceLevel : { false, true }) {
     1526                    if (auto color = systemColorFromCSSValueID(cssValueIDSelector.cssValueID, useDarkAppearance, useElevatedUserInterfaceLevel))
     1527                        map.get().add(CSSValueKey { cssValueIDSelector.cssValueID, useDarkAppearance, useElevatedUserInterfaceLevel }, *color);
     1528                }
     1529            }
     1530        }
     1531    });
     1532
     1533    return map;
     1534}
     1535
     1536void RenderThemeIOS::setCSSValueToSystemColorMap(HashMap<CSSValueKey, Color>&& colorMap)
     1537{
     1538    globalCSSValueToSystemColorMap() = WTFMove(colorMap);
     1539}
     1540
    14331541Color RenderThemeIOS::systemColor(CSSValueID cssValueID, OptionSet<StyleColor::Options> options) const
    14341542{
     
    14471555        const bool useDarkAppearance = options.contains(StyleColor::Options::UseDarkAppearance);
    14481556        const bool useElevatedUserInterfaceLevel = options.contains(StyleColor::Options::UseElevatedUserInterfaceLevel);
    1449         LocalCurrentTraitCollection localTraitCollection(useDarkAppearance, useElevatedUserInterfaceLevel);
    1450 
    1451         auto cssColorToSelector = [cssValueID] () -> SEL {
    1452             switch (cssValueID) {
    1453 #if HAVE(OS_DARK_MODE_SUPPORT)
    1454             case CSSValueText:
    1455             case CSSValueAppleSystemLabel:
    1456             case CSSValueAppleSystemHeaderText:
    1457                 return @selector(labelColor);
    1458             case CSSValueAppleSystemSecondaryLabel:
    1459                 return @selector(secondaryLabelColor);
    1460             case CSSValueAppleSystemTertiaryLabel:
    1461                 return @selector(tertiaryLabelColor);
    1462             case CSSValueAppleSystemQuaternaryLabel:
    1463                 return @selector(quaternaryLabelColor);
    1464             case CSSValueAppleSystemPlaceholderText:
    1465                 return @selector(placeholderTextColor);
    1466             case CSSValueWebkitControlBackground:
    1467             case CSSValueAppleSystemControlBackground:
    1468             case CSSValueAppleSystemTextBackground:
    1469             case CSSValueAppleSystemBackground:
    1470                 return @selector(systemBackgroundColor);
    1471             case CSSValueAppleSystemSecondaryBackground:
    1472                 return @selector(secondarySystemBackgroundColor);
    1473             case CSSValueAppleSystemTertiaryBackground:
    1474                 return @selector(tertiarySystemBackgroundColor);
    1475             case CSSValueAppleSystemGroupedBackground:
    1476                 return @selector(systemGroupedBackgroundColor);
    1477             case CSSValueAppleSystemSecondaryGroupedBackground:
    1478                 return @selector(secondarySystemGroupedBackgroundColor);
    1479             case CSSValueAppleSystemTertiaryGroupedBackground:
    1480                 return @selector(tertiarySystemGroupedBackgroundColor);
    1481             case CSSValueAppleSystemGrid:
    1482             case CSSValueAppleSystemSeparator:
    1483             case CSSValueAppleSystemContainerBorder:
    1484                 return @selector(separatorColor);
    1485             case CSSValueAppleSystemSelectedContentBackground:
    1486             case CSSValueAppleSystemUnemphasizedSelectedContentBackground:
    1487                 return @selector(tableCellDefaultSelectionTintColor);
    1488             case CSSValueAppleSystemBrown:
    1489                 return @selector(systemBrownColor);
    1490             case CSSValueAppleSystemIndigo:
    1491                 return @selector(systemIndigoColor);
    1492 #endif
    1493             case CSSValueAppleSystemTeal:
    1494                 return @selector(systemTealColor);
    1495             case CSSValueAppleWirelessPlaybackTargetActive:
    1496             case CSSValueAppleSystemBlue:
    1497                 return @selector(systemBlueColor);
    1498             case CSSValueAppleSystemGray:
    1499                 return @selector(systemGrayColor);
    1500             case CSSValueAppleSystemGreen:
    1501                 return @selector(systemGreenColor);
    1502             case CSSValueAppleSystemOrange:
    1503                 return @selector(systemOrangeColor);
    1504             case CSSValueAppleSystemPink:
    1505                 return @selector(systemPinkColor);
    1506             case CSSValueAppleSystemPurple:
    1507                 return @selector(systemPurpleColor);
    1508             case CSSValueAppleSystemRed:
    1509                 return @selector(systemRedColor);
    1510             case CSSValueAppleSystemYellow:
    1511                 return @selector(systemYellowColor);
    1512             default:
    1513                 return nullptr;
    1514             }
    1515         };
    1516 
    1517         if (auto selector = cssColorToSelector()) {
    1518             if (auto color = wtfObjCMsgSend<UIColor *>(PAL::getUIColorClass(), selector))
    1519                 return Color(color.CGColor, Color::Semantic);
     1557        if (!globalCSSValueToSystemColorMap().isEmpty()) {
     1558            auto it = globalCSSValueToSystemColorMap().find(CSSValueKey { cssValueID, useDarkAppearance, useElevatedUserInterfaceLevel });
     1559            if (it == globalCSSValueToSystemColorMap().end())
     1560                return RenderTheme::systemColor(cssValueID, options);
     1561            return it->value;
    15201562        }
    1521 
     1563        auto color = systemColorFromCSSValueID(cssValueID, useDarkAppearance, useElevatedUserInterfaceLevel);
     1564        if (color)
     1565            return *color;
    15221566        return RenderTheme::systemColor(cssValueID, options);
    15231567    }).iterator->value;
  • trunk/Source/WebKit/ChangeLog

    r253529 r253530  
     12019-12-14  Per Arne Vollan  <pvollan@apple.com>
     2
     3        Map CSS value ID to system color in the UI process
     4        https://bugs.webkit.org/show_bug.cgi?id=204314
     5        <rdar://problem/57295392>
     6 
     7        Reviewed by Brent Fulgham.
     8 
     9        Create mapping between CSS value IDs and system colors in the UI process and send to the WebContent process
     10        on process startup.
     11 
     12        No new tests, covered by existing tests.
     13 
     14        * Shared/WebProcessCreationParameters.cpp:
     15        (WebKit::WebProcessCreationParameters::encode const):
     16        (WebKit::WebProcessCreationParameters::decode):
     17        * Shared/WebProcessCreationParameters.h:
     18        * UIProcess/Cocoa/WebProcessPoolCocoa.mm:
     19        (WebKit::WebProcessPool::platformInitializeWebProcess):
     20        * WebProcess/cocoa/WebProcessCocoa.mm:
     21        (WebKit::WebProcess::platformInitializeWebProcess):
     22
    1232019-12-14  Per Arne Vollan  <pvollan@apple.com>
    224
  • trunk/Source/WebKit/Shared/WebProcessCreationParameters.cpp

    r253440 r253530  
    170170    encoder << neSessionManagerExtensionHandle;
    171171#endif
     172
     173#if PLATFORM(IOS)
     174    encoder << cssValueToSystemColorMap;
     175#endif
    172176}
    173177
     
    430434#endif
    431435
     436#if PLATFORM(IOS)
     437    Optional<HashMap<WebCore::CSSValueKey, WebCore::Color>> cssValueToSystemColorMap;
     438    decoder >> cssValueToSystemColorMap;
     439    if (!cssValueToSystemColorMap)
     440        return false;
     441    parameters.cssValueToSystemColorMap = WTFMove(*cssValueToSystemColorMap);
     442#endif
     443
    432444    return true;
    433445}
  • trunk/Source/WebKit/Shared/WebProcessCreationParameters.h

    r253440 r253530  
    5252#endif
    5353
     54#if PLATFORM(IOS)
     55#include <WebCore/RenderThemeIOS.h>
     56#endif
     57
    5458namespace API {
    5559class Data;
     
    208212    Optional<SandboxExtension::Handle> neSessionManagerExtensionHandle;
    209213#endif
     214
     215#if PLATFORM(IOS)
     216    HashMap<WebCore::CSSValueKey, WebCore::Color> cssValueToSystemColorMap;
     217#endif
    210218};
    211219
  • trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm

    r253440 r253530  
    325325    }
    326326#endif
     327   
     328#if PLATFORM(IOS)
     329    parameters.cssValueToSystemColorMap = RenderThemeIOS::getOrCreateCSSValueToSystemColorMap();
     330#endif
    327331}
    328332
  • trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm

    r253440 r253530  
    244244    NetworkExtensionContentFilter::setHasConsumedSandboxExtensions(parameters.neHelperExtensionHandle.hasValue() && parameters.neSessionManagerExtensionHandle.hasValue());
    245245#endif
     246
     247#if PLATFORM(IOS)
     248    RenderThemeIOS::setCSSValueToSystemColorMap(WTFMove(parameters.cssValueToSystemColorMap));
     249#endif
    246250}
    247251
Note: See TracChangeset for help on using the changeset viewer.