Changeset 126304 in webkit
- Timestamp:
- Aug 22, 2012, 8:34:57 AM (13 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r126301 r126304 1 2012-08-22 Raul Hudea <rhudea@adobe.com> 2 3 Crash in WebCore::RenderBlock::removeChild 4 https://bugs.webkit.org/show_bug.cgi?id=93879 5 6 Reviewed by Abhishek Arya. 7 8 Test the region-flow_thread sibling case 9 10 * fast/regions/remove-flow-thread-crash-expected.txt: Added. 11 * fast/regions/remove-flow-thread-crash.html: Added. 12 1 13 2012-08-22 Sheriff Bot <webkit.review.bot@gmail.com> 2 14 -
trunk/Source/WebCore/CMakeLists.txt
r126258 r126304 2028 2028 rendering/RenderGrid.cpp 2029 2029 rendering/RenderFlowThread.cpp 2030 rendering/RenderFlowThreadContainer.cpp 2030 2031 rendering/RenderFrame.cpp 2031 2032 rendering/RenderFrameBase.cpp -
trunk/Source/WebCore/ChangeLog
r126303 r126304 1 2012-08-22 Raul Hudea <rhudea@adobe.com> 2 3 Crash in WebCore::RenderBlock::removeChild 4 https://bugs.webkit.org/show_bug.cgi?id=93879 5 6 Reviewed by Abhishek Arya. 7 8 By adding the lifetime state to the RenderNamedFlowThread (r122556), it become possible for the a RenderRegion object to delete its sibling, 9 the RenderNamedFlowThread. This is unexpected in the rendering world and cause problems in RenderBlock::removeChild where we retain previous 10 and next sibling pointers. 11 So, all the RenderNamedFlowThread are created under a RenderFlowThreadContainer object insted of the RenderView. The new object is created only 12 when the first named flow is created. 13 14 Test: fast/regions/remove-flow-thread-crash.html 15 16 * CMakeLists.txt: 17 * GNUmakefile.list.am: 18 * Target.pri: 19 * WebCore.gypi: 20 * WebCore.vcproj/WebCore.vcproj: 21 * WebCore.xcodeproj/project.pbxproj: 22 * rendering/FlowThreadController.cpp: 23 (WebCore::FlowThreadController::FlowThreadController): Added initialization for the new RenderFlowThreadContainer member 24 (WebCore::FlowThreadController::ensureRenderFlowThreadWithName): Added the creation of the RenderFlowThreadContainer object and use it as a parent for all RenderNamedFlowThreads 25 (WebCore::FlowThreadController::styleDidChange): Inform all the RenderNamedFlowThreads that the style changed in regions (initially this code was in RenderView, but now all RenderNamedFlowThreads are children of RenderFlowThreadContainer) 26 (WebCore): 27 * rendering/FlowThreadController.h: 28 (WebCore): 29 (FlowThreadController): 30 * rendering/RenderFlowThreadContainer.cpp: Added. 31 (WebCore): 32 (WebCore::RenderFlowThreadContainer::RenderFlowThreadContainer): 33 (WebCore::RenderFlowThreadContainer::layout): 34 * rendering/RenderFlowThreadContainer.h: Added. 35 * rendering/RenderObject.cpp: 36 (WebCore::RenderObject::markContainingBlocksForLayout): Skip to RenderView if the current object is an RenderFlowThreadContainer. 37 * rendering/RenderObject.h: 38 (WebCore::RenderObject::isRenderFlowThreadContainer): 39 * rendering/RenderView.cpp: 40 (WebCore::RenderView::styleDidChange): Moved the code associated to RenderNamedFlowThreads to FlowThreadController:styleDidChange and call it instead. 41 1 42 2012-08-22 Rob Buis <rbuis@rim.com> 2 43 -
trunk/Source/WebCore/GNUmakefile.list.am
r126258 r126304 4870 4870 Source/WebCore/rendering/RenderFlowThread.cpp \ 4871 4871 Source/WebCore/rendering/RenderFlowThread.h \ 4872 Source/WebCore/rendering/RenderFlowThreadContainer.cpp \ 4873 Source/WebCore/rendering/RenderFlowThreadContainer.h \ 4872 4874 Source/WebCore/rendering/RenderFrameBase.cpp \ 4873 4875 Source/WebCore/rendering/RenderFrameBase.h \ -
trunk/Source/WebCore/Target.pri
r126291 r126304 1119 1119 rendering/RenderFlexibleBox.cpp \ 1120 1120 rendering/RenderFlowThread.cpp \ 1121 rendering/RenderFlowThreadContainer.cpp \ 1121 1122 rendering/RenderFrame.cpp \ 1122 1123 rendering/RenderFrameBase.cpp \ -
trunk/Source/WebCore/WebCore.gypi
r126300 r126304 557 557 'rendering/RenderEmbeddedObject.h', 558 558 'rendering/RenderFlowThread.h', 559 'rendering/RenderFlowThreadContainer.h', 559 560 'rendering/RenderImage.h', 560 561 'rendering/RenderImageResource.h', … … 4713 4714 'rendering/RenderFlowThread.cpp', 4714 4715 'rendering/RenderFlowThread.h', 4716 'rendering/RenderFlowThreadContainer.cpp', 4717 'rendering/RenderFlowThreadContainer.h', 4715 4718 'rendering/RenderFrame.cpp', 4716 4719 'rendering/RenderFrame.h', -
trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj
r126258 r126304 39696 39696 </File> 39697 39697 <File 39698 RelativePath="..\rendering\RenderFlowThreadContainer.cpp" 39699 > 39700 </File> 39701 <File 39702 RelativePath="..\rendering\RenderFlowThreadContainer.h" 39703 > 39704 </File> 39705 <File 39698 39706 RelativePath="..\rendering\svg\RenderForeignObject.cpp" 39699 39707 > -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r126258 r126304 1701 1701 5DFE8F570D16477C0076E937 /* ScheduledAction.h in Headers */ = {isa = PBXBuildFile; fileRef = BCA378BB0D15F64200B793D6 /* ScheduledAction.h */; }; 1702 1702 5FC7DC26CFE2563200B85AE4 /* JSEventTarget.h in Headers */ = {isa = PBXBuildFile; fileRef = 5FC7DC26CFE2563200B85AE5 /* JSEventTarget.h */; }; 1703 603EA36015DD1D7000E150E6 /* RenderFlowThreadContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 603EA35E15DD1D7000E150E6 /* RenderFlowThreadContainer.cpp */; }; 1704 603EA36115DD1D7000E150E6 /* RenderFlowThreadContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 603EA35F15DD1D7000E150E6 /* RenderFlowThreadContainer.h */; }; 1703 1705 626CDE0E1140424C001E5A68 /* SpatialNavigation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 626CDE0C1140424C001E5A68 /* SpatialNavigation.cpp */; }; 1704 1706 626CDE0F1140424C001E5A68 /* SpatialNavigation.h in Headers */ = {isa = PBXBuildFile; fileRef = 626CDE0D1140424C001E5A68 /* SpatialNavigation.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 8845 8847 5DC87EEF11716DF2001C0E6D /* EmptyProtocolDefinitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EmptyProtocolDefinitions.h; sourceTree = "<group>"; }; 8846 8848 5FC7DC26CFE2563200B85AE5 /* JSEventTarget.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JSEventTarget.h; sourceTree = "<group>"; }; 8849 603EA35E15DD1D7000E150E6 /* RenderFlowThreadContainer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderFlowThreadContainer.cpp; sourceTree = "<group>"; }; 8850 603EA35F15DD1D7000E150E6 /* RenderFlowThreadContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderFlowThreadContainer.h; sourceTree = "<group>"; }; 8847 8851 626CDE0C1140424C001E5A68 /* SpatialNavigation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpatialNavigation.cpp; sourceTree = "<group>"; }; 8848 8852 626CDE0D1140424C001E5A68 /* SpatialNavigation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpatialNavigation.h; sourceTree = "<group>"; }; … … 21303 21307 508CCA4E13CF106B003151F3 /* RenderFlowThread.cpp */, 21304 21308 508CCA4D13CF106B003151F3 /* RenderFlowThread.h */, 21309 603EA35E15DD1D7000E150E6 /* RenderFlowThreadContainer.cpp */, 21310 603EA35F15DD1D7000E150E6 /* RenderFlowThreadContainer.h */, 21305 21311 A871DECC0A1530C700B12A68 /* RenderFrame.cpp */, 21306 21312 A871DECB0A1530C700B12A68 /* RenderFrame.h */, … … 24562 24568 53C8298E13D8D92700DE2DEB /* RenderFlexibleBox.h in Headers */, 24563 24569 508CCA4F13CF106B003151F3 /* RenderFlowThread.h in Headers */, 24570 603EA36115DD1D7000E150E6 /* RenderFlowThreadContainer.h in Headers */, 24564 24571 A871DED30A1530C700B12A68 /* RenderFrame.h in Headers */, 24565 24572 0FD3080F117CF7E700A791F7 /* RenderFrameBase.h in Headers */, … … 27798 27805 53C8298D13D8D92700DE2DEB /* RenderFlexibleBox.cpp in Sources */, 27799 27806 508CCA5013CF106B003151F3 /* RenderFlowThread.cpp in Sources */, 27807 603EA36015DD1D7000E150E6 /* RenderFlowThreadContainer.cpp in Sources */, 27800 27808 A871DED40A1530C700B12A68 /* RenderFrame.cpp in Sources */, 27801 27809 0FD3080E117CF7E700A791F7 /* RenderFrameBase.cpp in Sources */, -
trunk/Source/WebCore/rendering/FlowThreadController.cpp
r122556 r126304 33 33 34 34 #include "RenderFlowThread.h" 35 #include "RenderFlowThreadContainer.h" 35 36 #include "RenderNamedFlowThread.h" 36 37 #include "WebKitNamedFlow.h" … … 48 49 : m_view(view) 49 50 , m_currentRenderFlowThread(0) 51 , m_flowThreadContainer(0) 50 52 , m_isRenderNamedFlowThreadOrderDirty(false) 51 53 { … … 58 60 RenderNamedFlowThread* FlowThreadController::ensureRenderFlowThreadWithName(const AtomicString& name) 59 61 { 62 if (!m_flowThreadContainer) { 63 m_flowThreadContainer = new (m_view->renderArena()) RenderFlowThreadContainer(m_view->document()); 64 m_flowThreadContainer->setStyle(RenderFlowThread::createFlowThreadStyle(m_view->style())); 65 m_view->addChild(m_flowThreadContainer); 66 } 60 67 if (!m_renderNamedFlowThreadList) 61 68 m_renderNamedFlowThreadList = adoptPtr(new RenderNamedFlowThreadList()); … … 77 84 m_renderNamedFlowThreadList->add(flowRenderer); 78 85 79 // Keep the flow renderer as a child of Render View.80 m_ view->addChild(flowRenderer);86 // Keep the flow renderer as a child of RenderFlowThreadContainer. 87 m_flowThreadContainer->addChild(flowRenderer); 81 88 82 89 setIsRenderNamedFlowThreadOrderDirty(true); 83 90 84 91 return flowRenderer; 92 } 93 94 void FlowThreadController::styleDidChange() 95 { 96 RenderStyle* viewStyle = m_view->style(); 97 for (RenderNamedFlowThreadList::iterator iter = m_renderNamedFlowThreadList->begin(); iter != m_renderNamedFlowThreadList->end(); ++iter) { 98 RenderNamedFlowThread* flowRenderer = *iter; 99 flowRenderer->setStyle(RenderFlowThread::createFlowThreadStyle(viewStyle)); 100 } 85 101 } 86 102 -
trunk/Source/WebCore/rendering/FlowThreadController.h
r122556 r126304 38 38 39 39 class RenderFlowThread; 40 class RenderFlowThreadContainer; 40 41 class RenderNamedFlowThread; 41 42 … … 62 63 bool hasRenderNamedFlowThreads() const { return m_renderNamedFlowThreadList && !m_renderNamedFlowThreadList->isEmpty(); } 63 64 void layoutRenderNamedFlowThreads(); 65 void styleDidChange(); 64 66 65 67 void registerNamedFlowContentNode(Node*, RenderNamedFlowThread*); 66 68 void unregisterNamedFlowContentNode(Node*); 67 68 69 void removeFlowThread(RenderNamedFlowThread*); 69 70 … … 74 75 RenderView* m_view; 75 76 RenderFlowThread* m_currentRenderFlowThread; 77 RenderFlowThreadContainer* m_flowThreadContainer; 76 78 bool m_isRenderNamedFlowThreadOrderDirty; 77 79 OwnPtr<RenderNamedFlowThreadList> m_renderNamedFlowThreadList; -
trunk/Source/WebCore/rendering/RenderObject.cpp
r126074 r126304 641 641 return; 642 642 if (!last->isText() && last->style()->isOutOfFlowPositioned()) { 643 bool willSkipRelativelyPositionedInlines = !object->isRenderBlock() || object->isAnonymousBlock() ;644 // Skip relatively positioned inlines and anonymous blocks to get to the enclosing RenderBlock.645 while (object && (!object->isRenderBlock() || object->isAnonymousBlock() ))643 bool willSkipRelativelyPositionedInlines = !object->isRenderBlock() || object->isAnonymousBlock() || object->isRenderFlowThreadContainer(); 644 // Skip relatively positioned inlines and anonymous blocks (and the flow threads container) to get to the enclosing RenderBlock. 645 while (object && (!object->isRenderBlock() || object->isAnonymousBlock() || object->isRenderFlowThreadContainer())) 646 646 object = object->container(); 647 647 if (!object || object->posChildNeedsLayout()) -
trunk/Source/WebCore/rendering/RenderObject.h
r126074 r126304 370 370 371 371 virtual bool isRenderFlowThread() const { return false; } 372 virtual bool isRenderFlowThreadContainer() const { return false; } 372 373 virtual bool isRenderNamedFlowThread() const { return false; } 373 374 -
trunk/Source/WebCore/rendering/RenderView.cpp
r125351 r126304 929 929 { 930 930 RenderBlock::styleDidChange(diff, oldStyle); 931 932 for (RenderObject* renderer = firstChild(); renderer; renderer = renderer->nextSibling()) { 933 if (renderer->isRenderNamedFlowThread()) { 934 RenderNamedFlowThread* flowRenderer = toRenderNamedFlowThread(renderer); 935 flowRenderer->setStyle(RenderFlowThread::createFlowThreadStyle(style())); 936 } 937 } 931 if (hasRenderNamedFlowThreads()) 932 flowThreadController()->styleDidChange(); 938 933 } 939 934
Note:
See TracChangeset
for help on using the changeset viewer.