- 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);
}