Chromium Code Reviews| Index: third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.h |
| diff --git a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.h b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.h |
| index 060c6b305b1149c465c58af5e5a460c015493c06..634342990b91c67eb77ff92d87c47f864ab44986 100644 |
| --- a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.h |
| +++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.h |
| @@ -40,16 +40,18 @@ |
| namespace blink { |
| +class CompositionMarkerList; |
| +class DocumentMarkerList; |
| +class GrammarMarkerList; |
| class Node; |
| -class RenderedDocumentMarker; |
| -class Text; |
| +class SpellingMarkerList; |
| +class TextMatchMarkerList; |
| class MarkerRemoverPredicate final { |
| public: |
| explicit MarkerRemoverPredicate(const Vector<String>& words); |
| bool operator()(const DocumentMarker&, const Text&) const; |
| - private: |
|
Xiaocheng
2017/03/21 19:12:11
Irrelevant change.
rlanday
2017/03/21 19:49:12
This is necessary because I'm changing the impleme
|
| Vector<String> m_words; |
| }; |
| @@ -63,6 +65,7 @@ class CORE_EXPORT DocumentMarkerController final |
| explicit DocumentMarkerController(Document&); |
| void clear(); |
| + void addMarker(Node*, DocumentMarker*); |
| void addMarker(const Position& start, |
| const Position& end, |
| DocumentMarker::MarkerType, |
| @@ -113,7 +116,7 @@ class CORE_EXPORT DocumentMarkerController final |
| // Returns true if markers within a range defined by a node, |startOffset| and |
| // |endOffset| are found. |
| bool setMarkersActive(Node*, unsigned startOffset, unsigned endOffset, bool); |
| - bool hasMarkers(Node* node) const { return m_markers.contains(node); } |
| + bool hasMarkers(Node*) const; |
| DocumentMarkerVector markersFor( |
| Node*, |
| @@ -122,9 +125,9 @@ class CORE_EXPORT DocumentMarkerController final |
| DocumentMarker::MarkerTypes); |
| DocumentMarkerVector markers(); |
| Vector<IntRect> renderedRectsForMarkers(DocumentMarker::MarkerType); |
| - void updateMarkerRenderedRectIfNeeded(const Node&, RenderedDocumentMarker&); |
| + |
| void invalidateRectsForAllMarkers(); |
| - void invalidateRectsForMarkersInNode(const Node&); |
| + void invalidateRectsForMarkersInNode(Node&); |
| DECLARE_TRACE(); |
| @@ -139,23 +142,65 @@ class CORE_EXPORT DocumentMarkerController final |
| unsigned newLength) final; |
| private: |
| - void addMarker(Node*, const DocumentMarker&); |
| - |
| - using MarkerList = HeapVector<Member<RenderedDocumentMarker>>; |
| - using MarkerLists = |
| - HeapVector<Member<MarkerList>, DocumentMarker::MarkerTypeIndexesCount>; |
| - using MarkerMap = HeapHashMap<WeakMember<const Node>, Member<MarkerLists>>; |
| - void mergeOverlapping(MarkerList*, RenderedDocumentMarker*); |
| - bool possiblyHasMarkers(DocumentMarker::MarkerTypes); |
| - void removeMarkersFromList(MarkerMap::iterator, DocumentMarker::MarkerTypes); |
| + template <typename MarkerListType> |
| + using MarkerMap = HeapHashMap<WeakMember<Node>, Member<MarkerListType>>; |
| + |
| + template <typename MarkerListType> |
| + void addIntoMarkerMap(MarkerMap<MarkerListType>* markerMap, |
|
Xiaocheng
2017/03/21 19:12:11
Hmm... I forgot that templated member functions mu
rlanday
2017/03/21 19:49:12
We can try that, but then we'll have to cast the m
|
| + Node* node, |
| + DocumentMarker* newMarker) { |
| + auto it = markerMap->find(node); |
| + if (it == markerMap->end()) { |
| + markerMap->insert(node, new MarkerListType(this)); |
| + it = markerMap->find(node); |
| + } |
| + it->value->insert(newMarker); |
| + } |
| + |
| + template <typename MarkerListType> |
| + void shiftMarkersInNode(MarkerMap<MarkerListType>* markerMap, |
| + CharacterData* node, |
| + unsigned offset, |
| + unsigned oldLength, |
| + unsigned newLength, |
| + bool* didShiftMarker) { |
| + auto it = markerMap->find(node); |
| + if (it != markerMap->end()) { |
| + *didShiftMarker = it->value->shiftMarkers(offset, oldLength, newLength) || |
| + *didShiftMarker; |
| + } |
| + } |
| + |
| + template <typename MarkerListType> |
| + void removeMarkersInRangeFromNode(MarkerMap<MarkerListType>* markerMap, |
| + Node* node, |
| + unsigned startOffset, |
| + int length, |
| + RemovePartiallyOverlappingMarkerOrNot |
| + shouldRemovePartiallyOverlappingMarker, |
| + bool* docDirty) { |
| + auto it = markerMap->find(node); |
| + if (it != markerMap->end()) { |
| + it->value->removeMarkers(startOffset, length, |
| + shouldRemovePartiallyOverlappingMarker, |
| + docDirty); |
| + if (it->value->empty()) |
| + markerMap->remove(node); |
| + } |
| + } |
| + |
| + HeapVector<Member<DocumentMarkerList>> getMarkerListsForNode( |
| + Node*, |
| + DocumentMarker::MarkerTypes = DocumentMarker::AllMarkers()); |
| void removeMarkers(TextIterator&, |
| DocumentMarker::MarkerTypes, |
| RemovePartiallyOverlappingMarkerOrNot); |
| - MarkerMap m_markers; |
| - // Provide a quick way to determine whether a particular marker type is absent |
| - // without going through the map. |
| - DocumentMarker::MarkerTypes m_possiblyExistingMarkerTypes; |
| + MarkerMap<SpellingMarkerList> m_spelling; |
| + MarkerMap<GrammarMarkerList> m_grammar; |
| + MarkerMap<TextMatchMarkerList> m_textMatches; |
| + MarkerMap<CompositionMarkerList> m_compositions; |
| + |
| const Member<const Document> m_document; |
| }; |