Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(292)

Unified Diff: third_party/WebKit/Source/core/editing/DOMSelection.cpp

Issue 2653523003: Make DOMSelection cache Range (Closed)
Patch Set: update Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..9af005ede20bc85b21ed013a585c168aa0265599 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 (m_range)
+ return 1;
return frame()->selection().isNone() ? 0 : 1;
}
@@ -383,6 +385,7 @@ void DOMSelection::extend(Node* node,
if (!isValidForPosition(node))
return;
+ markRangeDirty();
const Position& base = frame()->selection().base();
if (base.isNull()) {
// TODO(editing-dev): We should throw |InvalidStateError| if selection is
@@ -413,6 +416,14 @@ 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 (m_range)
+ return m_range;
+
+ m_range = createRangeFromSelectionEditor();
+ return m_range;
+}
+
+Range* DOMSelection::createRangeFromSelectionEditor() {
Position anchor = anchorPosition(visibleSelection());
if (!anchor.anchorNode()->isInShadowTree())
return frame()->selection().firstRange();
@@ -427,7 +438,12 @@ Range* DOMSelection::getRangeAt(int index, ExceptionState& exceptionState) {
focusOffset());
}
+void DOMSelection::markRangeDirty() {
+ m_range = nullptr;
+}
+
void DOMSelection::removeAllRanges() {
+ m_range = nullptr;
if (!isAvailable())
return;
frame()->selection().clear();
@@ -463,6 +479,7 @@ void DOMSelection::addRange(Range* newRange) {
if (selection.isNone()) {
selection.setSelectedRange(EphemeralRange(newRange), VP_DEFAULT_AFFINITY);
+ m_range = newRange;
return;
}
@@ -510,6 +527,7 @@ void DOMSelection::addRange(Range* newRange) {
EphemeralRange(start->startPosition(), end->endPosition());
TextAffinity affinity = selection.selection().affinity();
selection.setSelectedRange(merged, affinity);
+ m_range = createRange(merged);
}
void DOMSelection::deleteFromDocument() {
@@ -671,6 +689,7 @@ void DOMSelection::addConsoleError(const String& message) {
DEFINE_TRACE(DOMSelection) {
visitor->trace(m_treeScope);
+ visitor->trace(m_range);
ContextClient::trace(visitor);
}

Powered by Google App Engine
This is Rietveld 408576698