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 34c9a1c8e64719d26bfc41d5b133c9a5c5b780e6..a996b0d08f707d896cbea772d80af70739f36f68 100644 |
| --- a/third_party/WebKit/Source/core/editing/DOMSelection.cpp |
| +++ b/third_party/WebKit/Source/core/editing/DOMSelection.cpp |
| @@ -175,6 +175,8 @@ String DOMSelection::type() const { |
| int DOMSelection::rangeCount() const { |
| if (!isAvailable()) |
| return 0; |
| + if (documentCachedRange()) |
| + return 1; |
| return frame()->selection().isNone() ? 0 : 1; |
| } |
| @@ -286,6 +288,8 @@ void DOMSelection::setBaseAndExtent(Node* baseNode, |
| if (!isValidForPosition(baseNode) || !isValidForPosition(extentNode)) |
| return; |
| + clearCachedRangeIfSelectionOfDocument(); |
| + |
| // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets |
| // needs to be audited. See http://crbug.com/590369 for more details. |
| // In the long term, we should change FrameSelection::setSelection to take a |
| @@ -383,6 +387,7 @@ void DOMSelection::extend(Node* node, |
| if (!isValidForPosition(node)) |
| return; |
| + clearCachedRangeIfSelectionOfDocument(); |
| const Position& base = frame()->selection().base(); |
| if (base.isNull()) { |
| // TODO(editing-dev): We should throw |InvalidStateError| if selection is |
| @@ -413,6 +418,15 @@ Range* DOMSelection::getRangeAt(int index, ExceptionState& exceptionState) { |
| // If you're hitting this, you've added broken multi-range selection support |
| DCHECK_EQ(rangeCount(), 1); |
| + if (Range* cachedRange = documentCachedRange()) |
| + return cachedRange; |
| + |
| + Range* range = createRangeFromSelectionEditor(); |
| + cacheRangeIfSelectionOfDocument(range); |
| + return range; |
| +} |
| + |
| +Range* DOMSelection::createRangeFromSelectionEditor() { |
| Position anchor = anchorPosition(visibleSelection()); |
| if (!anchor.anchorNode()->isInShadowTree()) |
| return frame()->selection().firstRange(); |
| @@ -427,6 +441,31 @@ Range* DOMSelection::getRangeAt(int index, ExceptionState& exceptionState) { |
| focusOffset()); |
| } |
| +bool DOMSelection::isSelectionOfDocument() const { |
| + return m_treeScope == m_treeScope->document(); |
| +} |
| + |
| +void DOMSelection::cacheRangeIfSelectionOfDocument(Range* range) { |
| + if (!isSelectionOfDocument()) |
| + return; |
| + |
|
yosin_UTC9
2017/02/09 09:32:09
nit: Please get rid of an extra blank line.
yoichio
2017/02/09 09:36:04
Done.
|
| + frame()->selection().cacheRangeOfDocument(range); |
| +} |
| + |
| +Range* DOMSelection::documentCachedRange() const { |
| + if (!isSelectionOfDocument()) |
| + return nullptr; |
| + |
|
yosin_UTC9
2017/02/09 09:32:09
nit: Please get rid of an extra blank line.
yoichio
2017/02/09 09:36:04
Done.
|
| + return frame()->selection().documentCachedRange(); |
| +} |
| + |
| +void DOMSelection::clearCachedRangeIfSelectionOfDocument() { |
| + if (!isSelectionOfDocument()) |
| + return; |
| + |
|
yosin_UTC9
2017/02/09 09:32:09
nit: Please get rid of an extra blank line.
yoichio
2017/02/09 09:36:04
Done.
|
| + frame()->selection().clearDocumentCachedRange(); |
| +} |
| + |
| void DOMSelection::removeAllRanges() { |
| if (!isAvailable()) |
| return; |
| @@ -463,6 +502,7 @@ void DOMSelection::addRange(Range* newRange) { |
| if (selection.isNone()) { |
| selection.setSelectedRange(EphemeralRange(newRange), VP_DEFAULT_AFFINITY); |
| + cacheRangeIfSelectionOfDocument(newRange); |
| return; |
| } |
| @@ -510,6 +550,7 @@ void DOMSelection::addRange(Range* newRange) { |
| EphemeralRange(start->startPosition(), end->endPosition()); |
| TextAffinity affinity = selection.selection().affinity(); |
| selection.setSelectedRange(merged, affinity); |
| + cacheRangeIfSelectionOfDocument(createRange(merged)); |
| } |
| void DOMSelection::deleteFromDocument() { |