Chromium Code Reviews| 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 20b6dfd4de3acc5c7105b96853e749e006df6086..679549835d6f52797f6431e7053480efeaca286a 100644 |
| --- a/third_party/WebKit/Source/core/editing/DOMSelection.cpp |
| +++ b/third_party/WebKit/Source/core/editing/DOMSelection.cpp |
| @@ -95,31 +95,39 @@ static Position extentPosition(const VisibleSelection& selection) { |
| } |
| Node* DOMSelection::anchorNode() const { |
| - if (!isAvailable()) |
| - return 0; |
| - |
| - return shadowAdjustedNode(anchorPosition(visibleSelection())); |
| + if (Range* range = primaryRangeOrNull()) { |
| + if (!frame() || visibleSelection().isBaseFirst()) |
| + return range->startContainer(); |
| + return range->endContainer(); |
| + } |
| + return nullptr; |
| } |
| int DOMSelection::anchorOffset() const { |
| - if (!isAvailable()) |
| - return 0; |
| - |
| - return shadowAdjustedOffset(anchorPosition(visibleSelection())); |
| + if (Range* range = primaryRangeOrNull()) { |
| + if (!frame() || visibleSelection().isBaseFirst()) |
| + return range->startOffset(); |
| + return range->endOffset(); |
| + } |
| + return 0; |
| } |
| Node* DOMSelection::focusNode() const { |
| - if (!isAvailable()) |
| - return 0; |
| - |
| - return shadowAdjustedNode(focusPosition(visibleSelection())); |
| + if (Range* range = primaryRangeOrNull()) { |
| + if (!frame() || visibleSelection().isBaseFirst()) |
| + return range->endContainer(); |
| + return range->startContainer(); |
| + } |
| + return nullptr; |
| } |
| int DOMSelection::focusOffset() const { |
| - if (!isAvailable()) |
| - return 0; |
| - |
| - return shadowAdjustedOffset(focusPosition(visibleSelection())); |
| + if (Range* range = primaryRangeOrNull()) { |
| + if (!frame() || visibleSelection().isBaseFirst()) |
| + return range->endOffset(); |
| + return range->startOffset(); |
| + } |
| + return 0; |
| } |
| Node* DOMSelection::baseNode() const { |
| @@ -153,21 +161,20 @@ int DOMSelection::extentOffset() const { |
| bool DOMSelection::isCollapsed() const { |
| if (!isAvailable() || selectionShadowAncestor(frame())) |
| return true; |
| - return !frame()->selection().isRange(); |
| + if (Range* range = primaryRangeOrNull()) |
| + return range->collapsed(); |
| + return true; |
| } |
| String DOMSelection::type() const { |
| if (!isAvailable()) |
| return String(); |
| - |
| - FrameSelection& selection = frame()->selection(); |
| - |
| // This is a WebKit DOM extension, incompatible with an IE extension |
| // IE has this same attribute, but returns "none", "text" and "control" |
| // http://msdn.microsoft.com/en-us/library/ms534692(VS.85).aspx |
| - if (selection.isNone()) |
| + if (rangeCount() == 0) |
| return "None"; |
| - if (selection.isCaret()) |
| + if (isCollapsed()) |
| return "Caret"; |
| return "Range"; |
| } |
| @@ -414,7 +421,8 @@ void DOMSelection::extend(Node* node, |
| .build()); |
| } |
| -Range* DOMSelection::getRangeAt(int index, ExceptionState& exceptionState) { |
| +Range* DOMSelection::getRangeAt(int index, |
| + ExceptionState& exceptionState) const { |
| if (!isAvailable()) |
| return nullptr; |
| @@ -435,26 +443,33 @@ Range* DOMSelection::getRangeAt(int index, ExceptionState& exceptionState) { |
| return range; |
| } |
| -Range* DOMSelection::createRangeFromSelectionEditor() { |
| +Range* DOMSelection::primaryRangeOrNull() const { |
|
yosin_UTC9
2017/02/14 04:52:21
Thanks for better name! (^_^)b
|
| + return rangeCount() > 0 ? getRangeAt(0, ASSERT_NO_EXCEPTION) : nullptr; |
| +} |
| + |
| +Range* DOMSelection::createRangeFromSelectionEditor() const { |
| Position anchor = anchorPosition(visibleSelection()); |
| - if (!anchor.anchorNode()->isInShadowTree()) |
| + if (isSelectionOfDocument() && !anchor.anchorNode()->isInShadowTree()) |
| return frame()->selection().firstRange(); |
| Node* node = shadowAdjustedNode(anchor); |
| if (!node) // crbug.com/595100 |
| return nullptr; |
| - if (!visibleSelection().isBaseFirst()) |
| - return Range::create(*anchor.document(), focusNode(), focusOffset(), node, |
| - anchorOffset()); |
| - return Range::create(*anchor.document(), node, anchorOffset(), focusNode(), |
| - focusOffset()); |
| + Position focus = focusPosition(visibleSelection()); |
|
yosin_UTC9
2017/02/14 04:52:21
nit: s/Position/const Position&/
|
| + if (!visibleSelection().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)); |
| } |
| bool DOMSelection::isSelectionOfDocument() const { |
| return m_treeScope == m_treeScope->document(); |
| } |
| -void DOMSelection::cacheRangeIfSelectionOfDocument(Range* range) { |
| +void DOMSelection::cacheRangeIfSelectionOfDocument(Range* range) const { |
| if (!isSelectionOfDocument()) |
| return; |
| frame()->selection().cacheRangeOfDocument(range); |