Title: [126459] trunk
Revision
126459
Author
[email protected]
Date
2012-08-23 11:45:47 -0700 (Thu, 23 Aug 2012)

Log Message

[CSSRegions]Crash when moving anonymous block children inside a named flow
https://bugs.webkit.org/show_bug.cgi?id=90865

Patch by Andrei Onea <[email protected]> on 2012-08-23
Reviewed by Abhishek Arya.

Source/WebCore:

When an anonymous block's children are detached in RenderBlock::collapseAnonymousBoxChild, the reference
to their enclosingRenderFlowThread is lost and causes a crash in RenderObject::willBeRemovedFromTree.
Because of this, we now maintain the enclosingRenderFlowThread during the whole lifetime of the
RenderBlock::collapseAnonymousBoxChild function, using a CurrentRenderFlowThreadMaintainer local.

Test: fast/regions/move-anonymous-block-inside-named-flow-crash.html

* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::collapseAnonymousBoxChild):
* rendering/RenderFlowThread.cpp:
(WebCore::CurrentRenderFlowThreadMaintainer::CurrentRenderFlowThreadMaintainer):
(WebCore):
(WebCore::CurrentRenderFlowThreadMaintainer::~CurrentRenderFlowThreadMaintainer):
Moved CurrentRenderFlowThreadMaintaner declaration from .cpp to .h, so that we can access it from
RenderBlock::collapseAnonymousBoxChild.
* rendering/RenderFlowThread.h:
(CurrentRenderFlowThreadMaintainer):
(WebCore):
* rendering/RenderObject.cpp:
(WebCore::RenderObject::willBeRemovedFromTree):

LayoutTests:

Added test for crash which happens when the children of an anonymous block
inside a flow thread are moved.

* fast/regions/move-anonymous-block-inside-named-flow-crash-expected.txt:
* fast/regions/move-anonymous-block-inside-named-flow-crash.html:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (126458 => 126459)


--- trunk/LayoutTests/ChangeLog	2012-08-23 18:43:55 UTC (rev 126458)
+++ trunk/LayoutTests/ChangeLog	2012-08-23 18:45:47 UTC (rev 126459)
@@ -1,3 +1,16 @@
+2012-08-23  Andrei Onea  <[email protected]>
+
+        [CSSRegions]Crash when moving anonymous block children inside a named flow
+        https://bugs.webkit.org/show_bug.cgi?id=90865
+
+        Reviewed by Abhishek Arya.
+
+        Added test for crash which happens when the children of an anonymous block
+        inside a flow thread are moved.
+
+        * fast/regions/move-anonymous-block-inside-named-flow-crash-expected.txt:
+        * fast/regions/move-anonymous-block-inside-named-flow-crash.html:
+
 2012-08-23  Li Yin  <[email protected]>
 
         Add test for decodeAudioData

Added: trunk/LayoutTests/fast/regions/move-anonymous-block-inside-named-flow-crash-expected.txt (0 => 126459)


--- trunk/LayoutTests/fast/regions/move-anonymous-block-inside-named-flow-crash-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/regions/move-anonymous-block-inside-named-flow-crash-expected.txt	2012-08-23 18:45:47 UTC (rev 126459)
@@ -0,0 +1,2 @@
+Bug 90865:[CSSRegions]Crash when moving anonymous block children inside a named flow. Test passes if it does not CRASH or ASSERT.
+

Added: trunk/LayoutTests/fast/regions/move-anonymous-block-inside-named-flow-crash.html (0 => 126459)


--- trunk/LayoutTests/fast/regions/move-anonymous-block-inside-named-flow-crash.html	                        (rev 0)
+++ trunk/LayoutTests/fast/regions/move-anonymous-block-inside-named-flow-crash.html	2012-08-23 18:45:47 UTC (rev 126459)
@@ -0,0 +1,27 @@
+<!doctype html>
+<html>
+<head>
+<style>
+.container { -webkit-column-count: 1; -webkit-flow-into: flow; }
+.columnSpan { -webkit-column-span: all; }
+.flow { -webkit-flow-from: flow; width: 100px; height: 100px; }
+</style>
+</head>
+<body>
+<div class="container">
+    <div id="test">
+        <div class="columnSpan"></div>
+    </div>
+</div>
+<script>
+    if (window.testRunner)
+        testRunner.dumpAsText();
+    var test = document.getElementById("test");
+    test.innerHTML = "Bug 90865:[CSSRegions]Crash when moving anonymous block children inside a named flow.\
+                      Test passes if it does not CRASH or ASSERT.";
+    var article = document.createElement("div");
+    article.setAttribute("class", "flow");
+    document.body.appendChild(article);
+</script>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (126458 => 126459)


--- trunk/Source/WebCore/ChangeLog	2012-08-23 18:43:55 UTC (rev 126458)
+++ trunk/Source/WebCore/ChangeLog	2012-08-23 18:45:47 UTC (rev 126459)
@@ -1,3 +1,32 @@
+2012-08-23  Andrei Onea  <[email protected]>
+
+        [CSSRegions]Crash when moving anonymous block children inside a named flow
+        https://bugs.webkit.org/show_bug.cgi?id=90865
+
+        Reviewed by Abhishek Arya.
+
+        When an anonymous block's children are detached in RenderBlock::collapseAnonymousBoxChild, the reference
+        to their enclosingRenderFlowThread is lost and causes a crash in RenderObject::willBeRemovedFromTree.
+        Because of this, we now maintain the enclosingRenderFlowThread during the whole lifetime of the
+        RenderBlock::collapseAnonymousBoxChild function, using a CurrentRenderFlowThreadMaintainer local.
+        
+
+        Test: fast/regions/move-anonymous-block-inside-named-flow-crash.html
+
+        * rendering/RenderBlock.cpp:
+        (WebCore::RenderBlock::collapseAnonymousBoxChild):
+        * rendering/RenderFlowThread.cpp:
+        (WebCore::CurrentRenderFlowThreadMaintainer::CurrentRenderFlowThreadMaintainer):
+        (WebCore):
+        (WebCore::CurrentRenderFlowThreadMaintainer::~CurrentRenderFlowThreadMaintainer):
+        Moved CurrentRenderFlowThreadMaintaner declaration from .cpp to .h, so that we can access it from
+        RenderBlock::collapseAnonymousBoxChild.
+        * rendering/RenderFlowThread.h:
+        (CurrentRenderFlowThreadMaintainer):
+        (WebCore):
+        * rendering/RenderObject.cpp:
+        (WebCore::RenderObject::willBeRemovedFromTree):
+
 2012-08-23  Kevin Ollivier  <[email protected]>
 
         [wx] Unreviewed build fix. Add wx to the list of platforms that use CoreText

Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (126458 => 126459)


--- trunk/Source/WebCore/rendering/RenderBlock.cpp	2012-08-23 18:43:55 UTC (rev 126458)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp	2012-08-23 18:45:47 UTC (rev 126459)
@@ -1143,6 +1143,8 @@
     RenderObject* nextSibling = child->nextSibling();
 
     RenderFlowThread* childFlowThread = child->enclosingRenderFlowThread();
+    CurrentRenderFlowThreadMaintainer flowThreadMaintainer(childFlowThread);
+    
     RenderBlock* anonBlock = toRenderBlock(parent->children()->removeChildNode(parent, child, child->hasLayer()));
     anonBlock->moveAllChildrenTo(parent, nextSibling, child->hasLayer());
     // Delete the now-empty block's lines and nuke it.

Modified: trunk/Source/WebCore/rendering/RenderFlowThread.cpp (126458 => 126459)


--- trunk/Source/WebCore/rendering/RenderFlowThread.cpp	2012-08-23 18:43:55 UTC (rev 126458)
+++ trunk/Source/WebCore/rendering/RenderFlowThread.cpp	2012-08-23 18:45:47 UTC (rev 126459)
@@ -107,26 +107,6 @@
     checkRegionsWithStyling();
 }
 
-class CurrentRenderFlowThreadMaintainer {
-    WTF_MAKE_NONCOPYABLE(CurrentRenderFlowThreadMaintainer);
-public:
-    CurrentRenderFlowThreadMaintainer(RenderFlowThread* renderFlowThread)
-        : m_renderFlowThread(renderFlowThread)
-    {
-        RenderView* view = m_renderFlowThread->view();
-        ASSERT(!view->flowThreadController()->currentRenderFlowThread());
-        view->flowThreadController()->setCurrentRenderFlowThread(m_renderFlowThread);
-    }
-    ~CurrentRenderFlowThreadMaintainer()
-    {
-        RenderView* view = m_renderFlowThread->view();
-        ASSERT(view->flowThreadController()->currentRenderFlowThread() == m_renderFlowThread);
-        view->flowThreadController()->setCurrentRenderFlowThread(0);
-    }
-private:
-    RenderFlowThread* m_renderFlowThread;
-};
-
 class CurrentRenderFlowThreadDisabler {
     WTF_MAKE_NONCOPYABLE(CurrentRenderFlowThreadDisabler);
 public:
@@ -793,4 +773,24 @@
     return false;
 }
 
+CurrentRenderFlowThreadMaintainer::CurrentRenderFlowThreadMaintainer(RenderFlowThread* renderFlowThread)
+        : m_renderFlowThread(renderFlowThread)
+{
+    if (!m_renderFlowThread)
+        return;
+    RenderView* view = m_renderFlowThread->view();
+    ASSERT(!view->flowThreadController()->currentRenderFlowThread());
+    view->flowThreadController()->setCurrentRenderFlowThread(m_renderFlowThread);
+}
+
+CurrentRenderFlowThreadMaintainer::~CurrentRenderFlowThreadMaintainer()
+{
+    if (!m_renderFlowThread)
+        return;
+    RenderView* view = m_renderFlowThread->view();
+    ASSERT(view->flowThreadController()->currentRenderFlowThread() == m_renderFlowThread);
+    view->flowThreadController()->setCurrentRenderFlowThread(0);
+}
+
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/rendering/RenderFlowThread.h (126458 => 126459)


--- trunk/Source/WebCore/rendering/RenderFlowThread.h	2012-08-23 18:43:55 UTC (rev 126458)
+++ trunk/Source/WebCore/rendering/RenderFlowThread.h	2012-08-23 18:45:47 UTC (rev 126459)
@@ -197,6 +197,15 @@
 // This will catch anyone doing an unnecessary cast.
 void toRenderFlowThread(const RenderFlowThread*);
 
+class CurrentRenderFlowThreadMaintainer {
+    WTF_MAKE_NONCOPYABLE(CurrentRenderFlowThreadMaintainer);
+public:
+    CurrentRenderFlowThreadMaintainer(RenderFlowThread*);
+    ~CurrentRenderFlowThreadMaintainer();
+private:
+    RenderFlowThread* m_renderFlowThread;
+};
+
 } // namespace WebCore
 
 #endif // RenderFlowThread_h

Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (126458 => 126459)


--- trunk/Source/WebCore/rendering/RenderObject.cpp	2012-08-23 18:43:55 UTC (rev 126458)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp	2012-08-23 18:45:47 UTC (rev 126459)
@@ -2435,9 +2435,8 @@
         parent()->dirtyLinesFromChangedChild(this);
 
     if (inRenderFlowThread()) {
-        if (isBox())
-            enclosingRenderFlowThread()->removeRenderBoxRegionInfo(toRenderBox(this));
-        enclosingRenderFlowThread()->clearRenderObjectCustomStyle(this);
+        ASSERT(enclosingRenderFlowThread());
+        enclosingRenderFlowThread()->removeFlowChildInfo(this);
     }
 
     if (RenderNamedFlowThread* containerFlowThread = parent()->enclosingRenderNamedFlowThread())
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to