| 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 34506d1809171ca1ef41fdc04d995e252f4aa773..32abf9d8d5a5e3cbf05e521a1eefd3c3a0ca172d 100644
|
| --- a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
|
| +++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
|
| @@ -177,11 +177,6 @@ static bool startsFurther(const Member<RenderedDocumentMarker>& lhv,
|
| return lhv->startOffset() < rhv->startOffset();
|
| }
|
|
|
| -static bool startsAfter(const Member<RenderedDocumentMarker>& marker,
|
| - size_t startOffset) {
|
| - return marker->startOffset() < startOffset;
|
| -}
|
| -
|
| static bool endsBefore(size_t startOffset,
|
| const Member<RenderedDocumentMarker>& rhv) {
|
| return startOffset < rhv->endOffset();
|
| @@ -309,10 +304,7 @@ void DocumentMarkerController::copyMarkers(Node* srcNode,
|
| return;
|
|
|
| bool docDirty = false;
|
| - for (size_t markerListIndex = 0;
|
| - markerListIndex < DocumentMarker::MarkerTypeIndexesCount;
|
| - ++markerListIndex) {
|
| - Member<MarkerList>& list = (*markers)[markerListIndex];
|
| + for (Member<MarkerList> list : *markers) {
|
| if (!list)
|
| continue;
|
|
|
| @@ -736,47 +728,6 @@ void DocumentMarkerController::repaintMarkers(
|
| }
|
| }
|
|
|
| -void DocumentMarkerController::shiftMarkers(Node* node,
|
| - unsigned startOffset,
|
| - int delta) {
|
| - if (!possiblyHasMarkers(DocumentMarker::AllMarkers()))
|
| - return;
|
| - DCHECK(!m_markers.isEmpty());
|
| -
|
| - MarkerLists* markers = m_markers.at(node);
|
| - if (!markers)
|
| - return;
|
| -
|
| - bool didShiftMarker = false;
|
| - for (size_t markerListIndex = 0;
|
| - markerListIndex < DocumentMarker::MarkerTypeIndexesCount;
|
| - ++markerListIndex) {
|
| - Member<MarkerList>& list = (*markers)[markerListIndex];
|
| - if (!list)
|
| - continue;
|
| - MarkerList::iterator startPos =
|
| - std::lower_bound(list->begin(), list->end(), startOffset, startsAfter);
|
| - for (MarkerList::iterator marker = startPos; marker != list->end();
|
| - ++marker) {
|
| -#if DCHECK_IS_ON()
|
| - int startOffset = (*marker)->startOffset();
|
| - DCHECK_GE(startOffset + delta, 0);
|
| -#endif
|
| - (*marker)->shiftOffsets(delta);
|
| - didShiftMarker = true;
|
| - }
|
| - }
|
| -
|
| - if (didShiftMarker) {
|
| - invalidateRectsForMarkersInNode(*node);
|
| - // repaint the affected node
|
| - if (node->layoutObject()) {
|
| - node->layoutObject()->setShouldDoFullPaintInvalidation(
|
| - PaintInvalidationDocumentMarkerChange);
|
| - }
|
| - }
|
| -}
|
| -
|
| bool DocumentMarkerController::setMarkersActive(const EphemeralRange& range,
|
| bool active) {
|
| if (!possiblyHasMarkers(DocumentMarker::AllMarkers()))
|
| @@ -876,10 +827,52 @@ void DocumentMarkerController::didUpdateCharacterData(CharacterData* node,
|
| unsigned offset,
|
| unsigned oldLength,
|
| unsigned newLength) {
|
| - // Shift markers as if we first remove the old text, then insert the new text
|
| - removeMarkers(node, offset, oldLength);
|
| - shiftMarkers(node, offset + oldLength, 0 - oldLength);
|
| - shiftMarkers(node, offset, newLength);
|
| + // If we're doing a pure remove operation, remove the markers in the range
|
| + // being removed (markers containing, but larger than, the range, will be
|
| + // split)
|
| + if (newLength == 0)
|
| + removeMarkers(node, offset, oldLength);
|
| +
|
| + if (!possiblyHasMarkers(DocumentMarker::AllMarkers()))
|
| + return;
|
| + DCHECK(!m_markers.isEmpty());
|
| +
|
| + MarkerLists* markers = m_markers.at(node);
|
| + if (!markers)
|
| + return;
|
| +
|
| + bool didShiftMarker = false;
|
| + for (MarkerList* list : *markers) {
|
| + if (!list)
|
| + continue;
|
| +
|
| + for (MarkerList::iterator it = list->begin(); it != list->end(); ++it) {
|
| + RenderedDocumentMarker& marker = **it;
|
| + DocumentMarker::ShiftMarkerResult result =
|
| + marker.getShiftedMarkerPosition(offset, oldLength, newLength);
|
| + if (result.shouldRemoveMarker) {
|
| + list->erase(it - list->begin());
|
| + --it;
|
| + didShiftMarker = true;
|
| + continue;
|
| + }
|
| +
|
| + if (marker.startOffset() != result.newStartOffset ||
|
| + marker.endOffset() != result.newEndOffset) {
|
| + didShiftMarker = true;
|
| + marker.setStartOffset(result.newStartOffset);
|
| + marker.setEndOffset(result.newEndOffset);
|
| + }
|
| + }
|
| + }
|
| +
|
| + if (!didShiftMarker)
|
| + return;
|
| + if (!node->layoutObject())
|
| + return;
|
| + invalidateRectsForMarkersInNode(*node);
|
| + // repaint the affected node
|
| + node->layoutObject()->setShouldDoFullPaintInvalidation();
|
| }
|
|
|
| } // namespace blink
|
|
|