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..40ae1e3949f80e964f2c202123298ea20d18583a 100644 |
| --- a/Source/core/dom/DocumentMarkerController.cpp |
| +++ b/Source/core/dom/DocumentMarkerController.cpp |
| @@ -33,6 +33,7 @@ |
| #include "core/dom/RenderedDocumentMarker.h" |
| #include "core/dom/Text.h" |
| #include "core/editing/iterators/TextIterator.h" |
| +#include "core/frame/FrameView.h" |
| #include "core/layout/LayoutObject.h" |
| #ifndef NDEBUG |
| @@ -115,6 +116,7 @@ void DocumentMarkerController::addTextMatchMarker(const Range* range, bool activ |
| // Use a TextIterator to visit the potentially multiple nodes the range covers. |
| for (TextIterator markedText(range->startPosition(), range->endPosition()); !markedText.atEnd(); markedText.advance()) |
| addMarker(markedText.currentContainer(), DocumentMarker(markedText.startOffsetInCurrentContainer(), markedText.endOffsetInCurrentContainer(), activeMatch)); |
| + // Don't invalidate tickmarks here. TextFinder invalidates tickmarks using a throttling algorithm. crbug.com/6819. |
| } |
| void DocumentMarkerController::prepareForDestruction() |
| @@ -177,7 +179,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 +187,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. |
| @@ -491,6 +490,12 @@ Vector<IntRect> DocumentMarkerController::renderedRectsForMarkers(DocumentMarker |
| return result; |
| } |
| +static void invalidatePaintForTickmarks(const Node& node) |
| +{ |
| + if (FrameView* frameView = node.document().view()) |
| + frameView->invalidatePaintForTickmarks(); |
| +} |
| + |
| void DocumentMarkerController::updateRenderedRectsForMarkers() |
| { |
| for (auto& nodeMarkers : m_markers) { |
| @@ -498,8 +503,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) |
| + invalidatePaintForTickmarks(*node); |
| } |
| } |
| } |
| @@ -524,19 +533,24 @@ void DocumentMarkerController::removeMarkers(Node* node, DocumentMarker::MarkerT |
| void DocumentMarkerController::removeMarkers(const MarkerRemoverPredicate& shouldRemoveMarker) |
| { |
| - for (MarkerMap::iterator i = m_markers.begin(); i != m_markers.end(); ++i) { |
| - MarkerLists* markers = i->value.get(); |
| + for (auto& nodeMarkers : m_markers) { |
| + const Node& node = *nodeMarkers.key; |
| + if (!node.isTextNode()) // MarkerRemoverPridicate requires a Text node. |
|
chrishtr
2015/04/20 17:53:25
sp: MarkerRemoverPredicate
Also, why could the pr
Xianzhu
2015/04/20 18:13:48
Done.
|
| + continue; |
| + MarkerLists& markers = *nodeMarkers.value; |
| for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::MarkerTypeIndexesCount; ++markerListIndex) { |
| - OwnPtrWillBeMember<MarkerList>& list = (*markers)[markerListIndex]; |
| - |
| - WillBeHeapVector<RawPtrWillBeMember<RenderedDocumentMarker>> markersToBeRemoved; |
| - for (size_t j = 0; list.get() && j < list->size(); ++j) { |
| - if (i->key->isTextNode() && shouldRemoveMarker(*list->at(j).get(), static_cast<const Text&>(*i->key))) |
| - markersToBeRemoved.append(list->at(j).get()); |
| + OwnPtrWillBeMember<MarkerList>& list = markers[markerListIndex]; |
| + if (!list) |
| + continue; |
| + bool removedMarkers = false; |
| + for (size_t j = list->size(); j > 0; --j) { |
| + if (shouldRemoveMarker(*list->at(j - 1), static_cast<const Text&>(node))) { |
| + list->remove(j - 1); |
| + removedMarkers = true; |
| + } |
| } |
| - |
| - for (size_t j = 0; j < markersToBeRemoved.size(); ++j) |
| - list->remove(list->find(markersToBeRemoved[j].get())); |
| + if (removedMarkers && markerListIndex == DocumentMarker::TextMatchMarkerIndex) |
| + invalidatePaintForTickmarks(node); |
| } |
| } |
| } |
| @@ -591,8 +605,10 @@ void DocumentMarkerController::removeMarkersFromList(MarkerMap::iterator iterato |
| } |
| if (needsRepainting) { |
| - if (LayoutObject* renderer = iterator->key->layoutObject()) |
| + const Node& node = *iterator->key; |
| + if (LayoutObject* renderer = node.layoutObject()) |
| renderer->setShouldDoFullPaintInvalidation(); |
| + invalidatePaintForTickmarks(node); |
| } |
| if (nodeCanBeRemoved) { |