Changeset 223848 in webkit
- Timestamp:
- Oct 23, 2017 11:59:06 AM (6 years ago)
- Location:
- trunk
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r223845 r223848 1 2017-10-23 Antti Koivisto <antti@apple.com> 2 3 Remember previous child renderer during render tree update 4 https://bugs.webkit.org/show_bug.cgi?id=178659 5 6 Reviewed by Zalan Bujtas. 7 8 * fast/block/float/float-not-removed-from-pre-block-expected.txt: 9 * platform/mac/fast/css-generated-content/details-summary-before-after-expected.txt: 10 1 11 2017-10-23 Daniel Bates <dabates@apple.com> 2 12 -
trunk/LayoutTests/fast/block/float/float-not-removed-from-pre-block-expected.txt
r191011 r223848 1 1 Bug 101970: Heap-use-after-free in WebCore::RenderLayerModelObject::hasSelfPaintingLayer 2 2 Test passes if it does not crash. 3 3 -
trunk/LayoutTests/platform/mac/fast/css-generated-content/details-summary-before-after-expected.txt
r190840 r223848 25 25 text run at (0,0) width 30: "after" 26 26 RenderBlock (anonymous) at (1,77) size 782x18 27 RenderText {#text} at (0,0) size 0x028 27 RenderText {#text} at (0,0) size 50x18 29 28 text run at (0,0) width 50: "Details " -
trunk/Source/WebCore/ChangeLog
r223847 r223848 1 2017-10-23 Antti Koivisto <antti@apple.com> 2 3 Remember previous child renderer during render tree update 4 https://bugs.webkit.org/show_bug.cgi?id=178659 5 6 Reviewed by Zalan Bujtas. 7 8 We shouldn't need to recompute the previous renderer, we know it already. 9 10 * style/RenderTreePosition.cpp: 11 (WebCore::RenderTreePosition::previousSiblingRenderer const): Deleted. 12 13 No longer needed. This was also subtly wrong as doesn't take display:contents into account. 14 15 * style/RenderTreePosition.h: 16 * style/RenderTreeUpdater.cpp: 17 (WebCore::RenderTreeUpdater::updateRenderTree): 18 (WebCore::RenderTreeUpdater::textRendererIsNeeded): 19 20 Use the saved previous renderer. 21 22 (WebCore::RenderTreeUpdater::updateTextRenderer): 23 (WebCore::RenderTreeUpdater::storePreviousRenderer): 24 25 Save the previous renderere as we walk the tree. 26 27 (WebCore::textRendererIsNeeded): Deleted. 28 * style/RenderTreeUpdater.h: 29 1 30 2017-10-23 Keith Miller <keith_miller@apple.com> 2 31 -
trunk/Source/WebCore/style/RenderTreePosition.cpp
r223748 r223848 55 55 if (m_nextSibling == &siblingRenderer) 56 56 m_hasValidNextSibling = false; 57 }58 59 RenderObject* RenderTreePosition::previousSiblingRenderer(const Text& textNode) const60 {61 if (textNode.renderer())62 return textNode.renderer()->previousSibling();63 64 auto* parentElement = m_parent.element();65 66 auto composedChildren = composedTreeChildren(*parentElement);67 for (auto it = composedChildren.at(textNode), end = composedChildren.end(); it != end; --it) {68 if (auto* renderer = it->renderer())69 return renderer;70 }71 if (auto* before = parentElement->beforePseudoElement())72 return before->renderer();73 return nullptr;74 57 } 75 58 -
trunk/Source/WebCore/style/RenderTreePosition.h
r223810 r223848 50 50 void invalidateNextSibling(const RenderObject&); 51 51 52 RenderObject* previousSiblingRenderer(const Text&) const;53 52 RenderObject* nextSiblingRenderer(const Node&) const; 54 53 -
trunk/Source/WebCore/style/RenderTreeUpdater.cpp
r223748 r223848 178 178 updateTextRenderer(text, textUpdate); 179 179 180 storePreviousRenderer(text); 180 181 it.traverseNextSkippingChildren(); 181 182 continue; … … 189 190 // there may be other updates down the tree. 190 191 if (!elementUpdates && !element.hasDisplayContents()) { 192 storePreviousRenderer(element); 191 193 it.traverseNextSkippingChildren(); 192 194 continue; … … 195 197 if (elementUpdates) 196 198 updateElementRenderer(element, elementUpdates->update); 199 200 storePreviousRenderer(element); 197 201 198 202 bool mayHaveRenderedDescendants = element.renderer() || (element.hasDisplayContents() && shouldCreateRenderer(element, renderTreePosition().parent())); … … 385 389 } 386 390 387 static bool textRendererIsNeeded(const Text& textNode, const RenderTreePosition& renderTreePosition)388 { 389 const RenderElement& parentRenderer = renderTreePosition .parent();391 bool RenderTreeUpdater::textRendererIsNeeded(const Text& textNode) 392 { 393 const RenderElement& parentRenderer = renderTreePosition().parent(); 390 394 if (!parentRenderer.canHaveChildren()) 391 395 return false; … … 404 408 return true; 405 409 406 RenderObject* previousRenderer = renderTreePosition.previousSiblingRenderer(textNode);410 auto* previousRenderer = parent().previousChildRenderer; 407 411 if (previousRenderer && previousRenderer->isBR()) // <span><br/> <br/></span> 408 412 return false; … … 419 423 while (first && first->isFloatingOrOutOfFlowPositioned()) 420 424 first = first->nextSibling(); 421 RenderObject* nextRenderer = textNode.renderer() ? textNode.renderer() : renderTreePosition.nextSiblingRenderer(textNode);425 RenderObject* nextRenderer = textNode.renderer() ? textNode.renderer() : renderTreePosition().nextSiblingRenderer(textNode); 422 426 if (!first || nextRenderer == first) { 423 427 // Whitespace at the start of a block just goes away. Don't even make a render object for this text. … … 460 464 { 461 465 auto* existingRenderer = text.renderer(); 462 bool needsRenderer = textRendererIsNeeded(text , renderTreePosition());466 bool needsRenderer = textRendererIsNeeded(text); 463 467 464 468 if (existingRenderer && textUpdate && textUpdate->inheritedDisplayContentsStyle) { … … 512 516 } 513 517 518 void RenderTreeUpdater::storePreviousRenderer(Node& node) 519 { 520 auto* renderer = node.renderer(); 521 if (!renderer) 522 return; 523 ASSERT(parent().previousChildRenderer != renderer); 524 parent().previousChildRenderer = renderer; 525 } 526 514 527 void RenderTreeUpdater::tearDownRenderers(Element& root) 515 528 { -
trunk/Source/WebCore/style/RenderTreeUpdater.h
r223604 r223848 65 65 void updateBeforeDescendants(Element&, const Style::ElementUpdates*); 66 66 void updateAfterDescendants(Element&, const Style::ElementUpdates*); 67 bool textRendererIsNeeded(const Text& textNode); 68 void storePreviousRenderer(Node&); 67 69 68 70 struct Parent { … … 70 72 const Style::ElementUpdates* updates { nullptr }; 71 73 std::optional<RenderTreePosition> renderTreePosition; 74 RenderObject* previousChildRenderer { nullptr }; 72 75 73 76 Parent(ContainerNode& root);
Note: See TracChangeset
for help on using the changeset viewer.