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

Side by Side Diff: third_party/WebKit/Source/core/editing/commands/DeleteSelectionCommand.cpp

Issue 2341053002: Mark the createVisiblePosition overloads as deprecated (Closed)
Patch Set: minor revision Created 4 years, 3 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2005 Apple Computer, Inc. All rights reserved. 2 * Copyright (C) 2005 Apple Computer, 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 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 while (1) { 122 while (1) {
123 startSpecialContainer = 0; 123 startSpecialContainer = 0;
124 endSpecialContainer = 0; 124 endSpecialContainer = 0;
125 125
126 Position s = positionBeforeContainingSpecialElement(start, &startSpecial Container); 126 Position s = positionBeforeContainingSpecialElement(start, &startSpecial Container);
127 Position e = positionAfterContainingSpecialElement(end, &endSpecialConta iner); 127 Position e = positionAfterContainingSpecialElement(end, &endSpecialConta iner);
128 128
129 if (!startSpecialContainer && !endSpecialContainer) 129 if (!startSpecialContainer && !endSpecialContainer)
130 break; 130 break;
131 131
132 if (createVisiblePosition(start).deepEquivalent() != m_selectionToDelete .visibleStart().deepEquivalent() || createVisiblePosition(end).deepEquivalent() != m_selectionToDelete.visibleEnd().deepEquivalent()) 132 if (createVisiblePositionDeprecated(start).deepEquivalent() != m_selecti onToDelete.visibleStart().deepEquivalent() || createVisiblePositionDeprecated(en d).deepEquivalent() != m_selectionToDelete.visibleEnd().deepEquivalent())
133 break; 133 break;
134 134
135 // If we're going to expand to include the startSpecialContainer, it mus t be fully selected. 135 // If we're going to expand to include the startSpecialContainer, it mus t be fully selected.
136 if (startSpecialContainer && !endSpecialContainer && comparePositions(Po sition::inParentAfterNode(*startSpecialContainer), end) > -1) 136 if (startSpecialContainer && !endSpecialContainer && comparePositions(Po sition::inParentAfterNode(*startSpecialContainer), end) > -1)
137 break; 137 break;
138 138
139 // If we're going to expand to include the endSpecialContainer, it must be fully selected. 139 // If we're going to expand to include the endSpecialContainer, it must be fully selected.
140 if (endSpecialContainer && !startSpecialContainer && comparePositions(st art, Position::inParentBeforeNode(*endSpecialContainer)) > -1) 140 if (endSpecialContainer && !startSpecialContainer && comparePositions(st art, Position::inParentBeforeNode(*endSpecialContainer)) > -1)
141 break; 141 break;
142 142
143 if (startSpecialContainer && startSpecialContainer->isDescendantOf(endSp ecialContainer)) { 143 if (startSpecialContainer && startSpecialContainer->isDescendantOf(endSp ecialContainer)) {
144 // Don't adjust the end yet, it is the end of a special element that contains the start 144 // Don't adjust the end yet, it is the end of a special element that contains the start
145 // special element (which may or may not be fully selected). 145 // special element (which may or may not be fully selected).
146 start = s; 146 start = s;
147 } else if (endSpecialContainer && endSpecialContainer->isDescendantOf(st artSpecialContainer)) { 147 } else if (endSpecialContainer && endSpecialContainer->isDescendantOf(st artSpecialContainer)) {
148 // Don't adjust the start yet, it is the start of a special element that contains the end 148 // Don't adjust the start yet, it is the start of a special element that contains the end
149 // special element (which may or may not be fully selected). 149 // special element (which may or may not be fully selected).
150 end = e; 150 end = e;
151 } else { 151 } else {
152 start = s; 152 start = s;
153 end = e; 153 end = e;
154 } 154 }
155 } 155 }
156 } 156 }
157 157
158 void DeleteSelectionCommand::setStartingSelectionOnSmartDelete(const Position& s tart, const Position& end) 158 void DeleteSelectionCommand::setStartingSelectionOnSmartDelete(const Position& s tart, const Position& end)
159 { 159 {
160 bool isBaseFirst = startingSelection().isBaseFirst(); 160 bool isBaseFirst = startingSelection().isBaseFirst();
161 VisiblePosition newBase = createVisiblePosition(isBaseFirst ? start : end); 161 VisiblePosition newBase = createVisiblePositionDeprecated(isBaseFirst ? star t : end);
162 VisiblePosition newExtent = createVisiblePosition(isBaseFirst ? end : start) ; 162 VisiblePosition newExtent = createVisiblePositionDeprecated(isBaseFirst ? en d : start);
163 setStartingSelection(VisibleSelection(newBase, newExtent, startingSelection( ).isDirectional())); 163 setStartingSelection(VisibleSelection(newBase, newExtent, startingSelection( ).isDirectional()));
164 } 164 }
165 165
166 void DeleteSelectionCommand::initializePositionData(EditingState* editingState) 166 void DeleteSelectionCommand::initializePositionData(EditingState* editingState)
167 { 167 {
168 Position start, end; 168 Position start, end;
169 initializeStartEnd(start, end); 169 initializeStartEnd(start, end);
170 DCHECK(start.isNotNull()); 170 DCHECK(start.isNotNull());
171 DCHECK(end.isNotNull()); 171 DCHECK(end.isNotNull());
172 if (!isEditablePosition(start)) { 172 if (!isEditablePosition(start)) {
(...skipping 22 matching lines...) Expand all
195 // tell that function that we don't care if it returns non-editable nodes. 195 // tell that function that we don't care if it returns non-editable nodes.
196 Node* startCell = enclosingNodeOfType(m_upstreamStart, &isTableCell, CanCros sEditingBoundary); 196 Node* startCell = enclosingNodeOfType(m_upstreamStart, &isTableCell, CanCros sEditingBoundary);
197 Node* endCell = enclosingNodeOfType(m_downstreamEnd, &isTableCell, CanCrossE ditingBoundary); 197 Node* endCell = enclosingNodeOfType(m_downstreamEnd, &isTableCell, CanCrossE ditingBoundary);
198 // FIXME: This isn't right. A borderless table with two rows and a single c olumn would appear as two paragraphs. 198 // FIXME: This isn't right. A borderless table with two rows and a single c olumn would appear as two paragraphs.
199 if (endCell && endCell != startCell) 199 if (endCell && endCell != startCell)
200 m_mergeBlocksAfterDelete = false; 200 m_mergeBlocksAfterDelete = false;
201 201
202 // Usually the start and the end of the selection to delete are pulled toget her as a result of the deletion. 202 // Usually the start and the end of the selection to delete are pulled toget her as a result of the deletion.
203 // Sometimes they aren't (like when no merge is requested), so we must choos e one position to hold the caret 203 // Sometimes they aren't (like when no merge is requested), so we must choos e one position to hold the caret
204 // and receive the placeholder after deletion. 204 // and receive the placeholder after deletion.
205 VisiblePosition visibleEnd = createVisiblePosition(m_downstreamEnd); 205 VisiblePosition visibleEnd = createVisiblePositionDeprecated(m_downstreamEnd );
206 if (m_mergeBlocksAfterDelete && !isEndOfParagraph(visibleEnd)) 206 if (m_mergeBlocksAfterDelete && !isEndOfParagraph(visibleEnd))
207 m_endingPosition = m_downstreamEnd; 207 m_endingPosition = m_downstreamEnd;
208 else 208 else
209 m_endingPosition = m_downstreamStart; 209 m_endingPosition = m_downstreamStart;
210 210
211 // We don't want to merge into a block if it will mean changing the quote le vel of content after deleting 211 // We don't want to merge into a block if it will mean changing the quote le vel of content after deleting
212 // selections that contain a whole number paragraphs plus a line break, sinc e it is unclear to most users 212 // selections that contain a whole number paragraphs plus a line break, sinc e it is unclear to most users
213 // that such a selection actually ends at the start of the next paragraph. T his matches TextEdit behavior 213 // that such a selection actually ends at the start of the next paragraph. T his matches TextEdit behavior
214 // for indented paragraphs. 214 // for indented paragraphs.
215 // Only apply this rule if the endingSelection is a range selection. If it is a caret, then other operations have created 215 // Only apply this rule if the endingSelection is a range selection. If it is a caret, then other operations have created
216 // the selection we're deleting (like the process of creating a selection to delete during a backspace), and the user isn't in the situation described above . 216 // the selection we're deleting (like the process of creating a selection to delete during a backspace), and the user isn't in the situation described above .
217 if (numEnclosingMailBlockquotes(start) != numEnclosingMailBlockquotes(end) 217 if (numEnclosingMailBlockquotes(start) != numEnclosingMailBlockquotes(end)
218 && isStartOfParagraph(visibleEnd) && isStartOfParagraph(createVisiblePos ition(start)) 218 && isStartOfParagraph(visibleEnd) && isStartOfParagraph(createVisiblePos itionDeprecated(start))
219 && endingSelection().isRange()) { 219 && endingSelection().isRange()) {
220 m_mergeBlocksAfterDelete = false; 220 m_mergeBlocksAfterDelete = false;
221 m_pruneStartBlockIfNecessary = true; 221 m_pruneStartBlockIfNecessary = true;
222 } 222 }
223 223
224 // Handle leading and trailing whitespace, as well as smart delete adjustmen ts to the selection 224 // Handle leading and trailing whitespace, as well as smart delete adjustmen ts to the selection
225 m_leadingWhitespace = leadingWhitespacePosition(m_upstreamStart, m_selection ToDelete.affinity()); 225 m_leadingWhitespace = leadingWhitespacePosition(m_upstreamStart, m_selection ToDelete.affinity());
226 m_trailingWhitespace = trailingWhitespacePosition(m_downstreamEnd, VP_DEFAUL T_AFFINITY); 226 m_trailingWhitespace = trailingWhitespacePosition(m_downstreamEnd, VP_DEFAUL T_AFFINITY);
227 227
228 if (m_smartDelete) { 228 if (m_smartDelete) {
229 229
230 // skip smart delete if the selection to delete already starts or ends w ith whitespace 230 // skip smart delete if the selection to delete already starts or ends w ith whitespace
231 Position pos = createVisiblePosition(m_upstreamStart, m_selectionToDelet e.affinity()).deepEquivalent(); 231 Position pos = createVisiblePositionDeprecated(m_upstreamStart, m_select ionToDelete.affinity()).deepEquivalent();
232 bool skipSmartDelete = trailingWhitespacePosition(pos, VP_DEFAULT_AFFINI TY, ConsiderNonCollapsibleWhitespace).isNotNull(); 232 bool skipSmartDelete = trailingWhitespacePosition(pos, VP_DEFAULT_AFFINI TY, ConsiderNonCollapsibleWhitespace).isNotNull();
233 if (!skipSmartDelete) 233 if (!skipSmartDelete)
234 skipSmartDelete = leadingWhitespacePosition(m_downstreamEnd, VP_DEFA ULT_AFFINITY, ConsiderNonCollapsibleWhitespace).isNotNull(); 234 skipSmartDelete = leadingWhitespacePosition(m_downstreamEnd, VP_DEFA ULT_AFFINITY, ConsiderNonCollapsibleWhitespace).isNotNull();
235 235
236 // extend selection upstream if there is whitespace there 236 // extend selection upstream if there is whitespace there
237 bool hasLeadingWhitespaceBeforeAdjustment = leadingWhitespacePosition(m_ upstreamStart, m_selectionToDelete.affinity(), ConsiderNonCollapsibleWhitespace) .isNotNull(); 237 bool hasLeadingWhitespaceBeforeAdjustment = leadingWhitespacePosition(m_ upstreamStart, m_selectionToDelete.affinity(), ConsiderNonCollapsibleWhitespace) .isNotNull();
238 if (!skipSmartDelete && hasLeadingWhitespaceBeforeAdjustment) { 238 if (!skipSmartDelete && hasLeadingWhitespaceBeforeAdjustment) {
239 VisiblePosition visiblePos = previousPositionOf(createVisiblePositio n(m_upstreamStart, VP_DEFAULT_AFFINITY)); 239 VisiblePosition visiblePos = previousPositionOf(createVisiblePositio nDeprecated(m_upstreamStart, VP_DEFAULT_AFFINITY));
240 pos = visiblePos.deepEquivalent(); 240 pos = visiblePos.deepEquivalent();
241 // Expand out one character upstream for smart delete and recalculat e 241 // Expand out one character upstream for smart delete and recalculat e
242 // positions based on this change. 242 // positions based on this change.
243 m_upstreamStart = mostBackwardCaretPosition(pos); 243 m_upstreamStart = mostBackwardCaretPosition(pos);
244 m_downstreamStart = mostForwardCaretPosition(pos); 244 m_downstreamStart = mostForwardCaretPosition(pos);
245 m_leadingWhitespace = leadingWhitespacePosition(m_upstreamStart, vis iblePos.affinity()); 245 m_leadingWhitespace = leadingWhitespacePosition(m_upstreamStart, vis iblePos.affinity());
246 246
247 setStartingSelectionOnSmartDelete(m_upstreamStart, m_upstreamEnd); 247 setStartingSelectionOnSmartDelete(m_upstreamStart, m_upstreamEnd);
248 } 248 }
249 249
250 // trailing whitespace is only considered for smart delete if there is n o leading 250 // trailing whitespace is only considered for smart delete if there is n o leading
251 // whitespace, as in the case where you double-click the first word of a paragraph. 251 // whitespace, as in the case where you double-click the first word of a paragraph.
252 if (!skipSmartDelete && !hasLeadingWhitespaceBeforeAdjustment && trailin gWhitespacePosition(m_downstreamEnd, VP_DEFAULT_AFFINITY, ConsiderNonCollapsible Whitespace).isNotNull()) { 252 if (!skipSmartDelete && !hasLeadingWhitespaceBeforeAdjustment && trailin gWhitespacePosition(m_downstreamEnd, VP_DEFAULT_AFFINITY, ConsiderNonCollapsible Whitespace).isNotNull()) {
253 // Expand out one character downstream for smart delete and recalcul ate 253 // Expand out one character downstream for smart delete and recalcul ate
254 // positions based on this change. 254 // positions based on this change.
255 pos = nextPositionOf(createVisiblePosition(m_downstreamEnd, VP_DEFAU LT_AFFINITY)).deepEquivalent(); 255 pos = nextPositionOf(createVisiblePositionDeprecated(m_downstreamEnd , VP_DEFAULT_AFFINITY)).deepEquivalent();
256 m_upstreamEnd = mostBackwardCaretPosition(pos); 256 m_upstreamEnd = mostBackwardCaretPosition(pos);
257 m_downstreamEnd = mostForwardCaretPosition(pos); 257 m_downstreamEnd = mostForwardCaretPosition(pos);
258 m_trailingWhitespace = trailingWhitespacePosition(m_downstreamEnd, V P_DEFAULT_AFFINITY); 258 m_trailingWhitespace = trailingWhitespacePosition(m_downstreamEnd, V P_DEFAULT_AFFINITY);
259 259
260 setStartingSelectionOnSmartDelete(m_downstreamStart, m_downstreamEnd ); 260 setStartingSelectionOnSmartDelete(m_downstreamStart, m_downstreamEnd );
261 } 261 }
262 } 262 }
263 263
264 // We must pass call parentAnchoredEquivalent on the positions since some ed iting positions 264 // We must pass call parentAnchoredEquivalent on the positions since some ed iting positions
265 // that appear inside their nodes aren't really inside them. [hr, 0] is one example. 265 // that appear inside their nodes aren't really inside them. [hr, 0] is one example.
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 return; 638 return;
639 639
640 // FIXME: The deletion algorithm shouldn't let this happen. 640 // FIXME: The deletion algorithm shouldn't let this happen.
641 if (comparePositions(m_upstreamStart, m_downstreamEnd) > 0) 641 if (comparePositions(m_upstreamStart, m_downstreamEnd) > 0)
642 return; 642 return;
643 643
644 // There's nothing to merge. 644 // There's nothing to merge.
645 if (m_upstreamStart == m_downstreamEnd) 645 if (m_upstreamStart == m_downstreamEnd)
646 return; 646 return;
647 647
648 VisiblePosition startOfParagraphToMove = createVisiblePosition(m_downstreamE nd); 648 VisiblePosition startOfParagraphToMove = createVisiblePositionDeprecated(m_d ownstreamEnd);
649 VisiblePosition mergeDestination = createVisiblePosition(m_upstreamStart); 649 VisiblePosition mergeDestination = createVisiblePositionDeprecated(m_upstrea mStart);
650 650
651 // m_downstreamEnd's block has been emptied out by deletion. There is no co ntent inside of it to 651 // m_downstreamEnd's block has been emptied out by deletion. There is no co ntent inside of it to
652 // move, so just remove it. 652 // move, so just remove it.
653 Element* endBlock = enclosingBlock(m_downstreamEnd.anchorNode()); 653 Element* endBlock = enclosingBlock(m_downstreamEnd.anchorNode());
654 if (!endBlock || !endBlock->contains(startOfParagraphToMove.deepEquivalent() .anchorNode()) || !startOfParagraphToMove.deepEquivalent().anchorNode()) { 654 if (!endBlock || !endBlock->contains(startOfParagraphToMove.deepEquivalent() .anchorNode()) || !startOfParagraphToMove.deepEquivalent().anchorNode()) {
655 removeNode(enclosingBlock(m_downstreamEnd.anchorNode()), editingState); 655 removeNode(enclosingBlock(m_downstreamEnd.anchorNode()), editingState);
656 return; 656 return;
657 } 657 }
658 658
659 // We need to merge into m_upstreamStart's block, but it's been emptied out and collapsed by deletion. 659 // We need to merge into m_upstreamStart's block, but it's been emptied out and collapsed by deletion.
660 if (!mergeDestination.deepEquivalent().anchorNode() || (!mergeDestination.de epEquivalent().anchorNode()->isDescendantOf(enclosingBlock(m_upstreamStart.compu teContainerNode())) && (!mergeDestination.deepEquivalent().anchorNode()->hasChil dren() || !m_upstreamStart.computeContainerNode()->hasChildren())) || (m_startsA tEmptyLine && mergeDestination.deepEquivalent() != startOfParagraphToMove.deepEq uivalent())) { 660 if (!mergeDestination.deepEquivalent().anchorNode() || (!mergeDestination.de epEquivalent().anchorNode()->isDescendantOf(enclosingBlock(m_upstreamStart.compu teContainerNode())) && (!mergeDestination.deepEquivalent().anchorNode()->hasChil dren() || !m_upstreamStart.computeContainerNode()->hasChildren())) || (m_startsA tEmptyLine && mergeDestination.deepEquivalent() != startOfParagraphToMove.deepEq uivalent())) {
661 insertNodeAt(HTMLBRElement::create(document()), m_upstreamStart, editing State); 661 insertNodeAt(HTMLBRElement::create(document()), m_upstreamStart, editing State);
662 if (editingState->isAborted()) 662 if (editingState->isAborted())
663 return; 663 return;
664 mergeDestination = createVisiblePosition(m_upstreamStart); 664 mergeDestination = createVisiblePositionDeprecated(m_upstreamStart);
665 } 665 }
666 666
667 if (mergeDestination.deepEquivalent() == startOfParagraphToMove.deepEquivale nt()) 667 if (mergeDestination.deepEquivalent() == startOfParagraphToMove.deepEquivale nt())
668 return; 668 return;
669 669
670 VisiblePosition endOfParagraphToMove = endOfParagraph(startOfParagraphToMove , CanSkipOverEditingBoundary); 670 VisiblePosition endOfParagraphToMove = endOfParagraph(startOfParagraphToMove , CanSkipOverEditingBoundary);
671 671
672 if (mergeDestination.deepEquivalent() == endOfParagraphToMove.deepEquivalent ()) 672 if (mergeDestination.deepEquivalent() == endOfParagraphToMove.deepEquivalent ())
673 return; 673 return;
674 674
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
857 if (m_selectionToDelete.end().anchorNode()->isDescendantOf(table)) 857 if (m_selectionToDelete.end().anchorNode()->isDescendantOf(table))
858 m_needPlaceholder = false; 858 m_needPlaceholder = false;
859 } 859 }
860 } 860 }
861 861
862 // set up our state 862 // set up our state
863 initializePositionData(editingState); 863 initializePositionData(editingState);
864 if (editingState->isAborted()) 864 if (editingState->isAborted())
865 return; 865 return;
866 866
867 bool lineBreakBeforeStart = lineBreakExistsAtVisiblePosition(previousPositio nOf(createVisiblePosition(m_upstreamStart))); 867 bool lineBreakBeforeStart = lineBreakExistsAtVisiblePosition(previousPositio nOf(createVisiblePositionDeprecated(m_upstreamStart)));
868 868
869 // Delete any text that may hinder our ability to fixup whitespace after the 869 // Delete any text that may hinder our ability to fixup whitespace after the
870 // delete 870 // delete
871 deleteInsignificantTextDownstream(m_trailingWhitespace); 871 deleteInsignificantTextDownstream(m_trailingWhitespace);
872 872
873 saveTypingStyleState(); 873 saveTypingStyleState();
874 874
875 // deleting just a BR is handled specially, at least because we do not 875 // deleting just a BR is handled specially, at least because we do not
876 // want to replace it with a placeholder BR! 876 // want to replace it with a placeholder BR!
877 bool brResult = handleSpecialCaseBRDelete(editingState); 877 bool brResult = handleSpecialCaseBRDelete(editingState);
(...skipping 15 matching lines...) Expand all
893 893
894 mergeParagraphs(editingState); 894 mergeParagraphs(editingState);
895 if (editingState->isAborted()) 895 if (editingState->isAborted())
896 return; 896 return;
897 897
898 removePreviouslySelectedEmptyTableRows(editingState); 898 removePreviouslySelectedEmptyTableRows(editingState);
899 if (editingState->isAborted()) 899 if (editingState->isAborted())
900 return; 900 return;
901 901
902 if (!m_needPlaceholder && rootWillStayOpenWithoutPlaceholder) { 902 if (!m_needPlaceholder && rootWillStayOpenWithoutPlaceholder) {
903 VisiblePosition visualEnding = createVisiblePosition(m_endingPosition); 903 VisiblePosition visualEnding = createVisiblePositionDeprecated(m_endingP osition);
904 bool hasPlaceholder = lineBreakExistsAtVisiblePosition(visualEnding) 904 bool hasPlaceholder = lineBreakExistsAtVisiblePosition(visualEnding)
905 && nextPositionOf(visualEnding, CannotCrossEditingBoundary).isNull() ; 905 && nextPositionOf(visualEnding, CannotCrossEditingBoundary).isNull() ;
906 m_needPlaceholder = hasPlaceholder && lineBreakBeforeStart && !lineBreak AtEndOfSelectionToDelete; 906 m_needPlaceholder = hasPlaceholder && lineBreakBeforeStart && !lineBreak AtEndOfSelectionToDelete;
907 } 907 }
908 908
909 HTMLBRElement* placeholder = m_needPlaceholder ? HTMLBRElement::create(docum ent()) : nullptr; 909 HTMLBRElement* placeholder = m_needPlaceholder ? HTMLBRElement::create(docum ent()) : nullptr;
910 910
911 if (placeholder) { 911 if (placeholder) {
912 if (m_sanitizeMarkup) { 912 if (m_sanitizeMarkup) {
913 removeRedundantBlocks(editingState); 913 removeRedundantBlocks(editingState);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
963 visitor->trace(m_deleteIntoBlockquoteStyle); 963 visitor->trace(m_deleteIntoBlockquoteStyle);
964 visitor->trace(m_startRoot); 964 visitor->trace(m_startRoot);
965 visitor->trace(m_endRoot); 965 visitor->trace(m_endRoot);
966 visitor->trace(m_startTableRow); 966 visitor->trace(m_startTableRow);
967 visitor->trace(m_endTableRow); 967 visitor->trace(m_endTableRow);
968 visitor->trace(m_temporaryPlaceholder); 968 visitor->trace(m_temporaryPlaceholder);
969 CompositeEditCommand::trace(visitor); 969 CompositeEditCommand::trace(visitor);
970 } 970 }
971 971
972 } // namespace blink 972 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698