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

Unified Diff: third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp

Issue 2034363002: Update document marker rects lazily in frame (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix test Created 4 years, 6 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: 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 5a5d4e196e2c70498235aa3a71941d13f7209e37..ed6699fed74eda54db3a4f00fd3a3a34b6629dbd 100644
--- a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
+++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
@@ -84,8 +84,9 @@ inline bool DocumentMarkerController::possiblyHasMarkers(DocumentMarker::MarkerT
return m_possiblyExistingMarkerTypes.intersects(types);
}
-DocumentMarkerController::DocumentMarkerController()
+DocumentMarkerController::DocumentMarkerController(const Document& document)
: m_possiblyExistingMarkerTypes(0)
+ , m_document(&document)
{
}
@@ -187,17 +188,17 @@ static bool doesNotInclude(const Member<RenderedDocumentMarker>& marker, size_t
return marker->endOffset() < startOffset;
}
-static bool updateMarkerRenderedRect(Node* node, RenderedDocumentMarker& marker)
+static bool updateMarkerRenderedRect(const Node& node, RenderedDocumentMarker& marker)
{
- Range* range = Range::create(node->document());
+ Range* range = Range::create(node.document());
// The offsets of the marker may be out-dated, so check for exceptions.
TrackExceptionState exceptionState;
- range->setStart(node, marker.startOffset(), exceptionState);
+ range->setStart(&const_cast<Node&>(node), marker.startOffset(), exceptionState);
if (!exceptionState.hadException())
- range->setEnd(node, marker.endOffset(), IGNORE_EXCEPTION);
+ range->setEnd(&const_cast<Node&>(node), marker.endOffset(), IGNORE_EXCEPTION);
if (exceptionState.hadException()) {
range->dispose();
- return marker.invalidateRenderedRect();
+ return marker.nullifyRenderedRect();
}
// TODO(yosin): Once we have a |EphemeralRange| version of |boundingBox()|,
// we should use it instead of |Range| version.
@@ -230,7 +231,7 @@ void DocumentMarkerController::addMarker(Node* node, const DocumentMarker& newMa
Member<MarkerList>& list = markers->at(markerListIndex);
RenderedDocumentMarker* newRenderedMarker = RenderedDocumentMarker::create(newMarker);
- updateMarkerRenderedRect(node, *newRenderedMarker);
+ updateMarkerRenderedRect(*node, *newRenderedMarker);
if (list->isEmpty() || list->last()->endOffset() < newMarker.startOffset()) {
list->append(newRenderedMarker);
} else {
@@ -396,14 +397,12 @@ DocumentMarker* DocumentMarkerController::markerContainingPoint(const LayoutPoin
DCHECK(!(m_markers.isEmpty()));
// outer loop: process each node that contains any markers
- MarkerMap::iterator end = m_markers.end();
- for (MarkerMap::iterator nodeIterator = m_markers.begin(); nodeIterator != end; ++nodeIterator) {
+ for (auto& nodeMarkers : m_markers) {
+ const Node& node = *nodeMarkers.key;
// inner loop; process each marker in this node
- MarkerLists* markers = nodeIterator->value.get();
- Member<MarkerList>& list = (*markers)[MarkerTypeToMarkerIndex(markerType)];
- unsigned markerCount = list.get() ? list->size() : 0;
- for (unsigned markerIndex = 0; markerIndex < markerCount; ++markerIndex) {
- RenderedDocumentMarker* marker = list->at(markerIndex).get();
+ Member<MarkerList>& markerList = (*nodeMarkers.value)[MarkerTypeToMarkerIndex(markerType)];
+ for (auto& marker : *markerList) {
+ updateMarkerRenderedRectIfNeeded(node, *marker);
if (marker->contains(point))
return marker;
}
@@ -489,6 +488,7 @@ Vector<IntRect> DocumentMarkerController::renderedRectsForMarkers(DocumentMarker
MarkerMap::iterator end = m_markers.end();
for (MarkerMap::iterator nodeIterator = m_markers.begin(); nodeIterator != end; ++nodeIterator) {
// inner loop; process each marker in this node
+ const Node& node = *nodeIterator->key;
MarkerLists* markers = nodeIterator->value.get();
for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::MarkerTypeIndexesCount; ++markerListIndex) {
Member<MarkerList>& list = (*markers)[markerListIndex];
@@ -496,6 +496,7 @@ Vector<IntRect> DocumentMarkerController::renderedRectsForMarkers(DocumentMarker
continue;
for (unsigned markerIndex = 0; markerIndex < list->size(); ++markerIndex) {
RenderedDocumentMarker* marker = list->at(markerIndex).get();
+ updateMarkerRenderedRectIfNeeded(node, *marker);
if (!marker->isRendered())
continue;
result.append(marker->renderedRect());
@@ -512,19 +513,43 @@ static void invalidatePaintForTickmarks(const Node& node)
frameView->invalidatePaintForTickmarks();
}
-void DocumentMarkerController::updateRenderedRectsForMarkers()
+void DocumentMarkerController::updateMarkerRenderedRectIfNeeded(const Node& node, RenderedDocumentMarker& marker)
+{
+ DCHECK(!m_document->view() || !m_document->view()->needsLayout());
+ DCHECK(!m_document->needsLayoutTreeUpdate());
+ if (!marker.isValid())
+ updateMarkerRenderedRect(node, marker);
+}
+
+void DocumentMarkerController::invalidateRectsForMarkersInNode(const Node& node)
+{
+ MarkerLists* markers = m_markers.get(&node);
+
+ for (auto& markerList : *markers) {
+ if (!markerList)
+ continue;
+
+ for (auto& marker : *markerList)
+ marker->invalidate();
+
+ if (markerList->first()->type() == DocumentMarker::TextMatch)
+ invalidatePaintForTickmarks(node);
+ }
+}
+
+void DocumentMarkerController::invalidateRectsForAllMarkers()
{
for (auto& nodeMarkers : m_markers) {
- const Node* node = nodeMarkers.key;
+ const Node& node = *nodeMarkers.key;
for (auto& markerList : *nodeMarkers.value) {
if (!markerList)
continue;
- bool markersChanged = false;
+
for (auto& marker : *markerList)
- markersChanged |= updateMarkerRenderedRect(const_cast<Node*>(node), *marker);
+ marker->invalidate();
- if (markersChanged && markerList->first()->type() == DocumentMarker::TextMatch)
- invalidatePaintForTickmarks(*node);
+ if (markerList->first()->type() == DocumentMarker::TextMatch)
+ invalidatePaintForTickmarks(node);
}
}
}
@@ -532,6 +557,7 @@ void DocumentMarkerController::updateRenderedRectsForMarkers()
DEFINE_TRACE(DocumentMarkerController)
{
visitor->trace(m_markers);
+ visitor->trace(m_document);
}
void DocumentMarkerController::removeMarkers(Node* node, DocumentMarker::MarkerTypes markerTypes)
@@ -669,7 +695,7 @@ void DocumentMarkerController::shiftMarkers(Node* node, unsigned startOffset, in
if (!markers)
return;
- bool docDirty = false;
+ bool didShiftMarker = false;
for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::MarkerTypeIndexesCount; ++markerListIndex) {
Member<MarkerList>& list = (*markers)[markerListIndex];
if (!list)
@@ -681,15 +707,16 @@ void DocumentMarkerController::shiftMarkers(Node* node, unsigned startOffset, in
DCHECK_GE(startOffset + delta, 0);
#endif
(*marker)->shiftOffsets(delta);
- docDirty = true;
-
- updateMarkerRenderedRect(node, **marker);
+ didShiftMarker = true;
}
}
- // repaint the affected node
- if (docDirty && node->layoutObject())
- node->layoutObject()->setShouldDoFullPaintInvalidation();
+ if (didShiftMarker) {
+ invalidateRectsForMarkersInNode(*node);
+ // repaint the affected node
+ if (node->layoutObject())
+ node->layoutObject()->setShouldDoFullPaintInvalidation();
+ }
}
bool DocumentMarkerController::setMarkersActive(Range* range, bool active)

Powered by Google App Engine
This is Rietveld 408576698