Index: third_party/WebKit/Source/core/editing/markers/SingletonMarkerListImpl.cpp |
diff --git a/third_party/WebKit/Source/core/editing/markers/SingletonMarkerListImpl.cpp b/third_party/WebKit/Source/core/editing/markers/SingletonMarkerListImpl.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2351881c2e771a8fa53179a43aca70bd43713649 |
--- /dev/null |
+++ b/third_party/WebKit/Source/core/editing/markers/SingletonMarkerListImpl.cpp |
@@ -0,0 +1,90 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "core/editing/markers/SingletonMarkerListImpl.h" |
+ |
+namespace blink { |
+ |
+bool SingletonMarkerListImpl::IsEmpty() const { |
+ return !marker_; |
+} |
+ |
+void SingletonMarkerListImpl::Add(DocumentMarker* marker) { |
+ DCHECK(IsEmpty()); |
+ marker_ = marker; |
+} |
+ |
+void SingletonMarkerListImpl::Clear() { |
+ marker_.Clear(); |
+} |
+ |
+void SingletonMarkerListImpl::AppendMarkersToInputList( |
+ DocumentMarkerVector* list) const { |
+ if (marker_) |
+ list->push_back(marker_); |
+} |
+ |
+bool SingletonMarkerListImpl::MoveMarkers(int length, |
+ DocumentMarkerList* dst_list) { |
+ DCHECK_GT(length, 0); |
+ unsigned end_offset = length - 1; |
+ |
+ if (!marker_) |
+ return false; |
+ |
+ if (marker_->StartOffset() > end_offset) |
+ return false; |
+ |
+ if (marker_->EndOffset() > end_offset) |
+ marker_->SetEndOffset(end_offset); |
+ |
+ dst_list->Add(marker_); |
+ marker_.Clear(); |
+ |
+ return true; |
+} |
+ |
+bool SingletonMarkerListImpl::RemoveMarkers(unsigned start_offset, int length) { |
+ if (!marker_) |
+ return false; |
+ |
+ unsigned end_offset = start_offset + length; |
+ if (marker_->EndOffset() <= start_offset || |
+ marker_->StartOffset() >= end_offset) |
+ return false; |
+ |
+ marker_.Clear(); |
+ return true; |
+} |
+ |
+bool SingletonMarkerListImpl::ShiftMarkers(unsigned offset, |
+ unsigned old_length, |
+ unsigned new_length) { |
+ if (!marker_) |
+ return false; |
+ |
+ Optional<DocumentMarker::MarkerOffsets> result = |
+ marker_->ComputeOffsetsAfterShift(offset, old_length, new_length); |
+ |
+ if (result == WTF::kNullopt) { |
+ marker_.Clear(); |
+ return true; |
+ } |
+ |
+ if (marker_->StartOffset() == result.value().start_offset && |
+ marker_->EndOffset() == result.value().end_offset) |
+ return false; |
+ |
+ marker_->SetStartOffset(result.value().start_offset); |
+ marker_->SetEndOffset(result.value().end_offset); |
+ |
+ return true; |
+} |
+ |
+DEFINE_TRACE(SingletonMarkerListImpl) { |
+ visitor->Trace(marker_); |
+ DocumentMarkerList::Trace(visitor); |
+} |
+ |
+} // namespace blink |