Closed Bug 1001258 Opened 11 years ago Closed 11 years ago

"ASSERTION: MovePositionBy should always lead to the movement specified, unless the frame is position:sticky", with position:relative, inline-block, & dynamic change to 'float'

Categories

(Core :: Layout: Block and Inline, defect)

defect
Not set
normal

Tracking

()

RESOLVED FIXED
mozilla32

People

(Reporter: jruderman, Assigned: dbaron)

References

Details

(Keywords: assertion, testcase)

Attachments

(2 files)

Attached file testcase
###!!! ASSERTION: MovePositionBy should always lead to the movement specified, unless the frame is position:sticky: 'StyleDisplay()->mPosition == NS_STYLE_POSITION_STICKY || GetPosition() + aTranslation == position', file layout/generic/nsFrame.cpp, line 5164 This assertion was added in https://hg.mozilla.org/mozilla-central/rev/e700c4f7f8e3
It took me a long time to reduce this testcase, so I hope it's useful!
Depends on: 911786
Summary: "ASSERTION: MovePositionBy should always lead to the movement specified, unless the frame is position:sticky" → "ASSERTION: MovePositionBy should always lead to the movement specified, unless the frame is position:sticky", with position:relative, inline-block, & dynamic change to 'float'
So there's a codepath that moved the position:relative frame without calling its ApplyRelativePositioning method, which means that if that frame had been position:sticky instead of position;relative, the layout would have been wrong. The question is which codepath...
Component: Layout → Layout: Block and Inline
OS: Mac OS X → All
Hardware: x86_64 → All
The problem is that we change the rectangle to a reasonably-bogus value here: #0 0x00007f1a70e0dd73 in nsIFrame::SetRect (this=0x5aaa2f8, aRect=...) at /home/dbaron/builds/ssd/mozilla-central/mozilla/layout/generic/nsIFrame.h:774 #1 0x00007f1a70e0ddaf in nsIFrame::SetRect (this=0x5aaa2f8, aWritingMode=..., aRect=..., aContainerWidth=<optimized out>) at /home/dbaron/builds/ssd/mozilla-central/mozilla/layout/generic/nsIFrame.h:790 #2 0x00007f1a70e0c70a in nsLineLayout::BlockDirAlignLine (this=0x7fff57649ad8) at /home/dbaron/builds/ssd/mozilla-central/mozilla/layout/generic/nsLineLayout.cpp:1462 #3 0x00007f1a70e2fafc in nsBlockFrame::PlaceLine (this=0x5aa8a90, aState=..., aLineLayout=..., aLine=..., aFloatStateBeforeLine=0x7fff57649be8, aFloatAvailableSpace=..., aAvailableSpaceHeight=@0x7fff57649bfc: 0, aKeepReflowGoing=0x7fff57649f0e) at /home/dbaron/builds/ssd/mozilla-central/mozilla/layout/generic/nsBlockFrame.cpp:4181 and then PlaceLine returns here: // If the available space between the floats is smaller now that we // know the height, return false (and cause another pass with // LINE_REFLOW_REDO_MORE_FLOATS). if (AvailableSpaceShrunk(oldFloatAvailableSpace, aFloatAvailableSpace)) { return false; } before calling aLineLayout.RelativePositionFrames().
It's possible that the answer here is that we just remove the assertion, though.
(The problem here is that fundamentally, nsBlockFrame is bailing out in the middle of work that it knows it's going to redo.)
Assignee: nobody → dbaron
Status: NEW → ASSIGNED
Comment on attachment 8413142 [details] [diff] [review] Remove assertion added in bug 911786 part 3 since it turns out the first bug it found was bogus Maybe include the testcase as a crashtest, too? r=me
Attachment #8413142 - Flags: review?(dholbert) → review+
Status: ASSIGNED → RESOLVED
Closed: 11 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla32
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: