Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 124 RenderLayer::RenderLayer(RenderLayerModelObject* renderer) | 124 RenderLayer::RenderLayer(RenderLayerModelObject* renderer) |
| 125 : m_inResizeMode(false) | 125 : m_inResizeMode(false) |
| 126 , m_normalFlowListDirty(true) | 126 , m_normalFlowListDirty(true) |
| 127 , m_hasSelfPaintingLayerDescendant(false) | 127 , m_hasSelfPaintingLayerDescendant(false) |
| 128 , m_hasSelfPaintingLayerDescendantDirty(false) | 128 , m_hasSelfPaintingLayerDescendantDirty(false) |
| 129 , m_hasOutOfFlowPositionedDescendant(false) | 129 , m_hasOutOfFlowPositionedDescendant(false) |
| 130 , m_hasOutOfFlowPositionedDescendantDirty(true) | 130 , m_hasOutOfFlowPositionedDescendantDirty(true) |
| 131 , m_hasUnclippedDescendant(false) | 131 , m_hasUnclippedDescendant(false) |
| 132 , m_isUnclippedDescendant(false) | 132 , m_isUnclippedDescendant(false) |
| 133 , m_needsCompositedScrolling(false) | 133 , m_needsCompositedScrolling(false) |
| 134 , m_needsCompositedScrollingHasBeenRecorded(false) | 134 , m_needsToBeStackingContainerHasBeenRecorded(false) |
| 135 , m_willUseCompositedScrollingHasBeenRecorded(false) | 135 , m_willUseCompositedScrollingHasBeenRecorded(false) |
| 136 , m_isScrollableAreaHasBeenRecorded(false) | 136 , m_isScrollableAreaHasBeenRecorded(false) |
| 137 , m_needsToBeStackingContainer(false) | |
| 137 , m_canBePromotedToStackingContainer(false) | 138 , m_canBePromotedToStackingContainer(false) |
| 138 , m_canBePromotedToStackingContainerDirty(true) | 139 , m_canBePromotedToStackingContainerDirty(true) |
| 139 , m_isRootLayer(renderer->isRenderView()) | 140 , m_isRootLayer(renderer->isRenderView()) |
| 140 , m_usedTransparency(false) | 141 , m_usedTransparency(false) |
| 141 , m_paintingInsideReflection(false) | 142 , m_paintingInsideReflection(false) |
| 142 , m_inOverflowRelayout(false) | 143 , m_inOverflowRelayout(false) |
| 143 , m_repaintStatus(NeedsNormalRepaint) | 144 , m_repaintStatus(NeedsNormalRepaint) |
| 144 , m_visibleContentStatusDirty(true) | 145 , m_visibleContentStatusDirty(true) |
| 145 , m_hasVisibleContent(false) | 146 , m_hasVisibleContent(false) |
| 146 , m_visibleDescendantStatusDirty(false) | 147 , m_visibleDescendantStatusDirty(false) |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 470 } | 471 } |
| 471 } | 472 } |
| 472 } | 473 } |
| 473 | 474 |
| 474 bool RenderLayer::acceleratedCompositingForOverflowScrollEnabled() const | 475 bool RenderLayer::acceleratedCompositingForOverflowScrollEnabled() const |
| 475 { | 476 { |
| 476 const Settings* settings = renderer()->document().settings(); | 477 const Settings* settings = renderer()->document().settings(); |
| 477 return settings && settings->acceleratedCompositingForOverflowScrollEnabled( ); | 478 return settings && settings->acceleratedCompositingForOverflowScrollEnabled( ); |
| 478 } | 479 } |
| 479 | 480 |
| 481 bool RenderLayer::useCompositorDrivenAcceleratedScrolling() const | |
|
Ian Vollick
2013/09/06 02:01:05
It looks like there's some repeated logic here in
hartmanng
2013/09/06 20:18:36
Yeah, I guess we can... I thought we needed it fro
| |
| 482 { | |
| 483 if (!compositorDrivenAcceleratedScrollingEnabled()) | |
| 484 return false; | |
| 485 | |
| 486 const RenderLayer* scrollingLayer = ancestorScrollingLayer(); | |
| 487 if (!scrollingLayer || scrollingLayer->isStackingContainer()) | |
| 488 return false; | |
| 489 | |
| 490 if (scrollingLayer->m_canBePromotedToStackingContainerDirty) { | |
| 491 // We don't know if it's safe to promote to stacking container, and | |
| 492 // aren't in a position to find out, so we have to assume the worst. | |
| 493 return true; | |
| 494 } | |
| 495 | |
| 496 return !scrollingLayer->needsToBeStackingContainer(); | |
| 497 } | |
| 498 | |
| 480 // FIXME: This is a temporary flag and should be removed once accelerated | 499 // FIXME: This is a temporary flag and should be removed once accelerated |
| 481 // overflow scroll is ready (crbug.com/254111). | 500 // overflow scroll is ready (crbug.com/254111). |
| 482 bool RenderLayer::compositorDrivenAcceleratedScrollingEnabled() const | 501 bool RenderLayer::compositorDrivenAcceleratedScrollingEnabled() const |
| 483 { | 502 { |
| 484 if (!acceleratedCompositingForOverflowScrollEnabled()) | 503 if (!acceleratedCompositingForOverflowScrollEnabled()) |
| 485 return false; | 504 return false; |
| 486 | 505 |
| 487 const Settings* settings = renderer()->document().settings(); | 506 const Settings* settings = renderer()->document().settings(); |
| 488 return settings && settings->isCompositorDrivenAcceleratedScrollingEnabled() ; | 507 return settings && settings->isCompositorDrivenAcceleratedScrollingEnabled() ; |
| 489 } | 508 } |
| (...skipping 1541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2031 { | 2050 { |
| 2032 RenderBox* box = renderBox(); | 2051 RenderBox* box = renderBox(); |
| 2033 | 2052 |
| 2034 // Scroll form controls on the main thread so they exhibit correct touch scr oll event bubbling | 2053 // Scroll form controls on the main thread so they exhibit correct touch scr oll event bubbling |
| 2035 if (box && (box->isIntristicallyScrollable(VerticalScrollbar) || box->isIntr isticallyScrollable(HorizontalScrollbar))) | 2054 if (box && (box->isIntristicallyScrollable(VerticalScrollbar) || box->isIntr isticallyScrollable(HorizontalScrollbar))) |
| 2036 return false; | 2055 return false; |
| 2037 | 2056 |
| 2038 return isComposited() && backing()->scrollingLayer(); | 2057 return isComposited() && backing()->scrollingLayer(); |
| 2039 } | 2058 } |
| 2040 | 2059 |
| 2041 bool RenderLayer::needsCompositedScrolling() const | 2060 bool RenderLayer::adjustForForceCompositedScrollingMode(bool value) const |
| 2042 { | |
| 2043 if (!compositorDrivenAcceleratedScrollingEnabled()) | |
| 2044 return needsToBeStackingContainer(); | |
| 2045 if (FrameView* frameView = renderer()->view()->frameView()) | |
| 2046 return frameView->containsScrollableArea(scrollableArea()); | |
| 2047 return false; | |
| 2048 } | |
| 2049 | |
| 2050 bool RenderLayer::needsToBeStackingContainer() const | |
| 2051 { | 2061 { |
| 2052 switch (m_forceNeedsCompositedScrolling) { | 2062 switch (m_forceNeedsCompositedScrolling) { |
| 2053 case DoNotForceCompositedScrolling: | 2063 case DoNotForceCompositedScrolling: |
| 2054 return m_needsCompositedScrolling; | 2064 return value; |
| 2055 case CompositedScrollingAlwaysOn: | 2065 case CompositedScrollingAlwaysOn: |
| 2056 return true; | 2066 return true; |
| 2057 case CompositedScrollingAlwaysOff: | 2067 case CompositedScrollingAlwaysOff: |
| 2058 return false; | 2068 return false; |
| 2059 } | 2069 } |
| 2060 | 2070 |
| 2061 ASSERT_NOT_REACHED(); | 2071 ASSERT_NOT_REACHED(); |
| 2062 return m_needsCompositedScrolling; | 2072 return value; |
| 2073 } | |
| 2074 | |
| 2075 bool RenderLayer::needsCompositedScrolling() const | |
| 2076 { | |
| 2077 return adjustForForceCompositedScrollingMode(m_needsCompositedScrolling); | |
| 2078 } | |
| 2079 | |
| 2080 bool RenderLayer::needsToBeStackingContainer() const | |
| 2081 { | |
| 2082 return adjustForForceCompositedScrollingMode(m_needsToBeStackingContainer); | |
| 2063 } | 2083 } |
| 2064 | 2084 |
| 2065 bool RenderLayer::hasScrollParent() const | 2085 bool RenderLayer::hasScrollParent() const |
| 2066 { | 2086 { |
| 2067 if (!compositorDrivenAcceleratedScrollingEnabled()) | 2087 if (!useCompositorDrivenAcceleratedScrolling()) |
| 2068 return false; | 2088 return false; |
| 2069 | 2089 |
| 2070 // A layer scrolls with its containing block. So to find the overflow scroll ing layer | 2090 // A layer scrolls with its containing block. So to find the overflow scroll ing layer |
| 2071 // that we scroll with respect to, we must ascend the layer tree until we re ach the | 2091 // that we scroll with respect to, we must ascend the layer tree until we re ach the |
| 2072 // first overflow scrolling div at or above our containing block. I will ref er to this | 2092 // first overflow scrolling div at or above our containing block. I will ref er to this |
| 2073 // layer as our 'scrolling ancestor'. | 2093 // layer as our 'scrolling ancestor'. |
| 2074 // | 2094 // |
| 2075 // Now, if we reside in a normal flow list, then we will naturally scroll wi th our scrolling | 2095 // Now, if we reside in a normal flow list, then we will naturally scroll wi th our scrolling |
| 2076 // ancestor, and we need not be composited. If, on the other hand, we reside in a z-order | 2096 // ancestor, and we need not be composited. If, on the other hand, we reside in a z-order |
| 2077 // list, and on our walk upwards to our scrolling ancestor we find no layer that is a stacking | 2097 // list, and on our walk upwards to our scrolling ancestor we find no layer that is a stacking |
| 2078 // context, then we know that in the stacking tree, we will not be in the su btree rooted at | 2098 // context, then we know that in the stacking tree, we will not be in the su btree rooted at |
| 2079 // our scrolling ancestor, and we will therefore not scroll with it. In this case, we must | 2099 // our scrolling ancestor, and we will therefore not scroll with it. In this case, we must |
| 2080 // be a composited layer since the compositor will need to take special meas ures to ensure | 2100 // be a composited layer since the compositor will need to take special meas ures to ensure |
| 2081 // that we scroll with our scrolling ancestor and it cannot do this if we do not promote. | 2101 // that we scroll with our scrolling ancestor and it cannot do this if we do not promote. |
| 2082 RenderLayer* scrollParent = ancestorScrollingLayer(); | 2102 RenderLayer* scrollParent = ancestorScrollingLayer(); |
| 2083 | 2103 |
| 2084 if (!scrollParent || scrollParent->isStackingContext()) | 2104 if (!scrollParent || scrollParent->isStackingContext()) |
|
Ian Vollick
2013/09/06 02:01:05
Could this be changed to (scrollParent->needsToBeS
hartmanng
2013/09/06 20:18:36
That would exclude stacking contexts, are you sure
| |
| 2085 return false; | 2105 return false; |
| 2086 | 2106 |
| 2087 // If we hit a stacking context on our way up to the ancestor scrolling laye r, it will already | 2107 // If we hit a stacking context on our way up to the ancestor scrolling laye r, it will already |
| 2088 // be composited due to an overflow scrolling parent, so we don't need to. | 2108 // be composited due to an overflow scrolling parent, so we don't need to. |
| 2089 for (RenderLayer* ancestor = parent(); ancestor && ancestor != scrollParent; ancestor = ancestor->parent()) { | 2109 for (RenderLayer* ancestor = parent(); ancestor && ancestor != scrollParent; ancestor = ancestor->parent()) { |
| 2090 if (ancestor->isStackingContext()) | 2110 if (ancestor->isStackingContext()) |
|
Ian Vollick
2013/09/06 02:01:05
Should this be ancestor->stackingContainer()?
hartmanng
2013/09/06 20:18:36
yeah, I think so. Done.
| |
| 2091 return false; | 2111 return false; |
| 2092 } | 2112 } |
| 2093 | 2113 |
| 2094 return true; | 2114 return true; |
| 2095 } | 2115 } |
| 2096 | 2116 |
| 2097 void RenderLayer::updateNeedsCompositedScrolling() | 2117 void RenderLayer::updateNeedsCompositedScrolling() |
| 2098 { | 2118 { |
| 2099 TRACE_EVENT0("comp-scroll", "RenderLayer::updateNeedsCompositedScrolling"); | 2119 TRACE_EVENT0("comp-scroll", "RenderLayer::updateNeedsCompositedScrolling"); |
| 2100 | 2120 |
| 2101 updateCanBeStackingContainer(); | 2121 updateCanBeStackingContainer(); |
| 2102 updateDescendantDependentFlags(); | 2122 updateDescendantDependentFlags(); |
| 2103 | 2123 |
| 2104 ASSERT(renderer()->view()->frameView() && renderer()->view()->frameView()->c ontainsScrollableArea(scrollableArea())); | 2124 ASSERT(renderer()->view()->frameView() && renderer()->view()->frameView()->c ontainsScrollableArea(scrollableArea())); |
| 2105 bool needsCompositedScrolling = acceleratedCompositingForOverflowScrollEnabl ed() | 2125 const bool needsToBeStackingContainer = acceleratedCompositingForOverflowScr ollEnabled() |
| 2106 && canBeStackingContainer() | 2126 && canBeStackingContainer() |
| 2107 && !hasUnclippedDescendant(); | 2127 && !hasUnclippedDescendant(); |
| 2108 | 2128 |
| 2129 const bool needsToBeStackingContainerDidChange = setNeedsToBeStackingContain er(needsToBeStackingContainer); | |
| 2130 | |
| 2131 const bool needsCompositedScrolling = needsToBeStackingContainer | |
| 2132 || compositorDrivenAcceleratedScrollingEnabled(); | |
| 2133 | |
| 2109 // We gather a boolean value for use with Google UMA histograms to | 2134 // We gather a boolean value for use with Google UMA histograms to |
| 2110 // quantify the actual effects of a set of patches attempting to | 2135 // quantify the actual effects of a set of patches attempting to |
| 2111 // relax composited scrolling requirements, thereby increasing the | 2136 // relax composited scrolling requirements, thereby increasing the |
| 2112 // number of composited overflow divs. | 2137 // number of composited overflow divs. |
| 2113 if (acceleratedCompositingForOverflowScrollEnabled()) | 2138 if (acceleratedCompositingForOverflowScrollEnabled()) |
| 2114 HistogramSupport::histogramEnumeration("Renderer.NeedsCompositedScrollin g", needsCompositedScrolling, 2); | 2139 HistogramSupport::histogramEnumeration("Renderer.NeedsCompositedScrollin g", needsCompositedScrolling, 2); |
| 2115 | 2140 |
| 2116 setNeedsCompositedScrolling(needsCompositedScrolling); | 2141 const bool needsCompositedScrollingDidChange = setNeedsCompositedScrolling(n eedsCompositedScrolling); |
| 2142 | |
| 2143 if (needsToBeStackingContainerDidChange || needsCompositedScrollingDidChange ) { | |
| 2144 // Note, the z-order lists may need to be rebuilt, but our code guarante es | |
| 2145 // that we have not affected stacking, so we will not dirty | |
| 2146 // m_canBePromotedToStackingContainer for either us or our stacking cont ext | |
| 2147 // or container. | |
| 2148 didUpdateNeedsCompositedScrolling(); | |
| 2149 } | |
| 2117 } | 2150 } |
| 2118 | 2151 |
| 2119 enum CompositedScrollingHistogramBuckets { | 2152 enum CompositedScrollingHistogramBuckets { |
| 2120 IsScrollableAreaBucket = 0, | 2153 IsScrollableAreaBucket = 0, |
| 2121 NeedsToBeStackingContainerBucket = 1, | 2154 NeedsToBeStackingContainerBucket = 1, |
| 2122 WillUseCompositedScrollingBucket = 2, | 2155 WillUseCompositedScrollingBucket = 2, |
| 2123 CompositedScrollingHistogramMax = 3 | 2156 CompositedScrollingHistogramMax = 3 |
| 2124 }; | 2157 }; |
| 2125 | 2158 |
| 2126 void RenderLayer::setNeedsCompositedScrolling(bool needsCompositedScrolling) | 2159 bool RenderLayer::setNeedsCompositedScrolling(bool needsCompositedScrolling) |
| 2127 { | 2160 { |
| 2128 if (m_needsCompositedScrolling == needsCompositedScrolling) | 2161 if (m_needsCompositedScrolling == needsCompositedScrolling) |
| 2129 return; | 2162 return false; |
| 2130 | |
| 2131 // Count the total number of RenderLayers which need to be stacking | |
| 2132 // containers some point. This should be recorded at most once per | |
| 2133 // RenderLayer, so we check m_needsCompositedScrollingHasBeenRecorded. | |
| 2134 if (acceleratedCompositingForOverflowScrollEnabled() && !m_needsCompositedSc rollingHasBeenRecorded) { | |
| 2135 HistogramSupport::histogramEnumeration("Renderer.CompositedScrolling", N eedsToBeStackingContainerBucket, CompositedScrollingHistogramMax); | |
| 2136 m_needsCompositedScrollingHasBeenRecorded = true; | |
| 2137 } | |
| 2138 | 2163 |
| 2139 // Count the total number of RenderLayers which need composited scrolling at | 2164 // Count the total number of RenderLayers which need composited scrolling at |
| 2140 // some point. This should be recorded at most once per RenderLayer, so we | 2165 // some point. This should be recorded at most once per RenderLayer, so we |
| 2141 // check m_willUseCompositedScrollingHasBeenRecorded. | 2166 // check m_willUseCompositedScrollingHasBeenRecorded. |
| 2142 // | |
| 2143 // FIXME: Currently, this computes the exact same value as the above. | |
| 2144 // However, it will soon be expanded to cover more than just stacking | |
| 2145 // containers (see crbug.com/249354). When this happens, we should see a | |
| 2146 // spike in "WillUseCompositedScrolling", while "NeedsToBeStackingContainer" | |
| 2147 // will remain relatively static. | |
| 2148 if (acceleratedCompositingForOverflowScrollEnabled() && !m_willUseComposited ScrollingHasBeenRecorded) { | 2167 if (acceleratedCompositingForOverflowScrollEnabled() && !m_willUseComposited ScrollingHasBeenRecorded) { |
| 2149 HistogramSupport::histogramEnumeration("Renderer.CompositedScrolling", W illUseCompositedScrollingBucket, CompositedScrollingHistogramMax); | 2168 HistogramSupport::histogramEnumeration("Renderer.CompositedScrolling", W illUseCompositedScrollingBucket, CompositedScrollingHistogramMax); |
| 2150 m_willUseCompositedScrollingHasBeenRecorded = true; | 2169 m_willUseCompositedScrollingHasBeenRecorded = true; |
| 2151 } | 2170 } |
| 2152 | 2171 |
| 2153 m_needsCompositedScrolling = needsCompositedScrolling; | 2172 m_needsCompositedScrolling = needsCompositedScrolling; |
| 2154 | 2173 |
| 2155 // Note, the z-order lists may need to be rebuilt, but our code guarantees | 2174 return true; |
| 2156 // that we have not affected stacking, so we will not dirty | 2175 } |
| 2157 // m_canBePromotedToStackingContainer for either us or our stacking context | 2176 |
| 2158 // or container. | 2177 bool RenderLayer::setNeedsToBeStackingContainer(bool needsToBeStackingContainer) |
| 2159 didUpdateNeedsCompositedScrolling(); | 2178 { |
| 2179 if (m_needsToBeStackingContainer == needsToBeStackingContainer) | |
| 2180 return false; | |
| 2181 | |
| 2182 // Count the total number of RenderLayers which need to be stacking | |
| 2183 // containers some point. This should be recorded at most once per | |
| 2184 // RenderLayer, so we check m_needsToBeStackingContainerHasBeenRecorded. | |
| 2185 if (acceleratedCompositingForOverflowScrollEnabled() && !m_needsToBeStacking ContainerHasBeenRecorded) { | |
| 2186 HistogramSupport::histogramEnumeration("Renderer.CompositedScrolling", N eedsToBeStackingContainerBucket, CompositedScrollingHistogramMax); | |
| 2187 m_needsToBeStackingContainerHasBeenRecorded = true; | |
| 2188 } | |
| 2189 | |
| 2190 m_needsToBeStackingContainer = needsToBeStackingContainer; | |
| 2191 | |
| 2192 return true; | |
| 2160 } | 2193 } |
| 2161 | 2194 |
| 2162 void RenderLayer::setForceNeedsCompositedScrolling(RenderLayer::ForceNeedsCompos itedScrollingMode mode) | 2195 void RenderLayer::setForceNeedsCompositedScrolling(RenderLayer::ForceNeedsCompos itedScrollingMode mode) |
| 2163 { | 2196 { |
| 2164 if (m_forceNeedsCompositedScrolling == mode) | 2197 if (m_forceNeedsCompositedScrolling == mode) |
| 2165 return; | 2198 return; |
| 2166 | 2199 |
| 2167 m_forceNeedsCompositedScrolling = mode; | 2200 m_forceNeedsCompositedScrolling = mode; |
| 2168 didUpdateNeedsCompositedScrolling(); | 2201 didUpdateNeedsCompositedScrolling(); |
| 2169 } | 2202 } |
| (...skipping 4247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6417 } | 6450 } |
| 6418 } | 6451 } |
| 6419 | 6452 |
| 6420 void showLayerTree(const WebCore::RenderObject* renderer) | 6453 void showLayerTree(const WebCore::RenderObject* renderer) |
| 6421 { | 6454 { |
| 6422 if (!renderer) | 6455 if (!renderer) |
| 6423 return; | 6456 return; |
| 6424 showLayerTree(renderer->enclosingLayer()); | 6457 showLayerTree(renderer->enclosingLayer()); |
| 6425 } | 6458 } |
| 6426 #endif | 6459 #endif |
| OLD | NEW |