Closed Bug 268157 Opened 20 years ago Closed 19 years ago

Crash [@ nsHTMLReflowState::ComputePadding ]

Categories

(Core :: Layout, defect)

x86
All
defect
Not set
critical

Tracking

()

VERIFIED FIXED
mozilla1.9alpha1

People

(Reporter: robert.strong.bugs, Assigned: bzbarsky)

References

Details

(Keywords: crash, testcase)

Crash Data

Attachments

(7 files, 2 obsolete files)

User-Agent:       Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8a5) Gecko/20041106
Build Identifier: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8a5) Gecko/20041106

The soon to be attached simplified testcase causes a crash @
nsHTMLReflowState::ComputePadding - TB1770634H.

Reproducible: Always
Steps to Reproduce:
1. Open testcase
Actual Results:  
Crash

Expected Results:  
No crash

http://talkback-public.mozilla.org/talkback/fastfind.jsp?search=2&type=iid&id=TB1770634H
Stack Signature nsHTMLReflowState::ComputePadding 0e003fe8
Source File, Line No.
c:/builds/tinderbox/MozillaTrunk/WINNT_5.0_Clobber/mozilla/layout/html/base/src/nsHTMLReflowState.cpp,
line 2327

Besides the latest trunk this also crashes Mozilla/5.0 (Windows; U; Windows NT
5.1; en-US; rv:1.7.5) Gecko/20041103 Firefox/1.0RC2
Attachment #164923 - Attachment description: Testcase → Testcase (causes crash)
Adding keywords crash and testcase
Keywords: crash, testcase
That first assert (about "unexpected flow") fires when |this| is a frame for the
<del> element (in fact, it's the second in-flow frame for the <del>)... it has
three kids that are text frames, and the last of these has a next-in-flow that's
not in the child list of the <del>'s inline frame.

I'll attach a testcase that's a little more minimal (<span> instead of <del>,
removes some content, etc)...  For some reason the first <object> and <div> pair
is in fact necessary.

At a guess, part of the issue here is that when the divs are processed because
we replace the object we end up with an {ib} split, so we blow away things in
WipeContainingBlock and somehow screw up when we reconstruct.  I'm not really
familiar enough with inline reflow to be able to say more than that.
Attached file Smaller testcase
Notes:

1)  To get this to crash reliably, you want a debug build (so we 0xdddddddd out
    deleted stuff).
2)  We don't call WipeContainingBlock, just SplitToContainingBlock().  I can
    totally see SplitToContainingBlock() failing to adjust the in-flow stuff
    correctly...

The problem is that I don't know what the in-flow linking should look like in
this case.  Robert, David, is that documented somewhere?
Blocks: 285212
I don't crash or see any assetions when viewing the testcase using a debug build
from 20050324. Perhaps the checkin for bug 263825 has fixed this?
I still crash quite nicely on the "smaller testcase" with a debug build from
"Fri Mar 25 21:34:13 CST 2005"
Attached patch Spackle (obsolete) — Splinter Review
On the Mac, this crash appears to be due to attempt to use a null 
nsCOMPtr<nsIWidget> , in the function nsWindow::ResetInputState() at
http://lxr.mozilla.org/seamonkey/source/widget/src/mac/nsWindow.cpp#2471

This patch guards against this.

This file seems to have inconsistent brace and indenting - would a patch 
for this be accepted?
Attachment #181121 - Flags: review?
Ben, chances are the patch you posted isn't really a patch for this bug (which
is cross-platform) or is a patch for a consequence without addressing the real
issue...  You may want to put it in a separate bug (and request review from one
of the Mac widget owners).
I have opened Bug 291096 : I fear that I have wasted your time as the patch
actually does nothing anyway (the code path is exercised by the testcase though).

On my build using standard methods 2005-04-18, this crash is still in; but
using recent debug builds, I do not get a crash - just my warning. I suspect 
that either there is a partial fix in, or Mac is less susceptible or I have 
a patch in my tree which hides the crash.
Blocks: 305386
Attachment #181121 - Attachment is obsolete: true
Attachment #181121 - Flags: review?
I started debugging bug 305386 which I'm pretty sure is the same underlying bug.
The reason we crash is that someone pushes a frame that still has a next-in-flow
with a different parent and then we pick those up during initial reflow and
decide to set the parent pointer lazily:
http://bonsai.mozilla.org/cvsblame.cgi?file=mozilla/layout/generic/nsInlineFrame.cpp&rev=3.241&root=/cvsroot&mark=366,367#334

-- but the comments here seems to indicate this is a bad situation:
http://bonsai.mozilla.org/cvsblame.cgi?file=mozilla/layout/generic/nsInlineFrame.cpp&rev=3.241&root=/cvsroot&mark=501,509-517#471

Is it ok to "steal" those next-in-flows in PushFrames()? or should this not
have happened in the first place, meaning something else is broken?
OS: Windows XP → All
Attached patch fix? (obsolete) — Splinter Review
I don't think this block makes sense. Removing it fixes the crashes and all the

assertions disappear. This block was a fix for bug 32192, but that crash does
not
come back after removing this block, so maybe it was just a wallpaper and that
the real bug that caused 32192 has since been fixed?
Why do you think that doesn't make sense?

I can't think of a case --- even in an IB situation --- where this block should
be asserting. Can you explain it in detail?
(In reply to comment #14)
> Why do you think that doesn't make sense?

Because the next-in-flow frame that we bluntly do SetParent() on here is still
in some other frame's child list (mFrames). That's not a healthy situation
as far as I know.
It should be in our child list, so this assertion:
-        NS_ASSERTION(mFrames.ContainsFrame(nextInFlow), "unexpected flow");
Should not be firing.

Can you explain the situation that leads to it firing?
Attached file frame dump + stack
Here's a frame dump (at the start) in nsInlineFrame::PushFrames when the
problem occurs. The last of the frames we are pushing has a next-in-flow with
a different parent.
>     Inline(span)(1)@0x86b8668 next=0x86f71c4 {0,0,0,0} [state=00008403]
[content=0x86f24c0] [sc=0x86f682c]<

This is still in the intial reflow for this frame? We shouldn't be getting into
this state where we're doing an initial reflow on the frame while it already has
a next-in-flow (because of text wrapping, it appears). And I believe that at the
point of the dump, 0x86b8668 should have its next in flow set to 0x86f71c4.
Attachment #193383 - Attachment is obsolete: true
It is SplitToContainingBlock that has reset the next/prev-in-flow
for the ancestors:
http://bonsai.mozilla.org/cvsblame.cgi?file=mozilla/layout/base/nsCSSFrameConstructor.cpp&rev=1.1114&root=/cvsroot&mark=13382-13386#13362

This is what leads to the "dangling" in-flow chains.
The "right" case is triggered by bug 305386, the "left" by this bug.
Note that for these traces I commented out the code block above so
when the crashes occurs the red prev/next-in-flow links have been
nulled out and that's the root cause for the crashes.

I tried various way to repair the situation, and it is possible
to make the crashes a harder to reproduce, but I failed to fix
it completely.

If someone can tell me what the prev/next-in-flow is supposed to
look like after a split that would be much appreciated.
The otherwise good documentation here:
http://bonsai.mozilla.org/cvsblame.cgi?file=mozilla/layout/base/nsCSSFrameConstructor.cpp&rev=1.1114&root=/cvsroot&mark=13180-13252#13180
does not mention them at all.
Attached patch wallpaperSplinter Review
This fixes all the crashes for me (and no assertions).
I think it is wrong to null out the in-flow chain like this though,
since it breaks text selection for example.
Comment on attachment 193524 [details] [diff] [review]
wallpaper

I think this worth taking as wallpaper until we know how
to deal with this situation.
Attachment #193524 - Flags: superreview?(roc)
Attachment #193524 - Flags: review?(roc)
I believe Boris' work on handling broken plugins and images will fix this for
real by eliminating SplitToContainingBlock (which is indescribably evil).

This patch is hideous --- it leaves flow chains without a primary frame at the
start --- but I suppose it's no more hideous than SplitToContaingBlock cutting
up the flow chain.
Attachment #193524 - Flags: superreview?(roc)
Attachment #193524 - Flags: superreview+
Attachment #193524 - Flags: review?(roc)
Attachment #193524 - Flags: review+
I'm eliminating CantHandleReplacedElement, not SplitToContainingBlock,
unfortunately.
But CantRenderReplacedElement is the only caller of SplitToContainingBlock
(other than SplitToContainingBlock).
Isn't that just a matter of needing more callers?  Right now we just flub
inserting a block as a child of an inline, don't we?  That is, I don't think we
create an IB split in that case.  I believe we have bugs on that...
I vote we kill SplitToContainingBlock and just reconstruct to the containing
block in the that case.
OK.  Sounds reasonable to me.
*** Bug 300585 has been marked as a duplicate of this bug. ***
Blocks: 316026
Fixed by checkin for bug 11011 (which removed SplitToContainingBlock).
Assignee: nobody → bzbarsky
Depends on: moz-broken
Target Milestone: --- → mozilla1.9alpha
Status: NEW → RESOLVED
Closed: 19 years ago
Resolution: --- → FIXED
Verified FIXED on trunk using both testcases here on build 1.5a of SeaMonkey Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20051207 Mozilla/1.0
Status: RESOLVED → VERIFIED
layout/base/crashtests/268157-1.html
http://hg.mozilla.org/mozilla-central/rev/b0337b6287f3
Flags: in-testsuite+
Crash Signature: [@ nsHTMLReflowState::ComputePadding ]
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: