Title: [201648] trunk
Revision
201648
Author
commit-qu...@webkit.org
Date
2016-06-03 11:13:52 -0700 (Fri, 03 Jun 2016)

Log Message

Reflection of element does not respect backdrop-filter property
https://bugs.webkit.org/show_bug.cgi?id=158201

Patch by Antoine Quint <grao...@apple.com> on 2016-06-03
Reviewed by Dean Jackson.

Source/WebCore:

We weren't cloning the PlatformCALayer for the backdrop so reflections would simply
not show their backdrops. We now follow the same pattern as other PlatformCALayers
owned by a GraphicsLayerCA and keep a list of backdrop layer clones that we add
to the structural layer when cloning to match the layer order of the original
and update the backdrop layer clone properties to match the original when the
backdrop filters or rectangle changes.

Tests: css3/filters/backdrop/backdrop-filter-with-reflection-add-backdrop.html
       css3/filters/backdrop/backdrop-filter-with-reflection-remove-backdrop.html
       css3/filters/backdrop/backdrop-filter-with-reflection-value-change.html
       css3/filters/backdrop/backdrop-filter-with-reflection.html

* platform/graphics/ca/GraphicsLayerCA.cpp:
(WebCore::GraphicsLayerCA::updateBackdropFilters):
(WebCore::GraphicsLayerCA::updateBackdropFiltersRect):
Update backdrop layer clones to match new values set when the backdrop filter
configuration changes.

(WebCore::GraphicsLayerCA::ensureCloneLayers):
Create the backdrop layer clones map if needed and clone the existing backdrop layer.

(WebCore::GraphicsLayerCA::clearClones):
Clear the backdrop layer clones map.

(WebCore::GraphicsLayerCA::fetchCloneLayers):
Obtain a clone for the backdrop layer, and if we have a valid clone, add it to the
structural layer clone as its first child to match the operation in updateSublayerList().

* platform/graphics/ca/GraphicsLayerCA.h:
Modify the signature for ensureCloneLayers() to account for the new backdrop layer clone and
declare the backdrop layer clone map.

* platform/graphics/ca/cocoa/PlatformCALayerCocoa.mm:
(PlatformCALayerCocoa::clone):
Reflect the backdrop layer type when cloning a PlatformCALayer.

LayoutTests:

* css3/filters/backdrop/backdrop-filter-with-reflection-add-backdrop-expected.html: Added.
* css3/filters/backdrop/backdrop-filter-with-reflection-add-backdrop.html: Added.

Covers the case where a reflected element without a backdrop-filter initially has one added later.

* css3/filters/backdrop/backdrop-filter-with-reflection-expected.html: Added.
* css3/filters/backdrop/backdrop-filter-with-reflection-remove-backdrop-expected.html: Added.

Covers the case where a reflected element with a backdrop-filter initially has it removed later.

* css3/filters/backdrop/backdrop-filter-with-reflection-remove-backdrop.html: Added.
* css3/filters/backdrop/backdrop-filter-with-reflection-value-change-expected.html: Added.

Covers the case where a reflected element with a backdrop-filter has its backdrop-filter property changed later.

* css3/filters/backdrop/backdrop-filter-with-reflection-value-change.html: Added.
* css3/filters/backdrop/backdrop-filter-with-reflection.html: Added.

Covers the basic case of a reflected element with a backdrop-filter.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (201647 => 201648)


--- trunk/LayoutTests/ChangeLog	2016-06-03 17:09:42 UTC (rev 201647)
+++ trunk/LayoutTests/ChangeLog	2016-06-03 18:13:52 UTC (rev 201648)
@@ -1,5 +1,32 @@
 2016-06-03  Antoine Quint  <grao...@apple.com>
 
+        Reflection of element does not respect backdrop-filter property
+        https://bugs.webkit.org/show_bug.cgi?id=158201
+
+        Reviewed by Dean Jackson.
+
+        * css3/filters/backdrop/backdrop-filter-with-reflection-add-backdrop-expected.html: Added.
+        * css3/filters/backdrop/backdrop-filter-with-reflection-add-backdrop.html: Added.
+
+        Covers the case where a reflected element without a backdrop-filter initially has one added later.
+
+        * css3/filters/backdrop/backdrop-filter-with-reflection-expected.html: Added.
+        * css3/filters/backdrop/backdrop-filter-with-reflection-remove-backdrop-expected.html: Added.
+
+        Covers the case where a reflected element with a backdrop-filter initially has it removed later.
+
+        * css3/filters/backdrop/backdrop-filter-with-reflection-remove-backdrop.html: Added.
+        * css3/filters/backdrop/backdrop-filter-with-reflection-value-change-expected.html: Added.
+
+        Covers the case where a reflected element with a backdrop-filter has its backdrop-filter property changed later.
+
+        * css3/filters/backdrop/backdrop-filter-with-reflection-value-change.html: Added.
+        * css3/filters/backdrop/backdrop-filter-with-reflection.html: Added.
+
+        Covers the basic case of a reflected element with a backdrop-filter.
+
+2016-06-03  Antoine Quint  <grao...@apple.com>
+
         REGRESSION: WebGL doesn't show up in CSS reflections
         https://bugs.webkit.org/show_bug.cgi?id=76489
 

Added: trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-add-backdrop-expected.html (0 => 201648)


--- trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-add-backdrop-expected.html	                        (rev 0)
+++ trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-add-backdrop-expected.html	2016-06-03 18:13:52 UTC (rev 201648)
@@ -0,0 +1,36 @@
+<head>
+    <meta name="viewport" content="width=device-width">
+    <title>This tests that the reflection of an element without a backdrop-filter value initially updates its rendering when the reflected layer has a backdrop-filter applied later.</title>
+    <style>
+
+    svg {
+        position: absolute;
+        top: 0px;
+        left: 0px;
+        width: 200px;
+        height: 200px;
+        background-color: lightgray;
+    }
+
+    .backdrop {
+        position: absolute;
+        top: 10px;
+        left: 60px;
+        width: 80px;
+        height: 80px;
+        background-color: rgba(255, 255, 255, 0.5);
+        -webkit-backdrop-filter: saturate(180%) blur(5px);
+    }
+
+    .backdrop:last-of-type {
+        top: 110px;
+    }
+
+    </style>
+</head>
+<svg viewbox="0 0 2 2">
+    <rect fill="black" x="0" y="0" width="1" height="1"></rect>
+    <rect fill="black" x="1" y="1" width="1" height="1"></rect>
+</svg>
+<div class="backdrop"></div>
+<div class="backdrop"></div>

Added: trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-add-backdrop.html (0 => 201648)


--- trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-add-backdrop.html	                        (rev 0)
+++ trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-add-backdrop.html	2016-06-03 18:13:52 UTC (rev 201648)
@@ -0,0 +1,47 @@
+<head>
+    <meta name="viewport" content="width=device-width">
+    <title>This tests that the reflection of an element without a backdrop-filter value initially updates its rendering when the reflected layer has a backdrop-filter applied later.</title>
+    <style>
+
+    svg {
+        position: absolute;
+        top: 0px;
+        left: 0px;
+        width: 200px;
+        height: 200px;
+        background-color: lightgray;
+    }
+
+    .backdrop {
+        position: absolute;
+        top: 10px;
+        left: 60px;
+        width: 80px;
+        height: 80px;
+        background-color: rgba(255, 255, 255, 0.5);
+        -webkit-box-reflect: below 20px;
+    }
+
+    .backdrop.changed {
+        -webkit-backdrop-filter: saturate(180%) blur(5px);
+    }
+
+    </style>
+    <script type="text/_javascript_">
+        
+    if (window.testRunner)
+        testRunner.waitUntilDone();
+
+    window.requestAnimationFrame(function() {
+        document.querySelector(".backdrop").classList.add("changed");
+        if (window.testRunner)
+            testRunner.notifyDone();
+    });
+
+    </script>
+</head>
+<svg viewbox="0 0 2 2">
+    <rect fill="black" x="0" y="0" width="1" height="1"></rect>
+    <rect fill="black" x="1" y="1" width="1" height="1"></rect>
+</svg>
+<div class="backdrop"></div>

Added: trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-expected.html (0 => 201648)


--- trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-expected.html	                        (rev 0)
+++ trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-expected.html	2016-06-03 18:13:52 UTC (rev 201648)
@@ -0,0 +1,36 @@
+<head>
+    <meta name="viewport" content="width=device-width">
+    <title>This tests that the reflection of an element with a backdrop-filter applied also has a backdrop-filter of its own.</title>
+    <style>
+
+    svg {
+        position: absolute;
+        top: 0px;
+        left: 0px;
+        width: 200px;
+        height: 200px;
+        background-color: lightgray;
+    }
+
+    .backdrop {
+        position: absolute;
+        top: 10px;
+        left: 60px;
+        width: 80px;
+        height: 80px;
+        background-color: rgba(255, 255, 255, 0.5);
+        -webkit-backdrop-filter: saturate(180%) blur(5px);
+    }
+
+    .backdrop:last-of-type {
+        top: 110px;
+    }
+
+    </style>
+</head>
+<svg viewbox="0 0 2 2">
+    <rect fill="black" x="0" y="0" width="1" height="1"></rect>
+    <rect fill="black" x="1" y="1" width="1" height="1"></rect>
+</svg>
+<div class="backdrop"></div>
+<div class="backdrop"></div>

Added: trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-remove-backdrop-expected.html (0 => 201648)


--- trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-remove-backdrop-expected.html	                        (rev 0)
+++ trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-remove-backdrop-expected.html	2016-06-03 18:13:52 UTC (rev 201648)
@@ -0,0 +1,35 @@
+<head>
+    <meta name="viewport" content="width=device-width">
+    <title>This tests that the reflection of an element with a backdrop-filter applied updates its rendering when the reflected layer no longer has a backdrop-filter applied.</title>
+    <style>
+
+    svg {
+        position: absolute;
+        top: 0px;
+        left: 0px;
+        width: 200px;
+        height: 200px;
+        background-color: lightgray;
+    }
+
+    .backdrop {
+        position: absolute;
+        top: 10px;
+        left: 60px;
+        width: 80px;
+        height: 80px;
+        background-color: rgba(255, 255, 255, 0.5);
+    }
+
+    .backdrop:last-of-type {
+        top: 110px;
+    }
+
+    </style>
+</head>
+<svg viewbox="0 0 2 2">
+    <rect fill="black" x="0" y="0" width="1" height="1"></rect>
+    <rect fill="black" x="1" y="1" width="1" height="1"></rect>
+</svg>
+<div class="backdrop"></div>
+<div class="backdrop"></div>

Added: trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-remove-backdrop.html (0 => 201648)


--- trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-remove-backdrop.html	                        (rev 0)
+++ trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-remove-backdrop.html	2016-06-03 18:13:52 UTC (rev 201648)
@@ -0,0 +1,48 @@
+<head>
+    <meta name="viewport" content="width=device-width">
+    <title>This tests that the reflection of an element with a backdrop-filter applied updates its rendering when the reflected layer no longer has a backdrop-filter applied.</title>
+    <style>
+
+    svg {
+        position: absolute;
+        top: 0px;
+        left: 0px;
+        width: 200px;
+        height: 200px;
+        background-color: lightgray;
+    }
+
+    .backdrop {
+        position: absolute;
+        top: 10px;
+        left: 60px;
+        width: 80px;
+        height: 80px;
+        background-color: rgba(255, 255, 255, 0.5);
+        -webkit-backdrop-filter: saturate(180%) blur(5px);
+        -webkit-box-reflect: below 20px;
+    }
+
+    .backdrop.changed {
+        -webkit-backdrop-filter: none;
+    }
+
+    </style>
+    <script type="text/_javascript_">
+        
+    if (window.testRunner)
+        testRunner.waitUntilDone();
+
+    window.requestAnimationFrame(function() {
+        document.querySelector(".backdrop").classList.add("changed");
+        if (window.testRunner)
+            testRunner.notifyDone();
+    });
+
+    </script>
+</head>
+<svg viewbox="0 0 2 2">
+    <rect fill="black" x="0" y="0" width="1" height="1"></rect>
+    <rect fill="black" x="1" y="1" width="1" height="1"></rect>
+</svg>
+<div class="backdrop"></div>

Added: trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-value-change-expected.html (0 => 201648)


--- trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-value-change-expected.html	                        (rev 0)
+++ trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-value-change-expected.html	2016-06-03 18:13:52 UTC (rev 201648)
@@ -0,0 +1,36 @@
+<head>
+    <meta name="viewport" content="width=device-width">
+    <title>This tests that the reflection of an element with a backdrop-filter applied updates its rendering when the reflected layer has a change of backdrop-filter value.</title>
+    <style>
+
+    svg {
+        position: absolute;
+        top: 0px;
+        left: 0px;
+        width: 200px;
+        height: 200px;
+        background-color: lightgray;
+    }
+
+    .backdrop {
+        position: absolute;
+        top: 10px;
+        left: 60px;
+        width: 80px;
+        height: 80px;
+        background-color: rgba(255, 255, 255, 0.5);
+        -webkit-backdrop-filter: saturate(180%) blur(10px);
+    }
+
+    .backdrop:last-of-type {
+        top: 110px;
+    }
+
+    </style>
+</head>
+<svg viewbox="0 0 2 2">
+    <rect fill="black" x="0" y="0" width="1" height="1"></rect>
+    <rect fill="black" x="1" y="1" width="1" height="1"></rect>
+</svg>
+<div class="backdrop"></div>
+<div class="backdrop"></div>

Added: trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-value-change.html (0 => 201648)


--- trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-value-change.html	                        (rev 0)
+++ trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection-value-change.html	2016-06-03 18:13:52 UTC (rev 201648)
@@ -0,0 +1,48 @@
+<head>
+    <meta name="viewport" content="width=device-width">
+    <title>This tests that the reflection of an element with a backdrop-filter applied updates its rendering when the reflected layer has a change of backdrop-filter value.</title>
+    <style>
+
+    svg {
+        position: absolute;
+        top: 0px;
+        left: 0px;
+        width: 200px;
+        height: 200px;
+        background-color: lightgray;
+    }
+
+    .backdrop {
+        position: absolute;
+        top: 10px;
+        left: 60px;
+        width: 80px;
+        height: 80px;
+        background-color: rgba(255, 255, 255, 0.5);
+        -webkit-backdrop-filter: saturate(180%) blur(5px);
+        -webkit-box-reflect: below 20px;
+    }
+
+    .backdrop.changed {
+        -webkit-backdrop-filter: saturate(180%) blur(10px);
+    }
+
+    </style>
+    <script type="text/_javascript_">
+        
+    if (window.testRunner)
+        testRunner.waitUntilDone();
+
+    window.requestAnimationFrame(function() {
+        document.querySelector(".backdrop").classList.add("changed");
+        if (window.testRunner)
+            testRunner.notifyDone();
+    });
+
+    </script>
+</head>
+<svg viewbox="0 0 2 2">
+    <rect fill="black" x="0" y="0" width="1" height="1"></rect>
+    <rect fill="black" x="1" y="1" width="1" height="1"></rect>
+</svg>
+<div class="backdrop"></div>

Added: trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection.html (0 => 201648)


--- trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection.html	                        (rev 0)
+++ trunk/LayoutTests/css3/filters/backdrop/backdrop-filter-with-reflection.html	2016-06-03 18:13:52 UTC (rev 201648)
@@ -0,0 +1,32 @@
+<head>
+    <meta name="viewport" content="width=device-width">
+    <title>This tests that the reflection of an element with a backdrop-filter applied also has a backdrop-filter of its own.</title>
+    <style>
+
+    svg {
+        position: absolute;
+        top: 0px;
+        left: 0px;
+        width: 200px;
+        height: 200px;
+        background-color: lightgray;
+    }
+
+    .backdrop {
+        position: absolute;
+        top: 10px;
+        left: 60px;
+        width: 80px;
+        height: 80px;
+        background-color: rgba(255, 255, 255, 0.5);
+        -webkit-backdrop-filter: saturate(180%) blur(5px);
+        -webkit-box-reflect: below 20px;
+    }
+
+    </style>
+</head>
+<svg viewbox="0 0 2 2">
+    <rect fill="black" x="0" y="0" width="1" height="1"></rect>
+    <rect fill="black" x="1" y="1" width="1" height="1"></rect>
+</svg>
+<div class="backdrop"></div>

Modified: trunk/Source/WebCore/ChangeLog (201647 => 201648)


--- trunk/Source/WebCore/ChangeLog	2016-06-03 17:09:42 UTC (rev 201647)
+++ trunk/Source/WebCore/ChangeLog	2016-06-03 18:13:52 UTC (rev 201648)
@@ -1,3 +1,46 @@
+2016-06-03  Antoine Quint  <grao...@apple.com>
+
+        Reflection of element does not respect backdrop-filter property
+        https://bugs.webkit.org/show_bug.cgi?id=158201
+
+        Reviewed by Dean Jackson.
+
+        We weren't cloning the PlatformCALayer for the backdrop so reflections would simply
+        not show their backdrops. We now follow the same pattern as other PlatformCALayers
+        owned by a GraphicsLayerCA and keep a list of backdrop layer clones that we add
+        to the structural layer when cloning to match the layer order of the original
+        and update the backdrop layer clone properties to match the original when the
+        backdrop filters or rectangle changes.
+
+        Tests: css3/filters/backdrop/backdrop-filter-with-reflection-add-backdrop.html
+               css3/filters/backdrop/backdrop-filter-with-reflection-remove-backdrop.html
+               css3/filters/backdrop/backdrop-filter-with-reflection-value-change.html
+               css3/filters/backdrop/backdrop-filter-with-reflection.html
+
+        * platform/graphics/ca/GraphicsLayerCA.cpp:
+        (WebCore::GraphicsLayerCA::updateBackdropFilters):
+        (WebCore::GraphicsLayerCA::updateBackdropFiltersRect):
+        Update backdrop layer clones to match new values set when the backdrop filter
+        configuration changes.
+
+        (WebCore::GraphicsLayerCA::ensureCloneLayers):
+        Create the backdrop layer clones map if needed and clone the existing backdrop layer.
+
+        (WebCore::GraphicsLayerCA::clearClones):
+        Clear the backdrop layer clones map.
+
+        (WebCore::GraphicsLayerCA::fetchCloneLayers):
+        Obtain a clone for the backdrop layer, and if we have a valid clone, add it to the
+        structural layer clone as its first child to match the operation in updateSublayerList().
+
+        * platform/graphics/ca/GraphicsLayerCA.h:
+        Modify the signature for ensureCloneLayers() to account for the new backdrop layer clone and
+        declare the backdrop layer clone map.
+
+        * platform/graphics/ca/cocoa/PlatformCALayerCocoa.mm:
+        (PlatformCALayerCocoa::clone):
+        Reflect the backdrop layer type when cloning a PlatformCALayer.
+
 2016-06-03  Brady Eidson  <beid...@apple.com>
 
         ResourceResponseBase cleanup.

Modified: trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp (201647 => 201648)


--- trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp	2016-06-03 17:09:42 UTC (rev 201647)
+++ trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp	2016-06-03 18:13:52 UTC (rev 201648)
@@ -1950,6 +1950,14 @@
 
     m_backdropLayer->setHidden(!m_contentsVisible);
     m_backdropLayer->setFilters(m_backdropFilters);
+
+    if (LayerMap* layerCloneMap = m_backdropLayerClones.get()) {
+        for (auto& clone : *layerCloneMap) {
+            PlatformCALayer* cloneLayer = clone.value.get();
+            cloneLayer->setHidden(!m_contentsVisible);
+            cloneLayer->setFilters(m_backdropFilters);
+        }
+    }
 }
 
 void GraphicsLayerCA::updateBackdropFiltersRect()
@@ -1959,6 +1967,14 @@
     FloatRect contentBounds(0, 0, m_backdropFiltersRect.width(), m_backdropFiltersRect.height());
     m_backdropLayer->setBounds(contentBounds);
     m_backdropLayer->setPosition(m_backdropFiltersRect.location());
+
+    if (LayerMap* layerCloneMap = m_backdropLayerClones.get()) {
+        for (auto& clone : *layerCloneMap) {
+            PlatformCALayer* cloneLayer = clone.value.get();
+            cloneLayer->setBounds(contentBounds);
+            cloneLayer->setPosition(m_backdropFiltersRect.location());
+        }
+    }
 }
 
 #if ENABLE(CSS_COMPOSITING)
@@ -3580,7 +3596,7 @@
 }   
 
 void GraphicsLayerCA::ensureCloneLayers(CloneID cloneID, RefPtr<PlatformCALayer>& primaryLayer, RefPtr<PlatformCALayer>& structuralLayer,
-    RefPtr<PlatformCALayer>& contentsLayer, RefPtr<PlatformCALayer>& contentsClippingLayer, RefPtr<PlatformCALayer>& contentsShapeMaskLayer, RefPtr<PlatformCALayer>& shapeMaskLayer, CloneLevel cloneLevel)
+    RefPtr<PlatformCALayer>& contentsLayer, RefPtr<PlatformCALayer>& contentsClippingLayer, RefPtr<PlatformCALayer>& contentsShapeMaskLayer, RefPtr<PlatformCALayer>& shapeMaskLayer, RefPtr<PlatformCALayer>& backdropLayer, CloneLevel cloneLevel)
 {
     structuralLayer = nullptr;
     contentsLayer = nullptr;
@@ -3603,12 +3619,16 @@
     if (!m_shapeMaskLayerClones && m_shapeMaskLayer)
         m_shapeMaskLayerClones = std::make_unique<LayerMap>();
 
+    if (!m_backdropLayerClones && m_backdropLayer)
+        m_backdropLayerClones = std::make_unique<LayerMap>();
+    
     primaryLayer = findOrMakeClone(cloneID, m_layer.get(), m_layerClones.get(), cloneLevel);
     structuralLayer = findOrMakeClone(cloneID, m_structuralLayer.get(), m_structuralLayerClones.get(), cloneLevel);
     contentsLayer = findOrMakeClone(cloneID, m_contentsLayer.get(), m_contentsLayerClones.get(), cloneLevel);
     contentsClippingLayer = findOrMakeClone(cloneID, m_contentsClippingLayer.get(), m_contentsClippingLayerClones.get(), cloneLevel);
     contentsShapeMaskLayer = findOrMakeClone(cloneID, m_contentsShapeMaskLayer.get(), m_contentsShapeMaskLayerClones.get(), cloneLevel);
     shapeMaskLayer = findOrMakeClone(cloneID, m_shapeMaskLayer.get(), m_shapeMaskLayerClones.get(), cloneLevel);
+    backdropLayer = findOrMakeClone(cloneID, m_backdropLayer.get(), m_backdropLayerClones.get(), cloneLevel);
 }
 
 void GraphicsLayerCA::clearClones(std::unique_ptr<LayerMap>& layerMap)
@@ -3630,6 +3650,7 @@
     clearClones(m_contentsClippingLayerClones);
     clearClones(m_contentsShapeMaskLayerClones);
     clearClones(m_shapeMaskLayerClones);
+    clearClones(m_backdropLayerClones);
 }
 
 FloatPoint GraphicsLayerCA::positionForCloneRootLayer() const
@@ -3663,7 +3684,8 @@
     RefPtr<PlatformCALayer> contentsClippingLayer;
     RefPtr<PlatformCALayer> contentsShapeMaskLayer;
     RefPtr<PlatformCALayer> shapeMaskLayer;
-    ensureCloneLayers(replicaState.cloneID(), primaryLayer, structuralLayer, contentsLayer, contentsClippingLayer, contentsShapeMaskLayer, shapeMaskLayer, cloneLevel);
+    RefPtr<PlatformCALayer> backdropLayer;
+    ensureCloneLayers(replicaState.cloneID(), primaryLayer, structuralLayer, contentsLayer, contentsClippingLayer, contentsShapeMaskLayer, shapeMaskLayer, backdropLayer, cloneLevel);
 
     if (m_maskLayer) {
         RefPtr<PlatformCALayer> maskClone = downcast<GraphicsLayerCA>(*m_maskLayer).fetchCloneLayers(replicaRoot, replicaState, IntermediateCloneLevel);
@@ -3707,9 +3729,12 @@
 
     if (shapeMaskLayer)
         primaryLayer->setMask(shapeMaskLayer.get());
-    
+
     if (replicaLayer || structuralLayer || contentsLayer || contentsClippingLayer || childLayers.size() > 0) {
         if (structuralLayer) {
+            if (backdropLayer)
+                clonalSublayers.append(backdropLayer);
+            
             // Replicas render behind the actual layer content.
             if (replicaLayer)
                 clonalSublayers.append(replicaLayer);

Modified: trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.h (201647 => 201648)


--- trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.h	2016-06-03 17:09:42 UTC (rev 201647)
+++ trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.h	2016-06-03 18:13:52 UTC (rev 201648)
@@ -374,7 +374,7 @@
     PassRefPtr<PlatformCALayer> findOrMakeClone(CloneID, PlatformCALayer *, LayerMap*, CloneLevel);
 
     void ensureCloneLayers(CloneID, RefPtr<PlatformCALayer>& primaryLayer, RefPtr<PlatformCALayer>& structuralLayer,
-        RefPtr<PlatformCALayer>& contentsLayer, RefPtr<PlatformCALayer>& contentsClippingLayer, RefPtr<PlatformCALayer>& contentsShapeMaskLayer, RefPtr<PlatformCALayer>& shapeMaskLayer, CloneLevel);
+        RefPtr<PlatformCALayer>& contentsLayer, RefPtr<PlatformCALayer>& contentsClippingLayer, RefPtr<PlatformCALayer>& contentsShapeMaskLayer, RefPtr<PlatformCALayer>& shapeMaskLayer, RefPtr<PlatformCALayer>& backdropLayer, CloneLevel);
 
     static void clearClones(std::unique_ptr<LayerMap>&);
 
@@ -518,6 +518,7 @@
     std::unique_ptr<LayerMap> m_contentsClippingLayerClones;
     std::unique_ptr<LayerMap> m_contentsShapeMaskLayerClones;
     std::unique_ptr<LayerMap> m_shapeMaskLayerClones;
+    std::unique_ptr<LayerMap> m_backdropLayerClones;
 
 #ifdef VISIBLE_TILE_WASH
     RefPtr<PlatformCALayer> m_visibleTileWashLayer;

Modified: trunk/Source/WebCore/platform/graphics/ca/cocoa/PlatformCALayerCocoa.mm (201647 => 201648)


--- trunk/Source/WebCore/platform/graphics/ca/cocoa/PlatformCALayerCocoa.mm	2016-06-03 17:09:42 UTC (rev 201647)
+++ trunk/Source/WebCore/platform/graphics/ca/cocoa/PlatformCALayerCocoa.mm	2016-06-03 18:13:52 UTC (rev 201648)
@@ -326,6 +326,9 @@
     case LayerTypeShapeLayer:
         type = LayerTypeShapeLayer;
         break;
+    case LayerTypeBackdropLayer:
+        type = LayerTypeBackdropLayer;
+        break;
     case LayerTypeLayer:
     default:
         type = LayerTypeLayer;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to