15d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)/*
25d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
35d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * Copyright (C) 2014 Google Inc. All rights reserved.
45d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) *
55d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * modification, are permitted provided that the following conditions
75d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * are met:
85d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
95d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) *
145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) */
265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "config.h"
285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/rendering/compositing/GraphicsLayerTreeBuilder.h"
295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/html/HTMLMediaElement.h"
315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/rendering/RenderLayer.h"
325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/rendering/RenderLayerReflectionInfo.h"
335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/rendering/RenderPart.h"
345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/rendering/RenderView.h"
355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/rendering/compositing/CompositedLayerMapping.h"
365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/rendering/compositing/RenderLayerCompositor.h"
375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)GraphicsLayerTreeBuilder::GraphicsLayerTreeBuilder()
415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)GraphicsLayerTreeBuilder::~GraphicsLayerTreeBuilder()
455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)static bool shouldAppendLayer(const RenderLayer& layer)
495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (!RuntimeEnabledFeatures::overlayFullscreenVideoEnabled())
515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return true;
525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    Node* node = layer.renderer()->node();
535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (node && isHTMLMediaElement(*node) && toHTMLMediaElement(node)->isFullscreen())
545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return false;
555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return true;
565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
58197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid GraphicsLayerTreeBuilder::rebuild(RenderLayer& layer, AncestorInfo info)
595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // Make the layer compositing if necessary, and set up clipping and content layers.
615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // Note that we can only do work here that is independent of whether the descendant layers
62e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // have been processed. computeCompositingRequirements() will already have done the paint invalidation if necessary.
635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    layer.stackingNode()->updateLayerListsIfNeeded();
655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    const bool hasCompositedLayerMapping = layer.hasCompositedLayerMapping();
67e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    CompositedLayerMapping* currentCompositedLayerMapping = layer.compositedLayerMapping();
685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
695d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // If this layer has a compositedLayerMapping, then that is where we place subsequent children GraphicsLayers.
705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // Otherwise children continue to append to the child list of the enclosing layer.
715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    GraphicsLayerVector layerChildren;
72197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    AncestorInfo infoForChildren(info);
73197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (hasCompositedLayerMapping) {
74197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        infoForChildren.childLayersOfEnclosingCompositedLayer = &layerChildren;
75197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        infoForChildren.enclosingCompositedLayer = &layer;
76197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
78197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    LayerListMutationDetector mutationChecker(layer.stackingNode());
805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#endif
815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (layer.stackingNode()->isStackingContext()) {
835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        RenderLayerStackingNodeIterator iterator(*layer.stackingNode(), NegativeZOrderChildren);
845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        while (RenderLayerStackingNode* curNode = iterator.next())
85197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            rebuild(*curNode->layer(), infoForChildren);
865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // If a negative z-order child is compositing, we get a foreground layer which needs to get parented.
885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (hasCompositedLayerMapping && currentCompositedLayerMapping->foregroundLayer())
89197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            infoForChildren.childLayersOfEnclosingCompositedLayer->append(currentCompositedLayerMapping->foregroundLayer());
905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RenderLayerStackingNodeIterator iterator(*layer.stackingNode(), NormalFlowChildren | PositiveZOrderChildren);
935d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    while (RenderLayerStackingNode* curNode = iterator.next())
94197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        rebuild(*curNode->layer(), infoForChildren);
955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (hasCompositedLayerMapping) {
975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        bool parented = false;
985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (layer.renderer()->isRenderPart())
995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            parented = RenderLayerCompositor::parentFrameContentLayers(toRenderPart(layer.renderer()));
1005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (!parented)
1025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            currentCompositedLayerMapping->parentForSublayers()->setChildren(layerChildren);
1035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // If the layer has a clipping layer the overflow controls layers will be siblings of the clipping layer.
1055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // Otherwise, the overflow control layers are normal children.
106197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // FIXME: Why isn't this handled in CLM updateInternalHierarchy?
1075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (!currentCompositedLayerMapping->hasClippingLayer() && !currentCompositedLayerMapping->hasScrollingLayer()) {
1085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            if (GraphicsLayer* overflowControlLayer = currentCompositedLayerMapping->layerForHorizontalScrollbar()) {
1095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                overflowControlLayer->removeFromParent();
1105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                currentCompositedLayerMapping->parentForSublayers()->addChild(overflowControlLayer);
1115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            }
1125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            if (GraphicsLayer* overflowControlLayer = currentCompositedLayerMapping->layerForVerticalScrollbar()) {
1145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                overflowControlLayer->removeFromParent();
1155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                currentCompositedLayerMapping->parentForSublayers()->addChild(overflowControlLayer);
1165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            }
1175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            if (GraphicsLayer* overflowControlLayer = currentCompositedLayerMapping->layerForScrollCorner()) {
1195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                overflowControlLayer->removeFromParent();
1205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                currentCompositedLayerMapping->parentForSublayers()->addChild(overflowControlLayer);
1215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            }
1225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        }
1235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (shouldAppendLayer(layer))
125197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            info.childLayersOfEnclosingCompositedLayer->append(currentCompositedLayerMapping->childForSuperlayers());
1265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
127197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
128197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (layer.scrollParent()
129197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        && layer.scrollParent()->hasCompositedLayerMapping()
130c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        && layer.scrollParent()->compositedLayerMapping()->needsToReparentOverflowControls()
131197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        && layer.scrollParent()->scrollableArea()->topmostScrollChild() == &layer)
132197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        info.childLayersOfEnclosingCompositedLayer->append(layer.scrollParent()->compositedLayerMapping()->detachLayerForOverflowControls(*info.enclosingCompositedLayer));
1335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
1345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
136