<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[207442] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/207442">207442</a></dd>
<dt>Author</dt> <dd>dino@apple.com</dd>
<dt>Date</dt> <dd>2016-10-17 17:12:00 -0700 (Mon, 17 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Allow creation of ExtendedColors and make Color immutable
https://bugs.webkit.org/show_bug.cgi?id=163557
&lt;rdar://problem/28805360&gt;

Reviewed by Darin Adler and Dave Hyatt.

Source/WebCore:

1. Support the creation of ExtendedColor objects via the
Color class.

2. Fix the remaining few places where a Color object is
modified after creation, instead creating a new Color.
Move all the mutation methods into the private section,
making Color now immutable.

Changes to Color are covered by existing tests. Changes
to ExtendedColor are covered by the ExtendedColor API test.

* css/parser/CSSParser.cpp:
(WebCore::CSSParser::fastParseColor): Return a new named Color.

* dom/Document.cpp:
(WebCore::Document::resetActiveLinkColor): Set to be the named &quot;red&quot; color.

* html/HTMLElement.cpp:
(WebCore::HTMLElement::addHTMLColorToStyle): Use the string-based constructor
where possible.

* page/CaptionUserPreferencesMediaAF.cpp:
(WebCore::CaptionUserPreferencesMediaAF::captionsTextEdgeCSS): No need to
use the string &quot;black&quot; here - we have a constant value.

* platform/graphics/cairo/GraphicsContextCairo.cpp: Don't use setRGB.

* platform/graphics/Color.cpp:
(WebCore::findNamedColor): Move this up in the file.
(WebCore::Color::Color): Copy in the code from setNamedColor. Also
add a constructor for ExtendedColor.
(WebCore::Color::serialized): Call ExtendedColor's serializer if necessary.
(WebCore::Color::cssText): Ditto.
(WebCore::Color::setNamedColor): Deleted.
(WebCore::Color::tagAsExtended): Deleted.

* platform/graphics/Color.h: Add a new constructor.
(WebCore::Color::setRGB): Move to private.

* platform/graphics/ExtendedColor.cpp:
(WebCore::ExtendedColor::cssText): Implement serializer.
* platform/graphics/ExtendedColor.h:

* rendering/style/RenderStyle.cpp:
(WebCore::RenderStyle::colorIncludingFallback): Construct a new Color rather than changing an existing object.

Tools:

API tests for ExtendedColor.

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/Tests/WebCore/ExtendedColor.cpp: Added.
(TestWebKitAPI::TEST):
(TestWebKitAPI::makeColor):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssparserCSSParsercpp">trunk/Source/WebCore/css/parser/CSSParser.cpp</a></li>
<li><a href="#trunkSourceWebCoredomDocumentcpp">trunk/Source/WebCore/dom/Document.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLElementcpp">trunk/Source/WebCore/html/HTMLElement.cpp</a></li>
<li><a href="#trunkSourceWebCorepageCaptionUserPreferencesMediaAFcpp">trunk/Source/WebCore/page/CaptionUserPreferencesMediaAF.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsColorcpp">trunk/Source/WebCore/platform/graphics/Color.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsColorh">trunk/Source/WebCore/platform/graphics/Color.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsExtendedColorcpp">trunk/Source/WebCore/platform/graphics/ExtendedColor.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsExtendedColorh">trunk/Source/WebCore/platform/graphics/ExtendedColor.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscairoGraphicsContextCairocpp">trunk/Source/WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmockMockRealtimeVideoSourcecpp">trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleRenderStylecpp">trunk/Source/WebCore/rendering/style/RenderStyle.cpp</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestWebKitAPIxcodeprojprojectpbxproj">trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkToolsTestWebKitAPITestsWebCoreExtendedColorcpp">trunk/Tools/TestWebKitAPI/Tests/WebCore/ExtendedColor.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (207441 => 207442)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-10-17 23:27:36 UTC (rev 207441)
+++ trunk/Source/WebCore/ChangeLog        2016-10-18 00:12:00 UTC (rev 207442)
</span><span class="lines">@@ -1,3 +1,57 @@
</span><ins>+2016-10-17  Dean Jackson  &lt;dino@apple.com&gt;
+
+        Allow creation of ExtendedColors and make Color immutable
+        https://bugs.webkit.org/show_bug.cgi?id=163557
+        &lt;rdar://problem/28805360&gt;
+
+        Reviewed by Darin Adler and Dave Hyatt.
+
+        1. Support the creation of ExtendedColor objects via the
+        Color class.
+
+        2. Fix the remaining few places where a Color object is
+        modified after creation, instead creating a new Color.
+        Move all the mutation methods into the private section,
+        making Color now immutable.
+
+        Changes to Color are covered by existing tests. Changes
+        to ExtendedColor are covered by the ExtendedColor API test.
+
+        * css/parser/CSSParser.cpp:
+        (WebCore::CSSParser::fastParseColor): Return a new named Color.
+
+        * dom/Document.cpp:
+        (WebCore::Document::resetActiveLinkColor): Set to be the named &quot;red&quot; color.
+
+        * html/HTMLElement.cpp:
+        (WebCore::HTMLElement::addHTMLColorToStyle): Use the string-based constructor
+        where possible.
+
+        * page/CaptionUserPreferencesMediaAF.cpp:
+        (WebCore::CaptionUserPreferencesMediaAF::captionsTextEdgeCSS): No need to
+        use the string &quot;black&quot; here - we have a constant value.
+
+        * platform/graphics/cairo/GraphicsContextCairo.cpp: Don't use setRGB.
+
+        * platform/graphics/Color.cpp:
+        (WebCore::findNamedColor): Move this up in the file.
+        (WebCore::Color::Color): Copy in the code from setNamedColor. Also
+        add a constructor for ExtendedColor.
+        (WebCore::Color::serialized): Call ExtendedColor's serializer if necessary.
+        (WebCore::Color::cssText): Ditto.
+        (WebCore::Color::setNamedColor): Deleted.
+        (WebCore::Color::tagAsExtended): Deleted.
+
+        * platform/graphics/Color.h: Add a new constructor.
+        (WebCore::Color::setRGB): Move to private.
+
+        * platform/graphics/ExtendedColor.cpp:
+        (WebCore::ExtendedColor::cssText): Implement serializer.
+        * platform/graphics/ExtendedColor.h:
+
+        * rendering/style/RenderStyle.cpp:
+        (WebCore::RenderStyle::colorIncludingFallback): Construct a new Color rather than changing an existing object.
+
</ins><span class="cx"> 2016-10-17  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Implement DOMRect/DOMRectReadOnly
</span></span></pre></div>
<a id="trunkSourceWebCorecssparserCSSParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/parser/CSSParser.cpp (207441 => 207442)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/parser/CSSParser.cpp        2016-10-17 23:27:36 UTC (rev 207441)
+++ trunk/Source/WebCore/css/parser/CSSParser.cpp        2016-10-18 00:12:00 UTC (rev 207442)
</span><span class="lines">@@ -7550,8 +7550,7 @@
</span><span class="cx">         return color;
</span><span class="cx"> 
</span><span class="cx">     // Try named colors.
</span><del>-    color.setNamedColor(name);
-    return color;
</del><ins>+    return Color { name };
</ins><span class="cx"> }
</span><span class="cx">     
</span><span class="cx"> inline double CSSParser::parsedDouble(ValueWithCalculation&amp; valueWithCalculation)
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.cpp (207441 => 207442)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.cpp        2016-10-17 23:27:36 UTC (rev 207441)
+++ trunk/Source/WebCore/dom/Document.cpp        2016-10-18 00:12:00 UTC (rev 207442)
</span><span class="lines">@@ -820,7 +820,7 @@
</span><span class="cx"> 
</span><span class="cx"> void Document::resetActiveLinkColor()
</span><span class="cx"> {
</span><del>-    m_activeLinkColor.setNamedColor(&quot;red&quot;);
</del><ins>+    m_activeLinkColor = Color(255, 0, 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> DOMImplementation&amp; Document::implementation()
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLElement.cpp (207441 => 207442)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLElement.cpp        2016-10-17 23:27:36 UTC (rev 207441)
+++ trunk/Source/WebCore/html/HTMLElement.cpp        2016-10-18 00:12:00 UTC (rev 207442)
</span><span class="lines">@@ -1037,18 +1037,13 @@
</span><span class="cx">     if (equalLettersIgnoringASCIICase(colorString, &quot;transparent&quot;))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    // If the string is a named CSS color or a 3/6-digit hex color, use that.
-    // We can't use the default Color constructor because it accepts
</del><ins>+    Color color;
+    // We can't always use the default Color constructor because it accepts
</ins><span class="cx">     // 4/8-digit hex, which conflict with some legacy HTML content using attributes.
</span><del>-
-    Color color;
-
-    if ((colorString.length() == 4 || colorString.length() == 7) &amp;&amp; colorString[0] == '#')
</del><ins>+    if ((colorString.length() != 5 &amp;&amp; colorString.length() != 9) || colorString[0] != '#')
</ins><span class="cx">         color = Color(colorString);
</span><span class="cx">     if (!color.isValid())
</span><del>-        color.setNamedColor(colorString);
-    if (!color.isValid())
-        color.setRGB(parseColorStringWithCrazyLegacyRules(colorString));
</del><ins>+        color = Color(parseColorStringWithCrazyLegacyRules(colorString));
</ins><span class="cx"> 
</span><span class="cx">     style.setProperty(propertyID, CSSValuePool::singleton().createColorValue(color.rgb()));
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorepageCaptionUserPreferencesMediaAFcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/CaptionUserPreferencesMediaAF.cpp (207441 => 207442)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/CaptionUserPreferencesMediaAF.cpp        2016-10-17 23:27:36 UTC (rev 207441)
+++ trunk/Source/WebCore/page/CaptionUserPreferencesMediaAF.cpp        2016-10-18 00:12:00 UTC (rev 207442)
</span><span class="lines">@@ -396,7 +396,7 @@
</span><span class="cx">     bool unused;
</span><span class="cx">     Color color = captionsTextColor(unused);
</span><span class="cx">     if (!color.isValid())
</span><del>-        color.setNamedColor(&quot;black&quot;);
</del><ins>+        color = Color { Color::black };
</ins><span class="cx">     color = captionsEdgeColorForTextColor(color);
</span><span class="cx"> 
</span><span class="cx">     MACaptionAppearanceBehavior behavior;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsColorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/Color.cpp (207441 => 207442)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/Color.cpp        2016-10-17 23:27:36 UTC (rev 207441)
+++ trunk/Source/WebCore/platform/graphics/Color.cpp        2016-10-18 00:12:00 UTC (rev 207442)
</span><span class="lines">@@ -222,6 +222,22 @@
</span><span class="cx">     return dR * dR + dG * dG + dB * dB;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static inline const NamedColor* findNamedColor(const String&amp; name)
+{
+    char buffer[64]; // easily big enough for the longest color name
+    unsigned length = name.length();
+    if (length &gt; sizeof(buffer) - 1)
+        return nullptr;
+    for (unsigned i = 0; i &lt; length; ++i) {
+        UChar c = name[i];
+        if (!c || !WTF::isASCII(c))
+            return nullptr;
+        buffer[i] = toASCIILower(static_cast&lt;char&gt;(c));
+    }
+    buffer[length] = '\0';
+    return findColor(buffer, length);
+}
+
</ins><span class="cx"> Color::Color(const String&amp; name)
</span><span class="cx"> {
</span><span class="cx">     if (name[0] == '#') {
</span><span class="lines">@@ -235,8 +251,12 @@
</span><span class="cx"> 
</span><span class="cx">         if (valid)
</span><span class="cx">             setRGB(color);
</span><del>-    } else
-        setNamedColor(name);
</del><ins>+    } else {
+        if (auto* foundColor = findNamedColor(name))
+            setRGB(foundColor-&gt;ARGBValue);
+        else
+            m_colorData.rgbaAndFlags = invalidRGBAColor;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Color::Color(const char* name)
</span><span class="lines">@@ -267,6 +287,13 @@
</span><span class="cx">     *this = WTFMove(other);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Color::Color(float r, float g, float b, float a, ColorSpace colorSpace)
+{
+    auto extendedColorRef = ExtendedColor::create(r, g, b, a, colorSpace);
+    m_colorData.extendedColor = &amp;extendedColorRef.leakRef();
+    ASSERT(isExtended());
+}
+
</ins><span class="cx"> Color::~Color()
</span><span class="cx"> {
</span><span class="cx">     if (isExtended())
</span><span class="lines">@@ -301,6 +328,9 @@
</span><span class="cx"> 
</span><span class="cx"> String Color::serialized() const
</span><span class="cx"> {
</span><ins>+    if (isExtended())
+        return asExtended().cssText();
+
</ins><span class="cx">     if (!hasAlpha()) {
</span><span class="cx">         StringBuilder builder;
</span><span class="cx">         builder.reserveCapacity(7);
</span><span class="lines">@@ -316,6 +346,9 @@
</span><span class="cx"> 
</span><span class="cx"> String Color::cssText() const
</span><span class="cx"> {
</span><ins>+    if (isExtended())
+        return asExtended().cssText();
+
</ins><span class="cx">     StringBuilder builder;
</span><span class="cx">     builder.reserveCapacity(28);
</span><span class="cx">     bool colorHasAlpha = hasAlpha();
</span><span class="lines">@@ -352,31 +385,6 @@
</span><span class="cx">     return String::format(&quot;#%02X%02X%02X&quot;, red(), green(), blue());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static inline const NamedColor* findNamedColor(const String&amp; name)
-{
-    char buffer[64]; // easily big enough for the longest color name
-    unsigned length = name.length();
-    if (length &gt; sizeof(buffer) - 1)
-        return 0;
-    for (unsigned i = 0; i &lt; length; ++i) {
-        UChar c = name[i];
-        if (!c || c &gt; 0x7F)
-            return 0;
-        buffer[i] = toASCIILower(static_cast&lt;char&gt;(c));
-    }
-    buffer[length] = '\0';
-    return findColor(buffer, length);
-}
-
-void Color::setNamedColor(const String&amp; name)
-{
-    const NamedColor* foundColor = findNamedColor(name);
-    if (foundColor)
-        setRGB(foundColor-&gt;ARGBValue);
-    else
-        m_colorData.rgbaAndFlags = invalidRGBAColor;
-}
-
</del><span class="cx"> Color Color::light() const
</span><span class="cx"> {
</span><span class="cx">     // Hardcode this common case for speed.
</span><span class="lines">@@ -624,25 +632,15 @@
</span><span class="cx">     m_colorData.rgbaAndFlags |= validRGBAColor;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Color::tagAsExtended()
-{
-    // FIXME: Is this method necessary? Will colors ever change from RGBA32 to Extended?
-    // Valid colors should not change type.
-    ASSERT(!isValid());
-    m_colorData.rgbaAndFlags &amp;= ~(invalidRGBAColor);
-}
-
</del><span class="cx"> bool Color::isExtended() const
</span><span class="cx"> {
</span><span class="cx">     return !(m_colorData.rgbaAndFlags &amp; invalidRGBAColor);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ExtendedColor* Color::asExtended() const
</del><ins>+ExtendedColor&amp; Color::asExtended() const
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(isExtended());
</span><del>-    if (!isExtended())
-        return nullptr;
-    return m_colorData.extendedColor;
</del><ins>+    return *m_colorData.extendedColor;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsColorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/Color.h (207441 => 207442)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/Color.h        2016-10-17 23:27:36 UTC (rev 207441)
+++ trunk/Source/WebCore/platform/graphics/Color.h        2016-10-18 00:12:00 UTC (rev 207442)
</span><span class="lines">@@ -158,7 +158,10 @@
</span><span class="cx">         ASSERT(!isExtended());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // FIXME: Add constructor for ExtendedColor type.
</del><ins>+    // This creates an ExtendedColor.
+    // FIXME: If the colorSpace is sRGB and the values can all be
+    // converted exactly to integers, we should make a normal Color.
+    WEBCORE_EXPORT Color(float r, float g, float b, float a, ColorSpace colorSpace);
</ins><span class="cx"> 
</span><span class="cx">     Color(RGBA, ColorSpace);
</span><span class="cx">     WEBCORE_EXPORT Color(const Color&amp;);
</span><span class="lines">@@ -181,14 +184,12 @@
</span><span class="cx">     // &lt;https://html.spec.whatwg.org/multipage/scripting.html#fill-and-stroke-styles&gt; (10 September 2015)
</span><span class="cx">     WEBCORE_EXPORT String serialized() const;
</span><span class="cx"> 
</span><del>-    String cssText() const;
</del><ins>+    WEBCORE_EXPORT String cssText() const;
</ins><span class="cx"> 
</span><span class="cx">     // Returns the color serialized as either #RRGGBB or #RRGGBBAA
</span><span class="cx">     // The latter format is not a valid CSS color, and should only be seen in DRT dumps.
</span><span class="cx">     String nameForRenderTreeAsText() const;
</span><span class="cx"> 
</span><del>-    void setNamedColor(const String&amp;);
-
</del><span class="cx">     bool isValid() const { return m_colorData.rgbaAndFlags &amp; validRGBAColorBit; }
</span><span class="cx"> 
</span><span class="cx">     bool hasAlpha() const { return alpha() &lt; 255; }
</span><span class="lines">@@ -199,8 +200,6 @@
</span><span class="cx">     int alpha() const { return alphaChannel(rgb()); }
</span><span class="cx">     
</span><span class="cx">     RGBA32 rgb() const { ASSERT(!isExtended()); return static_cast&lt;RGBA32&gt;(m_colorData.rgbaAndFlags &gt;&gt; 32); }
</span><del>-    void setRGB(int r, int g, int b) { setRGB(makeRGB(r, g, b)); }
-    void setRGB(RGBA32);
</del><span class="cx">     uint64_t asUint64() const { return m_colorData.rgbaAndFlags; }
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT void getRGBA(float&amp; r, float&amp; g, float&amp; b, float&amp; a) const;
</span><span class="lines">@@ -256,7 +255,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT bool isExtended() const;
</span><del>-    WEBCORE_EXPORT ExtendedColor* asExtended() const;
</del><ins>+    WEBCORE_EXPORT ExtendedColor&amp; asExtended() const;
</ins><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT Color&amp; operator=(const Color&amp;);
</span><span class="cx">     WEBCORE_EXPORT Color&amp; operator=(Color&amp;&amp;);
</span><span class="lines">@@ -264,6 +263,8 @@
</span><span class="cx">     friend bool operator==(const Color&amp; a, const Color&amp; b);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    void setRGB(int r, int g, int b) { setRGB(makeRGB(r, g, b)); }
+    void setRGB(RGBA32);
</ins><span class="cx"> 
</span><span class="cx">     // 0x_______00 is an ExtendedColor pointer.
</span><span class="cx">     // 0x_______01 is an invalid RGBA32.
</span><span class="lines">@@ -274,7 +275,6 @@
</span><span class="cx">     static const uint64_t validRGBAColor = 0x3;
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT void tagAsValid();
</span><del>-    void tagAsExtended();
</del><span class="cx"> 
</span><span class="cx">     union {
</span><span class="cx">         uint64_t rgbaAndFlags { invalidRGBAColor };
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsExtendedColorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ExtendedColor.cpp (207441 => 207442)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ExtendedColor.cpp        2016-10-17 23:27:36 UTC (rev 207441)
+++ trunk/Source/WebCore/platform/graphics/ExtendedColor.cpp        2016-10-18 00:12:00 UTC (rev 207442)
</span><span class="lines">@@ -27,6 +27,9 @@
</span><span class="cx"> #include &quot;ExtendedColor.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;ColorSpace.h&quot;
</span><ins>+#include &lt;wtf/MathExtras.h&gt;
+#include &lt;wtf/dtoa.h&gt;
+#include &lt;wtf/text/StringBuilder.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -35,4 +38,40 @@
</span><span class="cx">     return adoptRef(*new ExtendedColor(r, g, b, a, colorSpace));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+String ExtendedColor::cssText() const
+{
+    StringBuilder builder;
+    builder.reserveCapacity(40);
+    builder.appendLiteral(&quot;color(&quot;);
+
+    switch (m_colorSpace) {
+    case ColorSpaceSRGB:
+        builder.appendLiteral(&quot;srgb &quot;);
+        break;
+    case ColorSpaceDisplayP3:
+        builder.appendLiteral(&quot;display-p3 &quot;);
+        break;
+    default:
+        ASSERT_NOT_REACHED();
+        return WTF::emptyString();
+    }
+
+    NumberToStringBuffer buffer;
+    bool shouldTruncateTrailingZeros = true;
+
+    builder.append(numberToFixedPrecisionString(red(), 6, buffer, shouldTruncateTrailingZeros));
+    builder.append(' ');
+
+    builder.append(numberToFixedPrecisionString(green(), 6, buffer, shouldTruncateTrailingZeros));
+    builder.append(' ');
+
+    builder.append(numberToFixedPrecisionString(blue(), 6, buffer, shouldTruncateTrailingZeros));
+    builder.appendLiteral(&quot; / &quot;);
+
+    builder.append(numberToFixedPrecisionString(alpha(), 6, buffer, shouldTruncateTrailingZeros));
+    builder.append(')');
+
+    return builder.toString();
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsExtendedColorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ExtendedColor.h (207441 => 207442)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ExtendedColor.h        2016-10-17 23:27:36 UTC (rev 207441)
+++ trunk/Source/WebCore/platform/graphics/ExtendedColor.h        2016-10-18 00:12:00 UTC (rev 207442)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;wtf/Ref.h&gt;
</span><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><ins>+#include &lt;wtf/text/WTFString.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -43,6 +44,8 @@
</span><span class="cx"> 
</span><span class="cx">     ColorSpace colorSpace() const { return m_colorSpace; }
</span><span class="cx"> 
</span><ins>+    WEBCORE_EXPORT String cssText() const;
+
</ins><span class="cx"> private:
</span><span class="cx">     ExtendedColor(float r, float g, float b, float a, ColorSpace colorSpace)
</span><span class="cx">         : m_red(r)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscairoGraphicsContextCairocpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp (207441 => 207442)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp        2016-10-17 23:27:36 UTC (rev 207441)
+++ trunk/Source/WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp        2016-10-18 00:12:00 UTC (rev 207442)
</span><span class="lines">@@ -540,7 +540,7 @@
</span><span class="cx"> {
</span><span class="cx"> #if !PLATFORM(GTK)
</span><span class="cx">     // Force the alpha to 50%.  This matches what the Mac does with outline rings.
</span><del>-    color.setRGB(makeRGBA(color.red(), color.green(), color.blue(), 127));
</del><ins>+    color = Color(makeRGBA(color.red(), color.green(), color.blue(), 127));
</ins><span class="cx"> #else
</span><span class="cx">     UNUSED_PARAM(color);
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmockMockRealtimeVideoSourcecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp (207441 => 207442)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp        2016-10-17 23:27:36 UTC (rev 207441)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp        2016-10-18 00:12:00 UTC (rev 207442)
</span><span class="lines">@@ -199,6 +199,7 @@
</span><span class="cx">     static const RGBA32 blue = 0xff0000ff;
</span><span class="cx">     static const RGBA32 red = 0xffff0000;
</span><span class="cx">     static const RGBA32 green = 0xff008000;
</span><ins>+    static const RGBA32 cyan = 0xFF00FFFF;
</ins><span class="cx"> 
</span><span class="cx">     IntSize size = this-&gt;size();
</span><span class="cx">     float boxSize = size.width() * .035;
</span><span class="lines">@@ -248,7 +249,7 @@
</span><span class="cx"> 
</span><span class="cx">     boxTop += boxSize + 2;
</span><span class="cx">     boxLeft = boxSize;
</span><del>-    Color boxColors[] = { Color::white, yellow, Color::cyan, green, magenta, red, blue };
</del><ins>+    Color boxColors[] = { Color::white, yellow, cyan, green, magenta, red, blue };
</ins><span class="cx">     for (unsigned i = 0; i &lt; sizeof(boxColors) / sizeof(boxColors[0]); i++) {
</span><span class="cx">         context.fillRect(FloatRect(boxLeft, boxTop, boxSize + 1, boxSize + 1), boxColors[i]);
</span><span class="cx">         boxLeft += boxSize + 1;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleRenderStylecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/RenderStyle.cpp (207441 => 207442)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/style/RenderStyle.cpp        2016-10-17 23:27:36 UTC (rev 207441)
+++ trunk/Source/WebCore/rendering/style/RenderStyle.cpp        2016-10-18 00:12:00 UTC (rev 207442)
</span><span class="lines">@@ -1683,7 +1683,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (!result.isValid()) {
</span><span class="cx">         if (!visitedLink &amp;&amp; (borderStyle == INSET || borderStyle == OUTSET || borderStyle == RIDGE || borderStyle == GROOVE))
</span><del>-            result.setRGB(238, 238, 238);
</del><ins>+            result = Color(238, 238, 238);
</ins><span class="cx">         else
</span><span class="cx">             result = visitedLink ? visitedLinkColor() : color();
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (207441 => 207442)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-10-17 23:27:36 UTC (rev 207441)
+++ trunk/Tools/ChangeLog        2016-10-18 00:12:00 UTC (rev 207442)
</span><span class="lines">@@ -1,3 +1,18 @@
</span><ins>+2016-10-17  Dean Jackson  &lt;dino@apple.com&gt;
+
+        Allow creation of ExtendedColors and make Color immutable
+        https://bugs.webkit.org/show_bug.cgi?id=163557
+        &lt;rdar://problem/28805360&gt;
+
+        Reviewed by Darin Adler and Dave Hyatt.
+
+        API tests for ExtendedColor.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebCore/ExtendedColor.cpp: Added.
+        (TestWebKitAPI::TEST):
+        (TestWebKitAPI::makeColor):
+
</ins><span class="cx"> 2016-10-17  JF Bastien  &lt;jfbastien@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         WebAssembly JS API: implement basic stub
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestWebKitAPIxcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (207441 => 207442)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj        2016-10-17 23:27:36 UTC (rev 207441)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj        2016-10-18 00:12:00 UTC (rev 207442)
</span><span class="lines">@@ -85,6 +85,7 @@
</span><span class="cx">                 2EFF06CD1D8A429A0004BB30 /* input-field-in-scrollable-document.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 2EFF06CC1D8A42910004BB30 /* input-field-in-scrollable-document.html */; };
</span><span class="cx">                 2EFF06D41D8AEDBB0004BB30 /* TestWKWebViewMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2EFF06D31D8AEDBB0004BB30 /* TestWKWebViewMac.mm */; };
</span><span class="cx">                 2EFF06D71D8AF34A0004BB30 /* WKWebViewCandidateTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2EFF06D61D8AF34A0004BB30 /* WKWebViewCandidateTests.mm */; };
</span><ins>+                315118101DB1AE4000176304 /* ExtendedColor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3151180F1DB1ADD500176304 /* ExtendedColor.cpp */; };
</ins><span class="cx">                 33BE5AF9137B5AAE00705813 /* MouseMoveAfterCrash_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 33BE5AF8137B5AAE00705813 /* MouseMoveAfterCrash_Bundle.cpp */; };
</span><span class="cx">                 33DC8912141955FE00747EF7 /* simple-iframe.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 33DC890E1419539300747EF7 /* simple-iframe.html */; };
</span><span class="cx">                 33DC89141419579F00747EF7 /* LoadCanceledNoServerRedirectCallback_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 33DC89131419579F00747EF7 /* LoadCanceledNoServerRedirectCallback_Bundle.cpp */; };
</span><span class="lines">@@ -822,6 +823,7 @@
</span><span class="cx">                 2EFF06D21D8AEDBB0004BB30 /* TestWKWebViewMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestWKWebViewMac.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2EFF06D31D8AEDBB0004BB30 /* TestWKWebViewMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TestWKWebViewMac.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2EFF06D61D8AF34A0004BB30 /* WKWebViewCandidateTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKWebViewCandidateTests.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                3151180F1DB1ADD500176304 /* ExtendedColor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExtendedColor.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 333B9CE11277F23100FEFCE3 /* PreventEmptyUserAgent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PreventEmptyUserAgent.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 33BE5AF4137B5A6C00705813 /* MouseMoveAfterCrash.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MouseMoveAfterCrash.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 33BE5AF8137B5AAE00705813 /* MouseMoveAfterCrash_Bundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MouseMoveAfterCrash_Bundle.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -1456,6 +1458,7 @@
</span><span class="cx">                                 260BA5781B1D2E7B004FA07C /* DFACombiner.cpp */,
</span><span class="cx">                                 260BA57A1B1D2EE2004FA07C /* DFAHelpers.h */,
</span><span class="cx">                                 26F6E1EF1ADC749B00DE696B /* DFAMinimizer.cpp */,
</span><ins>+                                3151180F1DB1ADD500176304 /* ExtendedColor.cpp */,
</ins><span class="cx">                                 41973B5A1AF2286A006C7B36 /* FileSystem.cpp */,
</span><span class="cx">                                 83B88A331C80056D00BB2418 /* HTMLParserIdioms.cpp */,
</span><span class="cx">                                 14464012167A8305000BD218 /* LayoutUnit.cpp */,
</span><span class="lines">@@ -2431,6 +2434,7 @@
</span><span class="cx">                                 7CCE7EC51A411A7E00447C4C /* MemoryCacheDisableWithinResourceLoadDelegate.mm in Sources */,
</span><span class="cx">                                 7CCE7EC61A411A7E00447C4C /* MemoryCachePruneWithinResourceLoadDelegate.mm in Sources */,
</span><span class="cx">                                 7C83E0B71D0A64B800FEBCF3 /* MenuTypesForMouseEvents.cpp in Sources */,
</span><ins>+                                315118101DB1AE4000176304 /* ExtendedColor.cpp in Sources */,
</ins><span class="cx">                                 51CD1C6C1B38CE4300142CA5 /* ModalAlerts.mm in Sources */,
</span><span class="cx">                                 7C83E0B61D0A64B300FEBCF3 /* ModalAlertsSPI.cpp in Sources */,
</span><span class="cx">                                 7CCE7F011A411AE600447C4C /* MouseMoveAfterCrash.cpp in Sources */,
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebCoreExtendedColorcpp"></a>
<div class="addfile"><h4>Added: trunk/Tools/TestWebKitAPI/Tests/WebCore/ExtendedColor.cpp (0 => 207442)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebCore/ExtendedColor.cpp                                (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/ExtendedColor.cpp        2016-10-18 00:12:00 UTC (rev 207442)
</span><span class="lines">@@ -0,0 +1,161 @@
</span><ins>+/*
+ * Copyright (C) 2016 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.
+ */
+
+#include &quot;config.h&quot;
+
+#include &quot;Test.h&quot;
+#include &lt;WebCore/Color.h&gt;
+
+using namespace WebCore;
+
+namespace TestWebKitAPI {
+
+TEST(ExtendedColor, Constructor)
+{
+    Color c1(1.0, 0.5, 0.25, 1.0, ColorSpaceDisplayP3);
+    EXPECT_TRUE(c1.isExtended());
+    EXPECT_FLOAT_EQ(1.0, c1.asExtended().red());
+    EXPECT_FLOAT_EQ(0.5, c1.asExtended().green());
+    EXPECT_FLOAT_EQ(0.25, c1.asExtended().blue());
+    EXPECT_FLOAT_EQ(1.0, c1.asExtended().alpha());
+    EXPECT_EQ(static_cast&lt;unsigned&gt;(1), c1.asExtended().refCount());
+    EXPECT_TRUE(c1.cssText() == &quot;color(display-p3 1 0.5 0.25 / 1)&quot;);
+}
+
+TEST(ExtendedColor, CopyConstructor)
+{
+    Color c1(1.0, 0.5, 0.25, 1.0, ColorSpaceDisplayP3);
+    EXPECT_TRUE(c1.isExtended());
+
+    Color c2(c1);
+
+    EXPECT_FLOAT_EQ(1.0, c2.asExtended().red());
+    EXPECT_FLOAT_EQ(0.5, c2.asExtended().green());
+    EXPECT_FLOAT_EQ(0.25, c2.asExtended().blue());
+    EXPECT_FLOAT_EQ(1.0, c2.asExtended().alpha());
+    EXPECT_EQ(static_cast&lt;unsigned&gt;(2), c1.asExtended().refCount());
+    EXPECT_EQ(static_cast&lt;unsigned&gt;(2), c2.asExtended().refCount());
+    EXPECT_TRUE(c2.cssText() == &quot;color(display-p3 1 0.5 0.25 / 1)&quot;);
+}
+
+TEST(ExtendedColor, Assignment)
+{
+    Color c1(1.0, 0.5, 0.25, 1.0, ColorSpaceDisplayP3);
+    EXPECT_TRUE(c1.isExtended());
+
+    Color c2 = c1;
+
+    EXPECT_FLOAT_EQ(1.0, c2.asExtended().red());
+    EXPECT_FLOAT_EQ(0.5, c2.asExtended().green());
+    EXPECT_FLOAT_EQ(0.25, c2.asExtended().blue());
+    EXPECT_FLOAT_EQ(1.0, c2.asExtended().alpha());
+    EXPECT_EQ(static_cast&lt;unsigned&gt;(2), c1.asExtended().refCount());
+    EXPECT_EQ(static_cast&lt;unsigned&gt;(2), c2.asExtended().refCount());
+    EXPECT_TRUE(c2.cssText() == &quot;color(display-p3 1 0.5 0.25 / 1)&quot;);
+}
+
+TEST(ExtendedColor, MoveConstructor)
+{
+    Color c1(1.0, 0.5, 0.25, 1.0, ColorSpaceDisplayP3);
+    EXPECT_TRUE(c1.isExtended());
+
+    Color c2(WTFMove(c1));
+    // We should have moved the extended color pointer into c2,
+    // and set c1 to invalid so that it doesn't cause deletion.
+    EXPECT_FALSE(c1.isExtended());
+    EXPECT_FALSE(c1.isValid());
+
+    EXPECT_FLOAT_EQ(1.0, c2.asExtended().red());
+    EXPECT_FLOAT_EQ(0.5, c2.asExtended().green());
+    EXPECT_FLOAT_EQ(0.25, c2.asExtended().blue());
+    EXPECT_FLOAT_EQ(1.0, c2.asExtended().alpha());
+    EXPECT_EQ(static_cast&lt;unsigned&gt;(1), c2.asExtended().refCount());
+    EXPECT_TRUE(c2.cssText() == &quot;color(display-p3 1 0.5 0.25 / 1)&quot;);
+}
+
+TEST(ExtendedColor, MoveAssignment)
+{
+    Color c1(1.0, 0.5, 0.25, 1.0, ColorSpaceDisplayP3);
+    EXPECT_TRUE(c1.isExtended());
+
+    Color c2 = WTFMove(c1);
+    // We should have moved the extended color pointer into c2,
+    // and set c1 to invalid so that it doesn't cause deletion.
+    EXPECT_FALSE(c1.isExtended());
+    EXPECT_FALSE(c1.isValid());
+
+    EXPECT_FLOAT_EQ(1.0, c2.asExtended().red());
+    EXPECT_FLOAT_EQ(0.5, c2.asExtended().green());
+    EXPECT_FLOAT_EQ(0.25, c2.asExtended().blue());
+    EXPECT_FLOAT_EQ(1.0, c2.asExtended().alpha());
+    EXPECT_EQ(static_cast&lt;unsigned&gt;(1), c2.asExtended().refCount());
+    EXPECT_TRUE(c2.cssText() == &quot;color(display-p3 1 0.5 0.25 / 1)&quot;);
+}
+
+TEST(ExtendedColor, BasicReferenceCounting)
+{
+    Color* c1 = new Color(1.0, 0.5, 0.25, 1.0, ColorSpaceDisplayP3);
+    EXPECT_TRUE(c1-&gt;isExtended());
+
+    Color* c2 = new Color(*c1);
+    Color* c3 = new Color(*c2);
+
+    EXPECT_FLOAT_EQ(1.0, c2-&gt;asExtended().red());
+    EXPECT_FLOAT_EQ(0.5, c2-&gt;asExtended().green());
+    EXPECT_FLOAT_EQ(0.25, c2-&gt;asExtended().blue());
+    EXPECT_FLOAT_EQ(1.0, c2-&gt;asExtended().alpha());
+    EXPECT_EQ(static_cast&lt;unsigned&gt;(3), c2-&gt;asExtended().refCount());
+    EXPECT_TRUE(c2-&gt;cssText() == &quot;color(display-p3 1 0.5 0.25 / 1)&quot;);
+
+    delete c1;
+    EXPECT_EQ(static_cast&lt;unsigned&gt;(2), c2-&gt;asExtended().refCount());
+
+    delete c2;
+    EXPECT_EQ(static_cast&lt;unsigned&gt;(1), c3-&gt;asExtended().refCount());
+
+    delete c3;
+}
+
+Color makeColor()
+{
+    Color c1(1.0, 0.5, 0.25, 1.0, ColorSpaceDisplayP3);
+    EXPECT_TRUE(c1.isExtended());
+    EXPECT_EQ(static_cast&lt;unsigned&gt;(1), c1.asExtended().refCount());
+
+    return c1;
+}
+
+TEST(ExtendedColor, ReturnValues)
+{
+    Color c2 = makeColor();
+    EXPECT_TRUE(c2.isExtended());
+
+    EXPECT_EQ(static_cast&lt;unsigned&gt;(1), c2.asExtended().refCount());
+    EXPECT_TRUE(c2.cssText() == &quot;color(display-p3 1 0.5 0.25 / 1)&quot;);
+
+}
+
+
+} // namespace TestWebKitAPI
</ins><span class="cx">Property changes on: trunk/Tools/TestWebKitAPI/Tests/WebCore/ExtendedColor.cpp
</span><span class="cx">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4>Added: svn:eol-style</h4></div>
<ins>+native
</ins><span class="cx">\ No newline at end of property
</span><a id="svnkeywords"></a>
<div class="addfile"><h4>Added: svn:keywords</h4></div>
<ins>+Date Author Id Revision HeadURL
</ins><span class="cx">\ No newline at end of property
</span></div>

</body>
</html>