Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(84)

Side by Side Diff: Source/core/rendering/RenderLayer.cpp

Issue 22419002: Set up clip and scroll parents on the blink side. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
3 * 3 *
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation.
5 * 5 *
6 * Other contributors: 6 * Other contributors:
7 * Robert O'Callahan <roc+@cs.cmu.edu> 7 * Robert O'Callahan <roc+@cs.cmu.edu>
8 * David Baron <dbaron@fas.harvard.edu> 8 * David Baron <dbaron@fas.harvard.edu>
9 * Christian Biesinger <cbiesinger@web.de> 9 * Christian Biesinger <cbiesinger@web.de>
10 * Randall Jesup <rjesup@wgate.com> 10 * Randall Jesup <rjesup@wgate.com>
(...skipping 1794 matching lines...) Expand 10 before | Expand all | Expand 10 after
1805 1805
1806 if (oldChild->m_hasVisibleContent || oldChild->m_hasVisibleDescendant) 1806 if (oldChild->m_hasVisibleContent || oldChild->m_hasVisibleDescendant)
1807 dirtyAncestorChainVisibleDescendantStatus(); 1807 dirtyAncestorChainVisibleDescendantStatus();
1808 1808
1809 if (oldChild->isSelfPaintingLayer() || oldChild->hasSelfPaintingLayerDescend ant()) 1809 if (oldChild->isSelfPaintingLayer() || oldChild->hasSelfPaintingLayerDescend ant())
1810 dirtyAncestorChainHasSelfPaintingLayerDescendantStatus(); 1810 dirtyAncestorChainHasSelfPaintingLayerDescendantStatus();
1811 1811
1812 return oldChild; 1812 return oldChild;
1813 } 1813 }
1814 1814
1815 bool RenderLayer::hasAncestor(const RenderLayer* ancestor) const
1816 {
1817 if (!ancestor)
1818 return false;
1819
1820 for (const RenderLayer* layer = this; layer; layer = layer->parent()) {
1821 if (layer == ancestor)
1822 return true;
1823 }
1824
1825 return false;
1826 }
1827
1815 void RenderLayer::removeOnlyThisLayer() 1828 void RenderLayer::removeOnlyThisLayer()
1816 { 1829 {
1817 if (!m_parent) 1830 if (!m_parent)
1818 return; 1831 return;
1819 1832
1820 // Mark that we are about to lose our layer. This makes render tree 1833 // Mark that we are about to lose our layer. This makes render tree
1821 // walks ignore this layer while we're removing it. 1834 // walks ignore this layer while we're removing it.
1822 m_renderer->setHasLayer(false); 1835 m_renderer->setHasLayer(false);
1823 1836
1824 compositor()->layerWillBeRemoved(m_parent, this); 1837 compositor()->layerWillBeRemoved(m_parent, this);
(...skipping 3063 matching lines...) Expand 10 before | Expand all | Expand 10 after
4888 void RenderLayer::calculateClipRects(const ClipRectsContext& clipRectsContext, C lipRects& clipRects) const 4901 void RenderLayer::calculateClipRects(const ClipRectsContext& clipRectsContext, C lipRects& clipRects) const
4889 { 4902 {
4890 if (!parent()) { 4903 if (!parent()) {
4891 // The root layer's clip rect is always infinite. 4904 // The root layer's clip rect is always infinite.
4892 clipRects.reset(PaintInfo::infiniteRect()); 4905 clipRects.reset(PaintInfo::infiniteRect());
4893 return; 4906 return;
4894 } 4907 }
4895 4908
4896 ClipRectsType clipRectsType = clipRectsContext.clipRectsType; 4909 ClipRectsType clipRectsType = clipRectsContext.clipRectsType;
4897 bool useCached = clipRectsType != TemporaryClipRects; 4910 bool useCached = clipRectsType != TemporaryClipRects;
4911 bool isRoot = this == clipRectsContext.rootLayer;
4898 4912
4899 // For transformed layers, the root layer was shifted to be us, so there is no need to 4913 // For transformed layers, the root layer was shifted to be us, so there is no need to
4900 // examine the parent. We want to cache clip rects with us as the root. 4914 // examine the parent. We want to cache clip rects with us as the root.
4901 RenderLayer* parentLayer = clipRectsContext.rootLayer != this ? parent() : 0 ; 4915 RenderLayer* parentLayer = isRoot ? 0 : parent();
4902 4916
4903 // Ensure that our parent's clip has been calculated so that we can examine the values. 4917 // Ensure that our parent's clip has been calculated so that we can examine the values.
4904 if (parentLayer) { 4918 if (parentLayer) {
4905 if (useCached && parentLayer->clipRects(clipRectsContext)) 4919 if (useCached && parentLayer->clipRects(clipRectsContext))
4906 clipRects = *parentLayer->clipRects(clipRectsContext); 4920 clipRects = *parentLayer->clipRects(clipRectsContext);
4907 else { 4921 else {
4908 ClipRectsContext parentContext(clipRectsContext); 4922 ClipRectsContext parentContext(clipRectsContext);
4909 parentContext.overlayScrollbarSizeRelevancy = IgnoreOverlayScrollbar Size; // FIXME: why? 4923 parentContext.overlayScrollbarSizeRelevancy = IgnoreOverlayScrollbar Size; // FIXME: why?
4924 if (this == clipRectsContext.scrollParent)
4925 parentContext.scrollParent = 0;
4910 parentLayer->calculateClipRects(parentContext, clipRects); 4926 parentLayer->calculateClipRects(parentContext, clipRects);
4911 } 4927 }
4912 } else 4928 } else
4913 clipRects.reset(PaintInfo::infiniteRect()); 4929 clipRects.reset(PaintInfo::infiniteRect());
4914 4930
4915 // A fixed object is essentially the root of its containing block hierarchy, so when 4931 // A fixed object is essentially the root of its containing block hierarchy, so when
4916 // we encounter such an object, we reset our clip rects to the fixedClipRect . 4932 // we encounter such an object, we reset our clip rects to the fixedClipRect .
4917 if (renderer()->style()->position() == FixedPosition) { 4933 if (renderer()->style()->position() == FixedPosition) {
4918 clipRects.setPosClipRect(clipRects.fixedClipRect()); 4934 clipRects.setPosClipRect(clipRects.fixedClipRect());
4919 clipRects.setOverflowClipRect(clipRects.fixedClipRect()); 4935 clipRects.setOverflowClipRect(clipRects.fixedClipRect());
4920 clipRects.setFixed(true); 4936 clipRects.setFixed(true);
4921 } else if (renderer()->style()->hasInFlowPosition()) 4937 } else if (renderer()->style()->hasInFlowPosition())
4922 clipRects.setPosClipRect(clipRects.overflowClipRect()); 4938 clipRects.setPosClipRect(clipRects.overflowClipRect());
4923 else if (renderer()->style()->position() == AbsolutePosition) 4939 else if (renderer()->style()->position() == AbsolutePosition)
4924 clipRects.setOverflowClipRect(clipRects.posClipRect()); 4940 clipRects.setOverflowClipRect(clipRects.posClipRect());
4925 4941
4926 // Update the clip rects that will be passed to child layers. 4942 // Update the clip rects that will be passed to child layers. There are two reasons
4927 if ((renderer()->hasOverflowClip() && (clipRectsContext.respectOverflowClip == RespectOverflowClip || this != clipRectsContext.rootLayer)) || renderer()->ha sClip()) { 4943 // we may ignor the cilp here. If we've been told to ignore the overflow cli p (via
4944 // ClipRectsContext::respectOverflowClip), we do so, but only if this is the clip
4945 // root (this setting only applies to the root layer). Also, if a scroll par ent is
4946 // set, we ignore all clips until we've reached it (the point of the scrollP arent
4947 // member of ClipRectsContext is to determine the clip the scrollParent esta blishes
4948 // with respect to the clipRoot, regardless of any subsequent clipping that may happen
4949 // between us and our scroll parent).
4950 bool shouldIgnoreClip = clipRectsContext.scrollParent && this != clipRectsCo ntext.scrollParent;
4951 bool shouldIgnoreOverflowClip = clipRectsContext.respectOverflowClip == Igno reOverflowClip && isRoot;
4952
4953 bool shouldApplyClip = renderer()->hasClip() && !shouldIgnoreClip;
4954 bool shouldApplyOverflowClip = renderer()->hasOverflowClip() && !shouldIgnor eOverflowClip && !shouldIgnoreClip;
4955
4956 if (shouldApplyOverflowClip || shouldApplyClip) {
4928 // This layer establishes a clip of some kind. 4957 // This layer establishes a clip of some kind.
4929 4958
4930 // This offset cannot use convertToLayerCoords, because sometimes our ro otLayer may be across 4959 // This offset cannot use convertToLayerCoords, because sometimes our ro otLayer may be across
4931 // some transformed layer boundary, for example, in the RenderLayerCompo sitor overlapMap, where 4960 // some transformed layer boundary, for example, in the RenderLayerCompo sitor overlapMap, where
4932 // clipRects are needed in view space. 4961 // clipRects are needed in view space.
4933 LayoutPoint offset; 4962 LayoutPoint offset;
4934 offset = roundedLayoutPoint(renderer()->localToContainerPoint(FloatPoint (), clipRectsContext.rootLayer->renderer())); 4963 offset = roundedLayoutPoint(renderer()->localToContainerPoint(FloatPoint (), clipRectsContext.rootLayer->renderer()));
4935 RenderView* view = renderer()->view(); 4964 RenderView* view = renderer()->view();
4936 ASSERT(view); 4965 ASSERT(view);
4937 if (view && clipRects.fixed() && clipRectsContext.rootLayer->renderer() == view) { 4966 if (view && clipRects.fixed() && clipRectsContext.rootLayer->renderer() == view) {
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
5431 bool RenderLayer::hasCompositedMask() const 5460 bool RenderLayer::hasCompositedMask() const
5432 { 5461 {
5433 return m_backing && m_backing->hasMaskLayer(); 5462 return m_backing && m_backing->hasMaskLayer();
5434 } 5463 }
5435 5464
5436 GraphicsLayer* RenderLayer::layerForScrolling() const 5465 GraphicsLayer* RenderLayer::layerForScrolling() const
5437 { 5466 {
5438 return m_backing ? m_backing->scrollingContentsLayer() : 0; 5467 return m_backing ? m_backing->scrollingContentsLayer() : 0;
5439 } 5468 }
5440 5469
5470 GraphicsLayer* RenderLayer::layerForScrollChild() const
5471 {
5472 // If we have an ancestor clipping layer because of our scroll parent, we do not want to
5473 // scroll that clip layer -- we need it to stay put and we will slide within it. If, on
5474 // the other hand, we have an ancestor clipping layer due to some other clip ping layer, we
5475 // want to scroll the root of the layer's associate graphics layer subtree. I.e., we want it
5476 // and its clip to move in concert.
5477
5478 if (!backing())
5479 return 0;
5480
5481 if (backing()->hasAncestorScrollClippingLayer()) {
5482 return backing()->hasAncestorClippingLayer()
5483 ? backing()->ancestorClippingLayer()
5484 : backing()->graphicsLayer();
5485 }
5486
5487 if (renderer()->containingBlock()->enclosingLayer() == ancestorScrollingLaye r())
5488 return backing()->graphicsLayer();
5489
5490 return backing()->childForSuperlayers();
5491 }
5492
5441 GraphicsLayer* RenderLayer::layerForHorizontalScrollbar() const 5493 GraphicsLayer* RenderLayer::layerForHorizontalScrollbar() const
5442 { 5494 {
5443 return m_backing ? m_backing->layerForHorizontalScrollbar() : 0; 5495 return m_backing ? m_backing->layerForHorizontalScrollbar() : 0;
5444 } 5496 }
5445 5497
5446 GraphicsLayer* RenderLayer::layerForVerticalScrollbar() const 5498 GraphicsLayer* RenderLayer::layerForVerticalScrollbar() const
5447 { 5499 {
5448 return m_backing ? m_backing->layerForVerticalScrollbar() : 0; 5500 return m_backing ? m_backing->layerForVerticalScrollbar() : 0;
5449 } 5501 }
5450 5502
(...skipping 976 matching lines...) Expand 10 before | Expand all | Expand 10 after
6427 } 6479 }
6428 } 6480 }
6429 6481
6430 void showLayerTree(const WebCore::RenderObject* renderer) 6482 void showLayerTree(const WebCore::RenderObject* renderer)
6431 { 6483 {
6432 if (!renderer) 6484 if (!renderer)
6433 return; 6485 return;
6434 showLayerTree(renderer->enclosingLayer()); 6486 showLayerTree(renderer->enclosingLayer());
6435 } 6487 }
6436 #endif 6488 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698