Title: [140411] trunk/Source/WebCore
Revision
140411
Author
fal...@chromium.org
Date
2013-01-22 04:15:14 -0800 (Tue, 22 Jan 2013)

Log Message

Move top layer flag from ElementRareData to NodeFlags
https://bugs.webkit.org/show_bug.cgi?id=107542

Reviewed by Hajime Morita.

This is a speculative fix for a perf regression (https://bugs.webkit.org/show_bug.cgi?id=106726)
likely due to checking the top layer flag in Element::removedFrom. It
also simplifies code dealing with top layer and makes it no longer
necessary to allocate rare data for top layer.

* dom/Element.cpp:
(WebCore::Element::removedFrom): Check isInTopLayer first in case it helps fix the perf regression.
(WebCore):
* dom/Element.h: Move top layer functions from Element to Node.
* dom/ElementRareData.h:
(ElementRareData):
(WebCore::ElementRareData::ElementRareData): Remove top layer flag from ElementRareData.
* dom/Node.cpp: Move top layer functions from Element to Node.
(WebCore):
(WebCore::Node::setIsInTopLayer):
* dom/Node.h:
(Node):
(WebCore::Node::isInTopLayer):
* dom/NodeRenderingContext.cpp: Remove unnecessary casts to Element for isInTopLayer().
(WebCore::isRendererReparented):
(WebCore::NodeRenderingContext::previousRenderer):
(WebCore::NodeRenderingContext::parentRenderer):
* rendering/RenderLayer.cpp: Ditto.
(WebCore::RenderLayer::isInTopLayer):
(WebCore::RenderLayer::rebuildZOrderLists):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (140410 => 140411)


--- trunk/Source/WebCore/ChangeLog	2013-01-22 12:11:06 UTC (rev 140410)
+++ trunk/Source/WebCore/ChangeLog	2013-01-22 12:15:14 UTC (rev 140411)
@@ -1,3 +1,36 @@
+2013-01-22  Matt Falkenhagen  <fal...@chromium.org>
+
+        Move top layer flag from ElementRareData to NodeFlags
+        https://bugs.webkit.org/show_bug.cgi?id=107542
+
+        Reviewed by Hajime Morita.
+
+        This is a speculative fix for a perf regression (https://bugs.webkit.org/show_bug.cgi?id=106726)
+        likely due to checking the top layer flag in Element::removedFrom. It
+        also simplifies code dealing with top layer and makes it no longer
+        necessary to allocate rare data for top layer.
+
+        * dom/Element.cpp:
+        (WebCore::Element::removedFrom): Check isInTopLayer first in case it helps fix the perf regression.
+        (WebCore):
+        * dom/Element.h: Move top layer functions from Element to Node.
+        * dom/ElementRareData.h:
+        (ElementRareData):
+        (WebCore::ElementRareData::ElementRareData): Remove top layer flag from ElementRareData.
+        * dom/Node.cpp: Move top layer functions from Element to Node.  
+        (WebCore):
+        (WebCore::Node::setIsInTopLayer):
+        * dom/Node.h:
+        (Node):
+        (WebCore::Node::isInTopLayer):
+        * dom/NodeRenderingContext.cpp: Remove unnecessary casts to Element for isInTopLayer().
+        (WebCore::isRendererReparented):
+        (WebCore::NodeRenderingContext::previousRenderer):
+        (WebCore::NodeRenderingContext::parentRenderer):
+        * rendering/RenderLayer.cpp: Ditto.
+        (WebCore::RenderLayer::isInTopLayer):
+        (WebCore::RenderLayer::rebuildZOrderLists):
+
 2013-01-22  Mark Lam  <mark....@apple.com>
 
         Fix broken mac builds due to <http://trac.webkit.org/changeset/140399>.

Modified: trunk/Source/WebCore/dom/Element.cpp (140410 => 140411)


--- trunk/Source/WebCore/dom/Element.cpp	2013-01-22 12:11:06 UTC (rev 140410)
+++ trunk/Source/WebCore/dom/Element.cpp	2013-01-22 12:15:14 UTC (rev 140411)
@@ -1171,7 +1171,8 @@
 #endif
 
 #if ENABLE(DIALOG_ELEMENT)
-    document()->removeFromTopLayer(this);
+    if (isInTopLayer())
+        document()->removeFromTopLayer(this);
 #endif
 #if ENABLE(FULLSCREEN_API)
     if (containsFullScreenElement())
@@ -2381,22 +2382,6 @@
 }
 #endif    
 
-#if ENABLE(DIALOG_ELEMENT)
-bool Element::isInTopLayer() const
-{
-    return hasRareData() && elementRareData()->isInTopLayer();
-}
-
-void Element::setIsInTopLayer(bool inTopLayer)
-{
-    ensureElementRareData()->setIsInTopLayer(inTopLayer);
-
-    // We must ensure a reattach occurs so the renderer is inserted in the correct sibling order under RenderView according to its
-    // top layer position, or in its usual place if not in the top layer.
-    reattachIfAttached();
-}
-#endif
-
 #if ENABLE(POINTER_LOCK)
 void Element::webkitRequestPointerLock()
 {

Modified: trunk/Source/WebCore/dom/Element.h (140410 => 140411)


--- trunk/Source/WebCore/dom/Element.h	2013-01-22 12:11:06 UTC (rev 140410)
+++ trunk/Source/WebCore/dom/Element.h	2013-01-22 12:15:14 UTC (rev 140411)
@@ -464,11 +464,6 @@
     void webkitRequestFullscreen();
 #endif
 
-#if ENABLE(DIALOG_ELEMENT)
-    bool isInTopLayer() const;
-    void setIsInTopLayer(bool);
-#endif
-
 #if ENABLE(POINTER_LOCK)
     void webkitRequestPointerLock();
 #endif

Modified: trunk/Source/WebCore/dom/ElementRareData.h (140410 => 140411)


--- trunk/Source/WebCore/dom/ElementRareData.h	2013-01-22 12:11:06 UTC (rev 140410)
+++ trunk/Source/WebCore/dom/ElementRareData.h	2013-01-22 12:15:14 UTC (rev 140411)
@@ -65,11 +65,6 @@
     void setContainsFullScreenElement(bool value) { m_containsFullScreenElement = value; }
 #endif
 
-#if ENABLE(DIALOG_ELEMENT)
-    bool isInTopLayer() const { return m_isInTopLayer; }
-    void setIsInTopLayer(bool value) { m_isInTopLayer = value; }
-#endif
-
     bool childrenAffectedByHover() const { return m_childrenAffectedByHover; }
     void setChildrenAffectedByHover(bool value) { m_childrenAffectedByHover = value; }
     bool childrenAffectedByActive() const { return m_childrenAffectedByActive; }
@@ -135,9 +130,6 @@
 #if ENABLE(FULLSCREEN_API)
     unsigned m_containsFullScreenElement : 1;
 #endif
-#if ENABLE(DIALOG_ELEMENT)
-    unsigned m_isInTopLayer : 1;
-#endif
 #if ENABLE(SVG)
     unsigned m_hasPendingResources : 1;
 #endif
@@ -185,9 +177,6 @@
 #if ENABLE(FULLSCREEN_API)
     , m_containsFullScreenElement(false)
 #endif
-#if ENABLE(DIALOG_ELEMENT)
-    , m_isInTopLayer(false)
-#endif
 #if ENABLE(SVG)
     , m_hasPendingResources(false)
 #endif

Modified: trunk/Source/WebCore/dom/Node.cpp (140410 => 140411)


--- trunk/Source/WebCore/dom/Node.cpp	2013-01-22 12:11:06 UTC (rev 140410)
+++ trunk/Source/WebCore/dom/Node.cpp	2013-01-22 12:15:14 UTC (rev 140411)
@@ -2620,6 +2620,17 @@
     rareData()->decrementConnectedSubframeCount(amount);
 }
 
+#if ENABLE(DIALOG_ELEMENT)
+void Node::setIsInTopLayer(bool isInTopLayer)
+{
+    setFlag(isInTopLayer, IsInTopLayer);
+
+    // We must ensure a reattach occurs so the renderer is inserted in the correct sibling order under RenderView according to its
+    // top layer position, or in its usual place if not in the top layer.
+    reattachIfAttached();
+}
+#endif
+
 void Node::registerScopedHTMLStyleChild()
 {
     setHasScopedHTMLStyleChild(true);

Modified: trunk/Source/WebCore/dom/Node.h (140410 => 140411)


--- trunk/Source/WebCore/dom/Node.h	2013-01-22 12:11:06 UTC (rev 140410)
+++ trunk/Source/WebCore/dom/Node.h	2013-01-22 12:15:14 UTC (rev 140411)
@@ -682,6 +682,11 @@
     void incrementConnectedSubframeCount(unsigned amount = 1);
     void decrementConnectedSubframeCount(unsigned amount = 1);
 
+#if ENABLE(DIALOG_ELEMENT)
+    bool isInTopLayer() const { return getFlag(IsInTopLayer); }
+    void setIsInTopLayer(bool);
+#endif
+
 private:
     enum NodeFlags {
         IsTextFlag = 1,
@@ -719,11 +724,14 @@
         V8CollectableDuringMinorGCFlag = 1 << 24,
         NeedsShadowTreeWalkerFlag = 1 << 25,
         IsInShadowTreeFlag = 1 << 26,
+#if ENABLE(DIALOG_ELEMENT)
+        IsInTopLayer = 1 << 27,
+#endif
 
         DefaultNodeFlags = IsParsingChildrenFinishedFlag
     };
 
-    // 5 bits remaining
+    // 4 bits remaining
 
     bool getFlag(NodeFlags mask) const { return m_nodeFlags & mask; }
     void setFlag(bool f, NodeFlags mask) const { m_nodeFlags = (m_nodeFlags & ~mask) | (-(int32_t)f & mask); } 

Modified: trunk/Source/WebCore/dom/NodeRenderingContext.cpp (140410 => 140411)


--- trunk/Source/WebCore/dom/NodeRenderingContext.cpp	2013-01-22 12:11:06 UTC (rev 140410)
+++ trunk/Source/WebCore/dom/NodeRenderingContext.cpp	2013-01-22 12:15:14 UTC (rev 140411)
@@ -75,12 +75,10 @@
 
 static bool isRendererReparented(const RenderObject* renderer)
 {
-    if (!renderer->node()->isElementNode())
-        return false;
-    if (renderer->style() && !renderer->style()->flowThread().isEmpty())
+    if (renderer->node()->isElementNode() && renderer->style() && !renderer->style()->flowThread().isEmpty())
         return true;
 #if ENABLE(DIALOG_ELEMENT)
-    if (toElement(renderer->node())->isInTopLayer())
+    if (renderer->node()->isInTopLayer())
         return true;
 #endif
     return false;
@@ -131,7 +129,7 @@
     // FIXME: This doesn't work correctly for things in the top layer that are
     // display: none. We'd need to duplicate the logic in nextRenderer, but since
     // nothing needs that yet just assert.
-    ASSERT(!m_node->isElementNode() || !toElement(m_node)->isInTopLayer());
+    ASSERT(!m_node->isInTopLayer());
 #endif
 
     if (m_parentFlowRenderer)
@@ -154,7 +152,7 @@
         return renderer->parent();
 
 #if ENABLE(DIALOG_ELEMENT)
-    if (m_node->isElementNode() && toElement(m_node)->isInTopLayer()) {
+    if (m_node->isInTopLayer()) {
         // The parent renderer of top layer elements is the RenderView, but only
         // if the normal parent would have had a renderer.
         // FIXME: This behavior isn't quite right as the spec for top layer

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (140410 => 140411)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2013-01-22 12:11:06 UTC (rev 140410)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2013-01-22 12:15:14 UTC (rev 140411)
@@ -4014,7 +4014,7 @@
 bool RenderLayer::isInTopLayer() const
 {
     Node* node = renderer()->node();
-    return node && node->isElementNode() && toElement(node)->isInTopLayer();
+    return node && node->isInTopLayer();
 }
 
 bool RenderLayer::isInTopLayerSubtree() const
@@ -5167,8 +5167,7 @@
     if (isRootLayer()) {
         RenderObject* view = renderer()->view();
         for (RenderObject* child = view->firstChild(); child; child = child->nextSibling()) {
-            Element* childElement = (child->node() && child->node()->isElementNode()) ? toElement(child->node()) : 0;
-            if (childElement && childElement->isInTopLayer()) {
+            if (child->node() && child->node()->isInTopLayer()) {
                 RenderLayer* layer = toRenderLayerModelObject(child)->layer();
                 m_posZOrderList->append(layer);
             }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to