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

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

Issue 23822003: Have EditCommand classes deal with Document references, not pointers (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/editing/DeleteSelectionCommand.h ('k') | Source/core/editing/EditCommand.h » ('j') | 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 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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 if (!isTableRow(row)) 60 if (!isTableRow(row))
61 return false; 61 return false;
62 62
63 for (Node* child = row->firstChild(); child; child = child->nextSibling()) 63 for (Node* child = row->firstChild(); child; child = child->nextSibling())
64 if (isTableCell(child) && !isTableCellEmpty(child)) 64 if (isTableCell(child) && !isTableCellEmpty(child))
65 return false; 65 return false;
66 66
67 return true; 67 return true;
68 } 68 }
69 69
70 DeleteSelectionCommand::DeleteSelectionCommand(Document *document, bool smartDel ete, bool mergeBlocksAfterDelete, bool replace, bool expandForSpecialElements, b ool sanitizeMarkup) 70 DeleteSelectionCommand::DeleteSelectionCommand(Document& document, bool smartDel ete, bool mergeBlocksAfterDelete, bool replace, bool expandForSpecialElements, b ool sanitizeMarkup)
71 : CompositeEditCommand(document) 71 : CompositeEditCommand(document)
72 , m_hasSelectionToDelete(false) 72 , m_hasSelectionToDelete(false)
73 , m_smartDelete(smartDelete) 73 , m_smartDelete(smartDelete)
74 , m_mergeBlocksAfterDelete(mergeBlocksAfterDelete) 74 , m_mergeBlocksAfterDelete(mergeBlocksAfterDelete)
75 , m_needPlaceholder(false) 75 , m_needPlaceholder(false)
76 , m_replace(replace) 76 , m_replace(replace)
77 , m_expandForSpecialElements(expandForSpecialElements) 77 , m_expandForSpecialElements(expandForSpecialElements)
78 , m_pruneStartBlockIfNecessary(false) 78 , m_pruneStartBlockIfNecessary(false)
79 , m_startsAtEmptyLine(false) 79 , m_startsAtEmptyLine(false)
80 , m_sanitizeMarkup(sanitizeMarkup) 80 , m_sanitizeMarkup(sanitizeMarkup)
81 , m_startBlock(0) 81 , m_startBlock(0)
82 , m_endBlock(0) 82 , m_endBlock(0)
83 , m_typingStyle(0) 83 , m_typingStyle(0)
84 , m_deleteIntoBlockquoteStyle(0) 84 , m_deleteIntoBlockquoteStyle(0)
85 { 85 {
86 } 86 }
87 87
88 DeleteSelectionCommand::DeleteSelectionCommand(const VisibleSelection& selection , bool smartDelete, bool mergeBlocksAfterDelete, bool replace, bool expandForSpe cialElements, bool sanitizeMarkup) 88 DeleteSelectionCommand::DeleteSelectionCommand(const VisibleSelection& selection , bool smartDelete, bool mergeBlocksAfterDelete, bool replace, bool expandForSpe cialElements, bool sanitizeMarkup)
89 : CompositeEditCommand(&selection.start().anchorNode()->document()) 89 : CompositeEditCommand(selection.start().anchorNode()->document())
90 , m_hasSelectionToDelete(true) 90 , m_hasSelectionToDelete(true)
91 , m_smartDelete(smartDelete) 91 , m_smartDelete(smartDelete)
92 , m_mergeBlocksAfterDelete(mergeBlocksAfterDelete) 92 , m_mergeBlocksAfterDelete(mergeBlocksAfterDelete)
93 , m_needPlaceholder(false) 93 , m_needPlaceholder(false)
94 , m_replace(replace) 94 , m_replace(replace)
95 , m_expandForSpecialElements(expandForSpecialElements) 95 , m_expandForSpecialElements(expandForSpecialElements)
96 , m_pruneStartBlockIfNecessary(false) 96 , m_pruneStartBlockIfNecessary(false)
97 , m_startsAtEmptyLine(false) 97 , m_startsAtEmptyLine(false)
98 , m_sanitizeMarkup(sanitizeMarkup) 98 , m_sanitizeMarkup(sanitizeMarkup)
99 , m_selectionToDelete(selection) 99 , m_selectionToDelete(selection)
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 // Do not remove an element of table structure; remove its contents. 372 // Do not remove an element of table structure; remove its contents.
373 // Likewise for the root editable element. 373 // Likewise for the root editable element.
374 Node* child = node->firstChild(); 374 Node* child = node->firstChild();
375 while (child) { 375 while (child) {
376 Node* remove = child; 376 Node* remove = child;
377 child = child->nextSibling(); 377 child = child->nextSibling();
378 removeNode(remove, shouldAssumeContentIsAlwaysEditable); 378 removeNode(remove, shouldAssumeContentIsAlwaysEditable);
379 } 379 }
380 380
381 // Make sure empty cell has some height, if a placeholder can be inserte d. 381 // Make sure empty cell has some height, if a placeholder can be inserte d.
382 document()->updateLayoutIgnorePendingStylesheets(); 382 document().updateLayoutIgnorePendingStylesheets();
383 RenderObject *r = node->renderer(); 383 RenderObject *r = node->renderer();
384 if (r && r->isTableCell() && toRenderTableCell(r)->contentHeight() <= 0) { 384 if (r && r->isTableCell() && toRenderTableCell(r)->contentHeight() <= 0) {
385 Position firstEditablePosition = firstEditablePositionInNode(node.ge t()); 385 Position firstEditablePosition = firstEditablePositionInNode(node.ge t());
386 if (firstEditablePosition.isNotNull()) 386 if (firstEditablePosition.isNotNull())
387 insertBlockPlaceholder(firstEditablePosition); 387 insertBlockPlaceholder(firstEditablePosition);
388 } 388 }
389 return; 389 return;
390 } 390 }
391 391
392 if (node == m_startBlock && !isEndOfBlock(VisiblePosition(firstPositionInNod e(m_startBlock.get())).previous())) 392 if (node == m_startBlock && !isEndOfBlock(VisiblePosition(firstPositionInNod e(m_startBlock.get())).previous()))
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 removeChildrenInRange(m_downstreamEnd.deprecatedNode(), offs et, m_downstreamEnd.deprecatedEditingOffset()); 561 removeChildrenInRange(m_downstreamEnd.deprecatedNode(), offs et, m_downstreamEnd.deprecatedEditingOffset());
562 m_downstreamEnd = createLegacyEditingPosition(m_downstreamEn d.deprecatedNode(), offset); 562 m_downstreamEnd = createLegacyEditingPosition(m_downstreamEn d.deprecatedNode(), offset);
563 } 563 }
564 } 564 }
565 } 565 }
566 } 566 }
567 } 567 }
568 568
569 void DeleteSelectionCommand::fixupWhitespace() 569 void DeleteSelectionCommand::fixupWhitespace()
570 { 570 {
571 document()->updateLayoutIgnorePendingStylesheets(); 571 document().updateLayoutIgnorePendingStylesheets();
572 // FIXME: isRenderedCharacter should be removed, and we should use VisiblePo sition::characterAfter and VisiblePosition::characterBefore 572 // FIXME: isRenderedCharacter should be removed, and we should use VisiblePo sition::characterAfter and VisiblePosition::characterBefore
573 if (m_leadingWhitespace.isNotNull() && !m_leadingWhitespace.isRenderedCharac ter() && m_leadingWhitespace.deprecatedNode()->isTextNode()) { 573 if (m_leadingWhitespace.isNotNull() && !m_leadingWhitespace.isRenderedCharac ter() && m_leadingWhitespace.deprecatedNode()->isTextNode()) {
574 Text* textNode = toText(m_leadingWhitespace.deprecatedNode()); 574 Text* textNode = toText(m_leadingWhitespace.deprecatedNode());
575 ASSERT(!textNode->renderer() || textNode->renderer()->style()->collapseW hiteSpace()); 575 ASSERT(!textNode->renderer() || textNode->renderer()->style()->collapseW hiteSpace());
576 replaceTextInNodePreservingMarkers(textNode, m_leadingWhitespace.depreca tedEditingOffset(), 1, nonBreakingSpaceString()); 576 replaceTextInNodePreservingMarkers(textNode, m_leadingWhitespace.depreca tedEditingOffset(), 1, nonBreakingSpaceString());
577 } 577 }
578 if (m_trailingWhitespace.isNotNull() && !m_trailingWhitespace.isRenderedChar acter() && m_trailingWhitespace.deprecatedNode()->isTextNode()) { 578 if (m_trailingWhitespace.isNotNull() && !m_trailingWhitespace.isRenderedChar acter() && m_trailingWhitespace.deprecatedNode()->isTextNode()) {
579 Text* textNode = toText(m_trailingWhitespace.deprecatedNode()); 579 Text* textNode = toText(m_trailingWhitespace.deprecatedNode());
580 ASSERT(!textNode->renderer() ||textNode->renderer()->style()->collapseWh iteSpace()); 580 ASSERT(!textNode->renderer() ||textNode->renderer()->style()->collapseWh iteSpace());
581 replaceTextInNodePreservingMarkers(textNode, m_trailingWhitespace.deprec atedEditingOffset(), 1, nonBreakingSpaceString()); 581 replaceTextInNodePreservingMarkers(textNode, m_trailingWhitespace.deprec atedEditingOffset(), 1, nonBreakingSpaceString());
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
618 // m_downstreamEnd's block has been emptied out by deletion. There is no co ntent inside of it to 618 // m_downstreamEnd's block has been emptied out by deletion. There is no co ntent inside of it to
619 // move, so just remove it. 619 // move, so just remove it.
620 Element* endBlock = enclosingBlock(m_downstreamEnd.deprecatedNode()); 620 Element* endBlock = enclosingBlock(m_downstreamEnd.deprecatedNode());
621 if (!endBlock || !endBlock->contains(startOfParagraphToMove.deepEquivalent() .deprecatedNode()) || !startOfParagraphToMove.deepEquivalent().deprecatedNode()) { 621 if (!endBlock || !endBlock->contains(startOfParagraphToMove.deepEquivalent() .deprecatedNode()) || !startOfParagraphToMove.deepEquivalent().deprecatedNode()) {
622 removeNode(enclosingBlock(m_downstreamEnd.deprecatedNode())); 622 removeNode(enclosingBlock(m_downstreamEnd.deprecatedNode()));
623 return; 623 return;
624 } 624 }
625 625
626 // We need to merge into m_upstreamStart's block, but it's been emptied out and collapsed by deletion. 626 // We need to merge into m_upstreamStart's block, but it's been emptied out and collapsed by deletion.
627 if (!mergeDestination.deepEquivalent().deprecatedNode() || !mergeDestination .deepEquivalent().deprecatedNode()->isDescendantOf(enclosingBlock(m_upstreamStar t.containerNode())) || m_startsAtEmptyLine) { 627 if (!mergeDestination.deepEquivalent().deprecatedNode() || !mergeDestination .deepEquivalent().deprecatedNode()->isDescendantOf(enclosingBlock(m_upstreamStar t.containerNode())) || m_startsAtEmptyLine) {
628 insertNodeAt(createBreakElement(document()).get(), m_upstreamStart); 628 insertNodeAt(createBreakElement(&document()).get(), m_upstreamStart);
629 mergeDestination = VisiblePosition(m_upstreamStart); 629 mergeDestination = VisiblePosition(m_upstreamStart);
630 } 630 }
631 631
632 if (mergeDestination == startOfParagraphToMove) 632 if (mergeDestination == startOfParagraphToMove)
633 return; 633 return;
634 634
635 VisiblePosition endOfParagraphToMove = endOfParagraph(startOfParagraphToMove ); 635 VisiblePosition endOfParagraphToMove = endOfParagraph(startOfParagraphToMove );
636 636
637 if (mergeDestination == endOfParagraphToMove) 637 if (mergeDestination == endOfParagraphToMove)
638 return; 638 return;
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 m_typingStyle = m_deleteIntoBlockquoteStyle; 718 m_typingStyle = m_deleteIntoBlockquoteStyle;
719 m_deleteIntoBlockquoteStyle = 0; 719 m_deleteIntoBlockquoteStyle = 0;
720 720
721 m_typingStyle->prepareToApplyAt(m_endingPosition); 721 m_typingStyle->prepareToApplyAt(m_endingPosition);
722 if (m_typingStyle->isEmpty()) 722 if (m_typingStyle->isEmpty())
723 m_typingStyle = 0; 723 m_typingStyle = 0;
724 // This is where we've deleted all traces of a style but not a whole paragra ph (that's handled above). 724 // This is where we've deleted all traces of a style but not a whole paragra ph (that's handled above).
725 // In this case if we start typing, the new characters should have the same style as the just deleted ones, 725 // In this case if we start typing, the new characters should have the same style as the just deleted ones,
726 // but, if we change the selection, come back and start typing that style sh ould be lost. Also see 726 // but, if we change the selection, come back and start typing that style sh ould be lost. Also see
727 // preserveTypingStyle() below. 727 // preserveTypingStyle() below.
728 document()->frame()->selection()->setTypingStyle(m_typingStyle); 728 document().frame()->selection()->setTypingStyle(m_typingStyle);
729 } 729 }
730 730
731 void DeleteSelectionCommand::clearTransientState() 731 void DeleteSelectionCommand::clearTransientState()
732 { 732 {
733 m_selectionToDelete = VisibleSelection(); 733 m_selectionToDelete = VisibleSelection();
734 m_upstreamStart.clear(); 734 m_upstreamStart.clear();
735 m_downstreamStart.clear(); 735 m_downstreamStart.clear();
736 m_upstreamEnd.clear(); 736 m_upstreamEnd.clear();
737 m_downstreamEnd.clear(); 737 m_downstreamEnd.clear();
738 m_endingPosition.clear(); 738 m_endingPosition.clear();
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
818 818
819 if (!m_needPlaceholder && rootWillStayOpenWithoutPlaceholder) { 819 if (!m_needPlaceholder && rootWillStayOpenWithoutPlaceholder) {
820 VisiblePosition visualEnding(m_endingPosition); 820 VisiblePosition visualEnding(m_endingPosition);
821 m_needPlaceholder = !isStartOfParagraph(visualEnding, CanCrossEditingBou ndary) 821 m_needPlaceholder = !isStartOfParagraph(visualEnding, CanCrossEditingBou ndary)
822 && isEndOfParagraph(visualEnding, CanCrossEditingBoundary) 822 && isEndOfParagraph(visualEnding, CanCrossEditingBoundary)
823 && lineBreakExistsAtVisiblePosition(visualEnding) 823 && lineBreakExistsAtVisiblePosition(visualEnding)
824 && visualEnding.next(CannotCrossEditingBoundary).isNull() 824 && visualEnding.next(CannotCrossEditingBoundary).isNull()
825 && lineBreakBeforeStart; 825 && lineBreakBeforeStart;
826 } 826 }
827 827
828 RefPtr<Node> placeholder = m_needPlaceholder ? createBreakElement(document() ).get() : 0; 828 RefPtr<Node> placeholder = m_needPlaceholder ? createBreakElement(&document( )).get() : 0;
829 829
830 if (placeholder) { 830 if (placeholder) {
831 if (m_sanitizeMarkup) 831 if (m_sanitizeMarkup)
832 removeRedundantBlocks(); 832 removeRedundantBlocks();
833 insertNodeAt(placeholder.get(), m_endingPosition); 833 insertNodeAt(placeholder.get(), m_endingPosition);
834 } 834 }
835 835
836 rebalanceWhitespaceAt(m_endingPosition); 836 rebalanceWhitespaceAt(m_endingPosition);
837 837
838 calculateTypingStyleAfterDelete(); 838 calculateTypingStyleAfterDelete();
(...skipping 12 matching lines...) Expand all
851 851
852 // Normally deletion doesn't preserve the typing style that was present before i t. For example, 852 // Normally deletion doesn't preserve the typing style that was present before i t. For example,
853 // type a character, Bold, then delete the character and start typing. The Bold typing style shouldn't 853 // type a character, Bold, then delete the character and start typing. The Bold typing style shouldn't
854 // stick around. Deletion should preserve a typing style that *it* sets, howeve r. 854 // stick around. Deletion should preserve a typing style that *it* sets, howeve r.
855 bool DeleteSelectionCommand::preservesTypingStyle() const 855 bool DeleteSelectionCommand::preservesTypingStyle() const
856 { 856 {
857 return m_typingStyle; 857 return m_typingStyle;
858 } 858 }
859 859
860 } // namespace WebCore 860 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/editing/DeleteSelectionCommand.h ('k') | Source/core/editing/EditCommand.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698