summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/editing/DeleteSelectionCommand.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/editing/DeleteSelectionCommand.cpp')
-rw-r--r--Source/WebCore/editing/DeleteSelectionCommand.cpp58
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;