Reviewed by harrison
authorjusting <justing@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 8 Apr 2006 00:21:53 +0000 (00:21 +0000)
committerjusting <justing@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 8 Apr 2006 00:21:53 +0000 (00:21 +0000)
        Rolled the fix for 8250 back in and fixed a bug:
        The local variables for the first and last nodes in the fragment
        need to be reset when the fragment is changed for plaintext-only mode
        or a change from the beforetextinserted event handler.

        * editing/ReplaceSelectionCommand.cpp:
        (WebCore::ReplacementFragment::ReplacementFragment):

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

LayoutTests/fast/forms/8250-expected.checksum
LayoutTests/fast/forms/8250-expected.png
LayoutTests/fast/forms/8250-expected.txt
LayoutTests/fast/forms/8250.html
WebCore/ChangeLog
WebCore/editing/ReplaceSelectionCommand.cpp

index 5d88518..0024f98 100644 (file)
@@ -1 +1 @@
-b39db1f47212af41150ce92d9d19fca0
\ No newline at end of file
+9a885b8c37274846a9571f16f9899483
\ No newline at end of file
index b5f6a0d..27e4ed7 100644 (file)
Binary files a/LayoutTests/fast/forms/8250-expected.png and b/LayoutTests/fast/forms/8250-expected.png differ
index 5875280..ec1c833 100644 (file)
@@ -1,16 +1,20 @@
 EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 0 of #text > DIV to 0 of #text > DIV toDOMRange:range from 3 of #text > DIV to 3 of #text > DIV affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 0 of DIV to 0 of DIV toDOMRange:range from 0 of DIV to 0 of DIV affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
 EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
 layer at (0,0) size 800x600
   RenderCanvas at (0,0) size 800x600
 layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
-      RenderTextField {INPUT} at (2,2) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)]
-      RenderText {TEXT} at (0,0) size 0x0
-layer at (13,13) size 142x13
+      RenderBlock {P} at (0,0) size 784x36
+        RenderText {TEXT} at (0,0) size 743x36
+          text run at (0,0) width 144: "This is a test for 8250. "
+          text run at (144,0) width 571: "The khtmlBeforeTextInserted event handler wasn't being told about interchange newlines. "
+          text run at (715,0) width 28: "You"
+          text run at (0,18) width 242: "shouldn't see anything in the text field."
+      RenderBlock (anonymous) at (0,52) size 784x23
+        RenderTextField {INPUT} at (2,2) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)]
+        RenderText {TEXT} at (0,0) size 0x0
+layer at (13,65) size 142x13
   RenderBlock {DIV} at (3,3) size 142x13
-    RenderText {TEXT} at (1,0) size 18x13
-      text run at (1,0) width 18: "foo"
-caret: position 3 of child 0 {TEXT} of child 0 {DIV} of child 0 {INPUT} of child 0 {BODY} of child 0 {HTML} of document
+caret: position 0 of child 0 {DIV} of child 2 {INPUT} of child 0 {BODY} of child 0 {HTML} of document
index bfc663b..fc80bd3 100644 (file)
@@ -1,3 +1,4 @@
+<p>This is a test for 8250.  The khtmlBeforeTextInserted event handler wasn't being told about interchange newlines.  You shouldn't see anything in the text field.</p>
 <input id="test" type="text">
 
 <script>
index 3cc6713..cb6dbca 100644 (file)
@@ -1,3 +1,15 @@
+2006-04-07  Justin Garcia  <justin.garcia@apple.com>
+
+        Reviewed by harrison
+        
+        Rolled the fix for 8250 back in and fixed a bug:
+        The local variables for the first and last nodes in the fragment
+        need to be reset when the fragment is changed for plaintext-only mode
+        or a change from the beforetextinserted event handler.
+
+        * editing/ReplaceSelectionCommand.cpp:
+        (WebCore::ReplacementFragment::ReplacementFragment):
+
 2006-04-07  Maciej Stachowiak  <mjs@apple.com>
 
         Reviewed by Darin.
index 9bc99a3..7a0844e 100644 (file)
@@ -65,13 +65,13 @@ ReplacementFragment::ReplacementFragment(Document *document, DocumentFragment *f
     if (!m_document)
         return;
 
-    if (!fragment) {
+    if (!m_fragment) {
         m_type = EmptyFragment;
         return;
     }
-    
-    Node *firstChild = fragment->firstChild();
-    Node *lastChild = fragment->lastChild();
+
+    Node* firstChild = m_fragment->firstChild();
+    Node* lastChild = m_fragment->lastChild();
 
     if (!firstChild) {
         m_type = EmptyFragment;
@@ -80,13 +80,36 @@ ReplacementFragment::ReplacementFragment(Document *document, DocumentFragment *f
     
     m_type = firstChild == lastChild && firstChild->isTextNode() ? SingleTextNodeFragment : TreeFragment;
     
-    Node *node = fragment->firstChild();
+    ASSERT(editableRoot);
+    if (!editableRoot)
+        return;
+            
+    RefPtr<Node> holder = insertFragmentForTestRendering();
+    
+    RefPtr<Range> range = Selection::selectionFromContentsOfNode(holder.get()).toRange();
+    String text = plainText(range.get());
+    String newText = text.copy();
+    // Give the root a chance to change the text.
+    RefPtr<Event> evt = new BeforeTextInsertedEvent(newText);
+    ExceptionCode ec = 0;
+    editableRoot->dispatchEvent(evt, ec, true);
+    ASSERT(ec == 0);
+    if (text != newText || !editableRoot->isContentRichlyEditable()) {
+        m_fragment = createFragmentFromText(document, newText.deprecatedString());
+        firstChild = m_fragment->firstChild();
+        lastChild = m_fragment->firstChild();
+        
+        removeNode(holder);
+        holder = insertFragmentForTestRendering();
+    }
+    
+    Node *node = firstChild;
     Node *newlineAtStartNode = 0;
     Node *newlineAtEndNode = 0;
     while (node) {
         Node *next = node->traverseNextNode();
         if (isInterchangeNewlineNode(node)) {
-            if (next || node == fragment->firstChild()) {
+            if (next || node == firstChild) {
                 m_hasInterchangeNewlineAtStart = true;
                 newlineAtStartNode = node;
             }
@@ -113,27 +136,6 @@ ReplacementFragment::ReplacementFragment(Document *document, DocumentFragment *f
     if (newlineAtEndNode)
         removeNode(newlineAtEndNode);
     
-    ASSERT(editableRoot);
-    if (!editableRoot)
-        return;
-            
-    RefPtr<Node> holder = insertFragmentForTestRendering();
-    
-    Selection selectionAroundFragment = Selection::selectionFromContentsOfNode(holder.get());
-    RefPtr<Range> range = selectionAroundFragment.toRange();
-    String text = plainText(range.get());
-    String newText = text.copy();
-    // Give the root a chance to change the text.
-    RefPtr<Event> evt = new BeforeTextInsertedEvent(newText);
-    ExceptionCode ec = 0;
-    editableRoot->dispatchEvent(evt, ec, true);
-    ASSERT(ec == 0);
-    if (text != newText || !editableRoot->isContentRichlyEditable()) {
-        removeNode(holder);
-        m_fragment = createFragmentFromText(document, newText.deprecatedString());
-        holder = insertFragmentForTestRendering();
-     }
-    
     saveRenderingInfo(holder.get());
     removeUnrenderedNodes(holder.get());
     m_hasMoreThanOneBlock = renderedBlocks(holder.get()) > 1;