[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

tkent at chromium.org tkent at chromium.org
Wed Dec 22 11:52:37 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 204155dc0aba52d5c970eaf10c52a7c44a31250a
Author: tkent at chromium.org <tkent at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Tue Aug 10 10:08:22 2010 +0000

    2010-08-10  Yoshiki Hayashi  <yhayashi at google.com>
    
            Reviewed by Kent Tamura.
    
            Iterate over :first-letter so that it will be included in innerText.
            https://bugs.webkit.org/show_bug.cgi?id=39863
    
            Test: fast/dom/inner-text-first-letter.html
    
            * editing/TextIterator.cpp:
            (WebCore::TextIterator::TextIterator):
            (WebCore::TextIterator::advance):
            (WebCore::TextIterator::handleTextNode):
            (WebCore::TextIterator::handleTextBox):
            (WebCore::TextIterator::emitText):
            * editing/TextIterator.h:
    
    2010-08-10  Yoshiki Hayashi  <yhayashi at google.com>
    
            Reviewed by Kent Tamura.
    
            Iterate over :first-letter so that it will be included in innerText.
            https://bugs.webkit.org/show_bug.cgi?id=39863
    
            * fast/dom/inner-text-first-letter-expected.txt: Added.
            * fast/dom/inner-text-first-letter.html: Added.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@65062 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 67f91f2..01c3e08 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,13 @@
+2010-08-10  Yoshiki Hayashi  <yhayashi at google.com>
+
+        Reviewed by Kent Tamura.
+
+        Iterate over :first-letter so that it will be included in innerText.
+        https://bugs.webkit.org/show_bug.cgi?id=39863
+
+        * fast/dom/inner-text-first-letter-expected.txt: Added.
+        * fast/dom/inner-text-first-letter.html: Added.
+
 2010-08-10  Kent Tamura  <tkent at chromium.org>
 
         Reviewed by Darin Adler.
diff --git a/LayoutTests/fast/css/getComputedStyle/getComputedStyle-with-pseudo-element-expected.txt b/LayoutTests/fast/css/getComputedStyle/getComputedStyle-with-pseudo-element-expected.txt
index 49576f1..0e7bc50 100644
--- a/LayoutTests/fast/css/getComputedStyle/getComputedStyle-with-pseudo-element-expected.txt
+++ b/LayoutTests/fast/css/getComputedStyle/getComputedStyle-with-pseudo-element-expected.txt
@@ -1,7 +1,7 @@
 Test for WebKit bug 24021: pseudo-element styles not accessible / retrievable via DOM methods
 
 
-orem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
 
 Middle
 
diff --git a/LayoutTests/fast/dom/inner-text-first-letter-expected.txt b/LayoutTests/fast/dom/inner-text-first-letter-expected.txt
new file mode 100644
index 0000000..b7db292
--- /dev/null
+++ b/LayoutTests/fast/dom/inner-text-first-letter-expected.txt
@@ -0,0 +1,69 @@
+This tests a letter with :first-letter applied is present in innerText.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS document.getElementById('divFirst').innerText is document.getElementById('divNormal').innerText
+PASS document.getElementById('pFirst').innerText is document.getElementById('pNormal').innerText
+PASS document.getElementById('collapsedSpaceFirst').innerText is document.getElementById('collapsedSpaceNormal').innerText
+PASS document.getElementById('collapsedSpacePreFirst').innerText is document.getElementById('collapsedSpacePreNormal').innerText
+PASS document.getElementById('preLineFirst').innerText is document.getElementById('preLineNormal').innerText
+PASS document.getElementById('preWrapFirst').innerText is document.getElementById('preWrapNormal').innerText
+PASS document.getElementById('preSpaceFirst').innerText is document.getElementById('preSpaceNormal').innerText
+PASS document.getElementById('collapsedSpaceDivFirst').innerText is document.getElementById('collapsedSpaceDivNormal').innerText
+PASS document.getElementById('firstCollapsedDivFirst').innerText is document.getElementById('firstCollapsedDivNormal').innerText
+PASS document.getElementById('collapsedSpaceCollapsedDivFirst').innerText is document.getElementById('collapsedSpaceCollapsedDivNormal').innerText
+PASS document.getElementById('collapsedSpaceCollapsedDivFirst').innerText is 'foo\nabc\n'
+PASS document.getElementById('collapsedSpacePunctDivFirst').innerText is document.getElementById('collapsedSpacePunctDivNormal').innerText
+PASS document.getElementById('collapsedSpacePunctDivFirst').innerText is 'foo\n| abc\n'
+PASS document.getElementById('divSpanFirst').innerText is document.getElementById('divSpanNormal').innerText
+PASS document.getElementById('invisiblePre').innerText is ''
+PASS document.getElementById('invisiblePreFirst').innerText is 't\n'
+PASS document.getElementById('invisible').innerText is 'test\n'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+div
+div
+pre
+pre
+abc
+abc
+ abc
+ abc
+test
+  abc
+test
+  abc
+test
+abc
+test
+abc
+test
+test
+
+test
+
+test
+foo
+abc
+foo
+abc
+abc
+def
+abc
+def
+foo
+abc
+foo
+abc
+foo
+| abc
+foo
+| abc
+12
+12
+t
+test
+Results
+
diff --git a/LayoutTests/fast/dom/inner-text-first-letter.html b/LayoutTests/fast/dom/inner-text-first-letter.html
new file mode 100644
index 0000000..8689243
--- /dev/null
+++ b/LayoutTests/fast/dom/inner-text-first-letter.html
@@ -0,0 +1,90 @@
+<html>
+<head>
+<link rel="stylesheet" href="../js/resources/js-test-style.css">
+<script src="../js/resources/js-test-pre.js"></script>
+<style>
+.first:first-letter {
+  font-weight: bold;
+  visibility: visible;
+}
+.visible {
+  visiblity: visible;
+}
+.invisible {
+  visibility: hidden;
+}
+.preLine {
+  white-space: pre-line;
+}
+.preWrap {
+  white-space: pre-wrap;
+}
+</style>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<div id="divFirst" class="first">div</div>
+<div id="divNormal">div</div>
+<pre id="pFirst" class="first">pre</pre>
+<pre id="pNormal">pre</pre>
+<div id="collapsedSpaceFirst"><span> </span><div class="first">abc</div></div>
+<div id="collapsedSpaceNormal"><span> </span><div>abc</div></div>
+<div id="collapsedSpacePreFirst"><span> </span><pre class="first">abc</pre></div>
+<div id="collapsedSpacePreNormal"><span> </span><pre>abc</pre></div>
+<div id="preSpaceFirst"><span>test</span><pre class="first">  abc</pre></div>
+<div id="preSpaceNormal"><span>test</span><pre>  abc</pre></div>
+<div id="divSpaceFirst"><span>test</span><div class="first">  abc</div></div>
+<div id="divSpaceNormal"><span>test</span><div>  abc</div></div>
+<div id="preLineFirst" class="first preLine">test</div>
+<div id="preLineNormal" class="preLine">test</div>
+<div id="preWrapFirst" class="first preWrap">
+test</div>
+<div id="preWrapNormal" class="preWrap">
+test</div>
+<div id="collapsedSpaceDivFirst"><span>foo</span><span> </span><div class="first">abc</div></div>
+<div id="collapsedSpaceDivNormal"><span>foo</span><span> </span><div>abc</div></div>
+<div id="firstCollapsedDivFirst"><div class="first">abc  </div><span>def</span></div>
+<div id="firstCollapsedDivNormal"><div>abc  </div><span>def</span></div>
+<div id="collapsedSpaceCollapsedDivFirst"><span>foo</span><span> </span><div class="first">  abc</div></div>
+<div id="collapsedSpaceCollapsedDivNormal"><span>foo</span><span> </span><div>  abc</div></div>
+<div id="collapsedSpacePunctDivFirst"><span>foo</span><span> </span><div class="first">|  
+abc</div></div>
+<div id="collapsedSpacePunctDivNormal"><span>foo</span><span> </span><div>|  
+abc</div></div>
+<div id="divSpanFirst" class="first"><span id="f1">1</span><span id="f2">2</span></div>
+<div id="divSpanNormal"><span id="n1">1</span><span id="n2">2</span></div>
+<div id="invisiblePre"><pre class="invisible">test</pre></div>
+<div id="invisiblePreFirst"><pre class="invisible first">test</pre></div>
+<div id="invisible">
+<div class="invisible"><input value="an input" type="text"/> </div><pre>test</pre>
+</div>
+
+<pre>
+Results
+</pre>
+</div>
+<script>
+description("This tests a letter with :first-letter applied is present in innerText.");
+shouldBe("document.getElementById('divFirst').innerText", "document.getElementById('divNormal').innerText");
+shouldBe("document.getElementById('pFirst').innerText", "document.getElementById('pNormal').innerText");
+shouldBe("document.getElementById('collapsedSpaceFirst').innerText", "document.getElementById('collapsedSpaceNormal').innerText");
+shouldBe("document.getElementById('collapsedSpacePreFirst').innerText", "document.getElementById('collapsedSpacePreNormal').innerText");
+shouldBe("document.getElementById('preLineFirst').innerText", "document.getElementById('preLineNormal').innerText");
+shouldBe("document.getElementById('preWrapFirst').innerText", "document.getElementById('preWrapNormal').innerText");
+shouldBe("document.getElementById('preSpaceFirst').innerText", "document.getElementById('preSpaceNormal').innerText");
+shouldBe("document.getElementById('collapsedSpaceDivFirst').innerText", "document.getElementById('collapsedSpaceDivNormal').innerText");
+shouldBe("document.getElementById('firstCollapsedDivFirst').innerText", "document.getElementById('firstCollapsedDivNormal').innerText");
+shouldBe("document.getElementById('collapsedSpaceCollapsedDivFirst').innerText", "document.getElementById('collapsedSpaceCollapsedDivNormal').innerText");
+shouldBe("document.getElementById('collapsedSpaceCollapsedDivFirst').innerText", "'foo\\nabc\\n'");
+shouldBe("document.getElementById('collapsedSpacePunctDivFirst').innerText", "document.getElementById('collapsedSpacePunctDivNormal').innerText");
+shouldBe("document.getElementById('collapsedSpacePunctDivFirst').innerText", "'foo\\n| abc\\n'");
+shouldBe("document.getElementById('divSpanFirst').innerText", "document.getElementById('divSpanNormal').innerText");
+shouldBe("document.getElementById('invisiblePre').innerText", "''");
+shouldBe("document.getElementById('invisiblePreFirst').innerText", "'t\\n'");
+shouldBe("document.getElementById('invisible').innerText", "'test\\n'");
+var successfullyParsed = true;
+</script>
+<script src="../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 88259f7..9aa3362 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,20 @@
+2010-08-10  Yoshiki Hayashi  <yhayashi at google.com>
+
+        Reviewed by Kent Tamura.
+
+        Iterate over :first-letter so that it will be included in innerText.
+        https://bugs.webkit.org/show_bug.cgi?id=39863
+
+        Test: fast/dom/inner-text-first-letter.html
+
+        * editing/TextIterator.cpp:
+        (WebCore::TextIterator::TextIterator):
+        (WebCore::TextIterator::advance):
+        (WebCore::TextIterator::handleTextNode):
+        (WebCore::TextIterator::handleTextBox):
+        (WebCore::TextIterator::emitText):
+        * editing/TextIterator.h:
+
 2010-08-10  Kent Tamura  <tkent at chromium.org>
 
         Reviewed by Darin Adler.
diff --git a/WebCore/editing/TextIterator.cpp b/WebCore/editing/TextIterator.cpp
index 4d6c14a..9589bff 100644
--- a/WebCore/editing/TextIterator.cpp
+++ b/WebCore/editing/TextIterator.cpp
@@ -37,6 +37,7 @@
 #include "RenderTableCell.h"
 #include "RenderTableRow.h"
 #include "RenderTextControl.h"
+#include "RenderTextFragment.h"
 #include "VisiblePosition.h"
 #include "visible_units.h"
 
@@ -253,10 +254,13 @@ TextIterator::TextIterator()
     , m_positionNode(0)
     , m_textCharacters(0)
     , m_textLength(0)
+    , m_remainingTextBox(0)
+    , m_firstLetterText(0)
     , m_lastCharacter(0)
     , m_emitsCharactersBetweenAllVisiblePositions(false)
     , m_entersTextControls(false)
     , m_emitsTextWithoutTranscoding(false)
+    , m_handledFirstLetter(false)
 {
 }
 
@@ -268,9 +272,12 @@ TextIterator::TextIterator(const Range* r, TextIteratorBehavior behavior)
     , m_positionNode(0)
     , m_textCharacters(0)
     , m_textLength(0)
+    , m_remainingTextBox(0)
+    , m_firstLetterText(0)
     , m_emitsCharactersBetweenAllVisiblePositions(behavior & TextIteratorEmitsCharactersBetweenAllVisiblePositions)
     , m_entersTextControls(behavior & TextIteratorEntersTextControls)
     , m_emitsTextWithoutTranscoding(behavior & TextIteratorEmitsTextsWithoutTranscoding)
+    , m_handledFirstLetter(false)
 {
     // FIXME: should support TextIteratorEndsAtEditingBoundary http://webkit.org/b/43609
     ASSERT(behavior != TextIteratorEndsAtEditingBoundary);
@@ -347,6 +354,12 @@ void TextIterator::advance()
         return;
     }
 
+    if (!m_textBox && m_remainingTextBox) {
+        m_textBox = m_remainingTextBox;
+        m_remainingTextBox = 0;
+        m_firstLetterText = 0;
+        m_offset = 0;
+    }
     // handle remembered text box
     if (m_textBox) {
         handleTextBox();
@@ -420,6 +433,8 @@ void TextIterator::advance()
             pushFullyClippedState(m_fullyClippedStack, m_node);
         m_handledNode = false;
         m_handledChildren = false;
+        m_handledFirstLetter = false;
+        m_firstLetterText = 0;
 
         // how would this ever be?
         if (m_positionNode)
@@ -438,8 +453,6 @@ bool TextIterator::handleTextNode()
         return false;
 
     RenderText* renderer = toRenderText(m_node->renderer());
-    if (renderer->style()->visibility() != VISIBLE)
-        return false;
         
     m_lastTextNode = m_node;
     String str = renderer->text();
@@ -447,10 +460,22 @@ bool TextIterator::handleTextNode()
     // handle pre-formatted text
     if (!renderer->style()->collapseWhiteSpace()) {
         int runStart = m_offset;
-        if (m_lastTextNodeEndedWithCollapsedSpace) {
+        if (m_lastTextNodeEndedWithCollapsedSpace && hasVisibleTextNode(renderer)) {
             emitCharacter(' ', m_node, 0, runStart, runStart);
             return false;
         }
+        if (!m_handledFirstLetter && renderer->isTextFragment()) {
+            handleTextNodeFirstLetter(static_cast<RenderTextFragment*>(renderer));
+            if (m_firstLetterText) {
+                String firstLetter = m_firstLetterText->text();
+                emitText(m_node, m_firstLetterText, m_offset, firstLetter.length());
+                m_firstLetterText = 0;
+                m_textBox = 0;
+                return false;
+            }
+        }
+        if (renderer->style()->visibility() != VISIBLE)
+            return false;
         int strLength = str.length();
         int end = (m_node == m_endContainer) ? m_endOffset : INT_MAX;
         int runEnd = min(strLength, end);
@@ -463,6 +488,15 @@ bool TextIterator::handleTextNode()
     }
 
     if (!renderer->firstTextBox() && str.length() > 0) {
+        if (!m_handledFirstLetter && renderer->isTextFragment()) {
+            handleTextNodeFirstLetter(static_cast<RenderTextFragment*>(renderer));
+            if (m_firstLetterText) {
+                handleTextBox();
+                return false;
+            }
+        }
+        if (renderer->style()->visibility() != VISIBLE)
+            return false;
         m_lastTextNodeEndedWithCollapsedSpace = true; // entire block is collapsed space
         return true;
     }
@@ -478,13 +512,19 @@ bool TextIterator::handleTextNode()
     }
     
     m_textBox = renderer->containsReversedText() ? (m_sortedTextBoxes.isEmpty() ? 0 : m_sortedTextBoxes[0]) : renderer->firstTextBox();
+    if (!m_handledFirstLetter && renderer->isTextFragment() && !m_offset)
+        handleTextNodeFirstLetter(static_cast<RenderTextFragment*>(renderer));
     handleTextBox();
     return true;
 }
 
 void TextIterator::handleTextBox()
 {    
-    RenderText* renderer = toRenderText(m_node->renderer());
+    RenderText* renderer = m_firstLetterText ? m_firstLetterText : toRenderText(m_node->renderer());
+    if (renderer->style()->visibility() != VISIBLE) {
+        m_textBox = 0;
+        return;
+    }
     String str = renderer->text();
     int start = m_offset;
     int end = (m_node == m_endContainer) ? m_endOffset : INT_MAX;
@@ -530,7 +570,7 @@ void TextIterator::handleTextBox()
                     subrunEnd = runEnd;
     
                 m_offset = subrunEnd;
-                emitText(m_node, runStart, subrunEnd);
+                emitText(m_node, renderer, runStart, subrunEnd);
             }
 
             // If we are doing a subrun that doesn't go to the end of the text box,
@@ -552,6 +592,33 @@ void TextIterator::handleTextBox()
         if (renderer->containsReversedText())
             ++m_sortedTextBoxesPosition;
     }
+    if (!m_textBox && m_remainingTextBox) {
+        m_textBox = m_remainingTextBox;
+        m_remainingTextBox = 0;
+        m_firstLetterText = 0;
+        m_offset = 0;
+        handleTextBox();
+    }
+}
+
+void TextIterator::handleTextNodeFirstLetter(RenderTextFragment* renderer)
+{
+    if (renderer->firstLetter()) {
+        RenderObject* r = renderer->firstLetter();
+        if (r->style()->visibility() != VISIBLE)
+            return;
+        for (RenderObject *currChild = r->firstChild(); currChild; currChild->nextSibling()) {
+            if (currChild->isText()) {
+                RenderText* firstLetter = toRenderText(currChild);
+                m_handledFirstLetter = true;
+                m_remainingTextBox = m_textBox;
+                m_textBox = firstLetter->firstTextBox();
+                m_firstLetterText = firstLetter;
+                return;
+            }
+        }
+    }
+    m_handledFirstLetter = true;
 }
 
 bool TextIterator::handleReplacedElement()
@@ -600,6 +667,18 @@ bool TextIterator::handleReplacedElement()
     return true;
 }
 
+bool TextIterator::hasVisibleTextNode(RenderText* renderer)
+{
+    if (renderer->style()->visibility() == VISIBLE)
+        return true;
+    if (renderer->isTextFragment()) {
+        RenderTextFragment* fragment = static_cast<RenderTextFragment*>(renderer);
+        if (fragment->firstLetter() && fragment->firstLetter()->style()->visibility() == VISIBLE)
+            return true;
+    }
+    return false;
+}
+
 static bool shouldEmitTabBeforeNode(Node* node)
 {
     RenderObject* r = node->renderer();
@@ -891,9 +970,9 @@ void TextIterator::emitCharacter(UChar c, Node* textNode, Node* offsetBaseNode,
     m_lastCharacter = c;
 }
 
-void TextIterator::emitText(Node* textNode, int textStartOffset, int textEndOffset)
+void TextIterator::emitText(Node* textNode, RenderObject* renderObject, int textStartOffset, int textEndOffset)
 {
-    RenderText* renderer = toRenderText(m_node->renderer());
+    RenderText* renderer = toRenderText(renderObject);
     m_text = m_emitsTextWithoutTranscoding ? renderer->textWithoutTranscoding() : renderer->text();
     ASSERT(m_text.characters());
 
@@ -909,6 +988,11 @@ void TextIterator::emitText(Node* textNode, int textStartOffset, int textEndOffs
     m_hasEmitted = true;
 }
 
+void TextIterator::emitText(Node* textNode, int textStartOffset, int textEndOffset)
+{
+    emitText(textNode, m_node->renderer(), textStartOffset, textEndOffset);
+}
+
 PassRefPtr<Range> TextIterator::range() const
 {
     // use the current run information, if we have it
diff --git a/WebCore/editing/TextIterator.h b/WebCore/editing/TextIterator.h
index 6a0d685..805e060 100644
--- a/WebCore/editing/TextIterator.h
+++ b/WebCore/editing/TextIterator.h
@@ -32,6 +32,9 @@
 
 namespace WebCore {
 
+class RenderText;
+class RenderTextFragment;
+
 // FIXME: Can't really answer this question correctly without knowing the white-space mode.
 // FIXME: Move this somewhere else in the editing directory. It doesn't belong here.
 inline bool isCollapsibleWhitespace(UChar c)
@@ -103,7 +106,10 @@ private:
     bool handleReplacedElement();
     bool handleNonTextNode();
     void handleTextBox();
+    void handleTextNodeFirstLetter(RenderTextFragment*);
+    bool hasVisibleTextNode(RenderText*);
     void emitCharacter(UChar, Node* textNode, Node* offsetBaseNode, int textStartOffset, int textEndOffset);
+    void emitText(Node* textNode, RenderObject* renderObject, int textStartOffset, int textEndOffset);
     void emitText(Node* textNode, int textStartOffset, int textEndOffset);
     
     // Current position, not necessarily of the text being returned, but position
@@ -135,6 +141,11 @@ private:
     // are false and 0, we go back to normal iterating.
     bool m_needsAnotherNewline;
     InlineTextBox* m_textBox;
+    // Used when iteration over :first-letter text to save pointer to
+    // remaining text box.
+    InlineTextBox* m_remainingTextBox;
+    // Used to point to RenderText object for :first-letter.
+    RenderText *m_firstLetterText;
     
     // Used to do the whitespace collapsing logic.
     Node* m_lastTextNode;    
@@ -160,6 +171,8 @@ private:
 
     // Used when we want texts for copying, pasting, and transposing.
     bool m_emitsTextWithoutTranscoding;
+    // Used when deciding text fragment created by :first-letter should be looked into.
+    bool m_handledFirstLetter;
 };
 
 // Iterates through the DOM range, returning all the text, and 0-length boundaries

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list