Changeset 280896 in webkit
- Timestamp:
- Aug 11, 2021, 3:19:36 AM (5 years ago)
- Location:
- releases/WebKitGTK/webkit-2.32/Source/WebCore
- Files:
-
- 4 edited
-
ChangeLog (modified) (1 diff)
-
editing/CompositeEditCommand.cpp (modified) (5 diffs)
-
editing/Editing.cpp (modified) (1 diff)
-
editing/ReplaceSelectionCommand.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
releases/WebKitGTK/webkit-2.32/Source/WebCore/ChangeLog
r280894 r280896 1 2021-03-18 Frédéric Wang <fwang@igalia.com> 2 3 ASSERTION FAILED: node.isConnected() in matchSlottedPseudoElementRules 4 https://bugs.webkit.org/show_bug.cgi?id=221440 5 6 Reviewed by Ryosuke Niwa. 7 8 ReplaceSelectionCommand::doApply() removes a <br> from an element and immediately calls 9 highestNodeToRemoveInPruning() on that element. The former operation may destroy the 10 element's renderer and confuses the latter operation. This happens in particular for a 11 <summary> element which ends up being removed from the tree. This in turn causes unexpected 12 issues such as a debug assertion failure in matchSlottedPseudoElementRules. To address that 13 problem, ensure the document is laid out before calling highestNodeToRemoveInPruning(). 14 This patch also increases and improves use of RefPtr<Node>. 15 16 * editing/CompositeEditCommand.cpp: 17 (WebCore::CompositeEditCommand::removeNodeAndPruneAncestors): Use auto & makeRefPtr. 18 (WebCore::CompositeEditCommand::prune): Store local highestNodeToRemove variable in a RefPtr. 19 (WebCore::CompositeEditCommand::cleanupAfterDeletion): Store local node variable in a RefPtr. 20 (WebCore::CompositeEditCommand::breakOutOfEmptyMailBlockquotedParagraph): Store local parentNode variable in a RefPtr. 21 * editing/Editing.cpp: 22 (WebCore::highestNodeToRemoveInPruning): Store local currentNode variable in a a RefPtr. 23 * editing/ReplaceSelectionCommand.cpp: 24 (WebCore::ReplaceSelectionCommand::doApply): Use auto & makeRefPtr. Store local odeToRemove variable in a RefPtr. 25 Ensure the document is laid out before calling highestNodeToRemoveInPruning. 26 1 27 2021-03-15 Zalan Bujtas <zalan@apple.com> 2 28 -
releases/WebKitGTK/webkit-2.32/Source/WebCore/editing/CompositeEditCommand.cpp
r273468 r280896 613 613 void CompositeEditCommand::removeNodeAndPruneAncestors(Node& node) 614 614 { 615 RefPtr<ContainerNode> parent = node.parentNode();615 auto parent = makeRefPtr(node.parentNode()); 616 616 removeNode(node); 617 617 prune(parent.get()); … … 657 657 void CompositeEditCommand::prune(Node* node) 658 658 { 659 if (auto * highestNodeToRemove = highestNodeToRemoveInPruning(node))659 if (auto highestNodeToRemove = makeRefPtr(highestNodeToRemoveInPruning(node))) 660 660 removeNode(*highestNodeToRemove); 661 661 } … … 1294 1294 // Note: We want the rightmost candidate. 1295 1295 Position position = caretAfterDelete.deepEquivalent().downstream(); 1296 Node* node = position.deprecatedNode();1296 auto node = makeRefPtr(position.deprecatedNode()); 1297 1297 ASSERT(node); 1298 1298 // Normally deletion will leave a br as a placeholder. … … 1303 1303 // div or an li), remove it during the move (the list removal code 1304 1304 // expects this behavior). 1305 else if (isBlock(node )) {1305 else if (isBlock(node.get())) { 1306 1306 // If caret position after deletion and destination position coincides, 1307 1307 // node should not be removed. 1308 1308 if (!position.rendersInDifferentPosition(destination.deepEquivalent())) { 1309 prune(node );1309 prune(node.get()); 1310 1310 return; 1311 1311 } … … 1624 1624 ASSERT(caretPos.deprecatedEditingOffset() == 0); 1625 1625 Text& textNode = downcast<Text>(*caretPos.deprecatedNode()); 1626 ContainerNode* parentNode = textNode.parentNode();1626 auto parentNode = makeRefPtr(textNode.parentNode()); 1627 1627 // The preserved newline must be the first thing in the node, since otherwise the previous 1628 1628 // paragraph would be quoted, and we verified that it wasn't above. 1629 1629 deleteTextFromNode(textNode, 0, 1); 1630 prune(parentNode );1630 prune(parentNode.get()); 1631 1631 } 1632 1632 -
releases/WebKitGTK/webkit-2.32/Source/WebCore/editing/Editing.cpp
r273227 r280896 629 629 Node* previousNode = nullptr; 630 630 auto* rootEditableElement = node ? node->rootEditableElement() : nullptr; 631 for ( ; node; node = node->parentNode()) {632 if (auto* renderer = node->renderer()) {633 if (!renderer->canHaveChildren() || hasARenderedDescendant( node, previousNode) || rootEditableElement == node)631 for (auto currentNode = makeRefPtr(node); currentNode; currentNode = currentNode->parentNode()) { 632 if (auto* renderer = currentNode->renderer()) { 633 if (!renderer->canHaveChildren() || hasARenderedDescendant(currentNode.get(), previousNode) || rootEditableElement == currentNode.get()) 634 634 return previousNode; 635 635 } 636 previousNode = node;636 previousNode = currentNode.get(); 637 637 } 638 638 return nullptr; -
releases/WebKitGTK/webkit-2.32/Source/WebCore/editing/ReplaceSelectionCommand.cpp
r280833 r280896 1298 1298 1299 1299 if (endBR && (plainTextFragment || shouldRemoveEndBR(endBR.get(), originalVisPosBeforeEndBR))) { 1300 RefPtr<Node> parent = endBR->parentNode();1300 auto parent = makeRefPtr(endBR->parentNode()); 1301 1301 insertedNodes.willRemoveNode(endBR.get()); 1302 1302 removeNode(*endBR); 1303 if (Node* nodeToRemove = highestNodeToRemoveInPruning(parent.get())) { 1304 insertedNodes.willRemoveNode(nodeToRemove); 1303 document().updateLayoutIgnorePendingStylesheets(); 1304 if (auto nodeToRemove = makeRefPtr(highestNodeToRemoveInPruning(parent.get()))) { 1305 insertedNodes.willRemoveNode(nodeToRemove.get()); 1305 1306 removeNode(*nodeToRemove); 1306 1307 }
Note:
See TracChangeset
for help on using the changeset viewer.