Title: [152320] trunk
Revision
152320
Author
[email protected]
Date
2013-07-02 13:43:31 -0700 (Tue, 02 Jul 2013)

Log Message

[CSS Regions] Improve implementation of elements in region being flowed to another flow thread
https://bugs.webkit.org/show_bug.cgi?id=118300

Patch by Radu Stavila <[email protected]> on 2013-07-02
Reviewed by David Hyatt.

Source/WebCore:

Methods that must be const have been turned back into const. Code has been better organized.
Performance is better. Tests have been added to.

* dom/Element.cpp:
(WebCore::Element::detach):
(WebCore::Element::setIsInsideRegion):
(WebCore::Element::isInsideRegion):
(WebCore::Element::shouldMoveToFlowThread):
* dom/Element.h:
* dom/ElementRareData.h:
(WebCore::ElementRareData::isInsideRegion):
(WebCore::ElementRareData::setIsInsideRegion):
(WebCore::ElementRareData::ElementRareData):
* dom/Node.cpp:
(WebCore::Node::isRegisteredWithNamedFlow):
* dom/Node.h:
* dom/NodeRenderingContext.cpp:
(WebCore::NodeRenderingContext::parentRenderer):
(WebCore::NodeRenderingContext::shouldCreateRenderer):
(WebCore::NodeRenderingContext::elementInsideRegionNeedsRenderer):
(WebCore::NodeRenderingContext::moveToFlowThreadIfNeeded):
(WebCore::NodeRenderingContext::createRendererForElementIfNeeded):
* dom/NodeRenderingContext.h:
* dom/PseudoElement.h:
* dom/Text.cpp:
(WebCore::Text::textRendererIsNeeded):
* dom/Text.h:
* rendering/FlowThreadController.cpp:
(WebCore::FlowThreadController::unregisterNamedFlowContentNode):
(WebCore::FlowThreadController::isContentNodeRegisteredWithAnyNamedFlow):
* rendering/FlowThreadController.h:
* rendering/RenderObject.h:
* rendering/RenderRegion.h:
* svg/SVGElement.cpp:
(WebCore::SVGElement::shouldMoveToFlowThread):
* svg/SVGElement.h:

LayoutTests:

* fast/regions/flow-body-in-html.html:
* fast/regions/region-content-flown-into-region-expected.html:
* fast/regions/region-content-flown-into-region.html:
* fast/regions/universal-selector-children-to-the-same-region.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (152319 => 152320)


--- trunk/LayoutTests/ChangeLog	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/LayoutTests/ChangeLog	2013-07-02 20:43:31 UTC (rev 152320)
@@ -1,3 +1,15 @@
+2013-07-02  Radu Stavila  <[email protected]>
+
+        [CSS Regions] Improve implementation of elements in region being flowed to another flow thread
+        https://bugs.webkit.org/show_bug.cgi?id=118300
+
+        Reviewed by David Hyatt.
+
+        * fast/regions/flow-body-in-html.html:
+        * fast/regions/region-content-flown-into-region-expected.html:
+        * fast/regions/region-content-flown-into-region.html:
+        * fast/regions/universal-selector-children-to-the-same-region.html:
+
 2013-07-02  David Farler  <[email protected]>
 
         Skip cache partitioning tests on Lion.

Modified: trunk/LayoutTests/fast/regions/flow-body-in-html.html (152319 => 152320)


--- trunk/LayoutTests/fast/regions/flow-body-in-html.html	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/LayoutTests/fast/regions/flow-body-in-html.html	2013-07-02 20:43:31 UTC (rev 152320)
@@ -1,12 +1,12 @@
 <html>
   <head>
-    <title>103685 - [CSS Regions] Universal child selector on region breaks the rendering of its content</title>
+    <title>74144 - [CSS Regions] Elements in a region should be assignable to a named flow</title>
     <style type="text/css">
       body {
-      -webkit-flow-into: foo;
+        -webkit-flow-into: foo;
       }
       html {
-       -webkit-flow-from: foo;
+        -webkit-flow-from: foo;
       }
     </style>
     <script type="text/_javascript_">

Modified: trunk/LayoutTests/fast/regions/region-content-flown-into-region-expected.html (152319 => 152320)


--- trunk/LayoutTests/fast/regions/region-content-flown-into-region-expected.html	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/LayoutTests/fast/regions/region-content-flown-into-region-expected.html	2013-07-02 20:43:31 UTC (rev 152320)
@@ -1,23 +1,35 @@
 <html>
     <head>
         <style type="text/css">
-            div {
-                padding: 1px;
-            }
             .region {
-                border:solid 1px #bbb;
+                border:solid 1px red;
             }
+            .redirectRegion {
+                border: solid 1px blue;
+                margin-top: 10px;
+                margin-bottom: 10px;
+            }
+            .redirectRegion2 {
+                border:solid 1px green;
+            }
         </style>
     </head>
     <body>
-        <div class="region"><template>PASS r0: content that goes in the region.</template></div>
-        <div class="region">
+        <div class="region">PASS r0: content that goes in the region.</div>
+        <div class="redirectRegion">
             <div>PASS r1: content in the region that has flow-into. 1.</div>
-            <div>PASS r1: (enclosed in a div) content in the region that has flow-into. 2. <b>PASS r1: (enclosed in a div) content in the region that has flow-into. 3.</b>.</div>
-            <div>PASS r1: (enclosed in a div) content in the region that has flow-into. 4 .</div>
+            <div>PASS r1: (enclosed in a div) content in the region that has flow-into. 2. 
+                <b><br/>PASS r1: (b enclosed in the div above) content in the region that has flow-into. 3.</b>
+            </div>
+            <div>PASS r1: (enclosed in a div) content in the region that has flow-into. 4.</div>
             <div>PASS r1: content in the region that has flow-into. 5.</div>
+            <svg class="redirectContent" xmlns="http://www.w3.org/2000/svg" version="1.1" height="70">
+                <text x="0" y="15">PASS: SVG text</text>
+                <text x="0" y="30">PASS: SVG text redirected to a flow without regions. only svg root elements are directly collected by a render flow thread.</text>
+                <text x="0" y="45">PASS: SVG text redirected to a flow with regions. only svg root elements are directly collected by a render flow thread.</text>
+            </svg>
         </div>
-        <div class="region"><span>PASS r2: content that is already in a flow goes to another flow .</span></div>
+        <div class="redirectRegion2"><span>PASS r2: content that is already in a flow goes to another flow .</span></div>
         <p><a href="" 74144</a> - [CSS Regions] Elements in a region should be assignable to a named flow</p>
     </body>
 </html>
\ No newline at end of file

Modified: trunk/LayoutTests/fast/regions/region-content-flown-into-region.html (152319 => 152320)


--- trunk/LayoutTests/fast/regions/region-content-flown-into-region.html	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/LayoutTests/fast/regions/region-content-flown-into-region.html	2013-07-02 20:43:31 UTC (rev 152320)
@@ -2,15 +2,12 @@
     <head>
         <title>74144 - [CSS Regions] Elements in a region should be assignable to a named flow</title>
         <style type="text/css">
-            div {
-                padding: 1px;
-            }
             .content {
                 -webkit-flow-into: flow;
             }
             .region {
                 -webkit-flow-from: flow;
-                border:solid 1px #bbb;
+                border:solid 1px red;
             }
 
             .redirectContent {
@@ -18,7 +15,9 @@
             }
             .redirectRegion {
                 -webkit-flow-from: redirectFlow;
-                border:solid 1px #bbb;
+                border:solid 1px blue;
+                margin-top: 10px;
+                margin-bottom: 10px;
             }
 
             .redirectContent2 {
@@ -26,17 +25,21 @@
             }
             .redirectRegion2 {
                 -webkit-flow-from: redirectFlow2;
-                border:solid 1px #bbb;
+                border:solid 1px green;
             }
 
             .redirectContentToNowhere {
                 -webkit-flow-into: redirectToNowhere;
             }
+
+            .displayNone {
+                display: none;
+            }
         </style>
-        <template class="content">PASS r0: content that goes in the region.</template>
     </head>
 
     <body>
+        <div class="content">PASS r0: content that goes in the region.</div>
         <div class="region">
             FAIL: this should not be visible 1.
 
@@ -51,7 +54,7 @@
 
                 <div class="redirectContent">PASS r1: (enclosed in a div) content in the region that has flow-into. 2.
                     <div class="redirectContentToNowhere">FAIL: this should not be visible (redirected to nowhere) 2.</div>
-                    <b>PASS r1: (enclosed in a div) content in the region that has flow-into. 3.</b>.
+                    <b><br/>PASS r1: (b enclosed in the div above) content in the region that has flow-into. 3.</b>
                 </div>
 
                 FAIL: this should not be visible 4.
@@ -60,11 +63,10 @@
             <div>
                 FAIL: this should not be visible 5.
 
-                <div class="redirectContent">PASS r1: (enclosed in a div) content in the region that has flow-into. 4
+                <div class="redirectContent">PASS r1: (enclosed in a div) content in the region that has flow-into. 4.
                     <span class="redirectContent2">PASS r2: content that is already in a flow goes to another flow
                         <span class="redirectContentToNowhere">FAIL: this should not be visible (redirected to nowhere) 3.</span>.
                     </span>
-                    .
                 </div>
 
                 FAIL: this should not be visible 7.
@@ -77,14 +79,37 @@
             <div class="redirectContent">PASS r1: content in the region that has flow-into. 5.</div>
 
             FAIL: this should not be visible 9.
+
+            <div>
+                FAIL: this should not be visible 10.
+
+                <svg class="redirectContent" xmlns="http://www.w3.org/2000/svg" version="1.1" height="70">
+                    <text x="0" y="15">PASS: SVG text</text>
+                    <text x="0" y="30" class="redirectContentToNowhere">PASS: SVG text redirected to a flow without regions. only svg root elements are directly collected by a render flow thread.</text>
+                    <text x="0" y="45" class="redirectContent2">PASS: SVG text redirected to a flow with regions. only svg root elements are directly collected by a render flow thread.</text>
+                </svg>
+
+                FAIL: this should not be visible 11.
+            </div>
+
+            <div class="displayNone">
+                FAIL: this should not be visible 12.
+
+                <div class="redirectContent">FAIL r1: (enclosed in a div) content in the region that has flow-into but display:none
+                    <div class="redirectContentToNowhere">FAIL: this should not be visible (redirected to nowhere AND display:none)</div>
+                    <b><br/>FAIL r1: (b enclosed in the div above) content in the region that has flow-into but display:none</b>
+                </div>
+
+                FAIL: this should not be visible 13.
+            </div>
         </div>
 
         <div class="redirectRegion">
-            FAIL: this should not be visible 10.
+            FAIL: this should not be visible 14.
         </div>
 
         <div class="redirectRegion2">
-            FAIL: this should not be visible 11.
+            FAIL: this should not be visible 15.
         </div>
 
         <p><a href="" 74144</a> - [CSS Regions] Elements in a region should be assignable to a named flow</p>

Modified: trunk/LayoutTests/fast/regions/universal-selector-children-to-the-same-region.html (152319 => 152320)


--- trunk/LayoutTests/fast/regions/universal-selector-children-to-the-same-region.html	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/LayoutTests/fast/regions/universal-selector-children-to-the-same-region.html	2013-07-02 20:43:31 UTC (rev 152320)
@@ -3,10 +3,10 @@
     <title>103685 - [CSS Regions] Universal child selector on region breaks the rendering of its content</title>
     <style type="text/css">
       .region > * {
-      -webkit-flow-into: foo;
+        -webkit-flow-into: foo;
       }
       .region {
-       -webkit-flow-from: foo;
+        -webkit-flow-from: foo;
       }
     </style>
     <script type="text/_javascript_">

Modified: trunk/Source/WebCore/ChangeLog (152319 => 152320)


--- trunk/Source/WebCore/ChangeLog	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/Source/WebCore/ChangeLog	2013-07-02 20:43:31 UTC (rev 152320)
@@ -1,3 +1,47 @@
+2013-07-02  Radu Stavila  <[email protected]>
+
+        [CSS Regions] Improve implementation of elements in region being flowed to another flow thread
+        https://bugs.webkit.org/show_bug.cgi?id=118300
+
+        Reviewed by David Hyatt.
+
+        Methods that must be const have been turned back into const. Code has been better organized. 
+        Performance is better. Tests have been added to.
+
+        * dom/Element.cpp:
+        (WebCore::Element::detach):
+        (WebCore::Element::setIsInsideRegion):
+        (WebCore::Element::isInsideRegion):
+        (WebCore::Element::shouldMoveToFlowThread):
+        * dom/Element.h:
+        * dom/ElementRareData.h:
+        (WebCore::ElementRareData::isInsideRegion):
+        (WebCore::ElementRareData::setIsInsideRegion):
+        (WebCore::ElementRareData::ElementRareData):
+        * dom/Node.cpp:
+        (WebCore::Node::isRegisteredWithNamedFlow):
+        * dom/Node.h:
+        * dom/NodeRenderingContext.cpp:
+        (WebCore::NodeRenderingContext::parentRenderer):
+        (WebCore::NodeRenderingContext::shouldCreateRenderer):
+        (WebCore::NodeRenderingContext::elementInsideRegionNeedsRenderer):
+        (WebCore::NodeRenderingContext::moveToFlowThreadIfNeeded):
+        (WebCore::NodeRenderingContext::createRendererForElementIfNeeded):
+        * dom/NodeRenderingContext.h:
+        * dom/PseudoElement.h:
+        * dom/Text.cpp:
+        (WebCore::Text::textRendererIsNeeded):
+        * dom/Text.h:
+        * rendering/FlowThreadController.cpp:
+        (WebCore::FlowThreadController::unregisterNamedFlowContentNode):
+        (WebCore::FlowThreadController::isContentNodeRegisteredWithAnyNamedFlow):
+        * rendering/FlowThreadController.h:
+        * rendering/RenderObject.h:
+        * rendering/RenderRegion.h:
+        * svg/SVGElement.cpp:
+        (WebCore::SVGElement::shouldMoveToFlowThread):
+        * svg/SVGElement.h:
+
 2013-07-02  Eric Carlson  <[email protected]>
 
         [Mac] .webkitClosedCaptionsVisible doesn't work with "Automatic" caption mode

Modified: trunk/Source/WebCore/dom/Element.cpp (152319 => 152320)


--- trunk/Source/WebCore/dom/Element.cpp	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/Source/WebCore/dom/Element.cpp	2013-07-02 20:43:31 UTC (rev 152320)
@@ -1476,6 +1476,7 @@
         data->setIsInCanvasSubtree(false);
         data->resetComputedStyle();
         data->resetDynamicRestyleObservations();
+        data->setIsInsideRegion(false);
     }
 
     if (ElementShadow* shadow = this->shadow())
@@ -2419,6 +2420,19 @@
     return hasRareData() && elementRareData()->isInCanvasSubtree();
 }
 
+void Element::setIsInsideRegion(bool value)
+{
+    if (value == isInsideRegion())
+        return;
+
+    ensureElementRareData()->setIsInsideRegion(value);
+}
+
+bool Element::isInsideRegion() const
+{
+    return hasRareData() ? elementRareData()->isInsideRegion() : false;
+}
+
 void Element::setRegionOversetState(RegionOversetState state)
 {
     ensureElementRareData()->setRegionOversetState(state);
@@ -2776,34 +2790,26 @@
     return 0;
 }
 
-bool Element::moveToFlowThreadIsNeeded(RefPtr<RenderStyle>& cachedStyle)
+#if ENABLE(CSS_REGIONS)
+
+bool Element::shouldMoveToFlowThread(RenderStyle* styleToUse) const
 {
-    Document* doc = document();
-    
-    if (!doc->cssRegionsEnabled())
-        return false;
+    ASSERT(styleToUse);
 
 #if ENABLE(FULLSCREEN_API)
-    if (doc->webkitIsFullScreen() && doc->webkitCurrentFullScreenElement() == this)
+    if (document()->webkitIsFullScreen() && document()->webkitCurrentFullScreenElement() == this)
         return false;
 #endif
 
     if (isInShadowTree())
         return false;
 
-    if (!cachedStyle)
-        cachedStyle = styleForRenderer();
-    if (!cachedStyle)
+    if (styleToUse->flowThread().isEmpty())
         return false;
 
-    if (cachedStyle->flowThread().isEmpty())
-        return false;
-
-    return !document()->renderView()->flowThreadController()->isContentNodeRegisteredWithAnyNamedFlow(this);
+    return !isRegisteredWithNamedFlow();
 }
 
-#if ENABLE(CSS_REGIONS)
-
 const AtomicString& Element::webkitRegionOverset() const
 {
     document()->updateLayoutIgnorePendingStylesheets();

Modified: trunk/Source/WebCore/dom/Element.h (152319 => 152320)


--- trunk/Source/WebCore/dom/Element.h	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/Source/WebCore/dom/Element.h	2013-07-02 20:43:31 UTC (rev 152320)
@@ -479,6 +479,9 @@
     void setIsInCanvasSubtree(bool);
     bool isInCanvasSubtree() const;
 
+    void setIsInsideRegion(bool);
+    bool isInsideRegion() const;
+
     void setRegionOversetState(RegionOversetState);
     RegionOversetState regionOversetState() const;
 
@@ -632,7 +635,8 @@
     PassRefPtr<RenderStyle> styleForRenderer();
 
     RenderRegion* renderRegion() const;
-    virtual bool moveToFlowThreadIsNeeded(RefPtr<RenderStyle>& cachedStyle);
+    virtual bool shouldMoveToFlowThread(RenderStyle*) const;
+    
 #if ENABLE(CSS_REGIONS)
     const AtomicString& webkitRegionOverset() const;
     Vector<RefPtr<Range> > webkitGetRegionFlowRanges() const;

Modified: trunk/Source/WebCore/dom/ElementRareData.h (152319 => 152320)


--- trunk/Source/WebCore/dom/ElementRareData.h	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/Source/WebCore/dom/ElementRareData.h	2013-07-02 20:43:31 UTC (rev 152320)
@@ -60,6 +60,9 @@
     bool isInCanvasSubtree() const { return m_isInCanvasSubtree; }
     void setIsInCanvasSubtree(bool value) { m_isInCanvasSubtree = value; }
 
+    bool isInsideRegion() const { return m_isInsideRegion; }
+    void setIsInsideRegion(bool value) { m_isInsideRegion = value; }
+
     RegionOversetState regionOversetState() const { return m_regionOversetState; }
     void setRegionOversetState(RegionOversetState state) { m_regionOversetState = state; }
 
@@ -159,6 +162,7 @@
     unsigned m_childrenAffectedByForwardPositionalRules : 1;
     unsigned m_childrenAffectedByBackwardPositionalRules : 1;
 
+    unsigned m_isInsideRegion : 1;
     RegionOversetState m_regionOversetState;
 
     LayoutSize m_minimumSizeForResizing;
@@ -207,6 +211,7 @@
     , m_childrenAffectedByDirectAdjacentRules(false)
     , m_childrenAffectedByForwardPositionalRules(false)
     , m_childrenAffectedByBackwardPositionalRules(false)
+    , m_isInsideRegion(false)
     , m_regionOversetState(RegionUndefined)
     , m_minimumSizeForResizing(defaultMinimumSizeForResizing())
 {

Modified: trunk/Source/WebCore/dom/Node.cpp (152319 => 152320)


--- trunk/Source/WebCore/dom/Node.cpp	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/Source/WebCore/dom/Node.cpp	2013-07-02 20:43:31 UTC (rev 152320)
@@ -60,6 +60,7 @@
 #include "EventNames.h"
 #include "ExceptionCode.h"
 #include "ExceptionCodePlaceholder.h"
+#include "FlowThreadController.h"
 #include "Frame.h"
 #include "FrameView.h"
 #include "HTMLElement.h"
@@ -1123,6 +1124,11 @@
     return parentOrShadowHostNode() ? parentOrShadowHostNode()->canStartSelection() : true;
 }
 
+bool Node::isRegisteredWithNamedFlow() const
+{
+    return document()->renderView()->flowThreadController()->isContentNodeRegisteredWithAnyNamedFlow(this);
+}
+
 Element* Node::shadowHost() const
 {
     if (ShadowRoot* root = containingShadowRoot())

Modified: trunk/Source/WebCore/dom/Node.h (152319 => 152320)


--- trunk/Source/WebCore/dom/Node.h	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/Source/WebCore/dom/Node.h	2013-07-02 20:43:31 UTC (rev 152320)
@@ -276,6 +276,8 @@
     bool inNamedFlow() const { return getFlag(InNamedFlowFlag); }
     bool hasCustomStyleCallbacks() const { return getFlag(HasCustomStyleCallbacksFlag); }
 
+    bool isRegisteredWithNamedFlow() const;
+
     bool hasSyntheticAttrChildNodes() const { return getFlag(HasSyntheticAttrChildNodesFlag); }
     void setHasSyntheticAttrChildNodes(bool flag) { setFlag(flag, HasSyntheticAttrChildNodesFlag); }
 

Modified: trunk/Source/WebCore/dom/NodeRenderingContext.cpp (152319 => 152320)


--- trunk/Source/WebCore/dom/NodeRenderingContext.cpp	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/Source/WebCore/dom/NodeRenderingContext.cpp	2013-07-02 20:43:31 UTC (rev 152320)
@@ -155,7 +155,7 @@
     return 0;
 }
 
-RenderObject* NodeRenderingContext::parentRenderer()
+RenderObject* NodeRenderingContext::parentRenderer() const
 {
     if (RenderObject* renderer = m_node->renderer())
         return renderer->parent();
@@ -177,15 +177,10 @@
     if (m_parentFlowRenderer)
         return m_parentFlowRenderer;
 
-    if (m_node->isElementNode() && toElement(m_node)->moveToFlowThreadIsNeeded(m_style)) {
-        moveToFlowThread();
-        return m_parentFlowRenderer;
-    }
-
     return m_renderingParent ? m_renderingParent->renderer() : 0;
 }
 
-bool NodeRenderingContext::shouldCreateRenderer()
+bool NodeRenderingContext::shouldCreateRenderer() const
 {
     if (!m_node->document()->shouldCreateRenderers())
         return false;
@@ -194,40 +189,42 @@
     RenderObject* parentRenderer = this->parentRenderer();
     if (!parentRenderer)
         return false;
-    if (!parentRenderer->canHaveChildren()
-        && !(m_node->isPseudoElement() && parentRenderer->isRenderRegion())) {
-        if (parentRenderer->canDOMChildrenHaveRenderParent()) {
-            // In a region, only the children that need to be in a flow thread should have a renderer.
-            bool shouldBeInNamedFlow = m_node->isElementNode() && toElement(m_node)->moveToFlowThreadIsNeeded(m_style);
-            if (!shouldBeInNamedFlow)
-                return false;
-        } else
-            return false;
-    }
-
+    if (!parentRenderer->canHaveChildren() && !(m_node->isPseudoElement() && parentRenderer->canHaveGeneratedChildren()))
+        return false;
     if (!m_renderingParent->childShouldCreateRenderer(*this))
         return false;
     return true;
 }
 
-void NodeRenderingContext::moveToFlowThreadIfNeeded()
+// Check the specific case of elements that are children of regions but are flowed into a flow thread themselves.
+bool NodeRenderingContext::elementInsideRegionNeedsRenderer()
 {
-    ASSERT(m_node->isElementNode());
+    Element* element = toElement(m_node);
+    bool elementInsideRegionNeedsRenderer = false;
+    RenderObject* parentRenderer = this->parentRenderer();
+    if ((parentRenderer && !parentRenderer->canHaveChildren() && parentRenderer->isRenderRegion())
+        || (!parentRenderer && element->parentElement() && element->parentElement()->isInsideRegion())) {
 
-    if (!toElement(m_node)->moveToFlowThreadIsNeeded(m_style))
-        return;
+        if (!m_style)
+            m_style = element->styleForRenderer();
 
-    moveToFlowThread();
+        elementInsideRegionNeedsRenderer = element->shouldMoveToFlowThread(m_style.get());
+
+        // Children of this element will only be allowed to be flowed into other flow-threads if display is NOT none.
+        if (element->rendererIsNeeded(*this))
+            element->setIsInsideRegion(true);
+    }
+
+    return elementInsideRegionNeedsRenderer;
 }
 
-void NodeRenderingContext::moveToFlowThread()
+void NodeRenderingContext::moveToFlowThreadIfNeeded()
 {
-    ASSERT(m_node->isElementNode());
-    ASSERT(toElement(m_node)->moveToFlowThreadIsNeeded(m_style));
+    Element* element = toElement(m_node);
 
-    if (!m_style)
-        m_style = toElement(m_node)->styleForRenderer();
-    ASSERT(m_style);
+    if (!element->shouldMoveToFlowThread(m_style.get()))
+        return;
+
     ASSERT(m_node->document()->renderView());
     FlowThreadController* flowThreadController = m_node->document()->renderView()->flowThreadController();
     m_parentFlowRenderer = flowThreadController->ensureRenderFlowThreadWithName(m_style->flowThread());
@@ -250,8 +247,11 @@
 
     Element* element = toElement(m_node);
 
-    if (!shouldCreateRenderer())
+    element->setIsInsideRegion(false);
+
+    if (!shouldCreateRenderer() && !elementInsideRegionNeedsRenderer())
         return;
+
     if (!m_style)
         m_style = element->styleForRenderer();
     ASSERT(m_style);

Modified: trunk/Source/WebCore/dom/NodeRenderingContext.h (152319 => 152320)


--- trunk/Source/WebCore/dom/NodeRenderingContext.h	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/Source/WebCore/dom/NodeRenderingContext.h	2013-07-02 20:43:31 UTC (rev 152320)
@@ -56,7 +56,7 @@
     Node* node() const;
     ContainerNode* parentNodeForRenderingAndStyle() const;
     bool resetStyleInheritance() const;
-    RenderObject* parentRenderer(); // the renderer that will be the parent for this node's renderer. In the case of RenderFlowThreads, it may need to create it.
+    RenderObject* parentRenderer() const;
     RenderObject* nextRenderer() const;
     RenderObject* previousRenderer() const;
     InsertionPoint* insertionPoint() const;
@@ -67,9 +67,9 @@
     bool isOnEncapsulationBoundary() const;
 
 private:
-    bool shouldCreateRenderer();
-    void moveToFlowThread();
+    bool shouldCreateRenderer() const;
     void moveToFlowThreadIfNeeded();
+    bool elementInsideRegionNeedsRenderer();
 
     Node* m_node;
     ContainerNode* m_renderingParent;

Modified: trunk/Source/WebCore/dom/PseudoElement.h (152319 => 152320)


--- trunk/Source/WebCore/dom/PseudoElement.h	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/Source/WebCore/dom/PseudoElement.h	2013-07-02 20:43:31 UTC (rev 152320)
@@ -48,11 +48,7 @@
 
     // As per http://dev.w3.org/csswg/css3-regions/#flow-into, pseudo-elements such as ::first-line, ::first-letter, ::before or ::after
     // cannot be directly collected into a named flow.
-    virtual bool moveToFlowThreadIsNeeded(RefPtr<RenderStyle>& cachedStyle) OVERRIDE
-    {
-        UNUSED_PARAM(cachedStyle);
-        return false;
-    }
+    virtual bool shouldMoveToFlowThread(RenderStyle*) const OVERRIDE { return false; }
 
     virtual bool canStartSelection() const OVERRIDE { return false; }
     virtual bool canContainRangeEndPoint() const OVERRIDE { return false; }

Modified: trunk/Source/WebCore/dom/Text.cpp (152319 => 152320)


--- trunk/Source/WebCore/dom/Text.cpp	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/Source/WebCore/dom/Text.cpp	2013-07-02 20:43:31 UTC (rev 152320)
@@ -199,7 +199,7 @@
     return create(document(), data());
 }
 
-bool Text::textRendererIsNeeded(NodeRenderingContext& context)
+bool Text::textRendererIsNeeded(const NodeRenderingContext& context)
 {
     if (isEditingText())
         return true;

Modified: trunk/Source/WebCore/dom/Text.h (152319 => 152320)


--- trunk/Source/WebCore/dom/Text.h	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/Source/WebCore/dom/Text.h	2013-07-02 20:43:31 UTC (rev 152320)
@@ -46,7 +46,7 @@
     
     void recalcTextStyle(StyleChange);
     void createTextRendererIfNeeded();
-    bool textRendererIsNeeded(NodeRenderingContext&);
+    bool textRendererIsNeeded(const NodeRenderingContext&);
     RenderText* createTextRenderer(RenderArena*, RenderStyle*);
     void updateTextRenderer(unsigned offsetOfReplacedData, unsigned lengthOfReplacedData);
 

Modified: trunk/Source/WebCore/rendering/FlowThreadController.cpp (152319 => 152320)


--- trunk/Source/WebCore/rendering/FlowThreadController.cpp	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/Source/WebCore/rendering/FlowThreadController.cpp	2013-07-02 20:43:31 UTC (rev 152320)
@@ -118,7 +118,7 @@
 void FlowThreadController::unregisterNamedFlowContentNode(Node* contentNode)
 {
     ASSERT(contentNode && contentNode->isElementNode());
-    HashMap<Node*, RenderNamedFlowThread*>::iterator it = m_mapNamedFlowContentNodes.find(contentNode);
+    HashMap<const Node*, RenderNamedFlowThread*>::iterator it = m_mapNamedFlowContentNodes.find(contentNode);
     ASSERT(it != m_mapNamedFlowContentNodes.end());
     ASSERT(it->value);
     ASSERT(it->value->hasContentNode(contentNode));
@@ -227,7 +227,7 @@
     }
 }
 
-bool FlowThreadController::isContentNodeRegisteredWithAnyNamedFlow(Node* contentNode) const
+bool FlowThreadController::isContentNodeRegisteredWithAnyNamedFlow(const Node* contentNode) const
 {
     return m_mapNamedFlowContentNodes.contains(contentNode);
 }

Modified: trunk/Source/WebCore/rendering/FlowThreadController.h (152319 => 152320)


--- trunk/Source/WebCore/rendering/FlowThreadController.h	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/Source/WebCore/rendering/FlowThreadController.h	2013-07-02 20:43:31 UTC (rev 152320)
@@ -66,7 +66,7 @@
 
     void registerNamedFlowContentNode(Node*, RenderNamedFlowThread*);
     void unregisterNamedFlowContentNode(Node*);
-    bool isContentNodeRegisteredWithAnyNamedFlow(Node*) const;
+    bool isContentNodeRegisteredWithAnyNamedFlow(const Node*) const;
 
     bool hasFlowThreadsWithAutoLogicalHeightRegions() const { return m_flowThreadsWithAutoLogicalHeightRegions; }
     void incrementFlowThreadsWithAutoLogicalHeightRegions() { ++m_flowThreadsWithAutoLogicalHeightRegions; }
@@ -92,7 +92,7 @@
     unsigned m_flowThreadsWithAutoLogicalHeightRegions;
     OwnPtr<RenderNamedFlowThreadList> m_renderNamedFlowThreadList;
     // maps a content node to its render flow thread.
-    HashMap<Node*, RenderNamedFlowThread*> m_mapNamedFlowContentNodes;
+    HashMap<const Node*, RenderNamedFlowThread*> m_mapNamedFlowContentNodes;
 };
 
 }

Modified: trunk/Source/WebCore/rendering/RenderObject.h (152319 => 152320)


--- trunk/Source/WebCore/rendering/RenderObject.h	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/Source/WebCore/rendering/RenderObject.h	2013-07-02 20:43:31 UTC (rev 152320)
@@ -252,7 +252,6 @@
     // RenderObject tree manipulation
     //////////////////////////////////////////
     virtual bool canHaveChildren() const { return virtualChildren(); }
-    virtual bool canDOMChildrenHaveRenderParent() const { return false; } // Even if this render object can't have render children, the children in the DOM tree may have a render parent (that is different from this object).
     virtual bool canHaveGeneratedChildren() const;
     virtual bool isChildAllowed(RenderObject*, RenderStyle*) const { return true; }
     virtual void addChild(RenderObject* newChild, RenderObject* beforeChild = 0);

Modified: trunk/Source/WebCore/rendering/RenderRegion.h (152319 => 152320)


--- trunk/Source/WebCore/rendering/RenderRegion.h	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/Source/WebCore/rendering/RenderRegion.h	2013-07-02 20:43:31 UTC (rev 152320)
@@ -155,7 +155,6 @@
     virtual const char* renderName() const { return "RenderRegion"; }
 
     virtual bool canHaveChildren() const OVERRIDE { return false; }
-    virtual bool canDOMChildrenHaveRenderParent() const OVERRIDE { return true; }
     virtual bool canHaveGeneratedChildren() const OVERRIDE { return true; }
 
     virtual void insertedIntoTree() OVERRIDE;

Modified: trunk/Source/WebCore/svg/SVGElement.cpp (152319 => 152320)


--- trunk/Source/WebCore/svg/SVGElement.cpp	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/Source/WebCore/svg/SVGElement.cpp	2013-07-02 20:43:31 UTC (rev 152320)
@@ -460,10 +460,10 @@
     return false;
 }
 
-bool SVGElement::moveToFlowThreadIsNeeded(RefPtr<RenderStyle>& cachedStyle)
+bool SVGElement::shouldMoveToFlowThread(RenderStyle* styleToUse) const
 {
     // Allow only svg root elements to be directly collected by a render flow thread.
-    return parentNode() && !parentNode()->isSVGElement() && hasTagName(SVGNames::svgTag) && Element::moveToFlowThreadIsNeeded(cachedStyle);
+    return parentNode() && !parentNode()->isSVGElement() && hasTagName(SVGNames::svgTag) && Element::shouldMoveToFlowThread(styleToUse);
 }
 
 void SVGElement::sendSVGLoadEventIfPossible(bool sendParentLoadEvents)

Modified: trunk/Source/WebCore/svg/SVGElement.h (152319 => 152320)


--- trunk/Source/WebCore/svg/SVGElement.h	2013-07-02 20:30:22 UTC (rev 152319)
+++ trunk/Source/WebCore/svg/SVGElement.h	2013-07-02 20:43:31 UTC (rev 152320)
@@ -120,7 +120,7 @@
     virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture) OVERRIDE;
     virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture) OVERRIDE;
 
-    virtual bool moveToFlowThreadIsNeeded(RefPtr<RenderStyle>& cachedStyle) OVERRIDE;
+    virtual bool shouldMoveToFlowThread(RenderStyle*) const OVERRIDE;
 
 protected:
     SVGElement(const QualifiedName&, Document*, ConstructionType = CreateSVGElement);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to