Create a named CSS property for system colors
authordino@apple.com <dino@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 4 May 2015 23:42:56 +0000 (23:42 +0000)
committerdino@apple.com <dino@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 4 May 2015 23:42:56 +0000 (23:42 +0000)
https://bugs.webkit.org/show_bug.cgi?id=144423

Follow-up comments from Darin Adler.

* rendering/RenderThemeIOS.h: Cache a Color rather than an RGBA32.
* rendering/RenderThemeIOS.mm:
(WebCore::RenderThemeIOS::systemColor): Use "add" to avoid multiple hits on the HashMap, and
cache invalid responses so that we don't have to keep looking for non-existent colors.
* rendering/RenderThemeMac.h: Same as iOS.
* rendering/RenderThemeMac.mm:
(WebCore::RenderThemeMac::systemColor):

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

Source/WebCore/ChangeLog
Source/WebCore/rendering/RenderThemeIOS.h
Source/WebCore/rendering/RenderThemeIOS.mm
Source/WebCore/rendering/RenderThemeMac.h
Source/WebCore/rendering/RenderThemeMac.mm

index d51ab5c..0293ee9 100644 (file)
@@ -1,3 +1,18 @@
+2015-05-04  Dean Jackson  <dino@apple.com>
+
+        Create a named CSS property for system colors
+        https://bugs.webkit.org/show_bug.cgi?id=144423
+
+        Follow-up comments from Darin Adler.
+
+        * rendering/RenderThemeIOS.h: Cache a Color rather than an RGBA32.
+        * rendering/RenderThemeIOS.mm:
+        (WebCore::RenderThemeIOS::systemColor): Use "add" to avoid multiple hits on the HashMap, and
+        cache invalid responses so that we don't have to keep looking for non-existent colors.
+        * rendering/RenderThemeMac.h: Same as iOS.
+        * rendering/RenderThemeMac.mm:
+        (WebCore::RenderThemeMac::systemColor):
+
 2015-05-04  Simon Fraser  <simon.fraser@apple.com>
 
         display:none iframes cause repeated compositing flushing
index 0d20a10..ee32d76 100644 (file)
@@ -111,8 +111,6 @@ protected:
     virtual String mediaControlsScript() override;
 #endif
 
-    virtual Color systemColor(CSSValueID) const override;
-
 private:
     RenderThemeIOS();
     virtual ~RenderThemeIOS() { }
@@ -120,10 +118,12 @@ private:
     const Color& shadowColor() const;
     FloatRect addRoundedBorderClip(const RenderObject& box, GraphicsContext*, const IntRect&);
 
+    virtual Color systemColor(CSSValueID) const override;
+
     String m_mediaControlsScript;
     String m_mediaControlsStyleSheet;
 
-    mutable HashMap<int, RGBA32> m_systemColorCache;
+    mutable HashMap<int, Color> m_systemColorCache;
 };
 
 }
index 2c14380..5e906e8 100644 (file)
@@ -1311,16 +1311,14 @@ String RenderThemeIOS::mediaControlsScript()
 }
 #endif // ENABLE(VIDEO)
 
-Color RenderThemeIOS::systemColor(CSSValueID cssValueId) const
+Color RenderThemeIOS::systemColor(CSSValueID cssValueID) const
 {
-    {
-        auto it = m_systemColorCache.find(cssValueId);
-        if (it != m_systemColorCache.end())
-            return it->value;
-    }
+    auto addResult = m_systemColorCache.add(cssValueID, Color());
+    if (!addResult.isNewEntry)
+        return addResult.iterator->value;
 
     Color color;
-    switch (cssValueId) {
+    switch (cssValueID) {
     case CSSValueAppleSystemBlue:
         color = [getUIColorClass() systemBlueColor].CGColor;
         break;
@@ -1347,12 +1345,11 @@ Color RenderThemeIOS::systemColor(CSSValueID cssValueId) const
     }
 
     if (!color.isValid())
-        color = RenderTheme::systemColor(cssValueId);
+        color = RenderTheme::systemColor(cssValueID);
 
-    if (color.isValid())
-        m_systemColorCache.set(cssValueId, color.rgb());
+    addResult.iterator->value = color;
 
-    return color;
+    return addResult.iterator->value;
 }
 
 }
index 13378c0..0aa4007 100644 (file)
@@ -96,7 +96,6 @@ public:
     virtual double animationDurationForProgressBar(RenderProgress&) const override;
     virtual IntRect progressBarRectForBounds(const RenderObject&, const IntRect&) const override;
 
-    virtual Color systemColor(CSSValueID) const override;
     // Controls color values returned from platformFocusRingColor(). systemColor() will be used when false.
     bool usesTestModeFocusRingColor() const;
     // A view associated to the contained document.
@@ -179,6 +178,8 @@ private:
 
     FloatRect convertToPaintingRect(const RenderObject& inputRenderer, const RenderObject& partRenderer, const FloatRect& inputRect, const IntRect&) const;
 
+    virtual Color systemColor(CSSValueID) const override;
+
     // Get the control size based off the font. Used by some of the controls (like buttons).
     NSControlSize controlSizeForFont(RenderStyle&) const;
     NSControlSize controlSizeForSystemFont(RenderStyle&) const;
@@ -247,7 +248,7 @@ private:
     bool m_isSliderThumbHorizontalPressed;
     bool m_isSliderThumbVerticalPressed;
 
-    mutable HashMap<int, RGBA32> m_systemColorCache;
+    mutable HashMap<int, Color> m_systemColorCache;
 
     RetainPtr<WebCoreRenderThemeNotificationObserver> m_notificationObserver;
 
index 7373a05..13e1f1e 100644 (file)
@@ -455,16 +455,14 @@ void RenderThemeMac::platformColorsDidChange()
     RenderTheme::platformColorsDidChange();
 }
 
-Color RenderThemeMac::systemColor(CSSValueID cssValueId) const
+Color RenderThemeMac::systemColor(CSSValueID cssValueID) const
 {
-    {
-        auto it = m_systemColorCache.find(cssValueId);
-        if (it != m_systemColorCache.end())
-            return it->value;
-    }
+    auto addResult = m_systemColorCache.add(cssValueID, Color());
+    if (!addResult.isNewEntry)
+        return addResult.iterator->value;
 
     Color color;
-    switch (cssValueId) {
+    switch (cssValueID) {
     case CSSValueActiveborder:
         color = convertNSColorToColor([NSColor keyboardFocusIndicatorColor]);
         break;
@@ -602,12 +600,11 @@ Color RenderThemeMac::systemColor(CSSValueID cssValueId) const
     }
 
     if (!color.isValid())
-        color = RenderTheme::systemColor(cssValueId);
+        color = RenderTheme::systemColor(cssValueID);
 
-    if (color.isValid())
-        m_systemColorCache.set(cssValueId, color.rgb());
+    addResult.iterator->value = color;
 
-    return color;
+    return addResult.iterator->value;
 }
 
 bool RenderThemeMac::usesTestModeFocusRingColor() const