<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[208479] trunk/Source</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/208479">208479</a></dd>
<dt>Author</dt> <dd>darin@apple.com</dd>
<dt>Date</dt> <dd>2016-11-09 13:27:56 -0800 (Wed, 09 Nov 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Move Range from ExceptionCode to ExceptionOr
https://bugs.webkit.org/show_bug.cgi?id=164457

Reviewed by Alex Christensen.

Source/WebCore:

* accessibility/AXObjectCache.cpp:
(WebCore::AXObjectCache::rangeForNodeContents): Update to use ExceptionOr,
keeping behavior the same.
(WebCore::characterOffsetsInOrder): Ditto.
(WebCore::setRangeStartOrEndWithCharacterOffset): Changed argument to a
reference instead of a pointer. Use a boolean return value to indicate
success rather than an exception, since the callers don't need to know
which exception it is.
(WebCore::AXObjectCache::rangeForUnorderedCharacterOffsets): Updated for
the above.
(WebCore::AXObjectCache::nextBoundary): Ditto.
(WebCore::AXObjectCache::previousBoundary): Ditto.

* accessibility/AccessibilityObject.cpp:
(WebCore::AccessibilityObject::rangeOfStringClosestToRangeInDirection):
Update to use ExceptionOr, keeping behavior the same.
* accessibility/AccessibilityRenderObject.cpp:
(WebCore::AccessibilityRenderObject::documentBasedSelectedTextRange): Ditto.
* accessibility/atk/WebKitAccessibleUtil.cpp:
(selectionBelongsToObject): Ditto.
* accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
(-[WebAccessibilityObjectWrapper _convertToNSRange:]): Ditto.
* dom/Node.cpp:
(WebCore::Node::textRects): Ditto.

* dom/Range.cpp:
(WebCore::Range::~Range): Remove old comment that no longer makes sense now
that the detach function no longer does anything.
(WebCore::checkForDifferentRootContainer): Updated to use ExceptionOr,
keeping behavior the same.
(WebCore::Range::setStart): Ditto.
(WebCore::Range::setEnd): Ditto.
(WebCore::Range::isPointInRange): Ditto.
(WebCore::Range::comparePoint): Ditto.
(WebCore::Range::compareNode): Ditto.
(WebCore::top): Added helper function so that compareBoundaryPoints doesn't
need to have two identical loops in it.
(WebCore::Range::compareBoundaryPoints): Updated to use ExceptionOr,
keeping behavior the same.
(WebCore::Range::compareBoundaryPointsForBindings): Ditto. Also use a switch
instead of relying on the order of the values to check for unsupported values.
(WebCore::Range::boundaryPointsValid): Ditto.
(WebCore::Range::deleteContents): Ditto.
(WebCore::Range::intersectsNode): Ditto.
(WebCore::Range::processContents): Ditto.
(WebCore::deleteCharacterData): Ditto.
(WebCore::processContentsBetweenOffsets): Ditto. Also changed to be a
non-member function and private to this file instead of in the class.
(WebCore::processNodes): Ditto. Also changed one argument to be a RefPtr
since the code relies on using it after mutating the DOM.
(WebCore::processAncestorsAndTheirSiblings): Ditto. Changed one argument type
to use ExceptionOr so the caller doesn't have to check the exception first.
(WebCore::Range::extractContents): Ditto.
(WebCore::Range::cloneContents): Ditto.
(WebCore::Range::insertNode): Ditto. Also fixed to only call nodeType once
instead of three times.
(WebCore::Range::toString): Ditto. Also fixed to call nodeType only once
per node instead of twice, to use downcast instead of static_cast, and to
use the word &quot;node&quot; instead of &quot;n&quot; for the local variable name.
(WebCore::Range::createContextualFragment): Ditto.
(WebCore::Range::checkNodeWOffset): Ditto.
(WebCore::Range::setStartAfter): Ditto.
(WebCore::Range::setEndBefore): Ditto.
(WebCore::Range::setEndAfter): Ditto.
(WebCore::Range::selectNode): Ditto.
(WebCore::Range::selectNodeContents): Ditto.
(WebCore::Range::surroundContents): Ditto.
(WebCore::Range::setStartBefore): Ditto.
(WebCore::Range::contains): Ditto. Except added code to handle exception
case to return false without asserting because I saw at least one crash
that seemed to imply this behavior was needed.
(WebCore::rangesOverlap): Ditto.
(WebCore::rangeOfContents): Ditto.
(WebCore::Range::expand): Ditto.
(WebCore::Range::getClientRects): Ditto.
(WebCore::Range::getBoundingClientRect): Ditto.
(WebCore::Range::borderAndTextQuads): Changed to use return value
instead of out argument, since it's a private function used only
within this class so it was easy to update all call sites.
(WebCore::Range::boundingRect): Updated for above. Also renamed since
there was no need for the name &quot;internal&quot; in this.
(WebCore::Range::absoluteBoundingRect): Ditto.
* dom/Range.h: Updated for above.
* dom/Range.idl: Use non-legacy exceptions. Also changed the default value
of the string argument to the expand function to the empty string rather
than &quot;undefined&quot;, because the function silently does nothing when passed
any unrecognized string, and so this leaves behavior unchanged. I removed
the comment saying that the &quot;undefined&quot; default is wrong.

* editing/AlternativeTextController.cpp:
(WebCore::AlternativeTextController::applyAlternativeTextToRange): Updated
to use ExceptionOr but behave the same.
* editing/Editor.cpp:
(WebCore::Editor::advanceToNextMisspelling): Ditto.
(WebCore::Editor::markAndReplaceFor): Ditto.
(WebCore::isFrameInRange): Ditto. Also made a few style tweaks.
(WebCore::Editor::countMatchesForText): Ditto.
* editing/EditorCommand.cpp:
(WebCore::unionDOMRanges): Ditto.
* editing/FrameSelection.cpp:
(WebCore::FrameSelection::respondToNodeModification): Ditto.
* editing/InsertListCommand.cpp:
(WebCore::InsertListCommand::doApplyForSingleParagraph): Ditto.
* editing/TextCheckingHelper.cpp:
(WebCore::TextCheckingParagraph::offsetTo): Ditto.
* editing/TextCheckingHelper.h: Updated for above and also deleted
unneeded private function checkingRange, which just churned the
reference count unnecessarily; instead use m_checkingRange directly.
* editing/TextIterator.cpp:
(WebCore::TextIterator::getLocationAndLengthFromRange): Ditto.
* editing/VisiblePosition.cpp:
(WebCore::setStart): Ditto.
(WebCore::setEnd): Ditto.
* editing/VisibleSelection.cpp:
(WebCore::makeSearchRange): Ditto.

* editing/VisibleUnits.cpp:
(WebCore::suffixLengthForRange): Changed argument from RefPtr to
a reference.
(WebCore::prefixLengthForRange): Ditto.
(WebCore::previousBoundary): Updated for ExceptionOr and the change
above.
(WebCore::nextBoundary): Ditto.
* editing/VisibleUnits.h: Updated for above.

* editing/htmlediting.cpp:
(WebCore::comparePositions): Updated to use ExceptionOr but behave
the same.
(WebCore::visiblePositionForIndexUsingCharacterIterator): Ditto.
(WebCore::isNodeVisiblyContainedWithin): Ditto.
* editing/ios/EditorIOS.mm:
(WebCore::Editor::setDictationPhrasesAsChildOfElement): Ditto.
(WebCore::Editor::setTextAsChildOfElement): Ditto.
* editing/mac/EditorMac.mm:
(WebCore::Editor::adjustedSelectionRange): Ditto.
* editing/markup.cpp:
(WebCore::createMarkupInternal): Ditto.
* page/ContextMenuController.cpp:
(WebCore::ContextMenuController::contextMenuItemSelected): Ditto.
* page/DOMSelection.cpp:
(WebCore::DOMSelection::addRange): Ditto.
(WebCore::DOMSelection::deleteFromDocument): Ditto.
(WebCore::DOMSelection::containsNode): Ditto.

* page/EventHandler.cpp:
(WebCore::EventHandler::dispatchMouseEvent): Updated for change to
use ExceptionOr in Ragne::compareNode. Also refactored the function
to make the logic a little mroe straightforward and nest less of it
inside a loop.

* page/Page.cpp:
(WebCore::Page::findStringMatchingRanges): Updated for ExceptionOr
without changing behavior.
* page/TextIndicator.cpp:
(WebCore::hasNonInlineOrReplacedElements): Ditto.
* rendering/RenderNamedFlowThread.cpp:
(WebCore::RenderNamedFlowThread::getRanges): Ditto.

Source/WebKit/mac:

* DOM/DOMRange.mm:
(-[DOMRange setStart:offset:]): Updated exception handling.
(-[DOMRange setEnd:offset:]): Ditto.
(-[DOMRange setStartBefore:]): Ditto.
(-[DOMRange setStartAfter:]): Ditto.
(-[DOMRange setEndBefore:]): Ditto.
(-[DOMRange setEndAfter:]): Ditto.
(-[DOMRange selectNode:]): Ditto.
(-[DOMRange selectNodeContents:]): Ditto.
(-[DOMRange compareBoundaryPoints:sourceRange:]): Ditto.
(-[DOMRange deleteContents]): Ditto.
(-[DOMRange extractContents]): Ditto.
(-[DOMRange cloneContents]): Ditto.
(-[DOMRange insertNode:]): Ditto.
(-[DOMRange surroundContents:]): Ditto.
(-[DOMRange createContextualFragment:]): Ditto.
(-[DOMRange compareNode:]): Ditto.
(-[DOMRange intersectsNode:]): Ditto.
(-[DOMRange comparePoint:offset:]): Ditto.
(-[DOMRange isPointInRange:offset:]): Ditto.
(-[DOMRange expand:]): Ditto.
* WebView/WebFrame.mm:
(-[WebFrame _documentFragmentWithMarkupString:baseURLString:]): Ditto.
(-[WebFrame _smartDeleteRangeForProposedRange:]): Deleted.
This function was incorrectly implemented (set both start and end of
the range to the computed start), not declared in any header file,
not used anywhere inside WebKit, and I also could not find a use of it
in outside-WebKit Apple code.
* mac/DOM/DOMUIKitExtensions.mm:
(-[DOMRange move:inDirection:]): Ditto.
(-[DOMRange extend:inDirection:]): Ditto.

Source/WebKit/win:

* WebView.cpp:
(WebView::onIMERequestCharPosition): Updated for new exception handling.

Source/WebKit2:

* WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMRange.cpp:
(webkit_dom_range_set_start): Updated exception handling.
(webkit_dom_range_set_end): Ditto.
(webkit_dom_range_set_start_before): Ditto.
(webkit_dom_range_set_start_after): Ditto.
(webkit_dom_range_set_end_before): Ditto.
(webkit_dom_range_set_end_after): Ditto.
(webkit_dom_range_select_node): Ditto.
(webkit_dom_range_select_node_contents): Ditto.
(webkit_dom_range_compare_boundary_points): Ditto.
(webkit_dom_range_delete_contents): Ditto.
(webkit_dom_range_extract_contents): Ditto.
(webkit_dom_range_clone_contents): Ditto.
(webkit_dom_range_insert_node): Ditto.
(webkit_dom_range_surround_contents): Ditto.
(webkit_dom_range_create_contextual_fragment): Ditto.
(webkit_dom_range_compare_node): Ditto.
(webkit_dom_range_intersects_node): Ditto.
(webkit_dom_range_compare_point): Ditto.
(webkit_dom_range_is_point_in_range): Ditto.
(webkit_dom_range_expand): Ditto.
* WebProcess/InjectedBundle/API/mac/WKDOMRange.mm:
(-[WKDOMRange setStart:offset:]): Ditto.
(-[WKDOMRange setEnd:offset:]): Ditto.
(-[WKDOMRange selectNode:]): Ditto.
(-[WKDOMRange selectNodeContents:]): Ditto.
* WebProcess/WebPage/WebFrame.cpp:
(WebKit::WebFrame::contentsAsString): Ditto.
* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::rangeForWebSelectionAtPosition): Ditto.
(WebKit::WebPage::rangeForBlockAtPoint): Ditto.
(WebKit::WebPage::selectWithGesture): Ditto.
(WebKit::containsRange): Ditto.
(WebKit::unionDOMRanges): Ditto.
(WebKit::WebPage::switchToBlockSelectionAtPoint): Ditto.
(WebKit::WebPage::getPositionInformation): Ditto.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreaccessibilityAXObjectCachecpp">trunk/Source/WebCore/accessibility/AXObjectCache.cpp</a></li>
<li><a href="#trunkSourceWebCoreaccessibilityAccessibilityObjectcpp">trunk/Source/WebCore/accessibility/AccessibilityObject.cpp</a></li>
<li><a href="#trunkSourceWebCoreaccessibilityAccessibilityRenderObjectcpp">trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp</a></li>
<li><a href="#trunkSourceWebCoreaccessibilityatkWebKitAccessibleUtilcpp">trunk/Source/WebCore/accessibility/atk/WebKitAccessibleUtil.cpp</a></li>
<li><a href="#trunkSourceWebCoreaccessibilityiosWebAccessibilityObjectWrapperIOSmm">trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm</a></li>
<li><a href="#trunkSourceWebCoredomNodecpp">trunk/Source/WebCore/dom/Node.cpp</a></li>
<li><a href="#trunkSourceWebCoredomRangecpp">trunk/Source/WebCore/dom/Range.cpp</a></li>
<li><a href="#trunkSourceWebCoredomRangeh">trunk/Source/WebCore/dom/Range.h</a></li>
<li><a href="#trunkSourceWebCoredomRangeidl">trunk/Source/WebCore/dom/Range.idl</a></li>
<li><a href="#trunkSourceWebCoreeditingAlternativeTextControllercpp">trunk/Source/WebCore/editing/AlternativeTextController.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingEditorcpp">trunk/Source/WebCore/editing/Editor.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingEditorCommandcpp">trunk/Source/WebCore/editing/EditorCommand.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingFrameSelectioncpp">trunk/Source/WebCore/editing/FrameSelection.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingInsertListCommandcpp">trunk/Source/WebCore/editing/InsertListCommand.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingTextCheckingHelpercpp">trunk/Source/WebCore/editing/TextCheckingHelper.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingTextCheckingHelperh">trunk/Source/WebCore/editing/TextCheckingHelper.h</a></li>
<li><a href="#trunkSourceWebCoreeditingTextIteratorcpp">trunk/Source/WebCore/editing/TextIterator.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingVisiblePositioncpp">trunk/Source/WebCore/editing/VisiblePosition.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingVisibleSelectioncpp">trunk/Source/WebCore/editing/VisibleSelection.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingVisibleUnitscpp">trunk/Source/WebCore/editing/VisibleUnits.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingVisibleUnitsh">trunk/Source/WebCore/editing/VisibleUnits.h</a></li>
<li><a href="#trunkSourceWebCoreeditinghtmleditingcpp">trunk/Source/WebCore/editing/htmlediting.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingiosEditorIOSmm">trunk/Source/WebCore/editing/ios/EditorIOS.mm</a></li>
<li><a href="#trunkSourceWebCoreeditingmacEditorMacmm">trunk/Source/WebCore/editing/mac/EditorMac.mm</a></li>
<li><a href="#trunkSourceWebCoreeditingmarkupcpp">trunk/Source/WebCore/editing/markup.cpp</a></li>
<li><a href="#trunkSourceWebCorepageContextMenuControllercpp">trunk/Source/WebCore/page/ContextMenuController.cpp</a></li>
<li><a href="#trunkSourceWebCorepageDOMSelectioncpp">trunk/Source/WebCore/page/DOMSelection.cpp</a></li>
<li><a href="#trunkSourceWebCorepageEventHandlercpp">trunk/Source/WebCore/page/EventHandler.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePagecpp">trunk/Source/WebCore/page/Page.cpp</a></li>
<li><a href="#trunkSourceWebCorepageTextIndicatorcpp">trunk/Source/WebCore/page/TextIndicator.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderNamedFlowThreadcpp">trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp</a></li>
<li><a href="#trunkSourceWebKitmacChangeLog">trunk/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitmacDOMDOMRangemm">trunk/Source/WebKit/mac/DOM/DOMRange.mm</a></li>
<li><a href="#trunkSourceWebKitmacDOMDOMUIKitExtensionsmm">trunk/Source/WebKit/mac/DOM/DOMUIKitExtensions.mm</a></li>
<li><a href="#trunkSourceWebKitmacWebViewWebFramemm">trunk/Source/WebKit/mac/WebView/WebFrame.mm</a></li>
<li><a href="#trunkSourceWebKitwinChangeLog">trunk/Source/WebKit/win/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitwinWebViewcpp">trunk/Source/WebKit/win/WebView.cpp</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2WebProcessInjectedBundleAPIgtkDOMWebKitDOMRangecpp">trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMRange.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessInjectedBundleAPImacWKDOMRangemm">trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKDOMRange.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebFramecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebFrame.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageiosWebPageIOSmm">trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/ChangeLog        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -1,3 +1,168 @@
</span><ins>+2016-11-09  Darin Adler  &lt;darin@apple.com&gt;
+
+        Move Range from ExceptionCode to ExceptionOr
+        https://bugs.webkit.org/show_bug.cgi?id=164457
+
+        Reviewed by Alex Christensen.
+
+        * accessibility/AXObjectCache.cpp:
+        (WebCore::AXObjectCache::rangeForNodeContents): Update to use ExceptionOr,
+        keeping behavior the same.
+        (WebCore::characterOffsetsInOrder): Ditto.
+        (WebCore::setRangeStartOrEndWithCharacterOffset): Changed argument to a
+        reference instead of a pointer. Use a boolean return value to indicate
+        success rather than an exception, since the callers don't need to know
+        which exception it is.
+        (WebCore::AXObjectCache::rangeForUnorderedCharacterOffsets): Updated for
+        the above.
+        (WebCore::AXObjectCache::nextBoundary): Ditto.
+        (WebCore::AXObjectCache::previousBoundary): Ditto.
+
+        * accessibility/AccessibilityObject.cpp:
+        (WebCore::AccessibilityObject::rangeOfStringClosestToRangeInDirection):
+        Update to use ExceptionOr, keeping behavior the same.
+        * accessibility/AccessibilityRenderObject.cpp:
+        (WebCore::AccessibilityRenderObject::documentBasedSelectedTextRange): Ditto.
+        * accessibility/atk/WebKitAccessibleUtil.cpp:
+        (selectionBelongsToObject): Ditto.
+        * accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
+        (-[WebAccessibilityObjectWrapper _convertToNSRange:]): Ditto.
+        * dom/Node.cpp:
+        (WebCore::Node::textRects): Ditto.
+
+        * dom/Range.cpp:
+        (WebCore::Range::~Range): Remove old comment that no longer makes sense now
+        that the detach function no longer does anything.
+        (WebCore::checkForDifferentRootContainer): Updated to use ExceptionOr,
+        keeping behavior the same.
+        (WebCore::Range::setStart): Ditto.
+        (WebCore::Range::setEnd): Ditto.
+        (WebCore::Range::isPointInRange): Ditto.
+        (WebCore::Range::comparePoint): Ditto.
+        (WebCore::Range::compareNode): Ditto.
+        (WebCore::top): Added helper function so that compareBoundaryPoints doesn't
+        need to have two identical loops in it.
+        (WebCore::Range::compareBoundaryPoints): Updated to use ExceptionOr,
+        keeping behavior the same.
+        (WebCore::Range::compareBoundaryPointsForBindings): Ditto. Also use a switch
+        instead of relying on the order of the values to check for unsupported values.
+        (WebCore::Range::boundaryPointsValid): Ditto.
+        (WebCore::Range::deleteContents): Ditto.
+        (WebCore::Range::intersectsNode): Ditto.
+        (WebCore::Range::processContents): Ditto.
+        (WebCore::deleteCharacterData): Ditto.
+        (WebCore::processContentsBetweenOffsets): Ditto. Also changed to be a
+        non-member function and private to this file instead of in the class.
+        (WebCore::processNodes): Ditto. Also changed one argument to be a RefPtr
+        since the code relies on using it after mutating the DOM.
+        (WebCore::processAncestorsAndTheirSiblings): Ditto. Changed one argument type
+        to use ExceptionOr so the caller doesn't have to check the exception first.
+        (WebCore::Range::extractContents): Ditto.
+        (WebCore::Range::cloneContents): Ditto.
+        (WebCore::Range::insertNode): Ditto. Also fixed to only call nodeType once
+        instead of three times.
+        (WebCore::Range::toString): Ditto. Also fixed to call nodeType only once
+        per node instead of twice, to use downcast instead of static_cast, and to
+        use the word &quot;node&quot; instead of &quot;n&quot; for the local variable name.
+        (WebCore::Range::createContextualFragment): Ditto.
+        (WebCore::Range::checkNodeWOffset): Ditto.
+        (WebCore::Range::setStartAfter): Ditto.
+        (WebCore::Range::setEndBefore): Ditto.
+        (WebCore::Range::setEndAfter): Ditto.
+        (WebCore::Range::selectNode): Ditto.
+        (WebCore::Range::selectNodeContents): Ditto.
+        (WebCore::Range::surroundContents): Ditto.
+        (WebCore::Range::setStartBefore): Ditto.
+        (WebCore::Range::contains): Ditto. Except added code to handle exception
+        case to return false without asserting because I saw at least one crash
+        that seemed to imply this behavior was needed.
+        (WebCore::rangesOverlap): Ditto.
+        (WebCore::rangeOfContents): Ditto.
+        (WebCore::Range::expand): Ditto.
+        (WebCore::Range::getClientRects): Ditto.
+        (WebCore::Range::getBoundingClientRect): Ditto.
+        (WebCore::Range::borderAndTextQuads): Changed to use return value
+        instead of out argument, since it's a private function used only
+        within this class so it was easy to update all call sites.
+        (WebCore::Range::boundingRect): Updated for above. Also renamed since
+        there was no need for the name &quot;internal&quot; in this.
+        (WebCore::Range::absoluteBoundingRect): Ditto.
+        * dom/Range.h: Updated for above.
+        * dom/Range.idl: Use non-legacy exceptions. Also changed the default value
+        of the string argument to the expand function to the empty string rather
+        than &quot;undefined&quot;, because the function silently does nothing when passed
+        any unrecognized string, and so this leaves behavior unchanged. I removed
+        the comment saying that the &quot;undefined&quot; default is wrong.
+
+        * editing/AlternativeTextController.cpp:
+        (WebCore::AlternativeTextController::applyAlternativeTextToRange): Updated
+        to use ExceptionOr but behave the same.
+        * editing/Editor.cpp:
+        (WebCore::Editor::advanceToNextMisspelling): Ditto.
+        (WebCore::Editor::markAndReplaceFor): Ditto.
+        (WebCore::isFrameInRange): Ditto. Also made a few style tweaks.
+        (WebCore::Editor::countMatchesForText): Ditto.
+        * editing/EditorCommand.cpp:
+        (WebCore::unionDOMRanges): Ditto.
+        * editing/FrameSelection.cpp:
+        (WebCore::FrameSelection::respondToNodeModification): Ditto.
+        * editing/InsertListCommand.cpp:
+        (WebCore::InsertListCommand::doApplyForSingleParagraph): Ditto.
+        * editing/TextCheckingHelper.cpp:
+        (WebCore::TextCheckingParagraph::offsetTo): Ditto.
+        * editing/TextCheckingHelper.h: Updated for above and also deleted
+        unneeded private function checkingRange, which just churned the
+        reference count unnecessarily; instead use m_checkingRange directly.
+        * editing/TextIterator.cpp:
+        (WebCore::TextIterator::getLocationAndLengthFromRange): Ditto.
+        * editing/VisiblePosition.cpp:
+        (WebCore::setStart): Ditto.
+        (WebCore::setEnd): Ditto.
+        * editing/VisibleSelection.cpp:
+        (WebCore::makeSearchRange): Ditto.
+
+        * editing/VisibleUnits.cpp:
+        (WebCore::suffixLengthForRange): Changed argument from RefPtr to
+        a reference.
+        (WebCore::prefixLengthForRange): Ditto.
+        (WebCore::previousBoundary): Updated for ExceptionOr and the change
+        above.
+        (WebCore::nextBoundary): Ditto.
+        * editing/VisibleUnits.h: Updated for above.
+
+        * editing/htmlediting.cpp:
+        (WebCore::comparePositions): Updated to use ExceptionOr but behave
+        the same.
+        (WebCore::visiblePositionForIndexUsingCharacterIterator): Ditto.
+        (WebCore::isNodeVisiblyContainedWithin): Ditto.
+        * editing/ios/EditorIOS.mm:
+        (WebCore::Editor::setDictationPhrasesAsChildOfElement): Ditto.
+        (WebCore::Editor::setTextAsChildOfElement): Ditto.
+        * editing/mac/EditorMac.mm:
+        (WebCore::Editor::adjustedSelectionRange): Ditto.
+        * editing/markup.cpp:
+        (WebCore::createMarkupInternal): Ditto.
+        * page/ContextMenuController.cpp:
+        (WebCore::ContextMenuController::contextMenuItemSelected): Ditto.
+        * page/DOMSelection.cpp:
+        (WebCore::DOMSelection::addRange): Ditto.
+        (WebCore::DOMSelection::deleteFromDocument): Ditto.
+        (WebCore::DOMSelection::containsNode): Ditto.
+
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::dispatchMouseEvent): Updated for change to
+        use ExceptionOr in Ragne::compareNode. Also refactored the function
+        to make the logic a little mroe straightforward and nest less of it
+        inside a loop.
+
+        * page/Page.cpp:
+        (WebCore::Page::findStringMatchingRanges): Updated for ExceptionOr
+        without changing behavior.
+        * page/TextIndicator.cpp:
+        (WebCore::hasNonInlineOrReplacedElements): Ditto.
+        * rendering/RenderNamedFlowThread.cpp:
+        (WebCore::RenderNamedFlowThread::getRanges): Ditto.
+
</ins><span class="cx"> 2016-11-09  Dave Hyatt  &lt;hyatt@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [CSS Parser] Fix grid layout parsing
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilityAXObjectCachecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/AXObjectCache.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/AXObjectCache.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/accessibility/AXObjectCache.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -1641,20 +1641,21 @@
</span><span class="cx"> {
</span><span class="cx">     if (!node)
</span><span class="cx">         return nullptr;
</span><del>-    
</del><span class="cx">     Document* document = &amp;node-&gt;document();
</span><span class="cx">     if (!document)
</span><span class="cx">         return nullptr;
</span><del>-    RefPtr&lt;Range&gt; range = Range::create(*document);
-    ExceptionCode ec = 0;
-    // For replaced node without children, we should incluce itself in the range.
-    if (AccessibilityObject::replacedNodeNeedsCharacter(node))
-        range-&gt;selectNode(*node, ec);
-    else
-        range-&gt;selectNodeContents(*node, ec);
-    return ec ? nullptr : range;
</del><ins>+    auto range = Range::create(*document);
+    if (AccessibilityObject::replacedNodeNeedsCharacter(node)) {
+        // For replaced nodes without children, the node itself is included in the range.
+        if (range-&gt;selectNode(*node).hasException())
+            return nullptr;
+    } else {
+        if (range-&gt;selectNodeContents(*node).hasException())
+            return nullptr;
+    }
+    return WTFMove(range);
</ins><span class="cx"> }
</span><del>-    
</del><ins>+
</ins><span class="cx"> static bool isReplacedNodeOrBR(Node* node)
</span><span class="cx"> {
</span><span class="cx">     return node &amp;&amp; (AccessibilityObject::replacedNodeNeedsCharacter(node) || node-&gt;hasTagName(brTag));
</span><span class="lines">@@ -1681,7 +1682,14 @@
</span><span class="cx">     RefPtr&lt;Range&gt; range1 = AXObjectCache::rangeForNodeContents(node1);
</span><span class="cx">     RefPtr&lt;Range&gt; range2 = AXObjectCache::rangeForNodeContents(node2);
</span><span class="cx"> 
</span><del>-    return !range2 || (range1 &amp;&amp; range1-&gt;compareBoundaryPoints(Range::START_TO_START, *range2, IGNORE_EXCEPTION) &lt;= 0);
</del><ins>+    if (!range2)
+        return true;
+    if (!range1)
+        return false;
+    auto result = range1-&gt;compareBoundaryPoints(Range::START_TO_START, *range2);
+    if (result.hasException())
+        return true;
+    return result.releaseReturnValue() &lt;= 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static Node* resetNodeAndOffsetForReplacedNode(Node* replacedNode, int&amp; offset, int characterCount)
</span><span class="lines">@@ -1696,16 +1704,10 @@
</span><span class="cx">     return replacedNode-&gt;parentNode();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void setRangeStartOrEndWithCharacterOffset(RefPtr&lt;Range&gt; range, const CharacterOffset&amp; characterOffset, bool isStart, ExceptionCode&amp; ec)
</del><ins>+static bool setRangeStartOrEndWithCharacterOffset(Range&amp; range, const CharacterOffset&amp; characterOffset, bool isStart)
</ins><span class="cx"> {
</span><del>-    if (!range) {
-        ec = RangeError;
-        return;
-    }
-    if (characterOffset.isNull()) {
-        ec = TypeError;
-        return;
-    }
</del><ins>+    if (characterOffset.isNull())
+        return false;
</ins><span class="cx">     
</span><span class="cx">     int offset = characterOffset.startIndex + characterOffset.offset;
</span><span class="cx">     Node* node = characterOffset.node;
</span><span class="lines">@@ -1720,15 +1722,18 @@
</span><span class="cx">     if (replacedNodeOrBR || noChildren)
</span><span class="cx">         node = resetNodeAndOffsetForReplacedNode(node, offset, characterCount);
</span><span class="cx">     
</span><del>-    if (!node) {
-        ec = TypeError;
-        return;
</del><ins>+    if (!node)
+        return false;
+
+    if (isStart) {
+        if (range.setStart(*node, offset).hasException())
+            return false;
+    } else {
+        if (range.setEnd(*node, offset).hasException())
+            return false;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (isStart)
-        range-&gt;setStart(*node, offset, ec);
-    else
-        range-&gt;setEnd(*node, offset, ec);
</del><ins>+    return true;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> RefPtr&lt;Range&gt; AXObjectCache::rangeForUnorderedCharacterOffsets(const CharacterOffset&amp; characterOffset1, const CharacterOffset&amp; characterOffset2)
</span><span class="lines">@@ -1740,14 +1745,12 @@
</span><span class="cx">     CharacterOffset startCharacterOffset = alreadyInOrder ? characterOffset1 : characterOffset2;
</span><span class="cx">     CharacterOffset endCharacterOffset = alreadyInOrder ? characterOffset2 : characterOffset1;
</span><span class="cx">     
</span><del>-    RefPtr&lt;Range&gt; result = Range::create(m_document);
-    ExceptionCode ec = 0;
-    setRangeStartOrEndWithCharacterOffset(result, startCharacterOffset, true, ec);
-    setRangeStartOrEndWithCharacterOffset(result, endCharacterOffset, false, ec);
-    if (ec)
</del><ins>+    auto result = Range::create(m_document);
+    if (!setRangeStartOrEndWithCharacterOffset(result, startCharacterOffset, true))
</ins><span class="cx">         return nullptr;
</span><del>-    
-    return result;
</del><ins>+    if (!setRangeStartOrEndWithCharacterOffset(result, endCharacterOffset, false))
+        return nullptr;
+    return WTFMove(result);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void AXObjectCache::setTextMarkerDataWithCharacterOffset(TextMarkerData&amp; textMarkerData, const CharacterOffset&amp; characterOffset)
</span><span class="lines">@@ -2229,30 +2232,30 @@
</span><span class="cx"> CharacterOffset AXObjectCache::nextBoundary(const CharacterOffset&amp; characterOffset, BoundarySearchFunction searchFunction)
</span><span class="cx"> {
</span><span class="cx">     if (characterOffset.isNull())
</span><del>-        return CharacterOffset();
-    
</del><ins>+        return { };
+
</ins><span class="cx">     Node* boundary = parentEditingBoundary(characterOffset.node);
</span><span class="cx">     if (!boundary)
</span><del>-        return CharacterOffset();
-    
</del><ins>+        return { };
+
</ins><span class="cx">     RefPtr&lt;Range&gt; searchRange = rangeForNodeContents(boundary);
</span><ins>+    if (!searchRange)
+        return { };
+
</ins><span class="cx">     Vector&lt;UChar, 1024&gt; string;
</span><span class="cx">     unsigned prefixLength = 0;
</span><span class="cx">     
</span><del>-    ExceptionCode ec = 0;
</del><span class="cx">     if (requiresContextForWordBoundary(characterAfter(characterOffset))) {
</span><del>-        RefPtr&lt;Range&gt; backwardsScanRange(boundary-&gt;document().createRange());
-        setRangeStartOrEndWithCharacterOffset(backwardsScanRange, characterOffset, false, ec);
</del><ins>+        auto backwardsScanRange = boundary-&gt;document().createRange();
+        if (!setRangeStartOrEndWithCharacterOffset(backwardsScanRange, characterOffset, false))
+            return { };
</ins><span class="cx">         prefixLength = prefixLengthForRange(backwardsScanRange, string);
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    setRangeStartOrEndWithCharacterOffset(searchRange, characterOffset, true, ec);
</del><ins>+    if (!setRangeStartOrEndWithCharacterOffset(*searchRange, characterOffset, true))
+        return { };
</ins><span class="cx">     CharacterOffset end = startOrEndCharacterOffsetForRange(searchRange, false);
</span><span class="cx">     
</span><del>-    ASSERT(!ec);
-    if (ec)
-        return CharacterOffset();
-    
</del><span class="cx">     TextIterator it(searchRange.get(), TextIteratorEmitsObjectReplacementCharacters);
</span><span class="cx">     unsigned next = forwardSearchForBoundaryWithTextIterator(it, string, prefixLength, searchFunction);
</span><span class="cx">     
</span><span class="lines">@@ -2286,21 +2289,19 @@
</span><span class="cx">     Vector&lt;UChar, 1024&gt; string;
</span><span class="cx">     unsigned suffixLength = 0;
</span><span class="cx">     
</span><del>-    ExceptionCode ec = 0;
</del><span class="cx">     if (requiresContextForWordBoundary(characterBefore(characterOffset))) {
</span><del>-        RefPtr&lt;Range&gt; forwardsScanRange(boundary-&gt;document().createRange());
-        forwardsScanRange-&gt;setEndAfter(*boundary, ec);
-        setRangeStartOrEndWithCharacterOffset(forwardsScanRange, characterOffset, true, ec);
</del><ins>+        auto forwardsScanRange = boundary-&gt;document().createRange();
+        if (forwardsScanRange-&gt;setEndAfter(*boundary).hasException())
+            return { };
+        if (!setRangeStartOrEndWithCharacterOffset(forwardsScanRange, characterOffset, true))
+            return { };
</ins><span class="cx">         suffixLength = suffixLengthForRange(forwardsScanRange, string);
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    setRangeStartOrEndWithCharacterOffset(searchRange, characterOffset, false, ec);
</del><ins>+    if (!setRangeStartOrEndWithCharacterOffset(*searchRange, characterOffset, false))
+        return { };
</ins><span class="cx">     CharacterOffset start = startOrEndCharacterOffsetForRange(searchRange, true);
</span><span class="cx">     
</span><del>-    ASSERT(!ec);
-    if (ec)
-        return CharacterOffset();
-    
</del><span class="cx">     SimplifiedBackwardsTextIterator it(*searchRange);
</span><span class="cx">     unsigned next = backwardSearchForBoundaryWithTextIterator(it, string, suffixLength, searchFunction);
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilityAccessibilityObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/AccessibilityObject.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -695,7 +695,7 @@
</span><span class="cx">                 Node* closestContainerNode = closestStringPosition.containerNode();
</span><span class="cx">                 Node* searchContainerNode = searchStringPosition.containerNode();
</span><span class="cx">                 
</span><del>-                short result = Range::compareBoundaryPoints(closestContainerNode, closestPositionOffset, searchContainerNode, searchPositionOffset, ASSERT_NO_EXCEPTION);
</del><ins>+                short result = Range::compareBoundaryPoints(closestContainerNode, closestPositionOffset, searchContainerNode, searchPositionOffset).releaseReturnValue();
</ins><span class="cx">                 if ((!isBackwardSearch &amp;&amp; result &gt; 0) || (isBackwardSearch &amp;&amp; result &lt; 0))
</span><span class="cx">                     closestStringRange = searchStringRange;
</span><span class="cx">             }
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilityAccessibilityRenderObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -1458,15 +1458,22 @@
</span><span class="cx">     Node* node = m_renderer-&gt;node();
</span><span class="cx">     if (!node)
</span><span class="cx">         return PlainTextRange();
</span><del>-    
</del><ins>+
</ins><span class="cx">     VisibleSelection visibleSelection = selection();
</span><span class="cx">     RefPtr&lt;Range&gt; currentSelectionRange = visibleSelection.toNormalizedRange();
</span><del>-    if (!currentSelectionRange || !currentSelectionRange-&gt;intersectsNode(*node, IGNORE_EXCEPTION))
</del><ins>+    if (!currentSelectionRange)
</ins><span class="cx">         return PlainTextRange();
</span><del>-    
</del><ins>+    // FIXME: The reason this does the correct thing when the selection is in the
+    // shadow tree of an input element is that we get an exception below, and we
+    // choose to interpret all exceptions as &quot;does not intersect&quot;. Seems likely
+    // that does not handle all cases correctly.
+    auto intersectsResult = currentSelectionRange-&gt;intersectsNode(*node);
+    if (!intersectsResult.hasException() &amp;&amp; !intersectsResult.releaseReturnValue())
+        return PlainTextRange();
+
</ins><span class="cx">     int start = indexForVisiblePosition(visibleSelection.start());
</span><span class="cx">     int end = indexForVisiblePosition(visibleSelection.end());
</span><del>-    
</del><ins>+
</ins><span class="cx">     return PlainTextRange(start, end - start);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilityatkWebKitAccessibleUtilcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/atk/WebKitAccessibleUtil.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/atk/WebKitAccessibleUtil.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/accessibility/atk/WebKitAccessibleUtil.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -159,11 +159,14 @@
</span><span class="cx">     // AND that the selection is not just &quot;touching&quot; one of the
</span><span class="cx">     // boundaries for the selected node. We want to check whether the
</span><span class="cx">     // node is actually inside the region, at least partially.
</span><del>-    Node* node = coreObject-&gt;node();
-    Node* lastDescendant = node-&gt;lastDescendant();
-    return (range-&gt;intersectsNode(*node, IGNORE_EXCEPTION)
-        &amp;&amp; (&amp;range-&gt;endContainer() != node || range-&gt;endOffset())
-        &amp;&amp; (&amp;range-&gt;startContainer() != lastDescendant || static_cast&lt;int&gt;(range-&gt;startOffset()) != lastOffsetInNode(lastDescendant)));
</del><ins>+    auto&amp; node = *coreObject-&gt;node();
+    auto* lastDescendant = node.lastDescendant();
+    unsigned lastOffset = lastOffsetInNode(lastDescendant);
+    auto intersectsResult = range-&gt;intersectsNode(node);
+    return !intersectsResult.hasException()
+        &amp;&amp; intersectsResult.releaseReturnValue()
+        &amp;&amp; (&amp;range-&gt;endContainer() != &amp;node || range-&gt;endOffset())
+        &amp;&amp; (&amp;range-&gt;startContainer() != lastDescendant || range-&gt;startOffset() != lastOffset);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilityiosWebAccessibilityObjectWrapperIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -2175,11 +2175,11 @@
</span><span class="cx"> {
</span><span class="cx">     if (!range)
</span><span class="cx">         return NSMakeRange(NSNotFound, 0);
</span><del>-    
</del><ins>+
</ins><span class="cx">     Document* document = m_object-&gt;document();
</span><span class="cx">     Element* selectionRoot = document-&gt;frame()-&gt;selection().selection().rootEditableElement();
</span><span class="cx">     Element* scope = selectionRoot ? selectionRoot : document-&gt;documentElement();
</span><del>-    
</del><ins>+
</ins><span class="cx">     // Mouse events may cause TSM to attempt to create an NSRange for a portion of the view
</span><span class="cx">     // that is not inside the current editable region.  These checks ensure we don't produce
</span><span class="cx">     // potentially invalid data when responding to such requests.
</span><span class="lines">@@ -2187,13 +2187,11 @@
</span><span class="cx">         return NSMakeRange(NSNotFound, 0);
</span><span class="cx">     if (&amp;range-&gt;endContainer() != scope &amp;&amp; !range-&gt;endContainer().isDescendantOf(scope))
</span><span class="cx">         return NSMakeRange(NSNotFound, 0);
</span><del>-    
</del><ins>+
</ins><span class="cx">     RefPtr&lt;Range&gt; testRange = Range::create(scope-&gt;document(), scope, 0, &amp;range-&gt;startContainer(), range-&gt;startOffset());
</span><span class="cx">     ASSERT(&amp;testRange-&gt;startContainer() == scope);
</span><span class="cx">     int startPosition = TextIterator::rangeLength(testRange.get());
</span><del>-    
-    ExceptionCode ec;
-    testRange-&gt;setEnd(range-&gt;endContainer(), range-&gt;endOffset(), ec);
</del><ins>+    testRange-&gt;setEnd(range-&gt;endContainer(), range-&gt;endOffset());
</ins><span class="cx">     ASSERT(&amp;testRange-&gt;startContainer() == scope);
</span><span class="cx">     int endPosition = TextIterator::rangeLength(testRange.get());
</span><span class="cx">     return NSMakeRange(startPosition, endPosition - startPosition);
</span></span></pre></div>
<a id="trunkSourceWebCoredomNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Node.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Node.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/dom/Node.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -2356,8 +2356,8 @@
</span><span class="cx"> 
</span><span class="cx"> void Node::textRects(Vector&lt;IntRect&gt;&amp; rects) const
</span><span class="cx"> {
</span><del>-    RefPtr&lt;Range&gt; range = Range::create(document());
-    range-&gt;selectNodeContents(const_cast&lt;Node&amp;&gt;(*this), IGNORE_EXCEPTION);
</del><ins>+    auto range = Range::create(document());
+    range-&gt;selectNodeContents(const_cast&lt;Node&amp;&gt;(*this));
</ins><span class="cx">     range-&gt;absoluteTextRects(rects);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoredomRangecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Range.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Range.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/dom/Range.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -65,6 +65,13 @@
</span><span class="cx"> 
</span><span class="cx"> DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, rangeCounter, (&quot;Range&quot;));
</span><span class="cx"> 
</span><ins>+enum ContentsProcessDirection { ProcessContentsForward, ProcessContentsBackward };
+enum class CoordinateSpace { Absolute, Client };
+
+static ExceptionOr&lt;void&gt; processNodes(Range::ActionType, Vector&lt;Ref&lt;Node&gt;&gt;&amp;, Node* oldContainer, RefPtr&lt;Node&gt; newContainer);
+static ExceptionOr&lt;RefPtr&lt;Node&gt;&gt; processContentsBetweenOffsets(Range::ActionType, RefPtr&lt;DocumentFragment&gt;, RefPtr&lt;Node&gt; container, unsigned startOffset, unsigned endOffset);
+static ExceptionOr&lt;RefPtr&lt;Node&gt;&gt; processAncestorsAndTheirSiblings(Range::ActionType, Node* container, ContentsProcessDirection, ExceptionOr&lt;RefPtr&lt;Node&gt;&gt;&amp;&amp; passedClonedContainer, Node* commonRoot);
+
</ins><span class="cx"> inline Range::Range(Document&amp; ownerDocument)
</span><span class="cx">     : m_ownerDocument(ownerDocument)
</span><span class="cx">     , m_start(&amp;ownerDocument)
</span><span class="lines">@@ -121,7 +128,6 @@
</span><span class="cx"> 
</span><span class="cx"> Range::~Range()
</span><span class="cx"> {
</span><del>-    // Always detach (even if we've already detached) to fix https://bugs.webkit.org/show_bug.cgi?id=26044
</del><span class="cx">     m_ownerDocument-&gt;detachRange(this);
</span><span class="cx"> 
</span><span class="cx"> #ifndef NDEBUG
</span><span class="lines">@@ -159,10 +165,10 @@
</span><span class="cx">     while (startRootContainer-&gt;parentNode())
</span><span class="cx">         startRootContainer = startRootContainer-&gt;parentNode();
</span><span class="cx"> 
</span><del>-    return startRootContainer != endRootContainer || (Range::compareBoundaryPoints(start, end, ASSERT_NO_EXCEPTION) &gt; 0);
</del><ins>+    return startRootContainer != endRootContainer || Range::compareBoundaryPoints(start, end).releaseReturnValue() &gt; 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Range::setStart(Ref&lt;Node&gt;&amp;&amp; refNode, unsigned offset, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; Range::setStart(Ref&lt;Node&gt;&amp;&amp; refNode, unsigned offset)
</ins><span class="cx"> {
</span><span class="cx">     bool didMoveDocument = false;
</span><span class="cx">     if (&amp;refNode-&gt;document() != &amp;ownerDocument()) {
</span><span class="lines">@@ -170,18 +176,19 @@
</span><span class="cx">         didMoveDocument = true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ec = 0;
-    Node* childNode = checkNodeWOffset(refNode, offset, ec);
-    if (ec)
-        return;
</del><ins>+    auto childNode = checkNodeWOffset(refNode, offset);
+    if (childNode.hasException())
+        return childNode.releaseException();
</ins><span class="cx"> 
</span><del>-    m_start.set(WTFMove(refNode), offset, childNode);
</del><ins>+    m_start.set(WTFMove(refNode), offset, childNode.releaseReturnValue());
</ins><span class="cx"> 
</span><span class="cx">     if (didMoveDocument || checkForDifferentRootContainer(m_start, m_end))
</span><span class="cx">         collapse(true);
</span><ins>+
+    return { };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Range::setEnd(Ref&lt;Node&gt;&amp;&amp; refNode, unsigned offset, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; Range::setEnd(Ref&lt;Node&gt;&amp;&amp; refNode, unsigned offset)
</ins><span class="cx"> {
</span><span class="cx">     bool didMoveDocument = false;
</span><span class="cx">     if (&amp;refNode-&gt;document() != &amp;ownerDocument()) {
</span><span class="lines">@@ -189,35 +196,32 @@
</span><span class="cx">         didMoveDocument = true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ec = 0;
-    Node* childNode = checkNodeWOffset(refNode, offset, ec);
-    if (ec)
-        return;
</del><ins>+    auto childNode = checkNodeWOffset(refNode, offset);
+    if (childNode.hasException())
+        return childNode.releaseException();
</ins><span class="cx"> 
</span><del>-    m_end.set(WTFMove(refNode), offset, childNode);
</del><ins>+    m_end.set(WTFMove(refNode), offset, childNode.releaseReturnValue());
</ins><span class="cx"> 
</span><span class="cx">     if (didMoveDocument || checkForDifferentRootContainer(m_start, m_end))
</span><span class="cx">         collapse(false);
</span><ins>+
+    return { };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Range::setStart(const Position&amp; start, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; Range::setStart(const Position&amp; start)
</ins><span class="cx"> {
</span><span class="cx">     Position parentAnchored = start.parentAnchoredEquivalent();
</span><del>-    if (!parentAnchored.containerNode()) {
-        ec = TypeError;
-        return;
-    }
-    setStart(*parentAnchored.containerNode(), parentAnchored.offsetInContainerNode(), ec);
</del><ins>+    if (!parentAnchored.containerNode())
+        return Exception { TypeError };
+    return setStart(*parentAnchored.containerNode(), parentAnchored.offsetInContainerNode());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Range::setEnd(const Position&amp; end, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; Range::setEnd(const Position&amp; end)
</ins><span class="cx"> {
</span><span class="cx">     Position parentAnchored = end.parentAnchoredEquivalent();
</span><del>-    if (!parentAnchored.containerNode()) {
-        ec = TypeError;
-        return;
-    }
-    setEnd(*parentAnchored.containerNode(), parentAnchored.offsetInContainerNode(), ec);
</del><ins>+    if (!parentAnchored.containerNode())
+        return Exception { TypeError };
+    return setEnd(*parentAnchored.containerNode(), parentAnchored.offsetInContainerNode());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Range::collapse(bool toStart)
</span><span class="lines">@@ -228,58 +232,56 @@
</span><span class="cx">         m_start = m_end;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Range::isPointInRange(Node&amp; refNode, unsigned offset, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;bool&gt; Range::isPointInRange(Node&amp; refNode, unsigned offset)
</ins><span class="cx"> {
</span><del>-    if (&amp;refNode.document() != &amp;ownerDocument()) {
</del><ins>+    if (&amp;refNode.document() != &amp;ownerDocument())
</ins><span class="cx">         return false;
</span><del>-    }
</del><span class="cx"> 
</span><del>-    ec = 0;
-    checkNodeWOffset(refNode, offset, ec);
-    if (ec) {
</del><ins>+    auto checkNodeResult = checkNodeWOffset(refNode, offset);
+    if (checkNodeResult.hasException()) {
</ins><span class="cx">         // DOM4 spec requires us to check whether refNode and start container have the same root first
</span><span class="cx">         // but we do it in the reverse order to avoid O(n) operation here in common case.
</span><span class="cx">         if (!commonAncestorContainer(&amp;refNode, &amp;startContainer()))
</span><del>-            ec = 0;
-        return false;
</del><ins>+            return false;
+        return checkNodeResult.releaseException();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool result = compareBoundaryPoints(&amp;refNode, offset, &amp;startContainer(), m_start.offset(), ec) &gt;= 0 &amp;&amp; !ec
-        &amp;&amp; compareBoundaryPoints(&amp;refNode, offset, &amp;endContainer(), m_end.offset(), ec) &lt;= 0 &amp;&amp; !ec;
-    ASSERT(!ec || ec == WRONG_DOCUMENT_ERR);
-    ec = 0;
-    return result;
</del><ins>+    auto startCompareResult = compareBoundaryPoints(&amp;refNode, offset, &amp;startContainer(), m_start.offset());
+    if (!(!startCompareResult.hasException() &amp;&amp; startCompareResult.releaseReturnValue() &gt;= 0))
+        return false;
+    auto endCompareResult = compareBoundaryPoints(&amp;refNode, offset, &amp;endContainer(), m_end.offset());
+    return !endCompareResult.hasException() &amp;&amp; endCompareResult.releaseReturnValue() &lt;= 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-short Range::comparePoint(Node&amp; refNode, unsigned offset, ExceptionCode&amp; ec) const
</del><ins>+ExceptionOr&lt;short&gt; Range::comparePoint(Node&amp; refNode, unsigned offset) const
</ins><span class="cx"> {
</span><span class="cx">     // http://developer.mozilla.org/en/docs/DOM:range.comparePoint
</span><span class="cx">     // This method returns -1, 0 or 1 depending on if the point described by the 
</span><span class="cx">     // refNode node and an offset within the node is before, same as, or after the range respectively.
</span><del>-    if (&amp;refNode.document() != &amp;ownerDocument()) {
-        ec = WRONG_DOCUMENT_ERR;
-        return 0;
-    }
</del><ins>+    if (&amp;refNode.document() != &amp;ownerDocument())
+        return Exception { WRONG_DOCUMENT_ERR };
</ins><span class="cx"> 
</span><del>-    ec = 0;
-    checkNodeWOffset(refNode, offset, ec);
-    if (ec) {
</del><ins>+    auto checkNodeResult = checkNodeWOffset(refNode, offset);
+    if (checkNodeResult.hasException()) {
</ins><span class="cx">         // DOM4 spec requires us to check whether refNode and start container have the same root first
</span><span class="cx">         // but we do it in the reverse order to avoid O(n) operation here in common case.
</span><span class="cx">         if (!refNode.inDocument() &amp;&amp; !commonAncestorContainer(&amp;refNode, &amp;startContainer()))
</span><del>-            ec = WRONG_DOCUMENT_ERR;
-        return 0;
</del><ins>+            return Exception { WRONG_DOCUMENT_ERR };
+        return checkNodeResult.releaseException();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // compare to start, and point comes before
</span><del>-    if (compareBoundaryPoints(&amp;refNode, offset, &amp;startContainer(), m_start.offset(), ec) &lt; 0)
</del><ins>+    auto startCompareResult = compareBoundaryPoints(&amp;refNode, offset, &amp;startContainer(), m_start.offset());
+    if (startCompareResult.hasException())
+        return startCompareResult.releaseException();
+    if (startCompareResult.releaseReturnValue() &lt; 0)
</ins><span class="cx">         return -1;
</span><span class="cx"> 
</span><del>-    if (ec)
-        return 0;
-
</del><span class="cx">     // compare to end, and point comes after
</span><del>-    if (compareBoundaryPoints(&amp;refNode, offset, &amp;endContainer(), m_end.offset(), ec) &gt; 0 &amp;&amp; !ec)
</del><ins>+    auto endCompareResult = compareBoundaryPoints(&amp;refNode, offset, &amp;endContainer(), m_end.offset());
+    if (endCompareResult.hasException())
+        return endCompareResult.releaseException();
+    if (endCompareResult.releaseReturnValue() &gt; 0)
</ins><span class="cx">         return 1;
</span><span class="cx"> 
</span><span class="cx">     // point is in the middle of this range, or on the boundary points
</span><span class="lines">@@ -286,7 +288,7 @@
</span><span class="cx">     return 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Range::CompareResults Range::compareNode(Node&amp; refNode, ExceptionCode&amp; ec) const
</del><ins>+ExceptionOr&lt;Range::CompareResults&gt; Range::compareNode(Node&amp; refNode) const
</ins><span class="cx"> {
</span><span class="cx">     // http://developer.mozilla.org/en/docs/DOM:range.compareNode
</span><span class="cx">     // This method returns 0, 1, 2, or 3 based on if the node is before, after,
</span><span class="lines">@@ -302,74 +304,71 @@
</span><span class="cx">         return NODE_BEFORE;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ContainerNode* parentNode = refNode.parentNode();
-    unsigned nodeIndex = refNode.computeNodeIndex();
-    
</del><ins>+    auto* parentNode = refNode.parentNode();
</ins><span class="cx">     if (!parentNode) {
</span><del>-        // if the node is the top document we should return NODE_BEFORE_AND_AFTER
-        // but we throw to match firefox behavior
-        ec = NOT_FOUND_ERR;
-        return NODE_BEFORE;
</del><ins>+        // If the node is the top of the tree we should return NODE_BEFORE_AND_AFTER,
+        // but we throw to match firefox behavior.
+        return Exception { NOT_FOUND_ERR };
</ins><span class="cx">     }
</span><ins>+    auto nodeIndex = refNode.computeNodeIndex();
</ins><span class="cx"> 
</span><del>-    // starts before
-    if (comparePoint(*parentNode, nodeIndex, ec) &lt; 0) {
-        if (comparePoint(*parentNode, nodeIndex + 1, ec) &gt; 0) // ends after the range
-            return NODE_BEFORE_AND_AFTER;
-        return NODE_BEFORE; // ends before or in the range
-    }
-    // starts at or after the range start
-    if (comparePoint(*parentNode, nodeIndex + 1, ec) &gt; 0) // ends after the range
-        return NODE_AFTER;
-    return NODE_INSIDE; // ends inside the range
</del><ins>+    auto nodeStartCompareResult = comparePoint(*parentNode, nodeIndex);
+    if (nodeStartCompareResult.hasException())
+        return nodeStartCompareResult.releaseException();
+    auto nodeEndCompareResult = comparePoint(*parentNode, nodeIndex + 1);
+    if (nodeEndCompareResult.hasException())
+        return nodeEndCompareResult.releaseException();
+
+    bool nodeStartsBeforeRange = nodeStartCompareResult.releaseReturnValue() &lt; 0;
+    bool nodeEndsAfterRange = nodeEndCompareResult.releaseReturnValue() &gt; 0;
+
+    return nodeStartsBeforeRange
+        ? (nodeEndsAfterRange ? NODE_BEFORE_AND_AFTER : NODE_BEFORE)
+        : (nodeEndsAfterRange ? NODE_AFTER : NODE_INSIDE);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-short Range::compareBoundaryPoints(CompareHow how, const Range&amp; sourceRange, ExceptionCode&amp; ec) const
</del><ins>+static inline Node* top(Node&amp; node)
</ins><span class="cx"> {
</span><del>-    Node* thisCont = commonAncestorContainer();
-    Node* sourceCont = sourceRange.commonAncestorContainer();
</del><ins>+    auto* top = &amp;node;
+    while (auto* parent = top-&gt;parentNode())
+        top = parent;
+    return top;
+}
</ins><span class="cx"> 
</span><del>-    if (&amp;thisCont-&gt;document() != &amp;sourceCont-&gt;document()) {
-        ec = WRONG_DOCUMENT_ERR;
-        return 0;
-    }
</del><ins>+ExceptionOr&lt;short&gt; Range::compareBoundaryPoints(CompareHow how, const Range&amp; sourceRange) const
+{
+    auto* thisContainer = commonAncestorContainer();
+    auto* sourceContainer = sourceRange.commonAncestorContainer();
+    if (!thisContainer || !sourceContainer || &amp;thisContainer-&gt;document() != &amp;sourceContainer-&gt;document() || top(*thisContainer) != top(*sourceContainer))
+        return Exception { WRONG_DOCUMENT_ERR };
</ins><span class="cx"> 
</span><del>-    Node* thisTop = thisCont;
-    Node* sourceTop = sourceCont;
-    while (thisTop-&gt;parentNode())
-        thisTop = thisTop-&gt;parentNode();
-    while (sourceTop-&gt;parentNode())
-        sourceTop = sourceTop-&gt;parentNode();
-    if (thisTop != sourceTop) { // in different DocumentFragments
-        ec = WRONG_DOCUMENT_ERR;
-        return 0;
-    }
-
</del><span class="cx">     switch (how) {
</span><del>-        case START_TO_START:
-            return compareBoundaryPoints(m_start, sourceRange.m_start, ec);
-        case START_TO_END:
-            return compareBoundaryPoints(m_end, sourceRange.m_start, ec);
-        case END_TO_END:
-            return compareBoundaryPoints(m_end, sourceRange.m_end, ec);
-        case END_TO_START:
-            return compareBoundaryPoints(m_start, sourceRange.m_end, ec);
</del><ins>+    case START_TO_START:
+        return compareBoundaryPoints(m_start, sourceRange.m_start);
+    case START_TO_END:
+        return compareBoundaryPoints(m_end, sourceRange.m_start);
+    case END_TO_END:
+        return compareBoundaryPoints(m_end, sourceRange.m_end);
+    case END_TO_START:
+        return compareBoundaryPoints(m_start, sourceRange.m_end);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ec = SYNTAX_ERR;
-    return 0;
</del><ins>+    return Exception { SYNTAX_ERR };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-short Range::compareBoundaryPointsForBindings(unsigned short compareHow, const Range&amp; sourceRange, ExceptionCode&amp; ec) const
</del><ins>+ExceptionOr&lt;short&gt; Range::compareBoundaryPointsForBindings(unsigned short how, const Range&amp; sourceRange) const
</ins><span class="cx"> {
</span><del>-    if (compareHow &gt; END_TO_START) {
-        ec = NOT_SUPPORTED_ERR;
-        return 0;
</del><ins>+    switch (how) {
+    case START_TO_START:
+    case START_TO_END:
+    case END_TO_END:
+    case END_TO_START:
+        return compareBoundaryPoints(static_cast&lt;CompareHow&gt;(how), sourceRange);
</ins><span class="cx">     }
</span><del>-    return compareBoundaryPoints(static_cast&lt;CompareHow&gt;(compareHow), sourceRange, ec);
</del><ins>+    return Exception { NOT_SUPPORTED_ERR };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-short Range::compareBoundaryPoints(Node* containerA, unsigned offsetA, Node* containerB, unsigned offsetB, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;short&gt; Range::compareBoundaryPoints(Node* containerA, unsigned offsetA, Node* containerB, unsigned offsetB)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(containerA);
</span><span class="cx">     ASSERT(containerB);
</span><span class="lines">@@ -384,11 +383,10 @@
</span><span class="cx">     // case 1: both points have the same container
</span><span class="cx">     if (containerA == containerB) {
</span><span class="cx">         if (offsetA == offsetB)
</span><del>-            return 0;           // A is equal to B
</del><ins>+            return 0; // A is equal to B
</ins><span class="cx">         if (offsetA &lt; offsetB)
</span><del>-            return -1;          // A is before B
-        else
-            return 1;           // A is after B
</del><ins>+            return -1; // A is before B
+        return 1; // A is after B
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // case 2: node C (container B or an ancestor) is a child node of A
</span><span class="lines">@@ -402,11 +400,9 @@
</span><span class="cx">             offsetC++;
</span><span class="cx">             n = n-&gt;nextSibling();
</span><span class="cx">         }
</span><del>-
</del><span class="cx">         if (offsetA &lt;= offsetC)
</span><del>-            return -1;              // A is before B
-        else
-            return 1;               // A is after B
</del><ins>+            return -1; // A is before B
+        return 1; // A is after B
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // case 3: node C (container A or an ancestor) is a child node of B
</span><span class="lines">@@ -420,20 +416,16 @@
</span><span class="cx">             offsetC++;
</span><span class="cx">             n = n-&gt;nextSibling();
</span><span class="cx">         }
</span><del>-
</del><span class="cx">         if (offsetC &lt; offsetB)
</span><del>-            return -1;              // A is before B
-        else
-            return 1;               // A is after B
</del><ins>+            return -1; // A is before B
+        return 1; // A is after B
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // case 4: containers A &amp; B are siblings, or children of siblings
</span><span class="cx">     // ### we need to do a traversal here instead
</span><del>-    Node* commonAncestor = commonAncestorContainer(containerA, containerB);
-    if (!commonAncestor) {
-        ec = WRONG_DOCUMENT_ERR;
-        return 0;
-    }
</del><ins>+    auto* commonAncestor = commonAncestorContainer(containerA, containerB);
+    if (!commonAncestor)
+        return Exception { WRONG_DOCUMENT_ERR };
</ins><span class="cx">     Node* childA = containerA;
</span><span class="cx">     while (childA &amp;&amp; childA-&gt;parentNode() != commonAncestor)
</span><span class="cx">         childA = childA-&gt;parentNode();
</span><span class="lines">@@ -462,23 +454,26 @@
</span><span class="cx">     return 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-short Range::compareBoundaryPoints(const RangeBoundaryPoint&amp; boundaryA, const RangeBoundaryPoint&amp; boundaryB, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;short&gt; Range::compareBoundaryPoints(const RangeBoundaryPoint&amp; boundaryA, const RangeBoundaryPoint&amp; boundaryB)
</ins><span class="cx"> {
</span><del>-    return compareBoundaryPoints(boundaryA.container(), boundaryA.offset(), boundaryB.container(), boundaryB.offset(), ec);
</del><ins>+    return compareBoundaryPoints(boundaryA.container(), boundaryA.offset(), boundaryB.container(), boundaryB.offset());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Range::boundaryPointsValid() const
</span><span class="cx"> {
</span><del>-    ExceptionCode ec = 0;
-    return compareBoundaryPoints(m_start, m_end, ec) &lt;= 0 &amp;&amp; !ec;
</del><ins>+    auto result = compareBoundaryPoints(m_start, m_end);
+    return !result.hasException() &amp;&amp; result.releaseReturnValue() &lt;= 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Range::deleteContents(ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; Range::deleteContents()
</ins><span class="cx"> {
</span><del>-    processContents(Delete, ec);
</del><ins>+    auto result = processContents(Delete);
+    if (result.hasException())
+        return result.releaseException();
+    return { };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Range::intersectsNode(Node&amp; refNode, ExceptionCode&amp; ec) const
</del><ins>+ExceptionOr&lt;bool&gt; Range::intersectsNode(Node&amp; refNode) const
</ins><span class="cx"> {
</span><span class="cx">     if (!refNode.inDocument() || &amp;refNode.document() != &amp;ownerDocument())
</span><span class="cx">         return false;
</span><span class="lines">@@ -491,8 +486,14 @@
</span><span class="cx"> 
</span><span class="cx">     // If (parent, offset) is before end and (parent, offset + 1) is after start, return true.
</span><span class="cx">     // Otherwise, return false.
</span><del>-    short compareFirst = comparePoint(*parentNode, nodeIndex, ec);
-    short compareSecond = comparePoint(*parentNode, nodeIndex + 1, ec);
</del><ins>+    auto result = comparePoint(*parentNode, nodeIndex);
+    if (result.hasException())
+        return result.releaseException();
+    auto compareFirst = result.releaseReturnValue();
+    result = comparePoint(*parentNode, nodeIndex + 1);
+    if (result.hasException())
+        return result.releaseException();
+    auto compareSecond = result.releaseReturnValue();
</ins><span class="cx"> 
</span><span class="cx">     bool isFirstBeforeEnd = m_start == m_end ? compareFirst &lt; 0 : compareFirst &lt;= 0;
</span><span class="cx">     bool isSecondAfterStart = m_start == m_end ? compareSecond &gt; 0 : compareSecond &gt;= 0;
</span><span class="lines">@@ -554,23 +555,23 @@
</span><span class="cx">     return 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;DocumentFragment&gt; Range::processContents(ActionType action, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;RefPtr&lt;DocumentFragment&gt;&gt; Range::processContents(ActionType action)
</ins><span class="cx"> {
</span><del>-    typedef Vector&lt;Ref&lt;Node&gt;&gt; NodeVector;
-
</del><span class="cx">     RefPtr&lt;DocumentFragment&gt; fragment;
</span><span class="cx">     if (action == Extract || action == Clone)
</span><span class="cx">         fragment = DocumentFragment::create(ownerDocument());
</span><span class="cx"> 
</span><span class="cx">     if (collapsed())
</span><del>-        return fragment;
</del><ins>+        return WTFMove(fragment);
</ins><span class="cx"> 
</span><span class="cx">     RefPtr&lt;Node&gt; commonRoot = commonAncestorContainer();
</span><span class="cx">     ASSERT(commonRoot);
</span><span class="cx"> 
</span><span class="cx">     if (&amp;startContainer() == &amp;endContainer()) {
</span><del>-        processContentsBetweenOffsets(action, fragment, &amp;startContainer(), m_start.offset(), m_end.offset(), ec);
-        return fragment;
</del><ins>+        auto result = processContentsBetweenOffsets(action, fragment, &amp;startContainer(), m_start.offset(), m_end.offset());
+        if (result.hasException())
+            return result.releaseException();
+        return WTFMove(fragment);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Since mutation events can modify the range during the process, the boundary points need to be saved.
</span><span class="lines">@@ -603,14 +604,20 @@
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;Node&gt; leftContents;
</span><span class="cx">     if (originalStart.container() != commonRoot &amp;&amp; commonRoot-&gt;contains(originalStart.container())) {
</span><del>-        leftContents = processContentsBetweenOffsets(action, 0, originalStart.container(), originalStart.offset(), lengthOfContentsInNode(*originalStart.container()), ec);
-        leftContents = processAncestorsAndTheirSiblings(action, originalStart.container(), ProcessContentsForward, WTFMove(leftContents), commonRoot.get(), ec);
</del><ins>+        auto firstResult = processContentsBetweenOffsets(action, nullptr, originalStart.container(), originalStart.offset(), lengthOfContentsInNode(*originalStart.container()));
+        auto secondResult = processAncestorsAndTheirSiblings(action, originalStart.container(), ProcessContentsForward, WTFMove(firstResult), commonRoot.get());
+        // FIXME: A bit peculiar that we silently ignore the exception here, but we do have at least some regression tests that rely on this behavior.
+        if (!secondResult.hasException())
+            leftContents = secondResult.releaseReturnValue();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;Node&gt; rightContents;
</span><span class="cx">     if (&amp;endContainer() != commonRoot &amp;&amp; commonRoot-&gt;contains(originalEnd.container())) {
</span><del>-        rightContents = processContentsBetweenOffsets(action, 0, originalEnd.container(), 0, originalEnd.offset(), ec);
-        rightContents = processAncestorsAndTheirSiblings(action, originalEnd.container(), ProcessContentsBackward, WTFMove(rightContents), commonRoot.get(), ec);
</del><ins>+        auto firstResult = processContentsBetweenOffsets(action, nullptr, originalEnd.container(), 0, originalEnd.offset());
+        auto secondResult = processAncestorsAndTheirSiblings(action, originalEnd.container(), ProcessContentsBackward, WTFMove(firstResult), commonRoot.get());
+        // FIXME: A bit peculiar that we silently ignore the exception here, but we do have at least some regression tests that rely on this behavior.
+        if (!secondResult.hasException())
+            rightContents = secondResult.releaseReturnValue();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // delete all children of commonRoot between the start and end container
</span><span class="lines">@@ -620,14 +627,16 @@
</span><span class="cx">     RefPtr&lt;Node&gt; processEnd = childOfCommonRootBeforeOffset(originalEnd.container(), originalEnd.offset(), commonRoot.get());
</span><span class="cx"> 
</span><span class="cx">     // Collapse the range, making sure that the result is not within a node that was partially selected.
</span><del>-    ec = 0;
</del><span class="cx">     if (action == Extract || action == Delete) {
</span><del>-        if (partialStart &amp;&amp; commonRoot-&gt;contains(partialStart.get()))
-            setStart(*partialStart-&gt;parentNode(), partialStart-&gt;computeNodeIndex() + 1, ec);
-        else if (partialEnd &amp;&amp; commonRoot-&gt;contains(partialEnd.get()))
-            setStart(*partialEnd-&gt;parentNode(), partialEnd-&gt;computeNodeIndex(), ec);
-        if (ec)
-            return nullptr;
</del><ins>+        if (partialStart &amp;&amp; commonRoot-&gt;contains(partialStart.get())) {
+            auto result = setStart(*partialStart-&gt;parentNode(), partialStart-&gt;computeNodeIndex() + 1);
+            if (result.hasException())
+                return result.releaseException();
+        } else if (partialEnd &amp;&amp; commonRoot-&gt;contains(partialEnd.get())) {
+            auto result = setStart(*partialEnd-&gt;parentNode(), partialEnd-&gt;computeNodeIndex());
+            if (result.hasException())
+                return result.releaseException();
+        }
</ins><span class="cx">         m_end = m_start;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -634,83 +643,104 @@
</span><span class="cx">     // Now add leftContents, stuff in between, and rightContents to the fragment
</span><span class="cx">     // (or just delete the stuff in between)
</span><span class="cx"> 
</span><del>-    if ((action == Extract || action == Clone) &amp;&amp; leftContents)
</del><ins>+    if ((action == Extract || action == Clone) &amp;&amp; leftContents) {
+        ExceptionCode ec = 0;
</ins><span class="cx">         fragment-&gt;appendChild(*leftContents, ec);
</span><ins>+        if (ec)
+            return Exception { ec };
+    }
</ins><span class="cx"> 
</span><span class="cx">     if (processStart) {
</span><del>-        NodeVector nodes;
</del><ins>+        Vector&lt;Ref&lt;Node&gt;&gt; nodes;
</ins><span class="cx">         for (Node* node = processStart.get(); node &amp;&amp; node != processEnd; node = node-&gt;nextSibling())
</span><span class="cx">             nodes.append(*node);
</span><del>-        processNodes(action, nodes, commonRoot.get(), fragment.get(), ec);
</del><ins>+        auto result = processNodes(action, nodes, commonRoot.get(), fragment.get());
+        if (result.hasException())
+            return result.releaseException();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if ((action == Extract || action == Clone) &amp;&amp; rightContents)
</del><ins>+    if ((action == Extract || action == Clone) &amp;&amp; rightContents) {
+        ExceptionCode ec = 0;
</ins><span class="cx">         fragment-&gt;appendChild(*rightContents, ec);
</span><ins>+        if (ec)
+            return Exception { ec };
+    }
</ins><span class="cx"> 
</span><del>-    return fragment;
</del><ins>+    return WTFMove(fragment);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static inline void deleteCharacterData(CharacterData&amp; data, unsigned startOffset, unsigned endOffset, ExceptionCode&amp; ec)
</del><ins>+static inline ExceptionOr&lt;void&gt; deleteCharacterData(CharacterData&amp; data, unsigned startOffset, unsigned endOffset)
</ins><span class="cx"> {
</span><span class="cx">     if (data.length() - endOffset) {
</span><span class="cx">         auto result = data.deleteData(endOffset, data.length() - endOffset);
</span><span class="cx">         if (result.hasException())
</span><del>-            ec = result.releaseException().code();
</del><ins>+            return result.releaseException();
</ins><span class="cx">     }
</span><span class="cx">     if (startOffset) {
</span><span class="cx">         auto result = data.deleteData(0, startOffset);
</span><span class="cx">         if (result.hasException())
</span><del>-            ec = result.releaseException().code();
</del><ins>+            return result.releaseException();
</ins><span class="cx">     }
</span><ins>+    return { };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;Node&gt; Range::processContentsBetweenOffsets(ActionType action, PassRefPtr&lt;DocumentFragment&gt; fragment, Node* container, unsigned startOffset, unsigned endOffset, ExceptionCode&amp; ec)
</del><ins>+static ExceptionOr&lt;RefPtr&lt;Node&gt;&gt; processContentsBetweenOffsets(Range::ActionType action, RefPtr&lt;DocumentFragment&gt; fragment, RefPtr&lt;Node&gt; container, unsigned startOffset, unsigned endOffset)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(container);
</span><span class="cx">     ASSERT(startOffset &lt;= endOffset);
</span><span class="cx"> 
</span><ins>+    RefPtr&lt;Node&gt; result;
+
</ins><span class="cx">     // This switch statement must be consistent with that of lengthOfContentsInNode.
</span><del>-    RefPtr&lt;Node&gt; result;
</del><span class="cx">     switch (container-&gt;nodeType()) {
</span><span class="cx">     case Node::TEXT_NODE:
</span><span class="cx">     case Node::CDATA_SECTION_NODE:
</span><span class="cx">     case Node::COMMENT_NODE:
</span><del>-        endOffset = std::min(endOffset, static_cast&lt;CharacterData*&gt;(container)-&gt;length());
</del><ins>+        endOffset = std::min(endOffset, downcast&lt;CharacterData&gt;(*container).length());
</ins><span class="cx">         startOffset = std::min(startOffset, endOffset);
</span><del>-        if (action == Extract || action == Clone) {
-            Ref&lt;CharacterData&gt; characters = static_cast&lt;CharacterData&amp;&gt;(container-&gt;cloneNode(true).get());
-            deleteCharacterData(characters, startOffset, endOffset, ec);
</del><ins>+        if (action == Range::Extract || action == Range::Clone) {
+            Ref&lt;CharacterData&gt; characters = downcast&lt;CharacterData&gt;(container-&gt;cloneNode(true).get());
+            auto deleteResult = deleteCharacterData(characters, startOffset, endOffset);
+            if (deleteResult.hasException())
+                return deleteResult.releaseException();
</ins><span class="cx">             if (fragment) {
</span><span class="cx">                 result = fragment;
</span><ins>+                ExceptionCode ec = 0;
</ins><span class="cx">                 result-&gt;appendChild(characters, ec);
</span><ins>+                if (ec)
+                    return Exception { ec };
</ins><span class="cx">             } else
</span><span class="cx">                 result = WTFMove(characters);
</span><span class="cx">         }
</span><del>-        if (action == Extract || action == Delete) {
-            auto result = downcast&lt;CharacterData&gt;(*container).deleteData(startOffset, endOffset - startOffset);
-            if (result.hasException())
-                ec = result.releaseException().code();
</del><ins>+        if (action == Range::Extract || action == Range::Delete) {
+            auto deleteResult = downcast&lt;CharacterData&gt;(*container).deleteData(startOffset, endOffset - startOffset);
+            if (deleteResult.hasException())
+                return deleteResult.releaseException();
</ins><span class="cx">         }
</span><span class="cx">         break;
</span><del>-    case Node::PROCESSING_INSTRUCTION_NODE:
-        endOffset = std::min(endOffset, static_cast&lt;ProcessingInstruction*&gt;(container)-&gt;data().length());
</del><ins>+    case Node::PROCESSING_INSTRUCTION_NODE: {
+        auto&amp; instruction = downcast&lt;ProcessingInstruction&gt;(*container);
+        endOffset = std::min(endOffset, downcast&lt;ProcessingInstruction&gt;(*container).data().length());
</ins><span class="cx">         startOffset = std::min(startOffset, endOffset);
</span><del>-        if (action == Extract || action == Clone) {
-            Ref&lt;ProcessingInstruction&gt; processingInstruction = static_cast&lt;ProcessingInstruction&amp;&gt;(container-&gt;cloneNode(true).get());
</del><ins>+        if (action == Range::Extract || action == Range::Clone) {
+            Ref&lt;ProcessingInstruction&gt; processingInstruction = downcast&lt;ProcessingInstruction&gt;(container-&gt;cloneNode(true).get());
</ins><span class="cx">             processingInstruction-&gt;setData(processingInstruction-&gt;data().substring(startOffset, endOffset - startOffset));
</span><span class="cx">             if (fragment) {
</span><span class="cx">                 result = fragment;
</span><ins>+                ExceptionCode ec = 0;
</ins><span class="cx">                 result-&gt;appendChild(processingInstruction, ec);
</span><ins>+                if (ec)
+                    return Exception { ec };
</ins><span class="cx">             } else
</span><span class="cx">                 result = WTFMove(processingInstruction);
</span><span class="cx">         }
</span><del>-        if (action == Extract || action == Delete) {
-            ProcessingInstruction&amp; pi = downcast&lt;ProcessingInstruction&gt;(*container);
-            String data(pi.data());
</del><ins>+        if (action == Range::Extract || action == Range::Delete) {
+            String data { instruction.data() };
</ins><span class="cx">             data.remove(startOffset, endOffset - startOffset);
</span><del>-            pi.setData(data);
</del><ins>+            instruction.setData(data);
</ins><span class="cx">         }
</span><span class="cx">         break;
</span><ins>+    }
</ins><span class="cx">     case Node::ELEMENT_NODE:
</span><span class="cx">     case Node::ATTRIBUTE_NODE:
</span><span class="cx">     case Node::DOCUMENT_NODE:
</span><span class="lines">@@ -717,54 +747,68 @@
</span><span class="cx">     case Node::DOCUMENT_TYPE_NODE:
</span><span class="cx">     case Node::DOCUMENT_FRAGMENT_NODE:
</span><span class="cx">         // FIXME: Should we assert that some nodes never appear here?
</span><del>-        if (action == Extract || action == Clone) {
</del><ins>+        if (action == Range::Extract || action == Range::Clone) {
</ins><span class="cx">             if (fragment)
</span><span class="cx">                 result = fragment;
</span><span class="cx">             else
</span><span class="cx">                 result = container-&gt;cloneNode(false);
</span><span class="cx">         }
</span><del>-
</del><ins>+        Vector&lt;Ref&lt;Node&gt;&gt; nodes;
</ins><span class="cx">         Node* n = container-&gt;firstChild();
</span><del>-        Vector&lt;Ref&lt;Node&gt;&gt; nodes;
</del><span class="cx">         for (unsigned i = startOffset; n &amp;&amp; i; i--)
</span><span class="cx">             n = n-&gt;nextSibling();
</span><span class="cx">         for (unsigned i = startOffset; n &amp;&amp; i &lt; endOffset; i++, n = n-&gt;nextSibling()) {
</span><del>-            if (action != Delete &amp;&amp; n-&gt;isDocumentTypeNode()) {
-                ec = HIERARCHY_REQUEST_ERR;
-                return nullptr;
</del><ins>+            if (action != Range::Delete &amp;&amp; n-&gt;isDocumentTypeNode()) {
+                return Exception { HIERARCHY_REQUEST_ERR };
</ins><span class="cx">             }
</span><span class="cx">             nodes.append(*n);
</span><span class="cx">         }
</span><del>-
-        processNodes(action, nodes, container, result.get(), ec);
</del><ins>+        auto processResult = processNodes(action, nodes, container.get(), result);
+        if (processResult.hasException())
+            return processResult.releaseException();
</ins><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return result;
</del><ins>+    return WTFMove(result);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Range::processNodes(ActionType action, Vector&lt;Ref&lt;Node&gt;&gt;&amp; nodes, Node* oldContainer, Node* newContainer, ExceptionCode&amp; ec)
</del><ins>+static ExceptionOr&lt;void&gt; processNodes(Range::ActionType action, Vector&lt;Ref&lt;Node&gt;&gt;&amp; nodes, Node* oldContainer, RefPtr&lt;Node&gt; newContainer)
</ins><span class="cx"> {
</span><span class="cx">     for (auto&amp; node : nodes) {
</span><span class="cx">         switch (action) {
</span><del>-        case Delete:
</del><ins>+        case Range::Delete: {
+            ExceptionCode ec = 0;
</ins><span class="cx">             oldContainer-&gt;removeChild(node, ec);
</span><ins>+            if (ec)
+                return Exception { ec };
</ins><span class="cx">             break;
</span><del>-        case Extract:
</del><ins>+        }
+        case Range::Extract: {
+            ExceptionCode ec = 0;
</ins><span class="cx">             newContainer-&gt;appendChild(node, ec); // will remove n from its parent
</span><ins>+            if (ec)
+                return Exception { ec };
</ins><span class="cx">             break;
</span><del>-        case Clone:
</del><ins>+        }
+        case Range::Clone: {
+            ExceptionCode ec = 0;
</ins><span class="cx">             newContainer-&gt;appendChild(node-&gt;cloneNode(true), ec);
</span><ins>+            if (ec)
+                return Exception { ec };
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><ins>+        }
</ins><span class="cx">     }
</span><ins>+    return { };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;Node&gt; Range::processAncestorsAndTheirSiblings(ActionType action, Node* container, ContentsProcessDirection direction, RefPtr&lt;Node&gt;&amp;&amp; passedClonedContainer, Node* commonRoot, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;RefPtr&lt;Node&gt;&gt; processAncestorsAndTheirSiblings(Range::ActionType action, Node* container, ContentsProcessDirection direction, ExceptionOr&lt;RefPtr&lt;Node&gt;&gt;&amp;&amp; passedClonedContainer, Node* commonRoot)
</ins><span class="cx"> {
</span><del>-    typedef Vector&lt;Ref&lt;Node&gt;&gt; NodeVector;
</del><ins>+    if (passedClonedContainer.hasException())
+        return WTFMove(passedClonedContainer);
</ins><span class="cx"> 
</span><del>-    RefPtr&lt;Node&gt; clonedContainer = WTFMove(passedClonedContainer);
</del><ins>+    RefPtr&lt;Node&gt; clonedContainer = passedClonedContainer.releaseReturnValue();
+
</ins><span class="cx">     Vector&lt;Ref&lt;ContainerNode&gt;&gt; ancestors;
</span><span class="cx">     for (ContainerNode* ancestor = container-&gt;parentNode(); ancestor &amp;&amp; ancestor != commonRoot; ancestor = ancestor-&gt;parentNode())
</span><span class="cx">         ancestors.append(*ancestor);
</span><span class="lines">@@ -771,10 +815,14 @@
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;Node&gt; firstChildInAncestorToProcess = direction == ProcessContentsForward ? container-&gt;nextSibling() : container-&gt;previousSibling();
</span><span class="cx">     for (auto&amp; ancestor : ancestors) {
</span><del>-        if (action == Extract || action == Clone) {
</del><ins>+        if (action == Range::Extract || action == Range::Clone) {
</ins><span class="cx">             auto clonedAncestor = ancestor-&gt;cloneNode(false); // Might have been removed already during mutation event.
</span><del>-            if (clonedContainer)
</del><ins>+            if (clonedContainer) {
+                ExceptionCode ec = 0;
</ins><span class="cx">                 clonedAncestor-&gt;appendChild(*clonedContainer, ec);
</span><ins>+                if (ec)
+                    return Exception { ec };
+            }
</ins><span class="cx">             clonedContainer = WTFMove(clonedAncestor);
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -783,7 +831,7 @@
</span><span class="cx">         // FIXME: Share code with Range::processNodes
</span><span class="cx">         ASSERT(!firstChildInAncestorToProcess || firstChildInAncestorToProcess-&gt;parentNode() == ancestor.ptr());
</span><span class="cx">         
</span><del>-        NodeVector nodes;
</del><ins>+        Vector&lt;Ref&lt;Node&gt;&gt; nodes;
</ins><span class="cx">         for (Node* child = firstChildInAncestorToProcess.get(); child;
</span><span class="cx">             child = (direction == ProcessContentsForward) ? child-&gt;nextSibling() : child-&gt;previousSibling())
</span><span class="cx">             nodes.append(*child);
</span><span class="lines">@@ -790,20 +838,38 @@
</span><span class="cx"> 
</span><span class="cx">         for (auto&amp; child : nodes) {
</span><span class="cx">             switch (action) {
</span><del>-            case Delete:
</del><ins>+            case Range::Delete: {
+                ExceptionCode ec = 0;
</ins><span class="cx">                 ancestor-&gt;removeChild(child, ec);
</span><ins>+                if (ec)
+                    return Exception { ec };
</ins><span class="cx">                 break;
</span><del>-            case Extract: // will remove child from ancestor
-                if (direction == ProcessContentsForward)
</del><ins>+            }
+            case Range::Extract: // will remove child from ancestor
+                if (direction == ProcessContentsForward) {
+                    ExceptionCode ec = 0;
</ins><span class="cx">                     clonedContainer-&gt;appendChild(child, ec);
</span><del>-                else
</del><ins>+                    if (ec)
+                        return Exception { ec };
+                } else {
+                    ExceptionCode ec = 0;
</ins><span class="cx">                     clonedContainer-&gt;insertBefore(child, clonedContainer-&gt;firstChild(), ec);
</span><ins>+                    if (ec)
+                        return Exception { ec };
+                }
</ins><span class="cx">                 break;
</span><del>-            case Clone:
-                if (direction == ProcessContentsForward)
</del><ins>+            case Range::Clone:
+                if (direction == ProcessContentsForward) {
+                    ExceptionCode ec = 0;
</ins><span class="cx">                     clonedContainer-&gt;appendChild(child-&gt;cloneNode(true), ec);
</span><del>-                else
</del><ins>+                    if (ec)
+                        return Exception { ec };
+                } else {
+                    ExceptionCode ec = 0;
</ins><span class="cx">                     clonedContainer-&gt;insertBefore(child-&gt;cloneNode(true), clonedContainer-&gt;firstChild(), ec);
</span><ins>+                    if (ec)
+                        return Exception { ec };
+                }
</ins><span class="cx">                 break;
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="lines">@@ -810,55 +876,53 @@
</span><span class="cx">         firstChildInAncestorToProcess = direction == ProcessContentsForward ? ancestor-&gt;nextSibling() : ancestor-&gt;previousSibling();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return clonedContainer;
</del><ins>+    return WTFMove(clonedContainer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;DocumentFragment&gt; Range::extractContents(ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;Ref&lt;DocumentFragment&gt;&gt; Range::extractContents()
</ins><span class="cx"> {
</span><del>-    return processContents(Extract, ec);
</del><ins>+    auto result = processContents(Extract);
+    if (result.hasException())
+        return result.releaseException();
+    return result.releaseReturnValue().releaseNonNull();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;DocumentFragment&gt; Range::cloneContents(ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;Ref&lt;DocumentFragment&gt;&gt; Range::cloneContents()
</ins><span class="cx"> {
</span><del>-    return processContents(Clone, ec);
</del><ins>+    auto result = processContents(Clone);
+    if (result.hasException())
+        return result.releaseException();
+    return result.releaseReturnValue().releaseNonNull();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Range::insertNode(Ref&lt;Node&gt;&amp;&amp; node, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; Range::insertNode(Ref&lt;Node&gt;&amp;&amp; node)
</ins><span class="cx"> {
</span><del>-    if (is&lt;Comment&gt;(startContainer()) || is&lt;ProcessingInstruction&gt;(startContainer())) {
-        ec = HIERARCHY_REQUEST_ERR;
-        return;
-    }
-    bool startIsText = startContainer().nodeType() == Node::TEXT_NODE;
-    if (startIsText &amp;&amp; !startContainer().parentNode()) {
-        ec = HIERARCHY_REQUEST_ERR;
-        return;
-    }
-    if (node.ptr() == &amp;startContainer()) {
-        ec = HIERARCHY_REQUEST_ERR;
-        return;
-    }
</del><ins>+    auto startContainerNodeType = startContainer().nodeType();
</ins><span class="cx"> 
</span><ins>+    if (startContainerNodeType == Node::COMMENT_NODE || startContainerNodeType == Node::PROCESSING_INSTRUCTION_NODE)
+        return Exception { HIERARCHY_REQUEST_ERR };
+    bool startIsText = startContainerNodeType == Node::TEXT_NODE;
+    if (startIsText &amp;&amp; !startContainer().parentNode())
+        return Exception { HIERARCHY_REQUEST_ERR };
+    if (node.ptr() == &amp;startContainer())
+        return Exception { HIERARCHY_REQUEST_ERR };
+
</ins><span class="cx">     RefPtr&lt;Node&gt; referenceNode = startIsText ? &amp;startContainer() : startContainer().traverseToChildAt(startOffset());
</span><span class="cx">     Node* parentNode = referenceNode ? referenceNode-&gt;parentNode() : &amp;startContainer();
</span><del>-    if (!is&lt;ContainerNode&gt;(parentNode)) {
-        ec = HIERARCHY_REQUEST_ERR;
-        return;
-    }
</del><ins>+    if (!is&lt;ContainerNode&gt;(parentNode))
+        return Exception { HIERARCHY_REQUEST_ERR };
</ins><span class="cx"> 
</span><span class="cx">     Ref&lt;ContainerNode&gt; parent = downcast&lt;ContainerNode&gt;(*parentNode);
</span><span class="cx"> 
</span><del>-    ec = 0;
</del><ins>+    ExceptionCode ec = 0;
</ins><span class="cx">     if (!parent-&gt;ensurePreInsertionValidity(node, referenceNode.get(), ec))
</span><del>-        return;
</del><ins>+        return Exception { ec };
</ins><span class="cx"> 
</span><span class="cx">     EventQueueScope scope;
</span><span class="cx">     if (startIsText) {
</span><span class="cx">         auto result = downcast&lt;Text&gt;(startContainer()).splitText(startOffset());
</span><del>-        if (result.hasException()) {
-            ec = result.releaseException().code();
-            return;
-        }
</del><ins>+        if (result.hasException())
+            return result.releaseException();
</ins><span class="cx">         referenceNode = result.releaseReturnValue();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -866,10 +930,8 @@
</span><span class="cx">         referenceNode = referenceNode-&gt;nextSibling();
</span><span class="cx"> 
</span><span class="cx">     auto removeResult = node-&gt;remove();
</span><del>-    if (removeResult.hasException()) {
-        ec = removeResult.releaseException().code();
-        return;
-    }
</del><ins>+    if (removeResult.hasException())
+        return removeResult.releaseException();
</ins><span class="cx"> 
</span><span class="cx">     unsigned newOffset = referenceNode ? referenceNode-&gt;computeNodeIndex() : parent-&gt;countChildNodes();
</span><span class="cx">     if (is&lt;DocumentFragment&gt;(node.get()))
</span><span class="lines">@@ -879,10 +941,12 @@
</span><span class="cx"> 
</span><span class="cx">     parent-&gt;insertBefore(node, referenceNode.get(), ec);
</span><span class="cx">     if (ec)
</span><del>-        return;
</del><ins>+        return Exception { ec };
</ins><span class="cx"> 
</span><span class="cx">     if (collapsed())
</span><del>-        setEnd(WTFMove(parent), newOffset, ec);
</del><ins>+        return setEnd(WTFMove(parent), newOffset);
+
+    return { };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> String Range::toString() const
</span><span class="lines">@@ -890,12 +954,13 @@
</span><span class="cx">     StringBuilder builder;
</span><span class="cx"> 
</span><span class="cx">     Node* pastLast = pastLastNode();
</span><del>-    for (Node* n = firstNode(); n != pastLast; n = NodeTraversal::next(*n)) {
-        if (n-&gt;nodeType() == Node::TEXT_NODE || n-&gt;nodeType() == Node::CDATA_SECTION_NODE) {
-            const String&amp; data = static_cast&lt;CharacterData*&gt;(n)-&gt;data();
</del><ins>+    for (Node* node = firstNode(); node != pastLast; node = NodeTraversal::next(*node)) {
+        auto type = node-&gt;nodeType();
+        if (type == Node::TEXT_NODE || type == Node::CDATA_SECTION_NODE) {
+            auto&amp; data = downcast&lt;CharacterData&gt;(*node).data();
</ins><span class="cx">             unsigned length = data.length();
</span><del>-            unsigned start = n == &amp;startContainer() ? std::min(std::max(0U, m_start.offset()), length) : 0U;
-            unsigned end = n == &amp;endContainer() ? std::min(std::max(start, m_end.offset()), length) : length;
</del><ins>+            unsigned start = node == &amp;startContainer() ? std::min(std::max(0U, m_start.offset()), length) : 0U;
+            unsigned end = node == &amp;endContainer() ? std::min(std::max(start, m_end.offset()), length) : length;
</ins><span class="cx">             builder.append(data, start, end - start);
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -918,7 +983,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // https://w3c.github.io/DOM-Parsing/#widl-Range-createContextualFragment-DocumentFragment-DOMString-fragment
</span><del>-RefPtr&lt;DocumentFragment&gt; Range::createContextualFragment(const String&amp; markup, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;Ref&lt;DocumentFragment&gt;&gt; Range::createContextualFragment(const String&amp; markup)
</ins><span class="cx"> {
</span><span class="cx">     Node&amp; node = startContainer();
</span><span class="cx">     RefPtr&lt;Element&gt; element;
</span><span class="lines">@@ -928,36 +993,27 @@
</span><span class="cx">         element = &amp;downcast&lt;Element&gt;(node);
</span><span class="cx">     else
</span><span class="cx">         element = node.parentElement();
</span><del>-
</del><span class="cx">     if (!element || (is&lt;HTMLDocument&gt;(element-&gt;document()) &amp;&amp; is&lt;HTMLHtmlElement&gt;(*element)))
</span><span class="cx">         element = HTMLBodyElement::create(node.document());
</span><del>-
-    auto result = WebCore::createContextualFragment(*element, markup, AllowScriptingContentAndDoNotMarkAlreadyStarted);
-    if (result.hasException()) {
-        ec = result.releaseException().code();
-        return nullptr;
-    }
-    return result.releaseReturnValue();
</del><ins>+    return WebCore::createContextualFragment(*element, markup, AllowScriptingContentAndDoNotMarkAlreadyStarted);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> void Range::detach()
</span><span class="cx"> {
</span><span class="cx">     // This is now a no-op as per the DOM specification.
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Node* Range::checkNodeWOffset(Node&amp; node, unsigned offset, ExceptionCode&amp; ec) const
</del><ins>+ExceptionOr&lt;Node*&gt; Range::checkNodeWOffset(Node&amp; node, unsigned offset) const
</ins><span class="cx"> {
</span><span class="cx">     switch (node.nodeType()) {
</span><span class="cx">         case Node::DOCUMENT_TYPE_NODE:
</span><del>-            ec = INVALID_NODE_TYPE_ERR;
-            return nullptr;
</del><ins>+            return Exception { INVALID_NODE_TYPE_ERR };
</ins><span class="cx">         case Node::CDATA_SECTION_NODE:
</span><span class="cx">         case Node::COMMENT_NODE:
</span><span class="cx">         case Node::TEXT_NODE:
</span><span class="cx">         case Node::PROCESSING_INSTRUCTION_NODE:
</span><span class="cx">             if (offset &gt; downcast&lt;CharacterData&gt;(node).length())
</span><del>-                ec = INDEX_SIZE_ERR;
</del><ins>+                return Exception { INDEX_SIZE_ERR };
</ins><span class="cx">             return nullptr;
</span><span class="cx">         case Node::ATTRIBUTE_NODE:
</span><span class="cx">         case Node::DOCUMENT_FRAGMENT_NODE:
</span><span class="lines">@@ -967,12 +1023,12 @@
</span><span class="cx">                 return nullptr;
</span><span class="cx">             Node* childBefore = node.traverseToChildAt(offset - 1);
</span><span class="cx">             if (!childBefore)
</span><del>-                ec = INDEX_SIZE_ERR;
</del><ins>+                return Exception { INDEX_SIZE_ERR };
</ins><span class="cx">             return childBefore;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     ASSERT_NOT_REACHED();
</span><del>-    return nullptr;
</del><ins>+    return Exception { INVALID_NODE_TYPE_ERR };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref&lt;Range&gt; Range::cloneRange() const
</span><span class="lines">@@ -980,60 +1036,46 @@
</span><span class="cx">     return Range::create(ownerDocument(), &amp;startContainer(), m_start.offset(), &amp;endContainer(), m_end.offset());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Range::setStartAfter(Node&amp; refNode, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; Range::setStartAfter(Node&amp; refNode)
</ins><span class="cx"> {
</span><del>-    if (!refNode.parentNode()) {
-        ec = INVALID_NODE_TYPE_ERR;
-        return;
-    }
-
-    setStart(*refNode.parentNode(), refNode.computeNodeIndex() + 1, ec);
</del><ins>+    if (!refNode.parentNode())
+        return Exception { INVALID_NODE_TYPE_ERR };
+    return setStart(*refNode.parentNode(), refNode.computeNodeIndex() + 1);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Range::setEndBefore(Node&amp; refNode, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; Range::setEndBefore(Node&amp; refNode)
</ins><span class="cx"> {
</span><del>-    if (!refNode.parentNode()) {
-        ec = INVALID_NODE_TYPE_ERR;
-        return;
-    }
-
-    setEnd(*refNode.parentNode(), refNode.computeNodeIndex(), ec);
</del><ins>+    if (!refNode.parentNode())
+        return Exception { INVALID_NODE_TYPE_ERR };
+    return setEnd(*refNode.parentNode(), refNode.computeNodeIndex());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Range::setEndAfter(Node&amp; refNode, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; Range::setEndAfter(Node&amp; refNode)
</ins><span class="cx"> {
</span><del>-    if (!refNode.parentNode()) {
-        ec = INVALID_NODE_TYPE_ERR;
-        return;
-    }
-
-    setEnd(*refNode.parentNode(), refNode.computeNodeIndex() + 1, ec);
</del><ins>+    if (!refNode.parentNode())
+        return Exception { INVALID_NODE_TYPE_ERR };
+    return setEnd(*refNode.parentNode(), refNode.computeNodeIndex() + 1);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Range::selectNode(Node&amp; refNode, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; Range::selectNode(Node&amp; refNode)
</ins><span class="cx"> {
</span><del>-    if (!refNode.parentNode()) {
-        ec = INVALID_NODE_TYPE_ERR;
-        return;
-    }
</del><ins>+    if (!refNode.parentNode())
+        return Exception { INVALID_NODE_TYPE_ERR };
</ins><span class="cx"> 
</span><span class="cx">     if (&amp;ownerDocument() != &amp;refNode.document())
</span><span class="cx">         setDocument(refNode.document());
</span><span class="cx"> 
</span><span class="cx">     unsigned index = refNode.computeNodeIndex();
</span><del>-    ec = 0;
-    setStart(*refNode.parentNode(), index, ec);
-    if (ec)
-        return;
-    setEnd(*refNode.parentNode(), index + 1, ec);
</del><ins>+    auto result = setStart(*refNode.parentNode(), index);
+    if (result.hasException())
+        return result.releaseException();
+    return setEnd(*refNode.parentNode(), index + 1);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Range::selectNodeContents(Node&amp; refNode, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; Range::selectNodeContents(Node&amp; refNode)
</ins><span class="cx"> {
</span><del>-    if (refNode.isDocumentTypeNode()) {
-        ec = INVALID_NODE_TYPE_ERR;
-        return;
-    }
</del><ins>+    if (refNode.isDocumentTypeNode())
+        return Exception { INVALID_NODE_TYPE_ERR };
</ins><span class="cx"> 
</span><span class="cx">     if (&amp;ownerDocument() != &amp;refNode.document())
</span><span class="cx">         setDocument(refNode.document());
</span><span class="lines">@@ -1040,10 +1082,12 @@
</span><span class="cx"> 
</span><span class="cx">     m_start.setToStartOfNode(refNode);
</span><span class="cx">     m_end.setToEndOfNode(refNode);
</span><ins>+
+    return { };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // https://dom.spec.whatwg.org/#dom-range-surroundcontents
</span><del>-void Range::surroundContents(Node&amp; newParent, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; Range::surroundContents(Node&amp; newParent)
</ins><span class="cx"> {
</span><span class="cx">     Ref&lt;Node&gt; protectedNewParent(newParent);
</span><span class="cx"> 
</span><span class="lines">@@ -1054,10 +1098,8 @@
</span><span class="cx">     Node* endNonTextContainer = &amp;endContainer();
</span><span class="cx">     if (endNonTextContainer-&gt;nodeType() == Node::TEXT_NODE)
</span><span class="cx">         endNonTextContainer = endNonTextContainer-&gt;parentNode();
</span><del>-    if (startNonTextContainer != endNonTextContainer) {
-        ec = INVALID_STATE_ERR;
-        return;
-    }
</del><ins>+    if (startNonTextContainer != endNonTextContainer)
+        return Exception { INVALID_STATE_ERR };
</ins><span class="cx"> 
</span><span class="cx">     // Step 2: If newParent is a Document, DocumentType, or DocumentFragment node, then throw an InvalidNodeTypeError.
</span><span class="cx">     switch (newParent.nodeType()) {
</span><span class="lines">@@ -1065,8 +1107,7 @@
</span><span class="cx">         case Node::DOCUMENT_FRAGMENT_NODE:
</span><span class="cx">         case Node::DOCUMENT_NODE:
</span><span class="cx">         case Node::DOCUMENT_TYPE_NODE:
</span><del>-            ec = INVALID_NODE_TYPE_ERR;
-            return;
</del><ins>+            return Exception { INVALID_NODE_TYPE_ERR };
</ins><span class="cx">         case Node::CDATA_SECTION_NODE:
</span><span class="cx">         case Node::COMMENT_NODE:
</span><span class="cx">         case Node::ELEMENT_NODE:
</span><span class="lines">@@ -1075,42 +1116,39 @@
</span><span class="cx">             break;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ec = 0;
-
</del><span class="cx">     // Step 3: Let fragment be the result of extracting context object.
</span><del>-    RefPtr&lt;DocumentFragment&gt; fragment = extractContents(ec);
-    if (ec)
-        return;
</del><ins>+    auto fragment = extractContents();
+    if (fragment.hasException())
+        return fragment.releaseException();
</ins><span class="cx"> 
</span><span class="cx">     // Step 4: If newParent has children, replace all with null within newParent.
</span><del>-    while (Node* n = newParent.firstChild()) {
-        downcast&lt;ContainerNode&gt;(newParent).removeChild(*n, ec);
</del><ins>+    while (auto* child = newParent.firstChild()) {
+        ExceptionCode ec = 0;
+        downcast&lt;ContainerNode&gt;(newParent).removeChild(*child, ec);
</ins><span class="cx">         if (ec)
</span><del>-            return;
</del><ins>+            return Exception { ec };
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Step 5: Insert newParent into context object.
</span><del>-    insertNode(newParent, ec);
-    if (ec)
-        return;
</del><ins>+    auto insertResult = insertNode(newParent);
+    if (insertResult.hasException())
+        return insertResult.releaseException();
</ins><span class="cx"> 
</span><span class="cx">     // Step 6: Append fragment to newParent.
</span><del>-    newParent.appendChild(*fragment, ec);
</del><ins>+    ExceptionCode ec = 0;
+    newParent.appendChild(fragment.releaseReturnValue(), ec);
</ins><span class="cx">     if (ec)
</span><del>-        return;
</del><ins>+        return Exception { ec };
</ins><span class="cx"> 
</span><span class="cx">     // Step 7: Select newParent within context object.
</span><del>-    selectNode(newParent, ec);
</del><ins>+    return selectNode(newParent);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Range::setStartBefore(Node&amp; refNode, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; Range::setStartBefore(Node&amp; refNode)
</ins><span class="cx"> {
</span><del>-    if (!refNode.parentNode()) {
-        ec = INVALID_NODE_TYPE_ERR;
-        return;
-    }
-
-    setStart(*refNode.parentNode(), refNode.computeNodeIndex(), ec);
</del><ins>+    if (!refNode.parentNode())
+        return Exception { INVALID_NODE_TYPE_ERR };
+    return setStart(*refNode.parentNode(), refNode.computeNodeIndex());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Node* Range::firstNode() const
</span><span class="lines">@@ -1488,12 +1526,12 @@
</span><span class="cx">     if (commonAncestorContainer()-&gt;ownerDocument() != other.commonAncestorContainer()-&gt;ownerDocument())
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    short startToStart = compareBoundaryPoints(Range::START_TO_START, other, ASSERT_NO_EXCEPTION);
-    if (startToStart &gt; 0)
</del><ins>+    auto startToStart = compareBoundaryPoints(Range::START_TO_START, other);
+    if (startToStart.hasException() || startToStart.releaseReturnValue() &gt; 0)
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    short endToEnd = compareBoundaryPoints(Range::END_TO_END, other, ASSERT_NO_EXCEPTION);
-    return endToEnd &gt;= 0;
</del><ins>+    auto endToEnd = compareBoundaryPoints(Range::END_TO_END, other);
+    return !endToEnd.hasException() &amp;&amp; endToEnd.releaseReturnValue() &gt;= 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Range::contains(const VisiblePosition&amp; position) const
</span><span class="lines">@@ -1524,8 +1562,8 @@
</span><span class="cx">     if (a-&gt;commonAncestorContainer()-&gt;ownerDocument() != b-&gt;commonAncestorContainer()-&gt;ownerDocument())
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    short startToStart = a-&gt;compareBoundaryPoints(Range::START_TO_START, *b, ASSERT_NO_EXCEPTION);
-    short endToEnd = a-&gt;compareBoundaryPoints(Range::END_TO_END, *b, ASSERT_NO_EXCEPTION);
</del><ins>+    short startToStart = a-&gt;compareBoundaryPoints(Range::START_TO_START, *b).releaseReturnValue();
+    short endToEnd = a-&gt;compareBoundaryPoints(Range::END_TO_END, *b).releaseReturnValue();
</ins><span class="cx"> 
</span><span class="cx">     // First range contains the second range.
</span><span class="cx">     if (startToStart &lt;= 0 &amp;&amp; endToEnd &gt;= 0)
</span><span class="lines">@@ -1532,11 +1570,11 @@
</span><span class="cx">         return true;
</span><span class="cx"> 
</span><span class="cx">     // End of first range is inside second range.
</span><del>-    if (a-&gt;compareBoundaryPoints(Range::START_TO_END, *b, ASSERT_NO_EXCEPTION) &gt;= 0 &amp;&amp; endToEnd &lt;= 0)
</del><ins>+    if (a-&gt;compareBoundaryPoints(Range::START_TO_END, *b).releaseReturnValue() &gt;= 0 &amp;&amp; endToEnd &lt;= 0)
</ins><span class="cx">         return true;
</span><span class="cx"> 
</span><span class="cx">     // Start of first range is inside second range.
</span><del>-    if (startToStart &gt;= 0 &amp;&amp; a-&gt;compareBoundaryPoints(Range::END_TO_START, *b, ASSERT_NO_EXCEPTION) &lt;= 0)
</del><ins>+    if (startToStart &gt;= 0 &amp;&amp; a-&gt;compareBoundaryPoints(Range::END_TO_START, *b).releaseReturnValue() &lt;= 0)
</ins><span class="cx">         return true;
</span><span class="cx"> 
</span><span class="cx">     return false;
</span><span class="lines">@@ -1544,9 +1582,8 @@
</span><span class="cx"> 
</span><span class="cx"> Ref&lt;Range&gt; rangeOfContents(Node&amp; node)
</span><span class="cx"> {
</span><del>-    Ref&lt;Range&gt; range = Range::create(node.document());
-    int exception = 0;
-    range-&gt;selectNodeContents(node, exception);
</del><ins>+    auto range = Range::create(node.document());
+    range-&gt;selectNodeContents(node);
</ins><span class="cx">     return range;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1707,10 +1744,10 @@
</span><span class="cx">     boundaryTextNodesSplit(m_end, oldNode);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Range::expand(const String&amp; unit, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; Range::expand(const String&amp; unit)
</ins><span class="cx"> {
</span><del>-    VisiblePosition start(startPosition());
-    VisiblePosition end(endPosition());
</del><ins>+    VisiblePosition start { startPosition() };
+    VisiblePosition end { endPosition() };
</ins><span class="cx">     if (unit == &quot;word&quot;) {
</span><span class="cx">         start = startOfWord(start);
</span><span class="cx">         end = endOfWord(end);
</span><span class="lines">@@ -1724,42 +1761,41 @@
</span><span class="cx">         start = startOfDocument(start);
</span><span class="cx">         end = endOfDocument(end);
</span><span class="cx">     } else
</span><del>-        return;
</del><ins>+        return { };
</ins><span class="cx"> 
</span><del>-    if (!start.deepEquivalent().containerNode()) {
-        ec = TypeError;
-        return;
-    }
-    setStart(*start.deepEquivalent().containerNode(), start.deepEquivalent().computeOffsetInContainerNode(), ec);
-    if (!end.deepEquivalent().containerNode()) {
-        ec = TypeError;
-        return;
-    }
-    setEnd(*end.deepEquivalent().containerNode(), end.deepEquivalent().computeOffsetInContainerNode(), ec);
</del><ins>+    auto* startContainer = start.deepEquivalent().containerNode();
+    if (!startContainer)
+        return Exception { TypeError };
+    auto result = setStart(*startContainer, start.deepEquivalent().computeOffsetInContainerNode());
+    if (result.hasException())
+        return result.releaseException();
+    auto* endContainer = end.deepEquivalent().containerNode();
+    if (!endContainer)
+        return Exception { TypeError };
+    return setEnd(*endContainer, end.deepEquivalent().computeOffsetInContainerNode());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref&lt;ClientRectList&gt; Range::getClientRects() const
</span><span class="cx"> {
</span><del>-    ownerDocument().updateLayoutIgnorePendingStylesheets();
-
-    Vector&lt;FloatQuad&gt; quads;
-    getBorderAndTextQuads(quads, CoordinateSpace::Client);
-
-    return ClientRectList::create(quads);
</del><ins>+    return ClientRectList::create(borderAndTextQuads(CoordinateSpace::Client));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref&lt;ClientRect&gt; Range::getBoundingClientRect() const
</span><span class="cx"> {
</span><del>-    return ClientRect::create(boundingRectInternal(CoordinateSpace::Client));
</del><ins>+    return ClientRect::create(boundingRect(CoordinateSpace::Client));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Range::getBorderAndTextQuads(Vector&lt;FloatQuad&gt;&amp; quads, CoordinateSpace space) const
</del><ins>+Vector&lt;FloatQuad&gt; Range::borderAndTextQuads(CoordinateSpace space) const
</ins><span class="cx"> {
</span><ins>+    Vector&lt;FloatQuad&gt; quads;
+
+    ownerDocument().updateLayoutIgnorePendingStylesheets();
+
</ins><span class="cx">     Node* stopNode = pastLastNode();
</span><span class="cx"> 
</span><span class="cx">     HashSet&lt;Node*&gt; selectedElementsSet;
</span><span class="cx">     for (Node* node = firstNode(); node != stopNode; node = NodeTraversal::next(*node)) {
</span><del>-        if (node-&gt;isElementNode())
</del><ins>+        if (is&lt;Element&gt;(*node))
</ins><span class="cx">             selectedElementsSet.add(node);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1770,48 +1806,39 @@
</span><span class="cx"> 
</span><span class="cx">     for (Node* node = firstNode(); node != stopNode; node = NodeTraversal::next(*node)) {
</span><span class="cx">         if (is&lt;Element&gt;(*node) &amp;&amp; selectedElementsSet.contains(node) &amp;&amp; !selectedElementsSet.contains(node-&gt;parentNode())) {
</span><del>-            if (RenderBoxModelObject* renderBoxModelObject = downcast&lt;Element&gt;(*node).renderBoxModelObject()) {
</del><ins>+            if (auto* renderer = downcast&lt;Element&gt;(*node).renderBoxModelObject()) {
</ins><span class="cx">                 Vector&lt;FloatQuad&gt; elementQuads;
</span><del>-                renderBoxModelObject-&gt;absoluteQuads(elementQuads);
-
</del><ins>+                renderer-&gt;absoluteQuads(elementQuads);
</ins><span class="cx">                 if (space == CoordinateSpace::Client)
</span><del>-                    ownerDocument().adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(elementQuads, renderBoxModelObject-&gt;style());
-
</del><ins>+                    node-&gt;document().adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(elementQuads, renderer-&gt;style());
</ins><span class="cx">                 quads.appendVector(elementQuads);
</span><span class="cx">             }
</span><span class="cx">         } else if (is&lt;Text&gt;(*node)) {
</span><del>-            if (RenderText* renderText = downcast&lt;Text&gt;(*node).renderer()) {
</del><ins>+            if (auto* renderer = downcast&lt;Text&gt;(*node).renderer()) {
</ins><span class="cx">                 unsigned startOffset = node == &amp;startContainer() ? m_start.offset() : 0;
</span><span class="cx">                 unsigned endOffset = node == &amp;endContainer() ? m_end.offset() : std::numeric_limits&lt;unsigned&gt;::max();
</span><del>-                
-                auto textQuads = renderText-&gt;absoluteQuadsForRange(startOffset, endOffset);
-
</del><ins>+                auto textQuads = renderer-&gt;absoluteQuadsForRange(startOffset, endOffset);
</ins><span class="cx">                 if (space == CoordinateSpace::Client)
</span><del>-                    ownerDocument().adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(textQuads, renderText-&gt;style());
-
</del><ins>+                    node-&gt;document().adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(textQuads, renderer-&gt;style());
</ins><span class="cx">                 quads.appendVector(textQuads);
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><ins>+
+    return quads;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-FloatRect Range::boundingRectInternal(CoordinateSpace space) const
</del><ins>+FloatRect Range::boundingRect(CoordinateSpace space) const
</ins><span class="cx"> {
</span><del>-    ownerDocument().updateLayoutIgnorePendingStylesheets();
-
-    Vector&lt;FloatQuad&gt; quads;
-    getBorderAndTextQuads(quads, space);
-
</del><span class="cx">     FloatRect result;
</span><del>-    for (auto&amp; quad : quads)
</del><ins>+    for (auto&amp; quad : borderAndTextQuads(space))
</ins><span class="cx">         result.unite(quad.boundingBox());
</span><del>-
</del><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> FloatRect Range::absoluteBoundingRect() const
</span><span class="cx"> {
</span><del>-    return boundingRectInternal(CoordinateSpace::Absolute);
</del><ins>+    return boundingRect(CoordinateSpace::Absolute);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoredomRangeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Range.h (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Range.h        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/dom/Range.h        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -24,7 +24,6 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><del>-#include &quot;ExceptionCodePlaceholder.h&quot;
</del><span class="cx"> #include &quot;FloatRect.h&quot;
</span><span class="cx"> #include &quot;FragmentScriptingPermission.h&quot;
</span><span class="cx"> #include &quot;IntRect.h&quot;
</span><span class="lines">@@ -65,46 +64,46 @@
</span><span class="cx"> 
</span><span class="cx">     Node* commonAncestorContainer() const { return commonAncestorContainer(&amp;startContainer(), &amp;endContainer()); }
</span><span class="cx">     WEBCORE_EXPORT static Node* commonAncestorContainer(Node* containerA, Node* containerB);
</span><del>-    WEBCORE_EXPORT void setStart(Ref&lt;Node&gt;&amp;&amp; container, unsigned offset, ExceptionCode&amp; = ASSERT_NO_EXCEPTION);
-    WEBCORE_EXPORT void setEnd(Ref&lt;Node&gt;&amp;&amp; container, unsigned offset, ExceptionCode&amp; = ASSERT_NO_EXCEPTION);
</del><ins>+    WEBCORE_EXPORT ExceptionOr&lt;void&gt; setStart(Ref&lt;Node&gt;&amp;&amp; container, unsigned offset);
+    WEBCORE_EXPORT ExceptionOr&lt;void&gt; setEnd(Ref&lt;Node&gt;&amp;&amp; container, unsigned offset);
</ins><span class="cx">     WEBCORE_EXPORT void collapse(bool toStart);
</span><del>-    WEBCORE_EXPORT bool isPointInRange(Node&amp; refNode, unsigned offset, ExceptionCode&amp;);
-    WEBCORE_EXPORT short comparePoint(Node&amp; refNode, unsigned offset, ExceptionCode&amp;) const;
</del><ins>+    WEBCORE_EXPORT ExceptionOr&lt;bool&gt; isPointInRange(Node&amp; refNode, unsigned offset);
+    WEBCORE_EXPORT ExceptionOr&lt;short&gt; comparePoint(Node&amp; refNode, unsigned offset) const;
</ins><span class="cx">     enum CompareResults { NODE_BEFORE, NODE_AFTER, NODE_BEFORE_AND_AFTER, NODE_INSIDE };
</span><del>-    WEBCORE_EXPORT CompareResults compareNode(Node&amp; refNode, ExceptionCode&amp;) const;
</del><ins>+    WEBCORE_EXPORT ExceptionOr&lt;CompareResults&gt; compareNode(Node&amp; refNode) const;
</ins><span class="cx">     enum CompareHow { START_TO_START, START_TO_END, END_TO_END, END_TO_START };
</span><del>-    WEBCORE_EXPORT short compareBoundaryPoints(CompareHow, const Range&amp; sourceRange, ExceptionCode&amp;) const;
-    WEBCORE_EXPORT short compareBoundaryPointsForBindings(unsigned short compareHow, const Range&amp; sourceRange, ExceptionCode&amp;) const;
-    static short compareBoundaryPoints(Node* containerA, unsigned offsetA, Node* containerB, unsigned offsetB, ExceptionCode&amp;);
-    static short compareBoundaryPoints(const RangeBoundaryPoint&amp; boundaryA, const RangeBoundaryPoint&amp; boundaryB, ExceptionCode&amp;);
</del><ins>+    WEBCORE_EXPORT ExceptionOr&lt;short&gt; compareBoundaryPoints(CompareHow, const Range&amp; sourceRange) const;
+    WEBCORE_EXPORT ExceptionOr&lt;short&gt; compareBoundaryPointsForBindings(unsigned short compareHow, const Range&amp; sourceRange) const;
+    static ExceptionOr&lt;short&gt; compareBoundaryPoints(Node* containerA, unsigned offsetA, Node* containerB, unsigned offsetB);
+    static ExceptionOr&lt;short&gt; compareBoundaryPoints(const RangeBoundaryPoint&amp; boundaryA, const RangeBoundaryPoint&amp; boundaryB);
</ins><span class="cx">     WEBCORE_EXPORT bool boundaryPointsValid() const;
</span><del>-    WEBCORE_EXPORT bool intersectsNode(Node&amp; refNode, ExceptionCode&amp;) const;
-    WEBCORE_EXPORT void deleteContents(ExceptionCode&amp;);
-    WEBCORE_EXPORT RefPtr&lt;DocumentFragment&gt; extractContents(ExceptionCode&amp;);
-    WEBCORE_EXPORT RefPtr&lt;DocumentFragment&gt; cloneContents(ExceptionCode&amp;);
-    WEBCORE_EXPORT void insertNode(Ref&lt;Node&gt;&amp;&amp;, ExceptionCode&amp;);
</del><ins>+    WEBCORE_EXPORT ExceptionOr&lt;bool&gt; intersectsNode(Node&amp; refNode) const;
+    WEBCORE_EXPORT ExceptionOr&lt;void&gt; deleteContents();
+    WEBCORE_EXPORT ExceptionOr&lt;Ref&lt;DocumentFragment&gt;&gt; extractContents();
+    WEBCORE_EXPORT ExceptionOr&lt;Ref&lt;DocumentFragment&gt;&gt; cloneContents();
+    WEBCORE_EXPORT ExceptionOr&lt;void&gt; insertNode(Ref&lt;Node&gt;&amp;&amp;);
</ins><span class="cx">     WEBCORE_EXPORT String toString() const;
</span><span class="cx"> 
</span><span class="cx">     String toHTML() const;
</span><span class="cx">     WEBCORE_EXPORT String text() const;
</span><span class="cx"> 
</span><del>-    WEBCORE_EXPORT RefPtr&lt;DocumentFragment&gt; createContextualFragment(const String&amp; html, ExceptionCode&amp;);
</del><ins>+    WEBCORE_EXPORT ExceptionOr&lt;Ref&lt;DocumentFragment&gt;&gt; createContextualFragment(const String&amp; html);
</ins><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT void detach();
</span><span class="cx">     WEBCORE_EXPORT Ref&lt;Range&gt; cloneRange() const;
</span><span class="cx"> 
</span><del>-    WEBCORE_EXPORT void setStartAfter(Node&amp;, ExceptionCode&amp; = ASSERT_NO_EXCEPTION);
-    WEBCORE_EXPORT void setEndBefore(Node&amp;, ExceptionCode&amp; = ASSERT_NO_EXCEPTION);
-    WEBCORE_EXPORT void setEndAfter(Node&amp;, ExceptionCode&amp; = ASSERT_NO_EXCEPTION);
-    WEBCORE_EXPORT void selectNode(Node&amp;, ExceptionCode&amp; = ASSERT_NO_EXCEPTION);
-    WEBCORE_EXPORT void selectNodeContents(Node&amp;, ExceptionCode&amp;);
-    WEBCORE_EXPORT void surroundContents(Node&amp;, ExceptionCode&amp;);
-    WEBCORE_EXPORT void setStartBefore(Node&amp;, ExceptionCode&amp;);
</del><ins>+    WEBCORE_EXPORT ExceptionOr&lt;void&gt; setStartAfter(Node&amp;);
+    WEBCORE_EXPORT ExceptionOr&lt;void&gt; setEndBefore(Node&amp;);
+    WEBCORE_EXPORT ExceptionOr&lt;void&gt; setEndAfter(Node&amp;);
+    WEBCORE_EXPORT ExceptionOr&lt;void&gt; selectNode(Node&amp;);
+    WEBCORE_EXPORT ExceptionOr&lt;void&gt; selectNodeContents(Node&amp;);
+    WEBCORE_EXPORT ExceptionOr&lt;void&gt; surroundContents(Node&amp;);
+    WEBCORE_EXPORT ExceptionOr&lt;void&gt; setStartBefore(Node&amp;);
</ins><span class="cx"> 
</span><span class="cx">     const Position startPosition() const { return m_start.toPosition(); }
</span><span class="cx">     const Position endPosition() const { return m_end.toPosition(); }
</span><del>-    WEBCORE_EXPORT void setStart(const Position&amp;, ExceptionCode&amp; = ASSERT_NO_EXCEPTION);
-    WEBCORE_EXPORT void setEnd(const Position&amp;, ExceptionCode&amp; = ASSERT_NO_EXCEPTION);
</del><ins>+    WEBCORE_EXPORT ExceptionOr&lt;void&gt; setStart(const Position&amp;);
+    WEBCORE_EXPORT ExceptionOr&lt;void&gt; setEnd(const Position&amp;);
</ins><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT Node* firstNode() const;
</span><span class="cx">     WEBCORE_EXPORT Node* pastLastNode() const;
</span><span class="lines">@@ -140,7 +139,7 @@
</span><span class="cx">     // Expand range to a unit (word or sentence or block or document) boundary.
</span><span class="cx">     // Please refer to https://bugs.webkit.org/show_bug.cgi?id=27632 comment #5 
</span><span class="cx">     // for details.
</span><del>-    WEBCORE_EXPORT void expand(const String&amp;, ExceptionCode&amp;);
</del><ins>+    WEBCORE_EXPORT ExceptionOr&lt;void&gt; expand(const String&amp;);
</ins><span class="cx"> 
</span><span class="cx">     Ref&lt;ClientRectList&gt; getClientRects() const;
</span><span class="cx">     Ref&lt;ClientRect&gt; getBoundingClientRect() const;
</span><span class="lines">@@ -152,24 +151,19 @@
</span><span class="cx">     WEBCORE_EXPORT bool contains(const Range&amp;) const;
</span><span class="cx">     bool contains(const VisiblePosition&amp;) const;
</span><span class="cx"> 
</span><ins>+    enum ActionType { Delete, Extract, Clone };
+
</ins><span class="cx"> private:
</span><span class="cx">     explicit Range(Document&amp;);
</span><span class="cx">     Range(Document&amp;, PassRefPtr&lt;Node&gt; startContainer, int startOffset, PassRefPtr&lt;Node&gt; endContainer, int endOffset);
</span><span class="cx"> 
</span><span class="cx">     void setDocument(Document&amp;);
</span><ins>+    ExceptionOr&lt;Node*&gt; checkNodeWOffset(Node&amp;, unsigned offset) const;
+    ExceptionOr&lt;RefPtr&lt;DocumentFragment&gt;&gt; processContents(ActionType);
</ins><span class="cx"> 
</span><del>-    Node* checkNodeWOffset(Node&amp;, unsigned offset, ExceptionCode&amp;) const;
-
-    enum ActionType { Delete, Extract, Clone };
-    RefPtr&lt;DocumentFragment&gt; processContents(ActionType, ExceptionCode&amp;);
-    static RefPtr&lt;Node&gt; processContentsBetweenOffsets(ActionType, PassRefPtr&lt;DocumentFragment&gt;, Node*, unsigned startOffset, unsigned endOffset, ExceptionCode&amp;);
-    static void processNodes(ActionType, Vector&lt;Ref&lt;Node&gt;&gt;&amp;, Node* oldContainer, Node* newContainer, ExceptionCode&amp;);
-    enum ContentsProcessDirection { ProcessContentsForward, ProcessContentsBackward };
-    static RefPtr&lt;Node&gt; processAncestorsAndTheirSiblings(ActionType, Node* container, ContentsProcessDirection, RefPtr&lt;Node&gt;&amp;&amp; clonedContainer, Node* commonRoot, ExceptionCode&amp;);
-
</del><span class="cx">     enum class CoordinateSpace { Absolute, Client };
</span><del>-    void getBorderAndTextQuads(Vector&lt;FloatQuad&gt;&amp;, CoordinateSpace) const;
-    FloatRect boundingRectInternal(CoordinateSpace) const;
</del><ins>+    Vector&lt;FloatQuad&gt; borderAndTextQuads(CoordinateSpace) const;
+    FloatRect boundingRect(CoordinateSpace) const;
</ins><span class="cx"> 
</span><span class="cx">     Ref&lt;Document&gt; m_ownerDocument;
</span><span class="cx">     RangeBoundaryPoint m_start;
</span><span class="lines">@@ -183,7 +177,7 @@
</span><span class="cx"> 
</span><span class="cx"> inline bool documentOrderComparator(const Node* a, const Node* b)
</span><span class="cx"> {
</span><del>-    return Range::compareBoundaryPoints(const_cast&lt;Node*&gt;(a), 0, const_cast&lt;Node*&gt;(b), 0, ASSERT_NO_EXCEPTION) &lt; 0;
</del><ins>+    return Range::compareBoundaryPoints(const_cast&lt;Node*&gt;(a), 0, const_cast&lt;Node*&gt;(b), 0).releaseReturnValue() &lt; 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace
</span></span></pre></div>
<a id="trunkSourceWebCoredomRangeidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Range.idl (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Range.idl        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/dom/Range.idl        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -25,7 +25,6 @@
</span><span class="cx">     ImplementationLacksVTable,
</span><span class="cx">     ExportMacro=WEBCORE_EXPORT,
</span><span class="cx"> ] interface Range {
</span><del>-
</del><span class="cx">     readonly attribute Node startContainer;
</span><span class="cx">     readonly attribute long startOffset;
</span><span class="cx">     readonly attribute Node endContainer;
</span><span class="lines">@@ -33,18 +32,17 @@
</span><span class="cx">     readonly attribute boolean collapsed;
</span><span class="cx">     readonly attribute Node commonAncestorContainer;
</span><span class="cx"> 
</span><del>-    [MayThrowLegacyException] void setStart(Node refNode, unsigned long offset);
-    [MayThrowLegacyException] void setEnd(Node refNode, unsigned long offset);
</del><ins>+    [MayThrowException] void setStart(Node refNode, unsigned long offset);
+    [MayThrowException] void setEnd(Node refNode, unsigned long offset);
</ins><span class="cx"> 
</span><del>-    [MayThrowLegacyException] void setStartBefore(Node refNode);
-    [MayThrowLegacyException] void setStartAfter(Node refNode);
-    [MayThrowLegacyException] void setEndBefore(Node refNode);
-    [MayThrowLegacyException] void setEndAfter(Node refNode);
</del><ins>+    [MayThrowException] void setStartBefore(Node refNode);
+    [MayThrowException] void setStartAfter(Node refNode);
+    [MayThrowException] void setEndBefore(Node refNode);
+    [MayThrowException] void setEndAfter(Node refNode);
</ins><span class="cx">     void collapse(optional boolean toStart = false);
</span><del>-    // FIXME: Using &quot;undefined&quot; as default parameter value is wrong.
-    [MayThrowLegacyException] void expand(optional DOMString unit = &quot;undefined&quot;);
-    [MayThrowLegacyException] void selectNode(Node refNode);
-    [MayThrowLegacyException] void selectNodeContents(Node refNode);
</del><ins>+    [MayThrowException] void expand(optional DOMString unit = &quot;&quot;);
+    [MayThrowException] void selectNode(Node refNode);
+    [MayThrowException] void selectNodeContents(Node refNode);
</ins><span class="cx"> 
</span><span class="cx">     // CompareHow
</span><span class="cx">     const unsigned short START_TO_START = 0;
</span><span class="lines">@@ -52,13 +50,13 @@
</span><span class="cx">     const unsigned short END_TO_END = 2;
</span><span class="cx">     const unsigned short END_TO_START = 3;
</span><span class="cx"> 
</span><del>-    [MayThrowLegacyException, ImplementedAs=compareBoundaryPointsForBindings] short compareBoundaryPoints(unsigned short how, Range sourceRange);
</del><ins>+    [MayThrowException, ImplementedAs=compareBoundaryPointsForBindings] short compareBoundaryPoints(unsigned short how, Range sourceRange);
</ins><span class="cx"> 
</span><del>-    [CEReactions, MayThrowLegacyException] void deleteContents();
-    [CEReactions, MayThrowLegacyException, NewObject] DocumentFragment extractContents();
-    [CEReactions, MayThrowLegacyException, NewObject] DocumentFragment cloneContents();
-    [CEReactions, MayThrowLegacyException] void insertNode(Node newNode);
-    [CEReactions, MayThrowLegacyException] void surroundContents(Node newParent);
</del><ins>+    [CEReactions, MayThrowException] void deleteContents();
+    [CEReactions, MayThrowException, NewObject] DocumentFragment extractContents();
+    [CEReactions, MayThrowException, NewObject] DocumentFragment cloneContents();
+    [CEReactions, MayThrowException] void insertNode(Node newNode);
+    [CEReactions, MayThrowException] void surroundContents(Node newParent);
</ins><span class="cx">     [NewObject] Range cloneRange();
</span><span class="cx">     DOMString toString();
</span><span class="cx"> 
</span><span class="lines">@@ -67,9 +65,9 @@
</span><span class="cx">     ClientRectList getClientRects();
</span><span class="cx">     ClientRect getBoundingClientRect();
</span><span class="cx"> 
</span><del>-    [CEReactions, MayThrowLegacyException, NewObject] DocumentFragment createContextualFragment(DOMString html);
</del><ins>+    [CEReactions, MayThrowException, NewObject] DocumentFragment createContextualFragment(DOMString html);
</ins><span class="cx"> 
</span><del>-    [MayThrowLegacyException] short compareNode(Node refNode);
</del><ins>+    [MayThrowException] short compareNode(Node refNode);
</ins><span class="cx"> 
</span><span class="cx">     // CompareResults
</span><span class="cx">     const unsigned short NODE_BEFORE = 0;
</span><span class="lines">@@ -77,8 +75,8 @@
</span><span class="cx">     const unsigned short NODE_BEFORE_AND_AFTER = 2;
</span><span class="cx">     const unsigned short NODE_INSIDE = 3;
</span><span class="cx"> 
</span><del>-    [MayThrowLegacyException] boolean intersectsNode(Node refNode);
</del><ins>+    [MayThrowException] boolean intersectsNode(Node refNode);
</ins><span class="cx"> 
</span><del>-    [MayThrowLegacyException] short comparePoint(Node refNode, unsigned long offset);
-    [MayThrowLegacyException] boolean isPointInRange(Node refNode, unsigned long offset);
</del><ins>+    [MayThrowException] short comparePoint(Node refNode, unsigned long offset);
+    [MayThrowException] boolean isPointInRange(Node refNode, unsigned long offset);
</ins><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingAlternativeTextControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/AlternativeTextController.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/AlternativeTextController.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/editing/AlternativeTextController.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -257,11 +257,10 @@
</span><span class="cx">     RefPtr&lt;Range&gt; correctionStartOffsetInParagraphAsRange = Range::create(paragraphRangeContainingCorrection-&gt;startContainer().document(), paragraphRangeContainingCorrection-&gt;startPosition(), paragraphRangeContainingCorrection-&gt;startPosition());
</span><span class="cx"> 
</span><span class="cx">     Position startPositionOfRangeWithAlternative = range-&gt;startPosition();
</span><del>-    ExceptionCode ec = 0;
</del><span class="cx">     if (!startPositionOfRangeWithAlternative.containerNode())
</span><span class="cx">         return;
</span><del>-    correctionStartOffsetInParagraphAsRange-&gt;setEnd(*startPositionOfRangeWithAlternative.containerNode(), startPositionOfRangeWithAlternative.computeOffsetInContainerNode(), ec);
-    if (ec)
</del><ins>+    auto setEndResult = correctionStartOffsetInParagraphAsRange-&gt;setEnd(*startPositionOfRangeWithAlternative.containerNode(), startPositionOfRangeWithAlternative.computeOffsetInContainerNode());
+    if (setEndResult.hasException())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     // Take note of the location of autocorrection so that we can add marker after the replacement took place.
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingEditorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/Editor.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/Editor.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/editing/Editor.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -1889,7 +1889,7 @@
</span><span class="cx">         
</span><span class="cx">         Position rangeCompliantPosition = position.parentAnchoredEquivalent();
</span><span class="cx">         if (rangeCompliantPosition.deprecatedNode())
</span><del>-            spellingSearchRange-&gt;setStart(*rangeCompliantPosition.deprecatedNode(), rangeCompliantPosition.deprecatedEditingOffset(), IGNORE_EXCEPTION);
</del><ins>+            spellingSearchRange-&gt;setStart(*rangeCompliantPosition.deprecatedNode(), rangeCompliantPosition.deprecatedEditingOffset());
</ins><span class="cx">         startedWithSelection = false; // won't need to wrap
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="lines">@@ -1897,7 +1897,7 @@
</span><span class="cx">     auto* topNode = highestEditableRoot(position);
</span><span class="cx">     // FIXME: lastOffsetForEditing() is wrong here if editingIgnoresContent(highestEditableRoot()) returns true (e.g. a &lt;table&gt;)
</span><span class="cx">     if (topNode)
</span><del>-        spellingSearchRange-&gt;setEnd(*topNode, lastOffsetForEditing(*topNode), IGNORE_EXCEPTION);
</del><ins>+        spellingSearchRange-&gt;setEnd(*topNode, lastOffsetForEditing(*topNode));
</ins><span class="cx"> 
</span><span class="cx">     // If spellingSearchRange starts in the middle of a word, advance to the next word so we start checking
</span><span class="cx">     // at a word boundary. Going back by one char and then forward by a word does the trick.
</span><span class="lines">@@ -1951,7 +1951,7 @@
</span><span class="cx">             // Stop looking at start of next misspelled word
</span><span class="cx">             CharacterIterator chars(*grammarSearchRange);
</span><span class="cx">             chars.advance(misspellingOffset);
</span><del>-            grammarSearchRange-&gt;setEnd(chars.range()-&gt;startContainer(), chars.range()-&gt;startOffset(), IGNORE_EXCEPTION);
</del><ins>+            grammarSearchRange-&gt;setEnd(chars.range()-&gt;startContainer(), chars.range()-&gt;startOffset());
</ins><span class="cx">         }
</span><span class="cx">     
</span><span class="cx">         if (isGrammarCheckingEnabled())
</span><span class="lines">@@ -1963,9 +1963,9 @@
</span><span class="cx">     // block rather than at a selection).
</span><span class="cx">     if (startedWithSelection &amp;&amp; !misspelledWord &amp;&amp; !badGrammarPhrase) {
</span><span class="cx">         if (topNode)
</span><del>-            spellingSearchRange-&gt;setStart(*topNode, 0, IGNORE_EXCEPTION);
</del><ins>+            spellingSearchRange-&gt;setStart(*topNode, 0);
</ins><span class="cx">         // going until the end of the very first chunk we tested is far enough
</span><del>-        spellingSearchRange-&gt;setEnd(searchEndNodeAfterWrap, searchEndOffsetAfterWrap, IGNORE_EXCEPTION);
</del><ins>+        spellingSearchRange-&gt;setEnd(searchEndNodeAfterWrap, searchEndOffsetAfterWrap);
</ins><span class="cx">         
</span><span class="cx">         if (unifiedTextCheckerEnabled()) {
</span><span class="cx">             grammarSearchRange = spellingSearchRange-&gt;cloneRange();
</span><span class="lines">@@ -1986,7 +1986,7 @@
</span><span class="cx">                 // Stop looking at start of next misspelled word
</span><span class="cx">                 CharacterIterator chars(*grammarSearchRange);
</span><span class="cx">                 chars.advance(misspellingOffset);
</span><del>-                grammarSearchRange-&gt;setEnd(chars.range()-&gt;startContainer(), chars.range()-&gt;startOffset(), IGNORE_EXCEPTION);
</del><ins>+                grammarSearchRange-&gt;setEnd(chars.range()-&gt;startContainer(), chars.range()-&gt;startOffset());
</ins><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             if (isGrammarCheckingEnabled())
</span><span class="lines">@@ -2453,7 +2453,7 @@
</span><span class="cx">         if (m_frame.selection().selection().selectionType() == VisibleSelection::CaretSelection) {
</span><span class="cx">             // Attempt to save the caret position so we can restore it later if needed
</span><span class="cx">             Position caretPosition = m_frame.selection().selection().end();
</span><del>-            selectionOffset = paragraph.offsetTo(caretPosition, ASSERT_NO_EXCEPTION);
</del><ins>+            selectionOffset = paragraph.offsetTo(caretPosition).releaseReturnValue();
</ins><span class="cx">             restoreSelectionAfterChange = true;
</span><span class="cx">             if (selectionOffset &gt; 0 &amp;&amp; (selectionOffset &gt; paragraph.textLength() || paragraph.textCharAt(selectionOffset - 1) == newlineCharacter))
</span><span class="cx">                 adjustSelectionForParagraphBoundaries = true;
</span><span class="lines">@@ -3167,16 +3167,15 @@
</span><span class="cx">     return resultRange-&gt;collapsed() ? nullptr : resultRange;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool isFrameInRange(Frame* frame, Range* range)
</del><ins>+static bool isFrameInRange(Frame&amp; frame, Range&amp; range)
</ins><span class="cx"> {
</span><del>-    bool inRange = false;
-    for (HTMLFrameOwnerElement* ownerElement = frame-&gt;ownerElement(); ownerElement; ownerElement = ownerElement-&gt;document().ownerElement()) {
-        if (&amp;ownerElement-&gt;document() == &amp;range-&gt;ownerDocument()) {
-            inRange = range-&gt;intersectsNode(*ownerElement, IGNORE_EXCEPTION);
-            break;
</del><ins>+    for (auto* ownerElement = frame.ownerElement(); ownerElement; ownerElement = ownerElement-&gt;document().ownerElement()) {
+        if (&amp;ownerElement-&gt;document() == &amp;range.ownerDocument()) {
+            auto result = range.intersectsNode(*ownerElement);
+            return !result.hasException() &amp;&amp; result.releaseReturnValue();
</ins><span class="cx">         }
</span><span class="cx">     }
</span><del>-    return inRange;
</del><ins>+    return false;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> unsigned Editor::countMatchesForText(const String&amp; target, Range* range, FindOptions options, unsigned limit, bool markMatches, Vector&lt;RefPtr&lt;Range&gt;&gt;* matches)
</span><span class="lines">@@ -3188,7 +3187,7 @@
</span><span class="cx">     if (range) {
</span><span class="cx">         if (&amp;range-&gt;ownerDocument() == &amp;document())
</span><span class="cx">             searchRange = range;
</span><del>-        else if (!isFrameInRange(&amp;m_frame, range))
</del><ins>+        else if (!isFrameInRange(m_frame, *range))
</ins><span class="cx">             return 0;
</span><span class="cx">     }
</span><span class="cx">     if (!searchRange)
</span><span class="lines">@@ -3204,8 +3203,8 @@
</span><span class="cx">             if (!resultRange-&gt;startContainer().isInShadowTree())
</span><span class="cx">                 break;
</span><span class="cx"> 
</span><del>-            searchRange-&gt;setStartAfter(*resultRange-&gt;startContainer().shadowHost(), IGNORE_EXCEPTION);
-            searchRange-&gt;setEnd(originalEndContainer, originalEndOffset, IGNORE_EXCEPTION);
</del><ins>+            searchRange-&gt;setStartAfter(*resultRange-&gt;startContainer().shadowHost());
+            searchRange-&gt;setEnd(originalEndContainer, originalEndOffset);
</ins><span class="cx">             continue;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -3224,11 +3223,11 @@
</span><span class="cx">         // result range. There is no need to use a VisiblePosition here,
</span><span class="cx">         // since findPlainText will use a TextIterator to go over the visible
</span><span class="cx">         // text nodes. 
</span><del>-        searchRange-&gt;setStart(resultRange-&gt;endContainer(), resultRange-&gt;endOffset(), IGNORE_EXCEPTION);
</del><ins>+        searchRange-&gt;setStart(resultRange-&gt;endContainer(), resultRange-&gt;endOffset());
</ins><span class="cx"> 
</span><span class="cx">         Node* shadowTreeRoot = searchRange-&gt;shadowRoot();
</span><span class="cx">         if (searchRange-&gt;collapsed() &amp;&amp; shadowTreeRoot)
</span><del>-            searchRange-&gt;setEnd(*shadowTreeRoot, shadowTreeRoot-&gt;countChildNodes(), IGNORE_EXCEPTION);
</del><ins>+            searchRange-&gt;setEnd(*shadowTreeRoot, shadowTreeRoot-&gt;countChildNodes());
</ins><span class="cx">     } while (true);
</span><span class="cx"> 
</span><span class="cx">     return matchCount;
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingEditorCommandcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/EditorCommand.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/EditorCommand.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/editing/EditorCommand.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -230,8 +230,8 @@
</span><span class="cx"> 
</span><span class="cx"> static RefPtr&lt;Range&gt; unionDOMRanges(Range&amp; a, Range&amp; b)
</span><span class="cx"> {
</span><del>-    Range&amp; start = a.compareBoundaryPoints(Range::START_TO_START, b, ASSERT_NO_EXCEPTION) &lt;= 0 ? a : b;
-    Range&amp; end = a.compareBoundaryPoints(Range::END_TO_END, b, ASSERT_NO_EXCEPTION) &lt;= 0 ? b : a;
</del><ins>+    Range&amp; start = a.compareBoundaryPoints(Range::START_TO_START, b).releaseReturnValue() &lt;= 0 ? a : b;
+    Range&amp; end = a.compareBoundaryPoints(Range::END_TO_END, b).releaseReturnValue() &lt;= 0 ? b : a;
</ins><span class="cx">     return Range::create(a.ownerDocument(), &amp;start.startContainer(), start.startOffset(), &amp;end.endContainer(), end.endOffset());
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingFrameSelectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/FrameSelection.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/FrameSelection.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/editing/FrameSelection.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -477,14 +477,16 @@
</span><span class="cx">         else
</span><span class="cx">             m_selection.setWithoutValidation(m_selection.end(), m_selection.start());
</span><span class="cx">     } else if (RefPtr&lt;Range&gt; range = m_selection.firstRange()) {
</span><del>-        ExceptionCode ec = 0;
-        Range::CompareResults compareResult = range-&gt;compareNode(node, ec);
-        if (!ec &amp;&amp; (compareResult == Range::NODE_BEFORE_AND_AFTER || compareResult == Range::NODE_INSIDE)) {
-            // If we did nothing here, when this node's renderer was destroyed, the rect that it 
-            // occupied would be invalidated, but, selection gaps that change as a result of 
-            // the removal wouldn't be invalidated.
-            // FIXME: Don't do so much unnecessary invalidation.
-            clearRenderTreeSelection = true;
</del><ins>+        auto compareNodeResult = range-&gt;compareNode(node);
+        if (!compareNodeResult.hasException()) {
+            auto compareResult = compareNodeResult.releaseReturnValue();
+            if (compareResult == Range::NODE_BEFORE_AND_AFTER || compareResult == Range::NODE_INSIDE) {
+                // If we did nothing here, when this node's renderer was destroyed, the rect that it 
+                // occupied would be invalidated, but, selection gaps that change as a result of 
+                // the removal wouldn't be invalidated.
+                // FIXME: Don't do so much unnecessary invalidation.
+                clearRenderTreeSelection = true;
+            }
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -2621,11 +2623,8 @@
</span><span class="cx"> void FrameSelection::selectRangeOnElement(unsigned location, unsigned length, Node&amp; node)
</span><span class="cx"> {
</span><span class="cx">     RefPtr&lt;Range&gt; resultRange = m_frame-&gt;document()-&gt;createRange();
</span><del>-    ExceptionCode ec = 0;
-    resultRange-&gt;setStart(node, location, ec);
-    ASSERT(!ec);
-    resultRange-&gt;setEnd(node, location + length, ec);
-    ASSERT(!ec);
</del><ins>+    resultRange-&gt;setStart(node, location);
+    resultRange-&gt;setEnd(node, location + length);
</ins><span class="cx">     VisibleSelection selection = VisibleSelection(*resultRange, SEL_DEFAULT_AFFINITY);
</span><span class="cx">     setSelection(selection, true);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingInsertListCommandcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/InsertListCommand.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/InsertListCommand.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/editing/InsertListCommand.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -246,9 +246,9 @@
</span><span class="cx">             // Restore the start and the end of current selection if they started inside listNode
</span><span class="cx">             // because moveParagraphWithClones could have removed them.
</span><span class="cx">             if (rangeStartIsInList &amp;&amp; newList)
</span><del>-                currentSelection-&gt;setStart(*newList, 0, IGNORE_EXCEPTION);
</del><ins>+                currentSelection-&gt;setStart(*newList, 0);
</ins><span class="cx">             if (rangeEndIsInList &amp;&amp; newList)
</span><del>-                currentSelection-&gt;setEnd(*newList, lastOffsetInNode(newList.get()), IGNORE_EXCEPTION);
</del><ins>+                currentSelection-&gt;setEnd(*newList, lastOffsetInNode(newList.get()));
</ins><span class="cx"> 
</span><span class="cx">             setEndingSelection(VisiblePosition(firstPositionInNode(newList.get())));
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingTextCheckingHelpercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/TextCheckingHelper.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/TextCheckingHelper.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/editing/TextCheckingHelper.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Document.h&quot;
</span><span class="cx"> #include &quot;DocumentMarkerController.h&quot;
</span><ins>+#include &quot;ExceptionCode.h&quot;
</ins><span class="cx"> #include &quot;Frame.h&quot;
</span><span class="cx"> #include &quot;FrameSelection.h&quot;
</span><span class="cx"> #include &quot;Settings.h&quot;
</span><span class="lines">@@ -161,7 +162,7 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_checkingRange);
</span><span class="cx">     if (!m_paragraphRange)
</span><del>-        m_paragraphRange = expandToParagraphBoundary(checkingRange());
</del><ins>+        m_paragraphRange = expandToParagraphBoundary(m_checkingRange);
</ins><span class="cx">     return m_paragraphRange;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -171,18 +172,16 @@
</span><span class="cx">     return TextIterator::subrange(paragraphRange().get(), characterOffset, characterCount);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-int TextCheckingParagraph::offsetTo(const Position&amp; position, ExceptionCode&amp; ec) const
</del><ins>+ExceptionOr&lt;int&gt; TextCheckingParagraph::offsetTo(const Position&amp; position) const
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(m_checkingRange);
</span><del>-    if (!position.containerNode()) {
-        ec = TypeError;
-        return 0;
-    }
</del><ins>+    if (!position.containerNode())
+        return Exception { TypeError };
</ins><span class="cx"> 
</span><del>-    Ref&lt;Range&gt; range = offsetAsRange()-&gt;cloneRange();
-    range-&gt;setEnd(*position.containerNode(), position.computeOffsetInContainerNode(), ec);
-    if (ec)
-        return 0;
</del><ins>+    auto range = offsetAsRange()-&gt;cloneRange();
+    auto result = range-&gt;setEnd(*position.containerNode(), position.computeOffsetInContainerNode());
+    if (result.hasException())
+        return result.releaseException();
</ins><span class="cx">     return TextIterator::rangeLength(range.ptr());
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -197,7 +196,7 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_checkingRange);
</span><span class="cx">     if (!m_offsetAsRange)
</span><del>-        m_offsetAsRange = Range::create(paragraphRange()-&gt;startContainer().document(), paragraphRange()-&gt;startPosition(), checkingRange()-&gt;startPosition());
</del><ins>+        m_offsetAsRange = Range::create(paragraphRange()-&gt;startContainer().document(), paragraphRange()-&gt;startPosition(), m_checkingRange-&gt;startPosition());
</ins><span class="cx"> 
</span><span class="cx">     return m_offsetAsRange;
</span><span class="cx"> }
</span><span class="lines">@@ -222,7 +221,7 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_checkingRange);
</span><span class="cx">     if (m_checkingEnd == -1)
</span><del>-        m_checkingEnd = checkingStart() + TextIterator::rangeLength(checkingRange().get());
</del><ins>+        m_checkingEnd = checkingStart() + TextIterator::rangeLength(m_checkingRange.get());
</ins><span class="cx">     return m_checkingEnd;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -230,7 +229,7 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_checkingRange);
</span><span class="cx">     if (-1 == m_checkingLength)
</span><del>-        m_checkingLength = TextIterator::rangeLength(checkingRange().get());
</del><ins>+        m_checkingLength = TextIterator::rangeLength(m_checkingRange.get());
</ins><span class="cx">     return m_checkingLength;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingTextCheckingHelperh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/TextCheckingHelper.h (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/TextCheckingHelper.h        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/editing/TextCheckingHelper.h        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -18,18 +18,17 @@
</span><span class="cx">  * Boston, MA 02110-1301, USA.
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-#ifndef TextCheckingHelper_h
-#define TextCheckingHelper_h
</del><ins>+#pragma once
</ins><span class="cx"> 
</span><span class="cx"> #include &quot;EditorClient.h&quot;
</span><del>-#include &quot;ExceptionCode.h&quot;
</del><ins>+#include &quot;ExceptionOr.h&quot;
</ins><span class="cx"> #include &quot;TextChecking.h&quot;
</span><del>-#include &lt;wtf/text/WTFString.h&gt;
</del><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+class Position;
</ins><span class="cx"> class Range;
</span><del>-class Position;
</del><ins>+
</ins><span class="cx"> struct TextCheckingResult;
</span><span class="cx"> 
</span><span class="cx"> class TextCheckingParagraph {
</span><span class="lines">@@ -40,7 +39,7 @@
</span><span class="cx"> 
</span><span class="cx">     int rangeLength() const;
</span><span class="cx">     PassRefPtr&lt;Range&gt; subrange(int characterOffset, int characterCount) const;
</span><del>-    int offsetTo(const Position&amp;, ExceptionCode&amp;) const;
</del><ins>+    ExceptionOr&lt;int&gt; offsetTo(const Position&amp;) const;
</ins><span class="cx">     void expandRangeToNextEnd();
</span><span class="cx"> 
</span><span class="cx">     // FIXME: Consider changing this to return a StringView.
</span><span class="lines">@@ -65,7 +64,6 @@
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     void invalidateParagraphRangeValues();
</span><del>-    PassRefPtr&lt;Range&gt; checkingRange() const { return m_checkingRange; }
</del><span class="cx">     PassRefPtr&lt;Range&gt; offsetAsRange() const;
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;Range&gt; m_checkingRange;
</span><span class="lines">@@ -108,5 +106,3 @@
</span><span class="cx"> bool unifiedTextCheckerEnabled(const Frame*);
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span><del>-
-#endif // TextCheckingHelper_h
</del></span></pre></div>
<a id="trunkSourceWebCoreeditingTextIteratorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/TextIterator.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/TextIterator.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/editing/TextIterator.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -2561,7 +2561,7 @@
</span><span class="cx">     ASSERT(&amp;testRange-&gt;startContainer() == scope);
</span><span class="cx">     location = TextIterator::rangeLength(testRange.ptr());
</span><span class="cx"> 
</span><del>-    testRange-&gt;setEnd(range-&gt;endContainer(), range-&gt;endOffset(), IGNORE_EXCEPTION);
</del><ins>+    testRange-&gt;setEnd(range-&gt;endContainer(), range-&gt;endOffset());
</ins><span class="cx">     ASSERT(&amp;testRange-&gt;startContainer() == scope);
</span><span class="cx">     length = TextIterator::rangeLength(testRange.ptr()) - location;
</span><span class="cx">     return true;
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingVisiblePositioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/VisiblePosition.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/VisiblePosition.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/editing/VisiblePosition.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -740,9 +740,7 @@
</span><span class="cx">     if (!p.containerNode())
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    int ec = 0;
-    range-&gt;setStart(*p.containerNode(), p.offsetInContainerNode(), ec);
-    return !ec;
</del><ins>+    return !range-&gt;setStart(*p.containerNode(), p.offsetInContainerNode()).hasException();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool setEnd(Range* range, const VisiblePosition&amp; visiblePosition)
</span><span class="lines">@@ -754,9 +752,7 @@
</span><span class="cx">     if (!p.containerNode())
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    int ec = 0;
-    range-&gt;setEnd(*p.containerNode(), p.offsetInContainerNode(), ec);
-    return !ec;
</del><ins>+    return !range-&gt;setEnd(*p.containerNode(), p.offsetInContainerNode()).hasException();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // FIXME: Maybe this should be deprecated too, like the underlying function?
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingVisibleSelectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/VisibleSelection.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/VisibleSelection.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/editing/VisibleSelection.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -199,30 +199,26 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static RefPtr&lt;Range&gt; makeSearchRange(const Position&amp; pos)
</del><ins>+static RefPtr&lt;Range&gt; makeSearchRange(const Position&amp; position)
</ins><span class="cx"> {
</span><del>-    Node* n = pos.deprecatedNode();
-    if (!n)
</del><ins>+    auto* node = position.deprecatedNode();
+    if (!node)
</ins><span class="cx">         return nullptr;
</span><del>-    Node* de = n-&gt;document().documentElement();
-    if (!de)
-        return nullptr;
-    Element* boundary = deprecatedEnclosingBlockFlowElement(n);
</del><ins>+    auto* boundary = deprecatedEnclosingBlockFlowElement(node);
</ins><span class="cx">     if (!boundary)
</span><span class="cx">         return nullptr;
</span><span class="cx"> 
</span><del>-    RefPtr&lt;Range&gt; searchRange(Range::create(n-&gt;document()));
-    ExceptionCode ec = 0;
</del><ins>+    auto searchRange = Range::create(node-&gt;document());
</ins><span class="cx"> 
</span><del>-    Position start(pos.parentAnchoredEquivalent());
-    searchRange-&gt;selectNodeContents(*boundary, ec);
-    searchRange-&gt;setStart(*start.containerNode(), start.offsetInContainerNode(), ec);
-
-    ASSERT(!ec);
-    if (ec)
</del><ins>+    auto result = searchRange-&gt;selectNodeContents(*boundary);
+    if (result.hasException())
</ins><span class="cx">         return nullptr;
</span><ins>+    Position start { position.parentAnchoredEquivalent() };
+    result = searchRange-&gt;setStart(*start.containerNode(), start.offsetInContainerNode());
+    if (result.hasException())
+        return nullptr;
</ins><span class="cx"> 
</span><del>-    return searchRange;
</del><ins>+    return WTFMove(searchRange);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool VisibleSelection::isAll(EditingBoundaryCrossingRule rule) const
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingVisibleUnitscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/VisibleUnits.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/VisibleUnits.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/editing/VisibleUnits.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -467,10 +467,10 @@
</span><span class="cx">         buffer[oldSize + i] = character;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned suffixLengthForRange(RefPtr&lt;Range&gt; forwardsScanRange, Vector&lt;UChar, 1024&gt;&amp; string)
</del><ins>+unsigned suffixLengthForRange(const Range&amp; forwardsScanRange, Vector&lt;UChar, 1024&gt;&amp; string)
</ins><span class="cx"> {
</span><span class="cx">     unsigned suffixLength = 0;
</span><del>-    TextIterator forwardsIterator(forwardsScanRange.get());
</del><ins>+    TextIterator forwardsIterator(&amp;forwardsScanRange);
</ins><span class="cx">     while (!forwardsIterator.atEnd()) {
</span><span class="cx">         StringView text = forwardsIterator.text();
</span><span class="cx">         unsigned i = endOfFirstWordBoundaryContext(text);
</span><span class="lines">@@ -483,10 +483,10 @@
</span><span class="cx">     return suffixLength;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned prefixLengthForRange(RefPtr&lt;Range&gt; backwardsScanRange, Vector&lt;UChar, 1024&gt;&amp; string)
</del><ins>+unsigned prefixLengthForRange(const Range&amp; backwardsScanRange, Vector&lt;UChar, 1024&gt;&amp; string)
</ins><span class="cx"> {
</span><span class="cx">     unsigned prefixLength = 0;
</span><del>-    SimplifiedBackwardsTextIterator backwardsIterator(*backwardsScanRange);
</del><ins>+    SimplifiedBackwardsTextIterator backwardsIterator(backwardsScanRange);
</ins><span class="cx">     while (!backwardsIterator.atEnd()) {
</span><span class="cx">         StringView text = backwardsIterator.text();
</span><span class="cx">         int i = startOfLastWordBoundaryContext(text);
</span><span class="lines">@@ -579,21 +579,24 @@
</span><span class="cx">     Vector&lt;UChar, 1024&gt; string;
</span><span class="cx">     unsigned suffixLength = 0;
</span><span class="cx"> 
</span><del>-    ExceptionCode ec = 0;
</del><span class="cx">     if (requiresContextForWordBoundary(c.characterBefore())) {
</span><del>-        RefPtr&lt;Range&gt; forwardsScanRange(boundaryDocument.createRange());
-        forwardsScanRange-&gt;setEndAfter(*boundary, ec);
-        forwardsScanRange-&gt;setStart(*end.deprecatedNode(), end.deprecatedEditingOffset(), ec);
</del><ins>+        auto forwardsScanRange = boundaryDocument.createRange();
+        auto result = forwardsScanRange-&gt;setEndAfter(*boundary);
+        if (result.hasException())
+            return { };
+        result = forwardsScanRange-&gt;setStart(*end.deprecatedNode(), end.deprecatedEditingOffset());
+        if (result.hasException())
+            return { };
</ins><span class="cx">         suffixLength = suffixLengthForRange(forwardsScanRange, string);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    searchRange-&gt;setStart(*start.deprecatedNode(), start.deprecatedEditingOffset(), ec);
-    searchRange-&gt;setEnd(*end.deprecatedNode(), end.deprecatedEditingOffset(), ec);
</del><ins>+    auto result = searchRange-&gt;setStart(*start.deprecatedNode(), start.deprecatedEditingOffset());
+    if (result.hasException())
+        return { };
+    result = searchRange-&gt;setEnd(*end.deprecatedNode(), end.deprecatedEditingOffset());
+    if (result.hasException())
+        return { };
</ins><span class="cx"> 
</span><del>-    ASSERT(!ec);
-    if (ec)
-        return VisiblePosition();
-
</del><span class="cx">     SimplifiedBackwardsTextIterator it(searchRange);
</span><span class="cx">     unsigned next = backwardSearchForBoundaryWithTextIterator(it, string, suffixLength, searchFunction);
</span><span class="cx"> 
</span><span class="lines">@@ -628,15 +631,15 @@
</span><span class="cx">     unsigned prefixLength = 0;
</span><span class="cx"> 
</span><span class="cx">     if (requiresContextForWordBoundary(c.characterAfter())) {
</span><del>-        RefPtr&lt;Range&gt; backwardsScanRange(boundaryDocument.createRange());
</del><ins>+        auto backwardsScanRange = boundaryDocument.createRange();
</ins><span class="cx">         if (start.deprecatedNode())
</span><del>-            backwardsScanRange-&gt;setEnd(*start.deprecatedNode(), start.deprecatedEditingOffset(), IGNORE_EXCEPTION);
</del><ins>+            backwardsScanRange-&gt;setEnd(*start.deprecatedNode(), start.deprecatedEditingOffset());
</ins><span class="cx">         prefixLength = prefixLengthForRange(backwardsScanRange, string);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    searchRange-&gt;selectNodeContents(*boundary, IGNORE_EXCEPTION);
</del><ins>+    searchRange-&gt;selectNodeContents(*boundary);
</ins><span class="cx">     if (start.deprecatedNode())
</span><del>-        searchRange-&gt;setStart(*start.deprecatedNode(), start.deprecatedEditingOffset(), IGNORE_EXCEPTION);
</del><ins>+        searchRange-&gt;setStart(*start.deprecatedNode(), start.deprecatedEditingOffset());
</ins><span class="cx">     TextIterator it(searchRange.ptr(), TextIteratorEmitsCharactersBetweenAllVisiblePositions);
</span><span class="cx">     unsigned next = forwardSearchForBoundaryWithTextIterator(it, string, prefixLength, searchFunction);
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingVisibleUnitsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/VisibleUnits.h (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/VisibleUnits.h        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/editing/VisibleUnits.h        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -117,8 +117,8 @@
</span><span class="cx"> unsigned endWordBoundary(StringView, unsigned, BoundarySearchContextAvailability, bool&amp;);
</span><span class="cx"> unsigned startSentenceBoundary(StringView, unsigned, BoundarySearchContextAvailability, bool&amp;);
</span><span class="cx"> unsigned endSentenceBoundary(StringView, unsigned, BoundarySearchContextAvailability, bool&amp;);
</span><del>-unsigned suffixLengthForRange(RefPtr&lt;Range&gt;, Vector&lt;UChar, 1024&gt;&amp;);
-unsigned prefixLengthForRange(RefPtr&lt;Range&gt;, Vector&lt;UChar, 1024&gt;&amp;);
</del><ins>+unsigned suffixLengthForRange(const Range&amp;, Vector&lt;UChar, 1024&gt;&amp;);
+unsigned prefixLengthForRange(const Range&amp;, Vector&lt;UChar, 1024&gt;&amp;);
</ins><span class="cx"> unsigned backwardSearchForBoundaryWithTextIterator(SimplifiedBackwardsTextIterator&amp;, Vector&lt;UChar, 1024&gt;&amp;, unsigned, BoundarySearchFunction);
</span><span class="cx"> unsigned forwardSearchForBoundaryWithTextIterator(TextIterator&amp;, Vector&lt;UChar, 1024&gt;&amp;, unsigned, BoundarySearchFunction);
</span><span class="cx"> Node* findStartOfParagraph(Node*, Node*, Node*, int&amp;, Position::AnchorType&amp;, EditingBoundaryCrossingRule);
</span></span></pre></div>
<a id="trunkSourceWebCoreeditinghtmleditingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/htmlediting.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/htmlediting.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/editing/htmlediting.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -102,7 +102,10 @@
</span><span class="cx">             bias = 1;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    int result = Range::compareBoundaryPoints(nodeA, offsetA, nodeB, offsetB, IGNORE_EXCEPTION);
</del><ins>+    auto comparisonResult = Range::compareBoundaryPoints(nodeA, offsetA, nodeB, offsetB);
+    if (comparisonResult.hasException())
+        return bias;
+    auto result = comparisonResult.releaseReturnValue();
</ins><span class="cx">     return result ? result : bias;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1125,7 +1128,7 @@
</span><span class="cx">         return { firstPositionInOrBeforeNode(&amp;node), DOWNSTREAM };
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;Range&gt; range = Range::create(node.document());
</span><del>-    range-&gt;selectNodeContents(node, IGNORE_EXCEPTION);
</del><ins>+    range-&gt;selectNodeContents(node);
</ins><span class="cx">     CharacterIterator it(*range);
</span><span class="cx">     it.advance(index - 1);
</span><span class="cx">     return { it.atEnd() ? range-&gt;endPosition() : it.range()-&gt;endPosition(), UPSTREAM };
</span><span class="lines">@@ -1142,8 +1145,9 @@
</span><span class="cx"> // Call this function to determine whether a node is visibly fit inside selectedRange
</span><span class="cx"> bool isNodeVisiblyContainedWithin(Node&amp; node, const Range&amp; range)
</span><span class="cx"> {
</span><del>-    // If the node is inside the range, then it surely is contained within
-    if (range.compareNode(node, IGNORE_EXCEPTION) == Range::NODE_INSIDE)
</del><ins>+    // If the node is inside the range, then it surely is contained within.
+    auto comparisonResult = range.compareNode(node);
+    if (!comparisonResult.hasException() &amp;&amp; comparisonResult.releaseReturnValue() == Range::NODE_INSIDE)
</ins><span class="cx">         return true;
</span><span class="cx"> 
</span><span class="cx">     bool startIsVisuallySame = visiblePositionBeforeNode(node) == range.startPosition();
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingiosEditorIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/ios/EditorIOS.mm (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/ios/EditorIOS.mm        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/editing/ios/EditorIOS.mm        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -637,7 +637,7 @@
</span><span class="cx"> 
</span><span class="cx">     ExceptionCode ec;
</span><span class="cx">     RefPtr&lt;Range&gt; context = document().createRange();
</span><del>-    context-&gt;selectNodeContents(element, ec);
</del><ins>+    context-&gt;selectNodeContents(element);
</ins><span class="cx"> 
</span><span class="cx">     StringBuilder dictationPhrasesBuilder;
</span><span class="cx">     for (auto&amp; interpretations : dictationPhrases)
</span><span class="lines">@@ -719,7 +719,7 @@
</span><span class="cx">             element.remove();
</span><span class="cx"> 
</span><span class="cx">         auto context = document().createRange();
</span><del>-        context-&gt;selectNodeContents(element, ec);
</del><ins>+        context-&gt;selectNodeContents(element);
</ins><span class="cx">         element.appendChild(createFragmentFromText(context, text), ec);
</span><span class="cx"> 
</span><span class="cx">         // restore element to document
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingmacEditorMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/mac/EditorMac.mm (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/mac/EditorMac.mm        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/editing/mac/EditorMac.mm        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -335,7 +335,7 @@
</span><span class="cx">     ASSERT(commonAncestor);
</span><span class="cx">     auto* enclosingAnchor = enclosingElementWithTag(firstPositionInNode(commonAncestor), HTMLNames::aTag);
</span><span class="cx">     if (enclosingAnchor &amp;&amp; comparePositions(firstPositionInOrBeforeNode(range-&gt;startPosition().anchorNode()), range-&gt;startPosition()) &gt;= 0)
</span><del>-        range-&gt;setStart(*enclosingAnchor, 0, IGNORE_EXCEPTION);
</del><ins>+        range-&gt;setStart(*enclosingAnchor, 0);
</ins><span class="cx">     return range;
</span><span class="cx"> }
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingmarkupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/markup.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/markup.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/editing/markup.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -613,7 +613,7 @@
</span><span class="cx">         accumulator.appendString(interchangeNewlineString);
</span><span class="cx">         startNode = visibleStart.next().deepEquivalent().deprecatedNode();
</span><span class="cx"> 
</span><del>-        if (pastEnd &amp;&amp; Range::compareBoundaryPoints(startNode, 0, pastEnd, 0, ASSERT_NO_EXCEPTION) &gt;= 0)
</del><ins>+        if (pastEnd &amp;&amp; Range::compareBoundaryPoints(startNode, 0, pastEnd, 0).releaseReturnValue() &gt;= 0)
</ins><span class="cx">             return interchangeNewlineString;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepageContextMenuControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/ContextMenuController.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/ContextMenuController.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/page/ContextMenuController.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -413,10 +413,10 @@
</span><span class="cx">     case ContextMenuItemTagStartSpeaking: {
</span><span class="cx">         RefPtr&lt;Range&gt; selectedRange = frame-&gt;selection().toNormalizedRange();
</span><span class="cx">         if (!selectedRange || selectedRange-&gt;collapsed()) {
</span><del>-            Document&amp; document = m_context.hitTestResult().innerNonSharedNode()-&gt;document();
</del><ins>+            auto&amp; document = m_context.hitTestResult().innerNonSharedNode()-&gt;document();
</ins><span class="cx">             selectedRange = document.createRange();
</span><del>-            if (document.documentElement())
-                selectedRange-&gt;selectNode(*document.documentElement(), IGNORE_EXCEPTION);
</del><ins>+            if (auto* element = document.documentElement())
+                selectedRange-&gt;selectNode(*element);
</ins><span class="cx">         }
</span><span class="cx">         m_client.speak(plainText(selectedRange.get()));
</span><span class="cx">         break;
</span></span></pre></div>
<a id="trunkSourceWebCorepageDOMSelectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/DOMSelection.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/DOMSelection.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/page/DOMSelection.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -331,26 +331,30 @@
</span><span class="cx">     if (!normalizedRange)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    if (range.compareBoundaryPoints(Range::START_TO_START, *normalizedRange, IGNORE_EXCEPTION) == -1) {
-        // We don't support discontiguous selection. We don't do anything if r and range don't intersect.
-        if (range.compareBoundaryPoints(Range::START_TO_END, *normalizedRange, IGNORE_EXCEPTION) &gt; -1) {
-            if (range.compareBoundaryPoints(Range::END_TO_END, *normalizedRange, IGNORE_EXCEPTION) == -1) {
-                // The original range and r intersect.
</del><ins>+    auto result = range.compareBoundaryPoints(Range::START_TO_START, *normalizedRange);
+    if (!result.hasException() &amp;&amp; result.releaseReturnValue() == -1) {
+        // We don't support discontiguous selection. We don't do anything if the two ranges don't intersect.
+        result = range.compareBoundaryPoints(Range::START_TO_END, *normalizedRange);
+        if (!result.hasException() &amp;&amp; result.releaseReturnValue() &gt; -1) {
+            result = range.compareBoundaryPoints(Range::END_TO_END, *normalizedRange);
+            if (!result.hasException() &amp;&amp; result.releaseReturnValue() == -1) {
+                // The ranges intersect.
</ins><span class="cx">                 selection.moveTo(range.startPosition(), normalizedRange-&gt;endPosition(), DOWNSTREAM);
</span><span class="cx">             } else {
</span><del>-                // r contains the original range.
</del><ins>+                // The new range contains the original range.
</ins><span class="cx">                 selection.moveTo(&amp;range);
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     } else {
</span><del>-        // We don't support discontiguous selection. We don't do anything if r and range don't intersect.
-        ExceptionCode ec = 0;
-        if (range.compareBoundaryPoints(Range::END_TO_START, *normalizedRange, ec) &lt; 1 &amp;&amp; !ec) {
-            if (range.compareBoundaryPoints(Range::END_TO_END, *normalizedRange, IGNORE_EXCEPTION) == -1) {
-                // The original range contains r.
</del><ins>+        // We don't support discontiguous selection. We don't do anything if the two ranges don't intersect.
+        result = range.compareBoundaryPoints(Range::END_TO_START, *normalizedRange);
+        if (!result.hasException() &amp;&amp; result.releaseReturnValue() &lt; 1) {
+            result = range.compareBoundaryPoints(Range::END_TO_END, *normalizedRange);
+            if (!result.hasException() &amp;&amp; result.releaseReturnValue() == -1) {
+                // The original range contains the new range.
</ins><span class="cx">                 selection.moveTo(normalizedRange.get());
</span><span class="cx">             } else {
</span><del>-                // The original range and r intersect.
</del><ins>+                // The ranges intersect.
</ins><span class="cx">                 selection.moveTo(normalizedRange-&gt;startPosition(), range.endPosition(), DOWNSTREAM);
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="lines">@@ -371,7 +375,7 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     Ref&lt;Frame&gt; protector(*m_frame);
</span><del>-    selectedRange-&gt;deleteContents(ASSERT_NO_EXCEPTION);
</del><ins>+    selectedRange-&gt;deleteContents();
</ins><span class="cx">     setBaseAndExtent(&amp;selectedRange-&gt;startContainer(), selectedRange-&gt;startOffset(), &amp;selectedRange-&gt;startContainer(), selectedRange-&gt;startOffset());
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -392,17 +396,22 @@
</span><span class="cx">         return false;
</span><span class="cx">     unsigned nodeIndex = node.computeNodeIndex();
</span><span class="cx"> 
</span><del>-    ExceptionCode ec = 0;
-    bool nodeFullySelected = Range::compareBoundaryPoints(parentNode, nodeIndex, &amp;selectedRange-&gt;startContainer(), selectedRange-&gt;startOffset(), ec) &gt;= 0 &amp;&amp; !ec
-        &amp;&amp; Range::compareBoundaryPoints(parentNode, nodeIndex + 1, &amp;selectedRange-&gt;endContainer(), selectedRange-&gt;endOffset(), ec) &lt;= 0 &amp;&amp; !ec;
-    ASSERT(!ec);
-    if (nodeFullySelected)
</del><ins>+    auto startsResult = Range::compareBoundaryPoints(parentNode, nodeIndex, &amp;selectedRange-&gt;startContainer(), selectedRange-&gt;startOffset());
+    ASSERT(!startsResult.hasException());
+    auto endsResult = Range::compareBoundaryPoints(parentNode, nodeIndex + 1, &amp;selectedRange-&gt;endContainer(), selectedRange-&gt;endOffset());
+    ASSERT(!endsResult.hasException());
+    bool isNodeFullySelected = !startsResult.hasException() &amp;&amp; startsResult.releaseReturnValue() &gt;= 0
+        &amp;&amp; !endsResult.hasException() &amp;&amp; endsResult.releaseReturnValue() &lt;= 0;
+    if (isNodeFullySelected)
</ins><span class="cx">         return true;
</span><span class="cx"> 
</span><del>-    bool nodeFullyUnselected = (Range::compareBoundaryPoints(parentNode, nodeIndex, &amp;selectedRange-&gt;endContainer(), selectedRange-&gt;endOffset(), ec) &gt; 0 &amp;&amp; !ec)
-        || (Range::compareBoundaryPoints(parentNode, nodeIndex + 1, &amp;selectedRange-&gt;startContainer(), selectedRange-&gt;startOffset(), ec) &lt; 0 &amp;&amp; !ec);
-    ASSERT(!ec);
-    if (nodeFullyUnselected)
</del><ins>+    auto startEndResult = Range::compareBoundaryPoints(parentNode, nodeIndex, &amp;selectedRange-&gt;endContainer(), selectedRange-&gt;endOffset());
+    ASSERT(!startEndResult.hasException());
+    auto endStartResult = Range::compareBoundaryPoints(parentNode, nodeIndex + 1, &amp;selectedRange-&gt;startContainer(), selectedRange-&gt;startOffset());
+    ASSERT(!endStartResult.hasException());
+    bool isNodeFullyUnselected = (!startEndResult.hasException() &amp;&amp; startEndResult.releaseReturnValue() &gt; 0)
+        || (!endStartResult.hasException() &amp;&amp; endStartResult.releaseReturnValue() &lt; 0);
+    if (isNodeFullyUnselected)
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     return allowPartial || node.isTextNode();
</span></span></pre></div>
<a id="trunkSourceWebCorepageEventHandlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/EventHandler.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/EventHandler.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/page/EventHandler.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -2509,70 +2509,60 @@
</span><span class="cx"> bool EventHandler::dispatchMouseEvent(const AtomicString&amp; eventType, Node* targetNode, bool /*cancelable*/, int clickCount, const PlatformMouseEvent&amp; platformMouseEvent, bool setUnder)
</span><span class="cx"> {
</span><span class="cx">     Ref&lt;Frame&gt; protectedFrame(m_frame);
</span><del>-    if (FrameView* view = m_frame.view())
</del><ins>+
+    if (auto* view = m_frame.view())
</ins><span class="cx">         view-&gt;disableLayerFlushThrottlingTemporarilyForInteraction();
</span><span class="cx"> 
</span><span class="cx">     updateMouseEventTargetNode(targetNode, platformMouseEvent, setUnder);
</span><span class="cx"> 
</span><del>-    bool swallowEvent = false;
</del><ins>+    if (m_elementUnderMouse &amp;&amp; !m_elementUnderMouse-&gt;dispatchMouseEvent(platformMouseEvent, eventType, clickCount))
+        return false;
</ins><span class="cx"> 
</span><del>-    if (m_elementUnderMouse)
-        swallowEvent = !(m_elementUnderMouse-&gt;dispatchMouseEvent(platformMouseEvent, eventType, clickCount));
</del><ins>+    if (eventType != eventNames().mousedownEvent)
+        return true;
</ins><span class="cx"> 
</span><del>-    if (!swallowEvent &amp;&amp; eventType == eventNames().mousedownEvent) {
</del><ins>+    // If clicking on a frame scrollbar, do not make any change to which element is focused.
+    auto* view = m_frame.view();
+    if (view &amp;&amp; view-&gt;scrollbarAtPoint(platformMouseEvent.position()))
+        return true;
</ins><span class="cx"> 
</span><del>-        // If clicking on a frame scrollbar, do not mess up with content focus.
-        if (FrameView* view = m_frame.view()) {
-            if (view-&gt;scrollbarAtPoint(platformMouseEvent.position()))
-                return true;
-        }
</del><ins>+    // The layout needs to be up to date to determine if an element is focusable.
+    m_frame.document()-&gt;updateLayoutIgnorePendingStylesheets();
</ins><span class="cx"> 
</span><del>-        // The layout needs to be up to date to determine if an element is focusable.
-        m_frame.document()-&gt;updateLayoutIgnorePendingStylesheets();
</del><ins>+    // Remove focus from the currently focused element when a link or button is clicked.
+    // This is expected by some sites that rely on change event handlers running
+    // from form fields before the button click is processed, behavior that was inherited
+    // from the user interface of Windows, where pushing a button moves focus to the button.
</ins><span class="cx"> 
</span><del>-        // Blur current focus node when a link/button is clicked; this
-        // is expected by some sites that rely on onChange handlers running
-        // from form fields before the button click is processed.
</del><ins>+    // Walk up the DOM tree to search for an element to focus.
+    Element* element;
+    for (element = m_elementUnderMouse.get(); element; element = element-&gt;parentOrShadowHostElement()) {
+        if (element-&gt;isMouseFocusable())
+            break;
+    }
</ins><span class="cx"> 
</span><del>-        Element* element = m_elementUnderMouse.get();
-
-        // Walk up the DOM tree to search for an element to focus.
-        while (element) {
-            if (element-&gt;isMouseFocusable()) {
-                // To fix &lt;rdar://problem/4895428&gt; Can't drag selected ToDo, we don't focus a
-                // node on mouse down if it's selected and inside a focused node. It will be
-                // focused if the user does a mouseup over it, however, because the mouseup
-                // will set a selection inside it, which will call setFocuseNodeIfNeeded.
-                if (m_frame.selection().isRange()) {
-                    if (auto range = m_frame.selection().toNormalizedRange()) {
-                        if (range-&gt;compareNode(*element, IGNORE_EXCEPTION) == Range::NODE_INSIDE &amp;&amp; element-&gt;isDescendantOf(m_frame.document()-&gt;focusedElement()))
-                            return true;
-                    }
-                }
-                    
-                break;
-            }
-            element = element-&gt;parentOrShadowHostElement();
</del><ins>+    // To fix &lt;rdar://problem/4895428&gt; Can't drag selected ToDo, we don't focus an
+    // element on mouse down if it's selected and inside a focused element. It will be
+    // focused if the user does a mouseup over it, however, because the mouseup
+    // will set a selection inside it, which will also set the focused element.
+    if (element &amp;&amp; m_frame.selection().isRange()) {
+        if (auto range = m_frame.selection().toNormalizedRange()) {
+            auto result = range-&gt;compareNode(*element);
+            if (!result.hasException() &amp;&amp; result.releaseReturnValue() == Range::NODE_INSIDE &amp;&amp; element-&gt;isDescendantOf(m_frame.document()-&gt;focusedElement()))
+                return true;
</ins><span class="cx">         }
</span><ins>+    }
</ins><span class="cx"> 
</span><del>-        // Only change the focus when clicking scrollbars if it can transfered to a mouse focusable node.
-        if ((!element || !element-&gt;isMouseFocusable()) &amp;&amp; isInsideScrollbar(platformMouseEvent.position()))
-            return false;
</del><ins>+    // Only change the focus when clicking scrollbars if it can be transferred to a mouse focusable node.
+    if (!element &amp;&amp; isInsideScrollbar(platformMouseEvent.position()))
+        return false;
</ins><span class="cx"> 
</span><del>-        // If focus shift is blocked, we eat the event.  Note we should never clear swallowEvent
-        // if the page already set it (e.g., by canceling default behavior).
-        if (Page* page = m_frame.page()) {
-            if (element &amp;&amp; element-&gt;isMouseFocusable()) {
-                if (!page-&gt;focusController().setFocusedElement(element, &amp;m_frame))
-                    swallowEvent = true;
-            } else if (!element || !element-&gt;focused()) {
-                if (!page-&gt;focusController().setFocusedElement(0, &amp;m_frame))
-                    swallowEvent = true;
-            }
-        }
-    }
</del><ins>+    // If focus shift is blocked, we eat the event.
+    auto* page = m_frame.page();
+    if (page &amp;&amp; !page-&gt;focusController().setFocusedElement(element, &amp;m_frame))
+        return false;
</ins><span class="cx"> 
</span><del>-    return !swallowEvent;
</del><ins>+    return true;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool EventHandler::isInsideScrollbar(const IntPoint&amp; windowPoint) const
</span></span></pre></div>
<a id="trunkSourceWebCorepagePagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/page/Page.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -638,7 +638,8 @@
</span><span class="cx">         RefPtr&lt;Range&gt; selectedRange = frameWithSelection-&gt;selection().selection().firstRange();
</span><span class="cx">         if (options &amp; Backwards) {
</span><span class="cx">             for (size_t i = matchRanges.size(); i &gt; 0; --i) {
</span><del>-                if (selectedRange-&gt;compareBoundaryPoints(Range::END_TO_START, *matchRanges[i - 1], IGNORE_EXCEPTION) &gt; 0) {
</del><ins>+                auto result = selectedRange-&gt;compareBoundaryPoints(Range::END_TO_START, *matchRanges[i - 1]);
+                if (!result.hasException() &amp;&amp; result.releaseReturnValue() &gt; 0) {
</ins><span class="cx">                     indexForSelection = i - 1;
</span><span class="cx">                     break;
</span><span class="cx">                 }
</span><span class="lines">@@ -645,7 +646,8 @@
</span><span class="cx">             }
</span><span class="cx">         } else {
</span><span class="cx">             for (size_t i = 0, size = matchRanges.size(); i &lt; size; ++i) {
</span><del>-                if (selectedRange-&gt;compareBoundaryPoints(Range::START_TO_END, *matchRanges[i], IGNORE_EXCEPTION) &lt; 0) {
</del><ins>+                auto result = selectedRange-&gt;compareBoundaryPoints(Range::START_TO_END, *matchRanges[i]);
+                if (!result.hasException() &amp;&amp; result.releaseReturnValue() &lt; 0) {
</ins><span class="cx">                     indexForSelection = i;
</span><span class="cx">                     break;
</span><span class="cx">                 }
</span></span></pre></div>
<a id="trunkSourceWebCorepageTextIndicatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/TextIndicator.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/TextIndicator.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/page/TextIndicator.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -127,7 +127,7 @@
</span><span class="cx">         RenderObject* renderer = node-&gt;renderer();
</span><span class="cx">         if (!renderer)
</span><span class="cx">             continue;
</span><del>-        if ((!renderer-&gt;isInline() || renderer-&gt;isReplaced()) &amp;&amp; range.intersectsNode(*node, ASSERT_NO_EXCEPTION))
</del><ins>+        if ((!renderer-&gt;isInline() || renderer-&gt;isReplaced()) &amp;&amp; range.intersectsNode(*node).releaseReturnValue())
</ins><span class="cx">             return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderNamedFlowThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -662,8 +662,9 @@
</span><span class="cx">             if (!boxIntersectsRegion(logicalTopForRenderer, logicalBottomForRenderer, logicalTopForRegion, logicalBottomForRegion)) {
</span><span class="cx">                 if (foundStartPosition) {
</span><span class="cx">                     if (!startsAboveRegion) {
</span><del>-                        if (range-&gt;intersectsNode(*node, IGNORE_EXCEPTION))
-                            range-&gt;setEndBefore(*node, IGNORE_EXCEPTION);
</del><ins>+                        auto intersectsResult = range-&gt;intersectsNode(*node);
+                        if (!intersectsResult.hasException() &amp;&amp; intersectsResult.releaseReturnValue())
+                            range-&gt;setEndBefore(*node);
</ins><span class="cx">                         rangeObjects.append(range-&gt;cloneRange());
</span><span class="cx">                         range = Range::create(contentElement-&gt;document());
</span><span class="cx">                         startsAboveRegion = true;
</span><span class="lines">@@ -671,7 +672,7 @@
</span><span class="cx">                         skipOverOutsideNodes = true;
</span><span class="cx">                 }
</span><span class="cx">                 if (skipOverOutsideNodes)
</span><del>-                    range-&gt;setStartAfter(*node, IGNORE_EXCEPTION);
</del><ins>+                    range-&gt;setStartAfter(*node);
</ins><span class="cx">                 foundStartPosition = false;
</span><span class="cx">                 continue;
</span><span class="cx">             }
</span><span class="lines">@@ -701,7 +702,7 @@
</span><span class="cx">                 // the range is closed.
</span><span class="cx">                 if (startsAboveRegion) {
</span><span class="cx">                     startsAboveRegion = false;
</span><del>-                    range-&gt;setStartBefore(*node, IGNORE_EXCEPTION);
</del><ins>+                    range-&gt;setStartBefore(*node);
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx">             skipOverOutsideNodes  = false;
</span><span class="lines">@@ -738,7 +739,7 @@
</span><span class="cx">                 // for elements that ends inside the region, set the end position to be after them
</span><span class="cx">                 // allow this end position to be changed only by other elements that are not descendants of the current end node
</span><span class="cx">                 if (endsBelowRegion || (!endsBelowRegion &amp;&amp; !node-&gt;isDescendantOf(lastEndNode))) {
</span><del>-                    range-&gt;setEndAfter(*node, IGNORE_EXCEPTION);
</del><ins>+                    range-&gt;setEndAfter(*node);
</ins><span class="cx">                     endsBelowRegion = false;
</span><span class="cx">                     lastEndNode = node;
</span><span class="cx">                 }
</span></span></pre></div>
<a id="trunkSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/ChangeLog (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/ChangeLog        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebKit/mac/ChangeLog        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -1,5 +1,44 @@
</span><span class="cx"> 2016-11-09  Darin Adler  &lt;darin@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Move Range from ExceptionCode to ExceptionOr
+        https://bugs.webkit.org/show_bug.cgi?id=164457
+
+        Reviewed by Alex Christensen.
+
+        * DOM/DOMRange.mm:
+        (-[DOMRange setStart:offset:]): Updated exception handling.
+        (-[DOMRange setEnd:offset:]): Ditto.
+        (-[DOMRange setStartBefore:]): Ditto.
+        (-[DOMRange setStartAfter:]): Ditto.
+        (-[DOMRange setEndBefore:]): Ditto.
+        (-[DOMRange setEndAfter:]): Ditto.
+        (-[DOMRange selectNode:]): Ditto.
+        (-[DOMRange selectNodeContents:]): Ditto.
+        (-[DOMRange compareBoundaryPoints:sourceRange:]): Ditto.
+        (-[DOMRange deleteContents]): Ditto.
+        (-[DOMRange extractContents]): Ditto.
+        (-[DOMRange cloneContents]): Ditto.
+        (-[DOMRange insertNode:]): Ditto.
+        (-[DOMRange surroundContents:]): Ditto.
+        (-[DOMRange createContextualFragment:]): Ditto.
+        (-[DOMRange compareNode:]): Ditto.
+        (-[DOMRange intersectsNode:]): Ditto.
+        (-[DOMRange comparePoint:offset:]): Ditto.
+        (-[DOMRange isPointInRange:offset:]): Ditto.
+        (-[DOMRange expand:]): Ditto.
+        * WebView/WebFrame.mm:
+        (-[WebFrame _documentFragmentWithMarkupString:baseURLString:]): Ditto.
+        (-[WebFrame _smartDeleteRangeForProposedRange:]): Deleted.
+        This function was incorrectly implemented (set both start and end of
+        the range to the computed start), not declared in any header file,
+        not used anywhere inside WebKit, and I also could not find a use of it
+        in outside-WebKit Apple code.
+        * mac/DOM/DOMUIKitExtensions.mm:
+        (-[DOMRange move:inDirection:]): Ditto.
+        (-[DOMRange extend:inDirection:]): Ditto.
+
+2016-11-09  Darin Adler  &lt;darin@apple.com&gt;
+
</ins><span class="cx">         Move EventTarget from ExceptionCode to ExceptionOr
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=164465
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKitmacDOMDOMRangemm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/DOM/DOMRange.mm (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/DOM/DOMRange.mm        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebKit/mac/DOM/DOMRange.mm        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -100,9 +100,7 @@
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><span class="cx">     if (!refNode)
</span><span class="cx">         raiseTypeErrorException();
</span><del>-    WebCore::ExceptionCode ec = 0;
-    IMPL-&gt;setStart(*core(refNode), offset, ec);
-    raiseOnDOMError(ec);
</del><ins>+    raiseOnDOMError(IMPL-&gt;setStart(*core(refNode), offset));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)setEnd:(DOMNode *)refNode offset:(int)offset
</span><span class="lines">@@ -110,9 +108,7 @@
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><span class="cx">     if (!refNode)
</span><span class="cx">         raiseTypeErrorException();
</span><del>-    WebCore::ExceptionCode ec = 0;
-    IMPL-&gt;setEnd(*core(refNode), offset, ec);
-    raiseOnDOMError(ec);
</del><ins>+    raiseOnDOMError(IMPL-&gt;setEnd(*core(refNode), offset));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)setStartBefore:(DOMNode *)refNode
</span><span class="lines">@@ -120,9 +116,7 @@
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><span class="cx">     if (!refNode)
</span><span class="cx">         raiseTypeErrorException();
</span><del>-    WebCore::ExceptionCode ec = 0;
-    IMPL-&gt;setStartBefore(*core(refNode), ec);
-    raiseOnDOMError(ec);
</del><ins>+    raiseOnDOMError(IMPL-&gt;setStartBefore(*core(refNode)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)setStartAfter:(DOMNode *)refNode
</span><span class="lines">@@ -130,9 +124,7 @@
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><span class="cx">     if (!refNode)
</span><span class="cx">         raiseTypeErrorException();
</span><del>-    WebCore::ExceptionCode ec = 0;
-    IMPL-&gt;setStartAfter(*core(refNode), ec);
-    raiseOnDOMError(ec);
</del><ins>+    raiseOnDOMError(IMPL-&gt;setStartAfter(*core(refNode)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)setEndBefore:(DOMNode *)refNode
</span><span class="lines">@@ -140,9 +132,7 @@
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><span class="cx">     if (!refNode)
</span><span class="cx">         raiseTypeErrorException();
</span><del>-    WebCore::ExceptionCode ec = 0;
-    IMPL-&gt;setEndBefore(*core(refNode), ec);
-    raiseOnDOMError(ec);
</del><ins>+    raiseOnDOMError(IMPL-&gt;setEndBefore(*core(refNode)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)setEndAfter:(DOMNode *)refNode
</span><span class="lines">@@ -150,9 +140,7 @@
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><span class="cx">     if (!refNode)
</span><span class="cx">         raiseTypeErrorException();
</span><del>-    WebCore::ExceptionCode ec = 0;
-    IMPL-&gt;setEndAfter(*core(refNode), ec);
-    raiseOnDOMError(ec);
</del><ins>+    raiseOnDOMError(IMPL-&gt;setEndAfter(*core(refNode)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)collapse:(BOOL)toStart
</span><span class="lines">@@ -166,9 +154,7 @@
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><span class="cx">     if (!refNode)
</span><span class="cx">         raiseTypeErrorException();
</span><del>-    WebCore::ExceptionCode ec = 0;
-    IMPL-&gt;selectNode(*core(refNode), ec);
-    raiseOnDOMError(ec);
</del><ins>+    raiseOnDOMError(IMPL-&gt;selectNode(*core(refNode)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)selectNodeContents:(DOMNode *)refNode
</span><span class="lines">@@ -176,9 +162,7 @@
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><span class="cx">     if (!refNode)
</span><span class="cx">         raiseTypeErrorException();
</span><del>-    WebCore::ExceptionCode ec = 0;
-    IMPL-&gt;selectNodeContents(*core(refNode), ec);
-    raiseOnDOMError(ec);
</del><ins>+    raiseOnDOMError(IMPL-&gt;selectNodeContents(*core(refNode)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (short)compareBoundaryPoints:(unsigned short)how sourceRange:(DOMRange *)sourceRange
</span><span class="lines">@@ -186,36 +170,25 @@
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><span class="cx">     if (!sourceRange)
</span><span class="cx">         raiseTypeErrorException();
</span><del>-    WebCore::ExceptionCode ec = 0;
-    short result = IMPL-&gt;compareBoundaryPointsForBindings(how, *core(sourceRange), ec);
-    raiseOnDOMError(ec);
-    return result;
</del><ins>+    return raiseOnDOMError(IMPL-&gt;compareBoundaryPointsForBindings(how, *core(sourceRange)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)deleteContents
</span><span class="cx"> {
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><del>-    WebCore::ExceptionCode ec = 0;
-    IMPL-&gt;deleteContents(ec);
-    raiseOnDOMError(ec);
</del><ins>+    raiseOnDOMError(IMPL-&gt;deleteContents());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (DOMDocumentFragment *)extractContents
</span><span class="cx"> {
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><del>-    WebCore::ExceptionCode ec = 0;
-    DOMDocumentFragment *result = kit(WTF::getPtr(IMPL-&gt;extractContents(ec)));
-    raiseOnDOMError(ec);
-    return result;
</del><ins>+    return kit(raiseOnDOMError(IMPL-&gt;extractContents()).ptr());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (DOMDocumentFragment *)cloneContents
</span><span class="cx"> {
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><del>-    WebCore::ExceptionCode ec = 0;
-    DOMDocumentFragment *result = kit(WTF::getPtr(IMPL-&gt;cloneContents(ec)));
-    raiseOnDOMError(ec);
-    return result;
</del><ins>+    return kit(raiseOnDOMError(IMPL-&gt;cloneContents()).ptr());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)insertNode:(DOMNode *)newNode
</span><span class="lines">@@ -223,9 +196,7 @@
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><span class="cx">     if (!newNode)
</span><span class="cx">         raiseTypeErrorException();
</span><del>-    WebCore::ExceptionCode ec = 0;
-    IMPL-&gt;insertNode(*core(newNode), ec);
-    raiseOnDOMError(ec);
</del><ins>+    raiseOnDOMError(IMPL-&gt;insertNode(*core(newNode)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)surroundContents:(DOMNode *)newParent
</span><span class="lines">@@ -233,9 +204,7 @@
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><span class="cx">     if (!newParent)
</span><span class="cx">         raiseTypeErrorException();
</span><del>-    WebCore::ExceptionCode ec = 0;
-    IMPL-&gt;surroundContents(*core(newParent), ec);
-    raiseOnDOMError(ec);
</del><ins>+    raiseOnDOMError(IMPL-&gt;surroundContents(*core(newParent)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (DOMRange *)cloneRange
</span><span class="lines">@@ -259,10 +228,7 @@
</span><span class="cx"> - (DOMDocumentFragment *)createContextualFragment:(NSString *)html
</span><span class="cx"> {
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><del>-    WebCore::ExceptionCode ec = 0;
-    DOMDocumentFragment *result = kit(WTF::getPtr(IMPL-&gt;createContextualFragment(html, ec)));
-    raiseOnDOMError(ec);
-    return result;
</del><ins>+    return kit(raiseOnDOMError(IMPL-&gt;createContextualFragment(html)).ptr());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (short)compareNode:(DOMNode *)refNode
</span><span class="lines">@@ -270,10 +236,7 @@
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><span class="cx">     if (!refNode)
</span><span class="cx">         raiseTypeErrorException();
</span><del>-    WebCore::ExceptionCode ec = 0;
-    short result = IMPL-&gt;compareNode(*core(refNode), ec);
-    raiseOnDOMError(ec);
-    return result;
</del><ins>+    return raiseOnDOMError(IMPL-&gt;compareNode(*core(refNode)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (BOOL)intersectsNode:(DOMNode *)refNode
</span><span class="lines">@@ -281,10 +244,7 @@
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><span class="cx">     if (!refNode)
</span><span class="cx">         raiseTypeErrorException();
</span><del>-    WebCore::ExceptionCode ec = 0;
-    BOOL result = IMPL-&gt;intersectsNode(*core(refNode), ec);
-    raiseOnDOMError(ec);
-    return result;
</del><ins>+    return raiseOnDOMError(IMPL-&gt;intersectsNode(*core(refNode)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (short)comparePoint:(DOMNode *)refNode offset:(int)offset
</span><span class="lines">@@ -292,10 +252,7 @@
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><span class="cx">     if (!refNode)
</span><span class="cx">         raiseTypeErrorException();
</span><del>-    WebCore::ExceptionCode ec = 0;
-    short result = IMPL-&gt;comparePoint(*core(refNode), offset, ec);
-    raiseOnDOMError(ec);
-    return result;
</del><ins>+    return raiseOnDOMError(IMPL-&gt;comparePoint(*core(refNode), offset));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (BOOL)isPointInRange:(DOMNode *)refNode offset:(int)offset
</span><span class="lines">@@ -303,18 +260,13 @@
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><span class="cx">     if (!refNode)
</span><span class="cx">         raiseTypeErrorException();
</span><del>-    WebCore::ExceptionCode ec = 0;
-    BOOL result = IMPL-&gt;isPointInRange(*core(refNode), offset, ec);
-    raiseOnDOMError(ec);
-    return result;
</del><ins>+    return raiseOnDOMError(IMPL-&gt;isPointInRange(*core(refNode), offset));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)expand:(NSString *)unit
</span><span class="cx"> {
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><del>-    WebCore::ExceptionCode ec = 0;
-    IMPL-&gt;expand(unit, ec);
-    raiseOnDOMError(ec);
</del><ins>+    raiseOnDOMError(IMPL-&gt;expand(unit));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> @end
</span></span></pre></div>
<a id="trunkSourceWebKitmacDOMDOMUIKitExtensionsmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/DOM/DOMUIKitExtensions.mm (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/DOM/DOMUIKitExtensions.mm        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebKit/mac/DOM/DOMUIKitExtensions.mm        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -109,13 +109,12 @@
</span><span class="cx">     for (UInt32 i = 0; i &lt; amount; i++)
</span><span class="cx">         frameSelection.modify(FrameSelection::AlterationMove, (SelectionDirection)direction, granularity);
</span><span class="cx">     
</span><del>-    ExceptionCode ignored;
</del><span class="cx">     Position start = frameSelection.selection().start().parentAnchoredEquivalent();
</span><span class="cx">     Position end = frameSelection.selection().end().parentAnchoredEquivalent();
</span><span class="cx">     if (start.containerNode())
</span><del>-        range-&gt;setStart(*start.containerNode(), start.offsetInContainerNode(), ignored);
</del><ins>+        range-&gt;setStart(*start.containerNode(), start.offsetInContainerNode());
</ins><span class="cx">     if (end.containerNode())
</span><del>-        range-&gt;setEnd(*end.containerNode(), end.offsetInContainerNode(), ignored);
</del><ins>+        range-&gt;setEnd(*end.containerNode(), end.offsetInContainerNode());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)extend:(UInt32)amount inDirection:(WebTextAdjustmentDirection)direction
</span><span class="lines">@@ -127,13 +126,12 @@
</span><span class="cx">     for (UInt32 i = 0; i &lt; amount; i++)
</span><span class="cx">         frameSelection.modify(FrameSelection::AlterationExtend, (SelectionDirection)direction, CharacterGranularity);    
</span><span class="cx">     
</span><del>-    ExceptionCode ignored;
</del><span class="cx">     Position start = frameSelection.selection().start().parentAnchoredEquivalent();
</span><span class="cx">     Position end = frameSelection.selection().end().parentAnchoredEquivalent();
</span><span class="cx">     if (start.containerNode())
</span><del>-        range-&gt;setStart(*start.containerNode(), start.offsetInContainerNode(), ignored);
</del><ins>+        range-&gt;setStart(*start.containerNode(), start.offsetInContainerNode());
</ins><span class="cx">     if (end.containerNode())
</span><del>-        range-&gt;setEnd(*end.containerNode(), end.offsetInContainerNode(), ignored);
</del><ins>+        range-&gt;setEnd(*end.containerNode(), end.offsetInContainerNode());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (DOMNode *)firstNode
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebViewWebFramemm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebView/WebFrame.mm (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebView/WebFrame.mm        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebKit/mac/WebView/WebFrame.mm        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -846,43 +846,8 @@
</span><span class="cx">     return kit(_private-&gt;coreFrame-&gt;editor().mark().toNormalizedRange().get());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// Given proposedRange, returns an extended range that includes adjacent whitespace that should
-// be deleted along with the proposed range in order to preserve proper spacing and punctuation of
-// the text surrounding the deletion.
-- (DOMRange *)_smartDeleteRangeForProposedRange:(DOMRange *)proposedRange
</del><ins>+- (DOMDocumentFragment *)_documentFragmentWithMarkupString:(NSString *)markupString baseURLString:(NSString *)baseURLString
</ins><span class="cx"> {
</span><del>-    Node* startContainer = core([proposedRange startContainer]);
-    Node* endContainer = core([proposedRange endContainer]);
-    if (startContainer == nil || endContainer == nil)
-        return nil;
-
-    ASSERT(&amp;startContainer-&gt;document() == &amp;endContainer-&gt;document());
-    
-    _private-&gt;coreFrame-&gt;document()-&gt;updateLayoutIgnorePendingStylesheets();
-
-    Position start = Position(startContainer, [proposedRange startOffset], Position::PositionIsOffsetInAnchor);
-    Position end = Position(endContainer, [proposedRange endOffset], Position::PositionIsOffsetInAnchor);
-    Position newStart = start.upstream().leadingWhitespacePosition(DOWNSTREAM, true);
-    if (newStart.isNull())
-        newStart = start;
-    Position newEnd = end.downstream().trailingWhitespacePosition(DOWNSTREAM, true);
-    if (newEnd.isNull())
-        newEnd = end;
-
-    newStart = newStart.parentAnchoredEquivalent();
-    newEnd = newEnd.parentAnchoredEquivalent();
-
-    Ref&lt;Range&gt; range = _private-&gt;coreFrame-&gt;document()-&gt;createRange();
-    if (newStart.containerNode()) {
-        int exception = 0;
-        range-&gt;setStart(*newStart.containerNode(), newStart.offsetInContainerNode(), exception);
-        range-&gt;setEnd(*newStart.containerNode(), newStart.offsetInContainerNode(), exception);
-    }
-    return kit(range.ptr());
-}
-
-- (DOMDocumentFragment *)_documentFragmentWithMarkupString:(NSString *)markupString baseURLString:(NSString *)baseURLString 
-{
</del><span class="cx">     Frame* frame = _private-&gt;coreFrame;
</span><span class="cx">     if (!frame)
</span><span class="cx">         return nil;
</span></span></pre></div>
<a id="trunkSourceWebKitwinChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/ChangeLog (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/ChangeLog        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebKit/win/ChangeLog        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -1,5 +1,15 @@
</span><span class="cx"> 2016-11-09  Darin Adler  &lt;darin@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Move Range from ExceptionCode to ExceptionOr
+        https://bugs.webkit.org/show_bug.cgi?id=164457
+
+        Reviewed by Alex Christensen.
+
+        * WebView.cpp:
+        (WebView::onIMERequestCharPosition): Updated for new exception handling.
+
+2016-11-09  Darin Adler  &lt;darin@apple.com&gt;
+
</ins><span class="cx">         Move EventTarget from ExceptionCode to ExceptionOr
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=164465
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKitwinWebViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/WebView.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/WebView.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebKit/win/WebView.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -6321,9 +6321,8 @@
</span><span class="cx">         return 0;
</span><span class="cx">     IntRect caret;
</span><span class="cx">     if (RefPtr&lt;Range&gt; range = targetFrame-&gt;editor().hasComposition() ? targetFrame-&gt;editor().compositionRange() : targetFrame-&gt;selection().selection().toNormalizedRange()) {
</span><del>-        ExceptionCode ec = 0;
</del><span class="cx">         RefPtr&lt;Range&gt; tempRange = range-&gt;cloneRange();
</span><del>-        tempRange-&gt;setStart(tempRange-&gt;startContainer(), tempRange-&gt;startOffset() + charPos-&gt;dwCharPos, ec);
</del><ins>+        tempRange-&gt;setStart(tempRange-&gt;startContainer(), tempRange-&gt;startOffset() + charPos-&gt;dwCharPos);
</ins><span class="cx">         caret = targetFrame-&gt;editor().firstRectForRange(tempRange.get());
</span><span class="cx">     }
</span><span class="cx">     caret = targetFrame-&gt;view()-&gt;contentsToWindow(caret);
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebKit2/ChangeLog        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -1,5 +1,50 @@
</span><span class="cx"> 2016-11-09  Darin Adler  &lt;darin@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Move Range from ExceptionCode to ExceptionOr
+        https://bugs.webkit.org/show_bug.cgi?id=164457
+
+        Reviewed by Alex Christensen.
+
+        * WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMRange.cpp:
+        (webkit_dom_range_set_start): Updated exception handling.
+        (webkit_dom_range_set_end): Ditto.
+        (webkit_dom_range_set_start_before): Ditto.
+        (webkit_dom_range_set_start_after): Ditto.
+        (webkit_dom_range_set_end_before): Ditto.
+        (webkit_dom_range_set_end_after): Ditto.
+        (webkit_dom_range_select_node): Ditto.
+        (webkit_dom_range_select_node_contents): Ditto.
+        (webkit_dom_range_compare_boundary_points): Ditto.
+        (webkit_dom_range_delete_contents): Ditto.
+        (webkit_dom_range_extract_contents): Ditto.
+        (webkit_dom_range_clone_contents): Ditto.
+        (webkit_dom_range_insert_node): Ditto.
+        (webkit_dom_range_surround_contents): Ditto.
+        (webkit_dom_range_create_contextual_fragment): Ditto.
+        (webkit_dom_range_compare_node): Ditto.
+        (webkit_dom_range_intersects_node): Ditto.
+        (webkit_dom_range_compare_point): Ditto.
+        (webkit_dom_range_is_point_in_range): Ditto.
+        (webkit_dom_range_expand): Ditto.
+        * WebProcess/InjectedBundle/API/mac/WKDOMRange.mm:
+        (-[WKDOMRange setStart:offset:]): Ditto.
+        (-[WKDOMRange setEnd:offset:]): Ditto.
+        (-[WKDOMRange selectNode:]): Ditto.
+        (-[WKDOMRange selectNodeContents:]): Ditto.
+        * WebProcess/WebPage/WebFrame.cpp:
+        (WebKit::WebFrame::contentsAsString): Ditto.
+        * WebProcess/WebPage/ios/WebPageIOS.mm:
+        (WebKit::WebPage::rangeForWebSelectionAtPosition): Ditto.
+        (WebKit::WebPage::rangeForBlockAtPoint): Ditto.
+        (WebKit::WebPage::selectWithGesture): Ditto.
+        (WebKit::containsRange): Ditto.
+        (WebKit::unionDOMRanges): Ditto.
+        (WebKit::WebPage::switchToBlockSelectionAtPoint): Ditto.
+        (WebKit::WebPage::getPositionInformation): Ditto.
+
+
+2016-11-09  Darin Adler  &lt;darin@apple.com&gt;
+
</ins><span class="cx">         Move EventTarget from ExceptionCode to ExceptionOr
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=164465
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessInjectedBundleAPIgtkDOMWebKitDOMRangecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMRange.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMRange.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMRange.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -227,10 +227,9 @@
</span><span class="cx">     g_return_if_fail(!error || !*error);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><span class="cx">     WebCore::Node* convertedRefNode = WebKit::core(refNode);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    item-&gt;setStart(*convertedRefNode, offset, ec);
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;setStart(*convertedRefNode, offset);
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -243,10 +242,9 @@
</span><span class="cx">     g_return_if_fail(!error || !*error);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><span class="cx">     WebCore::Node* convertedRefNode = WebKit::core(refNode);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    item-&gt;setEnd(*convertedRefNode, offset, ec);
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;setEnd(*convertedRefNode, offset);
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -259,10 +257,9 @@
</span><span class="cx">     g_return_if_fail(!error || !*error);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><span class="cx">     WebCore::Node* convertedRefNode = WebKit::core(refNode);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    item-&gt;setStartBefore(*convertedRefNode, ec);
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;setStartBefore(*convertedRefNode);
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -275,10 +272,9 @@
</span><span class="cx">     g_return_if_fail(!error || !*error);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><span class="cx">     WebCore::Node* convertedRefNode = WebKit::core(refNode);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    item-&gt;setStartAfter(*convertedRefNode, ec);
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;setStartAfter(*convertedRefNode);
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -291,10 +287,9 @@
</span><span class="cx">     g_return_if_fail(!error || !*error);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><span class="cx">     WebCore::Node* convertedRefNode = WebKit::core(refNode);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    item-&gt;setEndBefore(*convertedRefNode, ec);
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;setEndBefore(*convertedRefNode);
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -307,10 +302,9 @@
</span><span class="cx">     g_return_if_fail(!error || !*error);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><span class="cx">     WebCore::Node* convertedRefNode = WebKit::core(refNode);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    item-&gt;setEndAfter(*convertedRefNode, ec);
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;setEndAfter(*convertedRefNode);
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -332,10 +326,9 @@
</span><span class="cx">     g_return_if_fail(!error || !*error);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><span class="cx">     WebCore::Node* convertedRefNode = WebKit::core(refNode);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    item-&gt;selectNode(*convertedRefNode, ec);
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;selectNode(*convertedRefNode);
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -348,10 +341,9 @@
</span><span class="cx">     g_return_if_fail(!error || !*error);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><span class="cx">     WebCore::Node* convertedRefNode = WebKit::core(refNode);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    item-&gt;selectNodeContents(*convertedRefNode, ec);
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;selectNodeContents(*convertedRefNode);
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -364,13 +356,13 @@
</span><span class="cx">     g_return_val_if_fail(!error || !*error, 0);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><span class="cx">     WebCore::Range* convertedSourceRange = WebKit::core(sourceRange);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    gshort result = item-&gt;compareBoundaryPointsForBindings(how, *convertedSourceRange, ec);
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;compareBoundaryPointsForBindings(how, *convertedSourceRange);
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><ins>+        return 0;
</ins><span class="cx">     }
</span><del>-    return result;
</del><ins>+    return result.releaseReturnValue();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void webkit_dom_range_delete_contents(WebKitDOMRange* self, GError** error)
</span><span class="lines">@@ -379,10 +371,9 @@
</span><span class="cx">     g_return_if_fail(WEBKIT_DOM_IS_RANGE(self));
</span><span class="cx">     g_return_if_fail(!error || !*error);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    item-&gt;deleteContents(ec);
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;deleteContents();
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -393,13 +384,13 @@
</span><span class="cx">     g_return_val_if_fail(WEBKIT_DOM_IS_RANGE(self), 0);
</span><span class="cx">     g_return_val_if_fail(!error || !*error, 0);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    RefPtr&lt;WebCore::DocumentFragment&gt; gobjectResult = WTF::getPtr(item-&gt;extractContents(ec));
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;extractContents();
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><ins>+        return nullptr;
</ins><span class="cx">     }
</span><del>-    return WebKit::kit(gobjectResult.get());
</del><ins>+    return WebKit::kit(result.releaseReturnValue().ptr());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> WebKitDOMDocumentFragment* webkit_dom_range_clone_contents(WebKitDOMRange* self, GError** error)
</span><span class="lines">@@ -408,13 +399,13 @@
</span><span class="cx">     g_return_val_if_fail(WEBKIT_DOM_IS_RANGE(self), 0);
</span><span class="cx">     g_return_val_if_fail(!error || !*error, 0);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    RefPtr&lt;WebCore::DocumentFragment&gt; gobjectResult = WTF::getPtr(item-&gt;cloneContents(ec));
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;cloneContents();
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><ins>+        return nullptr;
</ins><span class="cx">     }
</span><del>-    return WebKit::kit(gobjectResult.get());
</del><ins>+    return WebKit::kit(result.releaseReturnValue().ptr());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void webkit_dom_range_insert_node(WebKitDOMRange* self, WebKitDOMNode* newNode, GError** error)
</span><span class="lines">@@ -425,10 +416,9 @@
</span><span class="cx">     g_return_if_fail(!error || !*error);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><span class="cx">     WebCore::Node* convertedNewNode = WebKit::core(newNode);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    item-&gt;insertNode(*convertedNewNode, ec);
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;insertNode(*convertedNewNode);
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -441,10 +431,9 @@
</span><span class="cx">     g_return_if_fail(!error || !*error);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><span class="cx">     WebCore::Node* convertedNewParent = WebKit::core(newParent);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    item-&gt;surroundContents(*convertedNewParent, ec);
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;surroundContents(*convertedNewParent);
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -486,13 +475,13 @@
</span><span class="cx">     g_return_val_if_fail(!error || !*error, 0);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><span class="cx">     WTF::String convertedHtml = WTF::String::fromUTF8(html);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    RefPtr&lt;WebCore::DocumentFragment&gt; gobjectResult = WTF::getPtr(item-&gt;createContextualFragment(convertedHtml, ec));
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;createContextualFragment(convertedHtml);
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><ins>+        return nullptr;
</ins><span class="cx">     }
</span><del>-    return WebKit::kit(gobjectResult.get());
</del><ins>+    return WebKit::kit(result.releaseReturnValue().ptr());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gshort webkit_dom_range_compare_node(WebKitDOMRange* self, WebKitDOMNode* refNode, GError** error)
</span><span class="lines">@@ -503,13 +492,13 @@
</span><span class="cx">     g_return_val_if_fail(!error || !*error, 0);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><span class="cx">     WebCore::Node* convertedRefNode = WebKit::core(refNode);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    gshort result = item-&gt;compareNode(*convertedRefNode, ec);
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;compareNode(*convertedRefNode);
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><ins>+        return 0;
</ins><span class="cx">     }
</span><del>-    return result;
</del><ins>+    return result.releaseReturnValue();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gboolean webkit_dom_range_intersects_node(WebKitDOMRange* self, WebKitDOMNode* refNode, GError** error)
</span><span class="lines">@@ -520,13 +509,13 @@
</span><span class="cx">     g_return_val_if_fail(!error || !*error, FALSE);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><span class="cx">     WebCore::Node* convertedRefNode = WebKit::core(refNode);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    gboolean result = item-&gt;intersectsNode(*convertedRefNode, ec);
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;intersectsNode(*convertedRefNode);
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><ins>+        return false;
</ins><span class="cx">     }
</span><del>-    return result;
</del><ins>+    return result.releaseReturnValue();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gshort webkit_dom_range_compare_point(WebKitDOMRange* self, WebKitDOMNode* refNode, glong offset, GError** error)
</span><span class="lines">@@ -537,13 +526,13 @@
</span><span class="cx">     g_return_val_if_fail(!error || !*error, 0);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><span class="cx">     WebCore::Node* convertedRefNode = WebKit::core(refNode);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    gshort result = item-&gt;comparePoint(*convertedRefNode, offset, ec);
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;comparePoint(*convertedRefNode, offset);
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><ins>+        return 0;
</ins><span class="cx">     }
</span><del>-    return result;
</del><ins>+    return result.releaseReturnValue();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gboolean webkit_dom_range_is_point_in_range(WebKitDOMRange* self, WebKitDOMNode* refNode, glong offset, GError** error)
</span><span class="lines">@@ -554,13 +543,13 @@
</span><span class="cx">     g_return_val_if_fail(!error || !*error, FALSE);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><span class="cx">     WebCore::Node* convertedRefNode = WebKit::core(refNode);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    gboolean result = item-&gt;isPointInRange(*convertedRefNode, offset, ec);
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;isPointInRange(*convertedRefNode, offset);
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><ins>+        return false;
</ins><span class="cx">     }
</span><del>-    return result;
</del><ins>+    return result.releaseReturnValue();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void webkit_dom_range_expand(WebKitDOMRange* self, const gchar* unit, GError** error)
</span><span class="lines">@@ -571,10 +560,9 @@
</span><span class="cx">     g_return_if_fail(!error || !*error);
</span><span class="cx">     WebCore::Range* item = WebKit::core(self);
</span><span class="cx">     WTF::String convertedUnit = WTF::String::fromUTF8(unit);
</span><del>-    WebCore::ExceptionCode ec = 0;
-    item-&gt;expand(convertedUnit, ec);
-    if (ec) {
-        WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+    auto result = item-&gt;expand(convertedUnit);
+    if (result.hasException()) {
+        WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx">         g_set_error_literal(error, g_quark_from_string(&quot;WEBKIT_DOM&quot;), ecdesc.code, ecdesc.name);
</span><span class="cx">     }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessInjectedBundleAPImacWKDOMRangemm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKDOMRange.mm (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKDOMRange.mm        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKDOMRange.mm        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -68,9 +68,7 @@
</span><span class="cx"> {
</span><span class="cx">     if (!node)
</span><span class="cx">         return;
</span><del>-    // FIXME: Do something about the exception.
-    WebCore::ExceptionCode ec = 0;
-    _impl-&gt;setStart(*WebKit::toWebCoreNode(node), offset, ec);
</del><ins>+    _impl-&gt;setStart(*WebKit::toWebCoreNode(node), offset);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)setEnd:(WKDOMNode *)node offset:(int)offset
</span><span class="lines">@@ -77,9 +75,7 @@
</span><span class="cx"> {
</span><span class="cx">     if (!node)
</span><span class="cx">         return;
</span><del>-    // FIXME: Do something about the exception.
-    WebCore::ExceptionCode ec = 0;
-    _impl-&gt;setEnd(*WebKit::toWebCoreNode(node), offset, ec);
</del><ins>+    _impl-&gt;setEnd(*WebKit::toWebCoreNode(node), offset);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)collapse:(BOOL)toStart
</span><span class="lines">@@ -91,9 +87,7 @@
</span><span class="cx"> {
</span><span class="cx">     if (!node)
</span><span class="cx">         return;
</span><del>-    // FIXME: Do something about the exception.
-    WebCore::ExceptionCode ec = 0;
-    _impl-&gt;selectNode(*WebKit::toWebCoreNode(node), ec);
</del><ins>+    _impl-&gt;selectNode(*WebKit::toWebCoreNode(node));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)selectNodeContents:(WKDOMNode *)node
</span><span class="lines">@@ -100,9 +94,7 @@
</span><span class="cx"> {
</span><span class="cx">     if (!node)
</span><span class="cx">         return;
</span><del>-    // FIXME: Do something about the exception.
-    WebCore::ExceptionCode ec = 0;
-    _impl-&gt;selectNodeContents(*WebKit::toWebCoreNode(node), ec);
</del><ins>+    _impl-&gt;selectNodeContents(*WebKit::toWebCoreNode(node));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (WKDOMNode *)startContainer
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebFramecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebFrame.cpp (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebFrame.cpp        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebFrame.cpp        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -344,9 +344,7 @@
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;Range&gt; range = document-&gt;createRange();
</span><span class="cx"> 
</span><del>-    ExceptionCode ec = 0;
-    range-&gt;selectNode(*documentElement, ec);
-    if (ec)
</del><ins>+    if (range-&gt;selectNode(*documentElement).hasException())
</ins><span class="cx">         return String();
</span><span class="cx"> 
</span><span class="cx">     return plainText(range.get());
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageiosWebPageIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm (208478 => 208479)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm        2016-11-09 21:27:29 UTC (rev 208478)
+++ trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm        2016-11-09 21:27:56 UTC (rev 208479)
</span><span class="lines">@@ -964,7 +964,7 @@
</span><span class="cx"> 
</span><span class="cx">     flags = IsBlockSelection;
</span><span class="cx">     range = Range::create(bestChoice-&gt;document());
</span><del>-    range-&gt;selectNodeContents(*bestChoice, ASSERT_NO_EXCEPTION);
</del><ins>+    range-&gt;selectNodeContents(*bestChoice);
</ins><span class="cx">     return range-&gt;collapsed() ? nullptr : range;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -988,7 +988,7 @@
</span><span class="cx">         return nullptr;
</span><span class="cx"> 
</span><span class="cx">     range = Range::create(currentNode-&gt;document());
</span><del>-    range-&gt;selectNodeContents(*currentNode, ASSERT_NO_EXCEPTION);
</del><ins>+    range-&gt;selectNodeContents(*currentNode);
</ins><span class="cx">     return range;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1072,9 +1072,9 @@
</span><span class="cx">                 break;
</span><span class="cx">             range = Range::create(*frame.document(), m_currentWordRange-&gt;startPosition(), m_currentWordRange-&gt;endPosition());
</span><span class="cx">             if (position &lt; range-&gt;startPosition())
</span><del>-                range-&gt;setStart(position.deepEquivalent(), ASSERT_NO_EXCEPTION);
</del><ins>+                range-&gt;setStart(position.deepEquivalent());
</ins><span class="cx">             if (position &gt; range-&gt;endPosition())
</span><del>-                range-&gt;setEnd(position.deepEquivalent(), ASSERT_NO_EXCEPTION);
</del><ins>+                range-&gt;setEnd(position.deepEquivalent());
</ins><span class="cx">             break;
</span><span class="cx">         case GestureRecognizerState::Ended:
</span><span class="cx">         case GestureRecognizerState::Cancelled:
</span><span class="lines">@@ -1243,9 +1243,9 @@
</span><span class="cx"> {
</span><span class="cx">     if (!first || !second)
</span><span class="cx">         return false;
</span><del>-    return (first-&gt;commonAncestorContainer()-&gt;ownerDocument() == second-&gt;commonAncestorContainer()-&gt;ownerDocument()
-        &amp;&amp; first-&gt;compareBoundaryPoints(Range::START_TO_START, *second, ASSERT_NO_EXCEPTION) &lt;= 0
-        &amp;&amp; first-&gt;compareBoundaryPoints(Range::END_TO_END, *second, ASSERT_NO_EXCEPTION) &gt;= 0);
</del><ins>+    return first-&gt;commonAncestorContainer()-&gt;ownerDocument() == second-&gt;commonAncestorContainer()-&gt;ownerDocument()
+        &amp;&amp; first-&gt;compareBoundaryPoints(Range::START_TO_START, *second).releaseReturnValue() &lt;= 0
+        &amp;&amp; first-&gt;compareBoundaryPoints(Range::END_TO_END, *second).releaseReturnValue() &gt;= 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static inline RefPtr&lt;Range&gt; unionDOMRanges(Range* rangeA, Range* rangeB)
</span><span class="lines">@@ -1255,8 +1255,8 @@
</span><span class="cx">     if (!rangeA)
</span><span class="cx">         return rangeB;
</span><span class="cx"> 
</span><del>-    Range* start = rangeA-&gt;compareBoundaryPoints(Range::START_TO_START, *rangeB, ASSERT_NO_EXCEPTION) &lt;= 0 ? rangeA : rangeB;
-    Range* end = rangeA-&gt;compareBoundaryPoints(Range::END_TO_END, *rangeB, ASSERT_NO_EXCEPTION) &lt;= 0 ? rangeB : rangeA;
</del><ins>+    Range* start = rangeA-&gt;compareBoundaryPoints(Range::START_TO_START, *rangeB).releaseReturnValue() &lt;= 0 ? rangeA : rangeB;
+    Range* end = rangeA-&gt;compareBoundaryPoints(Range::END_TO_END, *rangeB).releaseReturnValue() &lt;= 0 ? rangeB : rangeA;
</ins><span class="cx"> 
</span><span class="cx">     return Range::create(rangeA-&gt;ownerDocument(), &amp;start-&gt;startContainer(), start-&gt;startOffset(), &amp;end-&gt;endContainer(), end-&gt;endOffset());
</span><span class="cx"> }
</span><span class="lines">@@ -1644,7 +1644,7 @@
</span><span class="cx">         
</span><span class="cx">         if (!newRange &amp;&amp; currentNode) {
</span><span class="cx">             newRange = Range::create(currentNode-&gt;document());
</span><del>-            newRange-&gt;selectNodeContents(*currentNode, ASSERT_NO_EXCEPTION);
</del><ins>+            newRange-&gt;selectNodeContents(*currentNode);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     return newRange;
</span><span class="lines">@@ -2332,7 +2332,7 @@
</span><span class="cx">                         info.dataDetectorResults = element-&gt;document().frame()-&gt;dataDetectionResults();
</span><span class="cx">                         if (DataDetection::requiresExtendedContext(*element)) {
</span><span class="cx">                             RefPtr&lt;Range&gt; linkRange = Range::create(element-&gt;document());
</span><del>-                            linkRange-&gt;selectNodeContents(*element, ASSERT_NO_EXCEPTION);
</del><ins>+                            linkRange-&gt;selectNodeContents(*element);
</ins><span class="cx">                             info.textBefore = plainTextReplacingNoBreakSpace(rangeExpandedByCharactersInDirectionAtWordBoundary(linkRange-&gt;startPosition(), dataDetectionExtendedContextLength, DirectionBackward).get(), TextIteratorDefaultBehavior, true);
</span><span class="cx">                             info.textAfter = plainTextReplacingNoBreakSpace(rangeExpandedByCharactersInDirectionAtWordBoundary(linkRange-&gt;endPosition(), dataDetectionExtendedContextLength, DirectionForward).get(), TextIteratorDefaultBehavior, true);
</span><span class="cx">                         }
</span></span></pre>
</div>
</div>

</body>
</html>