Closed
Bug 553972
Opened 14 years ago
Closed 14 years ago
Firefox 3.7a3pre Crash Report [@ XUL@0x2b2b97 ]
Categories
(Core :: Layout: Tables, defect, P2)
Tracking
()
RESOLVED
FIXED
People
(Reporter: chofmann, Unassigned)
References
Details
(Keywords: crash, testcase)
Crash Data
Attachments
(8 files)
folks at University of Sao Paulo found reproducible crash/hang bug when trying to print or print preview a 621 Kbyte html document that is a report with with about 50 tables. Test case coming up when we can sanitize the page and remove any personally identifiable information. The stack trace looks like below and its reported to crash or ang both Mac and Linux . Untested so far on windows. http://crash-stats.mozilla.com/report/index/bp-2391203a-62b3-4267-b557-181b02100321 Frame Module Signature [Expand] Source 0 XUL XUL@0x2b2b97 1 XUL nsTableFrame::PushChildren layout/tables/nsTableFrame.cpp:1947 2 XUL nsTableFrame::ReflowChildren layout/tables/nsTableFrame.cpp:2827 3 XUL nsTableFrame::ReflowTable layout/tables/nsTableFrame.cpp:1889 4 XUL nsTableFrame::Reflow layout/tables/nsTableFrame.cpp:1793 5 XUL nsContainerFrame::ReflowChild layout/generic/nsContainerFrame.cpp:756 6 XUL nsTableOuterFrame::Reflow layout/tables/nsTableOuterFrame.cpp:1010 7 XUL nsBlockReflowContext::ReflowBlock layout/generic/nsBlockReflowContext.cpp:310 8 XUL nsBlockFrame::ReflowBlockFrame layout/generic/nsBlockFrame.cpp:3085 9 XUL nsBlockFrame::ReflowLine layout/generic/nsBlockFrame.cpp:2386 10 XUL nsBlockFrame::ReflowDirtyLines layout/generic/nsBlockFrame.cpp:1887 11 XUL nsBlockFrame::Reflow layout/generic/nsBlockFrame.cpp:995 12 XUL nsContainerFrame::ReflowChild layout/generic/nsContainerFrame.cpp:756 13 XUL nsTableCellFrame::Reflow layout/tables/nsTableCellFrame.cpp:912 14 XUL nsContainerFrame::ReflowChild layout/generic/nsContainerFrame.cpp:756 15 XUL nsTableRowFrame::ReflowChildren layout/tables/nsTableRowFrame.cpp:911 16 XUL nsTableRowFrame::Reflow layout/tables/nsTableRowFrame.cpp:1065 17 XUL nsContainerFrame::ReflowChild layout/generic/nsContainerFrame.cpp:756 18 XUL nsTableRowGroupFrame::ReflowChildren layout/tables/nsTableRowGroupFrame.cpp:420 19 XUL nsTableRowGroupFrame::Reflow layout/tables/nsTableRowGroupFrame.cpp:1320 20 XUL nsContainerFrame::ReflowChild layout/generic/nsContainerFrame.cpp:756 21 XUL nsTableFrame::ReflowChildren layout/tables/nsTableFrame.cpp:2738 22 XUL nsTableFrame::ReflowTable layout/tables/nsTableFrame.cpp:1889 23 XUL nsTableFrame::Reflow layout/tables/nsTableFrame.cpp:1793 24 XUL nsContainerFrame::ReflowChild layout/generic/nsContainerFrame.cpp:756 25 XUL nsTableOuterFrame::Reflow layout/tables/nsTableOuterFrame.cpp:1010 26 XUL nsBlockReflowContext::ReflowBlock layout/generic/nsBlockReflowContext.cpp:310 27 XUL nsBlockFrame::ReflowBlockFrame layout/generic/nsBlockFrame.cpp:3085 28 XUL nsBlockFrame::ReflowLine layout/generic/nsBlockFrame.cpp:2386 29 XUL nsBlockFrame::ReflowDirtyLines layout/generic/nsBlockFrame.cpp:1887 30 XUL nsBlockFrame::Reflow layout/generic/nsBlockFrame.cpp:995 31 XUL nsBlockReflowContext::ReflowBlock layout/generic/nsBlockReflowContext.cpp:310 32 XUL nsBlockFrame::ReflowBlockFrame layout/generic/nsBlockFrame.cpp:3085 33 XUL nsBlockFrame::ReflowLine layout/generic/nsBlockFrame.cpp:2386 34 XUL nsBlockFrame::ReflowDirtyLines layout/generic/nsBlockFrame.cpp:1887 35 XUL nsBlockFrame::Reflow layout/generic/nsBlockFrame.cpp:995 36 XUL nsBlockReflowContext::ReflowBlock layout/generic/nsBlockReflowContext.cpp:310 37 XUL nsBlockFrame::ReflowBlockFrame layout/generic/nsBlockFrame.cpp:3085 38 XUL nsBlockFrame::ReflowLine layout/generic/nsBlockFrame.cpp:2386 39 XUL nsBlockFrame::ReflowDirtyLines layout/generic/nsBlockFrame.cpp:1887 40 XUL nsBlockFrame::Reflow layout/generic/nsBlockFrame.cpp:995 41 XUL nsContainerFrame::ReflowChild layout/generic/nsContainerFrame.cpp:756 42 XUL nsTableCellFrame::Reflow layout/tables/nsTableCellFrame.cpp:912 43 XUL nsContainerFrame::ReflowChild layout/generic/nsContainerFrame.cpp:756 44 XUL nsTableRowFrame::ReflowChildren layout/tables/nsTableRowFrame.cpp:911 45 XUL nsTableRowFrame::Reflow layout/tables/nsTableRowFrame.cpp:1065 46 XUL nsContainerFrame::ReflowChild layout/generic/nsContainerFrame.cpp:756 47 XUL nsTableRowGroupFrame::ReflowChildren layout/tables/nsTableRowGroupFrame.cpp:420 48 XUL nsTableRowGroupFrame::Reflow layout/tables/nsTableRowGroupFrame.cpp:1320 49 XUL nsContainerFrame::ReflowChild layout/generic/nsContainerFrame.cpp:756 50 XUL nsTableFrame::ReflowChildren layout/tables/nsTableFrame.cpp:2738 51 XUL nsTableFrame::ReflowTable layout/tables/nsTableFrame.cpp:1889 52 XUL nsTableFrame::Reflow layout/tables/nsTableFrame.cpp:1793 53 XUL nsContainerFrame::ReflowChild layout/generic/nsContainerFrame.cpp:756 54 XUL nsTableOuterFrame::Reflow layout/tables/nsTableOuterFrame.cpp:1010 55 XUL nsBlockReflowContext::ReflowBlock layout/generic/nsBlockReflowContext.cpp:310 56 XUL nsBlockFrame::ReflowBlockFrame layout/generic/nsBlockFrame.cpp:3085 57 XUL nsBlockFrame::ReflowLine layout/generic/nsBlockFrame.cpp:2386 58 XUL nsBlockFrame::ReflowDirtyLines layout/generic/nsBlockFrame.cpp:1887 59 XUL nsBlockFrame::Reflow layout/generic/nsBlockFrame.cpp:995 60 XUL nsBlockReflowContext::ReflowBlock layout/generic/nsBlockReflowContext.cpp:310 61 XUL nsBlockFrame::ReflowBlockFrame layout/generic/nsBlockFrame.cpp:3085 62 XUL nsBlockFrame::ReflowLine layout/generic/nsBlockFrame.cpp:2386 63 XUL nsBlockFrame::ReflowDirtyLines layout/generic/nsBlockFrame.cpp:1887 64 XUL nsBlockFrame::Reflow layout/generic/nsBlockFrame.cpp:995 65 XUL nsContainerFrame::ReflowChild layout/generic/nsContainerFrame.cpp:756 66 XUL nsCanvasFrame::Reflow layout/generic/nsCanvasFrame.cpp:505 67 XUL nsContainerFrame::ReflowChild layout/generic/nsContainerFrame.cpp:756 68 XUL nsPageContentFrame::Reflow layout/generic/nsPageContentFrame.cpp:103 69 XUL nsContainerFrame::ReflowChild layout/generic/nsContainerFrame.cpp:756 70 XUL nsPageFrame::Reflow layout/generic/nsPageFrame.cpp:139 71 XUL nsContainerFrame::ReflowChild layout/generic/nsContainerFrame.cpp:756 72 XUL nsSimplePageSequenceFrame::Reflow layout/generic/nsSimplePageSequence.cpp:280 73 XUL nsContainerFrame::ReflowChild layout/generic/nsContainerFrame.cpp:756 74 XUL ViewportFrame::Reflow layout/generic/nsViewportFrame.cpp:285 75 XUL PresShell::DoReflow layout/base/nsPresShell.cpp:7347 76 XUL PresShell::ProcessReflowCommands layout/base/nsPresShell.cpp:7480 77 XUL PresShell::FlushPendingNotifications layout/base/nsPresShell.cpp:4811 78 XUL nsPrintEngine::ReflowPrintObject layout/printing/nsPrintEngine.cpp:2037 79 XUL nsPrintEngine::ReflowDocList layout/printing/nsPrintEngine.cpp:1866 80 XUL nsPrintEngine::SetupToPrintContent layout/printing/nsPrintEngine.cpp:1675 81 XUL nsPrintEngine::DoCommonPrint layout/printing/nsPrintEngine.cpp:1507 82 XUL nsPrintEngine::CommonPrint layout/printing/nsPrintEngine.cpp:446 83 XUL nsPrintEngine::Print layout/printing/nsPrintEngine.cpp:764 84 XUL DocumentViewerImpl::Print layout/base/nsDocumentViewer.cpp:3676 85 XUL NS_InvokeByIndex_P xpcom/reflect/xptcall/src/md/unix/xptcinvoke_unixish_x86.cpp:179 86 XUL XPCWrappedNative::CallMethod js/src/xpconnect/src/xpcwrappednative.cpp:2727 87 XUL XPC_WN_CallMethod js/src/xpconnect/src/xpcwrappednativejsops.cpp:1770 88 libmozjs.dylib js_Invoke js/src/jsinterp.cpp:1370 89 libmozjs.dylib js_InternalInvoke js/src/jsinterp.cpp:1435 90 libmozjs.dylib JS_CallFunctionValue js/src/jsapi.cpp:4951 91 XUL XPC_NW_FunctionWrapper js/src/xpconnect/src/XPCNativeWrapper.cpp:553 92 libmozjs.dylib js_Invoke js/src/jsinterp.cpp:1370 93 libmozjs.dylib js_Interpret js/src/jsops.cpp:2277 94 libmozjs.dylib js_Invoke js/src/jsinterp.cpp:1378 95 libmozjs.dylib js_InternalInvoke js/src/jsinterp.cpp:1435 96 libmozjs.dylib JS_CallFunctionValue js/src/jsapi.cpp:4951 97 XUL nsJSContext::CallEventHandler dom/base/nsJSEnvironment.cpp:2161 98 XUL nsJSEventListener::HandleEvent dom/src/events/nsJSEventListener.cpp:228 99 XUL nsEventListenerManager::HandleEventSubType content/events/src/nsEventListenerManager.cpp:1082 100 XUL nsEventListenerManager::HandleEvent content/events/src/nsEventListenerManager.cpp:1198 101 XUL nsEventTargetChainItem::HandleEventTargetChain content/events/src/nsEventDispatcher.cpp:201 102 XUL nsEventDispatcher::Dispatch content/events/src/nsEventDispatcher.cpp:601 103 XUL nsEventDispatcher::DispatchDOMEvent content/events/src/nsEventDispatcher.cpp:664 104 XUL nsEventListenerManager::DispatchEvent content/events/src/nsEventListenerManager.cpp:1325 105 XUL nsDOMEventRTTearoff::DispatchEvent content/base/src/nsGenericElement.cpp:1622 106 XUL nsContentUtils::DispatchXULCommand content/base/src/nsContentUtils.cpp:5305 107 XUL nsXULElement::PreHandleEvent content/xul/content/src/nsXULElement.cpp:1640 108 XUL nsEventDispatcher::Dispatch content/events/src/nsEventDispatcher.cpp:257 109 XUL nsEventDispatcher::DispatchDOMEvent content/events/src/nsEventDispatcher.cpp:664 110 XUL nsEventListenerManager::DispatchEvent content/events/src/nsEventListenerManager.cpp:1325 111 XUL nsDOMEventRTTearoff::DispatchEvent content/base/src/nsGenericElement.cpp:1622 112 XUL nsMenuUtilsX::DispatchCommandTo widget/src/cocoa/nsMenuUtilsX.mm:82 113 XUL -[NativeMenuItemTarget menuItemHit:] widget/src/cocoa/nsMenuBarX.mm:857 114 AppKit -[NSApplication sendAction:to:from:] 115 AppKit -[NSMenu performActionForItemAtIndex:] 116 AppKit -[NSCarbonMenuImpl performActionWithHighlightingForItemAtIndex:] 117 AppKit AppKitMenuEventHandler 118 HIToolbox DispatchEventToHandlers 119 HIToolbox SendEventToEventTargetInternal 120 HIToolbox SendEventToEventTarget 121 HIToolbox SendHICommandEvent 122 HIToolbox SendMenuCommandWithContextAndModifiers 123 HIToolbox SendMenuItemSelectedEvent 124 HIToolbox FinishMenuSelection 125 HIToolbox MenuSelectCore 126 HIToolbox _HandleMenuSelection2 127 HIToolbox _HandleMenuSelection 128 AppKit _NSHandleCarbonMenuEvent 129 AppKit _DPSNextEvent 130 AppKit -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] 131 AppKit -[NSApplication run] 132 XUL nsAppShell::Run widget/src/cocoa/nsAppShell.mm:863 133 XUL nsAppStartup::Run toolkit/components/startup/src/nsAppStartup.cpp:182 134 XUL XRE_main toolkit/xre/nsAppRunner.cpp:3548 135 firefox-bin main browser/app/nsBrowserApp.cpp:158 136 firefox-bin firefox-bin@0xbf5 137 @0x0
Reporter | ||
Comment 1•14 years ago
|
||
1. open the attached page 2. print | preview crash
Comment 2•14 years ago
|
||
I get tons of assertion-spam before the crash. Here are the assertions I got, in increasing order of count-per-assertion. The top two assertions (with count=1) are the final ones before the crash.
> 1 ###!!! ASSERTION: Broken frame linkage: 'prevSibling && prevSibling->GetNextSibling() == aFrame', file layout/generic/nsFrameList.cpp, line 132
> 1 ###!!! ASSERTION: Creating a circular frame list, this is very bad.: 'this != aNextSibling', file layout/base/../generic/nsIFrame.h, line 906
> 4 ###!!! ASSERTION: Shouldn't be incomplete if availableHeight is UNCONSTRAINED.: 'aReflowState.availableHeight != NS_UNCONSTRAINEDSIZE', file layout/generic/nsBlockFrame.cpp, line 1368
> 900 ###!!! ASSERTION: How did that happen?: '!mContent->GetPrimaryFrame()', file layout/base/nsCSSFrameConstructor.cpp, line 11334
> 7316 ###!!! ASSERTION: Why did we get called?: '!aChildContent->GetPrimaryFrame() || aChildContent->GetPrimaryFrame()->GetContent() != aChildContent', file layout/base/nsCSSFrameConstructor.cpp, line 2171
> 8252 ###!!! ASSERTION: Losing track of existing primary frame: '!aFrame || !mPrimaryFrame || aFrame == mPrimaryFrame', file ../../dist/include/nsIContent.h, line 886
Comment 3•14 years ago
|
||
A more-reduced testcase would be helpful in tracking down what's going on. NOTE: I just tested this bug's testcase in Firefox3.0, 3.5, and 3.6 builds, and it just hangs on print-preview in all of those. (I let them hang for at least 5 min before giving up on them) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.19pre) Gecko/2010032604 GranParadiso/3.0.19pre In Firefox 3.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3pre) Gecko/20100326 Namoroka/3.6.3pre So, the change from hang to crash is a regression since the 3.6 branch. (not that a hang is much better, from a user's perspective.) A reduced testcase and a regression window on the hang --> crash change would both be helpful here.
Keywords: qawanted
Updated•14 years ago
|
Keywords: regressionwindow-wanted
this is a crashtest so it needs a reftest manifest and a debug build to trigger the asserts
it looks like a thead during pagination is enough to trigger NS_PRECONDITION(!aChildContent->GetPrimaryFrame() || aChildContent->GetPrimaryFrame()->GetContent() != aChildContent, "Why did we get called?");
Comment 10•14 years ago
|
||
If my reading of mxr is correct then the testcase reveals that we do not have reftest-print tests that test <thead>
Comment 11•14 years ago
|
||
Boris, it looks that the thead copying is fundamentally wrong, could you please shed some light on the issue.
Comment 12•14 years ago
|
||
The test case does cause the frequent asserts from comment 2 but not the lethal ones. However the frequent asserts are not covered by a already file bug and look like a serious frame construction issue.
Comment 13•14 years ago
|
||
Hmm. The primary frame asserts are almost certainly a regression from bug 500882. The thead/tfoot replication actually goes through the normal frame construction codepaths for the thead/tfoot. That means that in the old world it clobbered the primary frame mapping for non-table-internal (and non-text and maybe non-inline) nodes with the descendants of the last thead/tfoot. In the new world that clobbering asserts. The bad news is that if I fix the assert in the obvious way, so by not clobbering, I still get the null-deref crash. We should spin off a separate bug on the asserts. The real cause for that null-deref crash is that in nsTableFrame::PushChildren the rgFrame is not in mFrames. And that happens because the aRowGroups passed to PushChildren contains a particular frame twice: (gdb) p aRowGroups[0] $13 = (nsTableRowGroupFrame * const&) @0xbfff2c10: 0x1b712df0 (gdb) p aRowGroups[1] $14 = (nsTableRowGroupFrame * const&) @0xbfff2c14: 0x1b5963c0 (gdb) p aRowGroups[2] $15 = (nsTableRowGroupFrame * const&) @0xbfff2c18: 0x1b5963c0 (gdb) p aRowGroups[3] $16 = (nsTableRowGroupFrame * const&) @0xbfff2c1c: 0x1b718b88 (gdb) p aRowGroups[4] $17 = (nsTableRowGroupFrame * const&) @0xbfff2c20: 0x1b7159c8 Note [1] and [2].
Comment 14•14 years ago
|
||
In particular a <thead> ends up in aRowGroups twice.
Comment 15•14 years ago
|
||
I tested with the testcase in comment 1. I let the hangs sit for 5 minutes before killing them. Regression range 1: works - print preview opens properly: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9a1) Gecko/20060920 Minefield/3.0a1 2006-09-20-04-trunk broken - hang: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9a1) Gecko/20060921 Minefield/3.0a1 2006-09-21-04-trunk http://bonsai.mozilla.org/cvsquery.cgi?treeid=default&module=all&branch=HEAD&branchtype=match&dir=&file=&filetype=match&who=&whotype=match&sortby=Date&hours=2&date=explicit&mindate=2006-09-20+03%3A00%3A00&maxdate=2006-09-21+05%3A00%3A00&cvsroot=%2Fcvsroot Regression range 2: broken - hang: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.3a1pre) Gecko/20091002 Minefield/3.7a1pre http://hg.mozilla.org/mozilla-central/rev/0aeac787a86d broken - crash: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.3a1pre) Gecko/20091003 Minefield/3.7a1pre http://hg.mozilla.org/mozilla-central/rev/0a7dd88dbe67 http://hg.mozilla.org/mozilla-central/pushloghtml?fromchange=0aeac787a86d&tochange=0a7dd88dbe67
Keywords: regressionwindow-wanted
Comment 16•14 years ago
|
||
Right. Going from hang to crash happened due to bug 512336 landing; after that the attempt to remove a frame from a framelist the frame is not on crashes. Going from ok to hang is almost certainly a regression from bug 347367, given the regression range given in comment 15...
Comment 17•14 years ago
|
||
Its certainly bug 347367, although before we did probably not mark as incomplete and just did not paginate and lost content.
Comment 18•14 years ago
|
||
OK, in nsTableFrame::ReflowChildren we have this code: // Put the nextinflow so that it will get pushed rowGroups.InsertElementAt(childX + 1, static_cast <nsTableRowGroupFrame*>(kidNextInFlow)); But we're hitting that code when kidNextInFlow is already in rowGroups sometimes. On a probably-unrelated note, I see a number of asserts like this: ###!!! ASSERTION: Shouldn't be incomplete if availableHeight is UNCONSTRAINED.: 'aReflowState.availableHeight != NS_UNCONSTRAINEDSIZE', file /Users/bzbarsky/mozilla/vanilla/mozilla/layout/generic/nsBlockFrame.cpp, line 1382 on this testcase as well...
Comment 19•14 years ago
|
||
That said, sometimes we get to this line when kidFrame already had a next-in-flow (and that next-in-flow is in mFrames), but the next-in-flow is NOT in rowGroups... I don't see how that can happen yet.
Comment 20•14 years ago
|
||
Oh, I see. OrderRowGroups leaves next-in-flows out of the array it generates. But in that case I'm not sure how we can end up with next-in-flows in the array to start with....
Comment 21•14 years ago
|
||
(gdb) p mFrames.mFirstChild $12 = (nsTableRowGroupFrame *) 0x21e751f0 (gdb) p mFrames.mFirstChild->GetNextSibling() $13 = (nsTableRowGroupFrame *) 0x21e77dc8 (gdb) p mFrames.mFirstChild->GetNextSibling()->GetNextSibling() $14 = (nsTableRowGroupFrame *) 0x17bc9c0 (gdb) p mFrames.mFirstChild->GetNextSibling()->GetNextSibling()->GetNextSibling() $15 = (nsTableRowGroupFrame *) 0x21e7af88 (gdb) p mFrames.mFirstChild->GetNextSibling()->GetNextSibling()->GetNextSibling()->GetNextSibling() $16 = (Cannot access memory at address 0x0 (gdb) p mFrames.mFirstChild->GetNextInFlow() $17 = (nsTableRowGroupFrame *) 0x17bc9c0 (gdb) p mFrames.mFirstChild->mContent->Tag()->mString $19 = (PRUnichar *) 0x135bcdf8 (gdb) pu $19 $20 = 0x1bf7f9a0 "thead" So the next-in-flow of the thead is NOT its next sibling, and as a result we end up not skipping over it during OrderRowGroups. We could fix OrderRowGroups to deal, but is this "next-in-flow is not next sibling" deal ok? The actual next-sibling is a tfoot.
Comment 22•14 years ago
|
||
roc, see comment 21?
Comment 23•14 years ago
|
||
The bogus framelist is created at this point: #6 0x124f85ed in nsIFrame::SetNextSibling (this=0x2177a3c8, aNextSibling=0x215bc9c0) at nsIFrame.h:945 #7 0x125cdd1b in nsFrameList::InsertFrames (this=0x217777a0, aParent=0x0, aPrevSibling=0x2177a3c8, aFrameList=@0x1c6e5b60) at /Users/bzbarsky/mozilla/vanilla/mozilla/layout/generic/nsFrameList.cpp:228 #8 0x12588059 in nsFrameList::AppendFrames (this=0x217777a0, aParent=0x0, aFrameList=@0x1c6e5b60) at nsFrameList.h:126 #9 0x125aae51 in nsContainerFrame::MoveOverflowToChildList (this=0x21777768, aPresContext=0x1232c00) at /Users/bzbarsky/mozilla/vanilla/mozilla/layout/generic/nsContainerFrame.cpp:1293 #10 0x12779f30 in nsTableFrame::Reflow (this=0x21777768, aPresContext=0x1232c00, aDesiredSize=@0xbfff2d54, aReflowState=@0xbfff2c04, aStatus=@0xbfff3184) at /Users/bzbarsky/mozilla/vanilla/mozilla/layout/tables/nsTableFrame.cpp:1740 This is grabbing the overflow frames from the next-in-flow. At this point, mFrames has two frames in it: a <thead> and a <tfoot>. The |overflowFrames| that's being pulled also has two frames in it: a <thead> (whose prev continuation is our existing thead) and a <tbody>. So given the whole model where the thead might overflow while the tfoot does not, it seems like for tables pulling from the overflow list back into mFrames needs to be a lot smarter, or something.
Updated•14 years ago
|
blocking2.0: --- → ?
(In reply to comment #21) > is this "next-in-flow is not next sibling" deal ok? The actual > next-sibling is a tfoot. In general that is possible, yes. (In reply to comment #23) > This is grabbing the overflow frames from the next-in-flow. At this point, > mFrames has two frames in it: a <thead> and a <tfoot>. The |overflowFrames| > that's being pulled also has two frames in it: a <thead> (whose prev > continuation is our existing thead) and a <tbody>. > > So given the whole model where the thead might overflow while the tfoot does > not, it seems like for tables pulling from the overflow list back into mFrames > needs to be a lot smarter, or something. We probably should pull back everything and then immediately push any next-in-flows of existing children back to the overflow list. In general I don't trust our table pagination code to handle more than one reflow of a given frame, especially when header/footer replication is going on. That's why we don't allow table breaking inside columns. Why are we re-reflowing a table in this case?
Comment 25•14 years ago
|
||
https://bugzilla.mozilla.org/attachment.cgi?id=434277 is a reduced testcase for the lethal assertions and the crash
Comment 26•14 years ago
|
||
That testcase is in bug 554376.
Comment 27•14 years ago
|
||
I removed any float references from the test case and replaced table pseudo frame construction by content based frame construction. The position of thead behind tbody is essential for crashing.
Comment 28•14 years ago
|
||
> Why are we re-reflowing a table in this case? We create next-in-flows during unconstrained height reflows see http://mxr.mozilla.org/mozilla-central/ident?i=isPaginated for a starting pointer and http://mxr.mozilla.org/mozilla-central/source/layout/tables/nsTableRowGroupFrame.cpp#364 for comment on the point. This is the cause for the unconstrained height asserts.
Comment 29•14 years ago
|
||
I filed bug 558575 for the issue in comment 10
(In reply to comment #28) > > Why are we re-reflowing a table in this case? > We create next-in-flows during unconstrained height reflows > see http://mxr.mozilla.org/mozilla-central/ident?i=isPaginated > for a starting pointer and > http://mxr.mozilla.org/mozilla-central/source/layout/tables/nsTableRowGroupFrame.cpp#364 > for comment on the point. This is the cause for the unconstrained height > asserts. I'm not completely sure what you mean. Do you mean that all those isPaginated checks should be checking for constrained height instead? I still don't understand why we've created next-in-flows for a table and then we're reflowing it again and needing to pull back those next-in-flows.
Comment 31•14 years ago
|
||
During a unconstrained height reflow we look if the pres context is paginated and if so we honor the CSS page-break properties and create a next inflow. Tables handle the page-break properties different from block layout not during CSS frame construction but during reflow. The code is a wild mix of pres-context pagination checks and checks for unconstrained height just a short snippet from nsTableFrame.cpp: * line 1760 -- if (isPaginated && !GetPrevInFlow() && (NS_UNCONSTRAINEDSIZE != aReflowState.availableHeight)) { * line 2655 -- if (isPaginated) { * line 2676 -- (isPaginated || (kidFrame->GetStateBits() & * line 2687 -- if (isPaginated && (NS_UNCONSTRAINEDSIZE != kidAvailSize.height)) { * line 2747 -- if (NS_FRAME_IS_COMPLETE(aStatus) && isPaginated && * line 2779 -- if (NS_FRAME_IS_COMPLETE(aStatus) && isPaginated &&
OK, that's exciting. I suspect we should only honor the page-break properties if the height is constrained. I'm still unclear on the last part of comment 30.
Comment 33•14 years ago
|
||
this probably does not answer >I'm still unclear on the last part of comment 30. However it fixes the test case from bug 554376. I did never see the crash on the initial test case here. The funny thing is to reftest this (aka bug 558575)
Attachment #438358 -
Attachment is patch: true
Attachment #438358 -
Flags: review+
Comment 34•14 years ago
|
||
Is the patch ready to be checked in?
Comment 35•14 years ago
|
||
>Is the patch ready to be checked in? I dunno. This part of the code is not covered by a reftest, so although it seems logical it might cause regressions, its like coding in 2001. When trying to write reftests bug 558575) I found two bugs (bug 558574) so it might take long to get this code really covered.
Comment 36•14 years ago
|
||
1319 // Reflow the existing frames. 1320 PRBool splitDueToPageBreak = PR_FALSE; 1321 rv = ReflowChildren(aPresContext, aDesiredSize, state, aStatus, 1322 &splitDueToPageBreak); 1323 1324 // See if all the frames fit. Do not try to split anything if we're 1325 // not paginated ... we can't split across columns yet. 1326 if (aReflowState.mFlags.mTableIsSplittable && 1327 (NS_FRAME_NOT_COMPLETE == aStatus || splitDueToPageBreak || 1328 (NS_UNCONSTRAINEDSIZE != aReflowState.availableHeight && 1329 aDesiredSize.height > aReflowState.availableHeight))) { 1330 // Nope, find a place to split the row group The code logic that the patch changes is broken also with the patch, the splitDueToPageBreak variable will report only page breaks that occur at the edges of rows and row groups, however if the page break occurs inside a cell it will not get noticed (see https://bugzilla.mozilla.org/attachment.cgi?id=439756) The code will not reflow the row group content with a constrained height if the unconstrained reflow reports that it would fit on the page, which violates a invariant that during a constrained height reflow all content is reflowed with a constrained height to give it a opportunity to split.
blocking2.0: ? → final+
Priority: -- → P2
Comment 37•14 years ago
|
||
bug 558575 and bug 558574 are now scheduled for review, and I pushed this bug together with the patches in bug 558575 and bug 558574 over the try server
Comment 38•14 years ago
|
||
I'm going to land the assert fix I mention in comment 13 as part of the fix for bug 563837.
Comment 39•14 years ago
|
||
I will land this bug and bug 558575 and bug 558574 on saturday
Comment 40•14 years ago
|
||
http://hg.mozilla.org/mozilla-central/rev/f0206483a592
Status: NEW → RESOLVED
Closed: 14 years ago
Resolution: --- → FIXED
Reporter | ||
Comment 41•14 years ago
|
||
would it make sense to land this on 1.9.2 at some point if it shakes out well on the trunk, or is it too risky or difficult to backport?
blocking1.9.2: --- → ?
Comment 42•14 years ago
|
||
The backport is fairly easy, the risk is that we hork printing tables.
Comment 43•14 years ago
|
||
After this bakes on trunk please nominate for approval.
blocking1.9.2: ? → ---
status1.9.2:
--- → wanted
Assignee | ||
Updated•13 years ago
|
Crash Signature: [@ XUL@0x2b2b97 ]
Comment 44•10 years ago
|
||
Issue is resolved - clearing old keywords - qa-wanted clean-up
Keywords: qawanted
You need to log in
before you can comment on or make changes to this bug.
Description
•