WebCore fix for: <rdar://problem/3918056> Mail not line breaking my <pre> formatted...
authorcblu <cblu@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 22 Feb 2005 23:22:22 +0000 (23:22 +0000)
committercblu <cblu@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 22 Feb 2005 23:22:22 +0000 (23:22 +0000)
Mail must 4018993 to fully address the problem.

        Reviewed by kocienda.

        * khtml/editing/markup.cpp:
        (khtml::startMarkup): don't compute style for text in PRE tags
        (khtml::createMarkup): include PRE if it is an ancestor of the nodes in the range

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

LayoutTests/editing/pasteboard/paste-pre-001-expected.txt [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-pre-001.html [new file with mode: 0644]
WebCore/ChangeLog-2005-08-23
WebCore/khtml/editing/markup.cpp

diff --git a/LayoutTests/editing/pasteboard/paste-pre-001-expected.txt b/LayoutTests/editing/pasteboard/paste-pre-001-expected.txt
new file mode 100644 (file)
index 0000000..5a14175
--- /dev/null
@@ -0,0 +1,40 @@
+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
+      RenderBlock {DIV} at (0,0) size 784x316 [border: (2px solid #0000FF)]
+        RenderBlock {DIV} at (14,14) size 756x84
+          RenderText {TEXT} at (0,0) size 67x28
+            text run at (0,0) width 67: "Tests: "
+          RenderBR {BR} at (0,0) size 0x0
+          RenderText {TEXT} at (0,28) size 737x56
+            text run at (0,28) width 737: "Copying and pasting content inside of a PRE tag. This test was created after"
+            text run at (0,56) width 64: "fixing "
+          RenderInline {A} at (0,0) size 84x28 [color=#0000EE]
+            RenderText {TEXT} at (64,56) size 84x28
+              text run at (64,56) width 84: "3918056"
+          RenderText {TEXT} at (148,56) size 6x28
+            text run at (148,56) width 6: "."
+        RenderBlock {DIV} at (14,114) size 756x164
+          RenderBlock (anonymous) at (0,0) size 756x84
+            RenderText {TEXT} at (0,0) size 189x28
+              text run at (0,0) width 189: "Expected Results: "
+            RenderBR {BR} at (0,0) size 0x0
+            RenderText {TEXT} at (0,28) size 690x56
+              text run at (0,28) width 690: "The PRE tag and the formatting of the text inside of the PRE should be"
+              text run at (0,56) width 557: "maintained. Should see this content in the red box below:"
+          RenderBlock {PRE} at (0,108) size 756x56
+            RenderText {TEXT} at (0,0) size 42x56
+              text run at (0,0) width 42: "foo"
+              text run at (0,28) width 42: "bar"
+      RenderBlock {DIV} at (0,340) size 784x108
+        RenderBlock {DIV} at (0,0) size 784x108 [border: (2px solid #FF0000)]
+          RenderBlock {PRE} at (2,26) size 780x56
+            RenderText {TEXT} at (0,0) size 42x56
+              text run at (0,0) width 42: "foo"
+              text run at (0,28) width 42: "bar"
+selection is CARET:
+start:      position 7 of child 1 {TEXT} of child 2 {PRE} of child 1 {DIV} of root {DIV}
+upstream:   position 7 of child 1 {TEXT} of child 2 {PRE} of child 1 {DIV} of root {DIV}
+downstream: position 7 of child 1 {TEXT} of child 2 {PRE} of child 1 {DIV} of root {DIV}
diff --git a/LayoutTests/editing/pasteboard/paste-pre-001.html b/LayoutTests/editing/pasteboard/paste-pre-001.html
new file mode 100644 (file)
index 0000000..902a785
--- /dev/null
@@ -0,0 +1,63 @@
+<html> 
+<head>
+
+<style>
+.editing { 
+    border: 2px solid red; 
+    font-size: 24px; 
+}
+.explanation { 
+    border: 2px solid blue; 
+    padding: 12px; 
+    font-size: 24px; 
+    margin-bottom: 24px;
+}
+.scenario { margin-bottom: 16px;}
+.scenario:first-line { font-weight: bold; margin-bottom: 16px;}
+.expected-results:first-line { font-weight: bold }
+</style>
+<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
+
+<script>
+
+function editingTest() {
+    extendSelectionForwardByLineCommand();
+    extendSelectionForwardByLineCommand();
+    cutCommand();
+    pasteCommand();
+}
+
+</script>
+
+<title>Editing Test</title> 
+</head> 
+<body>
+
+<div class="explanation">
+<div class="scenario">
+Tests: 
+<br>
+Copying and pasting content inside of a PRE tag. This test was created after fixing <A HREF="rdar://problem/3918056">3918056</A>.
+</div>
+<div class="expected-results">
+Expected Results:
+<br>
+The PRE tag and the formatting of the text inside of the PRE should be maintained. Should see this content in the red box below: 
+<pre>foo
+bar</pre>
+</div>
+</div>
+
+<div contenteditable id="root" style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space;">
+<div id="test" class="editing">
+<pre>foo
+bar</pre>
+</div>
+</div>
+
+<script>
+runEditingTest();
+</script>
+
+</body>
+</html>
index 2873857..ed9c351 100644 (file)
@@ -1,3 +1,15 @@
+2005-02-22  Chris Blumenberg  <cblu@apple.com>
+
+       WebCore fix for: <rdar://problem/3918056> Mail not line breaking my <pre> formatted emails on replies
+       
+       Mail must 4018993 to fully address the problem.
+
+        Reviewed by kocienda.
+
+        * khtml/editing/markup.cpp:
+        (khtml::startMarkup): don't compute style for text in PRE tags
+        (khtml::createMarkup): include PRE if it is an ancestor of the nodes in the range
+
 2005-02-21  Richard Williamson   <rjw@apple.com>
 
        Fixed <rdar://problem/4008338> REGRESSION (125-178): opacity style not working, breaks fading images on okcupid.com
index 2827162..2401414 100644 (file)
@@ -176,6 +176,7 @@ static QString startMarkup(const NodeImpl *node, const RangeImpl *range, EAnnota
         case Node::TEXT_NODE: {
             if (node->parentNode()) {
                 switch (node->parentNode()->id()) {
+                    case ID_PRE:
                     case ID_SCRIPT:
                     case ID_STYLE:
                     case ID_TEXTAREA:
@@ -395,8 +396,8 @@ QString createMarkup(const RangeImpl *range, QPtrList<NodeImpl> *nodes, EAnnotat
             bool breakAtEnd = false;
             if (commonAncestorBlock == ancestor) {
                 NodeImpl::Id id = ancestor->id();
-                // Tables and lists must be part of the markup to avoid broken structures. 
-                if (id == ID_TABLE || id == ID_OL || id == ID_UL) {
+                // Include ancestors that are required to retain the appearance of the copied markup.
+                if (id == ID_PRE || id == ID_TABLE || id == ID_OL || id == ID_UL) {
                     breakAtEnd = true;
                 } else {
                     break;