| Index: Source/core/layout/compositing/RenderLayerCompositor.cpp
|
| diff --git a/Source/core/layout/compositing/RenderLayerCompositor.cpp b/Source/core/layout/compositing/RenderLayerCompositor.cpp
|
| deleted file mode 100644
|
| index ce23882705cc9608d1ac776735de6d86e8aa9eaa..0000000000000000000000000000000000000000
|
| --- a/Source/core/layout/compositing/RenderLayerCompositor.cpp
|
| +++ /dev/null
|
| @@ -1,1188 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions
|
| - * are met:
|
| - * 1. Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * 2. Redistributions in binary form must reproduce the above copyright
|
| - * notice, this list of conditions and the following disclaimer in the
|
| - * documentation and/or other materials provided with the distribution.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
|
| - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
| - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
| - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
|
| - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
| - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
| - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
| - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
| - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -#include "config.h"
|
| -
|
| -#include "core/layout/compositing/RenderLayerCompositor.h"
|
| -
|
| -#include "core/animation/DocumentAnimations.h"
|
| -#include "core/dom/Fullscreen.h"
|
| -#include "core/editing/FrameSelection.h"
|
| -#include "core/frame/FrameHost.h"
|
| -#include "core/frame/FrameView.h"
|
| -#include "core/frame/LocalFrame.h"
|
| -#include "core/frame/Settings.h"
|
| -#include "core/html/HTMLIFrameElement.h"
|
| -#include "core/inspector/InspectorInstrumentation.h"
|
| -#include "core/inspector/InspectorNodeIds.h"
|
| -#include "core/layout/compositing/CompositedLayerMapping.h"
|
| -#include "core/layout/compositing/CompositingInputsUpdater.h"
|
| -#include "core/layout/compositing/CompositingLayerAssigner.h"
|
| -#include "core/layout/compositing/CompositingRequirementsUpdater.h"
|
| -#include "core/layout/compositing/GraphicsLayerTreeBuilder.h"
|
| -#include "core/layout/compositing/GraphicsLayerUpdater.h"
|
| -#include "core/loader/FrameLoaderClient.h"
|
| -#include "core/page/Chrome.h"
|
| -#include "core/page/ChromeClient.h"
|
| -#include "core/page/Page.h"
|
| -#include "core/page/scrolling/ScrollingCoordinator.h"
|
| -#include "core/paint/FramePainter.h"
|
| -#include "core/paint/TransformRecorder.h"
|
| -#include "core/rendering/RenderEmbeddedObject.h"
|
| -#include "core/rendering/RenderLayerStackingNode.h"
|
| -#include "core/rendering/RenderLayerStackingNodeIterator.h"
|
| -#include "core/rendering/RenderPart.h"
|
| -#include "core/rendering/RenderVideo.h"
|
| -#include "core/rendering/RenderView.h"
|
| -#include "platform/RuntimeEnabledFeatures.h"
|
| -#include "platform/ScriptForbiddenScope.h"
|
| -#include "platform/TraceEvent.h"
|
| -#include "platform/graphics/GraphicsLayer.h"
|
| -#include "platform/graphics/paint/DisplayItemList.h"
|
| -#include "platform/graphics/paint/DrawingRecorder.h"
|
| -#include "platform/graphics/paint/TransformDisplayItem.h"
|
| -#include "public/platform/Platform.h"
|
| -
|
| -namespace blink {
|
| -
|
| -RenderLayerCompositor::RenderLayerCompositor(RenderView& renderView)
|
| - : m_renderView(renderView)
|
| - , m_compositingReasonFinder(renderView)
|
| - , m_pendingUpdateType(CompositingUpdateNone)
|
| - , m_hasAcceleratedCompositing(true)
|
| - , m_compositing(false)
|
| - , m_rootShouldAlwaysCompositeDirty(true)
|
| - , m_needsUpdateFixedBackground(false)
|
| - , m_isTrackingPaintInvalidations(false)
|
| - , m_rootLayerAttachment(RootLayerUnattached)
|
| - , m_inOverlayFullscreenVideo(false)
|
| -{
|
| - updateAcceleratedCompositingSettings();
|
| -}
|
| -
|
| -RenderLayerCompositor::~RenderLayerCompositor()
|
| -{
|
| - ASSERT(m_rootLayerAttachment == RootLayerUnattached);
|
| -}
|
| -
|
| -bool RenderLayerCompositor::inCompositingMode() const
|
| -{
|
| - // FIXME: This should assert that lifecycle is >= CompositingClean since
|
| - // the last step of updateIfNeeded can set this bit to false.
|
| - ASSERT(m_renderView.layer()->isAllowedToQueryCompositingState());
|
| - return m_compositing;
|
| -}
|
| -
|
| -bool RenderLayerCompositor::staleInCompositingMode() const
|
| -{
|
| - return m_compositing;
|
| -}
|
| -
|
| -void RenderLayerCompositor::setCompositingModeEnabled(bool enable)
|
| -{
|
| - if (enable == m_compositing)
|
| - return;
|
| -
|
| - m_compositing = enable;
|
| -
|
| - // RenderPart::requiresAcceleratedCompositing is used to determine self-paintingness
|
| - // and bases it's return value for frames on the m_compositing bit here.
|
| - if (HTMLFrameOwnerElement* ownerElement = m_renderView.document().ownerElement()) {
|
| - if (RenderPart* renderer = ownerElement->renderPart())
|
| - renderer->layer()->updateSelfPaintingLayer();
|
| - }
|
| -
|
| - if (m_compositing)
|
| - ensureRootLayer();
|
| - else
|
| - destroyRootLayer();
|
| -
|
| - // Compositing also affects the answer to RenderIFrame::requiresAcceleratedCompositing(), so
|
| - // we need to schedule a style recalc in our parent document.
|
| - if (HTMLFrameOwnerElement* ownerElement = m_renderView.document().ownerElement())
|
| - ownerElement->setNeedsCompositingUpdate();
|
| -}
|
| -
|
| -void RenderLayerCompositor::enableCompositingModeIfNeeded()
|
| -{
|
| - if (!m_rootShouldAlwaysCompositeDirty)
|
| - return;
|
| -
|
| - m_rootShouldAlwaysCompositeDirty = false;
|
| - if (m_compositing)
|
| - return;
|
| -
|
| - if (rootShouldAlwaysComposite()) {
|
| - // FIXME: Is this needed? It was added in https://bugs.webkit.org/show_bug.cgi?id=26651.
|
| - // No tests fail if it's deleted.
|
| - setNeedsCompositingUpdate(CompositingUpdateRebuildTree);
|
| - setCompositingModeEnabled(true);
|
| - }
|
| -}
|
| -
|
| -bool RenderLayerCompositor::rootShouldAlwaysComposite() const
|
| -{
|
| - if (!m_hasAcceleratedCompositing)
|
| - return false;
|
| - return m_renderView.frame()->isLocalRoot() || m_compositingReasonFinder.requiresCompositingForScrollableFrame();
|
| -}
|
| -
|
| -void RenderLayerCompositor::updateAcceleratedCompositingSettings()
|
| -{
|
| - m_compositingReasonFinder.updateTriggers();
|
| - m_hasAcceleratedCompositing = m_renderView.document().settings()->acceleratedCompositingEnabled();
|
| - m_rootShouldAlwaysCompositeDirty = true;
|
| - if (m_rootLayerAttachment != RootLayerUnattached)
|
| - rootRenderLayer()->setNeedsCompositingInputsUpdate();
|
| -}
|
| -
|
| -bool RenderLayerCompositor::preferCompositingToLCDTextEnabled() const
|
| -{
|
| - return m_compositingReasonFinder.hasOverflowScrollTrigger();
|
| -}
|
| -
|
| -static RenderVideo* findFullscreenVideoRenderer(Document& document)
|
| -{
|
| - // Recursively find the document that is in fullscreen.
|
| - Element* fullscreenElement = Fullscreen::fullscreenElementFrom(document);
|
| - Document* contentDocument = &document;
|
| - while (fullscreenElement && fullscreenElement->isFrameOwnerElement()) {
|
| - contentDocument = toHTMLFrameOwnerElement(fullscreenElement)->contentDocument();
|
| - if (!contentDocument)
|
| - return 0;
|
| - fullscreenElement = Fullscreen::fullscreenElementFrom(*contentDocument);
|
| - }
|
| - // Get the current fullscreen element from the document.
|
| - fullscreenElement = Fullscreen::currentFullScreenElementFrom(*contentDocument);
|
| - if (!isHTMLVideoElement(fullscreenElement))
|
| - return 0;
|
| - RenderObject* renderer = fullscreenElement->renderer();
|
| - if (!renderer)
|
| - return 0;
|
| - return toRenderVideo(renderer);
|
| -}
|
| -
|
| -void RenderLayerCompositor::updateIfNeededRecursive()
|
| -{
|
| - for (Frame* child = m_renderView.frameView()->frame().tree().firstChild(); child; child = child->tree().nextSibling()) {
|
| - if (child->isLocalFrame())
|
| - toLocalFrame(child)->contentRenderer()->compositor()->updateIfNeededRecursive();
|
| - }
|
| -
|
| - TRACE_EVENT0("blink", "RenderLayerCompositor::updateIfNeededRecursive");
|
| -
|
| - ASSERT(!m_renderView.needsLayout());
|
| -
|
| - ScriptForbiddenScope forbidScript;
|
| -
|
| - // FIXME: enableCompositingModeIfNeeded can trigger a CompositingUpdateRebuildTree,
|
| - // which asserts that it's not InCompositingUpdate.
|
| - enableCompositingModeIfNeeded();
|
| -
|
| - rootRenderLayer()->updateDescendantDependentFlagsForEntireSubtree();
|
| - m_renderView.commitPendingSelection();
|
| -
|
| - lifecycle().advanceTo(DocumentLifecycle::InCompositingUpdate);
|
| - updateIfNeeded();
|
| - lifecycle().advanceTo(DocumentLifecycle::CompositingClean);
|
| -
|
| - DocumentAnimations::startPendingAnimations(m_renderView.document());
|
| -
|
| - m_renderView.frameView()->updateCompositorScrollAnimations();
|
| - if (const FrameView::ScrollableAreaSet* animatingScrollableAreas = m_renderView.frameView()->animatingScrollableAreas()) {
|
| - for (ScrollableArea* scrollableArea : *animatingScrollableAreas)
|
| - scrollableArea->updateCompositorScrollAnimations();
|
| - }
|
| -
|
| -#if ENABLE(ASSERT)
|
| - ASSERT(lifecycle().state() == DocumentLifecycle::CompositingClean);
|
| - assertNoUnresolvedDirtyBits();
|
| - for (Frame* child = m_renderView.frameView()->frame().tree().firstChild(); child; child = child->tree().nextSibling()) {
|
| - if (child->isLocalFrame())
|
| - toLocalFrame(child)->contentRenderer()->compositor()->assertNoUnresolvedDirtyBits();
|
| - }
|
| -#endif
|
| -}
|
| -
|
| -void RenderLayerCompositor::setNeedsCompositingUpdate(CompositingUpdateType updateType)
|
| -{
|
| - ASSERT(updateType != CompositingUpdateNone);
|
| - m_pendingUpdateType = std::max(m_pendingUpdateType, updateType);
|
| - page()->animator().scheduleVisualUpdate(m_renderView.frame());
|
| - lifecycle().ensureStateAtMost(DocumentLifecycle::LayoutClean);
|
| -}
|
| -
|
| -void RenderLayerCompositor::didLayout()
|
| -{
|
| - // FIXME: Technically we only need to do this when the FrameView's
|
| - // isScrollable method would return a different value.
|
| - m_rootShouldAlwaysCompositeDirty = true;
|
| - enableCompositingModeIfNeeded();
|
| -
|
| - // FIXME: Rather than marking the entire RenderView as dirty, we should
|
| - // track which RenderLayers moved during layout and only dirty those
|
| - // specific RenderLayers.
|
| - rootRenderLayer()->setNeedsCompositingInputsUpdate();
|
| -}
|
| -
|
| -#if ENABLE(ASSERT)
|
| -
|
| -void RenderLayerCompositor::assertNoUnresolvedDirtyBits()
|
| -{
|
| - ASSERT(m_pendingUpdateType == CompositingUpdateNone);
|
| - ASSERT(!m_rootShouldAlwaysCompositeDirty);
|
| -}
|
| -
|
| -#endif
|
| -
|
| -void RenderLayerCompositor::applyOverlayFullscreenVideoAdjustment()
|
| -{
|
| - m_inOverlayFullscreenVideo = false;
|
| - if (!m_rootContentLayer)
|
| - return;
|
| -
|
| - bool isLocalRoot = m_renderView.frame()->isLocalRoot();
|
| - RenderVideo* video = findFullscreenVideoRenderer(m_renderView.document());
|
| - if (!video || !video->layer()->hasCompositedLayerMapping()) {
|
| - if (isLocalRoot) {
|
| - GraphicsLayer* backgroundLayer = fixedRootBackgroundLayer();
|
| - if (backgroundLayer && !backgroundLayer->parent())
|
| - rootFixedBackgroundsChanged();
|
| - }
|
| - return;
|
| - }
|
| -
|
| - GraphicsLayer* videoLayer = video->layer()->compositedLayerMapping()->mainGraphicsLayer();
|
| -
|
| - // The fullscreen video has layer position equal to its enclosing frame's scroll position because fullscreen container is fixed-positioned.
|
| - // We should reset layer position here since we are going to reattach the layer at the very top level.
|
| - videoLayer->setPosition(IntPoint());
|
| -
|
| - // Only steal fullscreen video layer and clear all other layers if we are the main frame.
|
| - if (!isLocalRoot)
|
| - return;
|
| -
|
| - m_rootContentLayer->removeAllChildren();
|
| - m_overflowControlsHostLayer->addChild(videoLayer);
|
| - if (GraphicsLayer* backgroundLayer = fixedRootBackgroundLayer())
|
| - backgroundLayer->removeFromParent();
|
| - m_inOverlayFullscreenVideo = true;
|
| -}
|
| -
|
| -void RenderLayerCompositor::updateWithoutAcceleratedCompositing(CompositingUpdateType updateType)
|
| -{
|
| - ASSERT(!hasAcceleratedCompositing());
|
| -
|
| - if (updateType >= CompositingUpdateAfterCompositingInputChange)
|
| - CompositingInputsUpdater(rootRenderLayer()).update();
|
| -
|
| -#if ENABLE(ASSERT)
|
| - CompositingInputsUpdater::assertNeedsCompositingInputsUpdateBitsCleared(rootRenderLayer());
|
| -#endif
|
| -}
|
| -
|
| -static void forceRecomputePaintInvalidationRectsIncludingNonCompositingDescendants(RenderObject* renderer)
|
| -{
|
| - // We clear the previous paint invalidation rect as it's wrong (paint invaliation container
|
| - // changed, ...). Forcing a full invalidation will make us recompute it. Also we are not
|
| - // changing the previous position from our paint invalidation container, which is fine as
|
| - // we want a full paint invalidation anyway.
|
| - renderer->setPreviousPaintInvalidationRect(LayoutRect());
|
| - renderer->setShouldDoFullPaintInvalidation();
|
| -
|
| - for (RenderObject* child = renderer->slowFirstChild(); child; child = child->nextSibling()) {
|
| - if (!child->isPaintInvalidationContainer())
|
| - forceRecomputePaintInvalidationRectsIncludingNonCompositingDescendants(child);
|
| - }
|
| -}
|
| -
|
| -
|
| -void RenderLayerCompositor::updateIfNeeded()
|
| -{
|
| - CompositingUpdateType updateType = m_pendingUpdateType;
|
| - m_pendingUpdateType = CompositingUpdateNone;
|
| -
|
| - if (!hasAcceleratedCompositing()) {
|
| - updateWithoutAcceleratedCompositing(updateType);
|
| - return;
|
| - }
|
| -
|
| - if (updateType == CompositingUpdateNone)
|
| - return;
|
| -
|
| - RenderLayer* updateRoot = rootRenderLayer();
|
| -
|
| - Vector<RenderLayer*> layersNeedingPaintInvalidation;
|
| -
|
| - if (updateType >= CompositingUpdateAfterCompositingInputChange) {
|
| - CompositingInputsUpdater(updateRoot).update();
|
| -
|
| -#if ENABLE(ASSERT)
|
| - // FIXME: Move this check to the end of the compositing update.
|
| - CompositingInputsUpdater::assertNeedsCompositingInputsUpdateBitsCleared(updateRoot);
|
| -#endif
|
| -
|
| - CompositingRequirementsUpdater(m_renderView, m_compositingReasonFinder).update(updateRoot);
|
| -
|
| - CompositingLayerAssigner layerAssigner(this);
|
| - layerAssigner.assign(updateRoot, layersNeedingPaintInvalidation);
|
| -
|
| - bool layersChanged = layerAssigner.layersChanged();
|
| -
|
| - {
|
| - TRACE_EVENT0("blink", "RenderLayerCompositor::updateAfterCompositingChange");
|
| - if (const FrameView::ScrollableAreaSet* scrollableAreas = m_renderView.frameView()->scrollableAreas()) {
|
| - for (FrameView::ScrollableAreaSet::iterator it = scrollableAreas->begin(); it != scrollableAreas->end(); ++it)
|
| - layersChanged |= (*it)->updateAfterCompositingChange();
|
| - }
|
| - }
|
| -
|
| - if (layersChanged)
|
| - updateType = std::max(updateType, CompositingUpdateRebuildTree);
|
| - }
|
| -
|
| - if (updateType != CompositingUpdateNone) {
|
| - GraphicsLayerUpdater updater;
|
| - updater.update(*updateRoot, layersNeedingPaintInvalidation);
|
| -
|
| - if (updater.needsRebuildTree())
|
| - updateType = std::max(updateType, CompositingUpdateRebuildTree);
|
| -
|
| -#if ENABLE(ASSERT)
|
| - // FIXME: Move this check to the end of the compositing update.
|
| - GraphicsLayerUpdater::assertNeedsToUpdateGraphicsLayerBitsCleared(*updateRoot);
|
| -#endif
|
| - }
|
| -
|
| - if (updateType >= CompositingUpdateRebuildTree) {
|
| - GraphicsLayerTreeBuilder::AncestorInfo ancestorInfo;
|
| - GraphicsLayerVector childList;
|
| - ancestorInfo.childLayersOfEnclosingCompositedLayer = &childList;
|
| - {
|
| - TRACE_EVENT0("blink", "GraphicsLayerTreeBuilder::rebuild");
|
| - GraphicsLayerTreeBuilder().rebuild(*updateRoot, ancestorInfo);
|
| - }
|
| -
|
| - if (childList.isEmpty())
|
| - destroyRootLayer();
|
| - else
|
| - m_rootContentLayer->setChildren(childList);
|
| -
|
| - if (RuntimeEnabledFeatures::overlayFullscreenVideoEnabled())
|
| - applyOverlayFullscreenVideoAdjustment();
|
| - }
|
| -
|
| - if (m_needsUpdateFixedBackground) {
|
| - rootFixedBackgroundsChanged();
|
| - m_needsUpdateFixedBackground = false;
|
| - }
|
| -
|
| - for (unsigned i = 0; i < layersNeedingPaintInvalidation.size(); i++)
|
| - forceRecomputePaintInvalidationRectsIncludingNonCompositingDescendants(layersNeedingPaintInvalidation[i]->renderer());
|
| -
|
| - // Inform the inspector that the layer tree has changed.
|
| - if (m_renderView.frame()->isMainFrame())
|
| - InspectorInstrumentation::layerTreeDidChange(m_renderView.frame());
|
| -}
|
| -
|
| -bool RenderLayerCompositor::allocateOrClearCompositedLayerMapping(RenderLayer* layer, const CompositingStateTransitionType compositedLayerUpdate)
|
| -{
|
| - bool compositedLayerMappingChanged = false;
|
| -
|
| - // FIXME: It would be nice to directly use the layer's compositing reason,
|
| - // but allocateOrClearCompositedLayerMapping also gets called without having updated compositing
|
| - // requirements fully.
|
| - switch (compositedLayerUpdate) {
|
| - case AllocateOwnCompositedLayerMapping:
|
| - ASSERT(!layer->hasCompositedLayerMapping());
|
| - setCompositingModeEnabled(true);
|
| -
|
| - // If we need to issue paint invalidations, do so before allocating the compositedLayerMapping and clearing out the groupedMapping.
|
| - paintInvalidationOnCompositingChange(layer);
|
| -
|
| - // If this layer was previously squashed, we need to remove its reference to a groupedMapping right away, so
|
| - // that computing paint invalidation rects will know the layer's correct compositingState.
|
| - // FIXME: do we need to also remove the layer from it's location in the squashing list of its groupedMapping?
|
| - // Need to create a test where a squashed layer pops into compositing. And also to cover all other
|
| - // sorts of compositingState transitions.
|
| - layer->setLostGroupedMapping(false);
|
| - layer->setGroupedMapping(0);
|
| -
|
| - layer->ensureCompositedLayerMapping();
|
| - compositedLayerMappingChanged = true;
|
| -
|
| - // At this time, the ScrollingCooridnator only supports the top-level frame.
|
| - if (layer->isRootLayer() && m_renderView.frame()->isLocalRoot()) {
|
| - if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
|
| - scrollingCoordinator->frameViewRootLayerDidChange(m_renderView.frameView());
|
| - }
|
| - break;
|
| - case RemoveOwnCompositedLayerMapping:
|
| - // PutInSquashingLayer means you might have to remove the composited layer mapping first.
|
| - case PutInSquashingLayer:
|
| - if (layer->hasCompositedLayerMapping()) {
|
| - // If we're removing the compositedLayerMapping from a reflection, clear the source GraphicsLayer's pointer to
|
| - // its replica GraphicsLayer. In practice this should never happen because reflectee and reflection
|
| - // are both either composited, or not composited.
|
| - if (layer->isReflection()) {
|
| - RenderLayer* sourceLayer = toRenderLayerModelObject(layer->renderer()->parent())->layer();
|
| - if (sourceLayer->hasCompositedLayerMapping()) {
|
| - ASSERT(sourceLayer->compositedLayerMapping()->mainGraphicsLayer()->replicaLayer() == layer->compositedLayerMapping()->mainGraphicsLayer());
|
| - sourceLayer->compositedLayerMapping()->mainGraphicsLayer()->setReplicatedByLayer(0);
|
| - }
|
| - }
|
| -
|
| - layer->clearCompositedLayerMapping();
|
| - compositedLayerMappingChanged = true;
|
| - }
|
| -
|
| - break;
|
| - case RemoveFromSquashingLayer:
|
| - case NoCompositingStateChange:
|
| - // Do nothing.
|
| - break;
|
| - }
|
| -
|
| - if (compositedLayerMappingChanged && layer->renderer()->isRenderPart()) {
|
| - RenderLayerCompositor* innerCompositor = frameContentsCompositor(toRenderPart(layer->renderer()));
|
| - if (innerCompositor && innerCompositor->staleInCompositingMode())
|
| - innerCompositor->updateRootLayerAttachment();
|
| - }
|
| -
|
| - if (compositedLayerMappingChanged)
|
| - layer->clipper().clearClipRectsIncludingDescendants(PaintingClipRects);
|
| -
|
| - // If a fixed position layer gained/lost a compositedLayerMapping or the reason not compositing it changed,
|
| - // the scrolling coordinator needs to recalculate whether it can do fast scrolling.
|
| - if (compositedLayerMappingChanged) {
|
| - if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
|
| - scrollingCoordinator->frameViewFixedObjectsDidChange(m_renderView.frameView());
|
| - }
|
| -
|
| - return compositedLayerMappingChanged;
|
| -}
|
| -
|
| -void RenderLayerCompositor::paintInvalidationOnCompositingChange(RenderLayer* layer)
|
| -{
|
| - // If the renderer is not attached yet, no need to issue paint invalidations.
|
| - if (layer->renderer() != &m_renderView && !layer->renderer()->parent())
|
| - return;
|
| -
|
| - // For querying RenderLayer::compositingState()
|
| - // Eager invalidation here is correct, since we are invalidating with respect to the previous frame's
|
| - // compositing state when changing the compositing backing of the layer.
|
| - DisableCompositingQueryAsserts disabler;
|
| -
|
| - layer->renderer()->invalidatePaintIncludingNonCompositingDescendants();
|
| -}
|
| -
|
| -void RenderLayerCompositor::frameViewDidChangeLocation(const IntPoint& contentsOffset)
|
| -{
|
| - if (m_overflowControlsHostLayer)
|
| - m_overflowControlsHostLayer->setPosition(contentsOffset);
|
| -}
|
| -
|
| -void RenderLayerCompositor::frameViewDidChangeSize()
|
| -{
|
| - if (m_containerLayer) {
|
| - FrameView* frameView = m_renderView.frameView();
|
| - m_containerLayer->setSize(frameView->unscaledVisibleContentSize());
|
| - m_overflowControlsHostLayer->setSize(frameView->unscaledVisibleContentSize(IncludeScrollbars));
|
| -
|
| - frameViewDidScroll();
|
| - updateOverflowControlsLayers();
|
| - }
|
| -}
|
| -
|
| -enum AcceleratedFixedRootBackgroundHistogramBuckets {
|
| - ScrolledMainFrameBucket = 0,
|
| - ScrolledMainFrameWithAcceleratedFixedRootBackground = 1,
|
| - ScrolledMainFrameWithUnacceleratedFixedRootBackground = 2,
|
| - AcceleratedFixedRootBackgroundHistogramMax = 3
|
| -};
|
| -
|
| -void RenderLayerCompositor::frameViewDidScroll()
|
| -{
|
| - FrameView* frameView = m_renderView.frameView();
|
| - IntPoint scrollPosition = frameView->scrollPosition();
|
| -
|
| - if (!m_scrollLayer)
|
| - return;
|
| -
|
| - bool scrollingCoordinatorHandlesOffset = false;
|
| - if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator()) {
|
| - if (Settings* settings = m_renderView.document().settings()) {
|
| - if (m_renderView.frame()->isLocalRoot() || settings->preferCompositingToLCDTextEnabled())
|
| - scrollingCoordinatorHandlesOffset = scrollingCoordinator->scrollableAreaScrollLayerDidChange(frameView);
|
| - }
|
| - }
|
| -
|
| - // Scroll position = scroll minimum + scroll offset. Adjust the layer's
|
| - // position to handle whatever the scroll coordinator isn't handling.
|
| - // The minimum scroll position is non-zero for RTL pages with overflow.
|
| - if (scrollingCoordinatorHandlesOffset)
|
| - m_scrollLayer->setPosition(-frameView->minimumScrollPosition());
|
| - else
|
| - m_scrollLayer->setPosition(-scrollPosition);
|
| -
|
| -
|
| - Platform::current()->histogramEnumeration("Renderer.AcceleratedFixedRootBackground",
|
| - ScrolledMainFrameBucket,
|
| - AcceleratedFixedRootBackgroundHistogramMax);
|
| -}
|
| -
|
| -void RenderLayerCompositor::frameViewScrollbarsExistenceDidChange()
|
| -{
|
| - if (m_containerLayer)
|
| - updateOverflowControlsLayers();
|
| -}
|
| -
|
| -void RenderLayerCompositor::rootFixedBackgroundsChanged()
|
| -{
|
| - if (!supportsFixedRootBackgroundCompositing())
|
| - return;
|
| -
|
| - // To avoid having to make the fixed root background layer fixed positioned to
|
| - // stay put, we position it in the layer tree as follows:
|
| - //
|
| - // + Overflow controls host
|
| - // + LocalFrame clip
|
| - // + (Fixed root background) <-- Here.
|
| - // + LocalFrame scroll
|
| - // + Root content layer
|
| - // + Scrollbars
|
| - //
|
| - // That is, it needs to be the first child of the frame clip, the sibling of
|
| - // the frame scroll layer. The compositor does not own the background layer, it
|
| - // just positions it (like the foreground layer).
|
| - if (GraphicsLayer* backgroundLayer = fixedRootBackgroundLayer())
|
| - m_containerLayer->addChildBelow(backgroundLayer, m_scrollLayer.get());
|
| -}
|
| -
|
| -bool RenderLayerCompositor::scrollingLayerDidChange(RenderLayer* layer)
|
| -{
|
| - if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
|
| - return scrollingCoordinator->scrollableAreaScrollLayerDidChange(layer->scrollableArea());
|
| - return false;
|
| -}
|
| -
|
| -String RenderLayerCompositor::layerTreeAsText(LayerTreeFlags flags)
|
| -{
|
| - ASSERT(lifecycle().state() >= DocumentLifecycle::PaintInvalidationClean);
|
| -
|
| - if (!m_rootContentLayer)
|
| - return String();
|
| -
|
| - // We skip dumping the scroll and clip layers to keep layerTreeAsText output
|
| - // similar between platforms (unless we explicitly request dumping from the
|
| - // root.
|
| - GraphicsLayer* rootLayer = m_rootContentLayer.get();
|
| - if (flags & LayerTreeIncludesRootLayer)
|
| - rootLayer = rootGraphicsLayer();
|
| -
|
| - String layerTreeText = rootLayer->layerTreeAsText(flags);
|
| -
|
| - // The true root layer is not included in the dump, so if we want to report
|
| - // its paint invalidation rects, they must be included here.
|
| - if (flags & LayerTreeIncludesPaintInvalidationRects)
|
| - return m_renderView.frameView()->trackedPaintInvalidationRectsAsText() + layerTreeText;
|
| -
|
| - return layerTreeText;
|
| -}
|
| -
|
| -RenderLayerCompositor* RenderLayerCompositor::frameContentsCompositor(RenderPart* renderer)
|
| -{
|
| - if (!renderer->node()->isFrameOwnerElement())
|
| - return 0;
|
| -
|
| - HTMLFrameOwnerElement* element = toHTMLFrameOwnerElement(renderer->node());
|
| - if (Document* contentDocument = element->contentDocument()) {
|
| - if (RenderView* view = contentDocument->renderView())
|
| - return view->compositor();
|
| - }
|
| - return 0;
|
| -}
|
| -
|
| -// FIXME: What does this function do? It needs a clearer name.
|
| -bool RenderLayerCompositor::parentFrameContentLayers(RenderPart* renderer)
|
| -{
|
| - RenderLayerCompositor* innerCompositor = frameContentsCompositor(renderer);
|
| - if (!innerCompositor || !innerCompositor->staleInCompositingMode() || innerCompositor->rootLayerAttachment() != RootLayerAttachedViaEnclosingFrame)
|
| - return false;
|
| -
|
| - RenderLayer* layer = renderer->layer();
|
| - if (!layer->hasCompositedLayerMapping())
|
| - return false;
|
| -
|
| - CompositedLayerMapping* compositedLayerMapping = layer->compositedLayerMapping();
|
| - GraphicsLayer* hostingLayer = compositedLayerMapping->parentForSublayers();
|
| - GraphicsLayer* rootLayer = innerCompositor->rootGraphicsLayer();
|
| - if (hostingLayer->children().size() != 1 || hostingLayer->children()[0] != rootLayer) {
|
| - hostingLayer->removeAllChildren();
|
| - hostingLayer->addChild(rootLayer);
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -static void fullyInvalidatePaintRecursive(RenderLayer* layer)
|
| -{
|
| - if (layer->compositingState() == PaintsIntoOwnBacking) {
|
| - layer->compositedLayerMapping()->setContentsNeedDisplay();
|
| - layer->compositedLayerMapping()->setSquashingContentsNeedDisplay();
|
| - }
|
| -
|
| - for (RenderLayer* child = layer->firstChild(); child; child = child->nextSibling())
|
| - fullyInvalidatePaintRecursive(child);
|
| -}
|
| -
|
| -void RenderLayerCompositor::fullyInvalidatePaint()
|
| -{
|
| - // We're walking all compositing layers and invalidating them, so there's
|
| - // no need to have up-to-date compositing state.
|
| - DisableCompositingQueryAsserts disabler;
|
| - fullyInvalidatePaintRecursive(rootRenderLayer());
|
| -}
|
| -
|
| -RenderLayer* RenderLayerCompositor::rootRenderLayer() const
|
| -{
|
| - return m_renderView.layer();
|
| -}
|
| -
|
| -GraphicsLayer* RenderLayerCompositor::rootGraphicsLayer() const
|
| -{
|
| - if (m_overflowControlsHostLayer)
|
| - return m_overflowControlsHostLayer.get();
|
| - return m_rootContentLayer.get();
|
| -}
|
| -
|
| -GraphicsLayer* RenderLayerCompositor::frameScrollLayer() const
|
| -{
|
| - return m_scrollLayer.get();
|
| -}
|
| -
|
| -GraphicsLayer* RenderLayerCompositor::scrollLayer() const
|
| -{
|
| - if (ScrollableArea* scrollableArea = m_renderView.frameView()->scrollableArea())
|
| - return scrollableArea->layerForScrolling();
|
| - return nullptr;
|
| -}
|
| -
|
| -GraphicsLayer* RenderLayerCompositor::containerLayer() const
|
| -{
|
| - return m_containerLayer.get();
|
| -}
|
| -
|
| -GraphicsLayer* RenderLayerCompositor::ensureRootTransformLayer()
|
| -{
|
| - ASSERT(rootGraphicsLayer());
|
| -
|
| - if (!m_rootTransformLayer.get()) {
|
| - m_rootTransformLayer = GraphicsLayer::create(graphicsLayerFactory(), this);
|
| - m_overflowControlsHostLayer->addChild(m_rootTransformLayer.get());
|
| - m_rootTransformLayer->addChild(m_containerLayer.get());
|
| - updateOverflowControlsLayers();
|
| - }
|
| -
|
| - return m_rootTransformLayer.get();
|
| -}
|
| -
|
| -void RenderLayerCompositor::setIsInWindow(bool isInWindow)
|
| -{
|
| - if (!staleInCompositingMode())
|
| - return;
|
| -
|
| - if (isInWindow) {
|
| - if (m_rootLayerAttachment != RootLayerUnattached)
|
| - return;
|
| -
|
| - RootLayerAttachment attachment = m_renderView.frame()->isLocalRoot() ? RootLayerAttachedViaChromeClient : RootLayerAttachedViaEnclosingFrame;
|
| - attachRootLayer(attachment);
|
| - } else {
|
| - if (m_rootLayerAttachment == RootLayerUnattached)
|
| - return;
|
| -
|
| - detachRootLayer();
|
| - }
|
| -}
|
| -
|
| -void RenderLayerCompositor::updateRootLayerPosition()
|
| -{
|
| - if (m_rootContentLayer) {
|
| - const IntRect& documentRect = m_renderView.documentRect();
|
| - m_rootContentLayer->setSize(documentRect.size());
|
| - m_rootContentLayer->setPosition(documentRect.location());
|
| - }
|
| - if (m_containerLayer) {
|
| - FrameView* frameView = m_renderView.frameView();
|
| - m_containerLayer->setSize(frameView->unscaledVisibleContentSize());
|
| - m_overflowControlsHostLayer->setSize(frameView->unscaledVisibleContentSize(IncludeScrollbars));
|
| - }
|
| -}
|
| -
|
| -void RenderLayerCompositor::updatePotentialCompositingReasonsFromStyle(RenderLayer* layer)
|
| -{
|
| - layer->setPotentialCompositingReasonsFromStyle(m_compositingReasonFinder.potentialCompositingReasonsFromStyle(layer->renderer()));
|
| -}
|
| -
|
| -void RenderLayerCompositor::updateDirectCompositingReasons(RenderLayer* layer)
|
| -{
|
| - layer->setCompositingReasons(m_compositingReasonFinder.directReasons(layer), CompositingReasonComboAllDirectReasons);
|
| -}
|
| -
|
| -void RenderLayerCompositor::setOverlayLayer(GraphicsLayer* layer)
|
| -{
|
| - ASSERT(rootGraphicsLayer());
|
| -
|
| - if (layer->parent() != m_overflowControlsHostLayer.get())
|
| - m_overflowControlsHostLayer->addChild(layer);
|
| -}
|
| -
|
| -bool RenderLayerCompositor::canBeComposited(const RenderLayer* layer) const
|
| -{
|
| - return m_hasAcceleratedCompositing && layer->isSelfPaintingLayer() && !layer->subtreeIsInvisible();
|
| -}
|
| -
|
| -// Return true if the given layer is a stacking context and has compositing child
|
| -// layers that it needs to clip. In this case we insert a clipping GraphicsLayer
|
| -// into the hierarchy between this layer and its children in the z-order hierarchy.
|
| -bool RenderLayerCompositor::clipsCompositingDescendants(const RenderLayer* layer) const
|
| -{
|
| - return layer->hasCompositingDescendant() && layer->renderer()->hasClipOrOverflowClip();
|
| -}
|
| -
|
| -// If an element has composited negative z-index children, those children render in front of the
|
| -// layer background, so we need an extra 'contents' layer for the foreground of the layer
|
| -// object.
|
| -bool RenderLayerCompositor::needsContentsCompositingLayer(const RenderLayer* layer) const
|
| -{
|
| - if (!layer->hasCompositingDescendant())
|
| - return false;
|
| - return layer->stackingNode()->hasNegativeZOrderList();
|
| -}
|
| -
|
| -static void paintScrollbar(Scrollbar* scrollbar, GraphicsContext& context, const IntRect& clip)
|
| -{
|
| - if (!scrollbar)
|
| - return;
|
| -
|
| - // Frame scrollbars are painted in the space of the containing frame, not the local space of the scrollbar.
|
| - const IntPoint& paintOffset = scrollbar->frameRect().location();
|
| - IntRect transformedClip = clip;
|
| - transformedClip.moveBy(paintOffset);
|
| -
|
| - AffineTransform translation;
|
| - translation.translate(-paintOffset.x(), -paintOffset.y());
|
| - TransformRecorder transformRecorder(context, scrollbar->displayItemClient(), translation);
|
| -
|
| - scrollbar->paint(&context, transformedClip);
|
| -}
|
| -
|
| -void RenderLayerCompositor::paintContents(const GraphicsLayer* graphicsLayer, GraphicsContext& context, GraphicsLayerPaintingPhase, const IntRect& clip)
|
| -{
|
| - if (graphicsLayer == layerForHorizontalScrollbar())
|
| - paintScrollbar(m_renderView.frameView()->horizontalScrollbar(), context, clip);
|
| - else if (graphicsLayer == layerForVerticalScrollbar())
|
| - paintScrollbar(m_renderView.frameView()->verticalScrollbar(), context, clip);
|
| - else if (graphicsLayer == layerForScrollCorner())
|
| - FramePainter(*m_renderView.frameView()).paintScrollCorner(&context, clip);
|
| -}
|
| -
|
| -bool RenderLayerCompositor::supportsFixedRootBackgroundCompositing() const
|
| -{
|
| - if (Settings* settings = m_renderView.document().settings())
|
| - return settings->preferCompositingToLCDTextEnabled();
|
| - return false;
|
| -}
|
| -
|
| -bool RenderLayerCompositor::needsFixedRootBackgroundLayer(const RenderLayer* layer) const
|
| -{
|
| - if (layer != m_renderView.layer())
|
| - return false;
|
| -
|
| - return supportsFixedRootBackgroundCompositing() && m_renderView.rootBackgroundIsEntirelyFixed();
|
| -}
|
| -
|
| -GraphicsLayer* RenderLayerCompositor::fixedRootBackgroundLayer() const
|
| -{
|
| - // Get the fixed root background from the RenderView layer's compositedLayerMapping.
|
| - RenderLayer* viewLayer = m_renderView.layer();
|
| - if (!viewLayer)
|
| - return 0;
|
| -
|
| - if (viewLayer->compositingState() == PaintsIntoOwnBacking && viewLayer->compositedLayerMapping()->backgroundLayerPaintsFixedRootBackground())
|
| - return viewLayer->compositedLayerMapping()->backgroundLayer();
|
| -
|
| - return 0;
|
| -}
|
| -
|
| -static void resetTrackedPaintInvalidationRectsRecursive(GraphicsLayer* graphicsLayer)
|
| -{
|
| - if (!graphicsLayer)
|
| - return;
|
| -
|
| - graphicsLayer->resetTrackedPaintInvalidations();
|
| -
|
| - for (size_t i = 0; i < graphicsLayer->children().size(); ++i)
|
| - resetTrackedPaintInvalidationRectsRecursive(graphicsLayer->children()[i]);
|
| -
|
| - if (GraphicsLayer* replicaLayer = graphicsLayer->replicaLayer())
|
| - resetTrackedPaintInvalidationRectsRecursive(replicaLayer);
|
| -
|
| - if (GraphicsLayer* maskLayer = graphicsLayer->maskLayer())
|
| - resetTrackedPaintInvalidationRectsRecursive(maskLayer);
|
| -
|
| - if (GraphicsLayer* clippingMaskLayer = graphicsLayer->contentsClippingMaskLayer())
|
| - resetTrackedPaintInvalidationRectsRecursive(clippingMaskLayer);
|
| -}
|
| -
|
| -void RenderLayerCompositor::resetTrackedPaintInvalidationRects()
|
| -{
|
| - if (GraphicsLayer* rootLayer = rootGraphicsLayer())
|
| - resetTrackedPaintInvalidationRectsRecursive(rootLayer);
|
| -}
|
| -
|
| -void RenderLayerCompositor::setTracksPaintInvalidations(bool tracksPaintInvalidations)
|
| -{
|
| - ASSERT(lifecycle().state() == DocumentLifecycle::PaintInvalidationClean);
|
| - m_isTrackingPaintInvalidations = tracksPaintInvalidations;
|
| -}
|
| -
|
| -bool RenderLayerCompositor::isTrackingPaintInvalidations() const
|
| -{
|
| - return m_isTrackingPaintInvalidations;
|
| -}
|
| -
|
| -static bool shouldCompositeOverflowControls(FrameView* view)
|
| -{
|
| - if (Page* page = view->frame().page()) {
|
| - if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator()) {
|
| - if (scrollingCoordinator->coordinatesScrollingForFrameView(view))
|
| - return true;
|
| - }
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool RenderLayerCompositor::requiresHorizontalScrollbarLayer() const
|
| -{
|
| - FrameView* view = m_renderView.frameView();
|
| - return shouldCompositeOverflowControls(view) && view->horizontalScrollbar();
|
| -}
|
| -
|
| -bool RenderLayerCompositor::requiresVerticalScrollbarLayer() const
|
| -{
|
| - FrameView* view = m_renderView.frameView();
|
| - return shouldCompositeOverflowControls(view) && view->verticalScrollbar();
|
| -}
|
| -
|
| -bool RenderLayerCompositor::requiresScrollCornerLayer() const
|
| -{
|
| - FrameView* view = m_renderView.frameView();
|
| - return shouldCompositeOverflowControls(view) && view->isScrollCornerVisible();
|
| -}
|
| -
|
| -void RenderLayerCompositor::updateOverflowControlsLayers()
|
| -{
|
| - GraphicsLayer* controlsParent = m_rootTransformLayer.get() ? m_rootTransformLayer.get() : m_overflowControlsHostLayer.get();
|
| - // On Mac, main frame scrollbars should always be stuck to the sides of the screen (in overscroll and in pinch-zoom), so
|
| - // make the parent for the scrollbars be the viewport container layer.
|
| -#if OS(MACOSX)
|
| - if (m_renderView.frame()->isMainFrame() && m_renderView.frame()->settings()->pinchVirtualViewportEnabled()) {
|
| - PinchViewport& pinchViewport = m_renderView.frameView()->page()->frameHost().pinchViewport();
|
| - controlsParent = pinchViewport.containerLayer();
|
| - }
|
| -#endif
|
| -
|
| - if (requiresHorizontalScrollbarLayer()) {
|
| - if (!m_layerForHorizontalScrollbar) {
|
| - m_layerForHorizontalScrollbar = GraphicsLayer::create(graphicsLayerFactory(), this);
|
| - }
|
| -
|
| - if (m_layerForHorizontalScrollbar->parent() != controlsParent) {
|
| - controlsParent->addChild(m_layerForHorizontalScrollbar.get());
|
| -
|
| - if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
|
| - scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_renderView.frameView(), HorizontalScrollbar);
|
| - }
|
| - } else if (m_layerForHorizontalScrollbar) {
|
| - m_layerForHorizontalScrollbar->removeFromParent();
|
| - m_layerForHorizontalScrollbar = nullptr;
|
| -
|
| - if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
|
| - scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_renderView.frameView(), HorizontalScrollbar);
|
| - }
|
| -
|
| - if (requiresVerticalScrollbarLayer()) {
|
| - if (!m_layerForVerticalScrollbar) {
|
| - m_layerForVerticalScrollbar = GraphicsLayer::create(graphicsLayerFactory(), this);
|
| - }
|
| -
|
| - if (m_layerForVerticalScrollbar->parent() != controlsParent) {
|
| - controlsParent->addChild(m_layerForVerticalScrollbar.get());
|
| -
|
| - if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
|
| - scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_renderView.frameView(), VerticalScrollbar);
|
| - }
|
| - } else if (m_layerForVerticalScrollbar) {
|
| - m_layerForVerticalScrollbar->removeFromParent();
|
| - m_layerForVerticalScrollbar = nullptr;
|
| -
|
| - if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
|
| - scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_renderView.frameView(), VerticalScrollbar);
|
| - }
|
| -
|
| - if (requiresScrollCornerLayer()) {
|
| - if (!m_layerForScrollCorner) {
|
| - m_layerForScrollCorner = GraphicsLayer::create(graphicsLayerFactory(), this);
|
| - controlsParent->addChild(m_layerForScrollCorner.get());
|
| - }
|
| - } else if (m_layerForScrollCorner) {
|
| - m_layerForScrollCorner->removeFromParent();
|
| - m_layerForScrollCorner = nullptr;
|
| - }
|
| -
|
| - m_renderView.frameView()->positionScrollbarLayers();
|
| -}
|
| -
|
| -void RenderLayerCompositor::ensureRootLayer()
|
| -{
|
| - RootLayerAttachment expectedAttachment = m_renderView.frame()->isLocalRoot() ? RootLayerAttachedViaChromeClient : RootLayerAttachedViaEnclosingFrame;
|
| - if (expectedAttachment == m_rootLayerAttachment)
|
| - return;
|
| -
|
| - Settings* settings = m_renderView.document().settings();
|
| - if (!m_rootContentLayer) {
|
| - m_rootContentLayer = GraphicsLayer::create(graphicsLayerFactory(), this);
|
| - IntRect overflowRect = m_renderView.pixelSnappedLayoutOverflowRect();
|
| - m_rootContentLayer->setSize(FloatSize(overflowRect.maxX(), overflowRect.maxY()));
|
| - m_rootContentLayer->setPosition(FloatPoint());
|
| - m_rootContentLayer->setOwnerNodeId(InspectorNodeIds::idForNode(m_renderView.generatingNode()));
|
| -
|
| - // FIXME: with rootLayerScrolls, we probably don't even need m_rootContentLayer?
|
| - if (!(settings && settings->rootLayerScrolls())) {
|
| - // Need to clip to prevent transformed content showing outside this frame
|
| - m_rootContentLayer->setMasksToBounds(true);
|
| - }
|
| - }
|
| -
|
| - if (!m_overflowControlsHostLayer) {
|
| - ASSERT(!m_scrollLayer);
|
| - ASSERT(!m_containerLayer);
|
| -
|
| - // Create a layer to host the clipping layer and the overflow controls layers.
|
| - m_overflowControlsHostLayer = GraphicsLayer::create(graphicsLayerFactory(), this);
|
| -
|
| - // Clip iframe's overflow controls layer.
|
| - bool containerMasksToBounds = !m_renderView.frame()->isLocalRoot();
|
| - m_overflowControlsHostLayer->setMasksToBounds(containerMasksToBounds);
|
| -
|
| - // Create a clipping layer if this is an iframe or settings require to clip.
|
| - m_containerLayer = GraphicsLayer::create(graphicsLayerFactory(), this);
|
| - if (Settings* settings = m_renderView.document().settings()) {
|
| - if (settings->mainFrameClipsContent())
|
| - containerMasksToBounds = true;
|
| - }
|
| - m_containerLayer->setMasksToBounds(containerMasksToBounds);
|
| -
|
| - m_scrollLayer = GraphicsLayer::create(graphicsLayerFactory(), this);
|
| - if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
|
| - scrollingCoordinator->setLayerIsContainerForFixedPositionLayers(m_scrollLayer.get(), true);
|
| -
|
| - // Hook them up
|
| - m_overflowControlsHostLayer->addChild(m_containerLayer.get());
|
| - m_containerLayer->addChild(m_scrollLayer.get());
|
| - m_scrollLayer->addChild(m_rootContentLayer.get());
|
| -
|
| - frameViewDidChangeSize();
|
| - }
|
| -
|
| - // Check to see if we have to change the attachment
|
| - if (m_rootLayerAttachment != RootLayerUnattached)
|
| - detachRootLayer();
|
| -
|
| - attachRootLayer(expectedAttachment);
|
| -}
|
| -
|
| -void RenderLayerCompositor::destroyRootLayer()
|
| -{
|
| - if (!m_rootContentLayer)
|
| - return;
|
| -
|
| - detachRootLayer();
|
| -
|
| - if (m_layerForHorizontalScrollbar) {
|
| - m_layerForHorizontalScrollbar->removeFromParent();
|
| - m_layerForHorizontalScrollbar = nullptr;
|
| - if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
|
| - scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_renderView.frameView(), HorizontalScrollbar);
|
| - if (Scrollbar* horizontalScrollbar = m_renderView.frameView()->verticalScrollbar())
|
| - m_renderView.frameView()->invalidateScrollbar(horizontalScrollbar, IntRect(IntPoint(0, 0), horizontalScrollbar->frameRect().size()));
|
| - }
|
| -
|
| - if (m_layerForVerticalScrollbar) {
|
| - m_layerForVerticalScrollbar->removeFromParent();
|
| - m_layerForVerticalScrollbar = nullptr;
|
| - if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
|
| - scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_renderView.frameView(), VerticalScrollbar);
|
| - if (Scrollbar* verticalScrollbar = m_renderView.frameView()->verticalScrollbar())
|
| - m_renderView.frameView()->invalidateScrollbar(verticalScrollbar, IntRect(IntPoint(0, 0), verticalScrollbar->frameRect().size()));
|
| - }
|
| -
|
| - if (m_layerForScrollCorner) {
|
| - m_layerForScrollCorner = nullptr;
|
| - m_renderView.frameView()->invalidateScrollCorner(m_renderView.frameView()->scrollCornerRect());
|
| - }
|
| -
|
| - if (m_overflowControlsHostLayer) {
|
| - m_overflowControlsHostLayer = nullptr;
|
| - m_containerLayer = nullptr;
|
| - m_scrollLayer = nullptr;
|
| - }
|
| - ASSERT(!m_scrollLayer);
|
| - m_rootContentLayer = nullptr;
|
| - m_rootTransformLayer = nullptr;
|
| -}
|
| -
|
| -void RenderLayerCompositor::attachRootLayer(RootLayerAttachment attachment)
|
| -{
|
| - if (!m_rootContentLayer)
|
| - return;
|
| -
|
| - switch (attachment) {
|
| - case RootLayerUnattached:
|
| - ASSERT_NOT_REACHED();
|
| - break;
|
| - case RootLayerAttachedViaChromeClient: {
|
| - LocalFrame& frame = m_renderView.frameView()->frame();
|
| - Page* page = frame.page();
|
| - if (!page)
|
| - return;
|
| - page->chrome().client().attachRootGraphicsLayer(rootGraphicsLayer(), &frame);
|
| - break;
|
| - }
|
| - case RootLayerAttachedViaEnclosingFrame: {
|
| - HTMLFrameOwnerElement* ownerElement = m_renderView.document().ownerElement();
|
| - ASSERT(ownerElement);
|
| - // The layer will get hooked up via CompositedLayerMapping::updateGraphicsLayerConfiguration()
|
| - // for the frame's renderer in the parent document.
|
| - ownerElement->setNeedsCompositingUpdate();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - m_rootLayerAttachment = attachment;
|
| -}
|
| -
|
| -void RenderLayerCompositor::detachRootLayer()
|
| -{
|
| - if (!m_rootContentLayer || m_rootLayerAttachment == RootLayerUnattached)
|
| - return;
|
| -
|
| - switch (m_rootLayerAttachment) {
|
| - case RootLayerAttachedViaEnclosingFrame: {
|
| - // The layer will get unhooked up via CompositedLayerMapping::updateGraphicsLayerConfiguration()
|
| - // for the frame's renderer in the parent document.
|
| - if (m_overflowControlsHostLayer)
|
| - m_overflowControlsHostLayer->removeFromParent();
|
| - else
|
| - m_rootContentLayer->removeFromParent();
|
| -
|
| - if (HTMLFrameOwnerElement* ownerElement = m_renderView.document().ownerElement())
|
| - ownerElement->setNeedsCompositingUpdate();
|
| - break;
|
| - }
|
| - case RootLayerAttachedViaChromeClient: {
|
| - LocalFrame& frame = m_renderView.frameView()->frame();
|
| - Page* page = frame.page();
|
| - if (!page)
|
| - return;
|
| - page->chrome().client().attachRootGraphicsLayer(0, &frame);
|
| - break;
|
| - }
|
| - case RootLayerUnattached:
|
| - break;
|
| - }
|
| -
|
| - m_rootLayerAttachment = RootLayerUnattached;
|
| -}
|
| -
|
| -void RenderLayerCompositor::updateRootLayerAttachment()
|
| -{
|
| - ensureRootLayer();
|
| -}
|
| -
|
| -ScrollingCoordinator* RenderLayerCompositor::scrollingCoordinator() const
|
| -{
|
| - if (Page* page = this->page())
|
| - return page->scrollingCoordinator();
|
| -
|
| - return 0;
|
| -}
|
| -
|
| -GraphicsLayerFactory* RenderLayerCompositor::graphicsLayerFactory() const
|
| -{
|
| - if (Page* page = this->page())
|
| - return page->chrome().client().graphicsLayerFactory();
|
| - return 0;
|
| -}
|
| -
|
| -Page* RenderLayerCompositor::page() const
|
| -{
|
| - return m_renderView.frameView()->frame().page();
|
| -}
|
| -
|
| -DocumentLifecycle& RenderLayerCompositor::lifecycle() const
|
| -{
|
| - return m_renderView.document().lifecycle();
|
| -}
|
| -
|
| -String RenderLayerCompositor::debugName(const GraphicsLayer* graphicsLayer)
|
| -{
|
| - String name;
|
| - if (graphicsLayer == m_rootContentLayer.get()) {
|
| - name = "Content Root Layer";
|
| - } else if (graphicsLayer == m_rootTransformLayer.get()) {
|
| - name = "Root Transform Layer";
|
| - } else if (graphicsLayer == m_overflowControlsHostLayer.get()) {
|
| - name = "Overflow Controls Host Layer";
|
| - } else if (graphicsLayer == m_layerForHorizontalScrollbar.get()) {
|
| - name = "Horizontal Scrollbar Layer";
|
| - } else if (graphicsLayer == m_layerForVerticalScrollbar.get()) {
|
| - name = "Vertical Scrollbar Layer";
|
| - } else if (graphicsLayer == m_layerForScrollCorner.get()) {
|
| - name = "Scroll Corner Layer";
|
| - } else if (graphicsLayer == m_containerLayer.get()) {
|
| - name = "LocalFrame Clipping Layer";
|
| - } else if (graphicsLayer == m_scrollLayer.get()) {
|
| - name = "LocalFrame Scrolling Layer";
|
| - } else {
|
| - ASSERT_NOT_REACHED();
|
| - }
|
| -
|
| - return name;
|
| -}
|
| -
|
| -} // namespace blink
|
|
|