<!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 "node" instead of "n" 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 "internal" 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 "undefined", because the function silently does nothing when passed
any unrecognized string, and so this leaves behavior unchanged. I removed
the comment saying that the "undefined" 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 <darin@apple.com>
+
+ 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 "node" instead of "n" 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 "internal" 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 "undefined", because the function silently does nothing when passed
+ any unrecognized string, and so this leaves behavior unchanged. I removed
+ the comment saying that the "undefined" 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 <hyatt@apple.com>
</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 = &node->document();
</span><span class="cx"> if (!document)
</span><span class="cx"> return nullptr;
</span><del>- RefPtr<Range> range = Range::create(*document);
- ExceptionCode ec = 0;
- // For replaced node without children, we should incluce itself in the range.
- if (AccessibilityObject::replacedNodeNeedsCharacter(node))
- range->selectNode(*node, ec);
- else
- range->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->selectNode(*node).hasException())
+ return nullptr;
+ } else {
+ if (range->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 && (AccessibilityObject::replacedNodeNeedsCharacter(node) || node->hasTagName(brTag));
</span><span class="lines">@@ -1681,7 +1682,14 @@
</span><span class="cx"> RefPtr<Range> range1 = AXObjectCache::rangeForNodeContents(node1);
</span><span class="cx"> RefPtr<Range> range2 = AXObjectCache::rangeForNodeContents(node2);
</span><span class="cx">
</span><del>- return !range2 || (range1 && range1->compareBoundaryPoints(Range::START_TO_START, *range2, IGNORE_EXCEPTION) <= 0);
</del><ins>+ if (!range2)
+ return true;
+ if (!range1)
+ return false;
+ auto result = range1->compareBoundaryPoints(Range::START_TO_START, *range2);
+ if (result.hasException())
+ return true;
+ return result.releaseReturnValue() <= 0;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static Node* resetNodeAndOffsetForReplacedNode(Node* replacedNode, int& offset, int characterCount)
</span><span class="lines">@@ -1696,16 +1704,10 @@
</span><span class="cx"> return replacedNode->parentNode();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static void setRangeStartOrEndWithCharacterOffset(RefPtr<Range> range, const CharacterOffset& characterOffset, bool isStart, ExceptionCode& ec)
</del><ins>+static bool setRangeStartOrEndWithCharacterOffset(Range& range, const CharacterOffset& 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->setStart(*node, offset, ec);
- else
- range->setEnd(*node, offset, ec);
</del><ins>+ return true;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> RefPtr<Range> AXObjectCache::rangeForUnorderedCharacterOffsets(const CharacterOffset& characterOffset1, const CharacterOffset& 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<Range> 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& textMarkerData, const CharacterOffset& characterOffset)
</span><span class="lines">@@ -2229,30 +2232,30 @@
</span><span class="cx"> CharacterOffset AXObjectCache::nextBoundary(const CharacterOffset& 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<Range> searchRange = rangeForNodeContents(boundary);
</span><ins>+ if (!searchRange)
+ return { };
+
</ins><span class="cx"> Vector<UChar, 1024> 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<Range> backwardsScanRange(boundary->document().createRange());
- setRangeStartOrEndWithCharacterOffset(backwardsScanRange, characterOffset, false, ec);
</del><ins>+ auto backwardsScanRange = boundary->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<UChar, 1024> 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<Range> forwardsScanRange(boundary->document().createRange());
- forwardsScanRange->setEndAfter(*boundary, ec);
- setRangeStartOrEndWithCharacterOffset(forwardsScanRange, characterOffset, true, ec);
</del><ins>+ auto forwardsScanRange = boundary->document().createRange();
+ if (forwardsScanRange->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 && result > 0) || (isBackwardSearch && result < 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->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<Range> currentSelectionRange = visibleSelection.toNormalizedRange();
</span><del>- if (!currentSelectionRange || !currentSelectionRange->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 "does not intersect". Seems likely
+ // that does not handle all cases correctly.
+ auto intersectsResult = currentSelectionRange->intersectsNode(*node);
+ if (!intersectsResult.hasException() && !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 "touching" 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->node();
- Node* lastDescendant = node->lastDescendant();
- return (range->intersectsNode(*node, IGNORE_EXCEPTION)
- && (&range->endContainer() != node || range->endOffset())
- && (&range->startContainer() != lastDescendant || static_cast<int>(range->startOffset()) != lastOffsetInNode(lastDescendant)));
</del><ins>+ auto& node = *coreObject->node();
+ auto* lastDescendant = node.lastDescendant();
+ unsigned lastOffset = lastOffsetInNode(lastDescendant);
+ auto intersectsResult = range->intersectsNode(node);
+ return !intersectsResult.hasException()
+ && intersectsResult.releaseReturnValue()
+ && (&range->endContainer() != &node || range->endOffset())
+ && (&range->startContainer() != lastDescendant || range->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->document();
</span><span class="cx"> Element* selectionRoot = document->frame()->selection().selection().rootEditableElement();
</span><span class="cx"> Element* scope = selectionRoot ? selectionRoot : document->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 (&range->endContainer() != scope && !range->endContainer().isDescendantOf(scope))
</span><span class="cx"> return NSMakeRange(NSNotFound, 0);
</span><del>-
</del><ins>+
</ins><span class="cx"> RefPtr<Range> testRange = Range::create(scope->document(), scope, 0, &range->startContainer(), range->startOffset());
</span><span class="cx"> ASSERT(&testRange->startContainer() == scope);
</span><span class="cx"> int startPosition = TextIterator::rangeLength(testRange.get());
</span><del>-
- ExceptionCode ec;
- testRange->setEnd(range->endContainer(), range->endOffset(), ec);
</del><ins>+ testRange->setEnd(range->endContainer(), range->endOffset());
</ins><span class="cx"> ASSERT(&testRange->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<IntRect>& rects) const
</span><span class="cx"> {
</span><del>- RefPtr<Range> range = Range::create(document());
- range->selectNodeContents(const_cast<Node&>(*this), IGNORE_EXCEPTION);
</del><ins>+ auto range = Range::create(document());
+ range->selectNodeContents(const_cast<Node&>(*this));
</ins><span class="cx"> range->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, ("Range"));
</span><span class="cx">
</span><ins>+enum ContentsProcessDirection { ProcessContentsForward, ProcessContentsBackward };
+enum class CoordinateSpace { Absolute, Client };
+
+static ExceptionOr<void> processNodes(Range::ActionType, Vector<Ref<Node>>&, Node* oldContainer, RefPtr<Node> newContainer);
+static ExceptionOr<RefPtr<Node>> processContentsBetweenOffsets(Range::ActionType, RefPtr<DocumentFragment>, RefPtr<Node> container, unsigned startOffset, unsigned endOffset);
+static ExceptionOr<RefPtr<Node>> processAncestorsAndTheirSiblings(Range::ActionType, Node* container, ContentsProcessDirection, ExceptionOr<RefPtr<Node>>&& passedClonedContainer, Node* commonRoot);
+
</ins><span class="cx"> inline Range::Range(Document& ownerDocument)
</span><span class="cx"> : m_ownerDocument(ownerDocument)
</span><span class="cx"> , m_start(&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->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->parentNode())
</span><span class="cx"> startRootContainer = startRootContainer->parentNode();
</span><span class="cx">
</span><del>- return startRootContainer != endRootContainer || (Range::compareBoundaryPoints(start, end, ASSERT_NO_EXCEPTION) > 0);
</del><ins>+ return startRootContainer != endRootContainer || Range::compareBoundaryPoints(start, end).releaseReturnValue() > 0;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void Range::setStart(Ref<Node>&& refNode, unsigned offset, ExceptionCode& ec)
</del><ins>+ExceptionOr<void> Range::setStart(Ref<Node>&& refNode, unsigned offset)
</ins><span class="cx"> {
</span><span class="cx"> bool didMoveDocument = false;
</span><span class="cx"> if (&refNode->document() != &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<Node>&& refNode, unsigned offset, ExceptionCode& ec)
</del><ins>+ExceptionOr<void> Range::setEnd(Ref<Node>&& refNode, unsigned offset)
</ins><span class="cx"> {
</span><span class="cx"> bool didMoveDocument = false;
</span><span class="cx"> if (&refNode->document() != &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& start, ExceptionCode& ec)
</del><ins>+ExceptionOr<void> Range::setStart(const Position& 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& end, ExceptionCode& ec)
</del><ins>+ExceptionOr<void> Range::setEnd(const Position& 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& refNode, unsigned offset, ExceptionCode& ec)
</del><ins>+ExceptionOr<bool> Range::isPointInRange(Node& refNode, unsigned offset)
</ins><span class="cx"> {
</span><del>- if (&refNode.document() != &ownerDocument()) {
</del><ins>+ if (&refNode.document() != &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(&refNode, &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(&refNode, offset, &startContainer(), m_start.offset(), ec) >= 0 && !ec
- && compareBoundaryPoints(&refNode, offset, &endContainer(), m_end.offset(), ec) <= 0 && !ec;
- ASSERT(!ec || ec == WRONG_DOCUMENT_ERR);
- ec = 0;
- return result;
</del><ins>+ auto startCompareResult = compareBoundaryPoints(&refNode, offset, &startContainer(), m_start.offset());
+ if (!(!startCompareResult.hasException() && startCompareResult.releaseReturnValue() >= 0))
+ return false;
+ auto endCompareResult = compareBoundaryPoints(&refNode, offset, &endContainer(), m_end.offset());
+ return !endCompareResult.hasException() && endCompareResult.releaseReturnValue() <= 0;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-short Range::comparePoint(Node& refNode, unsigned offset, ExceptionCode& ec) const
</del><ins>+ExceptionOr<short> Range::comparePoint(Node& 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 (&refNode.document() != &ownerDocument()) {
- ec = WRONG_DOCUMENT_ERR;
- return 0;
- }
</del><ins>+ if (&refNode.document() != &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() && !commonAncestorContainer(&refNode, &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(&refNode, offset, &startContainer(), m_start.offset(), ec) < 0)
</del><ins>+ auto startCompareResult = compareBoundaryPoints(&refNode, offset, &startContainer(), m_start.offset());
+ if (startCompareResult.hasException())
+ return startCompareResult.releaseException();
+ if (startCompareResult.releaseReturnValue() < 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(&refNode, offset, &endContainer(), m_end.offset(), ec) > 0 && !ec)
</del><ins>+ auto endCompareResult = compareBoundaryPoints(&refNode, offset, &endContainer(), m_end.offset());
+ if (endCompareResult.hasException())
+ return endCompareResult.releaseException();
+ if (endCompareResult.releaseReturnValue() > 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& refNode, ExceptionCode& ec) const
</del><ins>+ExceptionOr<Range::CompareResults> Range::compareNode(Node& 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) < 0) {
- if (comparePoint(*parentNode, nodeIndex + 1, ec) > 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) > 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() < 0;
+ bool nodeEndsAfterRange = nodeEndCompareResult.releaseReturnValue() > 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& sourceRange, ExceptionCode& ec) const
</del><ins>+static inline Node* top(Node& node)
</ins><span class="cx"> {
</span><del>- Node* thisCont = commonAncestorContainer();
- Node* sourceCont = sourceRange.commonAncestorContainer();
</del><ins>+ auto* top = &node;
+ while (auto* parent = top->parentNode())
+ top = parent;
+ return top;
+}
</ins><span class="cx">
</span><del>- if (&thisCont->document() != &sourceCont->document()) {
- ec = WRONG_DOCUMENT_ERR;
- return 0;
- }
</del><ins>+ExceptionOr<short> Range::compareBoundaryPoints(CompareHow how, const Range& sourceRange) const
+{
+ auto* thisContainer = commonAncestorContainer();
+ auto* sourceContainer = sourceRange.commonAncestorContainer();
+ if (!thisContainer || !sourceContainer || &thisContainer->document() != &sourceContainer->document() || top(*thisContainer) != top(*sourceContainer))
+ return Exception { WRONG_DOCUMENT_ERR };
</ins><span class="cx">
</span><del>- Node* thisTop = thisCont;
- Node* sourceTop = sourceCont;
- while (thisTop->parentNode())
- thisTop = thisTop->parentNode();
- while (sourceTop->parentNode())
- sourceTop = sourceTop->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& sourceRange, ExceptionCode& ec) const
</del><ins>+ExceptionOr<short> Range::compareBoundaryPointsForBindings(unsigned short how, const Range& sourceRange) const
</ins><span class="cx"> {
</span><del>- if (compareHow > 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<CompareHow>(how), sourceRange);
</ins><span class="cx"> }
</span><del>- return compareBoundaryPoints(static_cast<CompareHow>(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& ec)
</del><ins>+ExceptionOr<short> 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 < 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->nextSibling();
</span><span class="cx"> }
</span><del>-
</del><span class="cx"> if (offsetA <= 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->nextSibling();
</span><span class="cx"> }
</span><del>-
</del><span class="cx"> if (offsetC < 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 & 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 && childA->parentNode() != commonAncestor)
</span><span class="cx"> childA = childA->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& boundaryA, const RangeBoundaryPoint& boundaryB, ExceptionCode& ec)
</del><ins>+ExceptionOr<short> Range::compareBoundaryPoints(const RangeBoundaryPoint& boundaryA, const RangeBoundaryPoint& 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) <= 0 && !ec;
</del><ins>+ auto result = compareBoundaryPoints(m_start, m_end);
+ return !result.hasException() && result.releaseReturnValue() <= 0;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void Range::deleteContents(ExceptionCode& ec)
</del><ins>+ExceptionOr<void> 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& refNode, ExceptionCode& ec) const
</del><ins>+ExceptionOr<bool> Range::intersectsNode(Node& refNode) const
</ins><span class="cx"> {
</span><span class="cx"> if (!refNode.inDocument() || &refNode.document() != &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 < 0 : compareFirst <= 0;
</span><span class="cx"> bool isSecondAfterStart = m_start == m_end ? compareSecond > 0 : compareSecond >= 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<DocumentFragment> Range::processContents(ActionType action, ExceptionCode& ec)
</del><ins>+ExceptionOr<RefPtr<DocumentFragment>> Range::processContents(ActionType action)
</ins><span class="cx"> {
</span><del>- typedef Vector<Ref<Node>> NodeVector;
-
</del><span class="cx"> RefPtr<DocumentFragment> 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<Node> commonRoot = commonAncestorContainer();
</span><span class="cx"> ASSERT(commonRoot);
</span><span class="cx">
</span><span class="cx"> if (&startContainer() == &endContainer()) {
</span><del>- processContentsBetweenOffsets(action, fragment, &startContainer(), m_start.offset(), m_end.offset(), ec);
- return fragment;
</del><ins>+ auto result = processContentsBetweenOffsets(action, fragment, &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<Node> leftContents;
</span><span class="cx"> if (originalStart.container() != commonRoot && commonRoot->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<Node> rightContents;
</span><span class="cx"> if (&endContainer() != commonRoot && commonRoot->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<Node> 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 && commonRoot->contains(partialStart.get()))
- setStart(*partialStart->parentNode(), partialStart->computeNodeIndex() + 1, ec);
- else if (partialEnd && commonRoot->contains(partialEnd.get()))
- setStart(*partialEnd->parentNode(), partialEnd->computeNodeIndex(), ec);
- if (ec)
- return nullptr;
</del><ins>+ if (partialStart && commonRoot->contains(partialStart.get())) {
+ auto result = setStart(*partialStart->parentNode(), partialStart->computeNodeIndex() + 1);
+ if (result.hasException())
+ return result.releaseException();
+ } else if (partialEnd && commonRoot->contains(partialEnd.get())) {
+ auto result = setStart(*partialEnd->parentNode(), partialEnd->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) && leftContents)
</del><ins>+ if ((action == Extract || action == Clone) && leftContents) {
+ ExceptionCode ec = 0;
</ins><span class="cx"> fragment->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<Ref<Node>> nodes;
</ins><span class="cx"> for (Node* node = processStart.get(); node && node != processEnd; node = node->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) && rightContents)
</del><ins>+ if ((action == Extract || action == Clone) && rightContents) {
+ ExceptionCode ec = 0;
</ins><span class="cx"> fragment->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& data, unsigned startOffset, unsigned endOffset, ExceptionCode& ec)
</del><ins>+static inline ExceptionOr<void> deleteCharacterData(CharacterData& 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<Node> Range::processContentsBetweenOffsets(ActionType action, PassRefPtr<DocumentFragment> fragment, Node* container, unsigned startOffset, unsigned endOffset, ExceptionCode& ec)
</del><ins>+static ExceptionOr<RefPtr<Node>> processContentsBetweenOffsets(Range::ActionType action, RefPtr<DocumentFragment> fragment, RefPtr<Node> container, unsigned startOffset, unsigned endOffset)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(container);
</span><span class="cx"> ASSERT(startOffset <= endOffset);
</span><span class="cx">
</span><ins>+ RefPtr<Node> result;
+
</ins><span class="cx"> // This switch statement must be consistent with that of lengthOfContentsInNode.
</span><del>- RefPtr<Node> result;
</del><span class="cx"> switch (container->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<CharacterData*>(container)->length());
</del><ins>+ endOffset = std::min(endOffset, downcast<CharacterData>(*container).length());
</ins><span class="cx"> startOffset = std::min(startOffset, endOffset);
</span><del>- if (action == Extract || action == Clone) {
- Ref<CharacterData> characters = static_cast<CharacterData&>(container->cloneNode(true).get());
- deleteCharacterData(characters, startOffset, endOffset, ec);
</del><ins>+ if (action == Range::Extract || action == Range::Clone) {
+ Ref<CharacterData> characters = downcast<CharacterData>(container->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->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<CharacterData>(*container).deleteData(startOffset, endOffset - startOffset);
- if (result.hasException())
- ec = result.releaseException().code();
</del><ins>+ if (action == Range::Extract || action == Range::Delete) {
+ auto deleteResult = downcast<CharacterData>(*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<ProcessingInstruction*>(container)->data().length());
</del><ins>+ case Node::PROCESSING_INSTRUCTION_NODE: {
+ auto& instruction = downcast<ProcessingInstruction>(*container);
+ endOffset = std::min(endOffset, downcast<ProcessingInstruction>(*container).data().length());
</ins><span class="cx"> startOffset = std::min(startOffset, endOffset);
</span><del>- if (action == Extract || action == Clone) {
- Ref<ProcessingInstruction> processingInstruction = static_cast<ProcessingInstruction&>(container->cloneNode(true).get());
</del><ins>+ if (action == Range::Extract || action == Range::Clone) {
+ Ref<ProcessingInstruction> processingInstruction = downcast<ProcessingInstruction>(container->cloneNode(true).get());
</ins><span class="cx"> processingInstruction->setData(processingInstruction->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->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& pi = downcast<ProcessingInstruction>(*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->cloneNode(false);
</span><span class="cx"> }
</span><del>-
</del><ins>+ Vector<Ref<Node>> nodes;
</ins><span class="cx"> Node* n = container->firstChild();
</span><del>- Vector<Ref<Node>> nodes;
</del><span class="cx"> for (unsigned i = startOffset; n && i; i--)
</span><span class="cx"> n = n->nextSibling();
</span><span class="cx"> for (unsigned i = startOffset; n && i < endOffset; i++, n = n->nextSibling()) {
</span><del>- if (action != Delete && n->isDocumentTypeNode()) {
- ec = HIERARCHY_REQUEST_ERR;
- return nullptr;
</del><ins>+ if (action != Range::Delete && n->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<Ref<Node>>& nodes, Node* oldContainer, Node* newContainer, ExceptionCode& ec)
</del><ins>+static ExceptionOr<void> processNodes(Range::ActionType action, Vector<Ref<Node>>& nodes, Node* oldContainer, RefPtr<Node> newContainer)
</ins><span class="cx"> {
</span><span class="cx"> for (auto& 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->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->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->appendChild(node->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<Node> Range::processAncestorsAndTheirSiblings(ActionType action, Node* container, ContentsProcessDirection direction, RefPtr<Node>&& passedClonedContainer, Node* commonRoot, ExceptionCode& ec)
</del><ins>+ExceptionOr<RefPtr<Node>> processAncestorsAndTheirSiblings(Range::ActionType action, Node* container, ContentsProcessDirection direction, ExceptionOr<RefPtr<Node>>&& passedClonedContainer, Node* commonRoot)
</ins><span class="cx"> {
</span><del>- typedef Vector<Ref<Node>> NodeVector;
</del><ins>+ if (passedClonedContainer.hasException())
+ return WTFMove(passedClonedContainer);
</ins><span class="cx">
</span><del>- RefPtr<Node> clonedContainer = WTFMove(passedClonedContainer);
</del><ins>+ RefPtr<Node> clonedContainer = passedClonedContainer.releaseReturnValue();
+
</ins><span class="cx"> Vector<Ref<ContainerNode>> ancestors;
</span><span class="cx"> for (ContainerNode* ancestor = container->parentNode(); ancestor && ancestor != commonRoot; ancestor = ancestor->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<Node> firstChildInAncestorToProcess = direction == ProcessContentsForward ? container->nextSibling() : container->previousSibling();
</span><span class="cx"> for (auto& 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->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->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->parentNode() == ancestor.ptr());
</span><span class="cx">
</span><del>- NodeVector nodes;
</del><ins>+ Vector<Ref<Node>> nodes;
</ins><span class="cx"> for (Node* child = firstChildInAncestorToProcess.get(); child;
</span><span class="cx"> child = (direction == ProcessContentsForward) ? child->nextSibling() : child->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& 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->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->appendChild(child, ec);
</span><del>- else
</del><ins>+ if (ec)
+ return Exception { ec };
+ } else {
+ ExceptionCode ec = 0;
</ins><span class="cx"> clonedContainer->insertBefore(child, clonedContainer->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->appendChild(child->cloneNode(true), ec);
</span><del>- else
</del><ins>+ if (ec)
+ return Exception { ec };
+ } else {
+ ExceptionCode ec = 0;
</ins><span class="cx"> clonedContainer->insertBefore(child->cloneNode(true), clonedContainer->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->nextSibling() : ancestor->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<DocumentFragment> Range::extractContents(ExceptionCode& ec)
</del><ins>+ExceptionOr<Ref<DocumentFragment>> 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<DocumentFragment> Range::cloneContents(ExceptionCode& ec)
</del><ins>+ExceptionOr<Ref<DocumentFragment>> 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<Node>&& node, ExceptionCode& ec)
</del><ins>+ExceptionOr<void> Range::insertNode(Ref<Node>&& node)
</ins><span class="cx"> {
</span><del>- if (is<Comment>(startContainer()) || is<ProcessingInstruction>(startContainer())) {
- ec = HIERARCHY_REQUEST_ERR;
- return;
- }
- bool startIsText = startContainer().nodeType() == Node::TEXT_NODE;
- if (startIsText && !startContainer().parentNode()) {
- ec = HIERARCHY_REQUEST_ERR;
- return;
- }
- if (node.ptr() == &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 && !startContainer().parentNode())
+ return Exception { HIERARCHY_REQUEST_ERR };
+ if (node.ptr() == &startContainer())
+ return Exception { HIERARCHY_REQUEST_ERR };
+
</ins><span class="cx"> RefPtr<Node> referenceNode = startIsText ? &startContainer() : startContainer().traverseToChildAt(startOffset());
</span><span class="cx"> Node* parentNode = referenceNode ? referenceNode->parentNode() : &startContainer();
</span><del>- if (!is<ContainerNode>(parentNode)) {
- ec = HIERARCHY_REQUEST_ERR;
- return;
- }
</del><ins>+ if (!is<ContainerNode>(parentNode))
+ return Exception { HIERARCHY_REQUEST_ERR };
</ins><span class="cx">
</span><span class="cx"> Ref<ContainerNode> parent = downcast<ContainerNode>(*parentNode);
</span><span class="cx">
</span><del>- ec = 0;
</del><ins>+ ExceptionCode ec = 0;
</ins><span class="cx"> if (!parent->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<Text>(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->nextSibling();
</span><span class="cx">
</span><span class="cx"> auto removeResult = node->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->computeNodeIndex() : parent->countChildNodes();
</span><span class="cx"> if (is<DocumentFragment>(node.get()))
</span><span class="lines">@@ -879,10 +941,12 @@
</span><span class="cx">
</span><span class="cx"> parent->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->nodeType() == Node::TEXT_NODE || n->nodeType() == Node::CDATA_SECTION_NODE) {
- const String& data = static_cast<CharacterData*>(n)->data();
</del><ins>+ for (Node* node = firstNode(); node != pastLast; node = NodeTraversal::next(*node)) {
+ auto type = node->nodeType();
+ if (type == Node::TEXT_NODE || type == Node::CDATA_SECTION_NODE) {
+ auto& data = downcast<CharacterData>(*node).data();
</ins><span class="cx"> unsigned length = data.length();
</span><del>- unsigned start = n == &startContainer() ? std::min(std::max(0U, m_start.offset()), length) : 0U;
- unsigned end = n == &endContainer() ? std::min(std::max(start, m_end.offset()), length) : length;
</del><ins>+ unsigned start = node == &startContainer() ? std::min(std::max(0U, m_start.offset()), length) : 0U;
+ unsigned end = node == &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<DocumentFragment> Range::createContextualFragment(const String& markup, ExceptionCode& ec)
</del><ins>+ExceptionOr<Ref<DocumentFragment>> Range::createContextualFragment(const String& markup)
</ins><span class="cx"> {
</span><span class="cx"> Node& node = startContainer();
</span><span class="cx"> RefPtr<Element> element;
</span><span class="lines">@@ -928,36 +993,27 @@
</span><span class="cx"> element = &downcast<Element>(node);
</span><span class="cx"> else
</span><span class="cx"> element = node.parentElement();
</span><del>-
</del><span class="cx"> if (!element || (is<HTMLDocument>(element->document()) && is<HTMLHtmlElement>(*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& node, unsigned offset, ExceptionCode& ec) const
</del><ins>+ExceptionOr<Node*> Range::checkNodeWOffset(Node& 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 > downcast<CharacterData>(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<Range> Range::cloneRange() const
</span><span class="lines">@@ -980,60 +1036,46 @@
</span><span class="cx"> return Range::create(ownerDocument(), &startContainer(), m_start.offset(), &endContainer(), m_end.offset());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void Range::setStartAfter(Node& refNode, ExceptionCode& ec)
</del><ins>+ExceptionOr<void> Range::setStartAfter(Node& 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& refNode, ExceptionCode& ec)
</del><ins>+ExceptionOr<void> Range::setEndBefore(Node& 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& refNode, ExceptionCode& ec)
</del><ins>+ExceptionOr<void> Range::setEndAfter(Node& 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& refNode, ExceptionCode& ec)
</del><ins>+ExceptionOr<void> Range::selectNode(Node& 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 (&ownerDocument() != &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& refNode, ExceptionCode& ec)
</del><ins>+ExceptionOr<void> Range::selectNodeContents(Node& 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 (&ownerDocument() != &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& newParent, ExceptionCode& ec)
</del><ins>+ExceptionOr<void> Range::surroundContents(Node& newParent)
</ins><span class="cx"> {
</span><span class="cx"> Ref<Node> protectedNewParent(newParent);
</span><span class="cx">
</span><span class="lines">@@ -1054,10 +1098,8 @@
</span><span class="cx"> Node* endNonTextContainer = &endContainer();
</span><span class="cx"> if (endNonTextContainer->nodeType() == Node::TEXT_NODE)
</span><span class="cx"> endNonTextContainer = endNonTextContainer->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<DocumentFragment> 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<ContainerNode>(newParent).removeChild(*n, ec);
</del><ins>+ while (auto* child = newParent.firstChild()) {
+ ExceptionCode ec = 0;
+ downcast<ContainerNode>(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& refNode, ExceptionCode& ec)
</del><ins>+ExceptionOr<void> Range::setStartBefore(Node& 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()->ownerDocument() != other.commonAncestorContainer()->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 > 0)
</del><ins>+ auto startToStart = compareBoundaryPoints(Range::START_TO_START, other);
+ if (startToStart.hasException() || startToStart.releaseReturnValue() > 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 >= 0;
</del><ins>+ auto endToEnd = compareBoundaryPoints(Range::END_TO_END, other);
+ return !endToEnd.hasException() && endToEnd.releaseReturnValue() >= 0;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool Range::contains(const VisiblePosition& position) const
</span><span class="lines">@@ -1524,8 +1562,8 @@
</span><span class="cx"> if (a->commonAncestorContainer()->ownerDocument() != b->commonAncestorContainer()->ownerDocument())
</span><span class="cx"> return false;
</span><span class="cx">
</span><del>- short startToStart = a->compareBoundaryPoints(Range::START_TO_START, *b, ASSERT_NO_EXCEPTION);
- short endToEnd = a->compareBoundaryPoints(Range::END_TO_END, *b, ASSERT_NO_EXCEPTION);
</del><ins>+ short startToStart = a->compareBoundaryPoints(Range::START_TO_START, *b).releaseReturnValue();
+ short endToEnd = a->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 <= 0 && endToEnd >= 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->compareBoundaryPoints(Range::START_TO_END, *b, ASSERT_NO_EXCEPTION) >= 0 && endToEnd <= 0)
</del><ins>+ if (a->compareBoundaryPoints(Range::START_TO_END, *b).releaseReturnValue() >= 0 && endToEnd <= 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 >= 0 && a->compareBoundaryPoints(Range::END_TO_START, *b, ASSERT_NO_EXCEPTION) <= 0)
</del><ins>+ if (startToStart >= 0 && a->compareBoundaryPoints(Range::END_TO_START, *b).releaseReturnValue() <= 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<Range> rangeOfContents(Node& node)
</span><span class="cx"> {
</span><del>- Ref<Range> range = Range::create(node.document());
- int exception = 0;
- range->selectNodeContents(node, exception);
</del><ins>+ auto range = Range::create(node.document());
+ range->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& unit, ExceptionCode& ec)
</del><ins>+ExceptionOr<void> Range::expand(const String& 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 == "word") {
</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<ClientRectList> Range::getClientRects() const
</span><span class="cx"> {
</span><del>- ownerDocument().updateLayoutIgnorePendingStylesheets();
-
- Vector<FloatQuad> 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<ClientRect> 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<FloatQuad>& quads, CoordinateSpace space) const
</del><ins>+Vector<FloatQuad> Range::borderAndTextQuads(CoordinateSpace space) const
</ins><span class="cx"> {
</span><ins>+ Vector<FloatQuad> quads;
+
+ ownerDocument().updateLayoutIgnorePendingStylesheets();
+
</ins><span class="cx"> Node* stopNode = pastLastNode();
</span><span class="cx">
</span><span class="cx"> HashSet<Node*> selectedElementsSet;
</span><span class="cx"> for (Node* node = firstNode(); node != stopNode; node = NodeTraversal::next(*node)) {
</span><del>- if (node->isElementNode())
</del><ins>+ if (is<Element>(*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<Element>(*node) && selectedElementsSet.contains(node) && !selectedElementsSet.contains(node->parentNode())) {
</span><del>- if (RenderBoxModelObject* renderBoxModelObject = downcast<Element>(*node).renderBoxModelObject()) {
</del><ins>+ if (auto* renderer = downcast<Element>(*node).renderBoxModelObject()) {
</ins><span class="cx"> Vector<FloatQuad> elementQuads;
</span><del>- renderBoxModelObject->absoluteQuads(elementQuads);
-
</del><ins>+ renderer->absoluteQuads(elementQuads);
</ins><span class="cx"> if (space == CoordinateSpace::Client)
</span><del>- ownerDocument().adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(elementQuads, renderBoxModelObject->style());
-
</del><ins>+ node->document().adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(elementQuads, renderer->style());
</ins><span class="cx"> quads.appendVector(elementQuads);
</span><span class="cx"> }
</span><span class="cx"> } else if (is<Text>(*node)) {
</span><del>- if (RenderText* renderText = downcast<Text>(*node).renderer()) {
</del><ins>+ if (auto* renderer = downcast<Text>(*node).renderer()) {
</ins><span class="cx"> unsigned startOffset = node == &startContainer() ? m_start.offset() : 0;
</span><span class="cx"> unsigned endOffset = node == &endContainer() ? m_end.offset() : std::numeric_limits<unsigned>::max();
</span><del>-
- auto textQuads = renderText->absoluteQuadsForRange(startOffset, endOffset);
-
</del><ins>+ auto textQuads = renderer->absoluteQuadsForRange(startOffset, endOffset);
</ins><span class="cx"> if (space == CoordinateSpace::Client)
</span><del>- ownerDocument().adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(textQuads, renderText->style());
-
</del><ins>+ node->document().adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(textQuads, renderer->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<FloatQuad> quads;
- getBorderAndTextQuads(quads, space);
-
</del><span class="cx"> FloatRect result;
</span><del>- for (auto& quad : quads)
</del><ins>+ for (auto& 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 "ExceptionCodePlaceholder.h"
</del><span class="cx"> #include "FloatRect.h"
</span><span class="cx"> #include "FragmentScriptingPermission.h"
</span><span class="cx"> #include "IntRect.h"
</span><span class="lines">@@ -65,46 +64,46 @@
</span><span class="cx">
</span><span class="cx"> Node* commonAncestorContainer() const { return commonAncestorContainer(&startContainer(), &endContainer()); }
</span><span class="cx"> WEBCORE_EXPORT static Node* commonAncestorContainer(Node* containerA, Node* containerB);
</span><del>- WEBCORE_EXPORT void setStart(Ref<Node>&& container, unsigned offset, ExceptionCode& = ASSERT_NO_EXCEPTION);
- WEBCORE_EXPORT void setEnd(Ref<Node>&& container, unsigned offset, ExceptionCode& = ASSERT_NO_EXCEPTION);
</del><ins>+ WEBCORE_EXPORT ExceptionOr<void> setStart(Ref<Node>&& container, unsigned offset);
+ WEBCORE_EXPORT ExceptionOr<void> setEnd(Ref<Node>&& container, unsigned offset);
</ins><span class="cx"> WEBCORE_EXPORT void collapse(bool toStart);
</span><del>- WEBCORE_EXPORT bool isPointInRange(Node& refNode, unsigned offset, ExceptionCode&);
- WEBCORE_EXPORT short comparePoint(Node& refNode, unsigned offset, ExceptionCode&) const;
</del><ins>+ WEBCORE_EXPORT ExceptionOr<bool> isPointInRange(Node& refNode, unsigned offset);
+ WEBCORE_EXPORT ExceptionOr<short> comparePoint(Node& 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& refNode, ExceptionCode&) const;
</del><ins>+ WEBCORE_EXPORT ExceptionOr<CompareResults> compareNode(Node& 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& sourceRange, ExceptionCode&) const;
- WEBCORE_EXPORT short compareBoundaryPointsForBindings(unsigned short compareHow, const Range& sourceRange, ExceptionCode&) const;
- static short compareBoundaryPoints(Node* containerA, unsigned offsetA, Node* containerB, unsigned offsetB, ExceptionCode&);
- static short compareBoundaryPoints(const RangeBoundaryPoint& boundaryA, const RangeBoundaryPoint& boundaryB, ExceptionCode&);
</del><ins>+ WEBCORE_EXPORT ExceptionOr<short> compareBoundaryPoints(CompareHow, const Range& sourceRange) const;
+ WEBCORE_EXPORT ExceptionOr<short> compareBoundaryPointsForBindings(unsigned short compareHow, const Range& sourceRange) const;
+ static ExceptionOr<short> compareBoundaryPoints(Node* containerA, unsigned offsetA, Node* containerB, unsigned offsetB);
+ static ExceptionOr<short> compareBoundaryPoints(const RangeBoundaryPoint& boundaryA, const RangeBoundaryPoint& boundaryB);
</ins><span class="cx"> WEBCORE_EXPORT bool boundaryPointsValid() const;
</span><del>- WEBCORE_EXPORT bool intersectsNode(Node& refNode, ExceptionCode&) const;
- WEBCORE_EXPORT void deleteContents(ExceptionCode&);
- WEBCORE_EXPORT RefPtr<DocumentFragment> extractContents(ExceptionCode&);
- WEBCORE_EXPORT RefPtr<DocumentFragment> cloneContents(ExceptionCode&);
- WEBCORE_EXPORT void insertNode(Ref<Node>&&, ExceptionCode&);
</del><ins>+ WEBCORE_EXPORT ExceptionOr<bool> intersectsNode(Node& refNode) const;
+ WEBCORE_EXPORT ExceptionOr<void> deleteContents();
+ WEBCORE_EXPORT ExceptionOr<Ref<DocumentFragment>> extractContents();
+ WEBCORE_EXPORT ExceptionOr<Ref<DocumentFragment>> cloneContents();
+ WEBCORE_EXPORT ExceptionOr<void> insertNode(Ref<Node>&&);
</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<DocumentFragment> createContextualFragment(const String& html, ExceptionCode&);
</del><ins>+ WEBCORE_EXPORT ExceptionOr<Ref<DocumentFragment>> createContextualFragment(const String& html);
</ins><span class="cx">
</span><span class="cx"> WEBCORE_EXPORT void detach();
</span><span class="cx"> WEBCORE_EXPORT Ref<Range> cloneRange() const;
</span><span class="cx">
</span><del>- WEBCORE_EXPORT void setStartAfter(Node&, ExceptionCode& = ASSERT_NO_EXCEPTION);
- WEBCORE_EXPORT void setEndBefore(Node&, ExceptionCode& = ASSERT_NO_EXCEPTION);
- WEBCORE_EXPORT void setEndAfter(Node&, ExceptionCode& = ASSERT_NO_EXCEPTION);
- WEBCORE_EXPORT void selectNode(Node&, ExceptionCode& = ASSERT_NO_EXCEPTION);
- WEBCORE_EXPORT void selectNodeContents(Node&, ExceptionCode&);
- WEBCORE_EXPORT void surroundContents(Node&, ExceptionCode&);
- WEBCORE_EXPORT void setStartBefore(Node&, ExceptionCode&);
</del><ins>+ WEBCORE_EXPORT ExceptionOr<void> setStartAfter(Node&);
+ WEBCORE_EXPORT ExceptionOr<void> setEndBefore(Node&);
+ WEBCORE_EXPORT ExceptionOr<void> setEndAfter(Node&);
+ WEBCORE_EXPORT ExceptionOr<void> selectNode(Node&);
+ WEBCORE_EXPORT ExceptionOr<void> selectNodeContents(Node&);
+ WEBCORE_EXPORT ExceptionOr<void> surroundContents(Node&);
+ WEBCORE_EXPORT ExceptionOr<void> setStartBefore(Node&);
</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&, ExceptionCode& = ASSERT_NO_EXCEPTION);
- WEBCORE_EXPORT void setEnd(const Position&, ExceptionCode& = ASSERT_NO_EXCEPTION);
</del><ins>+ WEBCORE_EXPORT ExceptionOr<void> setStart(const Position&);
+ WEBCORE_EXPORT ExceptionOr<void> setEnd(const Position&);
</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&, ExceptionCode&);
</del><ins>+ WEBCORE_EXPORT ExceptionOr<void> expand(const String&);
</ins><span class="cx">
</span><span class="cx"> Ref<ClientRectList> getClientRects() const;
</span><span class="cx"> Ref<ClientRect> getBoundingClientRect() const;
</span><span class="lines">@@ -152,24 +151,19 @@
</span><span class="cx"> WEBCORE_EXPORT bool contains(const Range&) const;
</span><span class="cx"> bool contains(const VisiblePosition&) const;
</span><span class="cx">
</span><ins>+ enum ActionType { Delete, Extract, Clone };
+
</ins><span class="cx"> private:
</span><span class="cx"> explicit Range(Document&);
</span><span class="cx"> Range(Document&, PassRefPtr<Node> startContainer, int startOffset, PassRefPtr<Node> endContainer, int endOffset);
</span><span class="cx">
</span><span class="cx"> void setDocument(Document&);
</span><ins>+ ExceptionOr<Node*> checkNodeWOffset(Node&, unsigned offset) const;
+ ExceptionOr<RefPtr<DocumentFragment>> processContents(ActionType);
</ins><span class="cx">
</span><del>- Node* checkNodeWOffset(Node&, unsigned offset, ExceptionCode&) const;
-
- enum ActionType { Delete, Extract, Clone };
- RefPtr<DocumentFragment> processContents(ActionType, ExceptionCode&);
- static RefPtr<Node> processContentsBetweenOffsets(ActionType, PassRefPtr<DocumentFragment>, Node*, unsigned startOffset, unsigned endOffset, ExceptionCode&);
- static void processNodes(ActionType, Vector<Ref<Node>>&, Node* oldContainer, Node* newContainer, ExceptionCode&);
- enum ContentsProcessDirection { ProcessContentsForward, ProcessContentsBackward };
- static RefPtr<Node> processAncestorsAndTheirSiblings(ActionType, Node* container, ContentsProcessDirection, RefPtr<Node>&& clonedContainer, Node* commonRoot, ExceptionCode&);
-
</del><span class="cx"> enum class CoordinateSpace { Absolute, Client };
</span><del>- void getBorderAndTextQuads(Vector<FloatQuad>&, CoordinateSpace) const;
- FloatRect boundingRectInternal(CoordinateSpace) const;
</del><ins>+ Vector<FloatQuad> borderAndTextQuads(CoordinateSpace) const;
+ FloatRect boundingRect(CoordinateSpace) const;
</ins><span class="cx">
</span><span class="cx"> Ref<Document> 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<Node*>(a), 0, const_cast<Node*>(b), 0, ASSERT_NO_EXCEPTION) < 0;
</del><ins>+ return Range::compareBoundaryPoints(const_cast<Node*>(a), 0, const_cast<Node*>(b), 0).releaseReturnValue() < 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 "undefined" as default parameter value is wrong.
- [MayThrowLegacyException] void expand(optional DOMString unit = "undefined");
- [MayThrowLegacyException] void selectNode(Node refNode);
- [MayThrowLegacyException] void selectNodeContents(Node refNode);
</del><ins>+ [MayThrowException] void expand(optional DOMString unit = "");
+ [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<Range> correctionStartOffsetInParagraphAsRange = Range::create(paragraphRangeContainingCorrection->startContainer().document(), paragraphRangeContainingCorrection->startPosition(), paragraphRangeContainingCorrection->startPosition());
</span><span class="cx">
</span><span class="cx"> Position startPositionOfRangeWithAlternative = range->startPosition();
</span><del>- ExceptionCode ec = 0;
</del><span class="cx"> if (!startPositionOfRangeWithAlternative.containerNode())
</span><span class="cx"> return;
</span><del>- correctionStartOffsetInParagraphAsRange->setEnd(*startPositionOfRangeWithAlternative.containerNode(), startPositionOfRangeWithAlternative.computeOffsetInContainerNode(), ec);
- if (ec)
</del><ins>+ auto setEndResult = correctionStartOffsetInParagraphAsRange->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->setStart(*rangeCompliantPosition.deprecatedNode(), rangeCompliantPosition.deprecatedEditingOffset(), IGNORE_EXCEPTION);
</del><ins>+ spellingSearchRange->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 <table>)
</span><span class="cx"> if (topNode)
</span><del>- spellingSearchRange->setEnd(*topNode, lastOffsetForEditing(*topNode), IGNORE_EXCEPTION);
</del><ins>+ spellingSearchRange->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->setEnd(chars.range()->startContainer(), chars.range()->startOffset(), IGNORE_EXCEPTION);
</del><ins>+ grammarSearchRange->setEnd(chars.range()->startContainer(), chars.range()->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 && !misspelledWord && !badGrammarPhrase) {
</span><span class="cx"> if (topNode)
</span><del>- spellingSearchRange->setStart(*topNode, 0, IGNORE_EXCEPTION);
</del><ins>+ spellingSearchRange->setStart(*topNode, 0);
</ins><span class="cx"> // going until the end of the very first chunk we tested is far enough
</span><del>- spellingSearchRange->setEnd(searchEndNodeAfterWrap, searchEndOffsetAfterWrap, IGNORE_EXCEPTION);
</del><ins>+ spellingSearchRange->setEnd(searchEndNodeAfterWrap, searchEndOffsetAfterWrap);
</ins><span class="cx">
</span><span class="cx"> if (unifiedTextCheckerEnabled()) {
</span><span class="cx"> grammarSearchRange = spellingSearchRange->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->setEnd(chars.range()->startContainer(), chars.range()->startOffset(), IGNORE_EXCEPTION);
</del><ins>+ grammarSearchRange->setEnd(chars.range()->startContainer(), chars.range()->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 > 0 && (selectionOffset > 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->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& frame, Range& range)
</ins><span class="cx"> {
</span><del>- bool inRange = false;
- for (HTMLFrameOwnerElement* ownerElement = frame->ownerElement(); ownerElement; ownerElement = ownerElement->document().ownerElement()) {
- if (&ownerElement->document() == &range->ownerDocument()) {
- inRange = range->intersectsNode(*ownerElement, IGNORE_EXCEPTION);
- break;
</del><ins>+ for (auto* ownerElement = frame.ownerElement(); ownerElement; ownerElement = ownerElement->document().ownerElement()) {
+ if (&ownerElement->document() == &range.ownerDocument()) {
+ auto result = range.intersectsNode(*ownerElement);
+ return !result.hasException() && 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& target, Range* range, FindOptions options, unsigned limit, bool markMatches, Vector<RefPtr<Range>>* matches)
</span><span class="lines">@@ -3188,7 +3187,7 @@
</span><span class="cx"> if (range) {
</span><span class="cx"> if (&range->ownerDocument() == &document())
</span><span class="cx"> searchRange = range;
</span><del>- else if (!isFrameInRange(&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->startContainer().isInShadowTree())
</span><span class="cx"> break;
</span><span class="cx">
</span><del>- searchRange->setStartAfter(*resultRange->startContainer().shadowHost(), IGNORE_EXCEPTION);
- searchRange->setEnd(originalEndContainer, originalEndOffset, IGNORE_EXCEPTION);
</del><ins>+ searchRange->setStartAfter(*resultRange->startContainer().shadowHost());
+ searchRange->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->setStart(resultRange->endContainer(), resultRange->endOffset(), IGNORE_EXCEPTION);
</del><ins>+ searchRange->setStart(resultRange->endContainer(), resultRange->endOffset());
</ins><span class="cx">
</span><span class="cx"> Node* shadowTreeRoot = searchRange->shadowRoot();
</span><span class="cx"> if (searchRange->collapsed() && shadowTreeRoot)
</span><del>- searchRange->setEnd(*shadowTreeRoot, shadowTreeRoot->countChildNodes(), IGNORE_EXCEPTION);
</del><ins>+ searchRange->setEnd(*shadowTreeRoot, shadowTreeRoot->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<Range> unionDOMRanges(Range& a, Range& b)
</span><span class="cx"> {
</span><del>- Range& start = a.compareBoundaryPoints(Range::START_TO_START, b, ASSERT_NO_EXCEPTION) <= 0 ? a : b;
- Range& end = a.compareBoundaryPoints(Range::END_TO_END, b, ASSERT_NO_EXCEPTION) <= 0 ? b : a;
</del><ins>+ Range& start = a.compareBoundaryPoints(Range::START_TO_START, b).releaseReturnValue() <= 0 ? a : b;
+ Range& end = a.compareBoundaryPoints(Range::END_TO_END, b).releaseReturnValue() <= 0 ? b : a;
</ins><span class="cx"> return Range::create(a.ownerDocument(), &start.startContainer(), start.startOffset(), &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<Range> range = m_selection.firstRange()) {
</span><del>- ExceptionCode ec = 0;
- Range::CompareResults compareResult = range->compareNode(node, ec);
- if (!ec && (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->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& node)
</span><span class="cx"> {
</span><span class="cx"> RefPtr<Range> resultRange = m_frame->document()->createRange();
</span><del>- ExceptionCode ec = 0;
- resultRange->setStart(node, location, ec);
- ASSERT(!ec);
- resultRange->setEnd(node, location + length, ec);
- ASSERT(!ec);
</del><ins>+ resultRange->setStart(node, location);
+ resultRange->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 && newList)
</span><del>- currentSelection->setStart(*newList, 0, IGNORE_EXCEPTION);
</del><ins>+ currentSelection->setStart(*newList, 0);
</ins><span class="cx"> if (rangeEndIsInList && newList)
</span><del>- currentSelection->setEnd(*newList, lastOffsetInNode(newList.get()), IGNORE_EXCEPTION);
</del><ins>+ currentSelection->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 "Document.h"
</span><span class="cx"> #include "DocumentMarkerController.h"
</span><ins>+#include "ExceptionCode.h"
</ins><span class="cx"> #include "Frame.h"
</span><span class="cx"> #include "FrameSelection.h"
</span><span class="cx"> #include "Settings.h"
</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& position, ExceptionCode& ec) const
</del><ins>+ExceptionOr<int> TextCheckingParagraph::offsetTo(const Position& 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<Range> range = offsetAsRange()->cloneRange();
- range->setEnd(*position.containerNode(), position.computeOffsetInContainerNode(), ec);
- if (ec)
- return 0;
</del><ins>+ auto range = offsetAsRange()->cloneRange();
+ auto result = range->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()->startContainer().document(), paragraphRange()->startPosition(), checkingRange()->startPosition());
</del><ins>+ m_offsetAsRange = Range::create(paragraphRange()->startContainer().document(), paragraphRange()->startPosition(), m_checkingRange->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 "EditorClient.h"
</span><del>-#include "ExceptionCode.h"
</del><ins>+#include "ExceptionOr.h"
</ins><span class="cx"> #include "TextChecking.h"
</span><del>-#include <wtf/text/WTFString.h>
</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<Range> subrange(int characterOffset, int characterCount) const;
</span><del>- int offsetTo(const Position&, ExceptionCode&) const;
</del><ins>+ ExceptionOr<int> offsetTo(const Position&) 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<Range> checkingRange() const { return m_checkingRange; }
</del><span class="cx"> PassRefPtr<Range> offsetAsRange() const;
</span><span class="cx">
</span><span class="cx"> RefPtr<Range> 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(&testRange->startContainer() == scope);
</span><span class="cx"> location = TextIterator::rangeLength(testRange.ptr());
</span><span class="cx">
</span><del>- testRange->setEnd(range->endContainer(), range->endOffset(), IGNORE_EXCEPTION);
</del><ins>+ testRange->setEnd(range->endContainer(), range->endOffset());
</ins><span class="cx"> ASSERT(&testRange->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->setStart(*p.containerNode(), p.offsetInContainerNode(), ec);
- return !ec;
</del><ins>+ return !range->setStart(*p.containerNode(), p.offsetInContainerNode()).hasException();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool setEnd(Range* range, const VisiblePosition& 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->setEnd(*p.containerNode(), p.offsetInContainerNode(), ec);
- return !ec;
</del><ins>+ return !range->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<Range> makeSearchRange(const Position& pos)
</del><ins>+static RefPtr<Range> makeSearchRange(const Position& 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->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<Range> searchRange(Range::create(n->document()));
- ExceptionCode ec = 0;
</del><ins>+ auto searchRange = Range::create(node->document());
</ins><span class="cx">
</span><del>- Position start(pos.parentAnchoredEquivalent());
- searchRange->selectNodeContents(*boundary, ec);
- searchRange->setStart(*start.containerNode(), start.offsetInContainerNode(), ec);
-
- ASSERT(!ec);
- if (ec)
</del><ins>+ auto result = searchRange->selectNodeContents(*boundary);
+ if (result.hasException())
</ins><span class="cx"> return nullptr;
</span><ins>+ Position start { position.parentAnchoredEquivalent() };
+ result = searchRange->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<Range> forwardsScanRange, Vector<UChar, 1024>& string)
</del><ins>+unsigned suffixLengthForRange(const Range& forwardsScanRange, Vector<UChar, 1024>& string)
</ins><span class="cx"> {
</span><span class="cx"> unsigned suffixLength = 0;
</span><del>- TextIterator forwardsIterator(forwardsScanRange.get());
</del><ins>+ TextIterator forwardsIterator(&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<Range> backwardsScanRange, Vector<UChar, 1024>& string)
</del><ins>+unsigned prefixLengthForRange(const Range& backwardsScanRange, Vector<UChar, 1024>& 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<UChar, 1024> 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<Range> forwardsScanRange(boundaryDocument.createRange());
- forwardsScanRange->setEndAfter(*boundary, ec);
- forwardsScanRange->setStart(*end.deprecatedNode(), end.deprecatedEditingOffset(), ec);
</del><ins>+ auto forwardsScanRange = boundaryDocument.createRange();
+ auto result = forwardsScanRange->setEndAfter(*boundary);
+ if (result.hasException())
+ return { };
+ result = forwardsScanRange->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->setStart(*start.deprecatedNode(), start.deprecatedEditingOffset(), ec);
- searchRange->setEnd(*end.deprecatedNode(), end.deprecatedEditingOffset(), ec);
</del><ins>+ auto result = searchRange->setStart(*start.deprecatedNode(), start.deprecatedEditingOffset());
+ if (result.hasException())
+ return { };
+ result = searchRange->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<Range> backwardsScanRange(boundaryDocument.createRange());
</del><ins>+ auto backwardsScanRange = boundaryDocument.createRange();
</ins><span class="cx"> if (start.deprecatedNode())
</span><del>- backwardsScanRange->setEnd(*start.deprecatedNode(), start.deprecatedEditingOffset(), IGNORE_EXCEPTION);
</del><ins>+ backwardsScanRange->setEnd(*start.deprecatedNode(), start.deprecatedEditingOffset());
</ins><span class="cx"> prefixLength = prefixLengthForRange(backwardsScanRange, string);
</span><span class="cx"> }
</span><span class="cx">
</span><del>- searchRange->selectNodeContents(*boundary, IGNORE_EXCEPTION);
</del><ins>+ searchRange->selectNodeContents(*boundary);
</ins><span class="cx"> if (start.deprecatedNode())
</span><del>- searchRange->setStart(*start.deprecatedNode(), start.deprecatedEditingOffset(), IGNORE_EXCEPTION);
</del><ins>+ searchRange->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&);
</span><span class="cx"> unsigned startSentenceBoundary(StringView, unsigned, BoundarySearchContextAvailability, bool&);
</span><span class="cx"> unsigned endSentenceBoundary(StringView, unsigned, BoundarySearchContextAvailability, bool&);
</span><del>-unsigned suffixLengthForRange(RefPtr<Range>, Vector<UChar, 1024>&);
-unsigned prefixLengthForRange(RefPtr<Range>, Vector<UChar, 1024>&);
</del><ins>+unsigned suffixLengthForRange(const Range&, Vector<UChar, 1024>&);
+unsigned prefixLengthForRange(const Range&, Vector<UChar, 1024>&);
</ins><span class="cx"> unsigned backwardSearchForBoundaryWithTextIterator(SimplifiedBackwardsTextIterator&, Vector<UChar, 1024>&, unsigned, BoundarySearchFunction);
</span><span class="cx"> unsigned forwardSearchForBoundaryWithTextIterator(TextIterator&, Vector<UChar, 1024>&, unsigned, BoundarySearchFunction);
</span><span class="cx"> Node* findStartOfParagraph(Node*, Node*, Node*, int&, Position::AnchorType&, 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(&node), DOWNSTREAM };
</span><span class="cx">
</span><span class="cx"> RefPtr<Range> range = Range::create(node.document());
</span><del>- range->selectNodeContents(node, IGNORE_EXCEPTION);
</del><ins>+ range->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->endPosition() : it.range()->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& node, const Range& 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() && 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<Range> context = document().createRange();
</span><del>- context->selectNodeContents(element, ec);
</del><ins>+ context->selectNodeContents(element);
</ins><span class="cx">
</span><span class="cx"> StringBuilder dictationPhrasesBuilder;
</span><span class="cx"> for (auto& 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->selectNodeContents(element, ec);
</del><ins>+ context->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 && comparePositions(firstPositionInOrBeforeNode(range->startPosition().anchorNode()), range->startPosition()) >= 0)
</span><del>- range->setStart(*enclosingAnchor, 0, IGNORE_EXCEPTION);
</del><ins>+ range->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 && Range::compareBoundaryPoints(startNode, 0, pastEnd, 0, ASSERT_NO_EXCEPTION) >= 0)
</del><ins>+ if (pastEnd && Range::compareBoundaryPoints(startNode, 0, pastEnd, 0).releaseReturnValue() >= 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<Range> selectedRange = frame->selection().toNormalizedRange();
</span><span class="cx"> if (!selectedRange || selectedRange->collapsed()) {
</span><del>- Document& document = m_context.hitTestResult().innerNonSharedNode()->document();
</del><ins>+ auto& document = m_context.hitTestResult().innerNonSharedNode()->document();
</ins><span class="cx"> selectedRange = document.createRange();
</span><del>- if (document.documentElement())
- selectedRange->selectNode(*document.documentElement(), IGNORE_EXCEPTION);
</del><ins>+ if (auto* element = document.documentElement())
+ selectedRange->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) > -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() && 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() && result.releaseReturnValue() > -1) {
+ result = range.compareBoundaryPoints(Range::END_TO_END, *normalizedRange);
+ if (!result.hasException() && result.releaseReturnValue() == -1) {
+ // The ranges intersect.
</ins><span class="cx"> selection.moveTo(range.startPosition(), normalizedRange->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(&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) < 1 && !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() && result.releaseReturnValue() < 1) {
+ result = range.compareBoundaryPoints(Range::END_TO_END, *normalizedRange);
+ if (!result.hasException() && 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->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<Frame> protector(*m_frame);
</span><del>- selectedRange->deleteContents(ASSERT_NO_EXCEPTION);
</del><ins>+ selectedRange->deleteContents();
</ins><span class="cx"> setBaseAndExtent(&selectedRange->startContainer(), selectedRange->startOffset(), &selectedRange->startContainer(), selectedRange->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, &selectedRange->startContainer(), selectedRange->startOffset(), ec) >= 0 && !ec
- && Range::compareBoundaryPoints(parentNode, nodeIndex + 1, &selectedRange->endContainer(), selectedRange->endOffset(), ec) <= 0 && !ec;
- ASSERT(!ec);
- if (nodeFullySelected)
</del><ins>+ auto startsResult = Range::compareBoundaryPoints(parentNode, nodeIndex, &selectedRange->startContainer(), selectedRange->startOffset());
+ ASSERT(!startsResult.hasException());
+ auto endsResult = Range::compareBoundaryPoints(parentNode, nodeIndex + 1, &selectedRange->endContainer(), selectedRange->endOffset());
+ ASSERT(!endsResult.hasException());
+ bool isNodeFullySelected = !startsResult.hasException() && startsResult.releaseReturnValue() >= 0
+ && !endsResult.hasException() && endsResult.releaseReturnValue() <= 0;
+ if (isNodeFullySelected)
</ins><span class="cx"> return true;
</span><span class="cx">
</span><del>- bool nodeFullyUnselected = (Range::compareBoundaryPoints(parentNode, nodeIndex, &selectedRange->endContainer(), selectedRange->endOffset(), ec) > 0 && !ec)
- || (Range::compareBoundaryPoints(parentNode, nodeIndex + 1, &selectedRange->startContainer(), selectedRange->startOffset(), ec) < 0 && !ec);
- ASSERT(!ec);
- if (nodeFullyUnselected)
</del><ins>+ auto startEndResult = Range::compareBoundaryPoints(parentNode, nodeIndex, &selectedRange->endContainer(), selectedRange->endOffset());
+ ASSERT(!startEndResult.hasException());
+ auto endStartResult = Range::compareBoundaryPoints(parentNode, nodeIndex + 1, &selectedRange->startContainer(), selectedRange->startOffset());
+ ASSERT(!endStartResult.hasException());
+ bool isNodeFullyUnselected = (!startEndResult.hasException() && startEndResult.releaseReturnValue() > 0)
+ || (!endStartResult.hasException() && endStartResult.releaseReturnValue() < 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& eventType, Node* targetNode, bool /*cancelable*/, int clickCount, const PlatformMouseEvent& platformMouseEvent, bool setUnder)
</span><span class="cx"> {
</span><span class="cx"> Ref<Frame> protectedFrame(m_frame);
</span><del>- if (FrameView* view = m_frame.view())
</del><ins>+
+ if (auto* view = m_frame.view())
</ins><span class="cx"> view->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 && !m_elementUnderMouse->dispatchMouseEvent(platformMouseEvent, eventType, clickCount))
+ return false;
</ins><span class="cx">
</span><del>- if (m_elementUnderMouse)
- swallowEvent = !(m_elementUnderMouse->dispatchMouseEvent(platformMouseEvent, eventType, clickCount));
</del><ins>+ if (eventType != eventNames().mousedownEvent)
+ return true;
</ins><span class="cx">
</span><del>- if (!swallowEvent && 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 && view->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->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()->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()->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->parentOrShadowHostElement()) {
+ if (element->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->isMouseFocusable()) {
- // To fix <rdar://problem/4895428> 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->compareNode(*element, IGNORE_EXCEPTION) == Range::NODE_INSIDE && element->isDescendantOf(m_frame.document()->focusedElement()))
- return true;
- }
- }
-
- break;
- }
- element = element->parentOrShadowHostElement();
</del><ins>+ // To fix <rdar://problem/4895428> 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 && m_frame.selection().isRange()) {
+ if (auto range = m_frame.selection().toNormalizedRange()) {
+ auto result = range->compareNode(*element);
+ if (!result.hasException() && result.releaseReturnValue() == Range::NODE_INSIDE && element->isDescendantOf(m_frame.document()->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->isMouseFocusable()) && 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 && 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 && element->isMouseFocusable()) {
- if (!page->focusController().setFocusedElement(element, &m_frame))
- swallowEvent = true;
- } else if (!element || !element->focused()) {
- if (!page->focusController().setFocusedElement(0, &m_frame))
- swallowEvent = true;
- }
- }
- }
</del><ins>+ // If focus shift is blocked, we eat the event.
+ auto* page = m_frame.page();
+ if (page && !page->focusController().setFocusedElement(element, &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& 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<Range> selectedRange = frameWithSelection->selection().selection().firstRange();
</span><span class="cx"> if (options & Backwards) {
</span><span class="cx"> for (size_t i = matchRanges.size(); i > 0; --i) {
</span><del>- if (selectedRange->compareBoundaryPoints(Range::END_TO_START, *matchRanges[i - 1], IGNORE_EXCEPTION) > 0) {
</del><ins>+ auto result = selectedRange->compareBoundaryPoints(Range::END_TO_START, *matchRanges[i - 1]);
+ if (!result.hasException() && result.releaseReturnValue() > 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 < size; ++i) {
</span><del>- if (selectedRange->compareBoundaryPoints(Range::START_TO_END, *matchRanges[i], IGNORE_EXCEPTION) < 0) {
</del><ins>+ auto result = selectedRange->compareBoundaryPoints(Range::START_TO_END, *matchRanges[i]);
+ if (!result.hasException() && result.releaseReturnValue() < 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->renderer();
</span><span class="cx"> if (!renderer)
</span><span class="cx"> continue;
</span><del>- if ((!renderer->isInline() || renderer->isReplaced()) && range.intersectsNode(*node, ASSERT_NO_EXCEPTION))
</del><ins>+ if ((!renderer->isInline() || renderer->isReplaced()) && 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->intersectsNode(*node, IGNORE_EXCEPTION))
- range->setEndBefore(*node, IGNORE_EXCEPTION);
</del><ins>+ auto intersectsResult = range->intersectsNode(*node);
+ if (!intersectsResult.hasException() && intersectsResult.releaseReturnValue())
+ range->setEndBefore(*node);
</ins><span class="cx"> rangeObjects.append(range->cloneRange());
</span><span class="cx"> range = Range::create(contentElement->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->setStartAfter(*node, IGNORE_EXCEPTION);
</del><ins>+ range->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->setStartBefore(*node, IGNORE_EXCEPTION);
</del><ins>+ range->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 && !node->isDescendantOf(lastEndNode))) {
</span><del>- range->setEndAfter(*node, IGNORE_EXCEPTION);
</del><ins>+ range->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 <darin@apple.com>
</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 <darin@apple.com>
+
</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->setStart(*core(refNode), offset, ec);
- raiseOnDOMError(ec);
</del><ins>+ raiseOnDOMError(IMPL->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->setEnd(*core(refNode), offset, ec);
- raiseOnDOMError(ec);
</del><ins>+ raiseOnDOMError(IMPL->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->setStartBefore(*core(refNode), ec);
- raiseOnDOMError(ec);
</del><ins>+ raiseOnDOMError(IMPL->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->setStartAfter(*core(refNode), ec);
- raiseOnDOMError(ec);
</del><ins>+ raiseOnDOMError(IMPL->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->setEndBefore(*core(refNode), ec);
- raiseOnDOMError(ec);
</del><ins>+ raiseOnDOMError(IMPL->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->setEndAfter(*core(refNode), ec);
- raiseOnDOMError(ec);
</del><ins>+ raiseOnDOMError(IMPL->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->selectNode(*core(refNode), ec);
- raiseOnDOMError(ec);
</del><ins>+ raiseOnDOMError(IMPL->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->selectNodeContents(*core(refNode), ec);
- raiseOnDOMError(ec);
</del><ins>+ raiseOnDOMError(IMPL->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->compareBoundaryPointsForBindings(how, *core(sourceRange), ec);
- raiseOnDOMError(ec);
- return result;
</del><ins>+ return raiseOnDOMError(IMPL->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->deleteContents(ec);
- raiseOnDOMError(ec);
</del><ins>+ raiseOnDOMError(IMPL->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->extractContents(ec)));
- raiseOnDOMError(ec);
- return result;
</del><ins>+ return kit(raiseOnDOMError(IMPL->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->cloneContents(ec)));
- raiseOnDOMError(ec);
- return result;
</del><ins>+ return kit(raiseOnDOMError(IMPL->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->insertNode(*core(newNode), ec);
- raiseOnDOMError(ec);
</del><ins>+ raiseOnDOMError(IMPL->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->surroundContents(*core(newParent), ec);
- raiseOnDOMError(ec);
</del><ins>+ raiseOnDOMError(IMPL->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->createContextualFragment(html, ec)));
- raiseOnDOMError(ec);
- return result;
</del><ins>+ return kit(raiseOnDOMError(IMPL->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->compareNode(*core(refNode), ec);
- raiseOnDOMError(ec);
- return result;
</del><ins>+ return raiseOnDOMError(IMPL->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->intersectsNode(*core(refNode), ec);
- raiseOnDOMError(ec);
- return result;
</del><ins>+ return raiseOnDOMError(IMPL->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->comparePoint(*core(refNode), offset, ec);
- raiseOnDOMError(ec);
- return result;
</del><ins>+ return raiseOnDOMError(IMPL->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->isPointInRange(*core(refNode), offset, ec);
- raiseOnDOMError(ec);
- return result;
</del><ins>+ return raiseOnDOMError(IMPL->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->expand(unit, ec);
- raiseOnDOMError(ec);
</del><ins>+ raiseOnDOMError(IMPL->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 < 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->setStart(*start.containerNode(), start.offsetInContainerNode(), ignored);
</del><ins>+ range->setStart(*start.containerNode(), start.offsetInContainerNode());
</ins><span class="cx"> if (end.containerNode())
</span><del>- range->setEnd(*end.containerNode(), end.offsetInContainerNode(), ignored);
</del><ins>+ range->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 < 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->setStart(*start.containerNode(), start.offsetInContainerNode(), ignored);
</del><ins>+ range->setStart(*start.containerNode(), start.offsetInContainerNode());
</ins><span class="cx"> if (end.containerNode())
</span><del>- range->setEnd(*end.containerNode(), end.offsetInContainerNode(), ignored);
</del><ins>+ range->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->coreFrame->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(&startContainer->document() == &endContainer->document());
-
- _private->coreFrame->document()->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<Range> range = _private->coreFrame->document()->createRange();
- if (newStart.containerNode()) {
- int exception = 0;
- range->setStart(*newStart.containerNode(), newStart.offsetInContainerNode(), exception);
- range->setEnd(*newStart.containerNode(), newStart.offsetInContainerNode(), exception);
- }
- return kit(range.ptr());
-}
-
-- (DOMDocumentFragment *)_documentFragmentWithMarkupString:(NSString *)markupString baseURLString:(NSString *)baseURLString
-{
</del><span class="cx"> Frame* frame = _private->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 <darin@apple.com>
</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 <darin@apple.com>
+
</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<Range> range = targetFrame->editor().hasComposition() ? targetFrame->editor().compositionRange() : targetFrame->selection().selection().toNormalizedRange()) {
</span><del>- ExceptionCode ec = 0;
</del><span class="cx"> RefPtr<Range> tempRange = range->cloneRange();
</span><del>- tempRange->setStart(tempRange->startContainer(), tempRange->startOffset() + charPos->dwCharPos, ec);
</del><ins>+ tempRange->setStart(tempRange->startContainer(), tempRange->startOffset() + charPos->dwCharPos);
</ins><span class="cx"> caret = targetFrame->editor().firstRectForRange(tempRange.get());
</span><span class="cx"> }
</span><span class="cx"> caret = targetFrame->view()->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 <darin@apple.com>
</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 <darin@apple.com>
+
</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->setStart(*convertedRefNode, offset, ec);
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->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("WEBKIT_DOM"), 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->setEnd(*convertedRefNode, offset, ec);
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->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("WEBKIT_DOM"), 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->setStartBefore(*convertedRefNode, ec);
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->setStartBefore(*convertedRefNode);
+ if (result.hasException()) {
+ WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx"> g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), 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->setStartAfter(*convertedRefNode, ec);
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->setStartAfter(*convertedRefNode);
+ if (result.hasException()) {
+ WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx"> g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), 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->setEndBefore(*convertedRefNode, ec);
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->setEndBefore(*convertedRefNode);
+ if (result.hasException()) {
+ WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx"> g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), 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->setEndAfter(*convertedRefNode, ec);
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->setEndAfter(*convertedRefNode);
+ if (result.hasException()) {
+ WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx"> g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), 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->selectNode(*convertedRefNode, ec);
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->selectNode(*convertedRefNode);
+ if (result.hasException()) {
+ WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx"> g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), 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->selectNodeContents(*convertedRefNode, ec);
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->selectNodeContents(*convertedRefNode);
+ if (result.hasException()) {
+ WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx"> g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), 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->compareBoundaryPointsForBindings(how, *convertedSourceRange, ec);
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->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("WEBKIT_DOM"), 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->deleteContents(ec);
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->deleteContents();
+ if (result.hasException()) {
+ WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx"> g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), 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<WebCore::DocumentFragment> gobjectResult = WTF::getPtr(item->extractContents(ec));
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->extractContents();
+ if (result.hasException()) {
+ WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx"> g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), 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<WebCore::DocumentFragment> gobjectResult = WTF::getPtr(item->cloneContents(ec));
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->cloneContents();
+ if (result.hasException()) {
+ WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx"> g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), 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->insertNode(*convertedNewNode, ec);
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->insertNode(*convertedNewNode);
+ if (result.hasException()) {
+ WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx"> g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), 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->surroundContents(*convertedNewParent, ec);
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->surroundContents(*convertedNewParent);
+ if (result.hasException()) {
+ WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx"> g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), 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<WebCore::DocumentFragment> gobjectResult = WTF::getPtr(item->createContextualFragment(convertedHtml, ec));
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->createContextualFragment(convertedHtml);
+ if (result.hasException()) {
+ WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx"> g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), 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->compareNode(*convertedRefNode, ec);
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->compareNode(*convertedRefNode);
+ if (result.hasException()) {
+ WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx"> g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), 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->intersectsNode(*convertedRefNode, ec);
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->intersectsNode(*convertedRefNode);
+ if (result.hasException()) {
+ WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx"> g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), 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->comparePoint(*convertedRefNode, offset, ec);
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->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("WEBKIT_DOM"), 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->isPointInRange(*convertedRefNode, offset, ec);
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->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("WEBKIT_DOM"), 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->expand(convertedUnit, ec);
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc(ec);
</del><ins>+ auto result = item->expand(convertedUnit);
+ if (result.hasException()) {
+ WebCore::ExceptionCodeDescription ecdesc(result.releaseException().code());
</ins><span class="cx"> g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), 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->setStart(*WebKit::toWebCoreNode(node), offset, ec);
</del><ins>+ _impl->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->setEnd(*WebKit::toWebCoreNode(node), offset, ec);
</del><ins>+ _impl->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->selectNode(*WebKit::toWebCoreNode(node), ec);
</del><ins>+ _impl->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->selectNodeContents(*WebKit::toWebCoreNode(node), ec);
</del><ins>+ _impl->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<Range> range = document->createRange();
</span><span class="cx">
</span><del>- ExceptionCode ec = 0;
- range->selectNode(*documentElement, ec);
- if (ec)
</del><ins>+ if (range->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->document());
</span><del>- range->selectNodeContents(*bestChoice, ASSERT_NO_EXCEPTION);
</del><ins>+ range->selectNodeContents(*bestChoice);
</ins><span class="cx"> return range->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->document());
</span><del>- range->selectNodeContents(*currentNode, ASSERT_NO_EXCEPTION);
</del><ins>+ range->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->startPosition(), m_currentWordRange->endPosition());
</span><span class="cx"> if (position < range->startPosition())
</span><del>- range->setStart(position.deepEquivalent(), ASSERT_NO_EXCEPTION);
</del><ins>+ range->setStart(position.deepEquivalent());
</ins><span class="cx"> if (position > range->endPosition())
</span><del>- range->setEnd(position.deepEquivalent(), ASSERT_NO_EXCEPTION);
</del><ins>+ range->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->commonAncestorContainer()->ownerDocument() == second->commonAncestorContainer()->ownerDocument()
- && first->compareBoundaryPoints(Range::START_TO_START, *second, ASSERT_NO_EXCEPTION) <= 0
- && first->compareBoundaryPoints(Range::END_TO_END, *second, ASSERT_NO_EXCEPTION) >= 0);
</del><ins>+ return first->commonAncestorContainer()->ownerDocument() == second->commonAncestorContainer()->ownerDocument()
+ && first->compareBoundaryPoints(Range::START_TO_START, *second).releaseReturnValue() <= 0
+ && first->compareBoundaryPoints(Range::END_TO_END, *second).releaseReturnValue() >= 0;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static inline RefPtr<Range> 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->compareBoundaryPoints(Range::START_TO_START, *rangeB, ASSERT_NO_EXCEPTION) <= 0 ? rangeA : rangeB;
- Range* end = rangeA->compareBoundaryPoints(Range::END_TO_END, *rangeB, ASSERT_NO_EXCEPTION) <= 0 ? rangeB : rangeA;
</del><ins>+ Range* start = rangeA->compareBoundaryPoints(Range::START_TO_START, *rangeB).releaseReturnValue() <= 0 ? rangeA : rangeB;
+ Range* end = rangeA->compareBoundaryPoints(Range::END_TO_END, *rangeB).releaseReturnValue() <= 0 ? rangeB : rangeA;
</ins><span class="cx">
</span><span class="cx"> return Range::create(rangeA->ownerDocument(), &start->startContainer(), start->startOffset(), &end->endContainer(), end->endOffset());
</span><span class="cx"> }
</span><span class="lines">@@ -1644,7 +1644,7 @@
</span><span class="cx">
</span><span class="cx"> if (!newRange && currentNode) {
</span><span class="cx"> newRange = Range::create(currentNode->document());
</span><del>- newRange->selectNodeContents(*currentNode, ASSERT_NO_EXCEPTION);
</del><ins>+ newRange->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->document().frame()->dataDetectionResults();
</span><span class="cx"> if (DataDetection::requiresExtendedContext(*element)) {
</span><span class="cx"> RefPtr<Range> linkRange = Range::create(element->document());
</span><del>- linkRange->selectNodeContents(*element, ASSERT_NO_EXCEPTION);
</del><ins>+ linkRange->selectNodeContents(*element);
</ins><span class="cx"> info.textBefore = plainTextReplacingNoBreakSpace(rangeExpandedByCharactersInDirectionAtWordBoundary(linkRange->startPosition(), dataDetectionExtendedContextLength, DirectionBackward).get(), TextIteratorDefaultBehavior, true);
</span><span class="cx"> info.textAfter = plainTextReplacingNoBreakSpace(rangeExpandedByCharactersInDirectionAtWordBoundary(linkRange->endPosition(), dataDetectionExtendedContextLength, DirectionForward).get(), TextIteratorDefaultBehavior, true);
</span><span class="cx"> }
</span></span></pre>
</div>
</div>
</body>
</html>