Diff
Modified: trunk/Source/WebCore/ChangeLog (204666 => 204667)
--- trunk/Source/WebCore/ChangeLog 2016-08-19 22:55:32 UTC (rev 204666)
+++ trunk/Source/WebCore/ChangeLog 2016-08-19 23:09:14 UTC (rev 204667)
@@ -1,3 +1,29 @@
+2016-08-19 Zalan Bujtas <[email protected]>
+
+ RenderObject::containingBlock() cleanup.
+ https://bugs.webkit.org/show_bug.cgi?id=161013
+
+ Reviewed by Simon Fraser.
+
+ Move ::containingBlockForAbsolutePosition and ::containingBlockForFixedPosition
+ to RenderElement after tightening containingBlock() callsites.
+
+ No change in functionality.
+
+ * dom/Element.cpp:
+ (WebCore::layoutOverflowRectContainsAllDescendants):
+ * rendering/RenderElement.cpp:
+ (WebCore::RenderElement::containingBlockForFixedPosition):
+ (WebCore::RenderElement::containingBlockForAbsolutePosition):
+ * rendering/RenderElement.h:
+ * rendering/RenderInline.cpp:
+ (WebCore::RenderInline::styleWillChange):
+ * rendering/RenderObject.cpp:
+ (WebCore::RenderObject::containingBlock):
+ (WebCore::RenderObject::containingBlockForFixedPosition): Deleted.
+ (WebCore::RenderObject::containingBlockForAbsolutePosition): Deleted.
+ * rendering/RenderObject.h:
+
2016-08-19 Dean Jackson <[email protected]>
Implement preferLowPowerToHighPerformance for WebGL
Modified: trunk/Source/WebCore/dom/Element.cpp (204666 => 204667)
--- trunk/Source/WebCore/dom/Element.cpp 2016-08-19 22:55:32 UTC (rev 204666)
+++ trunk/Source/WebCore/dom/Element.cpp 2016-08-19 23:09:14 UTC (rev 204667)
@@ -979,37 +979,40 @@
return result;
}
-static bool layoutOverflowRectContainsAllDescendants(const RenderElement& renderer)
+static bool layoutOverflowRectContainsAllDescendants(const RenderBox& renderBox)
{
- if (renderer.isRenderView())
+ if (renderBox.isRenderView())
return true;
- if (!renderer.element())
+ if (!renderBox.element())
return false;
// If there are any position:fixed inside of us, game over.
- if (auto viewPositionedObjects = renderer.view().positionedObjects()) {
- for (RenderBox* it : *viewPositionedObjects) {
- if (it != &renderer && it->style().position() == FixedPosition && renderer.element()->contains(it->element()))
+ if (auto* viewPositionedObjects = renderBox.view().positionedObjects()) {
+ for (auto* positionedBox : *viewPositionedObjects) {
+ if (positionedBox == &renderBox)
+ continue;
+ if (positionedBox->style().position() == FixedPosition && renderBox.element()->contains(positionedBox->element()))
return false;
}
}
- if (renderer.canContainAbsolutelyPositionedObjects()) {
+ if (renderBox.canContainAbsolutelyPositionedObjects()) {
// Our layout overflow will include all descendant positioned elements.
return true;
}
// This renderer may have positioned descendants whose containing block is some ancestor.
- if (auto containingBlock = renderer.containingBlockForAbsolutePosition()) {
- if (auto positionedObjects = containingBlock->positionedObjects()) {
- for (RenderBox* it : *positionedObjects) {
- if (it != &renderer && renderer.element()->contains(it->element()))
+ if (auto* containingBlock = renderBox.containingBlockForAbsolutePosition()) {
+ if (auto* positionedObjects = containingBlock->positionedObjects()) {
+ for (auto* positionedBox : *positionedObjects) {
+ if (positionedBox == &renderBox)
+ continue;
+ if (renderBox.element()->contains(positionedBox->element()))
return false;
}
}
}
-
return false;
}
Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (204666 => 204667)
--- trunk/Source/WebCore/rendering/RenderElement.cpp 2016-08-19 22:55:32 UTC (rev 204666)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp 2016-08-19 23:09:14 UTC (rev 204667)
@@ -647,6 +647,29 @@
cache->childrenChanged(this);
}
+RenderBlock* RenderElement::containingBlockForFixedPosition() const
+{
+ auto* renderer = parent();
+ while (renderer && !renderer->canContainFixedPositionObjects())
+ renderer = renderer->parent();
+
+ ASSERT(!renderer || !renderer->isAnonymousBlock());
+ return downcast<RenderBlock>(renderer);
+}
+
+RenderBlock* RenderElement::containingBlockForAbsolutePosition() const
+{
+ // A relatively positioned RenderInline forwards its absolute positioned descendants to
+ // its nearest non-anonymous containing block (to avoid having a positioned objects list in all RenderInlines).
+ auto* renderer = isRenderInline() ? const_cast<RenderElement*>(downcast<RenderElement>(this)) : parent();
+ while (renderer && !renderer->canContainAbsolutelyPositionedObjects())
+ renderer = renderer->parent();
+ // Make sure we only return non-anonymous RenderBlock as containing block.
+ while (renderer && (!is<RenderBlock>(*renderer) || renderer->isAnonymousBlock()))
+ renderer = renderer->containingBlock();
+ return downcast<RenderBlock>(renderer);
+}
+
static void addLayers(RenderElement& renderer, RenderLayer* parentLayer, RenderElement*& newObject, RenderLayer*& beforeChild)
{
if (renderer.hasLayer()) {
Modified: trunk/Source/WebCore/rendering/RenderElement.h (204666 => 204667)
--- trunk/Source/WebCore/rendering/RenderElement.h 2016-08-19 22:55:32 UTC (rev 204666)
+++ trunk/Source/WebCore/rendering/RenderElement.h 2016-08-19 23:09:14 UTC (rev 204667)
@@ -218,6 +218,8 @@
void adjustComputedFontSizesOnBlocks(float size, float visibleWidth);
WEBCORE_EXPORT void resetTextAutosizing();
#endif
+ RenderBlock* containingBlockForFixedPosition() const;
+ RenderBlock* containingBlockForAbsolutePosition() const;
protected:
enum BaseTypeFlag {
Modified: trunk/Source/WebCore/rendering/RenderInline.cpp (204666 => 204667)
--- trunk/Source/WebCore/rendering/RenderInline.cpp 2016-08-19 22:55:32 UTC (rev 204666)
+++ trunk/Source/WebCore/rendering/RenderInline.cpp 2016-08-19 23:09:14 UTC (rev 204667)
@@ -168,10 +168,9 @@
void RenderInline::styleWillChange(StyleDifference diff, const RenderStyle& newStyle)
{
RenderBoxModelObject::styleWillChange(diff, newStyle);
-
- // Check if this inline can hold absolute positioned elmements even after the style change.
+ // RenderInlines forward their absolute positioned descendants to their (non-anonymous) containing block.
+ // Check if this non-anonymous containing block can hold the absolute positioned elements when the inline is no longer positioned.
if (canContainAbsolutelyPositionedObjects() && newStyle.position() == StaticPosition) {
- // RenderInlines forward their absolute positioned descendants to their (non-anonymous) containing block.
auto* container = containingBlockForAbsolutePosition();
if (container && !container->canContainAbsolutelyPositionedObjects())
container->removePositionedObjects(nullptr, NewContainingBlock);
Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (204666 => 204667)
--- trunk/Source/WebCore/rendering/RenderObject.cpp 2016-08-19 22:55:32 UTC (rev 204666)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp 2016-08-19 23:09:14 UTC (rev 204667)
@@ -568,7 +568,7 @@
RenderBlock* RenderObject::containingBlock() const
{
- auto containingBlockForRenderer = [](const RenderObject& renderer)
+ auto containingBlockForRenderer = [](const RenderElement& renderer)
{
auto& style = renderer.style();
if (style.position() == AbsolutePosition)
@@ -582,44 +582,13 @@
return containingBlockForObjectInFlow();
if (!parent() && is<RenderScrollbarPart>(*this)) {
- if (auto* renderer = downcast<RenderScrollbarPart>(*this).rendererOwningScrollbar())
- return containingBlockForRenderer(*renderer);
+ if (auto* scrollbarPart = downcast<RenderScrollbarPart>(*this).rendererOwningScrollbar())
+ return containingBlockForRenderer(*scrollbarPart);
return nullptr;
}
- return containingBlockForRenderer(*this);
+ return containingBlockForRenderer(downcast<RenderElement>(*this));
}
-RenderBlock* RenderObject::containingBlockForFixedPosition() const
-{
- auto* renderer = parent();
- while (renderer && !renderer->canContainFixedPositionObjects())
- renderer = renderer->parent();
-
- ASSERT(!renderer || !renderer->isAnonymousBlock());
- return downcast<RenderBlock>(renderer);
-}
-
-RenderBlock* RenderObject::containingBlockForAbsolutePosition() const
-{
- // RenderInlines forward their absolute positioned descendants to the containing block, so
- // we need to start searching from 'this' and not from 'parent()'.
- auto* renderer = isRenderInline() ? const_cast<RenderElement*>(downcast<RenderElement>(this)) : parent();
- while (renderer && !renderer->canContainAbsolutelyPositionedObjects())
- renderer = renderer->parent();
-
- // For a relatively positioned inline, return its nearest non-anonymous containing block,
- // not the inline itself, to avoid having a positioned objects list in all RenderInlines
- // and use RenderBlock* as RenderElement::containingBlock's return type.
- // Use RenderBlock::container() to obtain the inline.
- if (renderer && !is<RenderBlock>(*renderer))
- renderer = renderer->containingBlock();
-
- while (renderer && renderer->isAnonymousBlock())
- renderer = renderer->containingBlock();
-
- return downcast<RenderBlock>(renderer);
-}
-
RenderBlock* RenderObject::containingBlockForObjectInFlow() const
{
auto* renderer = parent();
Modified: trunk/Source/WebCore/rendering/RenderObject.h (204666 => 204667)
--- trunk/Source/WebCore/rendering/RenderObject.h 2016-08-19 22:55:32 UTC (rev 204666)
+++ trunk/Source/WebCore/rendering/RenderObject.h 2016-08-19 23:09:14 UTC (rev 204667)
@@ -600,8 +600,6 @@
// returns the containing block level element for this element.
RenderBlock* containingBlock() const;
- RenderBlock* containingBlockForFixedPosition() const;
- RenderBlock* containingBlockForAbsolutePosition() const;
RenderBlock* containingBlockForObjectInFlow() const;
// Convert the given local point to absolute coordinates. If MapCoordinatesFlags includes UseTransforms, take transforms into account.