| 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..c884e4b1825050546790d0c2a8cbc07dd23499d2 100644
|
| --- a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
|
| +++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
|
| @@ -379,6 +379,63 @@ DocumentMarker* DocumentMarkerController::MarkerAtPosition(
|
| return it == markers.end() ? nullptr : *it;
|
| }
|
|
|
| +HeapVector<std::pair<Member<Node>, Member<DocumentMarker>>>
|
| +DocumentMarkerController::MarkersIntersectingRange(
|
| + const EphemeralRange& range,
|
| + DocumentMarker::MarkerTypes types) {
|
| + return MarkersIntersectingRangeHelper(range, types);
|
| +}
|
| +
|
| +HeapVector<std::pair<Member<Node>, Member<DocumentMarker>>>
|
| +DocumentMarkerController::MarkersIntersectingRange(
|
| + const EphemeralRangeInFlatTree& range,
|
| + DocumentMarker::MarkerTypes types) {
|
| + return MarkersIntersectingRangeHelper(range, types);
|
| +}
|
| +
|
| +template <typename Strategy>
|
| +HeapVector<std::pair<Member<Node>, Member<DocumentMarker>>>
|
| +DocumentMarkerController::MarkersIntersectingRangeHelper(
|
| + 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;
|
| +}
|
| +
|
| DocumentMarkerVector DocumentMarkerController::MarkersFor(
|
| Node* node,
|
| DocumentMarker::MarkerTypes marker_types) {
|
|
|