Diff
Copied: branches/chromium/1364/LayoutTests/compositing/layer-creation/fixed-position-in-view-dynamic-expected.txt (from rev 139461, trunk/LayoutTests/compositing/layer-creation/fixed-position-in-view-dynamic-expected.txt) (0 => 139984)
--- branches/chromium/1364/LayoutTests/compositing/layer-creation/fixed-position-in-view-dynamic-expected.txt (rev 0)
+++ branches/chromium/1364/LayoutTests/compositing/layer-creation/fixed-position-in-view-dynamic-expected.txt 2013-01-17 17:27:34 UTC (rev 139984)
@@ -0,0 +1,2 @@
+PASS
+
Copied: branches/chromium/1364/LayoutTests/compositing/layer-creation/fixed-position-in-view-dynamic.html (from rev 139461, trunk/LayoutTests/compositing/layer-creation/fixed-position-in-view-dynamic.html) (0 => 139984)
--- branches/chromium/1364/LayoutTests/compositing/layer-creation/fixed-position-in-view-dynamic.html (rev 0)
+++ branches/chromium/1364/LayoutTests/compositing/layer-creation/fixed-position-in-view-dynamic.html 2013-01-17 17:27:34 UTC (rev 139984)
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+ <style>
+ .fixed {
+ position: fixed;
+ width: 10px;
+ height: 10px;
+ top: 100px;
+ }
+ </style>
+
+ <script type="text/_javascript_">
+ if (window.testRunner && window.internals) {
+ testRunner.dumpAsText();
+ internals.settings.setAcceleratedCompositingForFixedPositionEnabled(true);
+ internals.settings.setFixedPositionCreatesStackingContext(true);
+
+ addEventListener("load", function() {
+ var fixed = document.createElement("div");
+ document.body.appendChild(fixed);
+ document.body.offsetHeight;
+ fixed.className = "fixed";
+ var mainThreadScrollingReasons = internals.mainThreadScrollingReasons(document);
+ document.getElementById("result").innerText = !mainThreadScrollingReasons ? "PASS" : "FAIL: " + mainThreadScrollingReasons;
+ }, false);
+ }
+ </script>
+</head>
+
+<body>
+ <pre id="result"></pre>
+</body>
+</html>
+
Copied: branches/chromium/1364/LayoutTests/compositing/layer-creation/fixed-position-out-of-view-dynamic-expected.txt (from rev 139461, trunk/LayoutTests/compositing/layer-creation/fixed-position-out-of-view-dynamic-expected.txt) (0 => 139984)
--- branches/chromium/1364/LayoutTests/compositing/layer-creation/fixed-position-out-of-view-dynamic-expected.txt (rev 0)
+++ branches/chromium/1364/LayoutTests/compositing/layer-creation/fixed-position-out-of-view-dynamic-expected.txt 2013-01-17 17:27:34 UTC (rev 139984)
@@ -0,0 +1,2 @@
+PASS
+
Copied: branches/chromium/1364/LayoutTests/compositing/layer-creation/fixed-position-out-of-view-dynamic.html (from rev 139461, trunk/LayoutTests/compositing/layer-creation/fixed-position-out-of-view-dynamic.html) (0 => 139984)
--- branches/chromium/1364/LayoutTests/compositing/layer-creation/fixed-position-out-of-view-dynamic.html (rev 0)
+++ branches/chromium/1364/LayoutTests/compositing/layer-creation/fixed-position-out-of-view-dynamic.html 2013-01-17 17:27:34 UTC (rev 139984)
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+ <style>
+ .fixed {
+ position: fixed;
+ width: 10px;
+ height: 10px;
+ top: -100px;
+ }
+ </style>
+
+ <script type="text/_javascript_">
+ if (window.testRunner && window.internals) {
+ testRunner.dumpAsText();
+ internals.settings.setAcceleratedCompositingForFixedPositionEnabled(true);
+ internals.settings.setFixedPositionCreatesStackingContext(true);
+
+ addEventListener("load", function() {
+ var fixed = document.createElement("div");
+ document.body.appendChild(fixed);
+ document.body.offsetHeight;
+ fixed.className = "fixed";
+ var mainThreadScrollingReasons = internals.mainThreadScrollingReasons(document);
+ document.getElementById("result").innerText = !mainThreadScrollingReasons ? "PASS" : "FAIL: " + mainThreadScrollingReasons;
+ testRunner.notifyDone();
+ }, false);
+ }
+ </script>
+</head>
+
+<body>
+ <pre id="result"></pre>
+</body>
+</html>
+
Modified: branches/chromium/1364/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp (139983 => 139984)
--- branches/chromium/1364/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp 2013-01-17 16:38:23 UTC (rev 139983)
+++ branches/chromium/1364/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp 2013-01-17 17:27:34 UTC (rev 139984)
@@ -395,7 +395,7 @@
}
#endif
-bool ScrollingCoordinator::hasVisibleSlowRepaintFixedObjects(FrameView* frameView) const
+bool ScrollingCoordinator::hasVisibleSlowRepaintViewportConstrainedObjects(FrameView* frameView) const
{
const FrameView::ViewportConstrainedObjectSet* viewportConstrainedObjects = frameView->viewportConstrainedObjects();
if (!viewportConstrainedObjects)
@@ -408,7 +408,7 @@
return true;
RenderLayer* layer = toRenderBoxModelObject(viewportConstrainedObject)->layer();
// Any explicit reason that a fixed position element is not composited shouldn't cause slow scrolling.
- if (!layer->isComposited() && layer->compositor()->fixedPositionLayerNotCompositedReason(layer) == RenderLayerCompositor::NoReason)
+ if (!layer->isComposited() && layer->viewportConstrainedNotCompositedReason() == RenderLayer::NoNotCompositedReason)
return true;
}
return false;
@@ -429,8 +429,8 @@
mainThreadScrollingReasons |= HasSlowRepaintObjects;
if (!supportsFixedPositionLayers() && frameView->hasViewportConstrainedObjects())
mainThreadScrollingReasons |= HasViewportConstrainedObjectsWithoutSupportingFixedLayers;
- if (supportsFixedPositionLayers() && hasVisibleSlowRepaintFixedObjects(frameView))
- mainThreadScrollingReasons |= HasNonLayerFixedObjects;
+ if (supportsFixedPositionLayers() && hasVisibleSlowRepaintViewportConstrainedObjects(frameView))
+ mainThreadScrollingReasons |= HasNonLayerViewportConstrainedObjects;
if (m_page->mainFrame()->document()->isImageDocument())
mainThreadScrollingReasons |= IsImageDocument;
@@ -472,8 +472,8 @@
stringBuilder.append("Has slow repaint objects, ");
if (reasons & ScrollingCoordinator::HasViewportConstrainedObjectsWithoutSupportingFixedLayers)
stringBuilder.append("Has viewport constrained objects without supporting fixed layers, ");
- if (reasons & ScrollingCoordinator::HasNonLayerFixedObjects)
- stringBuilder.append("Has non-layer fixed objects, ");
+ if (reasons & ScrollingCoordinator::HasNonLayerViewportConstrainedObjects)
+ stringBuilder.append("Has non-layer viewport-constrained objects, ");
if (reasons & ScrollingCoordinator::IsImageDocument)
stringBuilder.append("Is image document, ");
Modified: branches/chromium/1364/Source/WebCore/page/scrolling/ScrollingCoordinator.h (139983 => 139984)
--- branches/chromium/1364/Source/WebCore/page/scrolling/ScrollingCoordinator.h 2013-01-17 16:38:23 UTC (rev 139983)
+++ branches/chromium/1364/Source/WebCore/page/scrolling/ScrollingCoordinator.h 2013-01-17 17:27:34 UTC (rev 139984)
@@ -137,7 +137,7 @@
ForcedOnMainThread = 1 << 0,
HasSlowRepaintObjects = 1 << 1,
HasViewportConstrainedObjectsWithoutSupportingFixedLayers = 1 << 2,
- HasNonLayerFixedObjects = 1 << 3,
+ HasNonLayerViewportConstrainedObjects = 1 << 3,
IsImageDocument = 1 << 4
};
@@ -174,7 +174,7 @@
virtual void recomputeWheelEventHandlerCountForFrameView(FrameView*) { }
virtual void setShouldUpdateScrollLayerPositionOnMainThread(MainThreadScrollingReasons) { }
- virtual bool hasVisibleSlowRepaintFixedObjects(FrameView*) const;
+ virtual bool hasVisibleSlowRepaintViewportConstrainedObjects(FrameView*) const;
void updateShouldUpdateScrollLayerPositionOnMainThread();
void updateMainFrameScrollPositionTimerFired(Timer<ScrollingCoordinator>*);
Modified: branches/chromium/1364/Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.h (139983 => 139984)
--- branches/chromium/1364/Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.h 2013-01-17 16:38:23 UTC (rev 139983)
+++ branches/chromium/1364/Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.h 2013-01-17 17:27:34 UTC (rev 139984)
@@ -89,7 +89,7 @@
virtual void recomputeWheelEventHandlerCountForFrameView(FrameView*);
virtual void setShouldUpdateScrollLayerPositionOnMainThread(MainThreadScrollingReasons);
- virtual bool hasVisibleSlowRepaintFixedObjects(FrameView*) const { return false; }
+ virtual bool hasVisibleSlowRepaintViewportConstrainedObjects(FrameView*) const { return false; }
void ensureRootStateNodeForFrameView(FrameView*);
ScrollingStateNode* stateNodeForID(ScrollingNodeID);
Modified: branches/chromium/1364/Source/WebCore/page/scrolling/mac/ScrollingTreeScrollingNodeMac.mm (139983 => 139984)
--- branches/chromium/1364/Source/WebCore/page/scrolling/mac/ScrollingTreeScrollingNodeMac.mm 2013-01-17 16:38:23 UTC (rev 139983)
+++ branches/chromium/1364/Source/WebCore/page/scrolling/mac/ScrollingTreeScrollingNodeMac.mm 2013-01-17 17:27:34 UTC (rev 139984)
@@ -366,7 +366,7 @@
reasonsDescription.append("slow-repaint objects,");
if (mainThreadScrollingReasons & ScrollingCoordinator::HasViewportConstrainedObjectsWithoutSupportingFixedLayers)
reasonsDescription.append("viewport-constrained objects,");
- if (mainThreadScrollingReasons & ScrollingCoordinator::HasNonLayerFixedObjects)
+ if (mainThreadScrollingReasons & ScrollingCoordinator::HasNonLayerViewportConstrainedObjects)
reasonsDescription.append("non-layer viewport-constrained objects,");
if (mainThreadScrollingReasons & ScrollingCoordinator::IsImageDocument)
reasonsDescription.append("image document,");
Modified: branches/chromium/1364/Source/WebCore/rendering/RenderLayer.cpp (139983 => 139984)
--- branches/chromium/1364/Source/WebCore/rendering/RenderLayer.cpp 2013-01-17 16:38:23 UTC (rev 139983)
+++ branches/chromium/1364/Source/WebCore/rendering/RenderLayer.cpp 2013-01-17 17:27:34 UTC (rev 139984)
@@ -166,6 +166,7 @@
#if USE(ACCELERATED_COMPOSITING)
, m_hasCompositingDescendant(false)
, m_indirectCompositingReason(NoIndirectCompositingReason)
+ , m_viewportConstrainedNotCompositedReason(NoNotCompositedReason)
#endif
, m_containsDirtyOverlayScrollbars(false)
, m_updatingMarqueePosition(false)
@@ -3397,8 +3398,8 @@
// If this RenderLayer should paint into its backing, that will be done via RenderLayerBacking::paintIntoLayer().
return;
}
- } else if (compositor()->fixedPositionLayerNotCompositedReason(this) == RenderLayerCompositor::LayerBoundsOutOfView) {
- // Don't paint out-of-view fixed position layers (when doing prepainting) because they will never be visible
+ } else if (viewportConstrainedNotCompositedReason() == NotCompositedForBoundsOutOfView) {
+ // Don't paint out-of-view viewport constrained layers (when doing prepainting) because they will never be visible
// unless their position or viewport size is changed.
return;
}
Modified: branches/chromium/1364/Source/WebCore/rendering/RenderLayer.h (139983 => 139984)
--- branches/chromium/1364/Source/WebCore/rendering/RenderLayer.h 2013-01-17 16:38:23 UTC (rev 139983)
+++ branches/chromium/1364/Source/WebCore/rendering/RenderLayer.h 2013-01-17 17:27:34 UTC (rev 139984)
@@ -726,6 +726,17 @@
virtual void reportMemoryUsage(MemoryObjectInfo*) const OVERRIDE;
+#if USE(ACCELERATED_COMPOSITING)
+ enum ViewportConstrainedNotCompositedReason {
+ NoNotCompositedReason,
+ NotCompositedForBoundsOutOfView,
+ NotCompositedForNonViewContainer,
+ };
+
+ void setViewportConstrainedNotCompositedReason(ViewportConstrainedNotCompositedReason reason) { m_viewportConstrainedNotCompositedReason = reason; }
+ ViewportConstrainedNotCompositedReason viewportConstrainedNotCompositedReason() const { return static_cast<ViewportConstrainedNotCompositedReason>(m_viewportConstrainedNotCompositedReason); }
+#endif
+
private:
void updateZOrderLists();
void rebuildZOrderLists();
@@ -1035,6 +1046,7 @@
#if USE(ACCELERATED_COMPOSITING)
bool m_hasCompositingDescendant : 1; // In the z-order tree.
unsigned m_indirectCompositingReason : 3;
+ unsigned m_viewportConstrainedNotCompositedReason : 2;
#endif
bool m_containsDirtyOverlayScrollbars : 1;
Modified: branches/chromium/1364/Source/WebCore/rendering/RenderLayerCompositor.cpp (139983 => 139984)
--- branches/chromium/1364/Source/WebCore/rendering/RenderLayerCompositor.cpp 2013-01-17 16:38:23 UTC (rev 139983)
+++ branches/chromium/1364/Source/WebCore/rendering/RenderLayerCompositor.cpp 2013-01-17 17:27:34 UTC (rev 139984)
@@ -454,7 +454,6 @@
CompositingState compState(updateRoot, m_compositingConsultsOverlap);
bool layersChanged = false;
bool saw3DTransform = false;
- m_fixedPositionLayerNotCompositedReasonMap.clear();
if (m_compositingConsultsOverlap) {
OverlapMap overlapTestRequestMap;
computeCompositingRequirements(0, updateRoot, &overlapTestRequestMap, compState, layersChanged, saw3DTransform);
@@ -550,8 +549,9 @@
bool RenderLayerCompositor::updateBacking(RenderLayer* layer, CompositingChangeRepaint shouldRepaint)
{
bool layerChanged = false;
+ RenderLayer::ViewportConstrainedNotCompositedReason viewportConstrainedNotCompositedReason = RenderLayer::NoNotCompositedReason;
- if (needsToBeComposited(layer)) {
+ if (needsToBeComposited(layer, &viewportConstrainedNotCompositedReason)) {
enableCompositingMode();
if (!layer->backing()) {
@@ -623,10 +623,17 @@
if (layerChanged)
layer->clearClipRectsIncludingDescendants(PaintingClipRects);
- // If a fixed position layer gained/lost a backing, the scrolling coordinator needs to recalculate whether it can do fast scrolling.
- if (layerChanged && layer->renderer()->style()->position() == FixedPosition) {
- if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
- scrollingCoordinator->frameViewFixedObjectsDidChange(m_renderView->frameView());
+ // If a fixed position layer gained/lost a backing or the reason not compositing it changed,
+ // the scrolling coordinator needs to recalculate whether it can do fast scrolling.
+ if (layer->renderer()->style()->position() == FixedPosition) {
+ if (layer->viewportConstrainedNotCompositedReason() != viewportConstrainedNotCompositedReason) {
+ layer->setViewportConstrainedNotCompositedReason(viewportConstrainedNotCompositedReason);
+ layerChanged = true;
+ }
+ if (layerChanged) {
+ if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
+ scrollingCoordinator->frameViewFixedObjectsDidChange(m_renderView->frameView());
+ }
}
if (layer->backing())
@@ -845,8 +852,7 @@
CompositingState childState(compositingState);
childState.m_subtreeIsCompositing = false;
- FixedPositionLayerNotCompositedReason fixedPositionLayerNotCompositedReason = NoReason;
- bool willBeComposited = needsToBeComposited(layer, &fixedPositionLayerNotCompositedReason);
+ bool willBeComposited = needsToBeComposited(layer);
if (willBeComposited) {
// Tell the parent it has compositing descendants.
compositingState.m_subtreeIsCompositing = true;
@@ -855,8 +861,7 @@
if (overlapMap)
overlapMap->pushCompositingContainer();
- } else if (fixedPositionLayerNotCompositedReason != NoReason)
- m_fixedPositionLayerNotCompositedReasonMap.set(layer, fixedPositionLayerNotCompositedReason);
+ }
#if !ASSERT_DISABLED
LayerListMutationDetector mutationChecker(layer);
@@ -1564,18 +1569,18 @@
return false;
}
-bool RenderLayerCompositor::needsToBeComposited(const RenderLayer* layer, FixedPositionLayerNotCompositedReason* fixedPositionLayerNotCompositedReason) const
+bool RenderLayerCompositor::needsToBeComposited(const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReason* viewportConstrainedNotCompositedReason) const
{
if (!canBeComposited(layer))
return false;
- return requiresCompositingLayer(layer, fixedPositionLayerNotCompositedReason) || layer->mustCompositeForIndirectReasons() || (inCompositingMode() && layer->isRootLayer());
+ return requiresCompositingLayer(layer, viewportConstrainedNotCompositedReason) || layer->mustCompositeForIndirectReasons() || (inCompositingMode() && layer->isRootLayer());
}
// Note: this specifies whether the RL needs a compositing layer for intrinsic reasons.
// Use needsToBeComposited() to determine if a RL actually needs a compositing layer.
// static
-bool RenderLayerCompositor::requiresCompositingLayer(const RenderLayer* layer, FixedPositionLayerNotCompositedReason* fixedPositionLayerNotCompositedReason) const
+bool RenderLayerCompositor::requiresCompositingLayer(const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReason* viewportConstrainedNotCompositedReason) const
{
RenderObject* renderer = layer->renderer();
// The compositing state of a reflection should match that of its reflected layer.
@@ -1593,7 +1598,7 @@
|| clipsCompositingDescendants(layer)
|| requiresCompositingForAnimation(renderer)
|| requiresCompositingForFilters(renderer)
- || requiresCompositingForPosition(renderer, layer, fixedPositionLayerNotCompositedReason)
+ || requiresCompositingForPosition(renderer, layer, viewportConstrainedNotCompositedReason)
|| requiresCompositingForOverflowScrolling(layer)
|| requiresCompositingForBlending(renderer);
}
@@ -1681,7 +1686,7 @@
return "filters";
if (requiresCompositingForPosition(renderer, layer))
- return "position: fixed";
+ return renderer->style()->position() == FixedPosition ? "position: fixed" : "position: sticky";
if (requiresCompositingForOverflowScrolling(layer))
return "-webkit-overflow-scrolling: touch";
@@ -1971,7 +1976,7 @@
#endif
}
-bool RenderLayerCompositor::requiresCompositingForPosition(RenderObject* renderer, const RenderLayer* layer, FixedPositionLayerNotCompositedReason* fixedPositionLayerNotCompositedReason) const
+bool RenderLayerCompositor::requiresCompositingForPosition(RenderObject* renderer, const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReason* viewportConstrainedNotCompositedReason) const
{
// position:fixed elements that create their own stacking context (e.g. have an explicit z-index,
// opacity, transform) can get their own composited layer. A stacking context is required otherwise
@@ -1990,11 +1995,11 @@
return false;
}
- // Don't promote fixed position elements that are descendants of transformed elements.
- // They will stay fixed wrt the transformed element rather than the enclosing frame.
+ // Don't promote fixed position elements that are descendants of a non-view container, e.g. transformed elements.
+ // They will stay fixed wrt the container rather than the enclosing frame.
if (container != m_renderView) {
- if (fixedPositionLayerNotCompositedReason)
- *fixedPositionLayerNotCompositedReason = DescendantOfTransformedElement;
+ if (viewportConstrainedNotCompositedReason)
+ *viewportConstrainedNotCompositedReason = RenderLayer::NotCompositedForNonViewContainer;
return false;
}
@@ -2005,8 +2010,8 @@
| RenderLayer::ExcludeHiddenDescendants | RenderLayer::DontConstrainForMask | RenderLayer::IncludeCompositedDescendants);
layerBounds.scale(frameView->frame()->frameScaleFactor());
if (!viewBounds.intersects(enclosingIntRect(layerBounds))) {
- if (fixedPositionLayerNotCompositedReason)
- *fixedPositionLayerNotCompositedReason = LayerBoundsOutOfView;
+ if (viewportConstrainedNotCompositedReason)
+ *viewportConstrainedNotCompositedReason = RenderLayer::NotCompositedForBoundsOutOfView;
return false;
}
}
Modified: branches/chromium/1364/Source/WebCore/rendering/RenderLayerCompositor.h (139983 => 139984)
--- branches/chromium/1364/Source/WebCore/rendering/RenderLayerCompositor.h 2013-01-17 16:38:23 UTC (rev 139983)
+++ branches/chromium/1364/Source/WebCore/rendering/RenderLayerCompositor.h 2013-01-17 17:27:34 UTC (rev 139984)
@@ -229,14 +229,6 @@
void reportMemoryUsage(MemoryObjectInfo*) const;
void setShouldReevaluateCompositingAfterLayout() { m_reevaluateCompositingAfterLayout = true; }
- enum FixedPositionLayerNotCompositedReason {
- NoReason,
- LayerBoundsOutOfView,
- DescendantOfTransformedElement,
- };
-
- FixedPositionLayerNotCompositedReason fixedPositionLayerNotCompositedReason(const RenderLayer* layer) const { return m_fixedPositionLayerNotCompositedReasonMap.get(layer); }
-
private:
class OverlapMap;
@@ -251,9 +243,9 @@
virtual void flushLayers(GraphicsLayerUpdater*) OVERRIDE;
// Whether the given RL needs a compositing layer.
- bool needsToBeComposited(const RenderLayer*, FixedPositionLayerNotCompositedReason* = 0) const;
+ bool needsToBeComposited(const RenderLayer*, RenderLayer::ViewportConstrainedNotCompositedReason* = 0) const;
// Whether the layer has an intrinsic need for compositing layer.
- bool requiresCompositingLayer(const RenderLayer*, FixedPositionLayerNotCompositedReason* = 0) const;
+ bool requiresCompositingLayer(const RenderLayer*, RenderLayer::ViewportConstrainedNotCompositedReason* = 0) const;
// Whether the layer could ever be composited.
bool canBeComposited(const RenderLayer*) const;
@@ -318,7 +310,7 @@
bool requiresCompositingForFilters(RenderObject*) const;
bool requiresCompositingForBlending(RenderObject* renderer) const;
bool requiresCompositingForScrollableFrame() const;
- bool requiresCompositingForPosition(RenderObject*, const RenderLayer*, FixedPositionLayerNotCompositedReason* = 0) const;
+ bool requiresCompositingForPosition(RenderObject*, const RenderLayer*, RenderLayer::ViewportConstrainedNotCompositedReason* = 0) const;
bool requiresCompositingForOverflowScrolling(const RenderLayer*) const;
bool requiresCompositingForIndirectReason(RenderObject*, bool hasCompositedDescendants, bool has3DTransformedDescendants, RenderLayer::IndirectCompositingReason&) const;
@@ -399,9 +391,6 @@
double m_obligatoryBackingStoreBytes;
double m_secondaryBackingStoreBytes;
#endif
-
- typedef HashMap<const RenderLayer*, FixedPositionLayerNotCompositedReason> FixedPositionLayerNotCompositedReasonMap;
- FixedPositionLayerNotCompositedReasonMap m_fixedPositionLayerNotCompositedReasonMap;
};