Source/WebCore/ChangeLog

 12012-05-07 Julien Chaffraix <jchaffraix@webkit.org>
 2
 3 Move RenderLayers z-index lists dirtying to post style change
 4 https://bugs.webkit.org/show_bug.cgi?id=85437
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 No expected change in behavior.
 9
 10 This change moves the z-order lists to RenderLayer::styleChanged. As part of this
 11 change, also added proper handling of stacking context transition. This enabled
 12 us to tighten more of the dirtyZOrderLists / clearZOrderLists code.
 13
 14 * rendering/RenderBoxModelObject.cpp:
 15 (WebCore::RenderBoxModelObject::styleWillChange):
 16 Removed this code, moved to updateStackingContextsAfterStyleChange.
 17
 18 * rendering/RenderLayer.cpp:
 19 (WebCore::RenderLayer::RenderLayer):
 20 Only stacking contexts start with dirty z-order lists.
 21
 22 (WebCore::RenderLayer::dirtyZOrderLists):
 23 Added an ASSERT.
 24
 25 (WebCore::RenderLayer::updateStackingContextsAfterStyleChange):
 26 Refactored the code to handle the transition between stacking context status.
 27
 28 (WebCore::RenderLayer::styleChanged):
 29 Added a call to updateStackingContextsAfterStyleChange.
 30
 31 * rendering/RenderLayer.h:
 32 (WebCore::RenderLayer::isStackingContext):
 33 Added a call to the next function.
 34
 35 (WebCore::RenderLayer::layerWithStyleIsStackingContext):
 36 Factored the isStackingContext logic here so that we can reuse it inside
 37 updateStackingContextsAfterStyleChange.
 38
 39 (WebCore::RenderLayer::clearZOrderLists):
 40 Added an ASSERT.
 41
1422012-05-07 Raymond Toy <rtoy@google.com>
243
344 ConvolverNode setBuffer() should not ASSERT on null buffer

Source/WebCore/rendering/RenderBoxModelObject.cpp

@@void RenderBoxModelObject::styleWillChange(StyleDifference diff, const RenderSty
411411 repaint();
412412 }
413413 }
414 
415  if (hasLayer()
416  && (oldStyle->hasAutoZIndex() != newStyle->hasAutoZIndex()
417  || oldStyle->zIndex() != newStyle->zIndex()
418  || oldStyle->visibility() != newStyle->visibility())) {
419  layer()->dirtyStackingContextZOrderLists();
420  if (oldStyle->hasAutoZIndex() != newStyle->hasAutoZIndex() || oldStyle->visibility() != newStyle->visibility())
421  layer()->dirtyZOrderLists();
422  }
423414 }
424415
425416 RenderObject::styleWillChange(diff, newStyle);

Source/WebCore/rendering/RenderLayer.cpp

@@void ClipRects::destroy(RenderArena* renderArena)
147147RenderLayer::RenderLayer(RenderBoxModelObject* renderer)
148148 : m_inResizeMode(false)
149149 , m_scrollDimensionsDirty(true)
150  , m_zOrderListsDirty(true)
151150 , m_normalFlowListDirty(true)
152151 , m_usedTransparency(false)
153152 , m_paintingInsideReflection(false)

@@RenderLayer::RenderLayer(RenderBoxModelObject* renderer)
193192 , m_resizer(0)
194193{
195194 m_isNormalFlowOnly = shouldBeNormalFlowOnly();
 195 m_zOrderListsDirty = isStackingContext();
196196
197197 ScrollableArea::setConstrainsScrollingToContentEdge(false);
198198

@@static inline bool compareZIndex(RenderLayer* first, RenderLayer* second)
44624462void RenderLayer::dirtyZOrderLists()
44634463{
44644464 ASSERT(m_layerListMutationAllowed);
4465  // We cannot assume that we are called on a stacking context as it
4466  // is called when we just got demoted from being a stacking context.
 4465 ASSERT(isStackingContext());
44674466
44684467 if (m_posZOrderList)
44694468 m_posZOrderList->clear();

@@bool RenderLayer::isSelfPaintingLayer() const
46794678 || renderer()->isRenderIFrame();
46804679}
46814680
 4681void RenderLayer::updateStackingContextsAfterStyleChange(const RenderStyle* oldStyle)
 4682{
 4683 if (!oldStyle)
 4684 return;
 4685
 4686 bool wasStackingContext = layerWithStyleIsStackingContext(oldStyle);
 4687 bool isStackingContext = this->isStackingContext();
 4688 if (isStackingContext != wasStackingContext) {
 4689 dirtyStackingContextZOrderLists();
 4690 if (isStackingContext)
 4691 dirtyZOrderLists();
 4692 else
 4693 clearZOrderLists();
 4694 }
 4695
 4696 // FIXME: RenderLayer already handles visibility changes through our visiblity dirty bits. This logic could
 4697 // likely be folded along with the rest.
 4698 if (oldStyle->zIndex() != renderer()->style()->zIndex() || oldStyle->visibility() != renderer()->style()->visibility()) {
 4699 dirtyStackingContextZOrderLists();
 4700 if (isStackingContext)
 4701 dirtyZOrderLists();
 4702 }
 4703}
 4704
46824705static bool overflowCanHaveAScrollbar(EOverflow overflow)
46834706{
46844707 return overflow == OAUTO || overflow == OSCROLL || overflow == OOVERLAY;

@@void RenderLayer::styleChanged(StyleDifference, const RenderStyle* oldStyle)
47334756 delete m_marquee;
47344757 m_marquee = 0;
47354758 }
4736 
 4759
 4760 updateStackingContextsAfterStyleChange(oldStyle);
47374761 updateScrollbarsAfterStyleChange(oldStyle);
47384762
47394763 if (!hasReflection() && m_reflection)

Source/WebCore/rendering/RenderLayer.h

@@public:
382382 // Get the enclosing stacking context for this layer. A stacking context is a layer
383383 // that has a non-auto z-index.
384384 RenderLayer* stackingContext() const;
385  bool isStackingContext() const { return !hasAutoZIndex() || renderer()->isRenderView(); }
 385 bool isStackingContext() const { return layerWithStyleIsStackingContext(renderer()->style()); }
386386
387387 void dirtyZOrderLists();
388388 void dirtyStackingContextZOrderLists();

@@public:
443443 void convertToLayerCoords(const RenderLayer* ancestorLayer, LayoutPoint& location) const;
444444 void convertToLayerCoords(const RenderLayer* ancestorLayer, LayoutRect&) const;
445445
446  bool hasAutoZIndex() const { return renderer()->style()->hasAutoZIndex(); }
447446 int zIndex() const { return renderer()->style()->zIndex(); }
448447
449448 enum PaintLayerFlag {

@@private:
618617
619618 void updateNormalFlowList();
620619
 620 bool layerWithStyleIsStackingContext(const RenderStyle* style) const { return !style->hasAutoZIndex() || renderer()->isRenderView(); }
621621 bool isDirtyStackingContext() const { return m_zOrderListsDirty && isStackingContext(); }
622622
623623 void computeRepaintRects(LayoutPoint* offsetFromRoot = 0);

@@private:
629629
630630 bool shouldRepaintAfterLayout() const;
631631
 632 void updateStackingContextsAfterStyleChange(const RenderStyle* oldStyle);
 633
632634 void updateScrollbarsAfterStyleChange(const RenderStyle* oldStyle);
633635 void updateScrollbarsAfterLayout();
634636

@@private:
936938
937939inline void RenderLayer::clearZOrderLists()
938940{
 941 ASSERT(!isStackingContext());
 942
939943 if (m_posZOrderList) {
940944 delete m_posZOrderList;
941945 m_posZOrderList = 0;