OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |