Open Bug 304369 Opened 21 years ago Updated 3 years ago

Reflow assertions when viewing e-mail messages

Categories

(Core :: Layout, defect)

x86
Windows XP
defect

Tracking

()

People

(Reporter: mscott, Unassigned)

Details

I've been seeing this in my debug build for at least 3 or 4 days now. Whenever I read an e-mail message, I get multiple assertions in nsBlockFrame::Reflow: // Now reflow... rv = ReflowDirtyLines(state, PR_TRUE); NS_ASSERTION(NS_SUCCEEDED(rv), "reflow dirty lines failed"); nsDebug::Assertion(const char * 0x021760e0, const char * 0x021760cc, const char * 0x02176090, int 877) line 109 nsBlockFrame::Reflow(nsBlockFrame * const 0x06235bd4, nsPresContext * 0x061cff80, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, unsigned int & 0) line 877 + 38 bytes nsBlockReflowContext::ReflowBlock(const nsRect & {...}, int 1, nsCollapsingMargin & {...}, int 0, int 1, nsMargin & {...}, nsHTMLReflowState & {...}, unsigned int & 0) line 605 + 42 bytes nsBlockFrame::ReflowBlockFrame(nsBlockReflowState & {...}, nsLineList_iterator {...}, int * 0x0012cf48) line 3410 + 66 bytes nsBlockFrame::ReflowLine(nsBlockReflowState & {...}, nsLineList_iterator {...}, int * 0x0012cf48, int 1) line 2571 + 27 bytes nsBlockFrame::ReflowDirtyLines(nsBlockReflowState & {...}, int 1) line 2239 + 31 bytes nsBlockFrame::Reflow(nsBlockFrame * const 0x06235a5c, nsPresContext * 0x061cff80, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, unsigned int & 0) line 876 + 17 bytes nsContainerFrame::ReflowChild(nsIFrame * 0x06235a5c, nsPresContext * 0x061cff80, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, int 0, int 0, unsigned int 0, unsigned int & 0) line 899 + 31 bytes CanvasFrame::Reflow(CanvasFrame * const 0x06210640, nsPresContext * 0x061cff80, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, unsigned int & 0) line 522 nsContainerFrame::ReflowChild(nsIFrame * 0x06210640, nsPresContext * 0x061cff80, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, int 0, int 0, unsigned int 3, unsigned int & 0) line 899 + 31 bytes nsHTMLScrollFrame::ReflowScrolledFrame(const ScrollReflowState & {...}, int 0, nsHTMLReflowMetrics * 0x0012d7ec, int 0) line 508 + 54 bytes nsHTMLScrollFrame::ReflowContents(ScrollReflowState * 0x0012d95c, const nsHTMLReflowMetrics & {...}) line 595 + 25 bytes nsHTMLScrollFrame::Reflow(nsHTMLScrollFrame * const 0x06210784, nsPresContext * 0x061cff80, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, unsigned int & 0) line 753 + 16 bytes nsContainerFrame::ReflowChild(nsIFrame * 0x06210784, nsPresContext * 0x061cff80, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, int 0, int 0, unsigned int 0, unsigned int & 0) line 899 + 31 bytes ViewportFrame::Reflow(ViewportFrame * const 0x062105b0, nsPresContext * 0x061cff80, nsHTMLReflowMetrics & {...}, const nsHTMLReflowState & {...}, unsigned int & 0) line 239 + 43 bytes PresShell::ResizeReflow(PresShell * const 0x0299dad8, int 13920, int 3360) line 3014 PresShell::ResizeReflow(PresShell * const 0x0299db4c, nsIView * 0x061e2298, int 13920, int 3360) line 6471 nsViewManager::DoSetWindowDimensions(int 13920, int 3360) line 420 nsViewManager::SetWindowDimensions(nsViewManager * const 0x061e21e0, int 13920, int 3360) line 695 nsViewManager::DispatchEvent(nsViewManager * const 0x061e21e0, nsGUIEvent * 0x0012dfe4, nsEventStatus * 0x0012df38) line 1954 HandleEvent(nsGUIEvent * 0x0012dfe4) line 174
This is bad, and generally means some descendant's reflow method return a failure nsresult, which we propagate. Reflow methods should really only do that in exceptional situations (e.g., out of memory).
If you need an example that will generate this reflow assertion, just read any old bugzilla e-mail in Thunderbird or the suite. They all generate the assertions for me.
So I only see this when switching folders in mailnews. When this happens, we bail out of reflowing a textframe because the current document of its mContent is null. The stack that gets us into reflow is: #22 0xb6474aec in PresShell::ResizeReflow (this=0x8944470, aView=0x8b87c58, aWidth=11382, aHeight=5012) at ../../../mozilla/layout/base/nsPresShell.cpp:6322 #23 0xb68932ad in nsViewManager::DoSetWindowDimensions (this=0x8ac2438, aWidth=11382, aHeight=5012) at ../../../mozilla/view/src/nsViewManager.h:418 #24 0xb68884f6 in nsViewManager::SetWindowDimensions (this=0x8ac2438, aWidth=11382, aHeight=5012) at ../../../mozilla/view/src/nsViewManager.cpp:694 #25 0xb688bd02 in nsViewManager::DispatchEvent (this=0x8ac2438, aEvent=0xbfffd990, aStatus=0xbfffd880) at ../../../mozilla/view/src/nsViewManager.cpp:1952 #26 0xb688154c in HandleEvent (aEvent=0xbfffd990) at ../../../mozilla/view/src/nsView.cpp:171 #27 0xb5e1f987 in nsWidget::DispatchEvent (this=0x86ec110, aEvent=0xbfffd990, aStatus=@0xbfffd940) at ../../../../mozilla/widget/src/gtk/nsWidget.cpp:1558 #28 0xb5e1f5d1 in nsWidget::DispatchWindowEvent (this=0x86ec110, event=0xbfffd990) at ../../../../mozilla/widget/src/gtk/nsWidget.cpp:1447 #29 0xb5e1dbb3 in nsWidget::OnResize (this=0x86ec110, event=0xbfffd990) at ../../../../mozilla/widget/src/gtk/nsWidget.cpp:675 with the resize coming from nsSubDocumentFrame::Reflow in the parent document, which calls nsDocShell::SetPositionAndSize. At the point when we hit ResizeReflow in the presshell, we have: (gdb) p mDocument->GetRootContent()->GetCurrentDoc() $15 = (class nsIDocument *) 0x0 (gdb) p ((class nsHTMLDocument*)mDocument)->mScriptGlobalObject $18 = {mRawPtr = 0x0} So it looks like the document there is already dead, but we haven't torn down the presshell for some reason...
Would fixing PresShell::IsVisible to reflect what fastback does fix this?
Also, when this is fixed, the change in the balsa/Firefox tree should probably be uncommented. (This assertion is commented out so I could make assertions fatal on that tinderbox.)
(In reply to comment #4) > Would fixing PresShell::IsVisible to reflect what fastback does fix this? Maybe... Worth trying, at least.
Severity: normal → S3
You need to log in before you can comment on or make changes to this bug.