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