<!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>[165970] 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/165970">165970</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-03-20 10:37:16 -0700 (Thu, 20 Mar 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[CSS Blending] Blending operation is not isolated when setting z-index on parent from javascript
https://bugs.webkit.org/show_bug.cgi?id=129307

Patch by Mihai Tica &lt;mitica@adobe.com&gt; on 2014-03-20
Reviewed by Dean Jackson.

Source/WebCore:

Reimplement the logic behind isolating blend modes. The blending operation should be limited to the
contents of the parent stacking context. The proposed solution implies adding logic in updateDescendantDependentFlags,
to track child elements that have blending and create a transparency layer that triggers isolation.

Tests: css3/compositing/blend-mode-background.html
       fast/repaint/blend-mode-isolate-stacking-context.html

* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::RenderLayer): Remove old members, add new members to constructor.
(WebCore::RenderLayer::updateBlendMode): Update parent stacking context isolation on blend mode change.
(WebCore::RenderLayer::updateNonCompositedParentStackingContextHasBlendedChild):
- Set m_hasBlendedElementInChildStackingContext for the non composited parent stacking context.
(WebCore::RenderLayer::dirtyAncestorParentStackingContextHasBlendedElement):
- Set flag so isolation should be considered in updateDescendantDependentFlags.
(WebCore::RenderLayer::nonCompositedParentStackingContextHasBlendedChild):
- Return whether the non composited parent stacking context isolates blending.
(WebCore::RenderLayer::updateDescendantDependentFlags): Add logic for isolating blending.
(WebCore::RenderLayer::addChild): Call to updateNonCompositedParentStackingContextHasBlendedChild if needed.
(WebCore::RenderLayer::removeChild): Call to dirtyAncestorParentStackingContextHasBlendedElement if needed.
(WebCore::RenderLayer::updateStackingContextsAfterStyleChange): Update isolation when a stacking context was set or unset.
(WebCore::RenderLayer::styleChanged): Removed oldStyle parameter from updateBlendMode call.
 Update parent stacking context isolation on blend mode change.
* rendering/RenderLayer.h:
- Add members, getters and setters for tracking whether the element has a blended child:
    - m_hasBlendedElementInChildStackingContext
    - m_hasBlendedElementInChildStackingContextStatusDirty
- Removed m_updateParentStackingContextShouldIsolateBlendingDirty (replaced with m_hasBlendedElementInChildStackingContextStatusDirty)
- Removed m_isolatesBlending (replaced with m_hasBlendedElementInChildStackingContext)
- Updated the isolatesBlending method to return true only when the element is a stacking context and has a blended child.
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::computeCompositingRequirements): Removed layer.updateParentStackingContextShouldIsolateBlending call.

LayoutTests:

Test if setting or unsetting stacking context or blend mode from script correctly updates blending
isolation.

* css3/compositing/blend-mode-background.html: Added.
* fast/repaint/blend-mode-isolate-stacking-context-expected.txt: Added.
* fast/repaint/blend-mode-isolate-stacking-context.html: Added.
* platform/mac/css3/compositing/blend-mode-background-expected.png: Added.
* platform/mac/css3/compositing/blend-mode-background-expected.txt: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayercpp">trunk/Source/WebCore/rendering/RenderLayer.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerh">trunk/Source/WebCore/rendering/RenderLayer.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerCompositorcpp">trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestscss3compositingblendmodebackgroundhtml">trunk/LayoutTests/css3/compositing/blend-mode-background.html</a></li>
<li><a href="#trunkLayoutTestsfastrepaintblendmodeisolatestackingcontextexpectedtxt">trunk/LayoutTests/fast/repaint/blend-mode-isolate-stacking-context-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastrepaintblendmodeisolatestackingcontexthtml">trunk/LayoutTests/fast/repaint/blend-mode-isolate-stacking-context.html</a></li>
<li><a href="#trunkLayoutTestsplatformmaccss3compositingblendmodebackgroundexpectedpng">trunk/LayoutTests/platform/mac/css3/compositing/blend-mode-background-expected.png</a></li>
<li><a href="#trunkLayoutTestsplatformmaccss3compositingblendmodebackgroundexpectedtxt">trunk/LayoutTests/platform/mac/css3/compositing/blend-mode-background-expected.txt</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (165969 => 165970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-03-20 17:28:53 UTC (rev 165969)
+++ trunk/LayoutTests/ChangeLog        2014-03-20 17:37:16 UTC (rev 165970)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2014-03-20  Mihai Tica  &lt;mitica@adobe.com&gt;
+
+        [CSS Blending] Blending operation is not isolated when setting z-index on parent from javascript
+        https://bugs.webkit.org/show_bug.cgi?id=129307
+
+        Reviewed by Dean Jackson.
+
+        Test if setting or unsetting stacking context or blend mode from script correctly updates blending
+        isolation.
+
+        * css3/compositing/blend-mode-background.html: Added.
+        * fast/repaint/blend-mode-isolate-stacking-context-expected.txt: Added.
+        * fast/repaint/blend-mode-isolate-stacking-context.html: Added.
+        * platform/mac/css3/compositing/blend-mode-background-expected.png: Added.
+        * platform/mac/css3/compositing/blend-mode-background-expected.txt: Added.
+
</ins><span class="cx"> 2014-03-20  Radu Stavila  &lt;stavila@adobe.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [CSS Regions] Remove &quot;visibility:hidden&quot; from overflow-scrollable* tests
</span></span></pre></div>
<a id="trunkLayoutTestscss3compositingblendmodebackgroundhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/css3/compositing/blend-mode-background.html (0 => 165970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/css3/compositing/blend-mode-background.html                                (rev 0)
+++ trunk/LayoutTests/css3/compositing/blend-mode-background.html        2014-03-20 17:37:16 UTC (rev 165970)
</span><span class="lines">@@ -0,0 +1,18 @@
</span><ins>+&lt;!DOCTYPE HTML&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;style&gt;
+    div {
+        margin: 20px;
+        width: 60px;
+        height: 60px;
+        -webkit-mix-blend-mode: difference;
+        background: red;
+    }
+    body {
+        background: blue;
+    }
+&lt;/style&gt;
+&lt;body&gt;
+    &lt;div class=&quot;parent&quot;&gt;&lt;/div&gt;
+&lt;/body&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastrepaintblendmodeisolatestackingcontextexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/repaint/blend-mode-isolate-stacking-context-expected.txt (0 => 165970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/repaint/blend-mode-isolate-stacking-context-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/repaint/blend-mode-isolate-stacking-context-expected.txt        2014-03-20 17:37:16 UTC (rev 165970)
</span><span class="lines">@@ -0,0 +1,35 @@
</span><ins>+Test if setting blend mode creates isolation.
+
+Test if unsetting blend mode removes isolation.
+
+Test if unsetting a parent's stacking context correctly removes isolation.
+
+Test if switching a blend mode preserves isolation.
+
+Test if switching the property that causes the parent to create a stacking context preserves isolation.
+
+Test if unsetting a parent's stacking context correctly updates its parent isolation.
+
+(repaint rects
+  (rect 48 54 60 60)
+  (rect 48 54 60 60)
+  (rect 48 54 60 60)
+  (rect 48 54 60 60)
+  (rect 48 172 60 60)
+  (rect 48 172 60 60)
+  (rect 28 290 60 60)
+  (rect 48 290 60 60)
+  (rect 48 290 60 60)
+  (rect 48 408 60 60)
+  (rect 48 408 60 60)
+  (rect 28 526 60 60)
+  (rect 48 526 60 60)
+  (rect 48 644 60 60)
+  (rect 68 644 60 60)
+  (rect 68 644 60 60)
+  (rect 28 290 60 60)
+  (rect 48 644 60 60)
+  (rect 28 526 60 60)
+  (rect 88 644 20 60)
+)
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastrepaintblendmodeisolatestackingcontexthtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/repaint/blend-mode-isolate-stacking-context.html (0 => 165970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/repaint/blend-mode-isolate-stacking-context.html                                (rev 0)
+++ trunk/LayoutTests/fast/repaint/blend-mode-isolate-stacking-context.html        2014-03-20 17:37:16 UTC (rev 165970)
</span><span class="lines">@@ -0,0 +1,89 @@
</span><ins>+&lt;!DOCTYPE HTML&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;style&gt;
+    div {
+        margin: 20px;
+        width: 60px;
+        height: 60px;
+    }
+
+    .parent {
+        background: #0F0;
+    }
+
+    .child {
+        background: #00F;
+    }
+
+    .stacking {
+        position: relative;
+        z-index: 0;
+    }
+
+    .stacking2 {
+        opacity: 0.99;
+    }
+
+    .blender {
+        -webkit-mix-blend-mode: difference;
+    }
+
+    .blender2 {
+        -webkit-mix-blend-mode: screen;
+    }
+&lt;/style&gt;
+&lt;script&gt;
+    if (window.testRunner)
+        testRunner.dumpAsText(true);
+&lt;/script&gt;
+&lt;script src=&quot;resources/text-based-repaint.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
+&lt;!-- Repaint test to ensure that setting a blend mode dynamically triggers this operation
+    only with the contents of the nearest ancestor stacking context. --&gt;
+&lt;body onload=&quot;runRepaintTest()&quot;&gt;
+    &lt;p&gt;Test if setting blend mode creates isolation.&lt;/p&gt;
+    &lt;div class=&quot;parent stacking&quot;&gt;
+        &lt;div id=&quot;first&quot; class=&quot;child&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;p&gt;Test if unsetting blend mode removes isolation.&lt;/p&gt;
+    &lt;div class=&quot;parent stacking&quot;&gt;
+        &lt;div id=&quot;second&quot; class=&quot;child blender&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;p&gt;Test if unsetting a parent's stacking context correctly removes isolation.&lt;/p&gt;
+    &lt;div id=&quot;third&quot; class=&quot;parent stacking&quot;&gt;
+        &lt;div class=&quot;child blender&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;p&gt;Test if switching a blend mode preserves isolation.&lt;/p&gt;
+     &lt;div class=&quot;parent stacking&quot;&gt;
+         &lt;div id=&quot;fourth&quot; class=&quot;child blender&quot;&gt;&lt;/div&gt;
+     &lt;/div&gt;
+
+    &lt;p&gt;Test if switching the property that causes the parent to create a stacking context preserves isolation.&lt;/p&gt;
+    &lt;div id=&quot;fifth&quot; class=&quot;parent stacking&quot;&gt;
+        &lt;div class=&quot;child blender&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;p&gt;Test if unsetting a parent's stacking context correctly updates its parent isolation.&lt;/p&gt;
+    &lt;div class=&quot;parent stacking&quot;&gt;
+        &lt;div id=&quot;sixth&quot; class=&quot;parent stacking&quot;&gt;
+            &lt;div class=&quot;child blender&quot;&gt;&lt;/div&gt;
+        &lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;script&gt;
+        function repaintTest() {
+            document.getElementById('first').className = &quot;child blender&quot;;
+            document.getElementById('second').className = &quot;child&quot;;
+
+            document.getElementById('third').className = &quot;parent&quot;;
+
+            document.getElementById('fourth').className = &quot;child blender2&quot;;
+
+            document.getElementById('fifth').className = &quot;parent stacking2&quot;;
+            document.getElementById('sixth').className = &quot;parent&quot;;
+        }
+     &lt;/script&gt;
+ &lt;/body&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmaccss3compositingblendmodebackgroundexpectedpng"></a>
<div class="binary"><h4>Added: trunk/LayoutTests/platform/mac/css3/compositing/blend-mode-background-expected.png</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<span class="cx">Property changes on: trunk/LayoutTests/platform/mac/css3/compositing/blend-mode-background-expected.png
</span><span class="cx">___________________________________________________________________
</span><a id="svnmimetype"></a>
<div class="addfile"><h4>Added: svn:mime-type</h4></div>
<a id="trunkLayoutTestsplatformmaccss3compositingblendmodebackgroundexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/platform/mac/css3/compositing/blend-mode-background-expected.txt (0 => 165970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac/css3/compositing/blend-mode-background-expected.txt                                (rev 0)
+++ trunk/LayoutTests/platform/mac/css3/compositing/blend-mode-background-expected.txt        2014-03-20 17:37:16 UTC (rev 165970)
</span><span class="lines">@@ -0,0 +1,7 @@
</span><ins>+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x100
+  RenderBlock {HTML} at (0,0) size 800x100
+    RenderBody {BODY} at (8,20) size 784x60 [bgcolor=#0000FF]
+layer at (28,20) size 60x60
+  RenderBlock {DIV} at (20,0) size 60x60 [bgcolor=#FF0000]
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (165969 => 165970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-03-20 17:28:53 UTC (rev 165969)
+++ trunk/Source/WebCore/ChangeLog        2014-03-20 17:37:16 UTC (rev 165970)
</span><span class="lines">@@ -1,3 +1,42 @@
</span><ins>+2014-03-20  Mihai Tica  &lt;mitica@adobe.com&gt;
+
+        [CSS Blending] Blending operation is not isolated when setting z-index on parent from javascript
+        https://bugs.webkit.org/show_bug.cgi?id=129307
+
+        Reviewed by Dean Jackson.
+
+        Reimplement the logic behind isolating blend modes. The blending operation should be limited to the
+        contents of the parent stacking context. The proposed solution implies adding logic in updateDescendantDependentFlags,
+        to track child elements that have blending and create a transparency layer that triggers isolation.
+
+        Tests: css3/compositing/blend-mode-background.html
+               fast/repaint/blend-mode-isolate-stacking-context.html
+
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::RenderLayer): Remove old members, add new members to constructor.
+        (WebCore::RenderLayer::updateBlendMode): Update parent stacking context isolation on blend mode change.
+        (WebCore::RenderLayer::updateNonCompositedParentStackingContextHasBlendedChild):
+        - Set m_hasBlendedElementInChildStackingContext for the non composited parent stacking context.
+        (WebCore::RenderLayer::dirtyAncestorParentStackingContextHasBlendedElement):
+        - Set flag so isolation should be considered in updateDescendantDependentFlags.
+        (WebCore::RenderLayer::nonCompositedParentStackingContextHasBlendedChild):
+        - Return whether the non composited parent stacking context isolates blending.
+        (WebCore::RenderLayer::updateDescendantDependentFlags): Add logic for isolating blending.
+        (WebCore::RenderLayer::addChild): Call to updateNonCompositedParentStackingContextHasBlendedChild if needed.
+        (WebCore::RenderLayer::removeChild): Call to dirtyAncestorParentStackingContextHasBlendedElement if needed.
+        (WebCore::RenderLayer::updateStackingContextsAfterStyleChange): Update isolation when a stacking context was set or unset.
+        (WebCore::RenderLayer::styleChanged): Removed oldStyle parameter from updateBlendMode call.
+         Update parent stacking context isolation on blend mode change.
+        * rendering/RenderLayer.h:
+        - Add members, getters and setters for tracking whether the element has a blended child:
+            - m_hasBlendedElementInChildStackingContext
+            - m_hasBlendedElementInChildStackingContextStatusDirty
+        - Removed m_updateParentStackingContextShouldIsolateBlendingDirty (replaced with m_hasBlendedElementInChildStackingContextStatusDirty)
+        - Removed m_isolatesBlending (replaced with m_hasBlendedElementInChildStackingContext)
+        - Updated the isolatesBlending method to return true only when the element is a stacking context and has a blended child.
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::computeCompositingRequirements): Removed layer.updateParentStackingContextShouldIsolateBlending call.
+
</ins><span class="cx"> 2014-03-20  Martin Robinson  &lt;mrobinson@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] [CMake] Do not compile ProxyResolverSoup.cpp
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (165969 => 165970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.cpp        2014-03-20 17:28:53 UTC (rev 165969)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp        2014-03-20 17:37:16 UTC (rev 165970)
</span><span class="lines">@@ -185,8 +185,8 @@
</span><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(CSS_COMPOSITING)
</span><span class="cx">     , m_blendMode(BlendModeNormal)
</span><del>-    , m_isolatesBlending(false)
-    , m_updateParentStackingContextShouldIsolateBlendingDirty(false)
</del><ins>+    , m_hasBlendedElementInChildStackingContext(false)
+    , m_hasBlendedElementInChildStackingContextStatusDirty(false)
</ins><span class="cx"> #endif
</span><span class="cx">     , m_renderer(rendererLayerModelObject)
</span><span class="cx">     , m_parent(0)
</span><span class="lines">@@ -803,13 +803,16 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(CSS_COMPOSITING)
</span><span class="cx"> 
</span><del>-void RenderLayer::updateBlendMode(const RenderStyle* oldStyle)
</del><ins>+void RenderLayer::updateBlendMode()
</ins><span class="cx"> {
</span><del>-    m_updateParentStackingContextShouldIsolateBlendingDirty = false;
</del><ins>+    bool hadBlendMode = m_blendMode != BlendModeNormal;
+    if (hadBlendMode != hasBlendMode()) {
+        if (hasBlendMode())
+            updateNonCompositedParentStackingContextHasBlendedChild(true);
+        else
+            dirtyAncestorParentStackingContextHasBlendedElement();
+    }
</ins><span class="cx"> 
</span><del>-    if ((!oldStyle &amp;&amp; renderer().style().hasBlendMode()) || (oldStyle &amp;&amp; oldStyle-&gt;hasBlendMode() != renderer().style().hasBlendMode()))
-        m_updateParentStackingContextShouldIsolateBlendingDirty = true;
-
</del><span class="cx">     BlendMode newBlendMode = renderer().style().blendMode();
</span><span class="cx">     if (newBlendMode != m_blendMode) {
</span><span class="cx">         m_blendMode = newBlendMode;
</span><span class="lines">@@ -818,24 +821,37 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderLayer::updateParentStackingContextShouldIsolateBlending()
</del><ins>+void RenderLayer::updateNonCompositedParentStackingContextHasBlendedChild(bool hasBlendedChild)
</ins><span class="cx"> {
</span><del>-    if (!m_updateParentStackingContextShouldIsolateBlendingDirty)
</del><ins>+    if (isComposited())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    if (isComposited()) {
-        m_updateParentStackingContextShouldIsolateBlendingDirty = false;
-        return;
</del><ins>+    for (auto ancestor = parent(); ancestor &amp;&amp; !ancestor-&gt;isComposited() &amp;&amp; !ancestor-&gt;renderer().isRoot(); ancestor = ancestor-&gt;parent()) {
+        ancestor-&gt;m_hasBlendedElementInChildStackingContext = hasBlendedChild;
+
+        if (ancestor-&gt;isStackingContext())
+            break;
</ins><span class="cx">     }
</span><ins>+}
</ins><span class="cx"> 
</span><del>-    for (auto ancestor = parent(); ancestor &amp;&amp; !ancestor-&gt;isComposited() &amp;&amp; !ancestor-&gt;isRootLayer(); ancestor = ancestor-&gt;parent()) {
-        if (ancestor-&gt;isStackingContext()) {
-            ancestor-&gt;m_isolatesBlending = renderer().style().hasBlendMode();
</del><ins>+void RenderLayer::dirtyAncestorParentStackingContextHasBlendedElement()
+{
+    for (auto layer = this; layer &amp;&amp; !layer-&gt;isComposited() &amp;&amp; !layer-&gt;m_hasBlendedElementInChildStackingContextStatusDirty; layer = layer-&gt;parent()) {
+        layer-&gt;m_hasBlendedElementInChildStackingContextStatusDirty = true;
+
+        if (layer-&gt;isStackingContext())
</ins><span class="cx">             break;
</span><del>-        }
</del><span class="cx">     }
</span><ins>+}
</ins><span class="cx"> 
</span><del>-    m_updateParentStackingContextShouldIsolateBlendingDirty = false;
</del><ins>+bool RenderLayer::nonCompositedParentStackingContextHasBlendedChild() const
+{
+    for (auto ancestor = parent(); ancestor &amp;&amp; !ancestor-&gt;isComposited() &amp;&amp; !ancestor-&gt;renderer().isRoot(); ancestor = ancestor-&gt;parent()) {
+        if (ancestor-&gt;isStackingContext())
+            return ancestor-&gt;hasBlendedElementInChildStackingContext();
+    }
+
+    return false;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif
</span><span class="lines">@@ -1080,10 +1096,11 @@
</span><span class="cx"> 
</span><span class="cx"> void RenderLayer::updateDescendantDependentFlags(HashSet&lt;const RenderObject*&gt;* outOfFlowDescendantContainingBlocks)
</span><span class="cx"> {
</span><del>-    if (m_visibleDescendantStatusDirty || m_hasSelfPaintingLayerDescendantDirty || m_hasOutOfFlowPositionedDescendantDirty) {
</del><ins>+    if (m_visibleDescendantStatusDirty || m_hasSelfPaintingLayerDescendantDirty || m_hasOutOfFlowPositionedDescendantDirty || hasBlendedElementInChildStackingContextStatusDirty()) {
</ins><span class="cx">         m_hasVisibleDescendant = false;
</span><span class="cx">         m_hasSelfPaintingLayerDescendant = false;
</span><span class="cx">         m_hasOutOfFlowPositionedDescendant = false;
</span><ins>+        setHasBlendedElementInChildStackingContext(false);
</ins><span class="cx"> 
</span><span class="cx">         HashSet&lt;const RenderObject*&gt; childOutOfFlowDescendantContainingBlocks;
</span><span class="cx">         for (RenderLayer* child = firstChild(); child; child = child-&gt;nextSibling()) {
</span><span class="lines">@@ -1103,12 +1120,14 @@
</span><span class="cx">             bool hasVisibleDescendant = child-&gt;m_hasVisibleContent || child-&gt;m_hasVisibleDescendant;
</span><span class="cx">             bool hasSelfPaintingLayerDescendant = child-&gt;isSelfPaintingLayer() || child-&gt;hasSelfPaintingLayerDescendant();
</span><span class="cx">             bool hasOutOfFlowPositionedDescendant = !childOutOfFlowDescendantContainingBlocks.isEmpty();
</span><ins>+            bool hasBlendedElementInChildStackingContext = child-&gt;hasBlendMode() || child-&gt;hasBlendedElementInChildStackingContext();
</ins><span class="cx"> 
</span><span class="cx">             m_hasVisibleDescendant |= hasVisibleDescendant;
</span><span class="cx">             m_hasSelfPaintingLayerDescendant |= hasSelfPaintingLayerDescendant;
</span><span class="cx">             m_hasOutOfFlowPositionedDescendant |= hasOutOfFlowPositionedDescendant;
</span><ins>+            setHasBlendedElementInChildStackingContext(this-&gt;hasBlendedElementInChildStackingContext() | hasBlendedElementInChildStackingContext);
</ins><span class="cx"> 
</span><del>-            if (m_hasVisibleDescendant &amp;&amp; m_hasSelfPaintingLayerDescendant &amp;&amp; m_hasOutOfFlowPositionedDescendant)
</del><ins>+            if (m_hasVisibleDescendant &amp;&amp; m_hasSelfPaintingLayerDescendant &amp;&amp; m_hasOutOfFlowPositionedDescendant &amp;&amp; this-&gt;hasBlendedElementInChildStackingContext())
</ins><span class="cx">                 break;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -1122,6 +1141,8 @@
</span><span class="cx">             updateNeedsCompositedScrolling();
</span><span class="cx"> 
</span><span class="cx">         m_hasOutOfFlowPositionedDescendantDirty = false;
</span><ins>+
+        setHasBlendedElementInChildStackingContextStatusDirty(false);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (m_visibleContentStatusDirty) {
</span><span class="lines">@@ -1777,6 +1798,11 @@
</span><span class="cx">     if (child-&gt;renderer().isOutOfFlowPositioned() || child-&gt;hasOutOfFlowPositionedDescendant())
</span><span class="cx">         setAncestorChainHasOutOfFlowPositionedDescendant(child-&gt;renderer().containingBlock());
</span><span class="cx"> 
</span><ins>+#if ENABLE(CSS_COMPOSITING)
+    if (child-&gt;hasBlendMode() || (!child-&gt;isStackingContext() &amp;&amp; child-&gt;hasBlendedElementInChildStackingContext()))
+        child-&gt;updateNonCompositedParentStackingContextHasBlendedChild(true);
+#endif
+
</ins><span class="cx">     compositor().layerWasAdded(*this, *child);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1819,6 +1845,11 @@
</span><span class="cx">     if (oldChild-&gt;isSelfPaintingLayer() || oldChild-&gt;hasSelfPaintingLayerDescendant())
</span><span class="cx">         dirtyAncestorChainHasSelfPaintingLayerDescendantStatus();
</span><span class="cx"> 
</span><ins>+#if ENABLE(CSS_COMPOSITING)
+    if (oldChild-&gt;hasBlendMode() || oldChild-&gt;isolatesBlending())
+        dirtyAncestorParentStackingContextHasBlendedElement();
+#endif
+
</ins><span class="cx">     return oldChild;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -6405,6 +6436,12 @@
</span><span class="cx">             dirtyZOrderLists();
</span><span class="cx">         else
</span><span class="cx">             clearZOrderLists();
</span><ins>+
+#if ENABLE(CSS_COMPOSITING)
+            m_hasBlendedElementInChildStackingContext = isStackingContext ? nonCompositedParentStackingContextHasBlendedChild() : false;
+            dirtyAncestorParentStackingContextHasBlendedElement();
+#endif
+
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -6555,7 +6592,7 @@
</span><span class="cx">     updateDescendantDependentFlags();
</span><span class="cx">     updateTransform();
</span><span class="cx"> #if ENABLE(CSS_COMPOSITING)
</span><del>-    updateBlendMode(oldStyle);
</del><ins>+    updateBlendMode();
</ins><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(CSS_FILTERS)
</span><span class="cx">     updateOrRemoveFilterClients();
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.h (165969 => 165970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.h        2014-03-20 17:28:53 UTC (rev 165969)
+++ trunk/Source/WebCore/rendering/RenderLayer.h        2014-03-20 17:37:16 UTC (rev 165970)
</span><span class="lines">@@ -503,8 +503,7 @@
</span><span class="cx">     void updateTransform();
</span><span class="cx">     
</span><span class="cx"> #if ENABLE(CSS_COMPOSITING)
</span><del>-    void updateBlendMode(const RenderStyle*);
-    void updateParentStackingContextShouldIsolateBlending();
</del><ins>+    void updateBlendMode();
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     const LayoutSize&amp; offsetForInFlowPosition() const { return m_offsetForInFlowPosition; }
</span><span class="lines">@@ -790,12 +789,48 @@
</span><span class="cx">     bool isolatesBlending() const
</span><span class="cx">     {
</span><span class="cx"> #if ENABLE(CSS_COMPOSITING)
</span><del>-        return m_isolatesBlending;
</del><ins>+        return m_hasBlendedElementInChildStackingContext &amp;&amp; isStackingContext();
</ins><span class="cx"> #else
</span><span class="cx">         return false;
</span><span class="cx"> #endif
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    bool hasBlendedElementInChildStackingContext() const
+    {
+#if ENABLE(CSS_COMPOSITING)
+        return m_hasBlendedElementInChildStackingContext;
+#else
+        return false;
+#endif
+    }
+
+    void setHasBlendedElementInChildStackingContext(bool hasBlendedElementInChildStackingContext)
+    {
+#if ENABLE(CSS_COMPOSITING)
+        m_hasBlendedElementInChildStackingContext = hasBlendedElementInChildStackingContext;
+#else
+        UNUSED_PARAM(hasBlendedElementInChildStackingContext);
+#endif
+    }
+
+    bool hasBlendedElementInChildStackingContextStatusDirty() const
+    {
+#if ENABLE(CSS_COMPOSITING)
+        return m_hasBlendedElementInChildStackingContextStatusDirty;
+#else
+        return false;
+#endif
+    }
+
+    void setHasBlendedElementInChildStackingContextStatusDirty(bool hasBlendedElementInChildStackingContextStatusDirty)
+    {
+#if ENABLE(CSS_COMPOSITING)
+        m_hasBlendedElementInChildStackingContextStatusDirty = hasBlendedElementInChildStackingContextStatusDirty;
+#else
+        UNUSED_PARAM(hasBlendedElementInChildStackingContextStatusDirty);
+#endif
+    }
+
</ins><span class="cx">     bool isComposited() const { return m_backing != 0; }
</span><span class="cx">     bool hasCompositingDescendant() const { return m_hasCompositingDescendant; }
</span><span class="cx">     bool hasCompositedMask() const;
</span><span class="lines">@@ -1109,6 +1144,12 @@
</span><span class="cx">     void updateOrRemoveFilterEffectRenderer();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if ENABLE(CSS_COMPOSITING)
+    void updateNonCompositedParentStackingContextHasBlendedChild(bool hasBlendedChild);
+    void dirtyAncestorParentStackingContextHasBlendedElement();
+    bool nonCompositedParentStackingContextHasBlendedChild() const;
+#endif
+
</ins><span class="cx">     void parentClipRects(const ClipRectsContext&amp;, ClipRects&amp;) const;
</span><span class="cx">     ClipRect backgroundClipRect(const ClipRectsContext&amp;) const;
</span><span class="cx"> 
</span><span class="lines">@@ -1246,8 +1287,8 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(CSS_COMPOSITING)
</span><span class="cx">     BlendMode m_blendMode : 5;
</span><del>-    bool m_isolatesBlending : 1;
-    bool m_updateParentStackingContextShouldIsolateBlendingDirty : 1;
</del><ins>+    bool m_hasBlendedElementInChildStackingContext : 1;
+    bool m_hasBlendedElementInChildStackingContextStatusDirty : 1;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     RenderLayerModelObject&amp; m_renderer;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerCompositorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (165969 => 165970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2014-03-20 17:28:53 UTC (rev 165969)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2014-03-20 17:37:16 UTC (rev 165970)
</span><span class="lines">@@ -1047,10 +1047,6 @@
</span><span class="cx">     layer.updateDescendantDependentFlags();
</span><span class="cx">     layer.updateLayerListsIfNeeded();
</span><span class="cx"> 
</span><del>-#if ENABLE(CSS_COMPOSITING)
-    layer.updateParentStackingContextShouldIsolateBlending();
-#endif
-
</del><span class="cx">     if (layer.isFlowThreadCollectingGraphicsLayersUnderRegions()) {
</span><span class="cx">         RenderFlowThread&amp; flowThread = toRenderFlowThread(layer.renderer());
</span><span class="cx">         layer.setHasCompositingDescendant(flowThread.hasCompositingRegionDescendant());
</span></span></pre>
</div>
</div>

</body>
</html>