LayoutTests:
authorjusting <justing@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 19 Oct 2006 23:21:35 +0000 (23:21 +0000)
committerjusting <justing@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 19 Oct 2006 23:21:35 +0000 (23:21 +0000)
        Reviewed by levi

        <rdar://problem/4447885>
        API: WebView should have a method something like incrementLeftMarginBy: or indentBy:

        Changed blockquotes in these tests to blockquote class="webkit-indent-blockquote".
        * editing/execCommand/indent-empty-root-expected.txt:
        * editing/execCommand/indent-selection-expected.checksum:
        * editing/execCommand/indent-selection-expected.png:
        * editing/execCommand/indent-selection-expected.txt:
        * editing/execCommand/indent-selection.html:
        * editing/execCommand/nsresponder-indent-expected.txt:
        * editing/execCommand/nsresponder-outdent.html:
        * editing/execCommand/outdent-selection-expected.checksum:
        * editing/execCommand/outdent-selection-expected.png:
        * editing/execCommand/outdent-selection-expected.txt:

        Ditto.  Added a FIXME:
        * editing/execCommand/outdent-selection.html:

WebCore:

        Reviewed by levi

        <rdar://problem/4447885>
        API: WebView should have a method something like incrementLeftMarginBy: or indentBy:

        Fixed indent/outdent to only increment the left margin, to match other browsers.
        Used blockquote class="webkit-indent-blockquote" to do this.  Mail can now
        implement indent/outdent by customizing the appearance of these blockquotes,
        instead of using a new API.

        * css/html4.css: Added margin: 0 0 0 40px for webkit-indent-blockquotes.
        * editing/IndentOutdentCommand.cpp:
        (WebCore::indentBlockquoteString): Added.
        (WebCore::createIndentBlockquoteElement): Added.
        (WebCore::isIndentBlockquote): Added.
        (WebCore::isListOrBlockquote): Added.
        (WebCore::IndentOutdentCommand::IndentOutdentCommand):
        (WebCore::IndentOutdentCommand::prepareBlockquoteLevelForInsertion): Fixed
        a bug in the code that added an extra br if the placeholder collapsed upon insertion.
        Used the new indentBlockquote checks and enclosing element getters.
        (WebCore::IndentOutdentCommand::indentRegion): Ditto.
        (WebCore::IndentOutdentCommand::outdentParagraph): Ditto.  Cleaned up the
        logic to pull the selection out of a list a bit.
        * editing/htmlediting.cpp:
        (WebCore::enclosingNodeOfType): Added this generic enclosing element getter.
        * editing/htmlediting.h:

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

17 files changed:
LayoutTests/ChangeLog
LayoutTests/editing/execCommand/indent-empty-root-expected.txt
LayoutTests/editing/execCommand/indent-selection-expected.checksum
LayoutTests/editing/execCommand/indent-selection-expected.png
LayoutTests/editing/execCommand/indent-selection-expected.txt
LayoutTests/editing/execCommand/indent-selection.html
LayoutTests/editing/execCommand/nsresponder-indent-expected.txt
LayoutTests/editing/execCommand/nsresponder-outdent.html
LayoutTests/editing/execCommand/outdent-selection-expected.checksum
LayoutTests/editing/execCommand/outdent-selection-expected.png
LayoutTests/editing/execCommand/outdent-selection-expected.txt
LayoutTests/editing/execCommand/outdent-selection.html
WebCore/ChangeLog
WebCore/css/html4.css
WebCore/editing/IndentOutdentCommand.cpp
WebCore/editing/htmlediting.cpp
WebCore/editing/htmlediting.h

index fcafff3..7914d3b 100644 (file)
@@ -1,3 +1,25 @@
+2006-10-19  Justin Garcia  <justin.garcia@apple.com>
+
+        Reviewed by levi
+        
+        <rdar://problem/4447885>
+        API: WebView should have a method something like incrementLeftMarginBy: or indentBy:
+
+        Changed blockquotes in these tests to blockquote class="webkit-indent-blockquote".
+        * editing/execCommand/indent-empty-root-expected.txt:
+        * editing/execCommand/indent-selection-expected.checksum:
+        * editing/execCommand/indent-selection-expected.png:
+        * editing/execCommand/indent-selection-expected.txt:
+        * editing/execCommand/indent-selection.html:
+        * editing/execCommand/nsresponder-indent-expected.txt:
+        * editing/execCommand/nsresponder-outdent.html:
+        * editing/execCommand/outdent-selection-expected.checksum:
+        * editing/execCommand/outdent-selection-expected.png:
+        * editing/execCommand/outdent-selection-expected.txt:
+        
+        Ditto.  Added a FIXME:
+        * editing/execCommand/outdent-selection.html:
+
 2006-10-19  Geoffrey Garen  <ggaren@apple.com>
 
         Reviewed by ap.
index ad8c0a9..e401ad2 100644 (file)
@@ -8,11 +8,11 @@ layer at (0,0) size 800x600
   RenderView at (0,0) size 800x600
 layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
-    RenderBody {BODY} at (8,8) size 784x576
+    RenderBody {BODY} at (8,8) size 784x584
       RenderBlock {P} at (0,0) size 784x18
         RenderText {#text} at (0,0) size 291x18
           text run at (0,0) width 291: "This tests Indent in an empty editable element."
       RenderBlock {DIV} at (0,34) size 784x18
-        RenderBlock {BLOCKQUOTE} at (40,0) size 704x18
+        RenderBlock {BLOCKQUOTE} at (40,0) size 744x18
           RenderBR {BR} at (0,0) size 0x18
 caret: position 0 of child 0 {BR} of child 0 {BLOCKQUOTE} of child 3 {DIV} of child 0 {BODY} of child 0 {HTML} of document
index f8a41f4..92dd360 100644 (file)
@@ -1 +1 @@
-d1074841553c7b04760fab12d8da6e9e
\ No newline at end of file
+12218d2cbdfa11ec4035fb2b5556506c
\ No newline at end of file
index cb657d3..cd9b08d 100644 (file)
Binary files a/LayoutTests/editing/execCommand/indent-selection-expected.png and b/LayoutTests/editing/execCommand/indent-selection-expected.png differ
index 0699c79..435a479 100644 (file)
@@ -10,52 +10,51 @@ layer at (0,0) size 800x600
   RenderView at (0,0) size 800x600
 layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
-    RenderBody {BODY} at (8,8) size 784x576
+    RenderBody {BODY} at (8,8) size 784x584
       RenderBlock {DIV} at (0,0) size 784x18
         RenderText {#text} at (0,0) size 362x18
           text run at (0,0) width 362: "This test uses the execCommand to indent the text below."
       RenderBlock (anonymous) at (0,18) size 784x18
         RenderBR {BR} at (0,0) size 0x18
-      RenderBlock {DIV} at (0,52) size 784x244
-        RenderBlock {BLOCKQUOTE} at (40,0) size 704x70
-          RenderBlock (anonymous) at (0,0) size 704x36
+      RenderBlock {DIV} at (0,36) size 784x194
+        RenderBlock {BLOCKQUOTE} at (40,0) size 744x54
+          RenderBlock (anonymous) at (0,0) size 744x36
             RenderInline {SPAN} at (0,0) size 42x18
               RenderText {#text} at (0,0) size 42x18
                 text run at (0,0) width 42: "Lorem"
             RenderBR {BR} at (42,14) size 0x0
             RenderText {#text} at (0,18) size 83x18
               text run at (0,18) width 83: "more Lorem!"
-          RenderBlock {BLOCKQUOTE} at (40,52) size 624x18
+          RenderBlock {BLOCKQUOTE} at (40,36) size 704x18
             RenderText {#text} at (0,0) size 38x18
               text run at (0,0) width 38: "ipsum"
-        RenderBlock (anonymous) at (0,86) size 784x0
-        RenderBlock {BLOCKQUOTE} at (40,86) size 704x54
-          RenderBlock {UL} at (0,0) size 704x54
-            RenderBlock {UL} at (40,0) size 664x54
-              RenderListItem {LI} at (40,0) size 624x18
+        RenderBlock (anonymous) at (0,54) size 784x0
+        RenderBlock {BLOCKQUOTE} at (40,70) size 744x54
+          RenderBlock {UL} at (0,0) size 744x54
+            RenderBlock {UL} at (40,0) size 704x54
+              RenderListItem {LI} at (40,0) size 664x18
                 RenderListMarker at (-17,0) size 7x18
                 RenderText {#text} at (0,0) size 25x18
                   text run at (0,0) width 25: "Foo"
-              RenderListItem {LI} at (40,18) size 624x18
+              RenderListItem {LI} at (40,18) size 664x18
                 RenderListMarker at (-17,0) size 7x18
                 RenderText {#text} at (0,0) size 23x18
                   text run at (0,0) width 23: "Bar"
-              RenderListItem {LI} at (40,36) size 624x18
+              RenderListItem {LI} at (40,36) size 664x18
                 RenderListMarker at (-17,0) size 7x18
                 RenderText {#text} at (0,0) size 25x18
                   text run at (0,0) width 25: "Baz"
-        RenderBlock {BLOCKQUOTE} at (40,156) size 704x88
-          RenderBlock {BLOCKQUOTE} at (40,0) size 624x18
+        RenderBlock {BLOCKQUOTE} at (40,140) size 744x54
+          RenderBlock {BLOCKQUOTE} at (40,0) size 704x18
             RenderText {#text} at (0,0) size 37x18
               text run at (0,0) width 37: "Dolor"
-          RenderBlock (anonymous) at (0,34) size 704x54
-            RenderBR {BR} at (0,0) size 0x18
-            RenderText {#text} at (0,18) size 34x18
-              text run at (0,18) width 34: "Sum!"
-            RenderBR {BR} at (34,32) size 0x0
+          RenderBlock (anonymous) at (0,18) size 744x36
+            RenderText {#text} at (0,0) size 34x18
+              text run at (0,0) width 34: "Sum!"
+            RenderBR {BR} at (34,14) size 0x0
             RenderInline {SPAN} at (0,0) size 38x18
-              RenderText {#text} at (0,36) size 38x18
-                text run at (0,36) width 38: "Thing"
-        RenderBlock (anonymous) at (0,260) size 784x0
-selection start: position 0 of child 0 {#text} of child 4 {SPAN} of child 3 {BLOCKQUOTE} of child 4 {DIV} of child 0 {BODY} of child 0 {HTML} of document
-selection end:   position 5 of child 0 {#text} of child 4 {SPAN} of child 3 {BLOCKQUOTE} of child 4 {DIV} of child 0 {BODY} of child 0 {HTML} of document
+              RenderText {#text} at (0,18) size 38x18
+                text run at (0,18) width 38: "Thing"
+        RenderBlock (anonymous) at (0,194) size 784x0
+selection start: position 0 of child 0 {#text} of child 3 {SPAN} of child 3 {BLOCKQUOTE} of child 4 {DIV} of child 0 {BODY} of child 0 {HTML} of document
+selection end:   position 5 of child 0 {#text} of child 3 {SPAN} of child 3 {BLOCKQUOTE} of child 4 {DIV} of child 0 {BODY} of child 0 {HTML} of document
index e39f5bc..f038d27 100644 (file)
@@ -5,7 +5,7 @@ This test uses the execCommand to indent the text below.
 <div contenteditable="true">
 <span id="item1">Lorem</span><br>
 more Lorem!
-<blockquote>
+<blockquote class="webkit-indent-blockquote">
 ipsum<br>
 
 <ul>
index 0f0398a..1e5e592 100644 (file)
@@ -9,14 +9,14 @@ layer at (0,0) size 800x600
   RenderView at (0,0) size 800x600
 layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
-    RenderBody {BODY} at (8,8) size 784x576
+    RenderBody {BODY} at (8,8) size 784x584
       RenderBlock {P} at (0,0) size 784x18
         RenderText {#text} at (0,0) size 534x18
           text run at (0,0) width 281: "This tests the NSResponder method indent:. "
           text run at (281,0) width 253: "You should see an indented 'foo' below."
       RenderBlock {DIV} at (0,34) size 784x18
-        RenderBlock {BLOCKQUOTE} at (40,0) size 704x18
+        RenderBlock {BLOCKQUOTE} at (40,0) size 744x18
           RenderText {#text} at (0,0) size 21x18
             text run at (0,0) width 21: "foo"
-        RenderBlock (anonymous) at (0,34) size 784x0
+        RenderBlock (anonymous) at (0,18) size 784x0
 caret: position 0 of child 0 {#text} of child 0 {BLOCKQUOTE} of child 2 {DIV} of child 0 {BODY} of child 0 {HTML} of document
index bbd6ac9..efc31b4 100644 (file)
@@ -1,5 +1,5 @@
 <p>This tests the outdent: method.  You should see an undented 'foo' below.</p>
-<div id="div" contenteditable="true"><blockquote>foo</blockquote></div>
+<div id="div" contenteditable="true"><blockquote class="webkit-indent-blockquote">foo</blockquote></div>
 
 <script>
 var div = document.getElementById("div");
index 576886d..221538f 100644 (file)
@@ -1 +1 @@
-858f881fc35b5ac91198064d4e2d6d10
\ No newline at end of file
+44aa97836396ad27d8434b00ac1dfdea
\ No newline at end of file
index 5f5d843..65d9e67 100644 (file)
Binary files a/LayoutTests/editing/execCommand/outdent-selection-expected.png and b/LayoutTests/editing/execCommand/outdent-selection-expected.png differ
index f95dc08..e638474 100644 (file)
@@ -9,12 +9,16 @@ layer 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 784x18
-        RenderText {#text} at (0,0) size 374x18
-          text run at (0,0) width 374: "This test uses the execCommand to Outdent the text below."
-      RenderBlock (anonymous) at (0,18) size 784x18
+      RenderBlock {DIV} at (0,0) size 784x36
+        RenderText {#text} at (0,0) size 378x18
+          text run at (0,0) width 378: "This test uses the execCommand to Outdent the text below. "
+        RenderInline {B} at (0,0) size 749x36
+          RenderText {#text} at (378,0) size 749x36
+            text run at (378,0) width 371: "This demonstrates a bug: the content in the blockquote"
+            text run at (0,18) width 279: "that's not in a list is pulled out of position."
+      RenderBlock (anonymous) at (0,36) size 784x18
         RenderBR {BR} at (0,0) size 0x18
-      RenderBlock {DIV} at (0,36) size 784x210
+      RenderBlock {DIV} at (0,54) size 784x194
         RenderBlock (anonymous) at (0,0) size 784x54
           RenderInline {SPAN} at (0,0) size 42x18
             RenderText {#text} at (0,0) size 42x18
@@ -28,8 +32,8 @@ layer at (0,0) size 800x600
           RenderText {#text} at (0,36) size 37x18
             text run at (0,36) width 37: "Dolor"
           RenderBR {BR} at (37,50) size 0x0
-        RenderBlock {BLOCKQUOTE} at (40,70) size 704x54
-          RenderBlock (anonymous) at (0,0) size 704x54
+        RenderBlock {BLOCKQUOTE} at (40,54) size 744x54
+          RenderBlock (anonymous) at (0,0) size 744x54
             RenderText {#text} at (0,0) size 25x18
               text run at (0,0) width 25: "Foo"
             RenderBR {BR} at (25,14) size 0x0
@@ -39,14 +43,14 @@ layer at (0,0) size 800x600
             RenderText {#text} at (0,36) size 25x18
               text run at (0,36) width 25: "Baz"
             RenderBR {BR} at (25,50) size 0x0
-          RenderBlock {UL} at (0,70) size 704x0
-          RenderBlock (anonymous) at (0,70) size 704x0
-        RenderBlock (anonymous) at (0,140) size 784x18
+          RenderBlock {UL} at (0,70) size 744x0
+          RenderBlock (anonymous) at (0,70) size 744x0
+        RenderBlock (anonymous) at (0,124) size 784x18
           RenderText {#text} at (0,0) size 82x18
             text run at (0,0) width 82: "Dinner time?"
           RenderBR {BR} at (82,14) size 0x0
-        RenderBlock {UL} at (0,174) size 784x0
-        RenderBlock (anonymous) at (0,174) size 784x36
+        RenderBlock {UL} at (0,158) size 784x0
+        RenderBlock (anonymous) at (0,158) size 784x36
           RenderText {#text} at (0,0) size 34x18
             text run at (0,0) width 34: "Sum!"
           RenderBR {BR} at (34,14) size 0x0
index e05b11a..27e5130 100644 (file)
@@ -1,11 +1,9 @@
-<div id="description">
-This test uses the execCommand to Outdent the text below.
-</div>
+<div id="description">This test uses the execCommand to Outdent the text below. <b>This demonstrates a bug: the content in the blockquote that's not in a list is pulled out of position.</b></div>
 <br>
 <div contenteditable="true">
 <span id="item1">Lorem</span><br>
 more Lorem!
-<blockquote>
+<blockquote class="webkit-indent-blockquote">
 ipsum<br>
 
 <ul>
index 55a1050..154c766 100644 (file)
@@ -1,3 +1,32 @@
+2006-10-19  Justin Garcia  <justin.garcia@apple.com>
+
+        Reviewed by levi
+        
+        <rdar://problem/4447885>
+        API: WebView should have a method something like incrementLeftMarginBy: or indentBy:
+        
+        Fixed indent/outdent to only increment the left margin, to match other browsers.
+        Used blockquote class="webkit-indent-blockquote" to do this.  Mail can now
+        implement indent/outdent by customizing the appearance of these blockquotes,
+        instead of using a new API.
+        
+        * css/html4.css: Added margin: 0 0 0 40px for webkit-indent-blockquotes.
+        * editing/IndentOutdentCommand.cpp:
+        (WebCore::indentBlockquoteString): Added.
+        (WebCore::createIndentBlockquoteElement): Added.
+        (WebCore::isIndentBlockquote): Added.
+        (WebCore::isListOrBlockquote): Added.
+        (WebCore::IndentOutdentCommand::IndentOutdentCommand):
+        (WebCore::IndentOutdentCommand::prepareBlockquoteLevelForInsertion): Fixed
+        a bug in the code that added an extra br if the placeholder collapsed upon insertion.
+        Used the new indentBlockquote checks and enclosing element getters.  
+        (WebCore::IndentOutdentCommand::indentRegion): Ditto.
+        (WebCore::IndentOutdentCommand::outdentParagraph): Ditto.  Cleaned up the
+        logic to pull the selection out of a list a bit.
+        * editing/htmlediting.cpp:
+        (WebCore::enclosingNodeOfType): Added this generic enclosing element getter.
+        * editing/htmlediting.h:
+
 2006-10-19  Timothy Hatcher  <timothy@apple.com>
 
         Rolling out the this change since it caused a bad regression:
index ade9d19..33fe2cd 100644 (file)
@@ -570,4 +570,9 @@ frameset, frame {
     display: block
 }
 
+blockquote.webkit-indent-blockquote {
+    margin: 0 0 0 40px;
+}
+
+
 /* noscript is handled internally, as it depends on settings */
index 00aacf2..d68ef59 100644 (file)
@@ -40,23 +40,37 @@ namespace WebCore {
 
 using namespace HTMLNames;
 
-IndentOutdentCommand::IndentOutdentCommand(Document* document, EIndentType typeOfAction, int marginInPixels)
-    : CompositeEditCommand(document), m_typeOfAction(typeOfAction), m_marginInPixels(marginInPixels)
-{}
+static String indentBlockquoteString()
+{
+    static String string = "webkit-indent-blockquote";
+    return string;
+}
 
-static Node* enclosingListOrBlockquote(Node* node)
+static PassRefPtr<Element> createIndentBlockquoteElement(Document* document)
 {
-    if (!node)
-        return 0;
-    Node* root = (node->inDocument()) ? node->rootEditableElement() : highestAncestor(node);
-    ASSERT(root);
-    for (Node* n = node->parentNode(); n && (n == root || n->isDescendantOf(root)); n = n->parentNode())
-        if (n->hasTagName(ulTag) || n->hasTagName(olTag) || n->hasTagName(blockquoteTag))
-            return n;
-            
-    return 0;
+    RefPtr<Element> indentBlockquoteElement = createElement(document, "blockquote");
+    indentBlockquoteElement->setAttribute(classAttr, indentBlockquoteString());
+    return indentBlockquoteElement.release();
 }
 
+static bool isIndentBlockquote(Node* node)
+{
+    if (!node || !node->hasTagName(blockquoteTag) || !node->isElementNode())
+        return false;
+
+    Element* elem = static_cast<Element*>(node);
+    return elem->getAttribute(classAttr) == indentBlockquoteString();
+}
+
+static bool isListOrIndentBlockquote(Node* node)
+{
+    return node && (node->hasTagName(ulTag) || node->hasTagName(olTag) || isIndentBlockquote(node));
+}
+
+IndentOutdentCommand::IndentOutdentCommand(Document* document, EIndentType typeOfAction, int marginInPixels)
+    : CompositeEditCommand(document), m_typeOfAction(typeOfAction), m_marginInPixels(marginInPixels)
+{}
+
 // This function is a workaround for moveParagraph's tendency to strip blockquotes. It updates lastBlockquote to point to the
 // correct level for the current paragraph, and returns a pointer to a placeholder br where the insertion should be performed.
 Node* IndentOutdentCommand::prepareBlockquoteLevelForInsertion(VisiblePosition& currentParagraph, Node** lastBlockquote)
@@ -64,27 +78,27 @@ Node* IndentOutdentCommand::prepareBlockquoteLevelForInsertion(VisiblePosition&
     int currentBlockquoteLevel = 0;
     int lastBlockquoteLevel = 0;
     Node* node = currentParagraph.deepEquivalent().node();
-    while ((node = enclosingNodeWithTag(node, blockquoteTag)))
+    while ((node = enclosingNodeOfType(node, &isIndentBlockquote)))
         currentBlockquoteLevel++;
     node = *lastBlockquote;
-    while ((node = enclosingNodeWithTag(node, blockquoteTag)))
+    while ((node = enclosingNodeOfType(node, &isIndentBlockquote)))
         lastBlockquoteLevel++;
     while (currentBlockquoteLevel > lastBlockquoteLevel) {
-        RefPtr<Node> newBlockquote = createElement(document(), "blockquote");
+        RefPtr<Node> newBlockquote = createIndentBlockquoteElement(document());
         appendNode(newBlockquote.get(), *lastBlockquote);
         *lastBlockquote = newBlockquote.get();
         lastBlockquoteLevel++;
     }
     while (currentBlockquoteLevel < lastBlockquoteLevel) {
-        *lastBlockquote = enclosingNodeWithTag(*lastBlockquote, blockquoteTag);
+        *lastBlockquote = enclosingNodeOfType(*lastBlockquote, &isIndentBlockquote);
         lastBlockquoteLevel--;
     }
     RefPtr<Node> placeholder = createBreakElement(document());
-    if ((*lastBlockquote)->firstChild() && !(*lastBlockquote)->lastChild()->hasTagName(brTag)) {
-        RefPtr<Node> collapsedPlaceholder = createBreakElement(document());
-        appendNode(collapsedPlaceholder.get(), (*lastBlockquote));
-    }
     appendNode(placeholder.get(), *lastBlockquote);
+    // Add another br before the placeholder if it collapsed.
+    VisiblePosition visiblePos(Position(placeholder.get(), 0));
+    if (!isStartOfParagraph(visiblePos))
+        insertNodeBefore(createBreakElement(document()).get(), placeholder.get());
     return placeholder.get();
 }
 
@@ -116,7 +130,7 @@ void IndentOutdentCommand::indentRegion()
     // and there's nothing to move.
     Node* startNode = startOfSelection.deepEquivalent().downstream().node();
     if (startNode == startNode->rootEditableElement()) {
-        RefPtr<Node> blockquote = createElement(document(), "blockquote");
+        RefPtr<Node> blockquote = createIndentBlockquoteElement(document());
         insertNodeAt(blockquote.get(), startNode, 0);
         RefPtr<Node> placeholder = createBreakElement(document());
         appendNode(placeholder.get(), blockquote.get());
@@ -158,7 +172,7 @@ void IndentOutdentCommand::indentRegion()
         else {
             // Create a new blockquote and insert it as a child of the root editable element. We accomplish
             // this by splitting all parents of the current paragraph up to that point.
-            RefPtr<Node> blockquote = createElement(document(), "blockquote");
+            RefPtr<Node> blockquote = createIndentBlockquoteElement(document());
             Node* startNode = startOfParagraph(endOfCurrentParagraph).deepEquivalent().node();
             Node* startOfNewBlock = splitTreeToNode(startNode, startNode->rootEditableElement());
             insertNodeBefore(blockquote.get(), startOfNewBlock);
@@ -175,25 +189,19 @@ void IndentOutdentCommand::outdentParagraph()
     VisiblePosition visibleStartOfParagraph = startOfParagraph(endingSelection().visibleStart());
     VisiblePosition visibleEndOfParagraph = endOfParagraph(visibleStartOfParagraph);
 
-    Node* enclosingNode = enclosingListOrBlockquote(visibleStartOfParagraph.deepEquivalent().node());
+    Node* enclosingNode = enclosingNodeOfType(visibleStartOfParagraph.deepEquivalent().node(), &isListOrIndentBlockquote);
     if (!enclosingNode)
         return;
 
-    // Handle the list case
-    bool inList = false;
-    InsertListCommand::Type typeOfList;
+    // Use InsertListCommand to remove the selection from the list
     if (enclosingNode->hasTagName(olTag)) {
-        inList = true;
-        typeOfList = InsertListCommand::OrderedList;
+        applyCommandToComposite(new InsertListCommand(document(), InsertListCommand::OrderedList, ""));
+        return;        
     } else if (enclosingNode->hasTagName(ulTag)) {
-        inList = true;
-        typeOfList = InsertListCommand::UnorderedList;
-    }
-    if (inList) {
-        // Use InsertListCommand to remove the selection from the list
-        applyCommandToComposite(new InsertListCommand(document(), typeOfList, ""));
+        applyCommandToComposite(new InsertListCommand(document(), InsertListCommand::UnorderedList, ""));
         return;
     }
+    
     // The selection is inside a blockquote
     VisiblePosition positionInEnclosingBlock = VisiblePosition(Position(enclosingNode, 0));
     VisiblePosition startOfEnclosingBlock = startOfBlock(positionInEnclosingBlock);
index 9cb1aa4..d102314 100644 (file)
@@ -549,6 +549,22 @@ Node* enclosingNodeWithTag(Node* node, const QualifiedName& tagName)
     return 0;
 }
 
+Node* enclosingNodeOfType(Node* node, bool (*nodeIsOfType)(Node*))
+{
+    if (!node)
+        return 0;
+        
+    Node* root = highestEditableRoot(Position(node, 0));
+    if (!root)
+        root = highestAncestor(node);
+        
+    for (Node* n = node->parentNode(); n && (n == root || n->isDescendantOf(root)); n = n->parentNode())
+        if ((*nodeIsOfType)(n))
+            return n;
+            
+    return 0;
+}
+
 Node* enclosingTableCell(Node* node)
 {
     if (!node)
index 76d07a1..54a68e5 100644 (file)
@@ -103,6 +103,7 @@ Position positionAfterContainingSpecialElement(const Position&, Node** containin
 Position positionOutsideContainingSpecialElement(const Position&, Node** containingSpecialElement=0);
 
 Node* enclosingNodeWithTag(Node*, const QualifiedName&);
+Node* enclosingNodeOfType(Node*, bool (*nodeIsOfType)(Node*));
 Node* enclosingTableCell(Node*);
 Node* enclosingEmptyListItem(const VisiblePosition&);
 bool isListElement(Node*);