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