Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Side by Side Diff: Source/core/editing/CompositeEditCommand.cpp

Issue 251723003: Check the traversal state in CompositeEditCommand::cloneParagraphUnderNewElement (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Nit pick Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « LayoutTests/editing/execCommand/indent-nested-blockquotes-crash-expected.txt ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 2 * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 947 matching lines...) Expand 10 before | Expand all | Expand 10 after
958 if (anchorNode->inDocument()) 958 if (anchorNode->inDocument())
959 removeNodePreservingChildren(anchorNode); 959 removeNodePreservingChildren(anchorNode);
960 } 960 }
961 961
962 // Clone the paragraph between start and end under blockElement, 962 // Clone the paragraph between start and end under blockElement,
963 // preserving the hierarchy up to outerNode. 963 // preserving the hierarchy up to outerNode.
964 964
965 void CompositeEditCommand::cloneParagraphUnderNewElement(const Position& start, const Position& end, Node* passedOuterNode, Element* blockElement) 965 void CompositeEditCommand::cloneParagraphUnderNewElement(const Position& start, const Position& end, Node* passedOuterNode, Element* blockElement)
966 { 966 {
967 ASSERT(comparePositions(start, end) <= 0); 967 ASSERT(comparePositions(start, end) <= 0);
968 ASSERT(passedOuterNode);
969 ASSERT(blockElement);
968 970
969 // First we clone the outerNode 971 // First we clone the outerNode
970 RefPtr<Node> lastNode; 972 RefPtr<Node> lastNode;
971 RefPtr<Node> outerNode = passedOuterNode; 973 RefPtr<Node> outerNode = passedOuterNode;
972 974
973 if (outerNode->isRootEditableElement()) { 975 if (outerNode->isRootEditableElement()) {
974 lastNode = blockElement; 976 lastNode = blockElement;
975 } else { 977 } else {
976 lastNode = outerNode->cloneNode(isRenderedTableElement(outerNode.get())) ; 978 lastNode = outerNode->cloneNode(isRenderedTableElement(outerNode.get())) ;
977 appendNode(lastNode, blockElement); 979 appendNode(lastNode, blockElement);
(...skipping 21 matching lines...) Expand all
999 if (!outerNode->inDocument()) 1001 if (!outerNode->inDocument())
1000 return; 1002 return;
1001 1003
1002 // Handle the case of paragraphs with more than one node, 1004 // Handle the case of paragraphs with more than one node,
1003 // cloning all the siblings until end.deprecatedNode() is reached. 1005 // cloning all the siblings until end.deprecatedNode() is reached.
1004 1006
1005 if (start.deprecatedNode() != end.deprecatedNode() && !start.deprecatedNode( )->isDescendantOf(end.deprecatedNode())) { 1007 if (start.deprecatedNode() != end.deprecatedNode() && !start.deprecatedNode( )->isDescendantOf(end.deprecatedNode())) {
1006 // If end is not a descendant of outerNode we need to 1008 // If end is not a descendant of outerNode we need to
1007 // find the first common ancestor to increase the scope 1009 // find the first common ancestor to increase the scope
1008 // of our nextSibling traversal. 1010 // of our nextSibling traversal.
1009 while (!end.deprecatedNode()->isDescendantOf(outerNode.get())) { 1011 while (outerNode && !end.deprecatedNode()->isDescendantOf(outerNode.get( ))) {
1010 outerNode = outerNode->parentNode(); 1012 outerNode = outerNode->parentNode();
1011 } 1013 }
1012 1014
1015 if (!outerNode)
1016 return;
1017
1013 RefPtr<Node> startNode = start.deprecatedNode(); 1018 RefPtr<Node> startNode = start.deprecatedNode();
1014 for (RefPtr<Node> node = NodeTraversal::nextSkippingChildren(*startNode, outerNode.get()); node; node = NodeTraversal::nextSkippingChildren(*node, outer Node.get())) { 1019 for (RefPtr<Node> node = NodeTraversal::nextSkippingChildren(*startNode, outerNode.get()); node; node = NodeTraversal::nextSkippingChildren(*node, outer Node.get())) {
1015 // Move lastNode up in the tree as much as node was moved up in the 1020 // Move lastNode up in the tree as much as node was moved up in the
1016 // tree by NodeTraversal::nextSkippingChildren, so that the relative depth between 1021 // tree by NodeTraversal::nextSkippingChildren, so that the relative depth between
1017 // node and the original start node is maintained in the clone. 1022 // node and the original start node is maintained in the clone.
1018 while (startNode->parentNode() != node->parentNode()) { 1023 while (startNode && lastNode && startNode->parentNode() != node->par entNode()) {
1019 startNode = startNode->parentNode(); 1024 startNode = startNode->parentNode();
1020 lastNode = lastNode->parentNode(); 1025 lastNode = lastNode->parentNode();
1021 } 1026 }
1022 1027
1028 if (!lastNode || !lastNode->parentNode())
1029 return;
1030
1023 RefPtr<Node> clonedNode = node->cloneNode(true); 1031 RefPtr<Node> clonedNode = node->cloneNode(true);
1024 insertNodeAfter(clonedNode, lastNode); 1032 insertNodeAfter(clonedNode, lastNode);
1025 lastNode = clonedNode.release(); 1033 lastNode = clonedNode.release();
1026 if (node == end.deprecatedNode() || end.deprecatedNode()->isDescenda ntOf(node.get())) 1034 if (node == end.deprecatedNode() || end.deprecatedNode()->isDescenda ntOf(node.get()))
1027 break; 1035 break;
1028 } 1036 }
1029 } 1037 }
1030 } 1038 }
1031 1039
1032 1040
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
1461 return node.release(); 1469 return node.release();
1462 } 1470 }
1463 1471
1464 PassRefPtr<Element> createBlockPlaceholderElement(Document& document) 1472 PassRefPtr<Element> createBlockPlaceholderElement(Document& document)
1465 { 1473 {
1466 RefPtr<Element> breakNode = document.createElement(brTag, false); 1474 RefPtr<Element> breakNode = document.createElement(brTag, false);
1467 return breakNode.release(); 1475 return breakNode.release();
1468 } 1476 }
1469 1477
1470 } // namespace WebCore 1478 } // namespace WebCore
OLDNEW
« no previous file with comments | « LayoutTests/editing/execCommand/indent-nested-blockquotes-crash-expected.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698