| Index: third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
|
| index 9d3e9d969695f6b7824dad2c82eaca3e0626c155..b8440dc009530511a66b0bc3962c79e57523656f 100644
|
| --- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
|
| @@ -202,7 +202,7 @@ CompositedLayerMapping::~CompositedLayerMapping()
|
| updateForegroundLayer(false);
|
| updateBackgroundLayer(false);
|
| updateMaskLayer(false);
|
| - updateClippingMaskLayers(false);
|
| + updateChildClippingMaskLayer(false);
|
| updateScrollingLayers(false);
|
| updateSquashingLayers(false);
|
| destroyGraphicsLayers();
|
| @@ -468,29 +468,48 @@ bool CompositedLayerMapping::updateGraphicsLayerConfiguration()
|
| // that's plugged into another GraphicsLayer that is part of the hierarchy.
|
| // It has no parent or child GraphicsLayer. For that reason, we process it
|
| // here, after the hierarchy has been updated.
|
| - bool maskLayerChanged = false;
|
| - if (updateMaskLayer(layoutObject->hasMask())) {
|
| - maskLayerChanged = true;
|
| + bool maskLayerChanged = updateMaskLayer(layoutObject->hasMask());
|
| + if (maskLayerChanged)
|
| m_graphicsLayer->setMaskLayer(m_maskLayer.get());
|
| - }
|
|
|
| bool hasChildClippingLayer = compositor->clipsCompositingDescendants(&m_owningLayer) && (hasClippingLayer() || hasScrollingLayer());
|
| // If we have a border radius or clip path on a scrolling layer, we need a clipping mask to properly
|
| // clip the scrolled contents, even if there are no composited descendants.
|
| bool hasClipPath = layoutObject->style()->clipPath();
|
| bool needsChildClippingMask = (hasClipPath || layoutObject->style()->hasBorderRadius()) && (hasChildClippingLayer || isAcceleratedContents(layoutObject) || hasScrollingLayer());
|
| - if (updateClippingMaskLayers(needsChildClippingMask)) {
|
| - // Clip path clips the entire subtree, including scrollbars. It must be attached directly onto
|
| - // the main m_graphicsLayer.
|
| - if (hasClipPath)
|
| +
|
| + GraphicsLayer* layerToApplyChildClippingMask = nullptr;
|
| + bool shouldApplyChildClippingMaskOnContents = false;
|
| + if (needsChildClippingMask) {
|
| + if (hasClipPath) {
|
| + // Clip path clips the entire subtree, including scrollbars. It must be attached directly onto
|
| + // the main m_graphicsLayer.
|
| + layerToApplyChildClippingMask = m_graphicsLayer.get();
|
| + } else if (hasClippingLayer()) {
|
| + layerToApplyChildClippingMask = clippingLayer();
|
| + } else if (hasScrollingLayer()) {
|
| + layerToApplyChildClippingMask = scrollingLayer();
|
| + } else if (isAcceleratedContents(layoutObject)) {
|
| + shouldApplyChildClippingMaskOnContents = true;
|
| + }
|
| + }
|
| +
|
| + updateChildClippingMaskLayer(needsChildClippingMask);
|
| +
|
| + if (layerToApplyChildClippingMask == m_graphicsLayer) {
|
| + if (m_graphicsLayer->maskLayer() != m_childClippingMaskLayer.get()) {
|
| m_graphicsLayer->setMaskLayer(m_childClippingMaskLayer.get());
|
| - else if (hasClippingLayer())
|
| - clippingLayer()->setMaskLayer(m_childClippingMaskLayer.get());
|
| - else if (hasScrollingLayer())
|
| - scrollingLayer()->setMaskLayer(m_childClippingMaskLayer.get());
|
| - else if (isAcceleratedContents(layoutObject))
|
| - m_graphicsLayer->setContentsClippingMaskLayer(m_childClippingMaskLayer.get());
|
| + maskLayerChanged = true;
|
| + }
|
| + } else if (m_graphicsLayer->maskLayer() && m_graphicsLayer->maskLayer() != m_maskLayer.get()) {
|
| + m_graphicsLayer->setMaskLayer(nullptr);
|
| + maskLayerChanged = true;
|
| }
|
| + if (hasClippingLayer())
|
| + clippingLayer()->setMaskLayer(layerToApplyChildClippingMask == clippingLayer() ? m_childClippingMaskLayer.get() : nullptr);
|
| + if (hasScrollingLayer())
|
| + scrollingLayer()->setMaskLayer(layerToApplyChildClippingMask == scrollingLayer() ? m_childClippingMaskLayer.get() : nullptr);
|
| + m_graphicsLayer->setContentsClippingMaskLayer(shouldApplyChildClippingMaskOnContents ? m_childClippingMaskLayer.get() : nullptr);
|
|
|
| if (m_owningLayer.reflectionInfo()) {
|
| if (m_owningLayer.reflectionInfo()->reflectionLayer()->hasCompositedLayerMapping()) {
|
| @@ -1546,20 +1565,16 @@ bool CompositedLayerMapping::updateMaskLayer(bool needsMaskLayer)
|
| return layerChanged;
|
| }
|
|
|
| -bool CompositedLayerMapping::updateClippingMaskLayers(bool needsChildClippingMaskLayer)
|
| +void CompositedLayerMapping::updateChildClippingMaskLayer(bool needsChildClippingMaskLayer)
|
| {
|
| - bool layerChanged = false;
|
| if (needsChildClippingMaskLayer) {
|
| if (!m_childClippingMaskLayer) {
|
| m_childClippingMaskLayer = createGraphicsLayer(CompositingReasonLayerForClippingMask);
|
| m_childClippingMaskLayer->setPaintingPhase(GraphicsLayerPaintChildClippingMask);
|
| - layerChanged = true;
|
| }
|
| - } else if (m_childClippingMaskLayer) {
|
| - m_childClippingMaskLayer = nullptr;
|
| - layerChanged = true;
|
| + return;
|
| }
|
| - return layerChanged;
|
| + m_childClippingMaskLayer = nullptr;
|
| }
|
|
|
| bool CompositedLayerMapping::updateScrollingLayers(bool needsScrollingLayers)
|
|
|