| Index: third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
|
| diff --git a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
|
| index 41afe11c85185d22f509ddc551141887d1ae33c5..a1f5347ef5846bf767f43d8431cd13436f949d78 100644
|
| --- a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
|
| +++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
|
| @@ -183,11 +183,6 @@ static bool startsAfter(const Member<RenderedDocumentMarker>& marker,
|
| return marker->startOffset() < startOffset;
|
| }
|
|
|
| -static bool endsBefore(size_t startOffset,
|
| - const Member<RenderedDocumentMarker>& rhv) {
|
| - return startOffset < rhv->endOffset();
|
| -}
|
| -
|
| static bool compareByStart(const Member<DocumentMarker>& lhv,
|
| const Member<DocumentMarker>& rhv) {
|
| return lhv->startOffset() < rhv->startOffset();
|
| @@ -225,7 +220,6 @@ static void updateMarkerRenderedRect(const Node& node,
|
| }
|
|
|
| // Markers are stored in order sorted by their start offset.
|
| -// Markers of the same type do not overlap each other.
|
|
|
| void DocumentMarkerController::addMarker(Node* node,
|
| const DocumentMarker& newMarker) {
|
| @@ -375,21 +369,21 @@ void DocumentMarkerController::removeMarkers(
|
| if (!markerTypes.contains((*list->begin())->type()))
|
| continue;
|
| unsigned endOffset = startOffset + length;
|
| - MarkerList::iterator startPos =
|
| - std::upper_bound(list->begin(), list->end(), startOffset, endsBefore);
|
| - for (MarkerList::iterator i = startPos; i != list->end();) {
|
| - DocumentMarker marker(*i->get());
|
|
|
| - // markers are returned in order, so stop if we are now past the specified
|
| - // range
|
| - if (marker.startOffset() >= endOffset)
|
| - break;
|
| + for (size_t markerIndex = 0; markerIndex < list->size();) {
|
| + DocumentMarker marker(*(list->at(markerIndex).get()));
|
| +
|
| + if (marker.startOffset() >= endOffset ||
|
| + marker.endOffset() <= startOffset) {
|
| + ++markerIndex;
|
| + continue;
|
| + }
|
|
|
| // at this point we know that marker and target intersect in some way
|
| docDirty = true;
|
|
|
| // pitch the old marker
|
| - list->remove(i - list->begin());
|
| + list->remove(markerIndex);
|
|
|
| if (shouldRemovePartiallyOverlappingMarker) {
|
| // Stop here. Don't add resulting slices back.
|
| @@ -400,18 +394,20 @@ void DocumentMarkerController::removeMarkers(
|
| if (startOffset > marker.startOffset()) {
|
| DocumentMarker newLeft = marker;
|
| newLeft.setEndOffset(startOffset);
|
| - size_t insertIndex = i - list->begin();
|
| - list->insert(insertIndex, RenderedDocumentMarker::create(newLeft));
|
| - // Move to the marker after the inserted one.
|
| - i = list->begin() + insertIndex + 1;
|
| +
|
| + MarkerList::iterator pos = std::lower_bound(list->begin(), list->end(),
|
| + &newLeft, startsFurther);
|
| + list->insert(pos - list->begin(),
|
| + RenderedDocumentMarker::create(newLeft));
|
| }
|
| if (marker.endOffset() > endOffset) {
|
| DocumentMarker newRight = marker;
|
| newRight.setStartOffset(endOffset);
|
| - size_t insertIndex = i - list->begin();
|
| - list->insert(insertIndex, RenderedDocumentMarker::create(newRight));
|
| - // Move to the marker after the inserted one.
|
| - i = list->begin() + insertIndex + 1;
|
| +
|
| + MarkerList::iterator pos = std::lower_bound(list->begin(), list->end(),
|
| + &newRight, startsFurther);
|
| + list->insert(pos - list->begin(),
|
| + RenderedDocumentMarker::create(newRight));
|
| }
|
| }
|
|
|
| @@ -805,16 +801,13 @@ bool DocumentMarkerController::setMarkersActive(Node* node,
|
| (*markers)[MarkerTypeToMarkerIndex(DocumentMarker::TextMatch)];
|
| if (!list)
|
| return false;
|
| - MarkerList::iterator startPos =
|
| - std::upper_bound(list->begin(), list->end(), startOffset, endsBefore);
|
| - for (MarkerList::iterator marker = startPos; marker != list->end();
|
| - ++marker) {
|
| - // Markers are returned in order, so stop if we are now past the specified
|
| - // range.
|
| - if ((*marker)->startOffset() >= endOffset)
|
| - break;
|
| -
|
| - (*marker)->setActiveMatch(active);
|
| +
|
| + for (Member<RenderedDocumentMarker>& marker : *list) {
|
| + if ((*marker).endOffset() <= startOffset ||
|
| + (*marker).startOffset() >= endOffset)
|
| + continue;
|
| +
|
| + (*marker).setActiveMatch(active);
|
| docDirty = true;
|
| }
|
|
|
|
|