Reviewed by John
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Aug 2004 15:23:51 +0000 (15:23 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Aug 2004 15:23:51 +0000 (15:23 +0000)
        Fix for this bug:

        <rdar://problem/3765535> paste of text with newlines into text with newlines results in broken doc, crash

        This is a "belt and suspenders" fix. The issue is with the paste code path which was creating
        zero-length DOM text nodes when a selection being pasted ended with a newline. The normal
        code path for parsing HTML does not allow this, but the code to convert newlines to BR's
        during paste was creating such nodes. This will no longer happen.

        In the case where someone inserts such zero-length nodes using the DOM API, the render tree
        will no longer create render objects for these nodes, and it was these empty render text
        nodes that was confusing the code doing editing navigation.

        * khtml/xml/dom_textimpl.cpp:
        (CharacterDataImpl::rendererIsNeeded): Do not create renderers for zero-length DOM text nodes.
        * khtml/xml/dom_textimpl.h:
        * kwq/WebCoreBridge.mm:
        (-[WebCoreBridge documentFragmentWithText:]): Do not insert zero-length DOM text nodes as part
        of converting line-end sequences to BR's.

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/editing/htmlediting_impl.cpp
WebCore/khtml/xml/dom_textimpl.cpp
WebCore/khtml/xml/dom_textimpl.h
WebCore/kwq/WebCoreBridge.mm

index 2f4cc629bf445966e3ec86278749b3f08ce77974..1e9e360c83da1b9f8d521694776d8387bb2ba0c3 100644 (file)
@@ -1,3 +1,27 @@
+2004-08-24  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by John
+
+        Fix for this bug:
+        
+        <rdar://problem/3765535> paste of text with newlines into text with newlines results in broken doc, crash
+        
+        This is a "belt and suspenders" fix. The issue is with the paste code path which was creating
+        zero-length DOM text nodes when a selection being pasted ended with a newline. The normal
+        code path for parsing HTML does not allow this, but the code to convert newlines to BR's 
+        during paste was creating such nodes. This will no longer happen.
+        
+        In the case where someone inserts such zero-length nodes using the DOM API, the render tree
+        will no longer create render objects for these nodes, and it was these empty render text 
+        nodes that was confusing the code doing editing navigation.
+
+        * khtml/xml/dom_textimpl.cpp:
+        (CharacterDataImpl::rendererIsNeeded): Do not create renderers for zero-length DOM text nodes.
+        * khtml/xml/dom_textimpl.h:
+        * kwq/WebCoreBridge.mm:
+        (-[WebCoreBridge documentFragmentWithText:]): Do not insert zero-length DOM text nodes as part
+        of converting line-end sequences to BR's.
+
 2004-08-23  Maciej Stachowiak  <mjs@apple.com>
 
         Reviewed by Richard.
index cb49a217a06463861da5794107df68c7476eb569..3cc08de3a1aaa59d6ecb0e559bad8ac613349cb6 100644 (file)
@@ -691,7 +691,7 @@ void ApplyStyleCommandImpl::doApply()
         return;
 
     // adjust to the positions we want to use for applying style
-    Position start(endingSelection().start().downstream().equivalentRangeCompliantPosition());
+    Position start(endingSelection().start().downstream().equivalentShallowPosition().equivalentRangeCompliantPosition());
     Position end(endingSelection().end().upstream(StayInBlock));
 
     // Remove style from the selection.
index b9e5d9a110e6be001084bf76e5a0f3f9a245aef1..d06c1b75e8e3f9200eeae6a01188a870146f1a9b 100644 (file)
@@ -272,6 +272,13 @@ unsigned long CharacterDataImpl::caretMaxRenderedOffset() const
     return r ? r->caretMaxRenderedOffset() : length();
 }
 
+bool CharacterDataImpl::rendererIsNeeded(RenderStyle *style)
+{
+    if (!str || str->l == 0)
+        return false;
+    return NodeImpl::rendererIsNeeded(style);
+}
+
 #ifndef NDEBUG
 void CharacterDataImpl::dump(QTextStream *stream, QString ind) const
 {
index aded3f9ecf6b23b4c390e52452655597100767e5..b4b13b7cf48c61d43944741361b6d23f45a8b890 100644 (file)
@@ -70,6 +70,8 @@ public:
     virtual long caretMinOffset() const;
     virtual long caretMaxOffset() const;
     virtual unsigned long caretMaxRenderedOffset() const;
+
+    virtual bool rendererIsNeeded(khtml::RenderStyle *);
     
 #ifndef NDEBUG
     virtual void dump(QTextStream *stream, QString ind = "") const;
index 46192b6ea8531652433c45c68086c12c7be8c69e..ea583069249365e3fa7cc70ef01cf15ab24dd928 100644 (file)
@@ -1483,7 +1483,9 @@ static HTMLFormElementImpl *formElementFromDOMElement(DOMElement *element)
     for (i = 0; i < count; i++) {
         if (i != 0)
             [fragment appendChild:[document createElement:@"BR"]];
-        [fragment appendChild:[document createTextNode:[array objectAtIndex:i]]];
+        NSString *component = (NSString *)[array objectAtIndex:i];
+        if ([component length] > 0)
+            [fragment appendChild:[document createTextNode:component]];
     }
     return fragment;
 }