diff options
author | Ben Murdoch <benm@google.com> | 2011-05-16 16:25:10 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2011-05-23 18:54:14 +0100 |
commit | ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb (patch) | |
tree | db769fadd053248f85db67434a5b275224defef7 /Source/WebCore/editing/DeleteSelectionCommand.cpp | |
parent | 52e2557aeb8477967e97fd24f20f8f407a10fa15 (diff) | |
download | external_webkit-ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb.zip external_webkit-ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb.tar.gz external_webkit-ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb.tar.bz2 |
Merge WebKit at r76408: Initial merge by git.
Change-Id: I5b91decbd693ccbf5c1b8354b37cd68cc9a1ea53
Diffstat (limited to 'Source/WebCore/editing/DeleteSelectionCommand.cpp')
-rw-r--r-- | Source/WebCore/editing/DeleteSelectionCommand.cpp | 58 |
1 files changed, 36 insertions, 22 deletions
diff --git a/Source/WebCore/editing/DeleteSelectionCommand.cpp b/Source/WebCore/editing/DeleteSelectionCommand.cpp index 24c1968..3ba5ae9 100644 --- a/Source/WebCore/editing/DeleteSelectionCommand.cpp +++ b/Source/WebCore/editing/DeleteSelectionCommand.cpp @@ -111,9 +111,9 @@ void DeleteSelectionCommand::initializeStartEnd(Position& start, Position& end) // For HRs, we'll get a position at (HR,1) when hitting delete from the beginning of the previous line, or (HR,0) when forward deleting, // but in these cases, we want to delete it, so manually expand the selection if (start.node()->hasTagName(hrTag)) - start = Position(start.node(), 0); + start = positionBeforeNode(start.node()); else if (end.node()->hasTagName(hrTag)) - end = Position(end.node(), 1); + end = positionAfterNode(end.node()); // FIXME: This is only used so that moveParagraphs can avoid the bugs in special element expansion. if (!m_expandForSpecialElements) @@ -256,14 +256,14 @@ void DeleteSelectionCommand::initializePositionData() } } - // We must pass the positions through rangeCompliantEquivalent, since some editing positions + // We must pass call parentAnchoredEquivalent on the positions since some editing positions // that appear inside their nodes aren't really inside them. [hr, 0] is one example. - // FIXME: rangeComplaintEquivalent should eventually be moved into enclosing element getters + // FIXME: parentAnchoredEquivalent should eventually be moved into enclosing element getters // like the one below, since editing functions should obviously accept editing positions. // FIXME: Passing false to enclosingNodeOfType tells it that it's OK to return a non-editable // node. This was done to match existing behavior, but it seems wrong. - m_startBlock = enclosingNodeOfType(rangeCompliantEquivalent(m_downstreamStart), &isBlock, false); - m_endBlock = enclosingNodeOfType(rangeCompliantEquivalent(m_upstreamEnd), &isBlock, false); + m_startBlock = enclosingNodeOfType(m_downstreamStart.parentAnchoredEquivalent(), &isBlock, false); + m_endBlock = enclosingNodeOfType(m_upstreamEnd.parentAnchoredEquivalent(), &isBlock, false); } void DeleteSelectionCommand::saveTypingStyleState() @@ -315,10 +315,22 @@ static void updatePositionForNodeRemoval(Node* node, Position& position) { if (position.isNull()) return; - if (node->parentNode() == position.node() && node->nodeIndex() < (unsigned)position.deprecatedEditingOffset()) - position = Position(position.node(), position.deprecatedEditingOffset() - 1); - if (position.node() == node || position.node()->isDescendantOf(node)) - position = positionInParentBeforeNode(node); + switch (position.anchorType()) { + case Position::PositionIsOffsetInAnchor: + if (position.containerNode() == node->parentNode() && static_cast<unsigned>(position.offsetInContainerNode()) > node->nodeIndex()) + position.moveToOffset(position.offsetInContainerNode() - 1); + else if (node->contains(position.containerNode())) + position = positionInParentBeforeNode(node); + break; + case Position::PositionIsAfterAnchor: + if (node->contains(position.anchorNode())) + position = positionInParentAfterNode(node); + break; + case Position::PositionIsBeforeAnchor: + if (node->contains(position.anchorNode())) + position = positionInParentBeforeNode(node); + break; + } } void DeleteSelectionCommand::removeNode(PassRefPtr<Node> node) @@ -362,7 +374,7 @@ void DeleteSelectionCommand::removeNode(PassRefPtr<Node> node) updateLayout(); RenderObject *r = node->renderer(); if (r && r->isTableCell() && toRenderTableCell(r)->contentHeight() <= 0) - insertBlockPlaceholder(Position(node, 0)); + insertBlockPlaceholder(firstPositionInNode(node.get())); return; } @@ -381,12 +393,13 @@ void DeleteSelectionCommand::removeNode(PassRefPtr<Node> node) static void updatePositionForTextRemoval(Node* node, int offset, int count, Position& position) { - if (position.node() == node) { - if (position.deprecatedEditingOffset() > offset + count) - position = Position(position.node(), position.deprecatedEditingOffset() - count); - else if (position.deprecatedEditingOffset() > offset) - position = Position(position.node(), offset); - } + if (position.anchorType() != Position::PositionIsOffsetInAnchor || position.containerNode() != node) + return; + + if (position.offsetInContainerNode() > offset + count) + position.moveToOffset(position.offsetInContainerNode() - count); + else if (position.offsetInContainerNode() > offset) + position.moveToOffset(offset); } void DeleteSelectionCommand::deleteTextFromNode(PassRefPtr<Text> node, unsigned offset, unsigned count) @@ -463,7 +476,7 @@ void DeleteSelectionCommand::handleGeneralDelete() // handle deleting all nodes that are completely selected while (node && node != m_downstreamEnd.node()) { - if (comparePositions(Position(node.get(), 0), m_downstreamEnd) >= 0) { + if (comparePositions(firstPositionInOrBeforeNode(node.get()), m_downstreamEnd) >= 0) { // traverseNextSibling just blew past the end position, so stop deleting node = 0; } else if (!m_downstreamEnd.node()->isDescendantOf(node.get())) { @@ -471,8 +484,9 @@ void DeleteSelectionCommand::handleGeneralDelete() // if we just removed a node from the end container, update end position so the // check above will work if (node->parentNode() == m_downstreamEnd.node()) { + ASSERT(m_downstreamEnd.deprecatedEditingOffset()); ASSERT(node->nodeIndex() < (unsigned)m_downstreamEnd.deprecatedEditingOffset()); - m_downstreamEnd = Position(m_downstreamEnd.node(), m_downstreamEnd.deprecatedEditingOffset() - 1); + m_downstreamEnd.moveToOffset(m_downstreamEnd.deprecatedEditingOffset() - 1); } removeNode(node.get()); node = nextNode.get(); @@ -513,7 +527,7 @@ void DeleteSelectionCommand::handleGeneralDelete() offset = n->nodeIndex() + 1; } removeChildrenInRange(m_downstreamEnd.node(), offset, m_downstreamEnd.deprecatedEditingOffset()); - m_downstreamEnd = Position(m_downstreamEnd.node(), offset); + m_downstreamEnd.moveToOffset(offset); } } } @@ -609,8 +623,8 @@ void DeleteSelectionCommand::mergeParagraphs() return; } - RefPtr<Range> range = Range::create(document(), rangeCompliantEquivalent(startOfParagraphToMove.deepEquivalent()), rangeCompliantEquivalent(endOfParagraphToMove.deepEquivalent())); - RefPtr<Range> rangeToBeReplaced = Range::create(document(), rangeCompliantEquivalent(mergeDestination.deepEquivalent()), rangeCompliantEquivalent(mergeDestination.deepEquivalent())); + RefPtr<Range> range = Range::create(document(), startOfParagraphToMove.deepEquivalent().parentAnchoredEquivalent(), endOfParagraphToMove.deepEquivalent().parentAnchoredEquivalent()); + RefPtr<Range> rangeToBeReplaced = Range::create(document(), mergeDestination.deepEquivalent().parentAnchoredEquivalent(), mergeDestination.deepEquivalent().parentAnchoredEquivalent()); if (!document()->frame()->editor()->client()->shouldMoveRangeAfterDelete(range.get(), rangeToBeReplaced.get())) return; |