Closed Bug 105520 Opened 23 years ago Closed 17 years ago

table after left float is next to float even when it doesn't fit

Categories

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

defect

Tracking

()

RESOLVED WORKSFORME

People

(Reporter: kh, Unassigned)

References

()

Details

(Keywords: testcase, Whiteboard: [reflow-refactor])

Attachments

(8 files)

This page apparently loads normally - but ALL of the 'body' text is well to the right of the browser window (ie has been displayed to the right of the table). The main body of the page is a single row two cell table - the second cell contains all of the text apart from page header and footer. The bug is also apparent using xml source - not surprising due to its nature! The pages (the above is not the only one!) were created/tested using the w3c editor/browser Amaya (Windows and linux!) and also render correctly when tested in Oregan Developments Oregano 1.10 browser (used on an Acorn RISC PC). Other offending pages are up to twice the size of the example referred to! This seems to be a bug of long standing - but only just come to light - it certainly occurs in all version of Mozilla back to 0.9 (Netscape 4.1+) that I have been able to test. I understand the fault is also present in the Opera browser - but I have no first hand knowledge of this.
The page has: <table align="left" width="95%"> <!-- Header in here --> </table> <table border="0"> <!-- body in here --> </table> This problem does _not_ occur if the floater is a div. Ccing waterson.
Status: UNCONFIRMED → NEW
Ever confirmed: true
Attached file simplified test case
this behavior seems correct to me. the top table is defined with "align='left' width='95%'". this means that the next element will flow directly to it's right, in the 5% of the browser window that remains. the second table tries as hard as it can to wrap itself within that 5%, but can't due to the size of some of it's contained elements. i'm uploading a simplified test case, turning on borders so that you can see the tables more clearly, and removing most of the extra data. opera 5.12, IE 6 and NS 4.78 all render it in more or less the same way (table two beginning at 95% and wrapping as much as it can.) do you expect it to render differently?
flaoater. -->attinasi
Assignee: karnaze → attinasi
Target Milestone: --- → mozilla1.0.1
Keywords: testcase
Moving Mozilla 1.01 bugs to 'future' milestone with priority P1 I will be pulling bugs from 'future' milestones when scheduling later work.
Priority: -- → P1
Target Milestone: mozilla1.0.1 → Future
attinasi will probably not work on those bugs :-(
Assignee: attinasi → table
QA Contact: amar → madhur
Target Milestone: Future → ---
Target Milestone: --- → Future
Actually, if the floater is a div and you don't screw up setting its width you do get identical rendering. mike west is right -- this is invalid.
Status: NEW → RESOLVED
Closed: 21 years ago
Resolution: --- → INVALID
But if it can't fit, maybe it should try to be below the float instead of next to it?
True... And that works with text and images. Is the problem that we get an incorrect MES somewhere?
Status: RESOLVED → REOPENED
Resolution: INVALID → ---
Summary: Table cell overflow suspected. → table after left float is next to float even when it doesn't fit
We actually probably have an explicit quirk to force it not to wrap, or something ugly like that.
Status: REOPENED → NEW
Er... Except none of the tables here have nowrap attributes set?
The quirk I was thinking of was: http://bonsai.mozilla.org/cvsblame.cgi?file=mozilla/layout/html/base/src/nsBlockReflowState.cpp&rev=3.475&cvsroot=/cvsroot&mark=884-885,889-938#882 Removing this quirk would make it much easier to fix a bunch of other float bugs since it would allow us to separate the "flow" and "place" parts of "FlowAndPlaceFloater".
But in this case the second table is _not_ floated, so that code shouldn't apply, should it? Agreed that that quirk is ugly. :(
This shows the bug too. So this ain't a quirk.
What's going on starts in nsBlockReflowState::ComputeBlockAvailSpace, but the real problem is that there's no loop in nsBlockFrame::ReflowBlockFrame or nsBlockReflowContext::ReflowBlock like there is in nsBlockReflowState::FlowAndPlaceFloat.
*** Bug 227996 has been marked as a duplicate of this bug. ***
*** Bug 200860 has been marked as a duplicate of this bug. ***
Blocks: 236098
*** Bug 248741 has been marked as a duplicate of this bug. ***
No longer blocks: 236098
*** Bug 236098 has been marked as a duplicate of this bug. ***
*** Bug 244129 has been marked as a duplicate of this bug. ***
*** Bug 278135 has been marked as a duplicate of this bug. ***
*** Bug 284323 has been marked as a duplicate of this bug. ***
Blocks: 287236
*** Bug 285575 has been marked as a duplicate of this bug. ***
I think part of the issue here is that the behavior isn't really specified. I don't think there is any explicit allowance in CSS 2.1 for wrapping tables, images, boxes with overflow set, etc. when they are set to display: block (or display: table; I don't thinnk it matters). The closest thing I can find is http://www.w3.org/TR/CSS21/visuren.html#q15, which does not seem to allow vertically repositioning blocks. The proposed solution seems to be to repeatedly try to place the table further and further down until it fits. This is much closer to wrapping in the inline box model than to floats, which either fit next to the last float or are pushed below it. I guess it would be treated like a cleared element for margin collapsing. However, all of this is just an idea for dealing with the unspecified behavior of floats next to these blocks. In Opera 8 and IE, the block is placed next to the first float it fits next to horizontially, or below all floats if it doesn't fit next to any float. This behavior probably would be an improvement, but it does cause overlaps if a wide float follows a narrow one. I'll attach a testcase that shows what I mean.
I guess the last testcase shows a really bad behavior where part one of the blue rectangles overlaps one of the purple rectangles. This means removing content in case both of the rectangles actually contained something. Since the spec does not say anything clearly at least losing parts of content should be avoided.
Blocks: 290146
The CSS2.1 spec is *completely* clear on this issue. I'm surprised this bug has gone unfixed for almost 4 years: http://www.w3.org/TR/CSS21/visuren.html#floats "The margin box of a table or an element in the normal flow that establishes a new block formatting context (such as an element with 'overflow' other than 'visible') must not overlap any floats in the same block formatting context as the element itself. If necessary, implementations should clear the said element by placing it below any preceding floats, but may place it adjacent to such floats if there is sufficient space."
> I'm surprised this bug has gone unfixed for almost 4 years: That spec hasn't been around for 4 years. If you think this is easy to fix on short notice, feel free to fix it.
> That spec hasn't been around for 4 years. No, it's "only" been around (in final form) for well 1.25 years - and although I believe the original CSS2 spec (7 years old) strongly alludes to the same behavior as explicitly defined in the 2.1 spec, that is clearly irrelevant at this point. What I take issue with is the sentiment that there is ambiguity in the 2.1 spec on this point. The spec states, verbatim, that "the margin box of a table [...] must not overlap any floats in the same block [...]". Any remaining ambiguity must be tied to the case of multiple floats (below each other) of different widths in the same block formatting context and whether a table (or other element) should be shifted below all subsequent floats if it fails to fit next to a given float - or whether the table should be shifted below all floats. The use of the word "clear" may be what is causing the residual confusion: "If necessary, implementations should clear the said element". However, applying the "clear" property would have repercussions outside the formatting context in question, which neither seems logical nor fits well with the remaining language of the specification on this point. The only remaining solution is to move the table (or other) below the float in question when not enough space is available for the two to fit next to each other. In cases where a subsequent float is encountered, and if space is again an issue, the table must be moved further down. The comments of Eli, in particular, are particularly troubling, in that he makes several egregious statements. One example would be that the spec "does not seem to allow vertically repositioning blocks" in this case. That is most evidently incorrect, cf the quote from the spec in my first comment. He furthermore contends that "In Opera 8 and IE, the block is placed next to the first float it fits next to horizontially, or below all floats if it doesn't fit next to any float", while his own following statements and his test case clearly show that the block is indeed not placed below ALL floats, but only shifted down a single float - still leaving an overlap (given circumstances) and thus clearly in violation of the spec. Only 3 rendering options that I can see have any merit whatsoever (i.e. fullfills the letter of the spec): 1. Shifting the table down one float at a time until it fits. 2. Shifting the table below ALL floats in the given block. 3. Clearing the table (by applying the clear property). There is nothing whatsoever that lends any additional weight to the second option and the third option, as noted earlier, strives against the logic and "spirit" of the remaining specification on this point. That leaves the first option as the clearly preferable option.
The original CSS2 spec really doesn't allude to it at all. Please stop posting verbose comments in the bug; we know it's a bug, adding comments will only make the bug more confusing and less likely to be fixed. (FWIW, there may need to be some differences in quirks mode.)
*** Bug 297615 has been marked as a duplicate of this bug. ***
*** Bug 303269 has been marked as a duplicate of this bug. ***
Blocks: 312372
Assignee: layout.tables → nobody
Component: Layout: Tables → Layout: Block and Inline
OS: Linux → All
QA Contact: madhur → layout.block-and-inline
Summary: table after left float is next to float even when it doesn't fit → block-level elements after left float is next to float even when it doesn't fit
Target Milestone: Future → ---
Attached file Testcase #6
Mats, I think your retitling is too broad. This behavior applies only to replaced elements, tables, and things that establish new block formatting contexts. We might need separate bugs for some of these, although I may have to fix some for bug 349255.
Summary: block-level elements after left float is next to float even when it doesn't fit → table after left float is next to float even when it doesn't fit
Whiteboard: [reflow-refactor]
Attached patch Like so?Splinter Review
This makes us compatible with IE7b2 and Opera 9 for all the cases in Testcase #6, except for a minor difference on the <fieldset>s. For the fieldsets: IE7: text overflows, the block is moved down only when size=0 Op9: text overflows, the block is moved down only when size="some small width (internal padding?)" Gecko with patch: the block is moved down before the text starts to overflow.
Attachment #240283 - Flags: review?(roc)
Comment on attachment 240283 [details] [diff] [review] Like so? I should have said also that the patch fixes all the duplicates and the listed dependent bugs.
You're clearing all floats. Do you really want to do that? Couldn't the block fit next to a narrow float further down?
For tables at least, and probably also for some replaced blocks it's much easier to fix this properly (and without multiple "retry" passes) after the reflow branch lands. I'd prefer if you either (a) wait or (b) work on it on the reflow branch (although non-block-like replaced elements still need some work in nsHTMLReflowState before the fix will work, but that work needs to happen for other reasons too).
Flags: blocking1.9?
Flags: blocking1.9? → blocking1.9-
Whiteboard: [reflow-refactor] → [wanted-1.9][reflow-refactor]
Comment on attachment 240283 [details] [diff] [review] Like so? we need a new patch per David's comment
Attachment #240283 - Flags: review?(roc)
Flags: wanted1.9+
Whiteboard: [wanted-1.9][reflow-refactor] → [reflow-refactor]
This is fixed, probably via bug 134706.
Status: NEW → RESOLVED
Closed: 21 years ago17 years ago
Resolution: --- → WORKSFORME
Flags: in-testsuite?
Attached file Is this correct?
In this tesctase, the table is right to the div, even though its 100% wide. I couldn't figure wether this is correct or not, sorry. Could you please tell me?
(In reply to comment #47) > Created an attachment (id=354076) [details] > Is this correct? > In this tesctase, the table is right to the div, even though its 100% wide. > I couldn't figure wether this is correct or not, sorry. Could you please tell > me? This looks fine to me, you said code specified 100%, so what happens, the blue square appears in the browser window, so to have a 100% width, the next piece needs to go underneath. Looks good to me.
(In reply to comment #47) > Created an attachment (id=354076) [details] > Is this correct? > In this tesctase, the table is right to the div, even though its 100% wide. > I couldn't figure wether this is correct or not, sorry. Could you please tell > me? This looks fine to me, you said code specified 100%, so what happens, the blue square appears in the browser window, so to have a 100% width, the next piece needs to go underneath. Looks good to me.
It's the difference to Opera and IE that worries me. Both put the table below the float instead of next to it. I usually "trust" Opera in such cases.
That testcase is showing a variant of bug 25888, except where we're checking something above the top pixel (perhaps due to margin collapsing). It might be worth having a separate bug on file for the block-wrapping-around-floats variants of bug 25888, though.
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: