[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

dbates at webkit.org dbates at webkit.org
Wed Dec 22 12:24:54 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 858331b02b3f1dc1a6d390a3a78c996ac49fe1b6
Author: dbates at webkit.org <dbates at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Sun Aug 22 21:41:37 2010 +0000

    2010-08-22  Daniel Bates  <dbates at rim.com>
    
            Reviewed by Eric Seidel.
    
            Encapsulate document marker management into DocumentMarkerController
            https://bugs.webkit.org/show_bug.cgi?id=44383
    
            Modify call sites in the Chromium port to use DocumentMarkerController.
    
            No functionality was changed, so no new tests.
    
            * src/WebFrameImpl.cpp:
            (WebKit::WebFrameImpl::stopFinding):
            (WebKit::WebFrameImpl::addMarker):
            (WebKit::WebFrameImpl::setMarkerActive):
    2010-08-22  Daniel Bates  <dbates at rim.com>
    
            Reviewed by Eric Seidel.
    
            Encapsulate document marker management into DocumentMarkerController
            https://bugs.webkit.org/show_bug.cgi?id=44383
    
            Modify call sites in the Apple Windows port to use DocumentMarkerController.
    
            No functionality was changed, so no new tests.
    
            * WebFrame.cpp:
            (WebFrame::unmarkAllMisspellings):
            (WebFrame::unmarkAllBadGrammar):
            * WebView.cpp:
            (WebView::rectsForTextMatches):
    2010-08-22  Daniel Bates  <dbates at rim.com>
    
            Reviewed by Eric Seidel.
    
            Encapsulate document marker management into DocumentMarkerController
            https://bugs.webkit.org/show_bug.cgi?id=44383
    
            Modify call sites in the Apple Mac port to use DocumentMarkerController.
    
            No functionality was changed, so no new tests.
    
            * WebView/WebFrame.mm:
            (-[WebFrame _unmarkAllBadGrammar]):
            (-[WebFrame _unmarkAllMisspellings]):
            * WebView/WebHTMLView.mm:
            (-[WebHTMLView unmarkAllTextMatches]):
            (-[WebHTMLView rectsForTextMatches]):
    2010-08-22  Daniel Bates  <dbates at rim.com>
    
            Reviewed by Eric Seidel.
    
            Encapsulate document marker management into DocumentMarkerController
            https://bugs.webkit.org/show_bug.cgi?id=44383
    
            Modify call sites in the EFL port to use DocumentMarkerController.
    
            No functionality was changed, so no new tests.
    
            * ewk/ewk_frame.cpp:
            (ewk_frame_text_matches_unmark_all):
    2010-08-22  Daniel Bates  <dbates at rim.com>
    
            Reviewed by Eric Seidel.
    
            Encapsulate document marker management into DocumentMarkerController
            https://bugs.webkit.org/show_bug.cgi?id=44383
    
            Moves the document marker management code in Document.cpp into its own
            class called DocumentMarkerController.
    
            No functionality was changed, so no new tests.
    
            * Android.mk: Added DocumentMarkerController.cpp
            * CMakeLists.txt: Ditto.
            * GNUmakefile.am: Added DocumentMarkerController.cpp and DocumentMarkerController.h.
            * WebCore.exp.in: Substituted symbols __ZN7WebCore24DocumentMarkerController13removeMarkersENS_14DocumentMarker10MarkerTypeE
            and __ZN7WebCore24DocumentMarkerController23renderedRectsForMarkersENS_14DocumentMarker10MarkerTypeE for
            __ZN7WebCore8Document13removeMarkersENS_14DocumentMarker10MarkerTypeE and
            __ZN7WebCore8Document23renderedRectsForMarkersENS_14DocumentMarker10MarkerTypeE, respectively.
            * WebCore.gypi: Added DocumentMarkerController.cpp and DocumentMarkerController.h.
            * WebCore.pro: Ditto.
            * WebCore.vcproj/WebCore.vcproj: Ditto.
            * WebCore.xcodeproj/project.pbxproj: Ditto.
            * dom/Document.cpp:
            (WebCore::Document::removedLastRef): Modified to call DocumentMarkerController::detach().
            (WebCore::Document::~Document): Removed "deleteAllValues(m_markers)" as DocumentMarkerController
            is stored in OwnPtr; so it will be destroyed automatically on Document destruction.
            (WebCore::Document::textInserted): Modified to use marker controller.
            (WebCore::Document::textRemoved): Ditto.
            * dom/Document.h:
            (WebCore::Document::markers): Added.
            * dom/DocumentMarkerController.cpp: Added.
            (WebCore::placeholderRectForMarker):
            (WebCore::DocumentMarkerController::detach):
            (WebCore::DocumentMarkerController::addMarker):
            (WebCore::DocumentMarkerController::removeMarkers):
            (WebCore::DocumentMarkerController::copyMarkers):
            (WebCore::DocumentMarkerController::markerContainingPoint):
            (WebCore::DocumentMarkerController::markersForNode):
            (WebCore::DocumentMarkerController::renderedRectsForMarkers):
            (WebCore::DocumentMarkerController::repaintMarkers):
            (WebCore::DocumentMarkerController::setRenderedRectForMarker):
            (WebCore::DocumentMarkerController::invalidateRenderedRectsForMarkersInRect):
            (WebCore::DocumentMarkerController::shiftMarkers):
            (WebCore::DocumentMarkerController::setMarkersActive):
            * dom/DocumentMarkerController.h: Added.
            (WebCore::DocumentMarkerController::~DocumentMarkerController):
            * editing/Editor.cpp:
            (WebCore::Editor::ignoreSpelling): Modified to use marker controller.
            (WebCore::findFirstMisspellingInRange): Ditto.
            (WebCore::findFirstGrammarDetailInRange): Ditto.
            (WebCore::Editor::advanceToNextMisspelling): Ditto.
            (WebCore::Editor::markAllMisspellingsAndBadGrammarInRanges): Ditto.
            (WebCore::Editor::changeBackToReplacedString): Ditto.
            * editing/SplitTextNodeCommand.cpp:
            (WebCore::SplitTextNodeCommand::doApply): Ditto.
            (WebCore::SplitTextNodeCommand::doUnapply): Ditto.
            * page/Frame.cpp:
            (WebCore::Frame::markAllMatchesForText): Ditto.
            (WebCore::Frame::setMarkedTextMatchesAreHighlighted): Ditto.
            (WebCore::Frame::respondToChangedSelection): Ditto.
            * page/FrameView.cpp:
            (WebCore::FrameView::getTickmarks): Ditto.
            (WebCore::FrameView::paintContents): Ditto.
            * page/Page.cpp:
            (WebCore::Page::unmarkAllTextMatches): Ditto.
            * rendering/HitTestResult.cpp:
            (WebCore::HitTestResult::spellingToolTip): Ditto.
            (WebCore::HitTestResult::replacedString): Ditto.
            * rendering/InlineTextBox.cpp:
            (WebCore::InlineTextBox::paintSpellingOrGrammarMarker): Ditto.
            (WebCore::InlineTextBox::paintTextMatchMarker): Ditto.
            (WebCore::InlineTextBox::computeRectForReplacementMarker): Ditto.
            (WebCore::InlineTextBox::paintDocumentMarkers): Ditto.
            * rendering/SVGInlineTextBox.cpp:
            (WebCore::SVGInlineTextBox::computeTextMatchMarkerRect): Ditto.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@65787 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/Android.mk b/WebCore/Android.mk
index ac1060a..e8cd8b8 100644
--- a/WebCore/Android.mk
+++ b/WebCore/Android.mk
@@ -123,6 +123,7 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
 	dom/DeviceMotionEvent.cpp \
 	dom/Document.cpp \
 	dom/DocumentFragment.cpp \
+	dom/DocumentMarkerController.cpp \
 	dom/DocumentParser.cpp \
 	dom/DocumentType.cpp \
 	dom/DynamicNodeList.cpp \
diff --git a/WebCore/CMakeLists.txt b/WebCore/CMakeLists.txt
index c447803..eb42c5c 100644
--- a/WebCore/CMakeLists.txt
+++ b/WebCore/CMakeLists.txt
@@ -810,6 +810,7 @@ SET(WebCore_SOURCES
     dom/DeviceOrientationController.cpp
     dom/DeviceOrientationEvent.cpp
     dom/Document.cpp
+    dom/DocumentMarkerController.cpp
     dom/DocumentFragment.cpp
     dom/DocumentParser.cpp
     dom/DocumentType.cpp
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index dc7b4ac..baf3c4b 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,80 @@
+2010-08-22  Daniel Bates  <dbates at rim.com>
+
+        Reviewed by Eric Seidel.
+
+        Encapsulate document marker management into DocumentMarkerController
+        https://bugs.webkit.org/show_bug.cgi?id=44383
+
+        Moves the document marker management code in Document.cpp into its own
+        class called DocumentMarkerController.
+
+        No functionality was changed, so no new tests.
+
+        * Android.mk: Added DocumentMarkerController.cpp 
+        * CMakeLists.txt: Ditto.
+        * GNUmakefile.am: Added DocumentMarkerController.cpp and DocumentMarkerController.h.
+        * WebCore.exp.in: Substituted symbols __ZN7WebCore24DocumentMarkerController13removeMarkersENS_14DocumentMarker10MarkerTypeE
+        and __ZN7WebCore24DocumentMarkerController23renderedRectsForMarkersENS_14DocumentMarker10MarkerTypeE for
+        __ZN7WebCore8Document13removeMarkersENS_14DocumentMarker10MarkerTypeE and 
+        __ZN7WebCore8Document23renderedRectsForMarkersENS_14DocumentMarker10MarkerTypeE, respectively.
+        * WebCore.gypi: Added DocumentMarkerController.cpp and DocumentMarkerController.h.
+        * WebCore.pro: Ditto.
+        * WebCore.vcproj/WebCore.vcproj: Ditto.
+        * WebCore.xcodeproj/project.pbxproj: Ditto.
+        * dom/Document.cpp:
+        (WebCore::Document::removedLastRef): Modified to call DocumentMarkerController::detach().
+        (WebCore::Document::~Document): Removed "deleteAllValues(m_markers)" as DocumentMarkerController
+        is stored in OwnPtr; so it will be destroyed automatically on Document destruction.
+        (WebCore::Document::textInserted): Modified to use marker controller.
+        (WebCore::Document::textRemoved): Ditto.
+        * dom/Document.h:
+        (WebCore::Document::markers): Added.
+        * dom/DocumentMarkerController.cpp: Added.
+        (WebCore::placeholderRectForMarker):
+        (WebCore::DocumentMarkerController::detach):
+        (WebCore::DocumentMarkerController::addMarker):
+        (WebCore::DocumentMarkerController::removeMarkers):
+        (WebCore::DocumentMarkerController::copyMarkers):
+        (WebCore::DocumentMarkerController::markerContainingPoint):
+        (WebCore::DocumentMarkerController::markersForNode):
+        (WebCore::DocumentMarkerController::renderedRectsForMarkers):
+        (WebCore::DocumentMarkerController::repaintMarkers):
+        (WebCore::DocumentMarkerController::setRenderedRectForMarker):
+        (WebCore::DocumentMarkerController::invalidateRenderedRectsForMarkersInRect):
+        (WebCore::DocumentMarkerController::shiftMarkers):
+        (WebCore::DocumentMarkerController::setMarkersActive):
+        * dom/DocumentMarkerController.h: Added.
+        (WebCore::DocumentMarkerController::~DocumentMarkerController):
+        * editing/Editor.cpp:
+        (WebCore::Editor::ignoreSpelling): Modified to use marker controller.
+        (WebCore::findFirstMisspellingInRange): Ditto.
+        (WebCore::findFirstGrammarDetailInRange): Ditto.
+        (WebCore::Editor::advanceToNextMisspelling): Ditto.
+        (WebCore::Editor::markAllMisspellingsAndBadGrammarInRanges): Ditto.
+        (WebCore::Editor::changeBackToReplacedString): Ditto.
+        * editing/SplitTextNodeCommand.cpp:
+        (WebCore::SplitTextNodeCommand::doApply): Ditto.
+        (WebCore::SplitTextNodeCommand::doUnapply): Ditto.
+        * page/Frame.cpp:
+        (WebCore::Frame::markAllMatchesForText): Ditto.
+        (WebCore::Frame::setMarkedTextMatchesAreHighlighted): Ditto.
+        (WebCore::Frame::respondToChangedSelection): Ditto.
+        * page/FrameView.cpp:
+        (WebCore::FrameView::getTickmarks): Ditto.
+        (WebCore::FrameView::paintContents): Ditto.
+        * page/Page.cpp:
+        (WebCore::Page::unmarkAllTextMatches): Ditto.
+        * rendering/HitTestResult.cpp:
+        (WebCore::HitTestResult::spellingToolTip): Ditto.
+        (WebCore::HitTestResult::replacedString): Ditto.
+        * rendering/InlineTextBox.cpp:
+        (WebCore::InlineTextBox::paintSpellingOrGrammarMarker): Ditto.
+        (WebCore::InlineTextBox::paintTextMatchMarker): Ditto.
+        (WebCore::InlineTextBox::computeRectForReplacementMarker): Ditto.
+        (WebCore::InlineTextBox::paintDocumentMarkers): Ditto.
+        * rendering/SVGInlineTextBox.cpp:
+        (WebCore::SVGInlineTextBox::computeTextMatchMarkerRect): Ditto.
+
 2010-08-22  Jian Li  <jianli at chromium.org>
 
         Reviewed by Darin Fisher.
diff --git a/WebCore/GNUmakefile.am b/WebCore/GNUmakefile.am
index ac5a259..f1ec445 100644
--- a/WebCore/GNUmakefile.am
+++ b/WebCore/GNUmakefile.am
@@ -1042,11 +1042,13 @@ webcore_sources += \
 	WebCore/dom/DeviceOrientationEvent.cpp \
 	WebCore/dom/DeviceOrientationEvent.h \
 	WebCore/dom/Document.cpp \
-	WebCore/dom/DocumentParser.cpp \
 	WebCore/dom/Document.h \
 	WebCore/dom/DocumentFragment.cpp \
 	WebCore/dom/DocumentFragment.h \
 	WebCore/dom/DocumentMarker.h \
+	WebCore/dom/DocumentMarkerController.cpp \
+	WebCore/dom/DocumentMarkerController.h \
+	WebCore/dom/DocumentParser.cpp \
 	WebCore/dom/DocumentType.cpp \
 	WebCore/dom/DocumentType.h \
 	WebCore/dom/DynamicNodeList.cpp \
diff --git a/WebCore/WebCore.exp.in b/WebCore/WebCore.exp.in
index 07c9ed1..249c3f7 100644
--- a/WebCore/WebCore.exp.in
+++ b/WebCore/WebCore.exp.in
@@ -465,6 +465,8 @@ __ZN7WebCore24contextMenuItemTagItalicEv
 __ZN7WebCore24contextMenuItemTagStylesEv
 __ZN7WebCore24createFragmentFromMarkupEPNS_8DocumentERKN3WTF6StringES5_NS_27FragmentScriptingPermissionE
 __ZN7WebCore24decodeURLEscapeSequencesERKN3WTF6StringE
+__ZN7WebCore24DocumentMarkerController13removeMarkersENS_14DocumentMarker10MarkerTypeE
+__ZN7WebCore24DocumentMarkerController23renderedRectsForMarkersENS_14DocumentMarker10MarkerTypeE
 __ZN7WebCore24notifyHistoryItemChangedE
 __ZN7WebCore24rangeCompliantEquivalentERKNS_8PositionE
 __ZN7WebCore25HistoryPropertyListWriter11releaseDataEv
@@ -660,7 +662,6 @@ __ZN7WebCore7IntSizeC1ERK7_NSSize
 __ZN7WebCore7cookiesEPKNS_8DocumentERKNS_4KURLE
 __ZN7WebCore7nsColorERKNS_5ColorE
 __ZN7WebCore8Document11createRangeEv
-__ZN7WebCore8Document13removeMarkersENS_14DocumentMarker10MarkerTypeE
 __ZN7WebCore8Document13svgExtensionsEv
 __ZN7WebCore8Document14setFocusedNodeEN3WTF10PassRefPtrINS_4NodeEEE
 __ZN7WebCore8Document16isPageBoxVisibleEi
@@ -668,7 +669,6 @@ __ZN7WebCore8Document17getFocusableNodesERN3WTF6VectorINS1_6RefPtrINS_4NodeEEELm
 __ZN7WebCore8Document18createWrapperCacheEPNS_15DOMWrapperWorldE
 __ZN7WebCore8Document19accessSVGExtensionsEv
 __ZN7WebCore8Document22createDocumentFragmentEv
-__ZN7WebCore8Document23renderedRectsForMarkersENS_14DocumentMarker10MarkerTypeE
 __ZN7WebCore8Document24addMediaCanStartListenerEPNS_21MediaCanStartListenerE
 __ZN7WebCore8Document24setShouldCreateRenderersEb
 __ZN7WebCore8Document26pageSizeAndMarginsInPixelsEiRNS_7IntSizeERiS3_S3_S3_
diff --git a/WebCore/WebCore.gypi b/WebCore/WebCore.gypi
index e7304e3..f4738a5 100644
--- a/WebCore/WebCore.gypi
+++ b/WebCore/WebCore.gypi
@@ -1151,6 +1151,8 @@
             'dom/DocumentFragment.cpp',
             'dom/DocumentFragment.h',
             'dom/DocumentMarker.h',
+            'dom/DocumentMarkerController.cpp',
+            'dom/DocumentMarkerController.h',
             'dom/DocumentParser.cpp',
             'dom/DocumentParser.h',
             'dom/DocumentType.cpp',
diff --git a/WebCore/WebCore.pro b/WebCore/WebCore.pro
index f5b9c43..13aa073 100644
--- a/WebCore/WebCore.pro
+++ b/WebCore/WebCore.pro
@@ -495,6 +495,7 @@ SOURCES += \
     dom/DeviceOrientationEvent.cpp \
     dom/Document.cpp \
     dom/DocumentFragment.cpp \
+    dom/DocumentMarkerController.cpp \
     dom/DocumentParser.cpp \
     dom/DocumentType.cpp \
     dom/DOMImplementation.cpp \
@@ -1266,15 +1267,17 @@ HEADERS += \
     dom/CustomEvent.h \
     dom/default/PlatformMessagePortChannel.h \
     dom/DeviceMotionClient.h \
-    dom/DeviceMotionData.h \
     dom/DeviceMotionController.h \
+    dom/DeviceMotionData.h \
     dom/DeviceMotionEvent.h \
     dom/DeviceOrientation.h \
     dom/DeviceOrientationClient.h \
     dom/DeviceOrientationController.h \
     dom/DeviceOrientationEvent.h \
-    dom/DocumentFragment.h \
     dom/Document.h \
+    dom/DocumentFragment.h \
+    dom/DocumentMarker.h \
+    dom/DocumentMarkerController.h \
     dom/DocumentType.h \
     dom/DOMImplementation.h \
     dom/DOMStringList.h \
diff --git a/WebCore/WebCore.vcproj/WebCore.vcproj b/WebCore/WebCore.vcproj/WebCore.vcproj
index 7d175c3..7486033 100644
--- a/WebCore/WebCore.vcproj/WebCore.vcproj
+++ b/WebCore/WebCore.vcproj/WebCore.vcproj
@@ -33573,6 +33573,14 @@
 				>
 			</File>
 			<File
+				RelativePath="..\dom\DocumentMarkerController.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\dom\DocumentMarkerController.h"
+				>
+			</File>
+			<File
 				RelativePath="..\dom\DocumentParser.cpp"
 				>
 			</File>
diff --git a/WebCore/WebCore.xcodeproj/project.pbxproj b/WebCore/WebCore.xcodeproj/project.pbxproj
index b5e962a..8059aa2 100644
--- a/WebCore/WebCore.xcodeproj/project.pbxproj
+++ b/WebCore/WebCore.xcodeproj/project.pbxproj
@@ -5103,6 +5103,8 @@
 		C6D74AD509AA282E000B0A52 /* ModifySelectionListLevel.h in Headers */ = {isa = PBXBuildFile; fileRef = C6D74AD309AA282E000B0A52 /* ModifySelectionListLevel.h */; };
 		C6D74AE409AA290A000B0A52 /* ModifySelectionListLevel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C6D74AE309AA290A000B0A52 /* ModifySelectionListLevel.cpp */; };
 		CE02F0C411E83ADD00C6684A /* ScriptControllerBase.h in Headers */ = {isa = PBXBuildFile; fileRef = CE02F0C311E83ADD00C6684A /* ScriptControllerBase.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		CE057FA51220731100A476D5 /* DocumentMarkerController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CE057FA31220731100A476D5 /* DocumentMarkerController.cpp */; };
+		CE057FA61220731100A476D5 /* DocumentMarkerController.h in Headers */ = {isa = PBXBuildFile; fileRef = CE057FA41220731100A476D5 /* DocumentMarkerController.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		CE172E011136E8CE0062A533 /* ZoomMode.h in Headers */ = {isa = PBXBuildFile; fileRef = CE172E001136E8CE0062A533 /* ZoomMode.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		CE4C00E410F6F7BA00CA38F5 /* HTMLNoScriptElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CE4C00E310F6F7BA00CA38F5 /* HTMLNoScriptElement.cpp */; };
 		CE4C00E610F6F7C100CA38F5 /* HTMLNoScriptElement.h in Headers */ = {isa = PBXBuildFile; fileRef = CE4C00E510F6F7C100CA38F5 /* HTMLNoScriptElement.h */; };
@@ -10919,6 +10921,8 @@
 		C6D74AD309AA282E000B0A52 /* ModifySelectionListLevel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModifySelectionListLevel.h; sourceTree = "<group>"; };
 		C6D74AE309AA290A000B0A52 /* ModifySelectionListLevel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ModifySelectionListLevel.cpp; sourceTree = "<group>"; };
 		CE02F0C311E83ADD00C6684A /* ScriptControllerBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptControllerBase.h; sourceTree = "<group>"; };
+		CE057FA31220731100A476D5 /* DocumentMarkerController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DocumentMarkerController.cpp; sourceTree = "<group>"; };
+		CE057FA41220731100A476D5 /* DocumentMarkerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DocumentMarkerController.h; sourceTree = "<group>"; };
 		CE172E001136E8CE0062A533 /* ZoomMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZoomMode.h; sourceTree = "<group>"; };
 		CE4C00E310F6F7BA00CA38F5 /* HTMLNoScriptElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTMLNoScriptElement.cpp; sourceTree = "<group>"; };
 		CE4C00E510F6F7C100CA38F5 /* HTMLNoScriptElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLNoScriptElement.h; sourceTree = "<group>"; };
@@ -17373,6 +17377,8 @@
 				A8185F3509765765005826D9 /* DocumentFragment.h */,
 				1A494ED50A123F1A00FDAFC1 /* DocumentFragment.idl */,
 				ED2BA83B09A24B91006C0AC4 /* DocumentMarker.h */,
+				CE057FA31220731100A476D5 /* DocumentMarkerController.cpp */,
+				CE057FA41220731100A476D5 /* DocumentMarkerController.h */,
 				A8C2280D11D4A59700D5A7D3 /* DocumentParser.cpp */,
 				BCCFBAE70B5152ED0001F1D7 /* DocumentParser.h */,
 				A8185F3209765765005826D9 /* DocumentType.cpp */,
@@ -20340,6 +20346,7 @@
 				2EF1BFF7121CB0BD00C27627 /* AsyncFileStream.h in Headers */,
 				2EF1BFF9121CB0CE00C27627 /* FileStreamClient.h in Headers */,
 				89C0DD7B121F0C69009E17CA /* FileSystemCallbacks.h in Headers */,
+				CE057FA61220731100A476D5 /* DocumentMarkerController.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -22792,6 +22799,7 @@
 				2EF1BFEA121C9F4200C27627 /* FileStream.cpp in Sources */,
 				46A26905121B6B4300C41F3A /* FileWriter.cpp in Sources */,
 				89C0DD7A121F0C69009E17CA /* FileSystemCallbacks.cpp in Sources */,
+				CE057FA51220731100A476D5 /* DocumentMarkerController.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/WebCore/dom/Document.cpp b/WebCore/dom/Document.cpp
index 075781c..e75ac6a 100644
--- a/WebCore/dom/Document.cpp
+++ b/WebCore/dom/Document.cpp
@@ -123,7 +123,6 @@
 #include "StaticHashSetNodeList.h"
 #include "StyleSheetList.h"
 #include "TextEvent.h"
-#include "TextIterator.h"
 #include "TextResourceDecoder.h"
 #include "Timer.h"
 #include "TransformSource.h"
@@ -422,7 +421,9 @@ Document::Document(Frame* frame, const KURL& url, bool isXHTML, bool isHTML)
         setURL(url);
 
     m_axObjectCache = 0;
-    
+
+    m_markers = new DocumentMarkerController();
+
     m_docLoader = new DocLoader(this);
 
     m_visuallyOrdered = false;
@@ -495,8 +496,7 @@ void Document::removedLastRef()
 
         removeAllChildren();
 
-        deleteAllValues(m_markers);
-        m_markers.clear();
+        m_markers->detach();
 
         detachParser();
 
@@ -548,8 +548,6 @@ Document::~Document()
     m_bindingManager.clear();
 #endif
 
-    deleteAllValues(m_markers);
-
     clearAXObjectCache();
 
     m_decoder = 0;
@@ -3189,7 +3187,7 @@ void Document::textInserted(Node* text, unsigned offset, unsigned length)
     }
 
     // Update the markers for spelling and grammar checking.
-    shiftMarkers(text, offset, length);
+    m_markers->shiftMarkers(text, offset, length);
 }
 
 void Document::textRemoved(Node* text, unsigned offset, unsigned length)
@@ -3201,8 +3199,8 @@ void Document::textRemoved(Node* text, unsigned offset, unsigned length)
     }
 
     // Update the markers for spelling and grammar checking.
-    removeMarkers(text, offset, length);
-    shiftMarkers(text, offset + length, 0 - length);
+    m_markers->removeMarkers(text, offset, length);
+    m_markers->shiftMarkers(text, offset + length, 0 - length);
 }
 
 void Document::textNodesMerged(Text* oldNode, unsigned offset)
@@ -3815,489 +3813,6 @@ String Document::queryCommandValue(const String& commandName)
     return command(this, commandName).value();
 }
 
-static IntRect placeholderRectForMarker()
-{
-    return IntRect(-1, -1, -1, -1);
-}
-
-void Document::addMarker(Range* range, DocumentMarker::MarkerType type, String description)
-{
-    // Use a TextIterator to visit the potentially multiple nodes the range covers.
-    for (TextIterator markedText(range); !markedText.atEnd(); markedText.advance()) {
-        RefPtr<Range> textPiece = markedText.range();
-        int exception = 0;
-        DocumentMarker marker = {type, textPiece->startOffset(exception), textPiece->endOffset(exception), description, false};
-        addMarker(textPiece->startContainer(exception), marker);
-    }
-}
-
-void Document::removeMarkers(Range* range, DocumentMarker::MarkerType markerType)
-{
-    if (m_markers.isEmpty())
-        return;
-
-    ExceptionCode ec = 0;
-    Node* startContainer = range->startContainer(ec);
-    Node* endContainer = range->endContainer(ec);
-
-    Node* pastLastNode = range->pastLastNode();
-    for (Node* node = range->firstNode(); node != pastLastNode; node = node->traverseNextNode()) {
-        int startOffset = node == startContainer ? range->startOffset(ec) : 0;
-        int endOffset = node == endContainer ? range->endOffset(ec) : INT_MAX;
-        int length = endOffset - startOffset;
-        removeMarkers(node, startOffset, length, markerType);
-    }
-}
-
-// Markers are stored in order sorted by their start offset.
-// Markers of the same type do not overlap each other.
-
-void Document::addMarker(Node* node, DocumentMarker newMarker) 
-{
-    ASSERT(newMarker.endOffset >= newMarker.startOffset);
-    if (newMarker.endOffset == newMarker.startOffset)
-        return;
-
-    MarkerMapVectorPair* vectorPair = m_markers.get(node);
-
-    if (!vectorPair) {
-        vectorPair = new MarkerMapVectorPair;
-        vectorPair->first.append(newMarker);
-        vectorPair->second.append(placeholderRectForMarker());
-        m_markers.set(node, vectorPair);
-    } else {
-        Vector<DocumentMarker>& markers = vectorPair->first;
-        Vector<IntRect>& rects = vectorPair->second;
-        size_t numMarkers = markers.size();
-        ASSERT(numMarkers == rects.size());
-        size_t i;
-        // Iterate over all markers whose start offset is less than or equal to the new marker's.
-        // If one of them is of the same type as the new marker and touches it or intersects with it
-        // (there is at most one), remove it and adjust the new marker's start offset to encompass it.
-        for (i = 0; i < numMarkers; ++i) {
-            DocumentMarker marker = markers[i];
-            if (marker.startOffset > newMarker.startOffset)
-                break;
-            if (marker.type == newMarker.type && marker.endOffset >= newMarker.startOffset) {
-                newMarker.startOffset = marker.startOffset;
-                markers.remove(i);
-                rects.remove(i);
-                numMarkers--;
-                break;
-            }
-        }
-        size_t j = i;
-        // Iterate over all markers whose end offset is less than or equal to the new marker's,
-        // removing markers of the same type as the new marker which touch it or intersect with it,
-        // adjusting the new marker's end offset to cover them if necessary.
-        while (j < numMarkers) {
-            DocumentMarker marker = markers[j];
-            if (marker.startOffset > newMarker.endOffset)
-                break;
-            if (marker.type == newMarker.type) {
-                markers.remove(j);
-                rects.remove(j);
-                if (newMarker.endOffset <= marker.endOffset) {
-                    newMarker.endOffset = marker.endOffset;
-                    break;
-                }
-                numMarkers--;
-            } else
-                j++;
-        }
-        // At this point i points to the node before which we want to insert.
-        markers.insert(i, newMarker);
-        rects.insert(i, placeholderRectForMarker());
-    }
-    
-    // repaint the affected node
-    if (node->renderer())
-        node->renderer()->repaint();
-}
-
-// copies markers from srcNode to dstNode, applying the specified shift delta to the copies.  The shift is
-// useful if, e.g., the caller has created the dstNode from a non-prefix substring of the srcNode.
-void Document::copyMarkers(Node* srcNode, unsigned startOffset, int length, Node* dstNode, int delta, DocumentMarker::MarkerType markerType)
-{
-    if (length <= 0)
-        return;
-    
-    MarkerMapVectorPair* vectorPair = m_markers.get(srcNode);
-    if (!vectorPair)
-        return;
-
-    ASSERT(vectorPair->first.size() == vectorPair->second.size());
-
-    bool docDirty = false;
-    unsigned endOffset = startOffset + length - 1;
-    Vector<DocumentMarker>& markers = vectorPair->first;
-    for (size_t i = 0; i != markers.size(); ++i) {
-        DocumentMarker marker = markers[i];
-
-        // stop if we are now past the specified range
-        if (marker.startOffset > endOffset)
-            break;
-        
-        // skip marker that is before the specified range or is the wrong type
-        if (marker.endOffset < startOffset || (marker.type != markerType && markerType != DocumentMarker::AllMarkers))
-            continue;
-
-        // pin the marker to the specified range and apply the shift delta
-        docDirty = true;
-        if (marker.startOffset < startOffset)
-            marker.startOffset = startOffset;
-        if (marker.endOffset > endOffset)
-            marker.endOffset = endOffset;
-        marker.startOffset += delta;
-        marker.endOffset += delta;
-        
-        addMarker(dstNode, marker);
-    }
-    
-    // repaint the affected node
-    if (docDirty && dstNode->renderer())
-        dstNode->renderer()->repaint();
-}
-
-void Document::removeMarkers(Node* node, unsigned startOffset, int length, DocumentMarker::MarkerType markerType)
-{
-    if (length <= 0)
-        return;
-
-    MarkerMapVectorPair* vectorPair = m_markers.get(node);
-    if (!vectorPair)
-        return;
-
-    Vector<DocumentMarker>& markers = vectorPair->first;
-    Vector<IntRect>& rects = vectorPair->second;
-    ASSERT(markers.size() == rects.size());
-    bool docDirty = false;
-    unsigned endOffset = startOffset + length;
-    for (size_t i = 0; i < markers.size();) {
-        DocumentMarker marker = markers[i];
-
-        // markers are returned in order, so stop if we are now past the specified range
-        if (marker.startOffset >= endOffset)
-            break;
-        
-        // skip marker that is wrong type or before target
-        if (marker.endOffset < startOffset || (marker.type != markerType && markerType != DocumentMarker::AllMarkers)) {
-            i++;
-            continue;
-        }
-
-        // at this point we know that marker and target intersect in some way
-        docDirty = true;
-
-        // pitch the old marker and any associated rect
-        markers.remove(i);
-        rects.remove(i);
-        
-        // add either of the resulting slices that are left after removing target
-        if (startOffset > marker.startOffset) {
-            DocumentMarker newLeft = marker;
-            newLeft.endOffset = startOffset;
-            markers.insert(i, newLeft);
-            rects.insert(i, placeholderRectForMarker());
-            // i now points to the newly-inserted node, but we want to skip that one
-            i++;
-        }
-        if (marker.endOffset > endOffset) {
-            DocumentMarker newRight = marker;
-            newRight.startOffset = endOffset;
-            markers.insert(i, newRight);
-            rects.insert(i, placeholderRectForMarker());
-            // i now points to the newly-inserted node, but we want to skip that one
-            i++;
-        }
-    }
-
-    if (markers.isEmpty()) {
-        ASSERT(rects.isEmpty());
-        m_markers.remove(node);
-        delete vectorPair;
-    }
-
-    // repaint the affected node
-    if (docDirty && node->renderer())
-        node->renderer()->repaint();
-}
-
-DocumentMarker* Document::markerContainingPoint(const IntPoint& point, DocumentMarker::MarkerType markerType)
-{
-    // 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) {
-        // inner loop; process each marker in this node
-        MarkerMapVectorPair* vectorPair = nodeIterator->second;
-        Vector<DocumentMarker>& markers = vectorPair->first;
-        Vector<IntRect>& rects = vectorPair->second;
-        ASSERT(markers.size() == rects.size());
-        unsigned markerCount = markers.size();
-        for (unsigned markerIndex = 0; markerIndex < markerCount; ++markerIndex) {
-            DocumentMarker& marker = markers[markerIndex];
-            
-            // skip marker that is wrong type
-            if (marker.type != markerType && markerType != DocumentMarker::AllMarkers)
-                continue;
-            
-            IntRect& r = rects[markerIndex];
-            
-            // skip placeholder rects
-            if (r == placeholderRectForMarker())
-                continue;
-            
-            if (r.contains(point))
-                return &marker;
-        }
-    }
-    
-    return 0;
-}
-
-Vector<DocumentMarker> Document::markersForNode(Node* node)
-{
-    MarkerMapVectorPair* vectorPair = m_markers.get(node);
-    if (vectorPair)
-        return vectorPair->first;
-    return Vector<DocumentMarker>();
-}
-
-Vector<IntRect> Document::renderedRectsForMarkers(DocumentMarker::MarkerType markerType)
-{
-    Vector<IntRect> result;
-    
-    // outer loop: process each node
-    MarkerMap::iterator end = m_markers.end();
-    for (MarkerMap::iterator nodeIterator = m_markers.begin(); nodeIterator != end; ++nodeIterator) {
-        // inner loop; process each marker in this node
-        MarkerMapVectorPair* vectorPair = nodeIterator->second;
-        Vector<DocumentMarker>& markers = vectorPair->first;
-        Vector<IntRect>& rects = vectorPair->second;
-        ASSERT(markers.size() == rects.size());
-        unsigned markerCount = markers.size();
-        for (unsigned markerIndex = 0; markerIndex < markerCount; ++markerIndex) {
-            DocumentMarker marker = markers[markerIndex];
-            
-            // skip marker that is wrong type
-            if (marker.type != markerType && markerType != DocumentMarker::AllMarkers)
-                continue;
-            
-            IntRect r = rects[markerIndex];
-            // skip placeholder rects
-            if (r == placeholderRectForMarker())
-                continue;
-
-            result.append(r);
-        }
-    }
-    
-    return result;
-}
-
-void Document::removeMarkers(Node* node)
-{
-    MarkerMap::iterator i = m_markers.find(node);
-    if (i != m_markers.end()) {
-        delete i->second;
-        m_markers.remove(i);
-        if (RenderObject* renderer = node->renderer())
-            renderer->repaint();
-    }
-}
-
-void Document::removeMarkers(DocumentMarker::MarkerType markerType)
-{
-    // outer loop: process each markered node in the document
-    MarkerMap markerMapCopy = m_markers;
-    MarkerMap::iterator end = markerMapCopy.end();
-    for (MarkerMap::iterator i = markerMapCopy.begin(); i != end; ++i) {
-        Node* node = i->first.get();
-        bool nodeNeedsRepaint = false;
-
-        // inner loop: process each marker in the current node
-        MarkerMapVectorPair* vectorPair = i->second;
-        Vector<DocumentMarker>& markers = vectorPair->first;
-        Vector<IntRect>& rects = vectorPair->second;
-        ASSERT(markers.size() == rects.size());
-        for (size_t i = 0; i != markers.size();) {
-            DocumentMarker marker = markers[i];
-
-            // skip nodes that are not of the specified type
-            if (marker.type != markerType && markerType != DocumentMarker::AllMarkers) {
-                ++i;
-                continue;
-            }
-
-            // pitch the old marker
-            markers.remove(i);
-            rects.remove(i);
-            nodeNeedsRepaint = true;
-            // markerIterator now points to the next node
-        }
-
-        // Redraw the node if it changed. Do this before the node is removed from m_markers, since 
-        // m_markers might contain the last reference to the node.
-        if (nodeNeedsRepaint) {
-            RenderObject* renderer = node->renderer();
-            if (renderer)
-                renderer->repaint();
-        }
-
-        // delete the node's list if it is now empty
-        if (markers.isEmpty()) {
-            ASSERT(rects.isEmpty());
-            m_markers.remove(node);
-            delete vectorPair;
-        }
-    }
-}
-
-void Document::repaintMarkers(DocumentMarker::MarkerType markerType)
-{
-    // outer loop: process each markered node in the document
-    MarkerMap::iterator end = m_markers.end();
-    for (MarkerMap::iterator i = m_markers.begin(); i != end; ++i) {
-        Node* node = i->first.get();
-        
-        // inner loop: process each marker in the current node
-        MarkerMapVectorPair* vectorPair = i->second;
-        Vector<DocumentMarker>& markers = vectorPair->first;
-        bool nodeNeedsRepaint = false;
-        for (size_t i = 0; i != markers.size(); ++i) {
-            DocumentMarker marker = markers[i];
-            
-            // skip nodes that are not of the specified type
-            if (marker.type == markerType || markerType == DocumentMarker::AllMarkers) {
-                nodeNeedsRepaint = true;
-                break;
-            }
-        }
-        
-        if (!nodeNeedsRepaint)
-            continue;
-        
-        // cause the node to be redrawn
-        if (RenderObject* renderer = node->renderer())
-            renderer->repaint();
-    }
-}
-
-void Document::setRenderedRectForMarker(Node* node, const DocumentMarker& marker, const IntRect& r)
-{
-    MarkerMapVectorPair* vectorPair = m_markers.get(node);
-    if (!vectorPair) {
-        ASSERT_NOT_REACHED(); // shouldn't be trying to set the rect for a marker we don't already know about
-        return;
-    }
-    
-    Vector<DocumentMarker>& markers = vectorPair->first;
-    ASSERT(markers.size() == vectorPair->second.size());
-    unsigned markerCount = markers.size();
-    for (unsigned markerIndex = 0; markerIndex < markerCount; ++markerIndex) {
-        DocumentMarker m = markers[markerIndex];
-        if (m == marker) {
-            vectorPair->second[markerIndex] = r;
-            return;
-        }
-    }
-    
-    ASSERT_NOT_REACHED(); // shouldn't be trying to set the rect for a marker we don't already know about
-}
-
-void Document::invalidateRenderedRectsForMarkersInRect(const IntRect& r)
-{
-    // outer loop: process each markered node in the document
-    MarkerMap::iterator end = m_markers.end();
-    for (MarkerMap::iterator i = m_markers.begin(); i != end; ++i) {
-        
-        // inner loop: process each rect in the current node
-        MarkerMapVectorPair* vectorPair = i->second;
-        Vector<IntRect>& rects = vectorPair->second;
-        
-        unsigned rectCount = rects.size();
-        for (unsigned rectIndex = 0; rectIndex < rectCount; ++rectIndex)
-            if (rects[rectIndex].intersects(r))
-                rects[rectIndex] = placeholderRectForMarker();
-    }
-}
-
-void Document::shiftMarkers(Node* node, unsigned startOffset, int delta, DocumentMarker::MarkerType markerType)
-{
-    MarkerMapVectorPair* vectorPair = m_markers.get(node);
-    if (!vectorPair)
-        return;
-    
-    Vector<DocumentMarker>& markers = vectorPair->first;
-    Vector<IntRect>& rects = vectorPair->second;
-    ASSERT(markers.size() == rects.size());
-    
-    bool docDirty = false;
-    for (size_t i = 0; i != markers.size(); ++i) {
-        DocumentMarker& marker = markers[i];
-        if (marker.startOffset >= startOffset && (markerType == DocumentMarker::AllMarkers || marker.type == markerType)) {
-            ASSERT((int)marker.startOffset + delta >= 0);
-            marker.startOffset += delta;
-            marker.endOffset += delta;
-            docDirty = true;
-            
-            // Marker moved, so previously-computed rendered rectangle is now invalid
-            rects[i] = placeholderRectForMarker();
-        }
-    }
-    
-    // repaint the affected node
-    if (docDirty && node->renderer())
-        node->renderer()->repaint();
-}
-
-void Document::setMarkersActive(Range* range, bool active)
-{
-    if (m_markers.isEmpty())
-        return;
-
-    ExceptionCode ec = 0;
-    Node* startContainer = range->startContainer(ec);
-    Node* endContainer = range->endContainer(ec);
-
-    Node* pastLastNode = range->pastLastNode();
-    for (Node* node = range->firstNode(); node != pastLastNode; node = node->traverseNextNode()) {
-        int startOffset = node == startContainer ? range->startOffset(ec) : 0;
-        int endOffset = node == endContainer ? range->endOffset(ec) : INT_MAX;
-        setMarkersActive(node, startOffset, endOffset, active);
-    }
-}
-
-void Document::setMarkersActive(Node* node, unsigned startOffset, unsigned endOffset, bool active)
-{
-    MarkerMapVectorPair* vectorPair = m_markers.get(node);
-    if (!vectorPair)
-        return;
-
-    Vector<DocumentMarker>& markers = vectorPair->first;
-    ASSERT(markers.size() == vectorPair->second.size());
-
-    bool docDirty = false;
-    for (size_t i = 0; i != markers.size(); ++i) {
-        DocumentMarker& marker = markers[i];
-
-        // Markers are returned in order, so stop if we are now past the specified range.
-        if (marker.startOffset >= endOffset)
-            break;
-
-        // Skip marker that is wrong type or before target.
-        if (marker.endOffset < startOffset || marker.type != DocumentMarker::TextMatch)
-            continue;
-
-        marker.activeMatch = active;
-        docDirty = true;
-    }
-
-    // repaint the affected node
-    if (docDirty && node->renderer())
-        node->renderer()->repaint();
-}
-
 #if ENABLE(XSLT)
 
 void Document::applyXSLTransform(ProcessingInstruction* pi)
diff --git a/WebCore/dom/Document.h b/WebCore/dom/Document.h
index 748b776..65ef13f 100644
--- a/WebCore/dom/Document.h
+++ b/WebCore/dom/Document.h
@@ -32,7 +32,7 @@
 #include "CollectionType.h"
 #include "Color.h"
 #include "ContainerNode.h"
-#include "DocumentMarker.h"
+#include "DocumentMarkerController.h"
 #include "QualifiedName.h"
 #include "ScriptExecutionContext.h"
 #include "Timer.h"
@@ -811,6 +811,8 @@ public:
 
     HTMLHeadElement* head();
 
+    DocumentMarkerController* markers() const { return m_markers.get(); }
+
     bool execCommand(const String& command, bool userInterface = false, const String& value = String());
     bool queryCommandEnabled(const String& command);
     bool queryCommandIndeterm(const String& command);
@@ -818,24 +820,6 @@ public:
     bool queryCommandSupported(const String& command);
     String queryCommandValue(const String& command);
     
-    void addMarker(Range*, DocumentMarker::MarkerType, String description = String());
-    void addMarker(Node*, DocumentMarker);
-    void copyMarkers(Node *srcNode, unsigned startOffset, int length, Node *dstNode, int delta, DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
-    void removeMarkers(Range*, DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
-    void removeMarkers(Node*, unsigned startOffset, int length, DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
-    void removeMarkers(DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
-    void removeMarkers(Node*);
-    void repaintMarkers(DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
-    void setRenderedRectForMarker(Node*, const DocumentMarker&, const IntRect&);
-    void invalidateRenderedRectsForMarkersInRect(const IntRect&);
-    void shiftMarkers(Node*, unsigned startOffset, int delta, DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
-    void setMarkersActive(Range*, bool);
-    void setMarkersActive(Node*, unsigned startOffset, unsigned endOffset, bool);
-
-    DocumentMarker* markerContainingPoint(const IntPoint&, DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
-    Vector<DocumentMarker> markersForNode(Node*);
-    Vector<IntRect> renderedRectsForMarkers(DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
-    
     // designMode support
     enum InheritedBool { off = false, on = true, inherit };    
     void setDesignMode(InheritedBool value);
@@ -1185,11 +1169,8 @@ private:
 
     OwnPtr<RenderArena> m_renderArena;
 
-    typedef std::pair<Vector<DocumentMarker>, Vector<IntRect> > MarkerMapVectorPair;
-    typedef HashMap<RefPtr<Node>, MarkerMapVectorPair*> MarkerMap;
-    MarkerMap m_markers;
-
     mutable AXObjectCache* m_axObjectCache;
+    OwnPtr<DocumentMarkerController> m_markers;
     
     Timer<Document> m_updateFocusAppearanceTimer;
 
diff --git a/WebCore/dom/DocumentMarkerController.cpp b/WebCore/dom/DocumentMarkerController.cpp
new file mode 100644
index 0000000..2b7fd85
--- /dev/null
+++ b/WebCore/dom/DocumentMarkerController.cpp
@@ -0,0 +1,527 @@
+/*
+ * Copyright (C) 1999 Lars Knoll (knoll at kde.org)
+ *           (C) 1999 Antti Koivisto (koivisto at kde.org)
+ *           (C) 2001 Dirk Mueller (mueller at kde.org)
+ *           (C) 2006 Alexey Proskuryakov (ap at webkit.org)
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
+ * Copyright (C) Research In Motion Limited 2010. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "config.h"
+#include "DocumentMarkerController.h"
+
+#include "Node.h"
+#include "Range.h"
+#include "TextIterator.h"
+
+namespace WebCore {
+
+static IntRect placeholderRectForMarker()
+{
+    return IntRect(-1, -1, -1, -1);
+}
+
+void DocumentMarkerController::detach()
+{
+    if (m_markers.isEmpty())
+        return;
+    deleteAllValues(m_markers);
+    m_markers.clear();
+}
+
+void DocumentMarkerController::addMarker(Range* range, DocumentMarker::MarkerType type, String description)
+{
+    // Use a TextIterator to visit the potentially multiple nodes the range covers.
+    for (TextIterator markedText(range); !markedText.atEnd(); markedText.advance()) {
+        RefPtr<Range> textPiece = markedText.range();
+        int exception = 0;
+        DocumentMarker marker = {type, textPiece->startOffset(exception), textPiece->endOffset(exception), description, false};
+        addMarker(textPiece->startContainer(exception), marker);
+    }
+}
+
+void DocumentMarkerController::removeMarkers(Range* range, DocumentMarker::MarkerType markerType)
+{
+    if (m_markers.isEmpty())
+        return;
+
+    ExceptionCode ec = 0;
+    Node* startContainer = range->startContainer(ec);
+    Node* endContainer = range->endContainer(ec);
+
+    Node* pastLastNode = range->pastLastNode();
+    for (Node* node = range->firstNode(); node != pastLastNode; node = node->traverseNextNode()) {
+        int startOffset = node == startContainer ? range->startOffset(ec) : 0;
+        int endOffset = node == endContainer ? range->endOffset(ec) : INT_MAX;
+        int length = endOffset - startOffset;
+        removeMarkers(node, startOffset, length, markerType);
+    }
+}
+
+// Markers are stored in order sorted by their start offset.
+// Markers of the same type do not overlap each other.
+
+void DocumentMarkerController::addMarker(Node* node, DocumentMarker newMarker) 
+{
+    ASSERT(newMarker.endOffset >= newMarker.startOffset);
+    if (newMarker.endOffset == newMarker.startOffset)
+        return;
+
+    MarkerMapVectorPair* vectorPair = m_markers.get(node);
+
+    if (!vectorPair) {
+        vectorPair = new MarkerMapVectorPair;
+        vectorPair->first.append(newMarker);
+        vectorPair->second.append(placeholderRectForMarker());
+        m_markers.set(node, vectorPair);
+    } else {
+        Vector<DocumentMarker>& markers = vectorPair->first;
+        Vector<IntRect>& rects = vectorPair->second;
+        size_t numMarkers = markers.size();
+        ASSERT(numMarkers == rects.size());
+        size_t i;
+        // Iterate over all markers whose start offset is less than or equal to the new marker's.
+        // If one of them is of the same type as the new marker and touches it or intersects with it
+        // (there is at most one), remove it and adjust the new marker's start offset to encompass it.
+        for (i = 0; i < numMarkers; ++i) {
+            DocumentMarker marker = markers[i];
+            if (marker.startOffset > newMarker.startOffset)
+                break;
+            if (marker.type == newMarker.type && marker.endOffset >= newMarker.startOffset) {
+                newMarker.startOffset = marker.startOffset;
+                markers.remove(i);
+                rects.remove(i);
+                numMarkers--;
+                break;
+            }
+        }
+        size_t j = i;
+        // Iterate over all markers whose end offset is less than or equal to the new marker's,
+        // removing markers of the same type as the new marker which touch it or intersect with it,
+        // adjusting the new marker's end offset to cover them if necessary.
+        while (j < numMarkers) {
+            DocumentMarker marker = markers[j];
+            if (marker.startOffset > newMarker.endOffset)
+                break;
+            if (marker.type == newMarker.type) {
+                markers.remove(j);
+                rects.remove(j);
+                if (newMarker.endOffset <= marker.endOffset) {
+                    newMarker.endOffset = marker.endOffset;
+                    break;
+                }
+                numMarkers--;
+            } else
+                j++;
+        }
+        // At this point i points to the node before which we want to insert.
+        markers.insert(i, newMarker);
+        rects.insert(i, placeholderRectForMarker());
+    }
+
+    // repaint the affected node
+    if (node->renderer())
+        node->renderer()->repaint();
+}
+
+// copies markers from srcNode to dstNode, applying the specified shift delta to the copies.  The shift is
+// useful if, e.g., the caller has created the dstNode from a non-prefix substring of the srcNode.
+void DocumentMarkerController::copyMarkers(Node* srcNode, unsigned startOffset, int length, Node* dstNode, int delta, DocumentMarker::MarkerType markerType)
+{
+    if (length <= 0)
+        return;
+
+    MarkerMapVectorPair* vectorPair = m_markers.get(srcNode);
+    if (!vectorPair)
+        return;
+
+    ASSERT(vectorPair->first.size() == vectorPair->second.size());
+
+    bool docDirty = false;
+    unsigned endOffset = startOffset + length - 1;
+    Vector<DocumentMarker>& markers = vectorPair->first;
+    for (size_t i = 0; i != markers.size(); ++i) {
+        DocumentMarker marker = markers[i];
+
+        // stop if we are now past the specified range
+        if (marker.startOffset > endOffset)
+            break;
+
+        // skip marker that is before the specified range or is the wrong type
+        if (marker.endOffset < startOffset || (marker.type != markerType && markerType != DocumentMarker::AllMarkers))
+            continue;
+
+        // pin the marker to the specified range and apply the shift delta
+        docDirty = true;
+        if (marker.startOffset < startOffset)
+            marker.startOffset = startOffset;
+        if (marker.endOffset > endOffset)
+            marker.endOffset = endOffset;
+        marker.startOffset += delta;
+        marker.endOffset += delta;
+
+        addMarker(dstNode, marker);
+    }
+
+    // repaint the affected node
+    if (docDirty && dstNode->renderer())
+        dstNode->renderer()->repaint();
+}
+
+void DocumentMarkerController::removeMarkers(Node* node, unsigned startOffset, int length, DocumentMarker::MarkerType markerType)
+{
+    if (length <= 0)
+        return;
+
+    MarkerMapVectorPair* vectorPair = m_markers.get(node);
+    if (!vectorPair)
+        return;
+
+    Vector<DocumentMarker>& markers = vectorPair->first;
+    Vector<IntRect>& rects = vectorPair->second;
+    ASSERT(markers.size() == rects.size());
+    bool docDirty = false;
+    unsigned endOffset = startOffset + length;
+    for (size_t i = 0; i < markers.size();) {
+        DocumentMarker marker = markers[i];
+
+        // markers are returned in order, so stop if we are now past the specified range
+        if (marker.startOffset >= endOffset)
+            break;
+
+        // skip marker that is wrong type or before target
+        if (marker.endOffset < startOffset || (marker.type != markerType && markerType != DocumentMarker::AllMarkers)) {
+            i++;
+            continue;
+        }
+
+        // at this point we know that marker and target intersect in some way
+        docDirty = true;
+
+        // pitch the old marker and any associated rect
+        markers.remove(i);
+        rects.remove(i);
+
+        // add either of the resulting slices that are left after removing target
+        if (startOffset > marker.startOffset) {
+            DocumentMarker newLeft = marker;
+            newLeft.endOffset = startOffset;
+            markers.insert(i, newLeft);
+            rects.insert(i, placeholderRectForMarker());
+            // i now points to the newly-inserted node, but we want to skip that one
+            i++;
+        }
+        if (marker.endOffset > endOffset) {
+            DocumentMarker newRight = marker;
+            newRight.startOffset = endOffset;
+            markers.insert(i, newRight);
+            rects.insert(i, placeholderRectForMarker());
+            // i now points to the newly-inserted node, but we want to skip that one
+            i++;
+        }
+    }
+
+    if (markers.isEmpty()) {
+        ASSERT(rects.isEmpty());
+        m_markers.remove(node);
+        delete vectorPair;
+    }
+
+    // repaint the affected node
+    if (docDirty && node->renderer())
+        node->renderer()->repaint();
+}
+
+DocumentMarker* DocumentMarkerController::markerContainingPoint(const IntPoint& point, DocumentMarker::MarkerType markerType)
+{
+    // 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) {
+        // inner loop; process each marker in this node
+        MarkerMapVectorPair* vectorPair = nodeIterator->second;
+        Vector<DocumentMarker>& markers = vectorPair->first;
+        Vector<IntRect>& rects = vectorPair->second;
+        ASSERT(markers.size() == rects.size());
+        unsigned markerCount = markers.size();
+        for (unsigned markerIndex = 0; markerIndex < markerCount; ++markerIndex) {
+            DocumentMarker& marker = markers[markerIndex];
+
+            // skip marker that is wrong type
+            if (marker.type != markerType && markerType != DocumentMarker::AllMarkers)
+                continue;
+
+            IntRect& r = rects[markerIndex];
+
+            // skip placeholder rects
+            if (r == placeholderRectForMarker())
+                continue;
+
+            if (r.contains(point))
+                return &marker;
+        }
+    }
+
+    return 0;
+}
+
+Vector<DocumentMarker> DocumentMarkerController::markersForNode(Node* node)
+{
+    MarkerMapVectorPair* vectorPair = m_markers.get(node);
+    if (vectorPair)
+        return vectorPair->first;
+    return Vector<DocumentMarker>();
+}
+
+Vector<IntRect> DocumentMarkerController::renderedRectsForMarkers(DocumentMarker::MarkerType markerType)
+{
+    Vector<IntRect> result;
+
+    // outer loop: process each node
+    MarkerMap::iterator end = m_markers.end();
+    for (MarkerMap::iterator nodeIterator = m_markers.begin(); nodeIterator != end; ++nodeIterator) {
+        // inner loop; process each marker in this node
+        MarkerMapVectorPair* vectorPair = nodeIterator->second;
+        Vector<DocumentMarker>& markers = vectorPair->first;
+        Vector<IntRect>& rects = vectorPair->second;
+        ASSERT(markers.size() == rects.size());
+        unsigned markerCount = markers.size();
+        for (unsigned markerIndex = 0; markerIndex < markerCount; ++markerIndex) {
+            DocumentMarker marker = markers[markerIndex];
+
+            // skip marker that is wrong type
+            if (marker.type != markerType && markerType != DocumentMarker::AllMarkers)
+                continue;
+
+            IntRect r = rects[markerIndex];
+            // skip placeholder rects
+            if (r == placeholderRectForMarker())
+                continue;
+
+            result.append(r);
+        }
+    }
+
+    return result;
+}
+
+void DocumentMarkerController::removeMarkers(Node* node)
+{
+    MarkerMap::iterator i = m_markers.find(node);
+    if (i != m_markers.end()) {
+        delete i->second;
+        m_markers.remove(i);
+        if (RenderObject* renderer = node->renderer())
+            renderer->repaint();
+    }
+}
+
+void DocumentMarkerController::removeMarkers(DocumentMarker::MarkerType markerType)
+{
+    // outer loop: process each markered node in the document
+    MarkerMap markerMapCopy = m_markers;
+    MarkerMap::iterator end = markerMapCopy.end();
+    for (MarkerMap::iterator i = markerMapCopy.begin(); i != end; ++i) {
+        Node* node = i->first.get();
+        bool nodeNeedsRepaint = false;
+
+        // inner loop: process each marker in the current node
+        MarkerMapVectorPair* vectorPair = i->second;
+        Vector<DocumentMarker>& markers = vectorPair->first;
+        Vector<IntRect>& rects = vectorPair->second;
+        ASSERT(markers.size() == rects.size());
+        for (size_t i = 0; i != markers.size();) {
+            DocumentMarker marker = markers[i];
+
+            // skip nodes that are not of the specified type
+            if (marker.type != markerType && markerType != DocumentMarker::AllMarkers) {
+                ++i;
+                continue;
+            }
+
+            // pitch the old marker
+            markers.remove(i);
+            rects.remove(i);
+            nodeNeedsRepaint = true;
+            // markerIterator now points to the next node
+        }
+
+        // Redraw the node if it changed. Do this before the node is removed from m_markers, since 
+        // m_markers might contain the last reference to the node.
+        if (nodeNeedsRepaint) {
+            RenderObject* renderer = node->renderer();
+            if (renderer)
+                renderer->repaint();
+        }
+
+        // delete the node's list if it is now empty
+        if (markers.isEmpty()) {
+            ASSERT(rects.isEmpty());
+            m_markers.remove(node);
+            delete vectorPair;
+        }
+    }
+}
+
+void DocumentMarkerController::repaintMarkers(DocumentMarker::MarkerType markerType)
+{
+    // outer loop: process each markered node in the document
+    MarkerMap::iterator end = m_markers.end();
+    for (MarkerMap::iterator i = m_markers.begin(); i != end; ++i) {
+        Node* node = i->first.get();
+
+        // inner loop: process each marker in the current node
+        MarkerMapVectorPair* vectorPair = i->second;
+        Vector<DocumentMarker>& markers = vectorPair->first;
+        bool nodeNeedsRepaint = false;
+        for (size_t i = 0; i != markers.size(); ++i) {
+            DocumentMarker marker = markers[i];
+
+            // skip nodes that are not of the specified type
+            if (marker.type == markerType || markerType == DocumentMarker::AllMarkers) {
+                nodeNeedsRepaint = true;
+                break;
+            }
+        }
+
+        if (!nodeNeedsRepaint)
+            continue;
+
+        // cause the node to be redrawn
+        if (RenderObject* renderer = node->renderer())
+            renderer->repaint();
+    }
+}
+
+void DocumentMarkerController::setRenderedRectForMarker(Node* node, const DocumentMarker& marker, const IntRect& r)
+{
+    MarkerMapVectorPair* vectorPair = m_markers.get(node);
+    if (!vectorPair) {
+        ASSERT_NOT_REACHED(); // shouldn't be trying to set the rect for a marker we don't already know about
+        return;
+    }
+
+    Vector<DocumentMarker>& markers = vectorPair->first;
+    ASSERT(markers.size() == vectorPair->second.size());
+    unsigned markerCount = markers.size();
+    for (unsigned markerIndex = 0; markerIndex < markerCount; ++markerIndex) {
+        DocumentMarker m = markers[markerIndex];
+        if (m == marker) {
+            vectorPair->second[markerIndex] = r;
+            return;
+        }
+    }
+
+    ASSERT_NOT_REACHED(); // shouldn't be trying to set the rect for a marker we don't already know about
+}
+
+void DocumentMarkerController::invalidateRenderedRectsForMarkersInRect(const IntRect& r)
+{
+    // outer loop: process each markered node in the document
+    MarkerMap::iterator end = m_markers.end();
+    for (MarkerMap::iterator i = m_markers.begin(); i != end; ++i) {
+
+        // inner loop: process each rect in the current node
+        MarkerMapVectorPair* vectorPair = i->second;
+        Vector<IntRect>& rects = vectorPair->second;
+
+        unsigned rectCount = rects.size();
+        for (unsigned rectIndex = 0; rectIndex < rectCount; ++rectIndex)
+            if (rects[rectIndex].intersects(r))
+                rects[rectIndex] = placeholderRectForMarker();
+    }
+}
+
+void DocumentMarkerController::shiftMarkers(Node* node, unsigned startOffset, int delta, DocumentMarker::MarkerType markerType)
+{
+    MarkerMapVectorPair* vectorPair = m_markers.get(node);
+    if (!vectorPair)
+        return;
+
+    Vector<DocumentMarker>& markers = vectorPair->first;
+    Vector<IntRect>& rects = vectorPair->second;
+    ASSERT(markers.size() == rects.size());
+
+    bool docDirty = false;
+    for (size_t i = 0; i != markers.size(); ++i) {
+        DocumentMarker& marker = markers[i];
+        if (marker.startOffset >= startOffset && (markerType == DocumentMarker::AllMarkers || marker.type == markerType)) {
+            ASSERT((int)marker.startOffset + delta >= 0);
+            marker.startOffset += delta;
+            marker.endOffset += delta;
+            docDirty = true;
+
+            // Marker moved, so previously-computed rendered rectangle is now invalid
+            rects[i] = placeholderRectForMarker();
+        }
+    }
+
+    // repaint the affected node
+    if (docDirty && node->renderer())
+        node->renderer()->repaint();
+}
+
+void DocumentMarkerController::setMarkersActive(Range* range, bool active)
+{
+    if (m_markers.isEmpty())
+        return;
+
+    ExceptionCode ec = 0;
+    Node* startContainer = range->startContainer(ec);
+    Node* endContainer = range->endContainer(ec);
+
+    Node* pastLastNode = range->pastLastNode();
+    for (Node* node = range->firstNode(); node != pastLastNode; node = node->traverseNextNode()) {
+        int startOffset = node == startContainer ? range->startOffset(ec) : 0;
+        int endOffset = node == endContainer ? range->endOffset(ec) : INT_MAX;
+        setMarkersActive(node, startOffset, endOffset, active);
+    }
+}
+
+void DocumentMarkerController::setMarkersActive(Node* node, unsigned startOffset, unsigned endOffset, bool active)
+{
+    MarkerMapVectorPair* vectorPair = m_markers.get(node);
+    if (!vectorPair)
+        return;
+
+    Vector<DocumentMarker>& markers = vectorPair->first;
+    ASSERT(markers.size() == vectorPair->second.size());
+
+    bool docDirty = false;
+    for (size_t i = 0; i != markers.size(); ++i) {
+        DocumentMarker& marker = markers[i];
+
+        // Markers are returned in order, so stop if we are now past the specified range.
+        if (marker.startOffset >= endOffset)
+            break;
+
+        // Skip marker that is wrong type or before target.
+        if (marker.endOffset < startOffset || marker.type != DocumentMarker::TextMatch)
+            continue;
+
+        marker.activeMatch = active;
+        docDirty = true;
+    }
+
+    // repaint the affected node
+    if (docDirty && node->renderer())
+        node->renderer()->repaint();
+}
+
+} // namespace WebCore
diff --git a/WebCore/dom/DocumentMarkerController.h b/WebCore/dom/DocumentMarkerController.h
new file mode 100644
index 0000000..8921baa
--- /dev/null
+++ b/WebCore/dom/DocumentMarkerController.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 1999 Lars Knoll (knoll at kde.org)
+ *           (C) 1999 Antti Koivisto (koivisto at kde.org)
+ *           (C) 2001 Dirk Mueller (mueller at kde.org)
+ *           (C) 2006 Alexey Proskuryakov (ap at webkit.org)
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
+ * Copyright (C) Research In Motion Limited 2010. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef DocumentMarkerController_h
+#define DocumentMarkerController_h
+
+#include "DocumentMarker.h"
+#include <wtf/HashMap.h>
+#include <wtf/Vector.h>
+
+namespace WebCore {
+
+class IntPoint;
+class IntRect;
+class Node;
+class Range;
+
+class DocumentMarkerController : public Noncopyable {
+public:
+    ~DocumentMarkerController() { detach(); }
+
+    void detach();
+    void addMarker(Range*, DocumentMarker::MarkerType, String description = String());
+    void addMarker(Node*, DocumentMarker);
+    void copyMarkers(Node* srcNode, unsigned startOffset, int length, Node* dstNode, int delta, DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
+    void removeMarkers(Range*, DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
+    void removeMarkers(Node*, unsigned startOffset, int length, DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
+    void removeMarkers(DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
+    void removeMarkers(Node*);
+    void repaintMarkers(DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
+    void setRenderedRectForMarker(Node*, const DocumentMarker&, const IntRect&);
+    void invalidateRenderedRectsForMarkersInRect(const IntRect&);
+    void shiftMarkers(Node*, unsigned startOffset, int delta, DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
+    void setMarkersActive(Range*, bool);
+    void setMarkersActive(Node*, unsigned startOffset, unsigned endOffset, bool);
+
+    DocumentMarker* markerContainingPoint(const IntPoint&, DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
+    Vector<DocumentMarker> markersForNode(Node*);
+    Vector<IntRect> renderedRectsForMarkers(DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
+
+private:
+    typedef std::pair<Vector<DocumentMarker>, Vector<IntRect> > MarkerMapVectorPair;
+    typedef HashMap<RefPtr<Node>, MarkerMapVectorPair*> MarkerMap;
+    MarkerMap m_markers;
+};
+
+} // namespace WebCore
+
+#endif // DocumentMarkerController_h
diff --git a/WebCore/editing/Editor.cpp b/WebCore/editing/Editor.cpp
index 196384a..0052a55 100644
--- a/WebCore/editing/Editor.cpp
+++ b/WebCore/editing/Editor.cpp
@@ -1563,7 +1563,7 @@ void Editor::ignoreSpelling()
         
     RefPtr<Range> selectedRange = frame()->selection()->toNormalizedRange();
     if (selectedRange)
-        frame()->document()->removeMarkers(selectedRange.get(), DocumentMarker::Spelling);
+        frame()->document()->markers()->removeMarkers(selectedRange.get(), DocumentMarker::Spelling);
 
     String text = frame()->selectedText();
     ASSERT(text.length());
@@ -1629,7 +1629,7 @@ static String findFirstMisspellingInRange(EditorClient* client, Range* searchRan
 
                 // Store marker for misspelled word.
                 ExceptionCode ec = 0;
-                misspellingRange->startContainer(ec)->document()->addMarker(misspellingRange.get(), DocumentMarker::Spelling);
+                misspellingRange->startContainer(ec)->document()->markers()->addMarker(misspellingRange.get(), DocumentMarker::Spelling);
                 ASSERT(!ec);
 
                 // Bail out if we're marking only the first misspelling, and not all instances.
@@ -1692,7 +1692,7 @@ static int findFirstGrammarDetailInRange(const Vector<GrammarDetail>& grammarDet
         if (markAll) {
             RefPtr<Range> badGrammarRange = TextIterator::subrange(searchRange, badGrammarPhraseLocation - startOffset + detail->location, detail->length);
             ExceptionCode ec = 0;
-            badGrammarRange->startContainer(ec)->document()->addMarker(badGrammarRange.get(), DocumentMarker::Grammar, detail->userDescription);
+            badGrammarRange->startContainer(ec)->document()->markers()->addMarker(badGrammarRange.get(), DocumentMarker::Grammar, detail->userDescription);
             ASSERT(!ec);
         }
         
@@ -2063,7 +2063,7 @@ void Editor::advanceToNextMisspelling(bool startBeforeSelection)
         frame()->revealSelection();
         
         client()->updateSpellingUIWithGrammarString(badGrammarPhrase, grammarDetail);
-        frame()->document()->addMarker(badGrammarRange.get(), DocumentMarker::Grammar, grammarDetail.userDescription);
+        frame()->document()->markers()->addMarker(badGrammarRange.get(), DocumentMarker::Grammar, grammarDetail.userDescription);
 #endif        
     } else if (!misspelledWord.isEmpty()) {
         // We found a misspelling, but not any earlier bad grammar. Select the misspelling, update the spelling panel, and store
@@ -2074,7 +2074,7 @@ void Editor::advanceToNextMisspelling(bool startBeforeSelection)
         frame()->revealSelection();
         
         client()->updateSpellingUIWithMisspelledWord(misspelledWord);
-        frame()->document()->addMarker(misspellingRange.get(), DocumentMarker::Spelling);
+        frame()->document()->markers()->addMarker(misspellingRange.get(), DocumentMarker::Spelling);
     }
 }
 
@@ -2543,7 +2543,7 @@ void Editor::markAllMisspellingsAndBadGrammarInRanges(bool markSpelling, Range*
         if (markSpelling && result->type == TextCheckingTypeSpelling && resultLocation >= spellingRangeStartOffset && resultLocation + resultLength <= spellingRangeEndOffset) {
             ASSERT(resultLength > 0 && resultLocation >= 0);
             RefPtr<Range> misspellingRange = TextIterator::subrange(spellingRange, resultLocation - spellingRangeStartOffset, resultLength);
-            misspellingRange->startContainer(ec)->document()->addMarker(misspellingRange.get(), DocumentMarker::Spelling);
+            misspellingRange->startContainer(ec)->document()->markers()->addMarker(misspellingRange.get(), DocumentMarker::Spelling);
         } else if (markGrammar && result->type == TextCheckingTypeGrammar && resultLocation < grammarRangeEndOffset && resultLocation + resultLength > grammarRangeStartOffset) {
             ASSERT(resultLength > 0 && resultLocation >= 0);
             for (unsigned j = 0; j < result->details.size(); j++) {
@@ -2551,7 +2551,7 @@ void Editor::markAllMisspellingsAndBadGrammarInRanges(bool markSpelling, Range*
                 ASSERT(detail->length > 0 && detail->location >= 0);
                 if (resultLocation + detail->location >= grammarRangeStartOffset && resultLocation + detail->location + detail->length <= grammarRangeEndOffset) {
                     RefPtr<Range> badGrammarRange = TextIterator::subrange(grammarRange, resultLocation + detail->location - grammarRangeStartOffset, detail->length);
-                    grammarRange->startContainer(ec)->document()->addMarker(badGrammarRange.get(), DocumentMarker::Grammar, detail->userDescription);
+                    grammarRange->startContainer(ec)->document()->markers()->addMarker(badGrammarRange.get(), DocumentMarker::Grammar, detail->userDescription);
                 }
             }
         } else if (performTextCheckingReplacements && resultLocation + resultLength <= spellingRangeEndOffset && resultLocation + resultLength >= spellingRangeStartOffset
@@ -2581,7 +2581,7 @@ void Editor::markAllMisspellingsAndBadGrammarInRanges(bool markSpelling, Range*
                 Node* node = rangeToReplace->startContainer();
                 int startOffset = rangeToReplace->startOffset();
                 int endOffset = startOffset + replacementLength;
-                Vector<DocumentMarker> markers = node->document()->markersForNode(node);
+                Vector<DocumentMarker> markers = node->document()->markers()->markersForNode(node);
                 size_t markerCount = markers.size();
                 for (size_t i = 0; i < markerCount; ++i) {
                     const DocumentMarker& marker = markers[i];
@@ -2618,7 +2618,7 @@ void Editor::markAllMisspellingsAndBadGrammarInRanges(bool markSpelling, Range*
                     if (result->type == TextCheckingTypeCorrection) {
                         // Add a marker so that corrections can easily be undone and won't be re-corrected.
                         RefPtr<Range> replacedRange = TextIterator::subrange(paragraphRange.get(), resultLocation, replacementLength);
-                        replacedRange->startContainer()->document()->addMarker(replacedRange.get(), DocumentMarker::Replacement, replacedString);
+                        replacedRange->startContainer()->document()->markers()->addMarker(replacedRange.get(), DocumentMarker::Replacement, replacedString);
                     }
                 }
             }
@@ -2656,7 +2656,7 @@ void Editor::changeBackToReplacedString(const String& replacedString)
     RefPtr<Range> paragraphRange = paragraphAlignedRangeForRange(selection.get(), selectionOffset, paragraphString);
     replaceSelectionWithText(replacedString, false, false);
     RefPtr<Range> changedRange = TextIterator::subrange(paragraphRange.get(), selectionOffset, replacedString.length());
-    changedRange->startContainer()->document()->addMarker(changedRange.get(), DocumentMarker::Replacement, String());
+    changedRange->startContainer()->document()->markers()->addMarker(changedRange.get(), DocumentMarker::Replacement, String());
 }
 
 #endif
diff --git a/WebCore/editing/SplitTextNodeCommand.cpp b/WebCore/editing/SplitTextNodeCommand.cpp
index 9a7e3b3..1f38902 100644
--- a/WebCore/editing/SplitTextNodeCommand.cpp
+++ b/WebCore/editing/SplitTextNodeCommand.cpp
@@ -60,7 +60,7 @@ void SplitTextNodeCommand::doApply()
 
     m_text1 = Text::create(document(), prefixText);
     ASSERT(m_text1);
-    document()->copyMarkers(m_text2.get(), 0, m_offset, m_text1.get(), 0);
+    document()->markers()->copyMarkers(m_text2.get(), 0, m_offset, m_text1.get(), 0);
 
     insertText1AndTrimText2();
 }
@@ -78,7 +78,7 @@ void SplitTextNodeCommand::doUnapply()
     m_text2->insertData(0, prefixText, ec);
     ASSERT(!ec);
 
-    document()->copyMarkers(m_text1.get(), 0, prefixText.length(), m_text2.get(), 0);
+    document()->markers()->copyMarkers(m_text1.get(), 0, prefixText.length(), m_text2.get(), 0);
     m_text1->remove(ec);
 }
 
diff --git a/WebCore/page/Frame.cpp b/WebCore/page/Frame.cpp
index 165aa32..6f74f93 100644
--- a/WebCore/page/Frame.cpp
+++ b/WebCore/page/Frame.cpp
@@ -1277,7 +1277,7 @@ unsigned Frame::markAllMatchesForText(const String& target, bool caseFlag, unsig
         // Only treat the result as a match if it is visible
         if (editor()->insideVisibleArea(resultRange.get())) {
             ++matchCount;
-            document()->addMarker(resultRange.get(), DocumentMarker::TextMatch);
+            document()->markers()->addMarker(resultRange.get(), DocumentMarker::TextMatch);
         }
 
         // Stop looking if we hit the specified limit. A limit of 0 means no limit.
@@ -1317,7 +1317,7 @@ void Frame::setMarkedTextMatchesAreHighlighted(bool flag)
         return;
 
     m_highlightTextMatches = flag;
-    document()->repaintMarkers(DocumentMarker::TextMatch);
+    document()->markers()->repaintMarkers(DocumentMarker::TextMatch);
 }
 
 void Frame::setDOMWindow(DOMWindow* domWindow)
@@ -1463,16 +1463,16 @@ void Frame::respondToChangedSelection(const VisibleSelection& oldSelection, bool
         // This only erases markers that are in the first unit (word or sentence) of the selection.
         // Perhaps peculiar, but it matches AppKit.
         if (RefPtr<Range> wordRange = newAdjacentWords.toNormalizedRange())
-            document()->removeMarkers(wordRange.get(), DocumentMarker::Spelling);
+            document()->markers()->removeMarkers(wordRange.get(), DocumentMarker::Spelling);
         if (RefPtr<Range> sentenceRange = newSelectedSentence.toNormalizedRange())
-            document()->removeMarkers(sentenceRange.get(), DocumentMarker::Grammar);
+            document()->markers()->removeMarkers(sentenceRange.get(), DocumentMarker::Grammar);
     }
 
     // When continuous spell checking is off, existing markers disappear after the selection changes.
     if (!isContinuousSpellCheckingEnabled)
-        document()->removeMarkers(DocumentMarker::Spelling);
+        document()->markers()->removeMarkers(DocumentMarker::Spelling);
     if (!isContinuousGrammarCheckingEnabled)
-        document()->removeMarkers(DocumentMarker::Grammar);
+        document()->markers()->removeMarkers(DocumentMarker::Grammar);
 
     editor()->respondToChangedSelection(oldSelection);
 }
diff --git a/WebCore/page/FrameView.cpp b/WebCore/page/FrameView.cpp
index 9127333..76fec1e 100644
--- a/WebCore/page/FrameView.cpp
+++ b/WebCore/page/FrameView.cpp
@@ -1743,7 +1743,7 @@ void FrameView::invalidateScrollbarRect(Scrollbar* scrollbar, const IntRect& rec
 
 void FrameView::getTickmarks(Vector<IntRect>& tickmarks) const
 {
-    tickmarks = frame()->document()->renderedRectsForMarkers(DocumentMarker::TextMatch);
+    tickmarks = frame()->document()->markers()->renderedRectsForMarkers(DocumentMarker::TextMatch);
 }
 
 IntRect FrameView::windowResizerRect() const
@@ -1950,7 +1950,7 @@ void FrameView::paintContents(GraphicsContext* p, const IntRect& rect)
 
     PaintBehavior oldPaintBehavior = m_paintBehavior;
     if (m_paintBehavior == PaintBehaviorNormal)
-        document->invalidateRenderedRectsForMarkersInRect(rect);
+        document->markers()->invalidateRenderedRectsForMarkersInRect(rect);
 
     if (document->printing())
         m_paintBehavior |= PaintBehaviorFlattenCompositingLayers;
diff --git a/WebCore/page/Page.cpp b/WebCore/page/Page.cpp
index 5d42752..f80ab7d 100644
--- a/WebCore/page/Page.cpp
+++ b/WebCore/page/Page.cpp
@@ -540,7 +540,7 @@ void Page::unmarkAllTextMatches()
 
     Frame* frame = mainFrame();
     do {
-        frame->document()->removeMarkers(DocumentMarker::TextMatch);
+        frame->document()->markers()->removeMarkers(DocumentMarker::TextMatch);
         frame = incrementFrame(frame, true, false);
     } while (frame);
 }
diff --git a/WebCore/rendering/HitTestResult.cpp b/WebCore/rendering/HitTestResult.cpp
index dd96e0e..496c4ba 100644
--- a/WebCore/rendering/HitTestResult.cpp
+++ b/WebCore/rendering/HitTestResult.cpp
@@ -166,7 +166,7 @@ String HitTestResult::spellingToolTip(TextDirection& dir) const
     if (!m_innerNonSharedNode)
         return String();
     
-    DocumentMarker* marker = m_innerNonSharedNode->document()->markerContainingPoint(m_point, DocumentMarker::Grammar);
+    DocumentMarker* marker = m_innerNonSharedNode->document()->markers()->markerContainingPoint(m_point, DocumentMarker::Grammar);
     if (!marker)
         return String();
 
@@ -182,7 +182,7 @@ String HitTestResult::replacedString() const
     if (!m_innerNonSharedNode)
         return String();
     
-    DocumentMarker* marker = m_innerNonSharedNode->document()->markerContainingPoint(m_point, DocumentMarker::Replacement);
+    DocumentMarker* marker = m_innerNonSharedNode->document()->markers()->markerContainingPoint(m_point, DocumentMarker::Replacement);
     if (!marker)
         return String();
     
diff --git a/WebCore/rendering/InlineTextBox.cpp b/WebCore/rendering/InlineTextBox.cpp
index 50f6cfa..cb4fdb8 100644
--- a/WebCore/rendering/InlineTextBox.cpp
+++ b/WebCore/rendering/InlineTextBox.cpp
@@ -810,7 +810,7 @@ void InlineTextBox::paintSpellingOrGrammarMarker(GraphicsContext* pt, int tx, in
         if (grammar) {
             markerRect.move(-tx, -ty);
             markerRect = renderer()->localToAbsoluteQuad(FloatRect(markerRect)).enclosingBoundingBox();
-            renderer()->document()->setRenderedRectForMarker(renderer()->node(), marker, markerRect);
+            renderer()->document()->markers()->setRenderedRectForMarker(renderer()->node(), marker, markerRect);
         }
     }
     
@@ -848,7 +848,7 @@ void InlineTextBox::paintTextMatchMarker(GraphicsContext* pt, int tx, int ty, co
     // Always compute and store the rect associated with this marker. The computed rect is in absolute coordinates.
     IntRect markerRect = enclosingIntRect(font.selectionRectForText(run, IntPoint(m_x, y), h, sPos, ePos));
     markerRect = renderer()->localToAbsoluteQuad(FloatRect(markerRect)).enclosingBoundingBox();
-    renderer()->document()->setRenderedRectForMarker(renderer()->node(), marker, markerRect);
+    renderer()->document()->markers()->setRenderedRectForMarker(renderer()->node(), marker, markerRect);
      
     // Optionally highlight the text
     if (renderer()->frame()->markedTextMatchesAreHighlighted()) {
@@ -877,7 +877,7 @@ void InlineTextBox::computeRectForReplacementMarker(int /*tx*/, int /*ty*/, cons
     // Compute and store the rect associated with this marker.
     IntRect markerRect = enclosingIntRect(font.selectionRectForText(run, startPoint, h, sPos, ePos));
     markerRect = renderer()->localToAbsoluteQuad(FloatRect(markerRect)).enclosingBoundingBox();
-    renderer()->document()->setRenderedRectForMarker(renderer()->node(), marker, markerRect);
+    renderer()->document()->markers()->setRenderedRectForMarker(renderer()->node(), marker, markerRect);
 }
     
 void InlineTextBox::paintDocumentMarkers(GraphicsContext* pt, int tx, int ty, RenderStyle* style, const Font& font, bool background)
@@ -885,7 +885,7 @@ void InlineTextBox::paintDocumentMarkers(GraphicsContext* pt, int tx, int ty, Re
     if (!renderer()->node())
         return;
 
-    Vector<DocumentMarker> markers = renderer()->document()->markersForNode(renderer()->node());
+    Vector<DocumentMarker> markers = renderer()->document()->markers()->markersForNode(renderer()->node());
     Vector<DocumentMarker>::iterator markerIt = markers.begin();
 
     // Give any document markers that touch this run a chance to draw before the text has been drawn.
diff --git a/WebCore/rendering/SVGInlineTextBox.cpp b/WebCore/rendering/SVGInlineTextBox.cpp
index f5bbe5b..ccba5b4 100644
--- a/WebCore/rendering/SVGInlineTextBox.cpp
+++ b/WebCore/rendering/SVGInlineTextBox.cpp
@@ -408,7 +408,7 @@ void SVGInlineTextBox::computeTextMatchMarkerRect(RenderStyle* style)
         return;
 
     Document* document = renderer()->document();
-    Vector<DocumentMarker> markers = document->markersForNode(renderer()->node());
+    Vector<DocumentMarker> markers = document->markers()->markersForNode(renderer()->node());
 
     Vector<DocumentMarker>::iterator markerEnd = markers.end();
     for (Vector<DocumentMarker>::iterator markerIt = markers.begin(); markerIt != markerEnd; ++markerIt) {
@@ -430,7 +430,7 @@ void SVGInlineTextBox::computeTextMatchMarkerRect(RenderStyle* style)
         if (!m_chunkTransformation.isIdentity())
             markerRect = m_chunkTransformation.mapRect(markerRect);
 
-        document->setRenderedRectForMarker(node, marker, renderer()->localToAbsoluteQuad(markerRect).enclosingBoundingBox());
+        document->markers()->setRenderedRectForMarker(node, marker, renderer()->localToAbsoluteQuad(markerRect).enclosingBoundingBox());
     }
 }
 
diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog
index 8f37579..fb2599f 100644
--- a/WebKit/chromium/ChangeLog
+++ b/WebKit/chromium/ChangeLog
@@ -1,3 +1,19 @@
+2010-08-22  Daniel Bates  <dbates at rim.com>
+
+        Reviewed by Eric Seidel.
+
+        Encapsulate document marker management into DocumentMarkerController
+        https://bugs.webkit.org/show_bug.cgi?id=44383
+
+        Modify call sites in the Chromium port to use DocumentMarkerController.
+
+        No functionality was changed, so no new tests.
+
+        * src/WebFrameImpl.cpp:
+        (WebKit::WebFrameImpl::stopFinding):
+        (WebKit::WebFrameImpl::addMarker):
+        (WebKit::WebFrameImpl::setMarkerActive):
+
 2010-08-22  Jian Li  <jianli at chromium.org>
 
         Reviewed by Darin Fisher.
diff --git a/WebKit/chromium/src/WebFrameImpl.cpp b/WebKit/chromium/src/WebFrameImpl.cpp
index f1c30e2..671190b 100644
--- a/WebKit/chromium/src/WebFrameImpl.cpp
+++ b/WebKit/chromium/src/WebFrameImpl.cpp
@@ -1429,7 +1429,7 @@ void WebFrameImpl::stopFinding(bool clearSelection)
     cancelPendingScopingEffort();
 
     // Remove all markers for matches found and turn off the highlighting.
-    frame()->document()->removeMarkers(DocumentMarker::TextMatch);
+    frame()->document()->markers()->removeMarkers(DocumentMarker::TextMatch);
     frame()->setMarkedTextMatchesAreHighlighted(false);
 
     // Let the frame know that we don't want tickmarks or highlighting anymore.
@@ -2060,14 +2060,14 @@ void WebFrameImpl::addMarker(Range* range, bool activeMatch)
         if (marker.endOffset > marker.startOffset) {
             // Find the node to add a marker to and add it.
             Node* node = textPiece->startContainer(exception);
-            frame()->document()->addMarker(node, marker);
+            frame()->document()->markers()->addMarker(node, marker);
 
             // Rendered rects for markers in WebKit are not populated until each time
             // the markers are painted. However, we need it to happen sooner, because
             // the whole purpose of tickmarks on the scrollbar is to show where
             // matches off-screen are (that haven't been painted yet).
-            Vector<DocumentMarker> markers = frame()->document()->markersForNode(node);
-            frame()->document()->setRenderedRectForMarker(
+            Vector<DocumentMarker> markers = frame()->document()->markers()->markersForNode(node);
+            frame()->document()->markers()->setRenderedRectForMarker(
                 textPiece->startContainer(exception),
                 markers[markers.size() - 1],
                 range->boundingBox());
@@ -2081,7 +2081,7 @@ void WebFrameImpl::setMarkerActive(Range* range, bool active)
     if (!range || range->collapsed(ec))
         return;
 
-    frame()->document()->setMarkersActive(range, active);
+    frame()->document()->markers()->setMarkersActive(range, active);
 }
 
 int WebFrameImpl::ordinalOfFirstMatchForFrame(WebFrameImpl* frame) const
diff --git a/WebKit/efl/ChangeLog b/WebKit/efl/ChangeLog
index 32ccbf5..900afbc 100644
--- a/WebKit/efl/ChangeLog
+++ b/WebKit/efl/ChangeLog
@@ -1,3 +1,17 @@
+2010-08-22  Daniel Bates  <dbates at rim.com>
+
+        Reviewed by Eric Seidel.
+
+        Encapsulate document marker management into DocumentMarkerController
+        https://bugs.webkit.org/show_bug.cgi?id=44383
+
+        Modify call sites in the EFL port to use DocumentMarkerController.
+
+        No functionality was changed, so no new tests.
+
+        * ewk/ewk_frame.cpp:
+        (ewk_frame_text_matches_unmark_all):
+
 2010-08-20  Leandro Pereira  <leandro at profusion.mobi>
 
         [EFL] Unreviewed. Fix build when using GNU gold.
diff --git a/WebKit/efl/ewk/ewk_frame.cpp b/WebKit/efl/ewk/ewk_frame.cpp
index 296c261..7a2af5a 100644
--- a/WebKit/efl/ewk/ewk_frame.cpp
+++ b/WebKit/efl/ewk/ewk_frame.cpp
@@ -786,7 +786,7 @@ Eina_Bool ewk_frame_text_matches_unmark_all(Evas_Object* o)
     EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
     EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
 
-    sd->frame->document()->removeMarkers(WebCore::DocumentMarker::TextMatch);
+    sd->frame->document()->markers()->removeMarkers(WebCore::DocumentMarker::TextMatch);
     return EINA_TRUE;
 }
 
diff --git a/WebKit/mac/ChangeLog b/WebKit/mac/ChangeLog
index 603d00f..165f46c 100644
--- a/WebKit/mac/ChangeLog
+++ b/WebKit/mac/ChangeLog
@@ -1,3 +1,21 @@
+2010-08-22  Daniel Bates  <dbates at rim.com>
+
+        Reviewed by Eric Seidel.
+
+        Encapsulate document marker management into DocumentMarkerController
+        https://bugs.webkit.org/show_bug.cgi?id=44383
+
+        Modify call sites in the Apple Mac port to use DocumentMarkerController.
+
+        No functionality was changed, so no new tests.
+
+        * WebView/WebFrame.mm:
+        (-[WebFrame _unmarkAllBadGrammar]):
+        (-[WebFrame _unmarkAllMisspellings]):
+        * WebView/WebHTMLView.mm:
+        (-[WebHTMLView unmarkAllTextMatches]):
+        (-[WebHTMLView rectsForTextMatches]):
+
 2010-08-19  David Kilzer  <ddkilzer at apple.com>
 
         <http://webkit.org/b/44285> Fix compilation with NETSCAPE_PLUGIN_API disabled
diff --git a/WebKit/mac/WebView/WebFrame.mm b/WebKit/mac/WebView/WebFrame.mm
index 82df7bc..dff9ff7 100644
--- a/WebKit/mac/WebView/WebFrame.mm
+++ b/WebKit/mac/WebView/WebFrame.mm
@@ -395,7 +395,7 @@ WebView *getWebView(WebFrame *webFrame)
     Frame* coreFrame = _private->coreFrame;
     for (Frame* frame = coreFrame; frame; frame = frame->tree()->traverseNext(coreFrame)) {
         if (Document* document = frame->document())
-            document->removeMarkers(DocumentMarker::Grammar);
+            document->markers()->removeMarkers(DocumentMarker::Grammar);
     }
 }
 #endif
@@ -405,7 +405,7 @@ WebView *getWebView(WebFrame *webFrame)
     Frame* coreFrame = _private->coreFrame;
     for (Frame* frame = coreFrame; frame; frame = frame->tree()->traverseNext(coreFrame)) {
         if (Document* document = frame->document())
-            document->removeMarkers(DocumentMarker::Spelling);
+            document->markers()->removeMarkers(DocumentMarker::Spelling);
     }
 }
 
diff --git a/WebKit/mac/WebView/WebHTMLView.mm b/WebKit/mac/WebView/WebHTMLView.mm
index 009357a..9c2430c 100644
--- a/WebKit/mac/WebView/WebHTMLView.mm
+++ b/WebKit/mac/WebView/WebHTMLView.mm
@@ -6230,7 +6230,7 @@ static void extractUnderlines(NSAttributedString *string, Vector<CompositionUnde
     Document* document = coreFrame->document();
     if (!document)
         return;
-    document->removeMarkers(DocumentMarker::TextMatch);
+    document->markers()->removeMarkers(DocumentMarker::TextMatch);
 }
 
 - (NSArray *)rectsForTextMatches
@@ -6242,7 +6242,7 @@ static void extractUnderlines(NSAttributedString *string, Vector<CompositionUnde
     if (!document)
         return [NSArray array];
 
-    Vector<IntRect> rects = document->renderedRectsForMarkers(DocumentMarker::TextMatch);
+    Vector<IntRect> rects = document->markers()->renderedRectsForMarkers(DocumentMarker::TextMatch);
     unsigned count = rects.size();
     NSMutableArray *result = [NSMutableArray arrayWithCapacity:count];
     for (unsigned index = 0; index < count; ++index)
diff --git a/WebKit/win/ChangeLog b/WebKit/win/ChangeLog
index e7944fd..e149879 100644
--- a/WebKit/win/ChangeLog
+++ b/WebKit/win/ChangeLog
@@ -1,3 +1,20 @@
+2010-08-22  Daniel Bates  <dbates at rim.com>
+
+        Reviewed by Eric Seidel.
+
+        Encapsulate document marker management into DocumentMarkerController
+        https://bugs.webkit.org/show_bug.cgi?id=44383
+
+        Modify call sites in the Apple Windows port to use DocumentMarkerController.
+
+        No functionality was changed, so no new tests.
+
+        * WebFrame.cpp:
+        (WebFrame::unmarkAllMisspellings):
+        (WebFrame::unmarkAllBadGrammar):
+        * WebView.cpp:
+        (WebView::rectsForTextMatches):
+
 2010-08-18  Jessie Berlin  <jberlin at apple.com>
 
         Reviewed by Adam Roben.
diff --git a/WebKit/win/WebFrame.cpp b/WebKit/win/WebFrame.cpp
index 500a643..d0cd1e8 100644
--- a/WebKit/win/WebFrame.cpp
+++ b/WebKit/win/WebFrame.cpp
@@ -2564,7 +2564,7 @@ void WebFrame::unmarkAllMisspellings()
         if (!doc)
             return;
 
-        doc->removeMarkers(DocumentMarker::Spelling);
+        doc->markers()->removeMarkers(DocumentMarker::Spelling);
     }
 }
 
@@ -2576,7 +2576,7 @@ void WebFrame::unmarkAllBadGrammar()
         if (!doc)
             return;
 
-        doc->removeMarkers(DocumentMarker::Grammar);
+        doc->markers()->removeMarkers(DocumentMarker::Grammar);
     }
 }
 
diff --git a/WebKit/win/WebView.cpp b/WebKit/win/WebView.cpp
index 98c1023..4814967 100644
--- a/WebKit/win/WebView.cpp
+++ b/WebKit/win/WebView.cpp
@@ -3362,7 +3362,7 @@ HRESULT STDMETHODCALLTYPE WebView::rectsForTextMatches(
     do {
         if (Document* document = frame->document()) {
             IntRect visibleRect = frame->view()->visibleContentRect();
-            Vector<IntRect> frameRects = document->renderedRectsForMarkers(DocumentMarker::TextMatch);
+            Vector<IntRect> frameRects = document->markers()->renderedRectsForMarkers(DocumentMarker::TextMatch);
             IntPoint frameOffset(-frame->view()->scrollOffset().width(), -frame->view()->scrollOffset().height());
             frameOffset = frame->view()->convertToContainingWindow(frameOffset);
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list