<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[206049] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/206049">206049</a></dd>
<dt>Author</dt> <dd>antti@apple.com</dd>
<dt>Date</dt> <dd>2016-09-16 14:39:28 -0700 (Fri, 16 Sep 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Tighten region style map to use RenderElement instead of RenderObject
https://bugs.webkit.org/show_bug.cgi?id=162064

Reviewed by Zalan Bujtas.

RenderTexts don't have styles of their own so the map can operate on RenderElements.

* rendering/RenderElement.cpp:
(WebCore::RenderElement::willBeRemovedFromTree):
(WebCore::RenderElement::removeFromRenderFlowThread):
(WebCore::RenderElement::removeFromRenderFlowThreadIncludingDescendants):
(WebCore::RenderElement::invalidateFlowThreadContainingBlockIncludingDescendants):
* rendering/RenderElement.h:
* rendering/RenderFlowThread.cpp:
(WebCore::RenderFlowThread::removeFlowChildInfo):
* rendering/RenderFlowThread.h:
* rendering/RenderNamedFlowFragment.cpp:
(WebCore::RenderNamedFlowFragment::computeChildrenStyleInRegion):
(WebCore::RenderNamedFlowFragment::setRendererStyleInRegion):
(WebCore::RenderNamedFlowFragment::clearObjectStyleInRegion):
(WebCore::RenderNamedFlowFragment::setRegionObjectsRegionStyle):
(WebCore::RenderNamedFlowFragment::restoreRegionObjectsOriginalStyle):
(WebCore::RenderNamedFlowFragment::setObjectStyleInRegion): Deleted.
* rendering/RenderNamedFlowFragment.h:
* rendering/RenderNamedFlowThread.cpp:
(WebCore::RenderNamedFlowThread::clearRenderObjectCustomStyle):
(WebCore::RenderNamedFlowThread::removeFlowChildInfo):
* rendering/RenderNamedFlowThread.h:
* rendering/RenderObject.cpp:
(WebCore::RenderObject::willBeRemovedFromTree):
(WebCore::RenderObject::removeFromRenderFlowThread): Deleted.
(WebCore::RenderObject::removeFromRenderFlowThreadIncludingDescendants): Deleted.
(WebCore::RenderObject::invalidateFlowThreadContainingBlockIncludingDescendants): Deleted.

    These can now move to RenderElement.

* rendering/RenderObject.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderElementcpp">trunk/Source/WebCore/rendering/RenderElement.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderElementh">trunk/Source/WebCore/rendering/RenderElement.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderFlowThreadcpp">trunk/Source/WebCore/rendering/RenderFlowThread.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderFlowThreadh">trunk/Source/WebCore/rendering/RenderFlowThread.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderNamedFlowFragmentcpp">trunk/Source/WebCore/rendering/RenderNamedFlowFragment.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderNamedFlowFragmenth">trunk/Source/WebCore/rendering/RenderNamedFlowFragment.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderNamedFlowThreadcpp">trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderNamedFlowThreadh">trunk/Source/WebCore/rendering/RenderNamedFlowThread.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderObjectcpp">trunk/Source/WebCore/rendering/RenderObject.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderObjecth">trunk/Source/WebCore/rendering/RenderObject.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (206048 => 206049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-09-16 21:20:23 UTC (rev 206048)
+++ trunk/Source/WebCore/ChangeLog        2016-09-16 21:39:28 UTC (rev 206049)
</span><span class="lines">@@ -1,3 +1,43 @@
</span><ins>+2016-09-16  Antti Koivisto  &lt;antti@apple.com&gt;
+
+        Tighten region style map to use RenderElement instead of RenderObject
+        https://bugs.webkit.org/show_bug.cgi?id=162064
+
+        Reviewed by Zalan Bujtas.
+
+        RenderTexts don't have styles of their own so the map can operate on RenderElements.
+
+        * rendering/RenderElement.cpp:
+        (WebCore::RenderElement::willBeRemovedFromTree):
+        (WebCore::RenderElement::removeFromRenderFlowThread):
+        (WebCore::RenderElement::removeFromRenderFlowThreadIncludingDescendants):
+        (WebCore::RenderElement::invalidateFlowThreadContainingBlockIncludingDescendants):
+        * rendering/RenderElement.h:
+        * rendering/RenderFlowThread.cpp:
+        (WebCore::RenderFlowThread::removeFlowChildInfo):
+        * rendering/RenderFlowThread.h:
+        * rendering/RenderNamedFlowFragment.cpp:
+        (WebCore::RenderNamedFlowFragment::computeChildrenStyleInRegion):
+        (WebCore::RenderNamedFlowFragment::setRendererStyleInRegion):
+        (WebCore::RenderNamedFlowFragment::clearObjectStyleInRegion):
+        (WebCore::RenderNamedFlowFragment::setRegionObjectsRegionStyle):
+        (WebCore::RenderNamedFlowFragment::restoreRegionObjectsOriginalStyle):
+        (WebCore::RenderNamedFlowFragment::setObjectStyleInRegion): Deleted.
+        * rendering/RenderNamedFlowFragment.h:
+        * rendering/RenderNamedFlowThread.cpp:
+        (WebCore::RenderNamedFlowThread::clearRenderObjectCustomStyle):
+        (WebCore::RenderNamedFlowThread::removeFlowChildInfo):
+        * rendering/RenderNamedFlowThread.h:
+        * rendering/RenderObject.cpp:
+        (WebCore::RenderObject::willBeRemovedFromTree):
+        (WebCore::RenderObject::removeFromRenderFlowThread): Deleted.
+        (WebCore::RenderObject::removeFromRenderFlowThreadIncludingDescendants): Deleted.
+        (WebCore::RenderObject::invalidateFlowThreadContainingBlockIncludingDescendants): Deleted.
+
+            These can now move to RenderElement.
+
+        * rendering/RenderObject.h:
+
</ins><span class="cx"> 2016-09-16  Brent Fulgham  &lt;bfulgham@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         CaptionUserPreferences's use of the PageGroup's page map is incorrect
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (206048 => 206049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderElement.cpp        2016-09-16 21:20:23 UTC (rev 206048)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp        2016-09-16 21:39:28 UTC (rev 206049)
</span><span class="lines">@@ -1087,6 +1087,8 @@
</span><span class="cx">     if (auto* containerFlowThread = parent()-&gt;renderNamedFlowThreadWrapper())
</span><span class="cx">         containerFlowThread-&gt;removeFlowChild(*this);
</span><span class="cx"> 
</span><ins>+    removeFromRenderFlowThread();
+
</ins><span class="cx">     RenderObject::willBeRemovedFromTree();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -2204,6 +2206,78 @@
</span><span class="cx">     return (frame().settings().shouldRespectImageOrientation() &amp;&amp; is&lt;HTMLImageElement&gt;(element())) ? RespectImageOrientation : DoNotRespectImageOrientation;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RenderElement::removeFromRenderFlowThread()
+{
+    if (flowThreadState() == NotInsideFlowThread)
+        return;
+
+    // Sometimes we remove the element from the flow, but it's not destroyed at that time.
+    // It's only until later when we actually destroy it and remove all the children from it.
+    // Currently, that happens for firstLetter elements and list markers.
+    // Pass in the flow thread so that we don't have to look it up for all the children.
+    removeFromRenderFlowThreadIncludingDescendants(true);
+}
+
+void RenderElement::removeFromRenderFlowThreadIncludingDescendants(bool shouldUpdateState)
+{
+    // Once we reach another flow thread we don't need to update the flow thread state
+    // but we have to continue cleanup the flow thread info.
+    if (isRenderFlowThread())
+        shouldUpdateState = false;
+
+    for (auto&amp; child : childrenOfType&lt;RenderObject&gt;(*this)) {
+        if (is&lt;RenderElement&gt;(child)) {
+            downcast&lt;RenderElement&gt;(child).removeFromRenderFlowThreadIncludingDescendants(shouldUpdateState);
+            continue;
+        }
+        if (shouldUpdateState)
+            child.setFlowThreadState(NotInsideFlowThread);
+    }
+
+    // We have to ask for our containing flow thread as it may be above the removed sub-tree.
+    RenderFlowThread* flowThreadContainingBlock = this-&gt;flowThreadContainingBlock();
+    while (flowThreadContainingBlock) {
+        flowThreadContainingBlock-&gt;removeFlowChildInfo(this);
+
+        if (flowThreadContainingBlock-&gt;flowThreadState() == NotInsideFlowThread)
+            break;
+        auto* parent = flowThreadContainingBlock-&gt;parent();
+        if (!parent)
+            break;
+        flowThreadContainingBlock = parent-&gt;flowThreadContainingBlock();
+    }
+    if (is&lt;RenderBlock&gt;(*this))
+        downcast&lt;RenderBlock&gt;(*this).setCachedFlowThreadContainingBlockNeedsUpdate();
+
+    if (shouldUpdateState)
+        setFlowThreadState(NotInsideFlowThread);
+}
+
+void RenderElement::invalidateFlowThreadContainingBlockIncludingDescendants(RenderFlowThread* flowThread)
+{
+    if (flowThreadState() == NotInsideFlowThread)
+        return;
+
+    if (is&lt;RenderBlock&gt;(*this)) {
+        RenderBlock&amp; block = downcast&lt;RenderBlock&gt;(*this);
+
+        if (block.cachedFlowThreadContainingBlockNeedsUpdate())
+            return;
+
+        flowThread = block.cachedFlowThreadContainingBlock();
+        block.setCachedFlowThreadContainingBlockNeedsUpdate();
+    }
+
+    if (flowThread)
+        flowThread-&gt;removeFlowChildInfo(this);
+
+    if (!is&lt;RenderElement&gt;(*this))
+        return;
+
+    for (auto&amp; child : childrenOfType&lt;RenderElement&gt;(*this))
+        child.invalidateFlowThreadContainingBlockIncludingDescendants(flowThread);
+}
+
</ins><span class="cx"> #if ENABLE(IOS_TEXT_AUTOSIZING)
</span><span class="cx"> static RenderObject::BlockContentHeightType includeNonFixedHeight(const RenderObject&amp; renderer)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderElement.h (206048 => 206049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderElement.h        2016-09-16 21:20:23 UTC (rev 206048)
+++ trunk/Source/WebCore/rendering/RenderElement.h        2016-09-16 21:39:28 UTC (rev 206049)
</span><span class="lines">@@ -229,6 +229,9 @@
</span><span class="cx"> 
</span><span class="cx">     RespectImageOrientationEnum shouldRespectImageOrientation() const;
</span><span class="cx"> 
</span><ins>+    void removeFromRenderFlowThread();
+    void invalidateFlowThreadContainingBlockIncludingDescendants(RenderFlowThread* = nullptr);
+
</ins><span class="cx"> protected:
</span><span class="cx">     enum BaseTypeFlag {
</span><span class="cx">         RenderLayerModelObjectFlag  = 1 &lt;&lt; 0,
</span><span class="lines">@@ -284,6 +287,8 @@
</span><span class="cx">     void paintOutline(PaintInfo&amp;, const LayoutRect&amp;);
</span><span class="cx">     void updateOutlineAutoAncestor(bool hasOutlineAuto);
</span><span class="cx"> 
</span><ins>+    void removeFromRenderFlowThreadIncludingDescendants(bool shouldUpdateState);
+
</ins><span class="cx"> private:
</span><span class="cx">     RenderElement(ContainerNode&amp;, RenderStyle&amp;&amp;, BaseTypeFlags);
</span><span class="cx">     void node() const = delete;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderFlowThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderFlowThread.cpp (206048 => 206049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderFlowThread.cpp        2016-09-16 21:20:23 UTC (rev 206048)
+++ trunk/Source/WebCore/rendering/RenderFlowThread.cpp        2016-09-16 21:39:28 UTC (rev 206049)
</span><span class="lines">@@ -92,7 +92,7 @@
</span><span class="cx">         invalidateRegions();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderFlowThread::removeFlowChildInfo(RenderObject* child)
</del><ins>+void RenderFlowThread::removeFlowChildInfo(RenderElement* child)
</ins><span class="cx"> {
</span><span class="cx">     if (is&lt;RenderBlockFlow&gt;(*child))
</span><span class="cx">         removeLineRegionInfo(downcast&lt;RenderBlockFlow&gt;(child));
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderFlowThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderFlowThread.h (206048 => 206049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderFlowThread.h        2016-09-16 21:20:23 UTC (rev 206048)
+++ trunk/Source/WebCore/rendering/RenderFlowThread.h        2016-09-16 21:39:28 UTC (rev 206049)
</span><span class="lines">@@ -60,7 +60,7 @@
</span><span class="cx"> public:
</span><span class="cx">     virtual ~RenderFlowThread() { }
</span><span class="cx"> 
</span><del>-    virtual void removeFlowChildInfo(RenderObject*);
</del><ins>+    virtual void removeFlowChildInfo(RenderElement*);
</ins><span class="cx"> #ifndef NDEBUG
</span><span class="cx">     bool hasChildInfo(RenderObject* child) const { return is&lt;RenderBox&gt;(child) &amp;&amp; m_regionRangeMap.contains(downcast&lt;RenderBox&gt;(child)); }
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderNamedFlowFragmentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderNamedFlowFragment.cpp (206048 => 206049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderNamedFlowFragment.cpp        2016-09-16 21:20:23 UTC (rev 206048)
+++ trunk/Source/WebCore/rendering/RenderNamedFlowFragment.cpp        2016-09-16 21:39:28 UTC (rev 206049)
</span><span class="lines">@@ -359,62 +359,56 @@
</span><span class="cx"> 
</span><span class="cx"> void RenderNamedFlowFragment::computeChildrenStyleInRegion(RenderElement&amp; renderer)
</span><span class="cx"> {
</span><del>-    for (auto&amp; child : childrenOfType&lt;RenderObject&gt;(renderer)) {
</del><ins>+    for (auto&amp; child : childrenOfType&lt;RenderElement&gt;(renderer)) {
+        auto it = m_rendererRegionStyle.find(&amp;child);
</ins><span class="cx"> 
</span><del>-        auto it = m_renderObjectRegionStyle.find(&amp;child);
-
</del><span class="cx">         std::unique_ptr&lt;RenderStyle&gt; childStyleInRegion;
</span><span class="cx">         bool objectRegionStyleCached = false;
</span><del>-        if (it != m_renderObjectRegionStyle.end()) {
</del><ins>+        if (it != m_rendererRegionStyle.end()) {
</ins><span class="cx">             childStyleInRegion = RenderStyle::clonePtr(*it-&gt;value.style);
</span><span class="cx">             objectRegionStyleCached = true;
</span><span class="cx">         } else {
</span><span class="cx">             if (child.isAnonymous() || child.isInFlowRenderFlowThread())
</span><span class="cx">                 childStyleInRegion =  std::make_unique&lt;RenderStyle&gt;(RenderStyle::createAnonymousStyleWithDisplay(renderer.style(), child.style().display()));
</span><del>-            else if (is&lt;RenderText&gt;(child))
-                childStyleInRegion = RenderStyle::clonePtr(renderer.style());
</del><span class="cx">             else
</span><del>-                childStyleInRegion = computeStyleInRegion(downcast&lt;RenderElement&gt;(child), renderer.style());
</del><ins>+                childStyleInRegion = computeStyleInRegion(child, renderer.style());
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        setObjectStyleInRegion(&amp;child, WTFMove(childStyleInRegion), objectRegionStyleCached);
-
-        if (is&lt;RenderElement&gt;(child))
-            computeChildrenStyleInRegion(downcast&lt;RenderElement&gt;(child));
</del><ins>+        setRendererStyleInRegion(child, WTFMove(childStyleInRegion), objectRegionStyleCached);
+        computeChildrenStyleInRegion(child);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderNamedFlowFragment::setObjectStyleInRegion(RenderObject* object, std::unique_ptr&lt;RenderStyle&gt; styleInRegion, bool objectRegionStyleCached)
</del><ins>+void RenderNamedFlowFragment::setRendererStyleInRegion(RenderElement&amp; renderer, std::unique_ptr&lt;RenderStyle&gt; styleInRegion, bool objectRegionStyleCached)
</ins><span class="cx"> {
</span><del>-    ASSERT(object-&gt;flowThreadContainingBlock());
</del><ins>+    ASSERT(renderer.flowThreadContainingBlock());
</ins><span class="cx"> 
</span><del>-    std::unique_ptr&lt;RenderStyle&gt; objectOriginalStyle = RenderStyle::clonePtr(object-&gt;style());
-    if (is&lt;RenderElement&gt;(*object))
-        downcast&lt;RenderElement&gt;(*object).setStyleInternal(WTFMove(*styleInRegion));
</del><ins>+    std::unique_ptr&lt;RenderStyle&gt; objectOriginalStyle = RenderStyle::clonePtr(renderer.style());
+    renderer.setStyleInternal(WTFMove(*styleInRegion));
</ins><span class="cx"> 
</span><del>-    if (is&lt;RenderBoxModelObject&gt;(*object) &amp;&amp; !object-&gt;hasVisibleBoxDecorations()) {
-        bool hasVisibleBoxDecorations = is&lt;RenderTableCell&gt;(*object)
-        || object-&gt;style().hasBackground()
-        || object-&gt;style().hasVisibleBorder()
-        || object-&gt;style().hasAppearance()
-        || object-&gt;style().boxShadow();
-        object-&gt;setHasVisibleBoxDecorations(hasVisibleBoxDecorations);
</del><ins>+    if (is&lt;RenderBoxModelObject&gt;(renderer) &amp;&amp; !renderer.hasVisibleBoxDecorations()) {
+        bool hasVisibleBoxDecorations = is&lt;RenderTableCell&gt;(renderer)
+        || renderer.style().hasBackground()
+        || renderer.style().hasVisibleBorder()
+        || renderer.style().hasAppearance()
+        || renderer.style().boxShadow();
+        renderer.setHasVisibleBoxDecorations(hasVisibleBoxDecorations);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ObjectRegionStyleInfo styleInfo;
</span><span class="cx">     styleInfo.style = WTFMove(objectOriginalStyle);
</span><span class="cx">     styleInfo.cached = objectRegionStyleCached;
</span><del>-    m_renderObjectRegionStyle.set(object, WTFMove(styleInfo));
</del><ins>+    m_rendererRegionStyle.set(&amp;renderer, WTFMove(styleInfo));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderNamedFlowFragment::clearObjectStyleInRegion(const RenderObject* object)
</del><ins>+void RenderNamedFlowFragment::clearObjectStyleInRegion(const RenderElement* object)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(object);
</span><del>-    m_renderObjectRegionStyle.remove(object);
</del><ins>+    m_rendererRegionStyle.remove(object);
</ins><span class="cx"> 
</span><span class="cx">     // Clear the style for the children of this object.
</span><del>-    for (RenderObject* child = object-&gt;firstChildSlow(); child; child = child-&gt;nextSibling())
-        clearObjectStyleInRegion(child);
</del><ins>+    for (auto&amp; child : childrenOfType&lt;RenderElement&gt;(*object))
+        clearObjectStyleInRegion(&amp;child);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderNamedFlowFragment::setRegionObjectsRegionStyle()
</span><span class="lines">@@ -431,27 +425,27 @@
</span><span class="cx">         // The list of content nodes contains also the nodes with display:none.
</span><span class="cx">         if (!element-&gt;renderer())
</span><span class="cx">             continue;
</span><ins>+        auto&amp; renderer = *element-&gt;renderer();
</ins><span class="cx"> 
</span><del>-        RenderElement* object = element-&gt;renderer();
</del><span class="cx">         // If the content node does not flow any of its children in this region,
</span><span class="cx">         // we do not compute any style for them in this region.
</span><del>-        if (!flowThread()-&gt;objectInFlowRegion(object, this))
</del><ins>+        if (!flowThread()-&gt;objectInFlowRegion(&amp;renderer, this))
</ins><span class="cx">             continue;
</span><span class="cx"> 
</span><span class="cx">         // If the object has style in region, use that instead of computing a new one.
</span><del>-        auto it = m_renderObjectRegionStyle.find(object);
</del><ins>+        auto it = m_rendererRegionStyle.find(&amp;renderer);
</ins><span class="cx">         std::unique_ptr&lt;RenderStyle&gt; objectStyleInRegion;
</span><span class="cx">         bool objectRegionStyleCached = false;
</span><del>-        if (it != m_renderObjectRegionStyle.end()) {
</del><ins>+        if (it != m_rendererRegionStyle.end()) {
</ins><span class="cx">             objectStyleInRegion = RenderStyle::clonePtr(*it-&gt;value.style);
</span><span class="cx">             ASSERT(it-&gt;value.cached);
</span><span class="cx">             objectRegionStyleCached = true;
</span><span class="cx">         } else
</span><del>-            objectStyleInRegion = computeStyleInRegion(*object, style());
</del><ins>+            objectStyleInRegion = computeStyleInRegion(renderer, style());
</ins><span class="cx"> 
</span><del>-        setObjectStyleInRegion(object, WTFMove(objectStyleInRegion), objectRegionStyleCached);
</del><ins>+        setRendererStyleInRegion(renderer, WTFMove(objectStyleInRegion), objectRegionStyleCached);
</ins><span class="cx"> 
</span><del>-        computeChildrenStyleInRegion(*object);
</del><ins>+        computeChildrenStyleInRegion(renderer);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -460,9 +454,9 @@
</span><span class="cx">     if (!hasCustomRegionStyle())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    RenderObjectRegionStyleMap temp;
-    for (auto&amp; objectPair : m_renderObjectRegionStyle) {
-        RenderObject* object = const_cast&lt;RenderObject*&gt;(objectPair.key);
</del><ins>+    RendererRegionStyleMap temp;
+    for (auto&amp; objectPair : m_rendererRegionStyle) {
+        auto* object = const_cast&lt;RenderElement*&gt;(objectPair.key);
</ins><span class="cx">         std::unique_ptr&lt;RenderStyle&gt; objectRegionStyle = RenderStyle::clonePtr(object-&gt;style());
</span><span class="cx">         std::unique_ptr&lt;RenderStyle&gt; objectOriginalStyle = RenderStyle::clonePtr(*objectPair.value.style);
</span><span class="cx"> 
</span><span class="lines">@@ -480,11 +474,10 @@
</span><span class="cx">             styleInfo.cached = true;
</span><span class="cx">             temp.set(object, WTFMove(styleInfo));
</span><span class="cx">         }
</span><del>-        if (is&lt;RenderElement&gt;(*object))
-            downcast&lt;RenderElement&gt;(*object).setStyleInternal(WTFMove(*objectOriginalStyle));
</del><ins>+        object-&gt;setStyleInternal(WTFMove(*objectOriginalStyle));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_renderObjectRegionStyle.swap(temp);
</del><ins>+    m_rendererRegionStyle.swap(temp);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> RenderNamedFlowThread* RenderNamedFlowFragment::namedFlowThread() const
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderNamedFlowFragmenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderNamedFlowFragment.h (206048 => 206049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderNamedFlowFragment.h        2016-09-16 21:20:23 UTC (rev 206048)
+++ trunk/Source/WebCore/rendering/RenderNamedFlowFragment.h        2016-09-16 21:39:28 UTC (rev 206049)
</span><span class="lines">@@ -79,7 +79,7 @@
</span><span class="cx">     RenderLayerModelObject&amp; layerOwner() const { return downcast&lt;RenderLayerModelObject&gt;(*parent()); }
</span><span class="cx"> 
</span><span class="cx">     bool hasCustomRegionStyle() const { return m_hasCustomRegionStyle; }
</span><del>-    void clearObjectStyleInRegion(const RenderObject*);
</del><ins>+    void clearObjectStyleInRegion(const RenderElement*);
</ins><span class="cx"> 
</span><span class="cx">     void setRegionObjectsRegionStyle();
</span><span class="cx">     void restoreRegionObjectsOriginalStyle();
</span><span class="lines">@@ -125,7 +125,7 @@
</span><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;RenderStyle&gt; computeStyleInRegion(RenderElement&amp;, const RenderStyle&amp; parentStyle) const;
</span><span class="cx">     void computeChildrenStyleInRegion(RenderElement&amp;);
</span><del>-    void setObjectStyleInRegion(RenderObject*, std::unique_ptr&lt;RenderStyle&gt;, bool objectRegionStyleCached);
</del><ins>+    void setRendererStyleInRegion(RenderElement&amp;, std::unique_ptr&lt;RenderStyle&gt;, bool objectRegionStyleCached);
</ins><span class="cx"> 
</span><span class="cx">     void checkRegionStyle();
</span><span class="cx">     void setHasCustomRegionStyle(bool hasCustomRegionStyle) { m_hasCustomRegionStyle = hasCustomRegionStyle; }
</span><span class="lines">@@ -153,8 +153,8 @@
</span><span class="cx">         bool cached;
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    typedef HashMap&lt;const RenderObject*, ObjectRegionStyleInfo &gt; RenderObjectRegionStyleMap;
-    RenderObjectRegionStyleMap m_renderObjectRegionStyle;
</del><ins>+    using RendererRegionStyleMap = HashMap&lt;const RenderElement*, ObjectRegionStyleInfo&gt;;
+    RendererRegionStyleMap m_rendererRegionStyle;
</ins><span class="cx"> 
</span><span class="cx">     bool m_hasCustomRegionStyle : 1;
</span><span class="cx">     bool m_hasAutoLogicalHeight : 1;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderNamedFlowThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp (206048 => 206049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp        2016-09-16 21:20:23 UTC (rev 206048)
+++ trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp        2016-09-16 21:39:28 UTC (rev 206049)
</span><span class="lines">@@ -812,7 +812,7 @@
</span><span class="cx">     m_hasRegionsWithStyling = hasRegionsWithStyling;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderNamedFlowThread::clearRenderObjectCustomStyle(const RenderObject* object)
</del><ins>+void RenderNamedFlowThread::clearRenderObjectCustomStyle(const RenderElement* object)
</ins><span class="cx"> {
</span><span class="cx">     // Clear the styles for the object in the regions.
</span><span class="cx">     // FIXME: Region styling is not computed only for the region range of the object so this is why we need to walk the whole chain.
</span><span class="lines">@@ -820,7 +820,7 @@
</span><span class="cx">         downcast&lt;RenderNamedFlowFragment&gt;(*region).clearObjectStyleInRegion(object);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderNamedFlowThread::removeFlowChildInfo(RenderObject* child)
</del><ins>+void RenderNamedFlowThread::removeFlowChildInfo(RenderElement* child)
</ins><span class="cx"> {
</span><span class="cx">     RenderFlowThread::removeFlowChildInfo(child);
</span><span class="cx">     clearRenderObjectCustomStyle(child);
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderNamedFlowThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderNamedFlowThread.h (206048 => 206049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderNamedFlowThread.h        2016-09-16 21:20:23 UTC (rev 206048)
+++ trunk/Source/WebCore/rendering/RenderNamedFlowThread.h        2016-09-16 21:39:28 UTC (rev 206049)
</span><span class="lines">@@ -91,9 +91,9 @@
</span><span class="cx">     bool hasRegionsWithStyling() const { return m_hasRegionsWithStyling; }
</span><span class="cx">     void checkRegionsWithStyling();
</span><span class="cx"> 
</span><del>-    void clearRenderObjectCustomStyle(const RenderObject*);
</del><ins>+    void clearRenderObjectCustomStyle(const RenderElement*);
</ins><span class="cx"> 
</span><del>-    void removeFlowChildInfo(RenderObject*) override;
</del><ins>+    void removeFlowChildInfo(RenderElement*) override;
</ins><span class="cx"> 
</span><span class="cx">     LayoutUnit flowContentBottom() const { return m_flowContentBottom; }
</span><span class="cx">     void dispatchNamedFlowEvents();
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (206048 => 206049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderObject.cpp        2016-09-16 21:20:23 UTC (rev 206048)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp        2016-09-16 21:39:28 UTC (rev 206049)
</span><span class="lines">@@ -1426,79 +1426,12 @@
</span><span class="cx"> {
</span><span class="cx">     // FIXME: We should ASSERT(isRooted()) but we have some out-of-order removals which would need to be fixed first.
</span><span class="cx"> 
</span><del>-    removeFromRenderFlowThread();
</del><ins>+    setFlowThreadState(NotInsideFlowThread);
</ins><span class="cx"> 
</span><span class="cx">     // Update cached boundaries in SVG renderers, if a child is removed.
</span><span class="cx">     parent()-&gt;setNeedsBoundariesUpdate();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderObject::removeFromRenderFlowThread()
-{
-    if (flowThreadState() == NotInsideFlowThread)
-        return;
-
-    // Sometimes we remove the element from the flow, but it's not destroyed at that time.
-    // It's only until later when we actually destroy it and remove all the children from it.
-    // Currently, that happens for firstLetter elements and list markers.
-    // Pass in the flow thread so that we don't have to look it up for all the children.
-    removeFromRenderFlowThreadIncludingDescendants(true);
-}
-
-void RenderObject::removeFromRenderFlowThreadIncludingDescendants(bool shouldUpdateState)
-{
-    // Once we reach another flow thread we don't need to update the flow thread state
-    // but we have to continue cleanup the flow thread info.
-    if (isRenderFlowThread())
-        shouldUpdateState = false;
-
-    if (is&lt;RenderElement&gt;(*this)) {
-        for (auto&amp; child : childrenOfType&lt;RenderObject&gt;(downcast&lt;RenderElement&gt;(*this)))
-            child.removeFromRenderFlowThreadIncludingDescendants(shouldUpdateState);
-    }
-
-    // We have to ask for our containing flow thread as it may be above the removed sub-tree.
-    RenderFlowThread* flowThreadContainingBlock = this-&gt;flowThreadContainingBlock();
-    while (flowThreadContainingBlock) {
-        flowThreadContainingBlock-&gt;removeFlowChildInfo(this);
-        if (flowThreadContainingBlock-&gt;flowThreadState() == NotInsideFlowThread)
-            break;
-        RenderObject* parent = flowThreadContainingBlock-&gt;parent();
-        if (!parent)
-            break;
-        flowThreadContainingBlock = parent-&gt;flowThreadContainingBlock();
-    }
-    if (is&lt;RenderBlock&gt;(*this))
-        downcast&lt;RenderBlock&gt;(*this).setCachedFlowThreadContainingBlockNeedsUpdate();
-
-    if (shouldUpdateState)
-        setFlowThreadState(NotInsideFlowThread);
-}
-
-void RenderObject::invalidateFlowThreadContainingBlockIncludingDescendants(RenderFlowThread* flowThread)
-{
-    if (flowThreadState() == NotInsideFlowThread)
-        return;
-
-    if (is&lt;RenderBlock&gt;(*this)) {
-        RenderBlock&amp; block = downcast&lt;RenderBlock&gt;(*this);
-
-        if (block.cachedFlowThreadContainingBlockNeedsUpdate())
-            return;
-
-        flowThread = block.cachedFlowThreadContainingBlock();
-        block.setCachedFlowThreadContainingBlockNeedsUpdate();
-    }
-
-    if (flowThread)
-        flowThread-&gt;removeFlowChildInfo(this);
-
-    if (!is&lt;RenderElement&gt;(*this))
-        return;
-
-    for (auto&amp; child : childrenOfType&lt;RenderObject&gt;(downcast&lt;RenderElement&gt;(*this)))
-        child.invalidateFlowThreadContainingBlockIncludingDescendants(flowThread);
-}
-
</del><span class="cx"> void RenderObject::destroyAndCleanupAnonymousWrappers()
</span><span class="cx"> {
</span><span class="cx">     // If the tree is destroyed, there is no need for a clean-up phase.
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderObject.h (206048 => 206049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderObject.h        2016-09-16 21:20:23 UTC (rev 206048)
+++ trunk/Source/WebCore/rendering/RenderObject.h        2016-09-16 21:39:28 UTC (rev 206049)
</span><span class="lines">@@ -816,7 +816,6 @@
</span><span class="cx">     void setNeedsSimplifiedNormalFlowLayoutBit(bool b) { m_bitfields.setNeedsSimplifiedNormalFlowLayout(b); }
</span><span class="cx"> 
</span><span class="cx">     virtual RenderFlowThread* locateFlowThreadContainingBlock() const;
</span><del>-    void invalidateFlowThreadContainingBlockIncludingDescendants(RenderFlowThread* = nullptr);
</del><span class="cx">     static void calculateBorderStyleColor(const EBorderStyle&amp;, const BoxSide&amp;, Color&amp;);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="lines">@@ -829,8 +828,6 @@
</span><span class="cx">     void setLayerNeedsFullRepaint();
</span><span class="cx">     void setLayerNeedsFullRepaintForPositionedMovementLayout();
</span><span class="cx"> 
</span><del>-    void removeFromRenderFlowThread();
-    void removeFromRenderFlowThreadIncludingDescendants(bool);
</del><span class="cx">     Node* generatingPseudoHostElement() const;
</span><span class="cx"> 
</span><span class="cx">     void propagateRepaintToParentWithOutlineAutoIfNeeded(const RenderLayerModelObject&amp; repaintContainer, const LayoutRect&amp; repaintRect) const;
</span></span></pre>
</div>
</div>

</body>
</html>