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..048d52dae57b7bdfddffb85d11e4b290ff5fce2f 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 (isTreeScopeDocument() && documentCachedRange()) |
+ return 1; |
return frame()->selection().isNone() ? 0 : 1; |
} |
@@ -286,6 +288,9 @@ void DOMSelection::setBaseAndExtent(Node* baseNode, |
if (!isValidForPosition(baseNode) || !isValidForPosition(extentNode)) |
return; |
+ if (isTreeScopeDocument()) |
+ clearDocumentCachedRange(); |
+ |
// 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 +388,8 @@ void DOMSelection::extend(Node* node, |
if (!isValidForPosition(node)) |
return; |
+ if (isTreeScopeDocument()) |
+ clearDocumentCachedRange(); |
const Position& base = frame()->selection().base(); |
if (base.isNull()) { |
// TODO(editing-dev): We should throw |InvalidStateError| if selection is |
@@ -413,6 +420,18 @@ 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 (!isTreeScopeDocument()) |
yosin_UTC9
2017/02/09 06:52:06
If we have |cachedRangeIfDocumentSlection()| and |
yoichio
2017/02/09 09:31:19
Done.
|
+ return createRangeFromSelectionEditor(); |
+ |
+ if (Range* cachedRange = documentCachedRange()) |
+ return cachedRange; |
+ |
+ Range* range = createRangeFromSelectionEditor(); |
+ cacheRangeOfDocument(range); |
+ return range; |
+} |
+ |
+Range* DOMSelection::createRangeFromSelectionEditor() { |
Position anchor = anchorPosition(visibleSelection()); |
if (!anchor.anchorNode()->isInShadowTree()) |
return frame()->selection().firstRange(); |
@@ -427,6 +446,24 @@ Range* DOMSelection::getRangeAt(int index, ExceptionState& exceptionState) { |
focusOffset()); |
} |
+bool DOMSelection::isTreeScopeDocument() const { |
yosin_UTC9
2017/02/09 06:52:06
nit: s/isTreeScopeDocument/isSelectionForDocument/
yoichio
2017/02/09 09:31:19
Done.
|
+ return m_treeScope == m_treeScope->document(); |
+} |
+ |
+void DOMSelection::cacheRangeOfDocument(Range* range) { |
+ DCHECK(isTreeScopeDocument()); |
+ frame()->selection().cacheRangeOfDocument(range); |
+} |
+ |
+Range* DOMSelection::documentCachedRange() const { |
+ DCHECK(isTreeScopeDocument()); |
+ return frame()->selection().documentCachedRange(); |
+} |
+ |
+void DOMSelection::clearDocumentCachedRange() { |
+ frame()->selection().clearDocumentCachedRange(); |
yosin_UTC9
2017/02/09 06:52:06
Let's add |DCHECK(isTreeScopeDocument())|.
It see
yoichio
2017/02/09 09:31:19
Done.
|
+} |
+ |
void DOMSelection::removeAllRanges() { |
if (!isAvailable()) |
return; |
@@ -463,6 +500,8 @@ void DOMSelection::addRange(Range* newRange) { |
if (selection.isNone()) { |
selection.setSelectedRange(EphemeralRange(newRange), VP_DEFAULT_AFFINITY); |
+ if (isTreeScopeDocument()) |
yosin_UTC9
2017/02/09 06:52:06
|cacheRangeIfDocumentSlection(newRange)| is simple
yoichio
2017/02/09 09:31:19
Done.
|
+ cacheRangeOfDocument(newRange); |
return; |
} |
@@ -510,6 +549,8 @@ void DOMSelection::addRange(Range* newRange) { |
EphemeralRange(start->startPosition(), end->endPosition()); |
TextAffinity affinity = selection.selection().affinity(); |
selection.setSelectedRange(merged, affinity); |
+ if (isTreeScopeDocument()) |
+ cacheRangeOfDocument(newRange); |
} |
void DOMSelection::deleteFromDocument() { |