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 7b357808a2677bfb48a2d14efa920a0d499b80e9..924904c5adb43b2a3c0ae055b6aadda8b93cae39 100644 |
--- a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp |
+++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp |
@@ -398,6 +398,48 @@ DocumentMarker* DocumentMarkerController::MarkerAtPosition( |
return nullptr; |
} |
+HeapVector<std::pair<Member<Node>, Member<DocumentMarker>>> |
+DocumentMarkerController::MarkersIntersectingRange( |
+ const EphemeralRangeInFlatTree& 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) { |