Chromium Code Reviews| 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) |