Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(638)

Unified Diff: Source/core/dom/DocumentMarkerController.cpp

Issue 1053123007: Invalidate paint of tickmarks on document change (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)

Powered by Google App Engine
This is Rietveld 408576698