Closed Bug 147558 Opened 22 years ago Closed 19 years ago

{inc} Moving form elements (button moves when clicked)

Categories

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

defect

Tracking

()

RESOLVED FIXED
Future

People

(Reporter: brian, Unassigned)

References

()

Details

(Keywords: testcase)

Attachments

(6 files, 5 obsolete files)

I was browsing around the mozilla.org site, when I got to:
http://tegu.mozilla.org/graph/multiquery.cgi?&testname=startup
When clicking the submit button, it is moved to the line below, and the 'click'
is never performed.

Using RC2.
fixed URL, having duplicate http:// line.
Sorry for spam.
Bug is same in RC3 on Linux.  This doesn't seem to go away by fixing simple html
syntax errors (such as missing body, head, etc, however, the Submit button is
incorrect code.  <input type="submit" value="submit"> is the Correct submit code.

<input TYPE="button" VALUE="Submit" onClick="scrape_for_names()"> is the code
used in this document to submit.  Notice the incorrect type.  Fixing the type to
submit doesn't fix the "skip" bug though.
Attached file testcase (obsolete) —
Testcase.

Please set status whiteboard to testcase.

Note: Placing <form> inside <ul> is not valid HTML 4 but I'm guessing this is
still a bug.
Attachment #85298 - Attachment is obsolete: true
Attached file testcase
Improved (correct) testcase.
->testcase
Keywords: testcase
Status: UNCONFIRMED → NEW
Ever confirmed: true
The reason the "click is never performed" is that the form button has moved so
that the mouse pointer is no longer over it when the button is released.  To
observe this:  press down the mouse over the form submit button (but don't let
go); then if the submit button jumps around, move the mouse pointer back over it
before releasing the mouse button.

Workarounds I have found:
1) Refrain from nesting forms in a list nested in a table.
2) Specify a width for any of the elements enclosing the form (for example,
<table width=250>, or <li style="width: 250px">, etc.).
3) Include enough text somewhere in the li/ul to cause line-wrap.
4) Add onMouseDown="return false;" to the input element.  This is the most
interesting one, because onMouseDown="return true;" does not work as a
workaround, suggesting that the layout shake-up happens after the onMouseDown
event falls through per usual.  But it does work when we interrupt things with
an alert box -- onMouseDown="alert(''); return true;".  Not sure what all this
means.

I don't think this bug is really about "moving form elements" (form elements
jumping around), or about missing click events.  The test case makes it easy to
narrow down the problem to a form nested in a table nested in a list. 
Furthermore, it is clear to me that the bug is not that things move around
arbitrarily, but rather that there is some change in the width of the form's
enclosing elements resulting in a reflow that makes it appear as though there
are "moving form elements."  Note that the button isn't always the thing to jump
around; it depends on where you position extra text within the ul/li that
encloses the form (for example, try putting text after the button within the
enclosing li or ul).  I would summarize what I observe this way:  "form width
shrinks on mousedown for input type=button|submit|reset|file when form is nested
in list nested in table."
I observe this behavior on daily build 2002052508, Win98.  I hope all this
helps.  Perhaps someone has something to add to these observations.
Changing QA Contact
QA Contact: petersen → amar
Reassigning to karnaze
Assignee: attinasi → karnaze
Priority: -- → P3
Target Milestone: --- → Future
mass reassign to default owner
Assignee: karnaze → table
Component: Layout → Layout: Tables
QA Contact: amar → madhur
Target Milestone: Future → ---
Target Milestone: --- → Future
*** Bug 187568 has been marked as a duplicate of this bug. ***
This also happens on www.funcomeunity.de with latest mozilla from trunk on Linux
OS: Windows 2000 → All
*** Bug 252884 has been marked as a duplicate of this bug. ***
Blocks: 195770, 237159
Summary: Moving form elements → Moving form elements (button moves when clicked)
         button 024EC9A0 d=756,264 me=756
         text 024ECC7C r=2 a=0,UC c=UC,UC cnt=927
         text 024ECC7C d=0,0 me=0
        block 024EC72C d=1656,264 me=756 m=1656
       block 024EC594 d=2136,264 me=1236 m=1656    <<<<<<<<<<<<<<<<<<
      block 024EC10C d=2136,456 me=1236 m=1656
     cell 024EC0AC d=2160,480 me=1260 m=1680

This is a block reflow issue. The block does not update correctly the
mMaximumWidth ( The maximum width that the frame would consume if it were
reflowed with an unconstrained available width. ref. Waterson
http://www.mozilla.org/newlayout/doc/block-and-line.html) during incr. reflow.
I don't believe that the mMaximumWidth could ever be smaller than line->Xmost in
an unconstrained block.
Assignee: core.layout.tables → nobody
Component: Layout: Tables → Layout: Block and Inline
QA Contact: madhur → core.layout.block-and-inline
Summary: Moving form elements (button moves when clicked) → {incr} Moving form elements (button moves when clicked)
Attached patch patch (obsolete) — Splinter Review
Assignee: nobody → bernd_mozilla
Status: NEW → ASSIGNED
Comment on attachment 156862 [details] [diff] [review]
patch

the patch has passed the rtest, so doing the the correct thing should be fine.
Attachment #156862 - Flags: superreview?
Attachment #156862 - Flags: review?
Attachment #156862 - Flags: superreview?(dbaron)
Attachment #156862 - Flags: superreview?
Attachment #156862 - Flags: review?(dbaron)
Attachment #156862 - Flags: review?
I need to check what coordinate space nsLineBox::mBounds is in. 
nsBlockFrame::ReflowLine and PostPlaceLine both do:

    aLine->mMaximumWidth = aLine->mBounds.XMost();

I think that needs to subtract the left border and padding, but I'm not sure.
In other words, does this patch cause a regression on attachment 85310 [details] with the
form element removed?
Yes, it does cause a regression. Not a visible one without borders, but it
reports a too large mMaxWidth (it is just by borderpadding.left too large)
during the incr. reflow, this will give a too large table, which does not
tightly wrap the input.
Attached patch another attemptSplinter Review
Somewhere the offset needs to be added. I can not claim that I know block
reflow good enough to know where this place is. This place now fixes the
testcase and does not regress as the other patch the scenario that David
described. Both patches have passed the rtest (so far for the meaning of rtests
:-() I will stop this buisiness now, somewhere in the maximumWidth computation
is a bug, that the xOffset is not taken into account.
Attachment #156862 - Attachment is obsolete: true
Attachment #156862 - Flags: superreview?(dbaron)
Attachment #156862 - Flags: review?(dbaron)
Assignee: bernd_mozilla → nobody
Status: ASSIGNED → NEW
No longer blocks: 237159
Attached patch other patch (obsolete) — Splinter Review
Please refer to the following two functions, nsTableRowFrame::ReflowChildren
and nsTableRowFrame::IR_TargetIsChild. With the initial reflow, maxWidth is set
to the MaximumWidth of the cellFrame. I think that with the incremental reflow,
cellMet.width should be set.

nsTableRowFrame::ReflowChildren(
	  ...
	  rv = ReflowChild(kidFrame, aPresContext, desiredSize, kidReflowState,

			   x, 0, 0, status);

	  if (cellToWatch) { 
	    nscoord maxWidth = (NS_UNCONSTRAINEDSIZE == availCellWidth) 
				? desiredSize.width :
desiredSize.mMaximumWidth;
	    // save the max element width and max width
	    if (desiredSize.mComputeMEW) {
	      cellFrame->SetPass1MaxElementWidth(desiredSize.width,
desiredSize.mMaxElementWidth);
	  ...
	    // save the max element width and max width
	    cellFrame->SetMaximumWidth(maxWidth);
	  }

nsTableRowFrame::IR_TargetIsChild(
    ...
    rv = ReflowChild(aNextFrame, aPresContext, cellMet, kidRS,
		     cellOrigin.x, 0, 0, aStatus);
    ...    
    // cache the max-elem and maximum widths
    cellFrame->SetPass1MaxElementWidth(cellMet.width,
cellMet.mMaxElementWidth);
    cellFrame->SetMaximumWidth(cellMet.mMaximumWidth);
Comment on attachment 165708 [details] [diff] [review]
other patch

Sorry, this patch is wrong since a table cell spreads unexpectedly.
Attachment #165708 - Attachment is obsolete: true
Attached patch other patch (obsolete) — Splinter Review
I think that a width of the indent is added to both mMaxElementWidth and
mMaximumWidth, if the value of mSpace.x means a width of the indent.
Blocks: 189367
Attached patch patch (obsolete) — Splinter Review
In the initial reflow, it is not requested to compute the maximum width.
In the incremental reflow, the computed maximum width does not include the
x-position rect in the space manager. I think that the maximum x-most of each
line should be computed.
Attachment #165805 - Attachment is obsolete: true
Attachment #182370 - Flags: review?(bernd_mozilla)
I should not review this, see comment #19. But before you ask roc, please
describe what sort of testing this patch got. The regression is a required
minimum but not sufficient to declare the patch correct.
Attachment #182370 - Flags: review?(bernd_mozilla)
Attached file testcase2
I tested using the test case. The list item's margin in the second table has
percentage value. The testing is a click and text zoom. I checked that there
was no change in table size.
s/the regression is/the regression testing/

see http://www.mozilla.org/newlayout/doc/regression_tests.html
Summary: {incr} Moving form elements (button moves when clicked) → {inc} Moving form elements (button moves when clicked)
See Bug 269643 - When clicking link, page redraws with different layout, click
is ignored  

This shows a very similar problem but no form, button or list are involved. 
Just nested tables.
Blocks: 291759
Attached patch patchSplinter Review
I think that influence is smaller than previous patch, although the value of
availSpace.x is set to mSpace.x.
Attachment #182370 - Attachment is obsolete: true
Attachment #185958 - Flags: review?(roc)
Comment on attachment 185958 [details] [diff] [review]
patch

Looks good.

Please add a comment here mentioning that line->mMaximumWidth includes the left
border/padding of this block, but not the right.

At nsBlockFrame.cpp line 1457 or thereabouts, dbaron wrote "	  // XXXldb Why
right and not left?" ... Replace that with a comment mentioning that the reflow
state mMaximumWidth includes the left border/padding but not the right.

Put similar comments where those variable are declared in nsBlockReflowState.h
and nsLineBox.h.

Thanks!
Attachment #185958 - Flags: superreview+
Attachment #185958 - Flags: review?(roc)
Attachment #185958 - Flags: review+
Comment on attachment 185958 [details] [diff] [review]
patch

I think that this patch is low-risk. To prevet the line from breaking or the
elements from moving, the left border/padding of the nested blocks is added to
the maximum width in the line box.
Attachment #185958 - Flags: approval1.8b3?
I added roc's comments to the attachment 185958 [details] [diff] [review].
Attachment #185958 - Flags: approval1.8b3? → approval1.8b3+
roc, is the attachment 186485 [details] [diff] [review] OK? if it is so, could you check in to the trunk?
masayuki, attachment 185958 [details] [diff] [review] was approved for 1.8b3. However, I ask to check in
attachment 186485 [details] [diff] [review]. Could you check in to the trunk? and please check Bug 291759.
Hardware: PC → All
checked in. Thanks Hideo, the update is great.
Status: NEW → RESOLVED
Closed: 19 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: