Chromium Code Reviews| Index: Source/core/dom/Range.cpp |
| diff --git a/Source/core/dom/Range.cpp b/Source/core/dom/Range.cpp |
| index 8d1ad9dbd007768d2f3207bf8de2efef9a856474..ba27e67625fe27f0ed5ea2219d17fb5badc158aa 100644 |
| --- a/Source/core/dom/Range.cpp |
| +++ b/Source/core/dom/Range.cpp |
| @@ -25,6 +25,7 @@ |
| #include "config.h" |
| #include "core/dom/Range.h" |
| +#include "bindings/v8/ExceptionMessages.h" |
| #include "bindings/v8/ExceptionState.h" |
| #include "bindings/v8/ExceptionStatePlaceholder.h" |
| #include "core/dom/ClientRect.h" |
| @@ -1159,12 +1160,27 @@ Node* Range::checkNodeWOffset(Node* n, int offset, ExceptionState& es) const |
| return 0; |
| } |
| -void Range::checkNodeBA(Node* n, ExceptionState& es) const |
| +void Range::checkNodeBA(Node* n, ExceptionState& es, const char* methodName) const |
| { |
| + if (!m_start.container()) { |
| + es.throwDOMException(InvalidStateError); |
| + return; |
| + } |
| + |
| + if (!n) { |
| + es.throwDOMException(NotFoundError); |
| + return; |
|
Mike West
2013/08/26 10:03:44
Can you add reasonable error messages here, as you
yosin_UTC9
2013/08/27 02:18:55
I would like to minimize change. So, Could you fil
|
| + } |
| + |
| // InvalidNodeTypeError: Raised if the root container of refNode is not an |
| // Attr, Document, DocumentFragment or ShadowRoot node, or part of a SVG shadow DOM tree, |
| // or if refNode is a Document, DocumentFragment, ShadowRoot, Attr, Entity, or Notation node. |
| + if (!n->parentNode()) { |
| + es.throwDOMException(InvalidNodeTypeError, ExceptionMessages::failedToExecute(methodName, "Range", "the given Node has no parent.")); |
| + return; |
| + } |
| + |
| switch (n->nodeType()) { |
| case Node::ATTRIBUTE_NODE: |
| case Node::DOCUMENT_FRAGMENT_NODE: |
| @@ -1191,11 +1207,11 @@ void Range::checkNodeBA(Node* n, ExceptionState& es) const |
| case Node::ATTRIBUTE_NODE: |
| case Node::DOCUMENT_NODE: |
| case Node::DOCUMENT_FRAGMENT_NODE: |
| + case Node::ELEMENT_NODE: |
| break; |
| case Node::CDATA_SECTION_NODE: |
| case Node::COMMENT_NODE: |
| case Node::DOCUMENT_TYPE_NODE: |
| - case Node::ELEMENT_NODE: |
| case Node::ENTITY_NODE: |
| case Node::NOTATION_NODE: |
| case Node::PROCESSING_INSTRUCTION_NODE: |
| @@ -1218,17 +1234,7 @@ PassRefPtr<Range> Range::cloneRange(ExceptionState& es) const |
| void Range::setStartAfter(Node* refNode, ExceptionState& es) |
| { |
| - if (!m_start.container()) { |
| - es.throwDOMException(InvalidStateError); |
| - return; |
| - } |
| - |
| - if (!refNode) { |
| - es.throwDOMException(NotFoundError); |
| - return; |
| - } |
| - |
| - checkNodeBA(refNode, es); |
| + checkNodeBA(refNode, es, "setStartAfter"); |
| if (es.hadException()) |
| return; |
| @@ -1237,17 +1243,7 @@ void Range::setStartAfter(Node* refNode, ExceptionState& es) |
| void Range::setEndBefore(Node* refNode, ExceptionState& es) |
| { |
| - if (!m_start.container()) { |
| - es.throwDOMException(InvalidStateError); |
| - return; |
| - } |
| - |
| - if (!refNode) { |
| - es.throwDOMException(NotFoundError); |
| - return; |
| - } |
| - |
| - checkNodeBA(refNode, es); |
| + checkNodeBA(refNode, es, "setEndBefore"); |
| if (es.hadException()) |
| return; |
| @@ -1256,17 +1252,7 @@ void Range::setEndBefore(Node* refNode, ExceptionState& es) |
| void Range::setEndAfter(Node* refNode, ExceptionState& es) |
| { |
| - if (!m_start.container()) { |
| - es.throwDOMException(InvalidStateError); |
| - return; |
| - } |
| - |
| - if (!refNode) { |
| - es.throwDOMException(NotFoundError); |
| - return; |
| - } |
| - |
| - checkNodeBA(refNode, es); |
| + checkNodeBA(refNode, es, "setEndAfter"); |
| if (es.hadException()) |
| return; |
| @@ -1285,6 +1271,11 @@ void Range::selectNode(Node* refNode, ExceptionState& es) |
| return; |
| } |
| + if (!refNode->parentNode()) { |
| + es.throwDOMException(InvalidNodeTypeError, ExceptionMessages::failedToExecute("selectNode", "Range", "the given Node has no parent.")); |
| + return; |
| + } |
| + |
| // InvalidNodeTypeError: Raised if an ancestor of refNode is an Entity, Notation or |
| // DocumentType node or if refNode is a Document, DocumentFragment, ShadowRoot, Attr, Entity, or Notation |
| // node. |
| @@ -1329,10 +1320,8 @@ void Range::selectNode(Node* refNode, ExceptionState& es) |
| if (m_ownerDocument != refNode->document()) |
| setDocument(refNode->document()); |
| - setStartBefore(refNode, es); |
| - if (es.hadException()) |
| - return; |
| - setEndAfter(refNode, es); |
| + setStartBefore(refNode); |
| + setEndAfter(refNode); |
| } |
| void Range::selectNodeContents(Node* refNode, ExceptionState& es) |
| @@ -1462,17 +1451,7 @@ void Range::surroundContents(PassRefPtr<Node> passNewParent, ExceptionState& es) |
| void Range::setStartBefore(Node* refNode, ExceptionState& es) |
| { |
| - if (!m_start.container()) { |
| - es.throwDOMException(InvalidStateError); |
| - return; |
| - } |
| - |
| - if (!refNode) { |
| - es.throwDOMException(NotFoundError); |
| - return; |
| - } |
| - |
| - checkNodeBA(refNode, es); |
| + checkNodeBA(refNode, es, "setStartBefore"); |
| if (es.hadException()) |
| return; |