15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1999 Antti Koivisto (koivisto@kde.org) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010, 2012 Google Inc. All rights reserved. 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderLayerModelObject.h" 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h" 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderLayer.h" 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h" 317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/compositing/CompositedLayerMapping.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderLayerModelObject::s_wasFloating = false; 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)RenderLayerModelObject::RenderLayerModelObject(ContainerNode* node) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : RenderObject(node) 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderLayerModelObject::~RenderLayerModelObject() 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Our layer should have been destroyed and cleared by now 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!hasLayer()); 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_layer); 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderLayerModelObject::destroyLayer() 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) setHasLayer(false); 5251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_layer = nullptr; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void RenderLayerModelObject::createLayer(LayerType type) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 57bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) ASSERT(!m_layer); 5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_layer = adoptPtr(new RenderLayer(this, type)); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setHasLayer(true); 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layer->insertOnlyThisLayer(); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderLayerModelObject::hasSelfPaintingLayer() const 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_layer && m_layer->isSelfPaintingLayer(); 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 68e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)ScrollableArea* RenderLayerModelObject::scrollableArea() const 69e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){ 70e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return m_layer ? m_layer->scrollableArea() : 0; 71e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)} 72e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderLayerModelObject::willBeDestroyed() 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (isPositioned()) { 76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Don't use this->view() because the document's renderView has been set to 0 during destruction. 77d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (LocalFrame* frame = this->frame()) { 78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (FrameView* frameView = frame->view()) { 79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (style()->hasViewportConstrainedPosition()) 80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) frameView->removeViewportConstrainedObject(this); 81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderObject::willBeDestroyed(); 8651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 8751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) destroyLayer(); 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 90aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdochvoid RenderLayerModelObject::styleWillChange(StyleDifference diff, const RenderStyle& newStyle) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) s_wasFloating = isFloating(); 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 94e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (RenderStyle* oldStyle = style()) { 95e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (parent() && diff.needsPaintInvalidationLayer()) { 969e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) if (oldStyle->hasAutoClip() != newStyle.hasAutoClip() 976f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch || oldStyle->clip() != newStyle.clip()) 98aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch layer()->clipper().clearClipRectsIncludingDescendants(); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderObject::styleWillChange(diff, newStyle); 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderLayerModelObject::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 107a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) bool hadTransform = hasTransform(); 1087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool hadLayer = hasLayer(); 1097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool layerWasSelfPainting = hadLayer && layer()->isSelfPaintingLayer(); 110a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderObject::styleDidChange(diff, oldStyle); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) updateFromStyle(); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) LayerType type = layerTypeRequired(); 11509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (type != NoLayer) { 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!layer() && layerCreationAllowedForSubtree()) { 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (s_wasFloating && isFloating()) 1183c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch setChildNeedsLayout(); 11909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) createLayer(type); 120c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (parent() && !needsLayout()) { 121c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // FIXME: We should call a specialized version of this function. 122c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) layer()->updateLayerPositionsAfterLayout(); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else if (layer() && layer()->parent()) { 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setHasTransform(false); // Either a transform wasn't specified or the object doesn't support transforms, so just null out the bit. 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setHasReflection(false); 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) layer()->removeOnlyThisLayer(); // calls destroyLayer() which clears m_layer 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (s_wasFloating && isFloating()) 1303c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch setChildNeedsLayout(); 131a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) if (hadTransform) 1325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (layer()) { 13609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // FIXME: Ideally we shouldn't need this setter but we can't easily infer an overflow-only layer 13709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // from the style. 138d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) layer()->setLayerType(type); 1397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) layer()->styleChanged(diff, oldStyle); 1417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (hadLayer && layer()->isSelfPaintingLayer() != layerWasSelfPainting) 1427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setChildNeedsLayout(); 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (FrameView *frameView = view()->frameView()) { 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool newStyleIsViewportConstained = style()->hasViewportConstrainedPosition(); 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool oldStyleIsViewportConstrained = oldStyle && oldStyle->hasViewportConstrainedPosition(); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (newStyleIsViewportConstained != oldStyleIsViewportConstrained) { 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (newStyleIsViewportConstained && layer()) 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) frameView->addViewportConstrainedObject(this); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) frameView->removeViewportConstrainedObject(this); 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 157f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void RenderLayerModelObject::addLayerHitTestRects(LayerHitTestRects& rects, const RenderLayer* currentLayer, const LayoutPoint& layerOffset, const LayoutRect& containerRect) const 1587757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch{ 1597757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (hasLayer()) { 1603c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch if (isRenderView()) { 1613c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch // RenderView is handled with a special fast-path, but it needs to know the current layer. 1623c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch RenderObject::addLayerHitTestRects(rects, layer(), LayoutPoint(), LayoutRect()); 1633c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch } else { 1643c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch // Since a RenderObject never lives outside it's container RenderLayer, we can switch 1653c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch // to marking entire layers instead. This may sometimes mark more than necessary (when 1663c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch // a layer is made of disjoint objects) but in practice is a significant performance 1673c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch // savings. 1683c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch layer()->addLayerHitTestRects(rects); 1693c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch } 1703c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch } else { 1713c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch RenderObject::addLayerHitTestRects(rects, currentLayer, layerOffset, containerRect); 1727757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 1737757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch} 1747757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 175c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void RenderLayerModelObject::invalidateTreeIfNeeded(const PaintInvalidationState& paintInvalidationState) 176c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 177c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ASSERT(!needsLayout()); 178c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 179c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (!shouldCheckForPaintInvalidation(paintInvalidationState)) 180c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return; 181c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 182c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) bool establishesNewPaintInvalidationContainer = isPaintInvalidationContainer(); 183c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) const RenderLayerModelObject& newPaintInvalidationContainer = *adjustCompositedContainerForSpecialAncestors(establishesNewPaintInvalidationContainer ? this : &paintInvalidationState.paintInvalidationContainer()); 184018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch // FIXME: This assert should be re-enabled when we move paint invalidation to after compositing update. crbug.com/360286 185018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch // ASSERT(&newPaintInvalidationContainer == containerForPaintInvalidation()); 186c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 187c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InvalidationReason reason = invalidatePaintIfNeeded(paintInvalidationState, newPaintInvalidationContainer); 1887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci clearPaintInvalidationState(paintInvalidationState); 189c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 190c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) PaintInvalidationState childTreeWalkState(paintInvalidationState, *this, newPaintInvalidationContainer); 191c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (reason == InvalidationLocationChange || reason == InvalidationFull) 192c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) childTreeWalkState.setForceCheckForPaintInvalidation(); 1937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci invalidatePaintOfSubtreesIfNeeded(childTreeWalkState); 1947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 1957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid RenderLayerModelObject::setBackingNeedsPaintInvalidationInRect(const LayoutRect& r) const 1977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 1987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // https://bugs.webkit.org/show_bug.cgi?id=61159 describes an unreproducible crash here, 1997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // so assert but check that the layer is composited. 2007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(compositingState() != NotComposited); 2017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci WebInvalidationDebugAnnotations annotations = WebInvalidationDebugAnnotationsNone; 2037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!hadPaintInvalidation()) 2047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci annotations = WebInvalidationDebugAnnotationsFirstPaint; 2057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: The callers assume they are calling a const function but this function has a side effect. 2067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const_cast<RenderLayerModelObject*>(this)->setHadPaintInvalidation(); 2077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: generalize accessors to backing GraphicsLayers so that this code is squashing-agnostic. 2097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (layer()->groupedMapping()) { 2107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutRect paintInvalidationRect = r; 211697ef0c10ac944be8499480c025020e4c282c980Ben Murdoch if (GraphicsLayer* squashingLayer = layer()->groupedMapping()->squashingLayer()) { 212697ef0c10ac944be8499480c025020e4c282c980Ben Murdoch // Note: the subpixel accumulation of layer() does not need to be added here. It is already taken into account. 2137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci squashingLayer->setNeedsDisplayInRect(pixelSnappedIntRect(paintInvalidationRect), annotations); 214697ef0c10ac944be8499480c025020e4c282c980Ben Murdoch } 2157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } else { 2167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci layer()->compositedLayerMapping()->setContentsNeedDisplayInRect(r, annotations); 2177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 218c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 219c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 220c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 222