- Revision
- 224360
- Author
- [email protected]
- Date
- 2017-11-02 15:38:35 -0700 (Thu, 02 Nov 2017)
Log Message
display:contents should work with dynamic table mutations
https://bugs.webkit.org/show_bug.cgi?id=179179
Reviewed by Ryosuke Niwa.
Source/WebCore:
* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::addChildIgnoringContinuation):
RenderText with inline text wrapper as beforeChild is now resolved in RenderTreePosition, covering all cases.
Verify this with assert.
* rendering/RenderElement.cpp:
(WebCore::RenderElement::insertChildInternal):
Add assertion.
* rendering/RenderTableSection.cpp:
(WebCore::RenderTableSection::addChild):
Fix cases where we did unchecked downcasts for anonymous beforeChild.
* style/RenderTreePosition.cpp:
(WebCore::RenderTreePosition::insert):
When inserting before a text rendeder with an display:contents inline wrapper, use the wrapper as beforeChild.
* style/RenderTreePosition.h:
(WebCore::RenderTreePosition::insert): Deleted.
* style/RenderTreeUpdater.cpp:
(WebCore::RenderTreeUpdater::updateRenderTree):
(WebCore::RenderTreeUpdater::renderingParent):
Add separate helper to get parent frame for the closest rendered (non display:contents) ancestor.
(WebCore::RenderTreeUpdater::renderTreePosition):
(WebCore::RenderTreeUpdater::updateElementRenderer):
(WebCore::RenderTreeUpdater::textRendererIsNeeded):
(WebCore::RenderTreeUpdater::updateTextRenderer):
(WebCore::RenderTreeUpdater::storePreviousRenderer):
Use it for tracking state related to render tree siblings. With this we compute whitespace nodes
correctly for display:contents. The test cases end up depending on that.
* style/RenderTreeUpdater.h:
LayoutTests:
* TestExpectations:
These now pass:
imported/w3c/web-platform-tests/css/css-display-3/display-contents-dynamic-table-001-none.html
imported/w3c/web-platform-tests/css/css-display-3/display-contents-dynamic-table-002-none.html
Modified Paths
Diff
Modified: trunk/LayoutTests/ChangeLog (224359 => 224360)
--- trunk/LayoutTests/ChangeLog 2017-11-02 22:28:14 UTC (rev 224359)
+++ trunk/LayoutTests/ChangeLog 2017-11-02 22:38:35 UTC (rev 224360)
@@ -1,3 +1,17 @@
+2017-11-02 Antti Koivisto <[email protected]>
+
+ display:contents should work with dynamic table mutations
+ https://bugs.webkit.org/show_bug.cgi?id=179179
+
+ Reviewed by Ryosuke Niwa.
+
+ * TestExpectations:
+
+ These now pass:
+
+ imported/w3c/web-platform-tests/css/css-display-3/display-contents-dynamic-table-001-none.html
+ imported/w3c/web-platform-tests/css/css-display-3/display-contents-dynamic-table-002-none.html
+
2017-11-02 Joseph Pecoraro <[email protected]>
Inspector should display service worker served responses properly
Modified: trunk/LayoutTests/TestExpectations (224359 => 224360)
--- trunk/LayoutTests/TestExpectations 2017-11-02 22:28:14 UTC (rev 224359)
+++ trunk/LayoutTests/TestExpectations 2017-11-02 22:38:35 UTC (rev 224360)
@@ -1340,7 +1340,6 @@
########################################
### START OF display: contents failures
-webkit.org/b/157477 imported/w3c/web-platform-tests/css/css-display-3/display-contents-dynamic-table-002-none.html [ ImageOnlyFailure ]
webkit.org/b/157477 imported/w3c/web-platform-tests/css/css-display-3/display-contents-flex-003.html [ ImageOnlyFailure ]
webkit.org/b/157477 imported/w3c/web-platform-tests/css/css-display-3/display-contents-dynamic-table-001-inline.html [ ImageOnlyFailure ]
webkit.org/b/157477 imported/w3c/web-platform-tests/css/css-display-3/display-contents-dynamic-flex-002-none.html [ ImageOnlyFailure ]
@@ -1347,7 +1346,6 @@
webkit.org/b/157477 imported/w3c/web-platform-tests/css/css-display-3/display-contents-flex-002.html [ ImageOnlyFailure ]
webkit.org/b/157477 imported/w3c/web-platform-tests/css/css-display-3/display-flow-root-001.html [ ImageOnlyFailure ]
webkit.org/b/157477 imported/w3c/web-platform-tests/css/css-display-3/display-contents-dynamic-flex-003-none.html [ ImageOnlyFailure ]
-webkit.org/b/157477 imported/w3c/web-platform-tests/css/css-display-3/display-contents-dynamic-table-001-none.html [ ImageOnlyFailure ]
webkit.org/b/157477 imported/w3c/web-platform-tests/css/css-display-3/display-contents-dynamic-flex-002-inline.html [ ImageOnlyFailure ]
webkit.org/b/157477 imported/w3c/web-platform-tests/css/css-display-3/display-contents-dynamic-flex-003-inline.html [ ImageOnlyFailure ]
Modified: trunk/Source/WebCore/ChangeLog (224359 => 224360)
--- trunk/Source/WebCore/ChangeLog 2017-11-02 22:28:14 UTC (rev 224359)
+++ trunk/Source/WebCore/ChangeLog 2017-11-02 22:38:35 UTC (rev 224360)
@@ -1,3 +1,50 @@
+2017-11-02 Antti Koivisto <[email protected]>
+
+ display:contents should work with dynamic table mutations
+ https://bugs.webkit.org/show_bug.cgi?id=179179
+
+ Reviewed by Ryosuke Niwa.
+
+ * rendering/RenderBlock.cpp:
+ (WebCore::RenderBlock::addChildIgnoringContinuation):
+
+ RenderText with inline text wrapper as beforeChild is now resolved in RenderTreePosition, covering all cases.
+ Verify this with assert.
+
+ * rendering/RenderElement.cpp:
+ (WebCore::RenderElement::insertChildInternal):
+
+ Add assertion.
+
+ * rendering/RenderTableSection.cpp:
+ (WebCore::RenderTableSection::addChild):
+
+ Fix cases where we did unchecked downcasts for anonymous beforeChild.
+
+ * style/RenderTreePosition.cpp:
+ (WebCore::RenderTreePosition::insert):
+
+ When inserting before a text rendeder with an display:contents inline wrapper, use the wrapper as beforeChild.
+
+ * style/RenderTreePosition.h:
+ (WebCore::RenderTreePosition::insert): Deleted.
+ * style/RenderTreeUpdater.cpp:
+ (WebCore::RenderTreeUpdater::updateRenderTree):
+ (WebCore::RenderTreeUpdater::renderingParent):
+
+ Add separate helper to get parent frame for the closest rendered (non display:contents) ancestor.
+
+ (WebCore::RenderTreeUpdater::renderTreePosition):
+ (WebCore::RenderTreeUpdater::updateElementRenderer):
+ (WebCore::RenderTreeUpdater::textRendererIsNeeded):
+ (WebCore::RenderTreeUpdater::updateTextRenderer):
+ (WebCore::RenderTreeUpdater::storePreviousRenderer):
+
+ Use it for tracking state related to render tree siblings. With this we compute whitespace nodes
+ correctly for display:contents. The test cases end up depending on that.
+
+ * style/RenderTreeUpdater.h:
+
2017-11-02 Tim Horton <[email protected]>
Bump the size of SameAsRenderElement after r224324
Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (224359 => 224360)
--- trunk/Source/WebCore/rendering/RenderBlock.cpp 2017-11-02 22:28:14 UTC (rev 224359)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp 2017-11-02 22:38:35 UTC (rev 224360)
@@ -550,11 +550,8 @@
ASSERT(beforeChildContainer);
if (beforeChildContainer->isAnonymous()) {
- if (beforeChildContainer->isInline()) {
- ASSERT(RenderText::findByDisplayContentsInlineWrapperCandidate(*beforeChildContainer) == beforeChild);
- addChild(WTFMove(newChild), beforeChildContainer);
- return;
- }
+ RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(!beforeChildContainer->isInline());
+
// If the requested beforeChild is not one of our children, then this is because
// there is an anonymous container within this object that contains the beforeChild.
RenderElement* beforeChildAnonymousContainer = beforeChildContainer;
@@ -574,6 +571,7 @@
}
ASSERT(beforeChildAnonymousContainer->isTable());
+
if (newChild->isTablePart()) {
// Insert into the anonymous table.
beforeChildAnonymousContainer->addChild(WTFMove(newChild), beforeChild);
@@ -582,12 +580,7 @@
beforeChild = splitAnonymousBoxesAroundChild(beforeChild);
- ASSERT(beforeChild->parent() == this);
- if (beforeChild->parent() != this) {
- // We should never reach here. If we do, we need to use the
- // safe fallback to use the topmost beforeChild container.
- beforeChild = beforeChildContainer;
- }
+ RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(beforeChild->parent() == this);
}
}
Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (224359 => 224360)
--- trunk/Source/WebCore/rendering/RenderElement.cpp 2017-11-02 22:28:14 UTC (rev 224359)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp 2017-11-02 22:38:35 UTC (rev 224360)
@@ -538,6 +538,7 @@
beforeChild = beforeChild->parent();
ASSERT(!beforeChild || beforeChild->parent() == this);
+ ASSERT(!is<RenderText>(beforeChild) || !downcast<RenderText>(*beforeChild).inlineWrapperForDisplayContents());
// Take the ownership.
auto* newChild = newChildPtr.release();
Modified: trunk/Source/WebCore/rendering/RenderTableSection.cpp (224359 => 224360)
--- trunk/Source/WebCore/rendering/RenderTableSection.cpp 2017-11-02 22:28:14 UTC (rev 224359)
+++ trunk/Source/WebCore/rendering/RenderTableSection.cpp 2017-11-02 22:38:35 UTC (rev 224360)
@@ -122,7 +122,7 @@
RenderObject* last = beforeChild;
if (!last)
last = lastRow();
- if (last && last->isAnonymous() && !last->isBeforeOrAfterContent()) {
+ if (is<RenderTableRow>(last) && last->isAnonymous() && !last->isBeforeOrAfterContent()) {
RenderTableRow& row = downcast<RenderTableRow>(*last);
if (beforeChild == &row)
beforeChild = row.firstCell();
@@ -143,7 +143,7 @@
RenderObject* lastBox = last;
while (lastBox && lastBox->parent()->isAnonymous() && !is<RenderTableRow>(*lastBox))
lastBox = lastBox->parent();
- if (lastBox && lastBox->isAnonymous() && !lastBox->isBeforeOrAfterContent()) {
+ if (is<RenderTableRow>(lastBox) && lastBox->isAnonymous() && !lastBox->isBeforeOrAfterContent()) {
downcast<RenderTableRow>(*lastBox).addChild(WTFMove(child), beforeChild);
return;
}
Modified: trunk/Source/WebCore/style/RenderTreePosition.cpp (224359 => 224360)
--- trunk/Source/WebCore/style/RenderTreePosition.cpp 2017-11-02 22:28:14 UTC (rev 224359)
+++ trunk/Source/WebCore/style/RenderTreePosition.cpp 2017-11-02 22:38:35 UTC (rev 224360)
@@ -28,11 +28,23 @@
#include "ComposedTreeIterator.h"
#include "PseudoElement.h"
+#include "RenderInline.h"
#include "RenderObject.h"
#include "ShadowRoot.h"
namespace WebCore {
+void RenderTreePosition::insert(RenderPtr<RenderObject> renderer)
+{
+ ASSERT(m_hasValidNextSibling);
+ auto* insertBefore = m_nextSibling;
+ if (is<RenderText>(insertBefore)) {
+ if (auto* wrapperInline = downcast<RenderText>(*insertBefore).inlineWrapperForDisplayContents())
+ insertBefore = wrapperInline;
+ }
+ m_parent.addChild(WTFMove(renderer), insertBefore);
+}
+
void RenderTreePosition::computeNextSibling(const Node& node)
{
ASSERT(!node.renderer());
Modified: trunk/Source/WebCore/style/RenderTreePosition.h (224359 => 224360)
--- trunk/Source/WebCore/style/RenderTreePosition.h 2017-11-02 22:28:14 UTC (rev 224359)
+++ trunk/Source/WebCore/style/RenderTreePosition.h 2017-11-02 22:38:35 UTC (rev 224360)
@@ -78,10 +78,4 @@
return m_parent.isChildAllowed(renderer, m_parent.style());
}
-inline void RenderTreePosition::insert(RenderPtr<RenderObject> renderer)
-{
- ASSERT(m_hasValidNextSibling);
- m_parent.addChild(WTFMove(renderer), m_nextSibling);
-}
-
} // namespace WebCore
Modified: trunk/Source/WebCore/style/RenderTreeUpdater.cpp (224359 => 224360)
--- trunk/Source/WebCore/style/RenderTreeUpdater.cpp 2017-11-02 22:28:14 UTC (rev 224359)
+++ trunk/Source/WebCore/style/RenderTreeUpdater.cpp 2017-11-02 22:38:35 UTC (rev 224360)
@@ -175,7 +175,7 @@
auto& text = downcast<Text>(node);
auto* textUpdate = m_styleUpdate->textUpdate(text);
bool didCreateParent = parent().updates && parent().updates->update.change == Style::Detach;
- bool mayNeedUpdateWhitespaceOnlyRenderer = parent().didCreateOrDestroyChildRenderer && text.containsOnlyWhitespace();
+ bool mayNeedUpdateWhitespaceOnlyRenderer = renderingParent().didCreateOrDestroyChildRenderer && text.containsOnlyWhitespace();
if (didCreateParent || textUpdate || mayNeedUpdateWhitespaceOnlyRenderer)
updateTextRenderer(text, textUpdate);
@@ -215,16 +215,21 @@
popParentsToDepth(0);
}
-RenderTreePosition& RenderTreeUpdater::renderTreePosition()
+auto RenderTreeUpdater::renderingParent() -> Parent&
{
- for (unsigned i = m_parentStack.size(); i; --i) {
- if (auto& position = m_parentStack[i - 1].renderTreePosition)
- return *position;
+ for (unsigned i = m_parentStack.size(); i--;) {
+ if (m_parentStack[i].renderTreePosition)
+ return m_parentStack[i];
}
ASSERT_NOT_REACHED();
- return *m_parentStack.last().renderTreePosition;
+ return m_parentStack.last();
}
+RenderTreePosition& RenderTreeUpdater::renderTreePosition()
+{
+ return *renderingParent().renderTreePosition;
+}
+
void RenderTreeUpdater::pushParent(Element& element, const Style::ElementUpdates* updates)
{
m_parentStack.append(Parent(element, updates));
@@ -314,7 +319,7 @@
auto teardownType = update.style->display() == NONE ? TeardownType::RendererUpdateCancelingAnimations : TeardownType::RendererUpdate;
tearDownRenderers(element, teardownType);
- parent().didCreateOrDestroyChildRenderer = true;
+ renderingParent().didCreateOrDestroyChildRenderer = true;
}
bool hasDisplayContents = update.style->display() == CONTENTS;
@@ -329,7 +334,7 @@
element.willAttachRenderers();
createRenderer(element, RenderStyle::clone(*update.style));
- parent().didCreateOrDestroyChildRenderer = true;
+ renderingParent().didCreateOrDestroyChildRenderer = true;
return;
}
@@ -410,7 +415,7 @@
if (parentRenderer.style().preserveNewline()) // pre/pre-wrap/pre-line always make renderers.
return true;
- auto* previousRenderer = parent().previousChildRenderer;
+ auto* previousRenderer = renderingParent().previousChildRenderer;
if (previousRenderer && previousRenderer->isBR()) // <span><br/> <br/></span>
return false;
@@ -483,13 +488,13 @@
return;
}
tearDownRenderer(text);
- parent().didCreateOrDestroyChildRenderer = true;
+ renderingParent().didCreateOrDestroyChildRenderer = true;
return;
}
if (!needsRenderer)
return;
createTextRenderer(text, renderTreePosition(), textUpdate);
- parent().didCreateOrDestroyChildRenderer = true;
+ renderingParent().didCreateOrDestroyChildRenderer = true;
}
void RenderTreeUpdater::storePreviousRenderer(Node& node)
@@ -497,8 +502,8 @@
auto* renderer = node.renderer();
if (!renderer)
return;
- ASSERT(parent().previousChildRenderer != renderer);
- parent().previousChildRenderer = renderer;
+ ASSERT(renderingParent().previousChildRenderer != renderer);
+ renderingParent().previousChildRenderer = renderer;
}
void RenderTreeUpdater::tearDownRenderers(Element& root)
Modified: trunk/Source/WebCore/style/RenderTreeUpdater.h (224359 => 224360)
--- trunk/Source/WebCore/style/RenderTreeUpdater.h 2017-11-02 22:28:14 UTC (rev 224359)
+++ trunk/Source/WebCore/style/RenderTreeUpdater.h 2017-11-02 22:38:35 UTC (rev 224360)
@@ -78,6 +78,7 @@
Parent(Element&, const Style::ElementUpdates*);
};
Parent& parent() { return m_parentStack.last(); }
+ Parent& renderingParent();
RenderTreePosition& renderTreePosition();
GeneratedContent& generatedContent() { return *m_generatedContent; }