Index: Source/core/dom/Range.cpp |
diff --git a/Source/core/dom/Range.cpp b/Source/core/dom/Range.cpp |
index 58f0642ca8b1d4aa771215416501d0daab2545e6..39040a8a96862875a1b41c3bfe5491fba76ab44a 100644 |
--- a/Source/core/dom/Range.cpp |
+++ b/Source/core/dom/Range.cpp |
@@ -125,53 +125,8 @@ void Range::setDocument(Document& document) |
m_ownerDocument->attachRange(this); |
} |
-Node* Range::startContainer(ExceptionState& exceptionState) const |
+Node* Range::commonAncestorContainer() const |
{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return 0; |
- } |
- |
- return m_start.container(); |
-} |
- |
-int Range::startOffset(ExceptionState& exceptionState) const |
-{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return 0; |
- } |
- |
- return m_start.offset(); |
-} |
- |
-Node* Range::endContainer(ExceptionState& exceptionState) const |
-{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return 0; |
- } |
- |
- return m_end.container(); |
-} |
- |
-int Range::endOffset(ExceptionState& exceptionState) const |
-{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return 0; |
- } |
- |
- return m_end.offset(); |
-} |
- |
-Node* Range::commonAncestorContainer(ExceptionState& exceptionState) const |
-{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return 0; |
- } |
- |
return commonAncestorContainer(m_start.container(), m_end.container()); |
} |
@@ -186,16 +141,6 @@ Node* Range::commonAncestorContainer(Node* containerA, Node* containerB) |
return 0; |
} |
-bool Range::collapsed(ExceptionState& exceptionState) const |
-{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return 0; |
- } |
- |
- return m_start == m_end; |
-} |
- |
static inline bool checkForDifferentRootContainer(const RangeBoundaryPoint& start, const RangeBoundaryPoint& end) |
{ |
Node* endRootContainer = end.container(); |
@@ -210,11 +155,6 @@ static inline bool checkForDifferentRootContainer(const RangeBoundaryPoint& star |
void Range::setStart(PassRefPtr<Node> refNode, int offset, ExceptionState& exceptionState) |
{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return; |
- } |
- |
if (!refNode) { |
exceptionState.throwDOMException(NotFoundError, "The node provided was null."); |
return; |
@@ -233,16 +173,11 @@ void Range::setStart(PassRefPtr<Node> refNode, int offset, ExceptionState& excep |
m_start.set(refNode, offset, childNode); |
if (didMoveDocument || checkForDifferentRootContainer(m_start, m_end)) |
- collapse(true, exceptionState); |
+ collapse(true); |
} |
void Range::setEnd(PassRefPtr<Node> refNode, int offset, ExceptionState& exceptionState) |
{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return; |
- } |
- |
if (!refNode) { |
exceptionState.throwDOMException(NotFoundError, "The node provided was null."); |
return; |
@@ -261,7 +196,7 @@ void Range::setEnd(PassRefPtr<Node> refNode, int offset, ExceptionState& excepti |
m_end.set(refNode, offset, childNode); |
if (didMoveDocument || checkForDifferentRootContainer(m_start, m_end)) |
- collapse(false, exceptionState); |
+ collapse(false); |
} |
void Range::setStart(const Position& start, ExceptionState& exceptionState) |
@@ -276,13 +211,8 @@ void Range::setEnd(const Position& end, ExceptionState& exceptionState) |
setEnd(parentAnchored.containerNode(), parentAnchored.offsetInContainerNode(), exceptionState); |
} |
-void Range::collapse(bool toStart, ExceptionState& exceptionState) |
+void Range::collapse(bool toStart) |
{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return; |
- } |
- |
if (toStart) |
m_end = m_start; |
else |
@@ -291,11 +221,6 @@ void Range::collapse(bool toStart, ExceptionState& exceptionState) |
bool Range::isPointInRange(Node* refNode, int offset, ExceptionState& exceptionState) |
{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return false; |
- } |
- |
if (!refNode) { |
exceptionState.throwDOMException(HierarchyRequestError, "The node provided was null."); |
return false; |
@@ -319,11 +244,6 @@ short Range::comparePoint(Node* refNode, int offset, ExceptionState& exceptionSt |
// This method returns -1, 0 or 1 depending on if the point described by the |
// refNode node and an offset within the node is before, same as, or after the range respectively. |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return 0; |
- } |
- |
if (!refNode) { |
exceptionState.throwDOMException(HierarchyRequestError, "The node provided was null."); |
return 0; |
@@ -369,12 +289,7 @@ Range::CompareResults Range::compareNode(Node* refNode, ExceptionState& exceptio |
return NODE_BEFORE; |
} |
- if (!m_start.container() && refNode->inActiveDocument()) { |
- exceptionState.throwDOMException(InvalidStateError, "This Range is detached, and the provided node is not."); |
- return NODE_BEFORE; |
- } |
- |
- if (m_start.container() && !refNode->inActiveDocument()) { |
+ if (!refNode->inActiveDocument()) { |
// Firefox doesn't throw an exception for this case; it returns 0. |
return NODE_BEFORE; |
} |
@@ -407,23 +322,13 @@ Range::CompareResults Range::compareNode(Node* refNode, ExceptionState& exceptio |
short Range::compareBoundaryPoints(CompareHow how, const Range* sourceRange, ExceptionState& exceptionState) const |
{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return 0; |
- } |
- |
if (!sourceRange) { |
exceptionState.throwDOMException(NotFoundError, "The source range provided was null."); |
return 0; |
} |
- Node* thisCont = commonAncestorContainer(exceptionState); |
- if (exceptionState.hadException()) |
- return 0; |
- Node* sourceCont = sourceRange->commonAncestorContainer(exceptionState); |
- if (exceptionState.hadException()) |
- return 0; |
- |
+ Node* thisCont = commonAncestorContainer(); |
+ Node* sourceCont = sourceRange->commonAncestorContainer(); |
if (thisCont->document() != sourceCont->document()) { |
exceptionState.throwDOMException(WrongDocumentError, "The source range is in a different document than this range."); |
return 0; |
@@ -556,7 +461,7 @@ short Range::compareBoundaryPoints(const RangeBoundaryPoint& boundaryA, const Ra |
bool Range::boundaryPointsValid() const |
{ |
TrackExceptionState exceptionState; |
- return m_start.container() && compareBoundaryPoints(m_start, m_end, exceptionState) <= 0 && !exceptionState.hadException(); |
+ return compareBoundaryPoints(m_start, m_end, exceptionState) <= 0 && !exceptionState.hadException(); |
} |
void Range::deleteContents(ExceptionState& exceptionState) |
@@ -572,12 +477,6 @@ bool Range::intersectsNode(Node* refNode, ExceptionState& exceptionState) |
{ |
// http://developer.mozilla.org/en/docs/DOM:range.intersectsNode |
// Returns a bool if the node intersects the range. |
- |
- // Throw exception if the range is already detached. |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return false; |
- } |
if (!refNode) { |
exceptionState.throwDOMException(NotFoundError, "The node provided is null."); |
return false; |
@@ -674,14 +573,10 @@ PassRefPtr<DocumentFragment> Range::processContents(ActionType action, Exception |
if (action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) |
fragment = DocumentFragment::create(*m_ownerDocument.get()); |
- if (collapsed(exceptionState)) |
+ if (collapsed()) |
return fragment.release(); |
- if (exceptionState.hadException()) |
- return nullptr; |
- RefPtr<Node> commonRoot = commonAncestorContainer(exceptionState); |
- if (exceptionState.hadException()) |
- return nullptr; |
+ RefPtr<Node> commonRoot = commonAncestorContainer(); |
ASSERT(commonRoot); |
if (m_start.container() == m_end.container()) { |
@@ -937,11 +832,6 @@ PassRefPtr<DocumentFragment> Range::extractContents(ExceptionState& exceptionSta |
PassRefPtr<DocumentFragment> Range::cloneContents(ExceptionState& exceptionState) |
{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return nullptr; |
- } |
- |
return processContents(CLONE_CONTENTS, exceptionState); |
} |
@@ -949,11 +839,6 @@ void Range::insertNode(PassRefPtr<Node> prpNewNode, ExceptionState& exceptionSta |
{ |
RefPtr<Node> newNode = prpNewNode; |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return; |
- } |
- |
if (!newNode) { |
exceptionState.throwDOMException(NotFoundError, "The node provided is null."); |
return; |
@@ -1057,13 +942,8 @@ void Range::insertNode(PassRefPtr<Node> prpNewNode, ExceptionState& exceptionSta |
} |
} |
-String Range::toString(ExceptionState& exceptionState) const |
+String Range::toString() const |
{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return String(); |
- } |
- |
StringBuilder builder; |
Node* pastLast = pastLastNode(); |
@@ -1087,9 +967,6 @@ String Range::toHTML() const |
String Range::text() const |
{ |
- if (!m_start.container()) |
- return String(); |
- |
// We need to update layout, since plainText uses line boxes in the render tree. |
// FIXME: As with innerText, we'd like this to work even if there are no render objects. |
m_start.container()->document().updateLayout(); |
@@ -1099,11 +976,6 @@ String Range::text() const |
PassRefPtr<DocumentFragment> Range::createContextualFragment(const String& markup, ExceptionState& exceptionState) |
{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return nullptr; |
- } |
- |
Node* element = m_start.container()->isElementNode() ? m_start.container() : m_start.container()->parentNode(); |
if (!element || !element->isHTMLElement()) { |
exceptionState.throwDOMException(NotSupportedError, "The range's container must be an HTML element."); |
@@ -1118,18 +990,9 @@ PassRefPtr<DocumentFragment> Range::createContextualFragment(const String& marku |
} |
-void Range::detach(ExceptionState& exceptionState) |
+void Range::detach() |
{ |
- // Check first to see if we've already detached: |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return; |
- } |
- |
- m_ownerDocument->detachRange(this); |
- |
- m_start.clear(); |
- m_end.clear(); |
+ // This is now a no-op as per the DOM specification. |
} |
Node* Range::checkNodeWOffset(Node* n, int offset, ExceptionState& exceptionState) const |
@@ -1166,11 +1029,6 @@ Node* Range::checkNodeWOffset(Node* n, int offset, ExceptionState& exceptionStat |
void Range::checkNodeBA(Node* n, ExceptionState& exceptionState) const |
{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return; |
- } |
- |
if (!n) { |
exceptionState.throwDOMException(NotFoundError, "The node provided is null."); |
return; |
@@ -1220,13 +1078,8 @@ void Range::checkNodeBA(Node* n, ExceptionState& exceptionState) const |
} |
} |
-PassRefPtrWillBeRawPtr<Range> Range::cloneRange(ExceptionState& exceptionState) const |
+PassRefPtrWillBeRawPtr<Range> Range::cloneRange() const |
{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return nullptr; |
- } |
- |
return Range::create(*m_ownerDocument.get(), m_start.container(), m_start.offset(), m_end.container(), m_end.offset()); |
} |
@@ -1259,11 +1112,6 @@ void Range::setEndAfter(Node* refNode, ExceptionState& exceptionState) |
void Range::selectNode(Node* refNode, ExceptionState& exceptionState) |
{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return; |
- } |
- |
if (!refNode) { |
exceptionState.throwDOMException(NotFoundError, "The node provided is null."); |
return; |
@@ -1318,11 +1166,6 @@ void Range::selectNode(Node* refNode, ExceptionState& exceptionState) |
void Range::selectNodeContents(Node* refNode, ExceptionState& exceptionState) |
{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return; |
- } |
- |
if (!refNode) { |
exceptionState.throwDOMException(NotFoundError, "The node provided is null."); |
return; |
@@ -1357,12 +1200,6 @@ void Range::selectNodeContents(Node* refNode, ExceptionState& exceptionState) |
void Range::surroundContents(PassRefPtr<Node> passNewParent, ExceptionState& exceptionState) |
{ |
RefPtr<Node> newParent = passNewParent; |
- |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return; |
- } |
- |
if (!newParent) { |
exceptionState.throwDOMException(NotFoundError, "The node provided is null."); |
return; |
@@ -1452,14 +1289,9 @@ void Range::setStartBefore(Node* refNode, ExceptionState& exceptionState) |
void Range::checkDeleteExtract(ExceptionState& exceptionState) |
{ |
- if (!m_start.container()) { |
- exceptionState.throwDOMException(InvalidStateError, "The range has no container. Perhaps 'detach()' has been invoked on this object?"); |
- return; |
- } |
- |
ASSERT(boundaryPointsValid()); |
- if (!commonAncestorContainer(exceptionState) || exceptionState.hadException()) |
+ if (!commonAncestorContainer()) |
return; |
Node* pastLast = pastLastNode(); |
@@ -1473,8 +1305,6 @@ void Range::checkDeleteExtract(ExceptionState& exceptionState) |
Node* Range::firstNode() const |
{ |
- if (!m_start.container()) |
- return 0; |
if (m_start.container()->offsetInCharacters()) |
return m_start.container(); |
if (Node* child = m_start.container()->traverseToChildAt(m_start.offset())) |
@@ -1491,8 +1321,6 @@ ShadowRoot* Range::shadowRoot() const |
Node* Range::pastLastNode() const |
{ |
- if (!m_start.container() || !m_end.container()) |
- return 0; |
if (m_end.container()->offsetInCharacters()) |
return NodeTraversal::nextSkippingChildren(*m_end.container()); |
if (Node* child = m_end.container()->traverseToChildAt(m_end.offset())) |
@@ -1514,13 +1342,9 @@ IntRect Range::boundingBox() const |
void Range::textRects(Vector<IntRect>& rects, bool useSelectionHeight, RangeInFixedPosition* inFixed) const |
{ |
Node* startContainer = m_start.container(); |
+ ASSERT(startContainer); |
Node* endContainer = m_end.container(); |
- |
- if (!startContainer || !endContainer) { |
- if (inFixed) |
- *inFixed = NotFixedPosition; |
- return; |
- } |
+ ASSERT(endContainer); |
bool allFixed = true; |
bool someFixed = false; |
@@ -1546,13 +1370,9 @@ void Range::textRects(Vector<IntRect>& rects, bool useSelectionHeight, RangeInFi |
void Range::textQuads(Vector<FloatQuad>& quads, bool useSelectionHeight, RangeInFixedPosition* inFixed) const |
{ |
Node* startContainer = m_start.container(); |
+ ASSERT(startContainer); |
Node* endContainer = m_end.container(); |
- |
- if (!startContainer || !endContainer) { |
- if (inFixed) |
- *inFixed = NotFixedPosition; |
- return; |
- } |
+ ASSERT(endContainer); |
bool allFixed = true; |
bool someFixed = false; |
@@ -1579,24 +1399,19 @@ void Range::textQuads(Vector<FloatQuad>& quads, bool useSelectionHeight, RangeIn |
void Range::formatForDebugger(char* buffer, unsigned length) const |
{ |
StringBuilder result; |
- String s; |
- |
- if (!m_start.container() || !m_end.container()) |
- result.appendLiteral("<empty>"); |
- else { |
- const int FormatBufferSize = 1024; |
- char s[FormatBufferSize]; |
- result.appendLiteral("from offset "); |
- result.appendNumber(m_start.offset()); |
- result.appendLiteral(" of "); |
- m_start.container()->formatForDebugger(s, FormatBufferSize); |
- result.append(s); |
- result.appendLiteral(" to offset "); |
- result.appendNumber(m_end.offset()); |
- result.appendLiteral(" of "); |
- m_end.container()->formatForDebugger(s, FormatBufferSize); |
- result.append(s); |
- } |
+ |
+ const int FormatBufferSize = 1024; |
+ char s[FormatBufferSize]; |
+ result.appendLiteral("from offset "); |
+ result.appendNumber(m_start.offset()); |
+ result.appendLiteral(" of "); |
+ m_start.container()->formatForDebugger(s, FormatBufferSize); |
+ result.append(s); |
+ result.appendLiteral(" to offset "); |
+ result.appendNumber(m_end.offset()); |
+ result.appendLiteral(" of "); |
+ m_end.container()->formatForDebugger(s, FormatBufferSize); |
+ result.append(s); |
strncpy(buffer, result.toString().utf8().data(), length - 1); |
} |
@@ -1792,9 +1607,6 @@ void Range::expand(const String& unit, ExceptionState& exceptionState) |
PassRefPtrWillBeRawPtr<ClientRectList> Range::getClientRects() const |
{ |
- if (!m_start.container()) |
- return ClientRectList::create(); |
- |
m_ownerDocument->updateLayoutIgnorePendingStylesheets(); |
Vector<FloatQuad> quads; |
@@ -1849,9 +1661,6 @@ void Range::getBorderAndTextQuads(Vector<FloatQuad>& quads) const |
FloatRect Range::boundingRect() const |
{ |
- if (!m_start.container()) |
- return FloatRect(); |
- |
m_ownerDocument->updateLayoutIgnorePendingStylesheets(); |
Vector<FloatQuad> quads; |