15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1999 Antti Koivisto (koivisto@kde.org) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 2001 Dirk Mueller (mueller@kde.org) 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 2006 Alexey Proskuryakov (ap@webkit.org) 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) Research In Motion Limited 2010. All rights reserved. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef DocumentMarkerController_h 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define DocumentMarkerController_h 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentMarker.h" 311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/IntRect.h" 32f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "platform/heap/Handle.h" 33e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/HashMap.h" 34e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/Vector.h" 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class LayoutPoint; 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class LayoutRect; 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Node; 417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass Position; 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Range; 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderedDocumentMarker; 449e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)class Text; 457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass TextIterator; 469e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) 479e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)class MarkerRemoverPredicate FINAL { 489e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)public: 499e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) explicit MarkerRemoverPredicate(const Vector<String>& words); 509e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) bool operator()(const DocumentMarker&, const Text&) const; 519e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) 529e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)private: 539e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) Vector<String> m_words; 549e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)}; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 56d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)class DocumentMarkerController FINAL : public NoBaseWillBeGarbageCollected<DocumentMarkerController> { 57d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WTF_MAKE_NONCOPYABLE(DocumentMarkerController); WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED; 58d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) DECLARE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(DocumentMarkerController); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DocumentMarkerController(); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) void clear(); 647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void addMarker(Range*, DocumentMarker::MarkerType, const String& description = emptyString(), uint32_t hash = 0); 657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void addMarker(const Position& start, const Position& end, DocumentMarker::MarkerType, const String& description = emptyString(), uint32_t hash = 0); 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void addTextMatchMarker(const Range*, bool activeMatch); 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void copyMarkers(Node* srcNode, unsigned startOffset, int length, Node* dstNode, int delta); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool hasMarkers(Range*, DocumentMarker::MarkerTypes = DocumentMarker::AllMarkers()); 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) void prepareForDestruction(); 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When a marker partially overlaps with range, if removePartiallyOverlappingMarkers is true, we completely 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // remove the marker. If the argument is false, we will adjust the span of the marker so that it retains 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the portion that is outside of the range. 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum RemovePartiallyOverlappingMarkerOrNot { DoNotRemovePartiallyOverlappingMarker, RemovePartiallyOverlappingMarker }; 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void removeMarkers(Range*, DocumentMarker::MarkerTypes = DocumentMarker::AllMarkers(), RemovePartiallyOverlappingMarkerOrNot = DoNotRemovePartiallyOverlappingMarker); 777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void removeMarkers(const Position& start, const Position& end, DocumentMarker::MarkerTypes = DocumentMarker::AllMarkers(), RemovePartiallyOverlappingMarkerOrNot = DoNotRemovePartiallyOverlappingMarker); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void removeMarkers(Node*, unsigned startOffset, int length, DocumentMarker::MarkerTypes = DocumentMarker::AllMarkers(), RemovePartiallyOverlappingMarkerOrNot = DoNotRemovePartiallyOverlappingMarker); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void removeMarkers(DocumentMarker::MarkerTypes = DocumentMarker::AllMarkers()); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void removeMarkers(Node*, DocumentMarker::MarkerTypes = DocumentMarker::AllMarkers()); 829e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) void removeMarkers(const MarkerRemoverPredicate& shouldRemoveMarker); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void repaintMarkers(DocumentMarker::MarkerTypes = DocumentMarker::AllMarkers()); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void invalidateRenderedRectsForMarkersInRect(const LayoutRect&); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void shiftMarkers(Node*, unsigned startOffset, int delta); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setMarkersActive(Range*, bool); 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setMarkersActive(Node*, unsigned startOffset, unsigned endOffset, bool); 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DocumentMarker* markerContainingPoint(const LayoutPoint&, DocumentMarker::MarkerType); 90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch DocumentMarkerVector markersFor(Node*, DocumentMarker::MarkerTypes = DocumentMarker::AllMarkers()); 91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch DocumentMarkerVector markersInRange(Range*, DocumentMarker::MarkerTypes); 92197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch DocumentMarkerVector markers(); 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<IntRect> renderedRectsForMarkers(DocumentMarker::MarkerType); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 95d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) void trace(Visitor*); 96d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void showMarkers() const; 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void addMarker(Node*, const DocumentMarker&); 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch typedef WillBeHeapVector<OwnPtrWillBeMember<RenderedDocumentMarker> > MarkerList; 105d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) typedef WillBeHeapVector<OwnPtrWillBeMember<MarkerList>, DocumentMarker::MarkerTypeIndexesCount> MarkerLists; 106d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) typedef WillBeHeapHashMap<RawPtrWillBeWeakMember<const Node>, OwnPtrWillBeMember<MarkerLists> > MarkerMap; 10706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) void mergeOverlapping(MarkerList*, DocumentMarker&); 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool possiblyHasMarkers(DocumentMarker::MarkerTypes); 109e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) void removeMarkersFromList(MarkerMap::iterator, DocumentMarker::MarkerTypes); 1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void removeMarkers(TextIterator&, DocumentMarker::MarkerTypes, RemovePartiallyOverlappingMarkerOrNot); 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MarkerMap m_markers; 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Provide a quick way to determine whether a particular marker type is absent without going through the map. 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DocumentMarker::MarkerTypes m_possiblyExistingMarkerTypes; 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 117c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 120c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void showDocumentMarkers(const blink::DocumentMarkerController*); 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // DocumentMarkerController_h 124