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 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |