Index: Source/core/dom/DocumentMarkerController.cpp |
diff --git a/Source/core/dom/DocumentMarkerController.cpp b/Source/core/dom/DocumentMarkerController.cpp |
index 5e0599349ba711e56025b65294121f24ba9c441e..31affbb10d14ead5f9f2f8de2e729a2412cc1327 100644 |
--- a/Source/core/dom/DocumentMarkerController.cpp |
+++ b/Source/core/dom/DocumentMarkerController.cpp |
@@ -83,6 +83,7 @@ inline bool DocumentMarkerController::possiblyHasMarkers(DocumentMarker::MarkerT |
DocumentMarkerController::DocumentMarkerController() |
: m_possiblyExistingMarkerTypes(0) |
+ , m_textMatchMarkersRemovedOrChanged(false) |
{ |
} |
@@ -177,7 +178,7 @@ static bool doesNotInclude(const OwnPtrWillBeMember<RenderedDocumentMarker>& mar |
return marker->endOffset() < startOffset; |
} |
-static void updateMarkerRenderedRect(Node* node, RenderedDocumentMarker& marker) |
+static bool updateMarkerRenderedRect(Node* node, RenderedDocumentMarker& marker) |
{ |
RefPtrWillBeRawPtr<Range> range = Range::create(node->document()); |
// The offsets of the marker may be out-dated, so check for exceptions. |
@@ -185,12 +186,9 @@ static void updateMarkerRenderedRect(Node* node, RenderedDocumentMarker& marker) |
range->setStart(node, marker.startOffset(), exceptionState); |
if (!exceptionState.hadException()) |
range->setEnd(node, marker.endOffset(), IGNORE_EXCEPTION); |
- if (exceptionState.hadException()) { |
- marker.invalidateRenderedRect(); |
- return; |
- } |
- |
- marker.setRenderedRect(LayoutRect(range->boundingBox())); |
+ if (exceptionState.hadException()) |
+ return marker.invalidateRenderedRect(); |
+ return marker.setRenderedRect(LayoutRect(range->boundingBox())); |
} |
// Markers are stored in order sorted by their start offset. |
@@ -498,8 +496,12 @@ void DocumentMarkerController::updateRenderedRectsForMarkers() |
for (auto& markerList : *nodeMarkers.value) { |
if (!markerList) |
continue; |
+ bool markersChanged = false; |
for (auto& marker : *markerList) |
- updateMarkerRenderedRect(const_cast<Node*>(node), *marker); |
+ markersChanged |= updateMarkerRenderedRect(const_cast<Node*>(node), *marker); |
+ |
+ if (markersChanged && markerList->first()->type() == DocumentMarker::TextMatch) |
+ m_textMatchMarkersRemovedOrChanged = true; |
} |
} |
} |
@@ -535,6 +537,9 @@ void DocumentMarkerController::removeMarkers(const MarkerRemoverPredicate& shoul |
markersToBeRemoved.append(list->at(j).get()); |
} |
+ if (markerListIndex == DocumentMarker::TextMatchMarkerIndex && !markersToBeRemoved.isEmpty()) |
+ m_textMatchMarkersRemovedOrChanged = true; |
chrishtr
2015/04/17 23:21:42
Why not just invalidate the tickmarks within each
Xianzhu
2015/04/18 02:13:48
Was concerned about multiple calls of these functi
|
+ |
for (size_t j = 0; j < markersToBeRemoved.size(); ++j) |
list->remove(list->find(markersToBeRemoved[j].get())); |
} |
@@ -600,6 +605,9 @@ void DocumentMarkerController::removeMarkersFromList(MarkerMap::iterator iterato |
if (m_markers.isEmpty()) |
m_possiblyExistingMarkerTypes = 0; |
} |
+ |
+ if (markerTypes.contains(DocumentMarker::TextMatch)) |
+ m_textMatchMarkersRemovedOrChanged = true; |
} |
void DocumentMarkerController::repaintMarkers(DocumentMarker::MarkerTypes markerTypes) |