Title: [125739] trunk
Revision
125739
Author
[email protected]
Date
2012-08-15 20:05:59 -0700 (Wed, 15 Aug 2012)

Log Message

Regression(121518) TextFieldDecorationElement formatting is broken.
https://bugs.webkit.org/show_bug.cgi?id=90913

Reviewed by Dimitri Glazkov.

Source/WebCore:

NodeRenderingContext::nextRenderer() has a problem which cannot retrieve the renderer
across an insertion point in some case. That is because ad-hoc composed tree traversal on
NodeRenderingContext is broken. The problem is hidden before r121518 though.

This change rewrite nextRenderer() using ComposedShadowTreeWalker to eliminate the ad-hoc
traversal. previousRenderer() is also rewritten in the same way.

Test: fast/dom/shadow/shadow-div-reflow.html

* dom/NodeRenderingContext.cpp:
(WebCore):
(WebCore::NodeRenderingContext::nextRenderer):
(WebCore::NodeRenderingContext::previousRenderer):

LayoutTests:

* fast/dom/shadow/shadow-div-reflow-expected.html: Added.
* fast/dom/shadow/shadow-div-reflow.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (125738 => 125739)


--- trunk/LayoutTests/ChangeLog	2012-08-16 02:40:21 UTC (rev 125738)
+++ trunk/LayoutTests/ChangeLog	2012-08-16 03:05:59 UTC (rev 125739)
@@ -1,3 +1,13 @@
+2012-08-15  MORITA Hajime  <[email protected]>
+
+        Regression(121518) TextFieldDecorationElement formatting is broken.
+        https://bugs.webkit.org/show_bug.cgi?id=90913
+
+        Reviewed by Dimitri Glazkov.
+
+        * fast/dom/shadow/shadow-div-reflow-expected.html: Added.
+        * fast/dom/shadow/shadow-div-reflow.html: Added.
+
 2012-08-14  Jeffrey Pfau  <[email protected]>
 
         Allow blocking of Web SQL databases in third-party documents

Added: trunk/LayoutTests/fast/dom/shadow/shadow-div-reflow-expected.html (0 => 125739)


--- trunk/LayoutTests/fast/dom/shadow/shadow-div-reflow-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/shadow/shadow-div-reflow-expected.html	2012-08-16 03:05:59 UTC (rev 125739)
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+#host {
+    width: 200px;
+}
+</style>
+</head>
+<body>
+<div>
+    <div>
+        <div><div>First line leads,</div></div>
+        <div>second line follows.</div>
+    </div>
+</div>
+</body>
+</html>

Added: trunk/LayoutTests/fast/dom/shadow/shadow-div-reflow.html (0 => 125739)


--- trunk/LayoutTests/fast/dom/shadow/shadow-div-reflow.html	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/shadow/shadow-div-reflow.html	2012-08-16 03:05:59 UTC (rev 125739)
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+#host {
+    width: 200px;
+}
+</style>
+</head>
+<body>
+<div id="host" tabindex=0>
+    <div>
+        <div><div>First line leads,</div></div>
+    </div>
+</div>
+<script>
+if (window.internals)
+   internals.settings.setAuthorShadowDOMForAnyElementEnabled(true);
+
+var host = document.getElementById("host");
+var shadow1 = new WebKitShadowRoot(host);
+shadow1.innerHTML = "<div><shadow></shadow><div></div></div>";
+var shadow2 = new WebKitShadowRoot(host);
+shadow2.innerHTML = "<section>"
+                 +   "<shadow></shadow>"
+                 +   "<div>second line follows.</div>"
+                 + "</section>";
+host.focus();
+host.blur();
+</script>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (125738 => 125739)


--- trunk/Source/WebCore/ChangeLog	2012-08-16 02:40:21 UTC (rev 125738)
+++ trunk/Source/WebCore/ChangeLog	2012-08-16 03:05:59 UTC (rev 125739)
@@ -1,3 +1,24 @@
+2012-08-15  MORITA Hajime  <[email protected]>
+
+        Regression(121518) TextFieldDecorationElement formatting is broken.
+        https://bugs.webkit.org/show_bug.cgi?id=90913
+
+        Reviewed by Dimitri Glazkov.
+
+        NodeRenderingContext::nextRenderer() has a problem which cannot retrieve the renderer
+        across an insertion point in some case. That is because ad-hoc composed tree traversal on
+        NodeRenderingContext is broken. The problem is hidden before r121518 though.
+
+        This change rewrite nextRenderer() using ComposedShadowTreeWalker to eliminate the ad-hoc
+        traversal. previousRenderer() is also rewritten in the same way.
+
+        Test: fast/dom/shadow/shadow-div-reflow.html
+
+        * dom/NodeRenderingContext.cpp:
+        (WebCore):
+        (WebCore::NodeRenderingContext::nextRenderer):
+        (WebCore::NodeRenderingContext::previousRenderer):
+
 2012-08-15  Julien Chaffraix  <[email protected]>
 
         Add a was-inserted-into-tree notification to RenderObject

Modified: trunk/Source/WebCore/dom/NodeRenderingContext.cpp (125738 => 125739)


--- trunk/Source/WebCore/dom/NodeRenderingContext.cpp	2012-08-16 02:40:21 UTC (rev 125738)
+++ trunk/Source/WebCore/dom/NodeRenderingContext.cpp	2012-08-16 03:05:59 UTC (rev 125739)
@@ -49,9 +49,6 @@
 
 using namespace HTMLNames;
 
-static RenderObject* firstRendererOf(Node*);
-static RenderObject* lastRendererOf(Node*);
-
 NodeRenderingContext::NodeRenderingContext(Node* node)
     : m_node(node)
     , m_style(0)
@@ -82,93 +79,6 @@
     return m_style.release();
 }
 
-static inline RenderObject* nextRendererOfInsertionPoint(InsertionPoint* parent, Node* current)
-{
-    size_t start = parent->indexOf(current);
-    if (notFound == start)
-        return 0;
-
-    for (size_t i = start + 1; i < parent->size(); ++i) {
-        if (RenderObject* renderer = parent->at(i)->renderer())
-            return renderer;
-    }
-
-    return 0;
-}
-
-static inline RenderObject* previousRendererOfInsertionPoint(InsertionPoint* parent, Node* current)
-{
-    RenderObject* lastRenderer = 0;
-
-    for (size_t i = 0; i < parent->size(); ++i) {
-        if (parent->at(i) == current)
-            break;
-        if (RenderObject* renderer = parent->at(i)->renderer())
-            lastRenderer = renderer;
-    }
-
-    return lastRenderer;
-}
-
-static inline RenderObject* firstRendererOfInsertionPoint(InsertionPoint* parent)
-{
-    size_t size = parent->size();
-    for (size_t i = 0; i < size; ++i) {
-        if (RenderObject* renderer = parent->at(i)->renderer())
-            return renderer;
-    }
-
-    return firstRendererOf(parent->firstChild());
-}
-
-static inline RenderObject* lastRendererOfInsertionPoint(InsertionPoint* parent)
-{
-    size_t size = parent->size();
-    for (size_t i = 0; i < size; ++i) {
-        if (RenderObject* renderer = parent->at(size - 1 - i)->renderer())
-            return renderer;
-    }
-
-    return lastRendererOf(parent->lastChild());
-}
-
-static inline RenderObject* firstRendererOf(Node* node)
-{
-    for (; node; node = node->nextSibling()) {
-        if (node->renderer()) {
-            // Do not return elements that are attached to a different flow-thread.
-            if (node->renderer()->style() && !node->renderer()->style()->flowThread().isEmpty())
-                continue;
-            return node->renderer();
-        }
-
-        if (isInsertionPoint(node) && toInsertionPoint(node)->isActive()) {
-            if (RenderObject* first = firstRendererOfInsertionPoint(toInsertionPoint(node)))
-                return first;
-        }
-    }
-
-    return 0;
-}
-
-static inline RenderObject* lastRendererOf(Node* node)
-{
-    for (; node; node = node->previousSibling()) {
-        if (node->renderer()) {
-            // Do not return elements that are attached to a different flow-thread.
-            if (node->renderer()->style() && !node->renderer()->style()->flowThread().isEmpty())
-                continue;
-            return node->renderer();
-        }
-        if (isInsertionPoint(node) && toInsertionPoint(node)->isActive()) {
-            if (RenderObject* last = lastRendererOfInsertionPoint(toInsertionPoint(node)))
-                return last;
-        }
-    }
-
-    return 0;
-}
-
 RenderObject* NodeRenderingContext::nextRenderer() const
 {
     if (RenderObject* renderer = m_node->renderer())
@@ -177,18 +87,26 @@
     if (m_parentFlowRenderer)
         return m_parentFlowRenderer->nextRendererForNode(m_node);
 
-    if (m_parentDetails.insertionPoint()) {
-        if (RenderObject* found = nextRendererOfInsertionPoint(m_parentDetails.insertionPoint(), m_node))
-            return found;
-        return NodeRenderingContext(m_parentDetails.insertionPoint()).nextRenderer();
-    }
-
     // Avoid an O(N^2) problem with this function by not checking for
     // nextRenderer() when the parent element hasn't attached yet.
-    if (m_node->parentOrHostNode() && !m_node->parentOrHostNode()->attached())
+    if (m_parentDetails.node() && !m_parentDetails.node()->attached())
         return 0;
 
-    return firstRendererOf(m_node->nextSibling());
+    ComposedShadowTreeWalker walker(m_node);
+    do {
+        walker.nextSibling();
+        if (!walker.get())
+            return 0;
+        if (RenderObject* renderer = walker.get()->renderer()) {
+            // Do not return elements that are attached to a different flow-thread.
+            if (renderer->style() && !renderer->style()->flowThread().isEmpty())
+                continue;
+            return renderer;
+        }
+    } while (true);
+
+    ASSERT_NOT_REACHED();
+    return 0;
 }
 
 RenderObject* NodeRenderingContext::previousRenderer() const
@@ -199,15 +117,24 @@
     if (m_parentFlowRenderer)
         return m_parentFlowRenderer->previousRendererForNode(m_node);
 
-    if (m_parentDetails.insertionPoint()) {
-        if (RenderObject* found = previousRendererOfInsertionPoint(m_parentDetails.insertionPoint(), m_node))
-            return found;
-        return NodeRenderingContext(m_parentDetails.insertionPoint()).previousRenderer();
-    }
-
     // FIXME: We should have the same O(N^2) avoidance as nextRenderer does
     // however, when I tried adding it, several tests failed.
-    return lastRendererOf(m_node->previousSibling());
+
+    ComposedShadowTreeWalker walker(m_node);
+    do {
+        walker.previousSibling();
+        if (!walker.get())
+            return 0;
+        if (RenderObject* renderer = walker.get()->renderer()) {
+            // Do not return elements that are attached to a different flow-thread.
+            if (renderer->style() && !renderer->style()->flowThread().isEmpty())
+                continue;
+            return renderer;
+        }
+    } while (true);
+
+    ASSERT_NOT_REACHED();
+    return 0;
 }
 
 RenderObject* NodeRenderingContext::parentRenderer() const
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to