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

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

Issue 2830033002: [DMC #1.91] Rewrite loops in DocumentMarkerController to use ListForType() (Closed)
Patch Set: 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 | « no previous file | 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 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 if (!src_markers) 245 if (!src_markers)
246 return; 246 return;
247 247
248 if (!markers_.Contains(dst_node)) { 248 if (!markers_.Contains(dst_node)) {
249 markers_.insert(dst_node, 249 markers_.insert(dst_node,
250 new MarkerLists(DocumentMarker::kMarkerTypeIndexesCount)); 250 new MarkerLists(DocumentMarker::kMarkerTypeIndexesCount));
251 } 251 }
252 MarkerLists* dst_markers = markers_.at(dst_node); 252 MarkerLists* dst_markers = markers_.at(dst_node);
253 253
254 bool doc_dirty = false; 254 bool doc_dirty = false;
255 for (size_t marker_list_index = 0; marker_list_index < src_markers->size(); 255 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) {
256 ++marker_list_index) { 256 MarkerList* src_list = ListForType(src_markers, type);
257 MarkerList* src_list = src_markers->at(marker_list_index);
258 if (!src_list) 257 if (!src_list)
259 continue; 258 continue;
260 259
261 if (!dst_markers->at(marker_list_index)) 260 if (!ListForType(dst_markers, type))
262 dst_markers->at(marker_list_index) = new MarkerList; 261 ListForType(dst_markers, type) = new MarkerList;
263 MarkerList* dst_list = dst_markers->at(marker_list_index); 262 MarkerList* dst_list = ListForType(dst_markers, type);
264 263
265 if (DocumentMarkerListEditor::MoveMarkers(src_list, length, dst_list)) 264 if (DocumentMarkerListEditor::MoveMarkers(src_list, length, dst_list))
266 doc_dirty = true; 265 doc_dirty = true;
267 } 266 }
268 267
269 // repaint the affected node 268 // repaint the affected node
270 if (doc_dirty && dst_node->GetLayoutObject()) { 269 if (doc_dirty && dst_node->GetLayoutObject()) {
271 dst_node->GetLayoutObject()->SetShouldDoFullPaintInvalidation( 270 dst_node->GetLayoutObject()->SetShouldDoFullPaintInvalidation(
272 kPaintInvalidationDocumentMarkerChange); 271 kPaintInvalidationDocumentMarkerChange);
273 } 272 }
(...skipping 10 matching lines...) Expand all
284 if (!PossiblyHasMarkers(marker_types)) 283 if (!PossiblyHasMarkers(marker_types))
285 return; 284 return;
286 DCHECK(!(markers_.IsEmpty())); 285 DCHECK(!(markers_.IsEmpty()));
287 286
288 MarkerLists* markers = markers_.at(node); 287 MarkerLists* markers = markers_.at(node);
289 if (!markers) 288 if (!markers)
290 return; 289 return;
291 290
292 bool doc_dirty = false; 291 bool doc_dirty = false;
293 size_t empty_lists_count = 0; 292 size_t empty_lists_count = 0;
294 for (size_t marker_list_index = 0; 293 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) {
295 marker_list_index < DocumentMarker::kMarkerTypeIndexesCount; 294 Member<MarkerList>& list = ListForType(markers, type);
296 ++marker_list_index) {
297 Member<MarkerList>& list = (*markers)[marker_list_index];
298 if (!list || list->IsEmpty()) { 295 if (!list || list->IsEmpty()) {
299 if (list.Get() && list->IsEmpty()) 296 if (list.Get() && list->IsEmpty())
300 list.Clear(); 297 list.Clear();
301 ++empty_lists_count; 298 ++empty_lists_count;
302 continue; 299 continue;
303 } 300 }
304 if (!marker_types.Contains((*list->begin())->GetType())) 301 if (!marker_types.Contains(type))
305 continue; 302 continue;
306 303
307 if (DocumentMarkerListEditor::RemoveMarkers(list, start_offset, length)) 304 if (DocumentMarkerListEditor::RemoveMarkers(list, start_offset, length))
308 doc_dirty = true; 305 doc_dirty = true;
309 306
310 if (list->IsEmpty()) { 307 if (list->IsEmpty()) {
311 list.Clear(); 308 list.Clear();
312 ++empty_lists_count; 309 ++empty_lists_count;
313 } 310 }
314 } 311 }
(...skipping 13 matching lines...) Expand all
328 325
329 DocumentMarkerVector DocumentMarkerController::MarkersFor( 326 DocumentMarkerVector DocumentMarkerController::MarkersFor(
330 Node* node, 327 Node* node,
331 DocumentMarker::MarkerTypes marker_types) { 328 DocumentMarker::MarkerTypes marker_types) {
332 DocumentMarkerVector result; 329 DocumentMarkerVector result;
333 330
334 MarkerLists* markers = markers_.at(node); 331 MarkerLists* markers = markers_.at(node);
335 if (!markers) 332 if (!markers)
336 return result; 333 return result;
337 334
338 for (size_t marker_list_index = 0; 335 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) {
339 marker_list_index < DocumentMarker::kMarkerTypeIndexesCount; 336 Member<MarkerList>& list = ListForType(markers, type);
340 ++marker_list_index) {
341 Member<MarkerList>& list = (*markers)[marker_list_index];
342 if (!list || list->IsEmpty() || 337 if (!list || list->IsEmpty() ||
343 !marker_types.Contains((*list->begin())->GetType())) 338 !marker_types.Contains((*list->begin())->GetType()))
344 continue; 339 continue;
345 340
346 for (size_t i = 0; i < list->size(); ++i) 341 for (size_t i = 0; i < list->size(); ++i)
347 result.push_back(list->at(i).Get()); 342 result.push_back(list->at(i).Get());
348 } 343 }
349 344
350 std::sort(result.begin(), result.end(), 345 std::sort(result.begin(), result.end(),
351 [](const Member<DocumentMarker>& marker1, 346 [](const Member<DocumentMarker>& marker1,
352 const Member<DocumentMarker>& marker2) { 347 const Member<DocumentMarker>& marker2) {
353 return marker1->StartOffset() < marker2->StartOffset(); 348 return marker1->StartOffset() < marker2->StartOffset();
354 }); 349 });
355 return result; 350 return result;
356 } 351 }
357 352
358 DocumentMarkerVector DocumentMarkerController::Markers() { 353 DocumentMarkerVector DocumentMarkerController::Markers() {
359 DocumentMarkerVector result; 354 DocumentMarkerVector result;
360 for (MarkerMap::iterator i = markers_.begin(); i != markers_.end(); ++i) { 355 for (MarkerMap::iterator i = markers_.begin(); i != markers_.end(); ++i) {
361 MarkerLists* markers = i->value.Get(); 356 MarkerLists* markers = i->value.Get();
362 for (size_t marker_list_index = 0; 357 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) {
363 marker_list_index < DocumentMarker::kMarkerTypeIndexesCount; 358 Member<MarkerList>& list = ListForType(markers, type);
364 ++marker_list_index) {
365 Member<MarkerList>& list = (*markers)[marker_list_index];
366 for (size_t j = 0; list.Get() && j < list->size(); ++j) 359 for (size_t j = 0; list.Get() && j < list->size(); ++j)
367 result.push_back(list->at(j).Get()); 360 result.push_back(list->at(j).Get());
368 } 361 }
369 } 362 }
370 std::sort(result.begin(), result.end(), 363 std::sort(result.begin(), result.end(),
371 [](const Member<DocumentMarker>& marker1, 364 [](const Member<DocumentMarker>& marker1,
372 const Member<DocumentMarker>& marker2) { 365 const Member<DocumentMarker>& marker2) {
373 return marker1->StartOffset() < marker2->StartOffset(); 366 return marker1->StartOffset() < marker2->StartOffset();
374 }); 367 });
375 return result; 368 return result;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 409
417 // outer loop: process each node 410 // outer loop: process each node
418 MarkerMap::iterator end = markers_.end(); 411 MarkerMap::iterator end = markers_.end();
419 for (MarkerMap::iterator node_iterator = markers_.begin(); 412 for (MarkerMap::iterator node_iterator = markers_.begin();
420 node_iterator != end; ++node_iterator) { 413 node_iterator != end; ++node_iterator) {
421 // inner loop; process each marker in this node 414 // inner loop; process each marker in this node
422 const Node& node = *node_iterator->key; 415 const Node& node = *node_iterator->key;
423 if (!node.isConnected()) 416 if (!node.isConnected())
424 continue; 417 continue;
425 MarkerLists* markers = node_iterator->value.Get(); 418 MarkerLists* markers = node_iterator->value.Get();
426 for (size_t marker_list_index = 0; 419 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) {
427 marker_list_index < DocumentMarker::kMarkerTypeIndexesCount; 420 Member<MarkerList>& list = ListForType(markers, type);
428 ++marker_list_index) { 421 if (!list || list->IsEmpty() || type != marker_type)
429 Member<MarkerList>& list = (*markers)[marker_list_index];
430 if (!list || list->IsEmpty() ||
431 (*list->begin())->GetType() != marker_type)
432 continue; 422 continue;
433 for (unsigned marker_index = 0; marker_index < list->size(); 423 for (unsigned marker_index = 0; marker_index < list->size();
434 ++marker_index) { 424 ++marker_index) {
435 RenderedDocumentMarker* marker = list->at(marker_index).Get(); 425 RenderedDocumentMarker* marker = list->at(marker_index).Get();
436 UpdateMarkerRenderedRectIfNeeded(node, *marker); 426 UpdateMarkerRenderedRectIfNeeded(node, *marker);
437 if (!marker->IsRendered()) 427 if (!marker->IsRendered())
438 continue; 428 continue;
439 result.push_back(marker->RenderedRect()); 429 result.push_back(marker->RenderedRect());
440 } 430 }
441 } 431 }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
507 if (iterator != markers_.end()) 497 if (iterator != markers_.end())
508 RemoveMarkersFromList(iterator, marker_types); 498 RemoveMarkersFromList(iterator, marker_types);
509 } 499 }
510 500
511 void DocumentMarkerController::RemoveMarkers( 501 void DocumentMarkerController::RemoveMarkers(
512 const MarkerRemoverPredicate& should_remove_marker) { 502 const MarkerRemoverPredicate& should_remove_marker) {
513 for (auto& node_markers : markers_) { 503 for (auto& node_markers : markers_) {
514 const Node& node = *node_markers.key; 504 const Node& node = *node_markers.key;
515 if (!node.IsTextNode()) // MarkerRemoverPredicate requires a Text node. 505 if (!node.IsTextNode()) // MarkerRemoverPredicate requires a Text node.
516 continue; 506 continue;
517 MarkerLists& markers = *node_markers.value; 507 MarkerLists* markers = node_markers.value;
518 for (size_t marker_list_index = 0; 508 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) {
519 marker_list_index < DocumentMarker::kMarkerTypeIndexesCount; 509 Member<MarkerList>& list = ListForType(markers, type);
520 ++marker_list_index) {
521 Member<MarkerList>& list = markers[marker_list_index];
522 if (!list) 510 if (!list)
523 continue; 511 continue;
524 bool removed_markers = false; 512 bool removed_markers = false;
525 for (size_t j = list->size(); j > 0; --j) { 513 for (size_t j = list->size(); j > 0; --j) {
526 if (should_remove_marker(*list->at(j - 1), 514 if (should_remove_marker(*list->at(j - 1),
527 static_cast<const Text&>(node))) { 515 static_cast<const Text&>(node))) {
528 list->erase(j - 1); 516 list->erase(j - 1);
529 removed_markers = true; 517 removed_markers = true;
530 } 518 }
531 } 519 }
532 if (removed_markers && 520 if (removed_markers && type == DocumentMarker::kTextMatch)
533 marker_list_index == DocumentMarker::kTextMatchMarkerIndex)
534 InvalidatePaintForTickmarks(node); 521 InvalidatePaintForTickmarks(node);
535 } 522 }
536 } 523 }
537 } 524 }
538 525
539 void DocumentMarkerController::RemoveMarkers( 526 void DocumentMarkerController::RemoveMarkers(
540 DocumentMarker::MarkerTypes marker_types) { 527 DocumentMarker::MarkerTypes marker_types) {
541 if (!PossiblyHasMarkers(marker_types)) 528 if (!PossiblyHasMarkers(marker_types))
542 return; 529 return;
543 DCHECK(!markers_.IsEmpty()); 530 DCHECK(!markers_.IsEmpty());
(...skipping 16 matching lines...) Expand all
560 bool needs_repainting = false; 547 bool needs_repainting = false;
561 bool node_can_be_removed; 548 bool node_can_be_removed;
562 549
563 size_t empty_lists_count = 0; 550 size_t empty_lists_count = 0;
564 if (marker_types == DocumentMarker::AllMarkers()) { 551 if (marker_types == DocumentMarker::AllMarkers()) {
565 needs_repainting = true; 552 needs_repainting = true;
566 node_can_be_removed = true; 553 node_can_be_removed = true;
567 } else { 554 } else {
568 MarkerLists* markers = iterator->value.Get(); 555 MarkerLists* markers = iterator->value.Get();
569 556
570 for (size_t marker_list_index = 0; 557 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) {
571 marker_list_index < DocumentMarker::kMarkerTypeIndexesCount; 558 Member<MarkerList>& list = ListForType(markers, type);
572 ++marker_list_index) {
573 Member<MarkerList>& list = (*markers)[marker_list_index];
574 if (!list || list->IsEmpty()) { 559 if (!list || list->IsEmpty()) {
575 if (list.Get() && list->IsEmpty()) 560 if (list.Get() && list->IsEmpty())
576 list.Clear(); 561 list.Clear();
577 ++empty_lists_count; 562 ++empty_lists_count;
578 continue; 563 continue;
579 } 564 }
580 if (marker_types.Contains((*list->begin())->GetType())) { 565 if (marker_types.Contains(type)) {
581 list->clear(); 566 list->clear();
582 list.Clear(); 567 list.Clear();
583 ++empty_lists_count; 568 ++empty_lists_count;
584 needs_repainting = true; 569 needs_repainting = true;
585 } 570 }
586 } 571 }
587 572
588 node_can_be_removed = 573 node_can_be_removed =
589 empty_lists_count == DocumentMarker::kMarkerTypeIndexesCount; 574 empty_lists_count == DocumentMarker::kMarkerTypeIndexesCount;
590 } 575 }
(...skipping 20 matching lines...) Expand all
611 return; 596 return;
612 DCHECK(!markers_.IsEmpty()); 597 DCHECK(!markers_.IsEmpty());
613 598
614 // outer loop: process each markered node in the document 599 // outer loop: process each markered node in the document
615 MarkerMap::iterator end = markers_.end(); 600 MarkerMap::iterator end = markers_.end();
616 for (MarkerMap::iterator i = markers_.begin(); i != end; ++i) { 601 for (MarkerMap::iterator i = markers_.begin(); i != end; ++i) {
617 const Node* node = i->key; 602 const Node* node = i->key;
618 603
619 // inner loop: process each marker in the current node 604 // inner loop: process each marker in the current node
620 MarkerLists* markers = i->value.Get(); 605 MarkerLists* markers = i->value.Get();
621 for (size_t marker_list_index = 0; 606 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) {
622 marker_list_index < DocumentMarker::kMarkerTypeIndexesCount; 607 Member<MarkerList>& list = ListForType(markers, type);
623 ++marker_list_index) { 608 if (!list || list->IsEmpty() || !marker_types.Contains(type))
624 Member<MarkerList>& list = (*markers)[marker_list_index];
625 if (!list || list->IsEmpty() ||
626 !marker_types.Contains((*list->begin())->GetType()))
627 continue; 609 continue;
628 610
629 // cause the node to be redrawn 611 // cause the node to be redrawn
630 if (LayoutObject* layout_object = node->GetLayoutObject()) { 612 if (LayoutObject* layout_object = node->GetLayoutObject()) {
631 layout_object->SetShouldDoFullPaintInvalidation( 613 layout_object->SetShouldDoFullPaintInvalidation(
632 kPaintInvalidationDocumentMarkerChange); 614 kPaintInvalidationDocumentMarkerChange);
633 break; 615 break;
634 } 616 }
635 } 617 }
636 } 618 }
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 682
701 #ifndef NDEBUG 683 #ifndef NDEBUG
702 void DocumentMarkerController::ShowMarkers() const { 684 void DocumentMarkerController::ShowMarkers() const {
703 StringBuilder builder; 685 StringBuilder builder;
704 MarkerMap::const_iterator end = markers_.end(); 686 MarkerMap::const_iterator end = markers_.end();
705 for (MarkerMap::const_iterator node_iterator = markers_.begin(); 687 for (MarkerMap::const_iterator node_iterator = markers_.begin();
706 node_iterator != end; ++node_iterator) { 688 node_iterator != end; ++node_iterator) {
707 const Node* node = node_iterator->key; 689 const Node* node = node_iterator->key;
708 builder.Append(String::Format("%p", node)); 690 builder.Append(String::Format("%p", node));
709 MarkerLists* markers = markers_.at(node); 691 MarkerLists* markers = markers_.at(node);
710 for (size_t marker_list_index = 0; 692 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) {
711 marker_list_index < DocumentMarker::kMarkerTypeIndexesCount; 693 Member<MarkerList>& list = ListForType(markers, type);
712 ++marker_list_index) {
713 Member<MarkerList>& list = (*markers)[marker_list_index];
714 for (unsigned marker_index = 0; list.Get() && marker_index < list->size(); 694 for (unsigned marker_index = 0; list.Get() && marker_index < list->size();
715 ++marker_index) { 695 ++marker_index) {
716 DocumentMarker* marker = list->at(marker_index).Get(); 696 DocumentMarker* marker = list->at(marker_index).Get();
717 builder.Append(" "); 697 builder.Append(" ");
718 builder.AppendNumber(marker->GetType()); 698 builder.AppendNumber(marker->GetType());
719 builder.Append(":["); 699 builder.Append(":[");
720 builder.AppendNumber(marker->StartOffset()); 700 builder.AppendNumber(marker->StartOffset());
721 builder.Append(":"); 701 builder.Append(":");
722 builder.AppendNumber(marker->EndOffset()); 702 builder.AppendNumber(marker->EndOffset());
723 builder.Append("]("); 703 builder.Append("](");
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
765 } 745 }
766 746
767 } // namespace blink 747 } // namespace blink
768 748
769 #ifndef NDEBUG 749 #ifndef NDEBUG
770 void showDocumentMarkers(const blink::DocumentMarkerController* controller) { 750 void showDocumentMarkers(const blink::DocumentMarkerController* controller) {
771 if (controller) 751 if (controller)
772 controller->ShowMarkers(); 752 controller->ShowMarkers();
773 } 753 }
774 #endif 754 #endif
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698