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

Side by Side Diff: third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp

Issue 2810463002: Clean up DocumentMarkerController::copyMarkers() (now it's moveMarkers()) (Closed)
Patch Set: Actually do erase, fix reapply (messed up when rebasing) Created 3 years, 8 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 unified diff | Download patch
« no previous file with comments | « third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights
7 * reserved. 7 * reserved.
8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved.
9 * (http://www.torchmobile.com/) 9 * (http://www.torchmobile.com/)
10 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 10 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 static bool CompareByStart(const Member<DocumentMarker>& lhv, 187 static bool CompareByStart(const Member<DocumentMarker>& lhv,
188 const Member<DocumentMarker>& rhv) { 188 const Member<DocumentMarker>& rhv) {
189 return lhv->StartOffset() < rhv->StartOffset(); 189 return lhv->StartOffset() < rhv->StartOffset();
190 } 190 }
191 191
192 static bool DoesNotOverlap(const Member<RenderedDocumentMarker>& lhv, 192 static bool DoesNotOverlap(const Member<RenderedDocumentMarker>& lhv,
193 const DocumentMarker* rhv) { 193 const DocumentMarker* rhv) {
194 return lhv->EndOffset() < rhv->StartOffset(); 194 return lhv->EndOffset() < rhv->StartOffset();
195 } 195 }
196 196
197 static bool DoesNotInclude(const Member<RenderedDocumentMarker>& marker,
198 size_t start_offset) {
199 return marker->EndOffset() < start_offset;
200 }
201
202 static void UpdateMarkerRenderedRect(const Node& node, 197 static void UpdateMarkerRenderedRect(const Node& node,
203 RenderedDocumentMarker& marker) { 198 RenderedDocumentMarker& marker) {
204 Range* range = Range::Create(node.GetDocument()); 199 Range* range = Range::Create(node.GetDocument());
205 // The offsets of the marker may be out-dated, so check for exceptions. 200 // The offsets of the marker may be out-dated, so check for exceptions.
206 DummyExceptionStateForTesting exception_state; 201 DummyExceptionStateForTesting exception_state;
207 range->setStart(&const_cast<Node&>(node), marker.StartOffset(), 202 range->setStart(&const_cast<Node&>(node), marker.StartOffset(),
208 exception_state); 203 exception_state);
209 if (!exception_state.HadException()) { 204 if (!exception_state.HadException()) {
210 range->setEnd(&const_cast<Node&>(node), marker.EndOffset(), 205 range->setEnd(&const_cast<Node&>(node), marker.EndOffset(),
211 IGNORE_EXCEPTION_FOR_TESTING); 206 IGNORE_EXCEPTION_FOR_TESTING);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 for (MarkerList::iterator i = first_overlapping; 274 for (MarkerList::iterator i = first_overlapping;
280 i != list->end() && (*i)->StartOffset() <= (*inserted)->EndOffset();) { 275 i != list->end() && (*i)->StartOffset() <= (*inserted)->EndOffset();) {
281 (*inserted)->SetStartOffset( 276 (*inserted)->SetStartOffset(
282 std::min((*inserted)->StartOffset(), (*i)->StartOffset())); 277 std::min((*inserted)->StartOffset(), (*i)->StartOffset()));
283 (*inserted)->SetEndOffset( 278 (*inserted)->SetEndOffset(
284 std::max((*inserted)->EndOffset(), (*i)->EndOffset())); 279 std::max((*inserted)->EndOffset(), (*i)->EndOffset()));
285 list->erase(i - list->begin()); 280 list->erase(i - list->begin());
286 } 281 }
287 } 282 }
288 283
289 // copies markers from srcNode to dstNode, applying the specified shift delta to 284 // Moves markers from src_node to dst_node. Markers are moved if their start
290 // the copies. The shift is useful if, e.g., the caller has created the dstNode 285 // offset is less than length. Markers that run past that point are truncated.
291 // from a non-prefix substring of the srcNode. 286 void DocumentMarkerController::MoveMarkers(Node* src_node,
292 void DocumentMarkerController::CopyMarkers(Node* src_node,
293 unsigned start_offset,
294 int length, 287 int length,
295 Node* dst_node, 288 Node* dst_node) {
296 int delta) {
297 if (length <= 0) 289 if (length <= 0)
298 return; 290 return;
299 291
300 if (!PossiblyHasMarkers(DocumentMarker::AllMarkers())) 292 if (!PossiblyHasMarkers(DocumentMarker::AllMarkers()))
301 return; 293 return;
302 DCHECK(!markers_.IsEmpty()); 294 DCHECK(!markers_.IsEmpty());
303 295
304 MarkerLists* markers = markers_.at(src_node); 296 MarkerLists* markers = markers_.at(src_node);
305 if (!markers) 297 if (!markers)
306 return; 298 return;
307 299
308 bool doc_dirty = false; 300 bool doc_dirty = false;
309 for (Member<MarkerList> list : *markers) { 301 for (Member<MarkerList> list : *markers) {
310 if (!list) 302 if (!list)
311 continue; 303 continue;
312 304
313 unsigned end_offset = start_offset + length - 1; 305 unsigned end_offset = length - 1;
314 MarkerList::iterator start_pos = std::lower_bound( 306 MarkerList::iterator it;
315 list->begin(), list->end(), start_offset, DoesNotInclude); 307 for (it = list->begin(); it != list->end(); ++it) {
316 for (MarkerList::iterator i = start_pos; i != list->end(); ++i) { 308 DocumentMarker* marker = it->Get();
317 DocumentMarker* marker = i->Get();
318 309
319 // stop if we are now past the specified range 310 // stop if we are now past the specified range
320 if (marker->StartOffset() > end_offset) 311 if (marker->StartOffset() > end_offset)
321 break; 312 break;
322 313
323 // pin the marker to the specified range and apply the shift delta 314 // pin the marker to the specified range
324 doc_dirty = true; 315 doc_dirty = true;
325 if (marker->StartOffset() < start_offset)
326 marker->SetStartOffset(start_offset);
327 if (marker->EndOffset() > end_offset) 316 if (marker->EndOffset() > end_offset)
328 marker->SetEndOffset(end_offset); 317 marker->SetEndOffset(end_offset);
329 marker->ShiftOffsets(delta);
330 318
331 AddMarker(dst_node, *marker); 319 AddMarker(dst_node, *marker);
332 } 320 }
321
322 // Remove the range of markers that were moved to dstNode
323 list->erase(0, it - list->begin());
333 } 324 }
334 325
335 // repaint the affected node 326 // repaint the affected node
336 if (doc_dirty && dst_node->GetLayoutObject()) { 327 if (doc_dirty && dst_node->GetLayoutObject()) {
337 dst_node->GetLayoutObject()->SetShouldDoFullPaintInvalidation( 328 dst_node->GetLayoutObject()->SetShouldDoFullPaintInvalidation(
338 kPaintInvalidationDocumentMarkerChange); 329 kPaintInvalidationDocumentMarkerChange);
339 } 330 }
340 } 331 }
341 332
342 void DocumentMarkerController::RemoveMarkers( 333 void DocumentMarkerController::RemoveMarkers(
(...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after
873 } 864 }
874 865
875 } // namespace blink 866 } // namespace blink
876 867
877 #ifndef NDEBUG 868 #ifndef NDEBUG
878 void showDocumentMarkers(const blink::DocumentMarkerController* controller) { 869 void showDocumentMarkers(const blink::DocumentMarkerController* controller) {
879 if (controller) 870 if (controller)
880 controller->ShowMarkers(); 871 controller->ShowMarkers();
881 } 872 }
882 #endif 873 #endif
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698