Index: Source/core/editing/IndentOutdentCommand.cpp |
diff --git a/Source/core/editing/IndentOutdentCommand.cpp b/Source/core/editing/IndentOutdentCommand.cpp |
index d4230bd440340183d5549f4c20efde2d22d53c31..28034c8b3d87f90d1279686ef7b5020daee2997d 100644 |
--- a/Source/core/editing/IndentOutdentCommand.cpp |
+++ b/Source/core/editing/IndentOutdentCommand.cpp |
@@ -40,9 +40,12 @@ namespace blink { |
using namespace HTMLNames; |
-static bool isListOrIndentBlockquote(const Node* node) |
+static bool isHTMLListOrBlockquoteElement(const Node* node) |
{ |
- return node && (isHTMLUListElement(*node) || isHTMLOListElement(*node) || node->hasTagName(blockquoteTag)); |
+ if (!node || !node->isHTMLElement()) |
+ return false; |
+ const HTMLElement& element = toHTMLElement(*node); |
+ return isHTMLUListElement(element) || isHTMLOListElement(element) || element.hasTagName(blockquoteTag); |
} |
IndentOutdentCommand::IndentOutdentCommand(Document& document, EIndentType typeOfAction) |
@@ -55,15 +58,15 @@ bool IndentOutdentCommand::tryIndentingAsListItem(const Position& start, const P |
{ |
// If our selection is not inside a list, bail out. |
RefPtrWillBeRawPtr<Node> lastNodeInSelectedParagraph = start.deprecatedNode(); |
- RefPtrWillBeRawPtr<Element> listNode = enclosingList(lastNodeInSelectedParagraph.get()); |
- if (!listNode) |
+ RefPtrWillBeRawPtr<HTMLElement> listElement = enclosingList(lastNodeInSelectedParagraph.get()); |
+ if (!listElement) |
return false; |
// Find the block that we want to indent. If it's not a list item (e.g., a div inside a list item), we bail out. |
RefPtrWillBeRawPtr<Element> selectedListItem = enclosingBlock(lastNodeInSelectedParagraph.get()); |
// FIXME: we need to deal with the case where there is no li (malformed HTML) |
- if (!selectedListItem || !isHTMLLIElement(*selectedListItem)) |
+ if (!isHTMLLIElement(selectedListItem)) |
return false; |
// FIXME: previousElementSibling does not ignore non-rendered content like <span></span>. Should we? |
@@ -73,7 +76,7 @@ bool IndentOutdentCommand::tryIndentingAsListItem(const Position& start, const P |
// We should calculate visible range in list item because inserting new |
// list element will change visibility of list item, e.g. :first-child |
// CSS selector. |
- RefPtrWillBeRawPtr<Element> newList = document().createElement(listNode->tagQName(), false); |
+ RefPtrWillBeRawPtr<HTMLElement> newList = toHTMLElement(document().createElement(listElement->tagQName(), false).get()); |
insertNodeBefore(newList, selectedListItem.get()); |
// We should clone all the children of the list item for indenting purposes. However, in case the current |
@@ -96,19 +99,19 @@ bool IndentOutdentCommand::tryIndentingAsListItem(const Position& start, const P |
void IndentOutdentCommand::indentIntoBlockquote(const Position& start, const Position& end, RefPtrWillBeRawPtr<HTMLElement>& targetBlockquote) |
{ |
- Node* enclosingCell = enclosingNodeOfType(start, &isTableCell); |
- Node* nodeToSplitTo; |
+ Element* enclosingCell = toElement(enclosingNodeOfType(start, &isTableCell)); |
+ Element* elementToSplitTo; |
if (enclosingCell) |
- nodeToSplitTo = enclosingCell; |
+ elementToSplitTo = enclosingCell; |
else if (enclosingList(start.containerNode())) |
- nodeToSplitTo = enclosingBlock(start.containerNode()); |
+ elementToSplitTo = enclosingBlock(start.containerNode()); |
else |
- nodeToSplitTo = editableRootForPosition(start); |
+ elementToSplitTo = editableRootForPosition(start); |
- if (!nodeToSplitTo) |
+ if (!elementToSplitTo) |
return; |
- RefPtrWillBeRawPtr<Node> outerBlock = (start.containerNode() == nodeToSplitTo) ? start.containerNode() : splitTreeToNode(start.containerNode(), nodeToSplitTo).get(); |
+ RefPtrWillBeRawPtr<Node> outerBlock = (start.containerNode() == elementToSplitTo) ? start.containerNode() : splitTreeToNode(start.containerNode(), elementToSplitTo).get(); |
VisiblePosition startOfContents(start); |
if (!targetBlockquote) { |
@@ -133,40 +136,40 @@ void IndentOutdentCommand::outdentParagraph() |
VisiblePosition visibleStartOfParagraph = startOfParagraph(endingSelection().visibleStart()); |
VisiblePosition visibleEndOfParagraph = endOfParagraph(visibleStartOfParagraph); |
- Node* enclosingNode = enclosingNodeOfType(visibleStartOfParagraph.deepEquivalent(), &isListOrIndentBlockquote); |
- if (!enclosingNode || !enclosingNode->parentNode()->hasEditableStyle()) // We can't outdent if there is no place to go! |
+ HTMLElement* enclosingElement = toHTMLElement(enclosingNodeOfType(visibleStartOfParagraph.deepEquivalent(), &isHTMLListOrBlockquoteElement)); |
+ if (!enclosingElement || !enclosingElement->parentNode()->hasEditableStyle()) // We can't outdent if there is no place to go! |
return; |
// Use InsertListCommand to remove the selection from the list |
- if (isHTMLOListElement(*enclosingNode)) { |
+ if (isHTMLOListElement(*enclosingElement)) { |
applyCommandToComposite(InsertListCommand::create(document(), InsertListCommand::OrderedList)); |
return; |
} |
- if (isHTMLUListElement(*enclosingNode)) { |
+ if (isHTMLUListElement(*enclosingElement)) { |
applyCommandToComposite(InsertListCommand::create(document(), InsertListCommand::UnorderedList)); |
return; |
} |
// The selection is inside a blockquote i.e. enclosingNode is a blockquote |
- VisiblePosition positionInEnclosingBlock = VisiblePosition(firstPositionInNode(enclosingNode)); |
+ VisiblePosition positionInEnclosingBlock = VisiblePosition(firstPositionInNode(enclosingElement)); |
// If the blockquote is inline, the start of the enclosing block coincides with |
// positionInEnclosingBlock. |
- VisiblePosition startOfEnclosingBlock = (enclosingNode->renderer() && enclosingNode->renderer()->isInline()) ? positionInEnclosingBlock : startOfBlock(positionInEnclosingBlock); |
- VisiblePosition lastPositionInEnclosingBlock = VisiblePosition(lastPositionInNode(enclosingNode)); |
+ VisiblePosition startOfEnclosingBlock = (enclosingElement->renderer() && enclosingElement->renderer()->isInline()) ? positionInEnclosingBlock : startOfBlock(positionInEnclosingBlock); |
+ VisiblePosition lastPositionInEnclosingBlock = VisiblePosition(lastPositionInNode(enclosingElement)); |
VisiblePosition endOfEnclosingBlock = endOfBlock(lastPositionInEnclosingBlock); |
if (visibleStartOfParagraph == startOfEnclosingBlock && |
visibleEndOfParagraph == endOfEnclosingBlock) { |
// The blockquote doesn't contain anything outside the paragraph, so it can be totally removed. |
- Node* splitPoint = enclosingNode->nextSibling(); |
- removeNodePreservingChildren(enclosingNode); |
+ Node* splitPoint = enclosingElement->nextSibling(); |
+ removeNodePreservingChildren(enclosingElement); |
// outdentRegion() assumes it is operating on the first paragraph of an enclosing blockquote, but if there are multiply nested blockquotes and we've |
// just removed one, then this assumption isn't true. By splitting the next containing blockquote after this node, we keep this assumption true |
if (splitPoint) { |
- if (ContainerNode* splitPointParent = splitPoint->parentNode()) { |
+ if (Element* splitPointParent = splitPoint->parentElement()) { |
if (splitPointParent->hasTagName(blockquoteTag) |
&& !splitPoint->hasTagName(blockquoteTag) |
&& splitPointParent->parentNode()->hasEditableStyle()) // We can't outdent if there is no place to go! |
- splitElement(toElement(splitPointParent), splitPoint); |
+ splitElement(splitPointParent, splitPoint); |
} |
} |
@@ -180,14 +183,14 @@ void IndentOutdentCommand::outdentParagraph() |
return; |
} |
- RefPtrWillBeRawPtr<Node> splitBlockquoteNode = enclosingNode; |
- if (Node* enclosingBlockFlow = enclosingBlock(visibleStartOfParagraph.deepEquivalent().deprecatedNode())) { |
- if (enclosingBlockFlow != enclosingNode) { |
- splitBlockquoteNode = splitTreeToNode(enclosingBlockFlow, enclosingNode, true); |
+ RefPtrWillBeRawPtr<Node> splitBlockquoteNode = enclosingElement; |
+ if (Element* enclosingBlockFlow = enclosingBlock(visibleStartOfParagraph.deepEquivalent().deprecatedNode())) { |
+ if (enclosingBlockFlow != enclosingElement) { |
+ splitBlockquoteNode = splitTreeToNode(enclosingBlockFlow, enclosingElement, true); |
} else { |
// We split the blockquote at where we start outdenting. |
Node* highestInlineNode = highestEnclosingNodeOfType(visibleStartOfParagraph.deepEquivalent(), isInline, CannotCrossEditingBoundary, enclosingBlockFlow); |
- splitElement(toElement(enclosingNode), (highestInlineNode) ? highestInlineNode : visibleStartOfParagraph.deepEquivalent().deprecatedNode()); |
+ splitElement(enclosingElement, highestInlineNode ? highestInlineNode : visibleStartOfParagraph.deepEquivalent().deprecatedNode()); |
} |
} |
VisiblePosition startOfParagraphToMove(startOfParagraph(visibleStartOfParagraph)); |