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

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

Issue 2883503004: [DMC #7] Only create RenderedDocumentMarkers for TextMatchMarkerListImpl (Closed)
Patch Set: Rebase on InvalidateRectsForAllMarkers() refactor Created 3 years, 7 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
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 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 std::sort(result.begin(), result.end(), 388 std::sort(result.begin(), result.end(),
389 [](const Member<DocumentMarker>& marker1, 389 [](const Member<DocumentMarker>& marker1,
390 const Member<DocumentMarker>& marker2) { 390 const Member<DocumentMarker>& marker2) {
391 return marker1->StartOffset() < marker2->StartOffset(); 391 return marker1->StartOffset() < marker2->StartOffset();
392 }); 392 });
393 return result; 393 return result;
394 } 394 }
395 395
396 Vector<IntRect> DocumentMarkerController::RenderedRectsForMarkers( 396 Vector<IntRect> DocumentMarkerController::RenderedRectsForMarkers(
397 DocumentMarker::MarkerType marker_type) { 397 DocumentMarker::MarkerType marker_type) {
398 // Only TextMatch markers can have rendered rects
399 // TODO(rlanday): remove marker_type parameter
400 DCHECK_EQ(marker_type, DocumentMarker::kTextMatch);
401
398 Vector<IntRect> result; 402 Vector<IntRect> result;
399 403
400 if (!PossiblyHasMarkers(marker_type)) 404 if (!PossiblyHasMarkers(marker_type))
401 return result; 405 return result;
402 DCHECK(!(markers_.IsEmpty())); 406 DCHECK(!(markers_.IsEmpty()));
403 407
404 // outer loop: process each node 408 // outer loop: process each node
405 MarkerMap::iterator end = markers_.end(); 409 MarkerMap::iterator end = markers_.end();
406 for (MarkerMap::iterator node_iterator = markers_.begin(); 410 for (MarkerMap::iterator node_iterator = markers_.begin();
407 node_iterator != end; ++node_iterator) { 411 node_iterator != end; ++node_iterator) {
408 // inner loop; process each marker in this node 412 // inner loop; process each marker in this node
409 const Node& node = *node_iterator->key; 413 const Node& node = *node_iterator->key;
410 if (!node.isConnected()) 414 if (!node.isConnected())
411 continue; 415 continue;
412 MarkerLists* markers = node_iterator->value.Get(); 416 MarkerLists* markers = node_iterator->value.Get();
413 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) { 417 DocumentMarkerList* const list =
414 DocumentMarkerList* const list = ListForType(markers, type); 418 ListForType(markers, DocumentMarker::kTextMatch);
415 if (!list || list->IsEmpty() || type != marker_type) 419 if (!list || list->IsEmpty())
420 continue;
421
422 for (DocumentMarker* marker : list->GetMarkers()) {
423 RenderedDocumentMarker* const rendered_marker =
424 ToRenderedDocumentMarker(marker);
425 UpdateMarkerRenderedRectIfNeeded(node, *rendered_marker);
426 if (!rendered_marker->IsRendered())
416 continue; 427 continue;
417 428 result.push_back(rendered_marker->RenderedRect());
418 for (RenderedDocumentMarker* rendered_marker : list->GetMarkers()) {
419 UpdateMarkerRenderedRectIfNeeded(node, *rendered_marker);
420 if (!rendered_marker->IsRendered())
421 continue;
422 result.push_back(rendered_marker->RenderedRect());
423 }
424 } 429 }
425 } 430 }
426 431
427 return result; 432 return result;
428 } 433 }
429 434
430 static void InvalidatePaintForTickmarks(const Node& node) { 435 static void InvalidatePaintForTickmarks(const Node& node) {
431 if (FrameView* frame_view = node.GetDocument().View()) 436 if (FrameView* frame_view = node.GetDocument().View())
432 frame_view->InvalidatePaintForTickmarks(); 437 frame_view->InvalidatePaintForTickmarks();
433 } 438 }
434 439
435 void DocumentMarkerController::UpdateMarkerRenderedRectIfNeeded( 440 void DocumentMarkerController::UpdateMarkerRenderedRectIfNeeded(
436 const Node& node, 441 const Node& node,
437 RenderedDocumentMarker& marker) { 442 RenderedDocumentMarker& marker) {
438 DCHECK(!document_->View() || !document_->View()->NeedsLayout()); 443 DCHECK(!document_->View() || !document_->View()->NeedsLayout());
439 DCHECK(!document_->NeedsLayoutTreeUpdate()); 444 DCHECK(!document_->NeedsLayoutTreeUpdate());
440 if (!marker.IsValid()) 445 if (!marker.IsValid())
441 UpdateMarkerRenderedRect(node, marker); 446 UpdateMarkerRenderedRect(node, marker);
442 } 447 }
443 448
444 void DocumentMarkerController::InvalidateRectsForMarkersInNode( 449 void DocumentMarkerController::InvalidateRectsForMarkersInNode(
445 const Node& node) { 450 const Node& node) {
446 MarkerLists* markers = markers_.at(&node); 451 MarkerLists* markers = markers_.at(&node);
447 452
448 for (auto& marker_list : *markers) { 453 const DocumentMarkerList* const marker_list =
449 if (!marker_list || marker_list->IsEmpty()) 454 ListForType(markers, DocumentMarker::kTextMatch);
450 continue; 455 if (!marker_list || marker_list->IsEmpty())
456 return;
451 457
452 const HeapVector<Member<RenderedDocumentMarker>>& markers_in_list = 458 const HeapVector<Member<DocumentMarker>>& markers_in_list =
453 marker_list->GetMarkers(); 459 marker_list->GetMarkers();
454 for (auto& marker : markers_in_list) 460 for (auto& marker : markers_in_list)
455 marker->Invalidate(); 461 ToRenderedDocumentMarker(marker)->Invalidate();
456 462
457 if (markers_in_list.front()->GetType() == DocumentMarker::kTextMatch) 463 InvalidatePaintForTickmarks(node);
458 InvalidatePaintForTickmarks(node);
459 }
460 } 464 }
461 465
462 void DocumentMarkerController::InvalidateRectsForAllMarkers() { 466 void DocumentMarkerController::InvalidateRectsForAllMarkers() {
463 for (auto& node_markers : markers_) { 467 for (auto& node_markers : markers_) {
464 const Node& node = *node_markers.key; 468 const Node& node = *node_markers.key;
465 InvalidateRectsForMarkersInNode(node); 469 InvalidateRectsForMarkersInNode(node);
466 } 470 }
467 } 471 }
468 472
469 DEFINE_TRACE(DocumentMarkerController) { 473 DEFINE_TRACE(DocumentMarkerController) {
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
631 if (!markers) 635 if (!markers)
632 return false; 636 return false;
633 637
634 bool doc_dirty = false; 638 bool doc_dirty = false;
635 DocumentMarkerList* const list = 639 DocumentMarkerList* const list =
636 ListForType(markers, DocumentMarker::kTextMatch); 640 ListForType(markers, DocumentMarker::kTextMatch);
637 641
638 if (!list) 642 if (!list)
639 return false; 643 return false;
640 644
641 const HeapVector<Member<RenderedDocumentMarker>>& markers_in_list = 645 const HeapVector<Member<DocumentMarker>>& markers_in_list =
642 list->GetMarkers(); 646 list->GetMarkers();
643 // TODO(rlanday): this assumes that the markers are stored in sorted order. 647 // TODO(rlanday): this assumes that the markers are stored in sorted order.
644 // This method should probably eventually be implemented by a 648 // This method should probably eventually be implemented by a
645 // TextMatch-specific marker list 649 // TextMatch-specific marker list
646 const auto start_pos = std::upper_bound( 650 const auto start_pos = std::upper_bound(
647 markers_in_list.begin(), markers_in_list.end(), start_offset, 651 markers_in_list.begin(), markers_in_list.end(), start_offset,
648 [](size_t start_offset, const Member<DocumentMarker>& marker) { 652 [](size_t start_offset, const Member<DocumentMarker>& marker) {
649 return start_offset < marker->EndOffset(); 653 return start_offset < marker->EndOffset();
650 }); 654 });
651 for (auto marker = start_pos; marker != markers_in_list.end(); ++marker) { 655 for (auto marker = start_pos; marker != markers_in_list.end(); ++marker) {
(...skipping 18 matching lines...) Expand all
670 void DocumentMarkerController::ShowMarkers() const { 674 void DocumentMarkerController::ShowMarkers() const {
671 StringBuilder builder; 675 StringBuilder builder;
672 MarkerMap::const_iterator end = markers_.end(); 676 MarkerMap::const_iterator end = markers_.end();
673 for (MarkerMap::const_iterator node_iterator = markers_.begin(); 677 for (MarkerMap::const_iterator node_iterator = markers_.begin();
674 node_iterator != end; ++node_iterator) { 678 node_iterator != end; ++node_iterator) {
675 const Node* node = node_iterator->key; 679 const Node* node = node_iterator->key;
676 builder.Append(String::Format("%p", node)); 680 builder.Append(String::Format("%p", node));
677 MarkerLists* markers = markers_.at(node); 681 MarkerLists* markers = markers_.at(node);
678 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) { 682 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) {
679 DocumentMarkerList* const list = ListForType(markers, type); 683 DocumentMarkerList* const list = ListForType(markers, type);
680 const HeapVector<Member<RenderedDocumentMarker>>& markers_in_list = 684 const HeapVector<Member<DocumentMarker>>& markers_in_list =
681 list->GetMarkers(); 685 list->GetMarkers();
682 for (const DocumentMarker* marker : markers_in_list) { 686 for (const DocumentMarker* marker : markers_in_list) {
683 builder.Append(" "); 687 builder.Append(" ");
684 builder.AppendNumber(marker->GetType()); 688 builder.AppendNumber(marker->GetType());
685 builder.Append(":["); 689 builder.Append(":[");
686 builder.AppendNumber(marker->StartOffset()); 690 builder.AppendNumber(marker->StartOffset());
687 builder.Append(":"); 691 builder.Append(":");
688 builder.AppendNumber(marker->EndOffset()); 692 builder.AppendNumber(marker->EndOffset());
689 builder.Append("]("); 693 builder.Append("](");
690 builder.AppendNumber(marker->IsActiveMatch()); 694 builder.AppendNumber(marker->IsActiveMatch());
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
730 } 734 }
731 735
732 } // namespace blink 736 } // namespace blink
733 737
734 #ifndef NDEBUG 738 #ifndef NDEBUG
735 void showDocumentMarkers(const blink::DocumentMarkerController* controller) { 739 void showDocumentMarkers(const blink::DocumentMarkerController* controller) {
736 if (controller) 740 if (controller)
737 controller->ShowMarkers(); 741 controller->ShowMarkers();
738 } 742 }
739 #endif 743 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698