Chromium Code Reviews| Index: third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp |
| diff --git a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp |
| index a9309fae840172d93c5b50057c0fa4918ed1b977..2988af65c6bf6494138718e00178f2f5e072c8f8 100644 |
| --- a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp |
| +++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp |
| @@ -379,6 +379,58 @@ DocumentMarker* DocumentMarkerController::MarkerAtPosition( |
| return it == markers.end() ? nullptr : *it; |
| } |
| +template <typename Strategy> |
| +HeapVector<std::pair<Member<Node>, Member<DocumentMarker>>> |
| +DocumentMarkerController::MarkersIntersectingRange( |
| + const EphemeralRangeTemplate<Strategy>& range, |
| + DocumentMarker::MarkerTypes types) { |
| + HeapVector<std::pair<Member<Node>, Member<DocumentMarker>>> node_marker_pairs; |
| + if (!PossiblyHasMarkers(types)) |
| + return node_marker_pairs; |
| + |
| + Node* const range_start_container = |
| + range.StartPosition().ComputeContainerNode(); |
| + const unsigned range_start_offset = |
| + range.StartPosition().ComputeOffsetInContainerNode(); |
| + Node* const range_end_container = range.EndPosition().ComputeContainerNode(); |
| + const unsigned range_end_offset = |
| + range.EndPosition().ComputeOffsetInContainerNode(); |
| + |
| + for (Node& node : range.Nodes()) { |
| + MarkerLists* const markers = markers_.at(&node); |
| + if (!markers) |
| + continue; |
| + |
| + for (DocumentMarker::MarkerType type : types) { |
| + const DocumentMarkerList* const list = ListForType(markers, type); |
| + if (!list) |
| + continue; |
| + |
| + const unsigned start_offset = |
| + node == range_start_container ? range_start_offset : 0; |
| + const unsigned end_offset = node == range_end_container |
| + ? range_end_offset |
| + : node.MaxCharacterOffset(); |
| + |
| + const DocumentMarkerVector& markers_from_this_list = |
| + list->MarkersIntersectingRange(start_offset, end_offset); |
| + for (DocumentMarker* marker : markers_from_this_list) |
| + node_marker_pairs.push_back(std::make_pair(&node, marker)); |
| + } |
| + } |
| + |
| + return node_marker_pairs; |
| +} |
| + |
| +template HeapVector<std::pair<Member<Node>, Member<DocumentMarker>>> |
|
rlanday
2017/06/24 01:08:29
I probably need CORE_TEMPLATE_EXPORT here to fix t
|
| +DocumentMarkerController::MarkersIntersectingRange(const EphemeralRange&, |
| + DocumentMarker::MarkerTypes); |
| + |
| +template HeapVector<std::pair<Member<Node>, Member<DocumentMarker>>> |
| +DocumentMarkerController::MarkersIntersectingRange( |
| + const EphemeralRangeInFlatTree&, |
| + DocumentMarker::MarkerTypes); |
| + |
| DocumentMarkerVector DocumentMarkerController::MarkersFor( |
| Node* node, |
| DocumentMarker::MarkerTypes marker_types) { |