 Chromium Code Reviews
 Chromium Code Reviews Issue 2778963002:
  Return EphemeralRange instead of Range in DOMSelection::createRangeFromSelectionEditor   (Closed)
    
  
    Issue 2778963002:
  Return EphemeralRange instead of Range in DOMSelection::createRangeFromSelectionEditor   (Closed) 
  | Index: third_party/WebKit/Source/core/editing/DOMSelection.cpp | 
| diff --git a/third_party/WebKit/Source/core/editing/DOMSelection.cpp b/third_party/WebKit/Source/core/editing/DOMSelection.cpp | 
| index fd59dced6fe22cd8f6fb1b08cf23cbcbe70d51bb..d473161afba0f1e496fda0842d1b9f6079b6c2fb 100644 | 
| --- a/third_party/WebKit/Source/core/editing/DOMSelection.cpp | 
| +++ b/third_party/WebKit/Source/core/editing/DOMSelection.cpp | 
| @@ -224,7 +224,9 @@ unsigned DOMSelection::rangeCount() const { | 
| if (isSelectionOfDocument()) | 
| return 1; | 
| // In ShadowRoot, we need to try adjustment. | 
| - return createRangeFromSelectionEditor() ? 1 : 0; | 
| + if (createRangeFromSelectionEditor().isNotNull()) | 
| 
yosin_UTC9
2017/03/28 07:04:31
nit: I prefer using "?:" as original
return creat
 
yoichio
2017/03/28 09:32:51
New early-return follows above early returns of 1
 | 
| + return 1; | 
| + return 0; | 
| } | 
| // https://www.w3.org/TR/selection-api/#dom-selection-collapse | 
| @@ -530,7 +532,7 @@ Range* DOMSelection::getRangeAt(unsigned index, | 
| if (Range* cachedRange = documentCachedRange()) | 
| return cachedRange; | 
| - Range* range = createRangeFromSelectionEditor(); | 
| + Range* range = createRange(createRangeFromSelectionEditor()); | 
| cacheRangeIfSelectionOfDocument(range); | 
| return range; | 
| } | 
| @@ -539,23 +541,24 @@ Range* DOMSelection::primaryRangeOrNull() const { | 
| return rangeCount() > 0 ? getRangeAt(0, ASSERT_NO_EXCEPTION) : nullptr; | 
| } | 
| -Range* DOMSelection::createRangeFromSelectionEditor() const { | 
| +EphemeralRange DOMSelection::createRangeFromSelectionEditor() const { | 
| const VisibleSelection& selection = visibleSelection(); | 
| const Position& anchor = blink::anchorPosition(selection); | 
| if (isSelectionOfDocument() && !anchor.anchorNode()->isInShadowTree()) | 
| - return createRange(firstEphemeralRangeOf(selection)); | 
| + return firstEphemeralRangeOf(selection); | 
| + | 
| + Node* const anchorNode = shadowAdjustedNode(anchor); | 
| + if (!anchorNode) // crbug.com/595100 | 
| + return EphemeralRange(); | 
| - Node* const node = shadowAdjustedNode(anchor); | 
| - if (!node) // crbug.com/595100 | 
| - return nullptr; | 
| const Position& focus = focusPosition(selection); | 
| - if (!selection.isBaseFirst()) { | 
| - return Range::create(*anchor.document(), shadowAdjustedNode(focus), | 
| - shadowAdjustedOffset(focus), node, | 
| - shadowAdjustedOffset(anchor)); | 
| - } | 
| - return Range::create(*anchor.document(), node, shadowAdjustedOffset(anchor), | 
| - shadowAdjustedNode(focus), shadowAdjustedOffset(focus)); | 
| + const Position shadowAdjustedFocus = | 
| + Position(shadowAdjustedNode(focus), shadowAdjustedOffset(focus)); | 
| + const Position shadowAdjustedAnchor = | 
| + Position(anchorNode, shadowAdjustedOffset(anchor)); | 
| + if (selection.isBaseFirst()) | 
| + return EphemeralRange(shadowAdjustedAnchor, shadowAdjustedFocus); | 
| + return EphemeralRange(shadowAdjustedFocus, shadowAdjustedAnchor); | 
| } | 
| bool DOMSelection::isSelectionOfDocument() const { |