Title: [230313] trunk
- Revision
- 230313
- Author
- za...@apple.com
- Date
- 2018-04-05 14:14:31 -0700 (Thu, 05 Apr 2018)
Log Message
Folding anonymous blocks should not result in deleting content.
https://bugs.webkit.org/show_bug.cgi?id=184339
<rdar://problem/37327428>
Reviewed by Antti Koivisto.
Source/WebCore:
While folding multiple anonymous blocks (moving the children from next sibling over to previous sibling)
we should ensure that the block we are about to destroy does not gain new descendants.
In case of 4 sibling anonymous blocks (A B C D), while destroying B
1. we move C's children to A and destroy C.
2. While destroying C, we notice B and C as sibling anonymous blocks and we move
D's children over to B (even though B is going to be destroyed as we climb back on the stack).
In this patch, B is detached from the tree before we start moving renderers around so that a subsequent folding won't
find B anymore as a candidate.
Test: fast/block/crash-while-folding-anonymous-blocks.html
* rendering/updating/RenderTreeBuilderBlock.cpp:
(WebCore::RenderTreeBuilder::Block::detach):
LayoutTests:
* fast/block/crash-when-subtree-is-still-attached-expected.txt: Progressing. This test does not
intend to remove "foobar" text at all.
* fast/block/crash-while-folding-anonymous-blocks-expected.txt: Added.
* fast/block/crash-while-folding-anonymous-blocks.html: Added.
Modified Paths
Added Paths
Diff
Modified: trunk/LayoutTests/ChangeLog (230312 => 230313)
--- trunk/LayoutTests/ChangeLog 2018-04-05 20:09:09 UTC (rev 230312)
+++ trunk/LayoutTests/ChangeLog 2018-04-05 21:14:31 UTC (rev 230313)
@@ -1,3 +1,16 @@
+2018-04-05 Zalan Bujtas <za...@apple.com>
+
+ Folding anonymous blocks should not result in deleting content.
+ https://bugs.webkit.org/show_bug.cgi?id=184339
+ <rdar://problem/37327428>
+
+ Reviewed by Antti Koivisto.
+
+ * fast/block/crash-when-subtree-is-still-attached-expected.txt: Progressing. This test does not
+ intend to remove "foobar" text at all.
+ * fast/block/crash-while-folding-anonymous-blocks-expected.txt: Added.
+ * fast/block/crash-while-folding-anonymous-blocks.html: Added.
+
2018-03-21 Ryan Haddad <ryanhad...@apple.com>
Rebaseline tests for High Sierra.
Modified: trunk/LayoutTests/fast/block/crash-when-subtree-is-still-attached-expected.txt (230312 => 230313)
--- trunk/LayoutTests/fast/block/crash-when-subtree-is-still-attached-expected.txt 2018-04-05 20:09:09 UTC (rev 230312)
+++ trunk/LayoutTests/fast/block/crash-when-subtree-is-still-attached-expected.txt 2018-04-05 21:14:31 UTC (rev 230313)
@@ -1,3 +1,4 @@
PASS if
no crash.
+foobar
Added: trunk/LayoutTests/fast/block/crash-while-folding-anonymous-blocks-expected.txt (0 => 230313)
--- trunk/LayoutTests/fast/block/crash-while-folding-anonymous-blocks-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/block/crash-while-folding-anonymous-blocks-expected.txt 2018-04-05 21:14:31 UTC (rev 230313)
@@ -0,0 +1 @@
+
Added: trunk/LayoutTests/fast/block/crash-while-folding-anonymous-blocks.html (0 => 230313)
--- trunk/LayoutTests/fast/block/crash-while-folding-anonymous-blocks.html (rev 0)
+++ trunk/LayoutTests/fast/block/crash-while-folding-anonymous-blocks.html 2018-04-05 21:14:31 UTC (rev 230313)
@@ -0,0 +1,33 @@
+<span id=foo9><div id=foo7></div></span><div id=foo1></div><div id=foo2></div><div id=foo3></div><span id=foo12><div id=foo10></div></span><div id=foo4></div><div id=foo5></div><div id=foo6></div><span id=foo11><table><colgroup><col></colgroup></table><div id=foo8></div></span><script>
+if (window.testRunner)
+ testRunner.dumpAsText();
+// Setting up 3 continuations in separate blocks.
+document.body.offsetHeight;
+
+let di = document.createElement("div");
+foo2.appendChild(di);
+foo2.style.display = "inline";
+document.body.offsetHeight;
+
+foo1.remove();
+foo3.remove();
+document.body.offsetHeight;
+
+foo2.remove();
+document.body.offsetHeight;
+
+let di2 = document.createElement("div");
+foo5.appendChild(di2);
+foo5.style.display = "inline";
+document.body.offsetHeight;
+
+foo4.remove();
+foo6.remove();
+foo5.remove();
+foo7.remove();
+foo9.remove();
+foo10.remove();
+document.body.offsetHeight;
+foo12.remove();
+document.body.offsetHeight;
+</script>
\ No newline at end of file
Modified: trunk/Source/WebCore/ChangeLog (230312 => 230313)
--- trunk/Source/WebCore/ChangeLog 2018-04-05 20:09:09 UTC (rev 230312)
+++ trunk/Source/WebCore/ChangeLog 2018-04-05 21:14:31 UTC (rev 230313)
@@ -1,3 +1,26 @@
+2018-04-05 Zalan Bujtas <za...@apple.com>
+
+ Folding anonymous blocks should not result in deleting content.
+ https://bugs.webkit.org/show_bug.cgi?id=184339
+ <rdar://problem/37327428>
+
+ Reviewed by Antti Koivisto.
+
+ While folding multiple anonymous blocks (moving the children from next sibling over to previous sibling)
+ we should ensure that the block we are about to destroy does not gain new descendants.
+ In case of 4 sibling anonymous blocks (A B C D), while destroying B
+ 1. we move C's children to A and destroy C.
+ 2. While destroying C, we notice B and C as sibling anonymous blocks and we move
+ D's children over to B (even though B is going to be destroyed as we climb back on the stack).
+
+ In this patch, B is detached from the tree before we start moving renderers around so that a subsequent folding won't
+ find B anymore as a candidate.
+
+ Test: fast/block/crash-while-folding-anonymous-blocks.html
+
+ * rendering/updating/RenderTreeBuilderBlock.cpp:
+ (WebCore::RenderTreeBuilder::Block::detach):
+
2018-04-05 Andy Estes <aes...@apple.com>
Mark Payment Request as "Supported" in features.json
Modified: trunk/Source/WebCore/rendering/updating/RenderTreeBuilderBlock.cpp (230312 => 230313)
--- trunk/Source/WebCore/rendering/updating/RenderTreeBuilderBlock.cpp 2018-04-05 20:09:09 UTC (rev 230312)
+++ trunk/Source/WebCore/rendering/updating/RenderTreeBuilderBlock.cpp 2018-04-05 21:14:31 UTC (rev 230313)
@@ -280,9 +280,14 @@
// If this child is a block, and if our previous and next siblings are both anonymous blocks
// with inline content, then we can fold the inline content back together.
- RenderObject* prev = oldChild.previousSibling();
- RenderObject* next = oldChild.nextSibling();
- bool canMergeAnonymousBlocks = canMergeContiguousAnonymousBlocks(oldChild, prev, next);
+ auto prev = makeWeakPtr(oldChild.previousSibling());
+ auto next = makeWeakPtr(oldChild.nextSibling());
+ bool canMergeAnonymousBlocks = canMergeContiguousAnonymousBlocks(oldChild, prev.get(), next.get());
+
+ parent.invalidateLineLayoutPath();
+
+ auto takenChild = m_builder.detachFromRenderElement(parent, oldChild);
+
if (canMergeAnonymousBlocks && prev && next) {
prev->setNeedsLayoutAndPrefWidthsRecalc();
RenderBlock& nextBlock = downcast<RenderBlock>(*next);
@@ -320,15 +325,10 @@
// Delete the now-empty block's lines and nuke it.
nextBlock.deleteLines();
m_builder.destroy(nextBlock);
- next = nullptr;
}
}
- parent.invalidateLineLayoutPath();
-
- auto takenChild = m_builder.detachFromRenderElement(parent, oldChild);
-
- RenderObject* child = prev ? prev : next;
+ RenderObject* child = prev ? prev.get() : next.get();
if (canMergeAnonymousBlocks && child && !child->previousSibling() && !child->nextSibling() && parent.canDropAnonymousBlockChild()) {
// The removal has knocked us down to containing only a single anonymous
// box. We can pull the content right back up into our box.
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes