<!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>[177214] trunk/Source</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/177214">177214</a></dd>
<dt>Author</dt> <dd>simon.fraser@apple.com</dd>
<dt>Date</dt> <dd>2014-12-12 01:16:13 -0800 (Fri, 12 Dec 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Layer borders on contentsLayers don't correctly toggle with the rest of the borders
https://bugs.webkit.org/show_bug.cgi?id=139570
rdar://problem/18007746

Reviewed by Tim Horton.

Source/WebCore:

The &quot;Show Debug Borders&quot; toggle didn't cleanly remove layer borders from
content layers (image, video), nor did it deal with cloned layers (reflections).

Fix by making updateDebugBorder() update the layer borders on the contents
layer and cloned layers, moving some code around to avoid having colors
in more than one place. If the borders are hidden, send an invalid color
to PlatformCALayer::setBorderColor(), which now knows to remove the color
property on the layer (to avoid leaving transparent border color properties
on CALayers).

* platform/graphics/ca/GraphicsLayerCA.cpp:
(WebCore::setLayerDebugBorder):
(WebCore::contentsLayerDebugBorderColor):
(WebCore::cloneLayerDebugBorderColor):
(WebCore::GraphicsLayerCA::updateDebugBorder):
(WebCore::GraphicsLayerCA::setDebugBorder):
* platform/graphics/ca/mac/PlatformCALayerMac.mm:
(PlatformCALayerMac::setBorderColor):

Source/WebKit2:

Return nil if the color is invalid, to remove the color from the layer's
border or background.

* Shared/mac/RemoteLayerTreePropertyApplier.mm:
(WebKit::cgColorFromColor):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscaGraphicsLayerCAcpp">trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscamacPlatformCALayerMacmm">trunk/Source/WebCore/platform/graphics/ca/mac/PlatformCALayerMac.mm</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2SharedmacRemoteLayerTreePropertyAppliermm">trunk/Source/WebKit2/Shared/mac/RemoteLayerTreePropertyApplier.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (177213 => 177214)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-12-12 06:00:59 UTC (rev 177213)
+++ trunk/Source/WebCore/ChangeLog        2014-12-12 09:16:13 UTC (rev 177214)
</span><span class="lines">@@ -1,3 +1,30 @@
</span><ins>+2014-12-12  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        Layer borders on contentsLayers don't correctly toggle with the rest of the borders
+        https://bugs.webkit.org/show_bug.cgi?id=139570
+        rdar://problem/18007746
+
+        Reviewed by Tim Horton.
+        
+        The &quot;Show Debug Borders&quot; toggle didn't cleanly remove layer borders from
+        content layers (image, video), nor did it deal with cloned layers (reflections).
+        
+        Fix by making updateDebugBorder() update the layer borders on the contents
+        layer and cloned layers, moving some code around to avoid having colors
+        in more than one place. If the borders are hidden, send an invalid color
+        to PlatformCALayer::setBorderColor(), which now knows to remove the color
+        property on the layer (to avoid leaving transparent border color properties
+        on CALayers).
+
+        * platform/graphics/ca/GraphicsLayerCA.cpp:
+        (WebCore::setLayerDebugBorder):
+        (WebCore::contentsLayerDebugBorderColor):
+        (WebCore::cloneLayerDebugBorderColor):
+        (WebCore::GraphicsLayerCA::updateDebugBorder):
+        (WebCore::GraphicsLayerCA::setDebugBorder):
+        * platform/graphics/ca/mac/PlatformCALayerMac.mm:
+        (PlatformCALayerMac::setBorderColor):
+
</ins><span class="cx"> 2014-12-11  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Crash when trying to inspect LocalStorage
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscaGraphicsLayerCAcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp (177213 => 177214)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp        2014-12-12 06:00:59 UTC (rev 177213)
+++ trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp        2014-12-12 09:16:13 UTC (rev 177214)
</span><span class="lines">@@ -1820,12 +1820,53 @@
</span><span class="cx">     m_layer-&gt;setAcceleratesDrawing(m_acceleratesDrawing);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static void setLayerDebugBorder(PlatformCALayer&amp; layer, Color borderColor, float borderWidth)
+{
+    layer.setBorderColor(borderColor);
+    layer.setBorderWidth(borderColor.isValid() ? borderWidth : 0);
+}
+
+static float contentsLayerBorderWidth = 4;
+static Color contentsLayerDebugBorderColor(bool showingBorders)
+{
+    return showingBorders ? Color(0, 0, 128, 180) : Color();
+}
+
+static float cloneLayerBorderWidth = 2;
+static Color cloneLayerDebugBorderColor(bool showingBorders)
+{
+    return showingBorders ? Color(255, 122, 251) : Color();
+}
+
</ins><span class="cx"> void GraphicsLayerCA::updateDebugBorder()
</span><span class="cx"> {
</span><del>-    if (isShowingDebugBorder())
-        updateDebugIndicators();
-    else
-        m_layer-&gt;setBorderWidth(0);
</del><ins>+    Color borderColor;
+    float width = 0;
+
+    bool showDebugBorders = isShowingDebugBorder();
+    if (showDebugBorders)
+        getDebugBorderInfo(borderColor, width);
+
+    setLayerDebugBorder(*m_layer, borderColor, width);
+    if (m_contentsLayer)
+        setLayerDebugBorder(*m_contentsLayer, contentsLayerDebugBorderColor(showDebugBorders), contentsLayerBorderWidth);
+
+    if (m_layerClones) {
+        for (auto&amp; clone : m_layerClones-&gt;values())
+            setLayerDebugBorder(*clone, borderColor, width);
+    }
+
+    if (m_structuralLayerClones) {
+        Color cloneLayerBorderColor = cloneLayerDebugBorderColor(showDebugBorders);
+        for (auto&amp; clone : m_structuralLayerClones-&gt;values())
+            setLayerDebugBorder(*clone, cloneLayerBorderColor, cloneLayerBorderWidth);
+    }
+
+    if (m_contentsLayerClones) {
+        Color contentsLayerBorderColor = contentsLayerDebugBorderColor(showDebugBorders);
+        for (auto&amp; contentsLayerClone : m_contentsLayerClones-&gt;values())
+            setLayerDebugBorder(*contentsLayerClone, contentsLayerBorderColor, contentsLayerBorderWidth);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> FloatRect GraphicsLayerCA::adjustTiledLayerVisibleRect(TiledBacking* tiledBacking, const FloatRect&amp; oldVisibleRect, const FloatRect&amp; newVisibleRect, const FloatSize&amp; oldSize, const FloatSize&amp; newSize)
</span><span class="lines">@@ -3009,14 +3050,8 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void GraphicsLayerCA::setDebugBorder(const Color&amp; color, float borderWidth)
</span><del>-{    
-    if (color.isValid()) {
-        m_layer-&gt;setBorderColor(color);
-        m_layer-&gt;setBorderWidth(borderWidth);
-    } else {
-        m_layer-&gt;setBorderColor(Color::transparent);
-        m_layer-&gt;setBorderWidth(0);
-    }
</del><ins>+{
+    setLayerDebugBorder(*m_layer, color, borderWidth);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void GraphicsLayerCA::setCustomAppearance(CustomAppearance customAppearance)
</span><span class="lines">@@ -3138,10 +3173,7 @@
</span><span class="cx">     } else
</span><span class="cx">         contentsLayer-&gt;setAnchorPoint(FloatPoint3D());
</span><span class="cx"> 
</span><del>-    if (isShowingDebugBorder()) {
-        contentsLayer-&gt;setBorderColor(Color(0, 0, 128, 180));
-        contentsLayer-&gt;setBorderWidth(4);
-    }
</del><ins>+    setLayerDebugBorder(*contentsLayer, contentsLayerDebugBorderColor(isShowingDebugBorder()), contentsLayerBorderWidth);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> PassRefPtr&lt;PlatformCALayer&gt; GraphicsLayerCA::findOrMakeClone(CloneID cloneID, PlatformCALayer *sourceLayer, LayerMap* clones, CloneLevel cloneLevel)
</span><span class="lines">@@ -3339,12 +3371,9 @@
</span><span class="cx">         newLayer-&gt;setOpacity(layer-&gt;opacity());
</span><span class="cx">         moveOrCopyAnimations(Copy, layer, newLayer.get());
</span><span class="cx">     }
</span><del>-    
-    if (isShowingDebugBorder()) {
-        newLayer-&gt;setBorderColor(Color(255, 122, 251));
-        newLayer-&gt;setBorderWidth(2);
-    }
-    
</del><ins>+
+    setLayerDebugBorder(*newLayer, cloneLayerDebugBorderColor(isShowingDebugBorder()), cloneLayerBorderWidth);
+
</ins><span class="cx">     return newLayer;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscamacPlatformCALayerMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/mac/PlatformCALayerMac.mm (177213 => 177214)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/mac/PlatformCALayerMac.mm        2014-12-12 06:00:59 UTC (rev 177213)
+++ trunk/Source/WebCore/platform/graphics/ca/mac/PlatformCALayerMac.mm        2014-12-12 09:16:13 UTC (rev 177214)
</span><span class="lines">@@ -694,15 +694,21 @@
</span><span class="cx"> 
</span><span class="cx"> void PlatformCALayerMac::setBorderColor(const Color&amp; value)
</span><span class="cx"> {
</span><del>-    CGFloat components[4];
-    value.getRGBA(components[0], components[1], components[2], components[3]);
</del><ins>+    if (value.isValid()) {
+        CGFloat components[4];
+        value.getRGBA(components[0], components[1], components[2], components[3]);
</ins><span class="cx"> 
</span><del>-    RetainPtr&lt;CGColorSpaceRef&gt; colorSpace = adoptCF(CGColorSpaceCreateDeviceRGB());
-    RetainPtr&lt;CGColorRef&gt; color = adoptCF(CGColorCreate(colorSpace.get(), components));
</del><ins>+        RetainPtr&lt;CGColorSpaceRef&gt; colorSpace = adoptCF(CGColorSpaceCreateDeviceRGB());
+        RetainPtr&lt;CGColorRef&gt; color = adoptCF(CGColorCreate(colorSpace.get(), components));
</ins><span class="cx"> 
</span><del>-    BEGIN_BLOCK_OBJC_EXCEPTIONS
-    [m_layer.get() setBorderColor:color.get()];
-    END_BLOCK_OBJC_EXCEPTIONS
</del><ins>+        BEGIN_BLOCK_OBJC_EXCEPTIONS
+        [m_layer.get() setBorderColor:color.get()];
+        END_BLOCK_OBJC_EXCEPTIONS
+    } else {
+        BEGIN_BLOCK_OBJC_EXCEPTIONS
+        [m_layer.get() setBorderColor:nil];
+        END_BLOCK_OBJC_EXCEPTIONS
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> float PlatformCALayerMac::opacity() const
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (177213 => 177214)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-12-12 06:00:59 UTC (rev 177213)
+++ trunk/Source/WebKit2/ChangeLog        2014-12-12 09:16:13 UTC (rev 177214)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2014-12-12  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        Layer borders on contentsLayers don't correctly toggle with the rest of the borders
+        https://bugs.webkit.org/show_bug.cgi?id=139570
+        rdar://problem/18007746
+
+        Reviewed by Tim Horton.
+        
+        Return nil if the color is invalid, to remove the color from the layer's
+        border or background.
+
+        * Shared/mac/RemoteLayerTreePropertyApplier.mm:
+        (WebKit::cgColorFromColor):
+
</ins><span class="cx"> 2014-12-11  Gavin Barraclough  &lt;barraclough@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Track pages preventing suppression in WebProcessProxy using RefCounter
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedmacRemoteLayerTreePropertyAppliermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/mac/RemoteLayerTreePropertyApplier.mm (177213 => 177214)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/mac/RemoteLayerTreePropertyApplier.mm        2014-12-12 06:00:59 UTC (rev 177213)
+++ trunk/Source/WebKit2/Shared/mac/RemoteLayerTreePropertyApplier.mm        2014-12-12 09:16:13 UTC (rev 177214)
</span><span class="lines">@@ -82,6 +82,9 @@
</span><span class="cx"> 
</span><span class="cx"> static RetainPtr&lt;CGColorRef&gt; cgColorFromColor(Color color)
</span><span class="cx"> {
</span><ins>+    if (!color.isValid())
+        return nil;
+
</ins><span class="cx">     CGFloat components[4];
</span><span class="cx">     color.getRGBA(components[0], components[1], components[2], components[3]);
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>