Reviewed by John
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 25 Aug 2004 21:33:39 +0000 (21:33 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 25 Aug 2004 21:33:39 +0000 (21:33 +0000)
        Fix for this bug:

        <rdar://problem/3775172> Blot crashes after typing one character then deleting it

        * khtml/css/css_computedstyle.cpp:
        (DOM::CSSComputedStyleDeclarationImpl::getPropertyCSSValue): Bail early if the element
        being queried does not have a renderer or that renderer does not have a style. Prevents
        a crash in the cases that it does not.
        * khtml/editing/htmlediting_impl.cpp:
        (khtml::DeleteSelectionCommandImpl::doApply): Add one more case to deleting when the
        start and end nodes are different. If the downstream end node is the last node in the
        block, then it may need to be deleted completely. Before this patch, the code
        erroneously assumed that any deletion in this node had to be trimming of a text node.
        This was asserted, and the description in 3775172 shows a simple case where this assertion
        does not hold. The additional case and associated checks now make it all better.
        * layout-tests/editing/deleting/delete-3775172-fix.html: Added.

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/css/css_computedstyle.cpp
WebCore/khtml/editing/htmlediting_impl.cpp

index 607796f9d976700ea4f10695520f0b8757b7f0ba..31afadd3938a78764694b1a78885e0667a17c135 100644 (file)
@@ -1,3 +1,24 @@
+2004-08-25  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by John
+
+        Fix for this bug:
+        
+        <rdar://problem/3775172> Blot crashes after typing one character then deleting it
+
+        * khtml/css/css_computedstyle.cpp:
+        (DOM::CSSComputedStyleDeclarationImpl::getPropertyCSSValue): Bail early if the element
+        being queried does not have a renderer or that renderer does not have a style. Prevents
+        a crash in the cases that it does not.
+        * khtml/editing/htmlediting_impl.cpp:
+        (khtml::DeleteSelectionCommandImpl::doApply): Add one more case to deleting when the
+        start and end nodes are different. If the downstream end node is the last node in the
+        block, then it may need to be deleted completely. Before this patch, the code
+        erroneously assumed that any deletion in this node had to be trimming of a text node.
+        This was asserted, and the description in 3775172 shows a simple case where this assertion
+        does not hold. The additional case and associated checks now make it all better.
+        * layout-tests/editing/deleting/delete-3775172-fix.html: Added.
+
 2004-08-25  David Hyatt  <hyatt@apple.com>
 
        Fix for 3365086, large tables crash Safari.  Make sure to use ints rather than shorts for row and column
 2004-08-25  David Hyatt  <hyatt@apple.com>
 
        Fix for 3365086, large tables crash Safari.  Make sure to use ints rather than shorts for row and column
index 6a783c67a32c009ac5a1335fb64a5a4bdf26ad1a..151b050e9eb7df41564207c6a73999ad0bc46c46 100644 (file)
@@ -155,6 +155,9 @@ CSSValueImpl *CSSComputedStyleDeclarationImpl::getPropertyCSSValue(int propertyI
     if (docimpl)
         docimpl->updateLayout();
 
     if (docimpl)
         docimpl->updateLayout();
 
+    if (!m_renderer || !m_renderer->style())
+        return 0;
+
     switch(propertyID)
     {
     case CSS_PROP_BACKGROUND_COLOR:
     switch(propertyID)
     {
     case CSS_PROP_BACKGROUND_COLOR:
index 596facdec6ebb4b24d49678251b7e5bed369d1f6..74548607a043ac25f35fc1dbf96c78fb038e2d2f 100644 (file)
@@ -1127,17 +1127,22 @@ void DeleteSelectionCommandImpl::doApply()
         }
 
         if (upstreamEnd.node() != startNode && upstreamEnd.node()->inDocument() && upstreamEnd.offset() >= upstreamEnd.node()->caretMinOffset()) {
         }
 
         if (upstreamEnd.node() != startNode && upstreamEnd.node()->inDocument() && upstreamEnd.offset() >= upstreamEnd.node()->caretMinOffset()) {
-            // in a text node that needs to be trimmed
-            // offset must be less than the max offset, otherwise it would have been deleted in the while
-            // loop just above.
-            ASSERT(upstreamEnd.offset() < upstreamEnd.node()->caretMaxOffset());
-            TextImpl *text = static_cast<TextImpl *>(upstreamEnd.node());
-            if (upstreamEnd.offset() > 0) {
-                deleteText(text, 0, upstreamEnd.offset());
+            if (upstreamEnd.offset() >= upstreamEnd.node()->caretMaxOffset()) {
+                // need to delete whole node
+                // we can get here if this is the last node in the block
+                removeNode(upstreamEnd.node());
                 trailingValid = false;
             }
                 trailingValid = false;
             }
-            if (!upstreamStart.node()->inDocument())
-                endingPosition = Position(text, 0);
+            else {
+                // in a text node that needs to be trimmed
+                TextImpl *text = static_cast<TextImpl *>(upstreamEnd.node());
+                if (upstreamEnd.offset() > 0) {
+                    deleteText(text, 0, upstreamEnd.offset());
+                    trailingValid = false;
+                }
+            }
+            if (!upstreamStart.node()->inDocument() && upstreamEnd.node()->inDocument())
+                endingPosition = Position(upstreamEnd.node(), 0);
         }
     }
     
         }
     }