Reviewed by Harrison.
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 15 Mar 2005 01:05:23 +0000 (01:05 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 15 Mar 2005 01:05:23 +0000 (01:05 +0000)
        - fixed <rdar://problem/4049776> Seed: Mail: Disable spellcheck leaves red artifacts

        * khtml/xml/dom_docimpl.cpp:
        (DocumentImpl::DocumentImpl): Set markers list to be "auto-delete" so they don't all leak.
        (DocumentImpl::removeMarker): Remove markers list for a node when the last marker is removed
        for that node. Otherwise, we can have empty marker lists for each node forever until the
        document goes away.
        (DocumentImpl::removeAllMarkers): Added code to dirty the markers.
        (DocumentImpl::shiftMarkers): Remove unneeded empty check.

        * kwq/WebCoreBridge.h: Added unmarkAllMisspellings for WebKit.
        * kwq/WebCoreBridge.mm: (-[WebCoreBridge unmarkAllMisspellings]): Added. Calls removeAllMarkers.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@8888 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog-2005-08-23
WebCore/khtml/xml/dom_docimpl.cpp
WebCore/kwq/WebCoreBridge.h
WebCore/kwq/WebCoreBridge.mm

index 7350cb26f3ea09e0e8da8068523e851cfbe5ddd9..03e7f4fbe9ba44e3a35054d4fb435a4fa56ab4b6 100644 (file)
@@ -1,3 +1,20 @@
+2005-03-14  Darin Adler  <darin@apple.com>
+
+        Reviewed by Harrison.
+
+        - fixed <rdar://problem/4049776> Seed: Mail: Disable spellcheck leaves red artifacts
+
+        * khtml/xml/dom_docimpl.cpp:
+        (DocumentImpl::DocumentImpl): Set markers list to be "auto-delete" so they don't all leak.
+        (DocumentImpl::removeMarker): Remove markers list for a node when the last marker is removed
+        for that node. Otherwise, we can have empty marker lists for each node forever until the
+        document goes away.
+        (DocumentImpl::removeAllMarkers): Added code to dirty the markers.
+        (DocumentImpl::shiftMarkers): Remove unneeded empty check.
+
+        * kwq/WebCoreBridge.h: Added unmarkAllMisspellings for WebKit.
+        * kwq/WebCoreBridge.mm: (-[WebCoreBridge unmarkAllMisspellings]): Added. Calls removeAllMarkers.
+
 2005-03-14  Richard Williamson   <rjw@apple.com>
 
        Fixed <rdar://problem/4027928> Tiger_8A394:Acrobat crashes while tried to remove the subscription errors by clicking on "Would you like to remove the subscription" from Tracker details view pane
         (khtml::EditCommand::EditCommand): Blow away the selection when starting an edit command.
         (khtml::EditCommand::apply): Remove code to mark misspellings because that's now done as part
         of blowing away the selection.
-        (khtml::EditCommand::unapply): Blow away the selection instead of marking mispellings.
+        (khtml::EditCommand::unapply): Blow away the selection instead of marking misspellings.
         (khtml::EditCommand::reapply): Ditto.
         (khtml::ReplaceSelectionCommand::doApply): Removed incorrect code that does spell checking
         on inserted text; this doesn't match NSText behavior.
         (KWQKHTMLPart::markMisspellings): New name for markMisspellingsInSelection. Simplified logic a
         bit and made it the caller's responsibility to expand the selection passed in to word boundaries.
         (KWQKHTMLPart::respondToChangedSelection): Added parameter that identifies the old selection,
-        and changed logic so it won't mark mispellings in a word if the selection still starts in that word.
+        and changed logic so it won't mark misspellings in a word if the selection still starts in that word.
 
         - implemented empty-cells property in computed style
 
index 4b91ff33388e6ebdbe576d8f49d340ec5a2de2d2..8752655bfabd0646fcec1a21b359f3614c76a708 100644 (file)
@@ -362,6 +362,8 @@ DocumentImpl::DocumentImpl(DOMImplementationImpl *_implementation, KHTMLView *v)
     m_overMinimumLayoutThreshold = false;
     
     m_jsEditor = 0;
+
+    m_markers.setAutoDelete(true);
 }
 
 DocumentImpl::~DocumentImpl()
@@ -3072,7 +3074,7 @@ void DocumentImpl::addMarker(NodeImpl *node, DocumentMarker newMarker)
     
     QValueList <DocumentMarker> *markers = m_markers.find(node);
     if (!markers) {
-        markers = new QValueList <DocumentMarker>();
+        markers = new QValueList <DocumentMarker>;
         markers->append(newMarker);
         m_markers.insert(node, markers);
     } else {
@@ -3153,6 +3155,9 @@ void DocumentImpl::removeMarker(NodeImpl *node, DocumentMarker target)
         }
     }
 
+    if (markers->isEmpty())
+        m_markers.remove(node);
+
     // repaint the affected node
     if (docDirty && node->renderer())
         node->renderer()->repaint();
@@ -3177,21 +3182,28 @@ void DocumentImpl::removeAllMarkers(NodeImpl *node, ulong startOffset, long leng
 
 void DocumentImpl::removeAllMarkers(NodeImpl *node)
 {
-    QValueList <DocumentMarker> *markers = m_markers.find(node);
-    if (markers)
-        markers->clear();
+    QValueList<DocumentMarker> *markers = m_markers.take(node);
+    if (markers) {
+        RenderObject *renderer = node->renderer();
+        if (renderer)
+            renderer->repaint();
+        delete markers;
+    }
 }
 
 void DocumentImpl::removeAllMarkers()
 {
+    QPtrDictIterator< QValueList<DocumentMarker> > it(m_markers);
+    for (; NodeImpl *node = static_cast<NodeImpl *>(it.currentKey()); ++it) {
+        RenderObject *renderer = node->renderer();
+        if (renderer)
+            renderer->repaint();
+    }
     m_markers.clear();
 }
 
 void DocumentImpl::shiftMarkers(NodeImpl *node, ulong startOffset, long delta)
 {
-    if (m_markers.isEmpty())
-        return;
-
     QValueList <DocumentMarker> *markers = m_markers.find(node);
     if (!markers)
         return;
index 693ee39569aeab9b3b5dc4707bfff8b6abfedab5..1d9f8ca0dfd07367b7db67af827609d5a22fbf52 100644 (file)
@@ -280,8 +280,10 @@ typedef enum {
 
 - (BOOL)searchFor:(NSString *)string direction:(BOOL)forward caseSensitive:(BOOL)caseFlag wrap:(BOOL)wrapFlag;
 - (void)jumpToSelection;
+
 - (NSString *)advanceToNextMisspelling;
 - (NSString *)advanceToNextMisspellingStartingJustBeforeSelection;
+- (void)unmarkAllMisspellings;
 
 - (void)setTextSizeMultiplier:(float)multiplier;
 
index a03c1a9dfb1beb50762bf99f3b6526e59e289d79..98bfd498536baeeedca137c34e0d968431a8f746 100644 (file)
@@ -1161,6 +1161,15 @@ static HTMLFormElementImpl *formElementFromDOMElement(DOMElement *element)
     return _part->advanceToNextMisspelling(true).getNSString();
 }
 
+- (void)unmarkAllMisspellings
+{
+    DocumentImpl *doc = _part->xmlDocImpl();
+    if (!doc) {
+        return;
+    }
+    doc->removeAllMarkers();
+}
+
 - (void)setTextSizeMultiplier:(float)multiplier
 {
     int newZoomFactor = (int)rint(multiplier * 100);