WebCore:
authorjustin.garcia@apple.com <justin.garcia@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 24 Apr 2008 17:41:11 +0000 (17:41 +0000)
committerjustin.garcia@apple.com <justin.garcia@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 24 Apr 2008 17:41:11 +0000 (17:41 +0000)
2008-04-24  Justin Garcia  <justin.garcia@apple.com>

        Reviewed by Darin Adler.

        <rdar://problem/5604313> FormatBlock to apply an h1 also inserts a style span around the first letter (16004)

        * editing/TextIterator.cpp:
        (WebCore::TextIterator::advance): We emit an extra newline when leaving a
        block element that has atypical margin/padding. When we emit the extra newline,
        it needs to be positioned after that block's contents, not after the block.
        This is how we position the first newline, too, since the range for emitted newlines
        should start where the line break begins visually.

LayoutTests:

2008-04-24  Justin Garcia  <justin.garcia@apple.com>

        Reviewed by Darin Adler.

        <rdar://problem/5604313> FormatBlock leaves first letter incorrectly styled (16004)

        * editing/execCommand/5604313-expected.txt: Added.
        * editing/execCommand/5604313.html: Added.

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

LayoutTests/ChangeLog
LayoutTests/editing/execCommand/5604313-expected.txt [new file with mode: 0644]
LayoutTests/editing/execCommand/5604313.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/editing/TextIterator.cpp

index 5336e5f..0691a20 100644 (file)
@@ -1,3 +1,12 @@
+2008-04-24  Justin Garcia  <justin.garcia@apple.com>
+
+        Reviewed by Darin Adler.
+
+        <rdar://problem/5604313> FormatBlock leaves first letter incorrectly styled (16004)
+
+        * editing/execCommand/5604313-expected.txt: Added.
+        * editing/execCommand/5604313.html: Added.
+
 r2008-04-23  Dan Bernstein  <mitz@apple.com>
 
         Rubber-stamped by Dave Hyatt.
diff --git a/LayoutTests/editing/execCommand/5604313-expected.txt b/LayoutTests/editing/execCommand/5604313-expected.txt
new file mode 100644 (file)
index 0000000..caa3e6e
--- /dev/null
@@ -0,0 +1,3 @@
+This tests for a bug where FormatBlock in a p element would leave one letter with the wrong style.
+
+<p>This should be in a p element.</p><h2>This should be in an H2.</h2>
diff --git a/LayoutTests/editing/execCommand/5604313.html b/LayoutTests/editing/execCommand/5604313.html
new file mode 100644 (file)
index 0000000..43175af
--- /dev/null
@@ -0,0 +1,15 @@
+<div id="description">This tests for a bug where FormatBlock in a p element would leave one letter with the wrong style.</div>
+<div id="edit" contentEditable="true"><p>This should be in a p element.</p><p id="p">This should be in an H2.</p></div>
+
+<script>
+if (window.layoutTestController)
+    window.layoutTestController.dumpAsText();
+    
+p = document.getElementById("p");
+s = window.getSelection();
+s.setPosition(p, 0);
+
+document.execCommand("FormatBlock", false, "h2");
+if (window.layoutTestController)
+    document.body.innerText = document.getElementById("description").innerText + "\n\n" + document.getElementById("edit").innerHTML;
+</script>
index a04ecd3..b2d06ab 100644 (file)
@@ -1,3 +1,16 @@
+2008-04-24  Justin Garcia  <justin.garcia@apple.com>
+
+        Reviewed by Darin Adler.
+
+        <rdar://problem/5604313> FormatBlock to apply an h1 also inserts a style span around the first letter (16004)
+        
+        * editing/TextIterator.cpp:
+        (WebCore::TextIterator::advance): We emit an extra newline when leaving a
+        block element that has atypical margin/padding. When we emit the extra newline, 
+        it needs to be positioned after that block's contents, not after the block. 
+        This is how we position the first newline, too, since the range for emitted newlines 
+        should start where the line break begins visually.
+
 2008-04-24  Anders Carlsson  <andersca@apple.com>
 
         Reviewed by Adam.
index 943e72c..b3878d1 100644 (file)
@@ -145,8 +145,14 @@ void TextIterator::advance()
 
     // handle remembered node that needed a newline after the text node's newline
     if (m_needAnotherNewline) {
-        // emit the newline, with position a collapsed range at the end of current node.
-        emitCharacter('\n', m_node->parentNode(), m_node, 1, 1);
+        // Emit the extra newline, and position it *inside* m_node, after m_node's 
+        // contents, in case it's a block, in the same way that we position the first 
+        // newline.  The range for the emitted newline should start where the line 
+        // break begins.
+        // FIXME: It would be cleaner if we emitted two newlines during the last 
+        // iteration, instead of using m_needAnotherNewline.
+        Node* baseNode = m_node->lastChild() ? m_node->lastChild() : m_node;
+        emitCharacter('\n', baseNode->parentNode(), baseNode, 1, 1);
         m_needAnotherNewline = false;
         return;
     }