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

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: 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 376 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 Node* start_container = range.StartPosition().ComputeContainerNode(); 387 Node* start_container = range.StartPosition().ComputeContainerNode();
388 DCHECK(start_container); 388 DCHECK(start_container);
389 unsigned start_offset = static_cast<unsigned>( 389 unsigned start_offset = static_cast<unsigned>(
390 range.StartPosition().ComputeOffsetInContainerNode()); 390 range.StartPosition().ComputeOffsetInContainerNode());
391 Node* end_container = range.EndPosition().ComputeContainerNode(); 391 Node* end_container = range.EndPosition().ComputeContainerNode();
392 DCHECK(end_container); 392 DCHECK(end_container);
393 unsigned end_offset = 393 unsigned end_offset =
394 static_cast<unsigned>(range.EndPosition().ComputeOffsetInContainerNode()); 394 static_cast<unsigned>(range.EndPosition().ComputeOffsetInContainerNode());
395 395
396 for (Node& node : range.Nodes()) { 396 for (Node& node : range.Nodes()) {
397 for (DocumentMarker* marker : MarkersFor(&node)) { 397 for (DocumentMarker* const marker : MarkersFor(&node)) {
398 if (!marker_types.Contains(marker->GetType())) 398 if (!marker_types.Contains(marker->GetType()))
399 continue; 399 continue;
400 if (node == start_container && marker->EndOffset() <= start_offset) 400 if (node == start_container && marker->EndOffset() <= start_offset)
401 continue; 401 continue;
402 if (node == end_container && marker->StartOffset() >= end_offset) 402 if (node == end_container && marker->StartOffset() >= end_offset)
403 continue; 403 continue;
404 found_markers.push_back(marker); 404 found_markers.push_back(marker);
405 } 405 }
406 } 406 }
407 return found_markers; 407 return found_markers;
408 } 408 }
409 409
410 Vector<IntRect> DocumentMarkerController::RenderedRectsForMarkers( 410 Vector<IntRect> DocumentMarkerController::RenderedRectsForMarkers(
411 DocumentMarker::MarkerType marker_type) { 411 DocumentMarker::MarkerType marker_type) {
Xiaocheng 2017/05/12 21:16:10 At which step are we going to remove |marker_type|
rlanday 2017/05/12 22:02:55 I think there's a handful of API changes we want t
yosin_UTC9 2017/05/18 05:35:31 Can we have DCHECK_EQ(marker_type, DocumentMakerTy
412 Vector<IntRect> result; 412 Vector<IntRect> result;
413 413
414 if (!PossiblyHasMarkers(marker_type)) 414 if (!PossiblyHasMarkers(marker_type))
415 return result; 415 return result;
416 DCHECK(!(markers_.IsEmpty())); 416 DCHECK(!(markers_.IsEmpty()));
417 417
418 // outer loop: process each node 418 // outer loop: process each node
419 MarkerMap::iterator end = markers_.end(); 419 MarkerMap::iterator end = markers_.end();
420 for (MarkerMap::iterator node_iterator = markers_.begin(); 420 for (MarkerMap::iterator node_iterator = markers_.begin();
421 node_iterator != end; ++node_iterator) { 421 node_iterator != end; ++node_iterator) {
422 // inner loop; process each marker in this node 422 // inner loop; process each marker in this node
423 const Node& node = *node_iterator->key; 423 const Node& node = *node_iterator->key;
424 if (!node.isConnected()) 424 if (!node.isConnected())
425 continue; 425 continue;
426 MarkerLists* markers = node_iterator->value.Get(); 426 MarkerLists* markers = node_iterator->value.Get();
427 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) { 427 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) {
428 DocumentMarkerList* const list = ListForType(markers, type); 428 DocumentMarkerList* const list = ListForType(markers, type);
429 if (!list || list->IsEmpty() || type != marker_type) 429 if (!list || list->IsEmpty() || type != marker_type)
430 continue; 430 continue;
431 431
432 for (RenderedDocumentMarker* rendered_marker : list->GetMarkers()) { 432 for (DocumentMarker* marker : list->GetMarkers()) {
433 RenderedDocumentMarker* const rendered_marker =
434 ToRenderedDocumentMarker(marker);
433 UpdateMarkerRenderedRectIfNeeded(node, *rendered_marker); 435 UpdateMarkerRenderedRectIfNeeded(node, *rendered_marker);
434 if (!rendered_marker->IsRendered()) 436 if (!rendered_marker->IsRendered())
435 continue; 437 continue;
436 result.push_back(rendered_marker->RenderedRect()); 438 result.push_back(rendered_marker->RenderedRect());
437 } 439 }
438 } 440 }
439 } 441 }
440 442
441 return result; 443 return result;
442 } 444 }
443 445
444 static void InvalidatePaintForTickmarks(const Node& node) { 446 static void InvalidatePaintForTickmarks(const Node& node) {
445 if (FrameView* frame_view = node.GetDocument().View()) 447 if (FrameView* frame_view = node.GetDocument().View())
446 frame_view->InvalidatePaintForTickmarks(); 448 frame_view->InvalidatePaintForTickmarks();
447 } 449 }
448 450
449 void DocumentMarkerController::UpdateMarkerRenderedRectIfNeeded( 451 void DocumentMarkerController::UpdateMarkerRenderedRectIfNeeded(
450 const Node& node, 452 const Node& node,
451 RenderedDocumentMarker& marker) { 453 RenderedDocumentMarker& marker) {
452 DCHECK(!document_->View() || !document_->View()->NeedsLayout()); 454 DCHECK(!document_->View() || !document_->View()->NeedsLayout());
453 DCHECK(!document_->NeedsLayoutTreeUpdate()); 455 DCHECK(!document_->NeedsLayoutTreeUpdate());
454 if (!marker.IsValid()) 456 if (!marker.IsValid())
455 UpdateMarkerRenderedRect(node, marker); 457 UpdateMarkerRenderedRect(node, marker);
456 } 458 }
457 459
458 void DocumentMarkerController::InvalidateRectsForMarkersInNode( 460 void DocumentMarkerController::InvalidateRectsForMarkersInNode(
459 const Node& node) { 461 const Node& node) {
460 MarkerLists* markers = markers_.at(&node); 462 MarkerLists* markers = markers_.at(&node);
461 463
462 for (auto& marker_list : *markers) { 464 const DocumentMarkerList* const marker_list =
463 if (!marker_list || marker_list->IsEmpty()) 465 ListForType(markers, DocumentMarker::kTextMatch);
464 continue; 466 if (!marker_list || marker_list->IsEmpty())
467 return;
465 468
466 const HeapVector<Member<RenderedDocumentMarker>>& markers_in_list = 469 const HeapVector<Member<DocumentMarker>>& markers_in_list =
467 marker_list->GetMarkers(); 470 marker_list->GetMarkers();
468 for (auto& marker : markers_in_list) 471 for (auto& marker : markers_in_list)
469 marker->Invalidate(); 472 ToRenderedDocumentMarker(marker)->Invalidate();
470 473
471 if (markers_in_list.front()->GetType() == DocumentMarker::kTextMatch) 474 InvalidatePaintForTickmarks(node);
472 InvalidatePaintForTickmarks(node);
473 }
474 } 475 }
475 476
476 void DocumentMarkerController::InvalidateRectsForAllMarkers() { 477 void DocumentMarkerController::InvalidateRectsForAllMarkers() {
477 for (auto& node_markers : markers_) { 478 for (auto& node_markers : markers_) {
478 const Node& node = *node_markers.key; 479 const Node& node = *node_markers.key;
479 for (auto& marker_list : *node_markers.value) { 480 for (auto& marker_list : *node_markers.value) {
480 if (!marker_list || marker_list->IsEmpty()) 481 if (!marker_list || marker_list->IsEmpty())
481 continue; 482 continue;
482 483
483 const HeapVector<Member<RenderedDocumentMarker>>& markers_in_list = 484 const HeapVector<Member<DocumentMarker>>& markers_in_list =
484 marker_list->GetMarkers(); 485 marker_list->GetMarkers();
485 for (DocumentMarker* marker : markers_in_list) 486 for (DocumentMarker* marker : markers_in_list)
486 ToRenderedDocumentMarker(marker)->Invalidate(); 487 ToRenderedDocumentMarker(marker)->Invalidate();
487 488
488 if (markers_in_list.front()->GetType() == DocumentMarker::kTextMatch) 489 if (markers_in_list.front()->GetType() == DocumentMarker::kTextMatch)
489 InvalidatePaintForTickmarks(node); 490 InvalidatePaintForTickmarks(node);
490 } 491 }
491 } 492 }
492 } 493 }
493 494
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
656 if (!markers) 657 if (!markers)
657 return false; 658 return false;
658 659
659 bool doc_dirty = false; 660 bool doc_dirty = false;
660 DocumentMarkerList* const list = 661 DocumentMarkerList* const list =
661 ListForType(markers, DocumentMarker::kTextMatch); 662 ListForType(markers, DocumentMarker::kTextMatch);
662 663
663 if (!list) 664 if (!list)
664 return false; 665 return false;
665 666
666 const HeapVector<Member<RenderedDocumentMarker>>& markers_in_list = 667 const HeapVector<Member<DocumentMarker>>& markers_in_list =
667 list->GetMarkers(); 668 list->GetMarkers();
668 // TODO(rlanday): this assumes that the markers are stored in sorted order. 669 // TODO(rlanday): this assumes that the markers are stored in sorted order.
669 // This method should probably eventually be implemented by a 670 // This method should probably eventually be implemented by a
670 // TextMatch-specific marker list 671 // TextMatch-specific marker list
671 const auto start_pos = std::upper_bound( 672 const auto start_pos = std::upper_bound(
672 markers_in_list.begin(), markers_in_list.end(), start_offset, 673 markers_in_list.begin(), markers_in_list.end(), start_offset,
673 [](size_t start_offset, const Member<DocumentMarker>& marker) { 674 [](size_t start_offset, const Member<DocumentMarker>& marker) {
674 return start_offset < marker->EndOffset(); 675 return start_offset < marker->EndOffset();
675 }); 676 });
676 for (auto marker = start_pos; marker != markers_in_list.end(); ++marker) { 677 for (auto marker = start_pos; marker != markers_in_list.end(); ++marker) {
(...skipping 18 matching lines...) Expand all
695 void DocumentMarkerController::ShowMarkers() const { 696 void DocumentMarkerController::ShowMarkers() const {
696 StringBuilder builder; 697 StringBuilder builder;
697 MarkerMap::const_iterator end = markers_.end(); 698 MarkerMap::const_iterator end = markers_.end();
698 for (MarkerMap::const_iterator node_iterator = markers_.begin(); 699 for (MarkerMap::const_iterator node_iterator = markers_.begin();
699 node_iterator != end; ++node_iterator) { 700 node_iterator != end; ++node_iterator) {
700 const Node* node = node_iterator->key; 701 const Node* node = node_iterator->key;
701 builder.Append(String::Format("%p", node)); 702 builder.Append(String::Format("%p", node));
702 MarkerLists* markers = markers_.at(node); 703 MarkerLists* markers = markers_.at(node);
703 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) { 704 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) {
704 DocumentMarkerList* const list = ListForType(markers, type); 705 DocumentMarkerList* const list = ListForType(markers, type);
705 const HeapVector<Member<RenderedDocumentMarker>>& markers_in_list = 706 const HeapVector<Member<DocumentMarker>>& markers_in_list =
706 list->GetMarkers(); 707 list->GetMarkers();
707 for (const DocumentMarker* marker : markers_in_list) { 708 for (const DocumentMarker* marker : markers_in_list) {
708 builder.Append(" "); 709 builder.Append(" ");
709 builder.AppendNumber(marker->GetType()); 710 builder.AppendNumber(marker->GetType());
710 builder.Append(":["); 711 builder.Append(":[");
711 builder.AppendNumber(marker->StartOffset()); 712 builder.AppendNumber(marker->StartOffset());
712 builder.Append(":"); 713 builder.Append(":");
713 builder.AppendNumber(marker->EndOffset()); 714 builder.AppendNumber(marker->EndOffset());
714 builder.Append("]("); 715 builder.Append("](");
715 builder.AppendNumber(marker->IsActiveMatch()); 716 builder.AppendNumber(marker->IsActiveMatch());
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
755 } 756 }
756 757
757 } // namespace blink 758 } // namespace blink
758 759
759 #ifndef NDEBUG 760 #ifndef NDEBUG
760 void showDocumentMarkers(const blink::DocumentMarkerController* controller) { 761 void showDocumentMarkers(const blink::DocumentMarkerController* controller) {
761 if (controller) 762 if (controller)
762 controller->ShowMarkers(); 763 controller->ShowMarkers();
763 } 764 }
764 #endif 765 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698