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