Closed
Bug 45210
Opened 24 years ago
Closed 24 years ago
:hover and abs pos results in uneeded reflows due to stylecontext parentage being reversed
Categories
(Core :: CSS Parsing and Computation, defect, P1)
Tracking
()
VERIFIED
FIXED
M18
People
(Reporter: make, Assigned: attinasi)
References
Details
(Keywords: css2, perf, testcase, Whiteboard: [nsbeta3+][PDTP3])
Attachments
(2 files)
From Bugzilla Helper:
User-Agent: Mozilla/4.73 [en] (WinNT; U)
BuildID: 20000071108
This report probably shows two different bugs. Not sure. Please read on. The
attached testcase shows the definition of an incomplete CSS border shorthand
(missing color) with an hover selector. IMHO this construct is parsed/applied in
the wrong way.
Reproducible: Always
Steps to Reproduce:
0. Close Mozilla and restart it!
1. Load the attached testcase
(2. you may run into bug 45209, incorrect layout)
3. Move the mouse across the browser window and notice the effects.
Actual Results: 4. Suddenly, the images/the document will be reflowed. (This is
caused from the hover selector, I assume.
5. Maybe - I'm not definetly sure - the effect also occurs if the mouse is moved
over an unrelated element (f.e. the H1/H3 tags). I don't know enough about the
propagation of :hover in this szenario.
Expected Results: a) Initial layout as described under #45209
b1) The selector should (IMHO) select only IMG elements (if any).
b2) The imcomplete shorthand should be either ignored or parsed into a no-border
style
b3) All elements in the parent chain of all IMGs have an initial (complete)
no-border style, ie. border:0px solid black.
b1+b2+b3) There should not be any reflow, because changing from no-border to
no-border should be a visual no-op.
This bug may be restricted to standard mode.
This bug may be related to #45209 - using tables with position:absolute makes
things definetly worse - but has also aspects which are unrelated to #45209.
Reporter | ||
Comment 1•24 years ago
|
||
Changed component - sorry.
Reporter | ||
Comment 2•24 years ago
|
||
Comment 3•24 years ago
|
||
This has nothing to do with borders. I modified the testcase to not mention
borders anywhere, and to not apply the :hover to IMG elements, and the problem
is still present.
I will attach a simpler test case.
Severity: normal → major
Keywords: correctness,
nsbeta3
Summary: Incomplete CSS shorthands (border) not interpreted correctly → :hover and abs pos results in uneeded reflows
Comment 4•24 years ago
|
||
Comment 5•24 years ago
|
||
To reproduce: Hover over the text in the latest attachement.
Results: Strange reflows in the absolutely positioned table.
Expected Results: The :hover rule should have NO effect, since it refers to
nonexistant elements.
Tested on Mozilla 2000072008 build.
Comment 6•24 years ago
|
||
:hover and abs pos are CSS2, not CSS1.
Assignee | ||
Comment 7•24 years ago
|
||
I reduced the tescase further: I removed everything but the abs. pos. table and
it flashes when I hover over the table, click on the body, or mouse-into the
body (using Viewer). I'll see what is happening in SelectorMatches because, as
Ian mentioned, the selector should match nothing.
Assignee | ||
Comment 8•24 years ago
|
||
This may be one of the cases where having the style context parentage out of
synch with the frame parentage is causing grief.
When FrameManager::ReResolveStyleContext is called for the TableOuterFrame
content node, it is calling aPresContext->ResolveStyleContextFor on the
TableOuterFrame but is passing in the parent style context of the parent frame,
in this case the Body element. However, the parent style context for the
TableOuterFrame's context is the TableInnerFrame's context, not the Body
element's context, so when CaptureChange is called to compare the old and new
contexts, if returnes out REFRAME and the frametree gets rebuilt.
Given this particular code path, it appears that there are at least some serious
performance impacts to not having the style tree match the frame tree - Could
CaptureChange also err the other side and indicate less change than is really
required because the context of the parent causes the child's new context to be
closer to what it was then what it really should be? This looks like it could be
illustrative of potential problems with other frames who's style context
heirarcies do not match the frame tree's heirarchy (like several XBL frames).
CC'ing Hyatt since we hav been discussing this issue in the context of another
problem.
Excellent find, Matthias - thanks for reporting this, and thanks to whoever CC'd
me on it.
Comment 10•24 years ago
|
||
As per meeting with ChrisD today, taking QA.
QA Contact: desale → py8ieh=bugzilla
Assignee | ||
Comment 11•24 years ago
|
||
Critical for beta3: problems with reframing when style is re-resolved due to the
inverse relationship of the stylecontext in relation to the corresponding
frames.
Status: NEW → ASSIGNED
Whiteboard: [nsbeta3+]
Assignee | ||
Updated•24 years ago
|
Priority: P3 → P1
Summary: :hover and abs pos results in uneeded reflows → :hover and abs pos results in uneeded reflows due to stylecontext parentage being reversed
Assignee | ||
Comment 12•24 years ago
|
||
Chris, it may be possible to get the style system to support style context
parentage that is mismatched to the frame parentage: if style can call into a
frame ask it for the parent-context, then it can use that parent context instead
of the parent frame's context. If the frame chooses not to provide this
parent-context then style will do what it does now, which is just use the parent
frame's context. This can thus be implemented as a new method in nsIFrame and a
default implementation can be created to return NULL, whereas the table frames
can return the correct parent context.
Style code wil have to change in ReResolveStyle where it walks the frame tree
resolving style changes, but I think the change will be small. We need to talk
it over to make sure we want to do this first, and of course if changing the
table code is easier then that would be better.
Assignee | ||
Updated•24 years ago
|
Target Milestone: --- → M18
Comment 13•24 years ago
|
||
How easy is it to workaround or avoid this problem?
Assignee | ||
Comment 14•24 years ago
|
||
I don't know of any way to 'workaround' this problem, other than avoiding the
use of tables in web sites (which is clearly not a viable option).
Comment 15•24 years ago
|
||
Tested using the following builds:
Win: 08_30_04_m18
Mac: 08_30_08_m18
Linux: 08_30_04_m18
Using Ian's testcase from 7/21, crashed on Win and Linux after hovering.
Talkback incident #16599830. Details:
1. Open page
2. Hover over lines/images
3. Crash with following details:
NETSCP6 caused an invalid page fault in module <unknown> at 00de:00000017.
Registers: EAX=0fb6d3f0 CS=0177 EIP=00000017 EFLGS=00010207 EBX=00000000 SS=017f
ESP=0068f760
Call Stack: (Signature = 0x00000017 92161e36)
0x00000017
nsView::HandleEvent
[d:\builds\seamonkey\mozilla\view\src\nsView.cpp, line 329]
nsView::HandleEvent
[d:\builds\seamonkey\mozilla\view\src\nsView.cpp, line 346]
nsViewManager2::DispatchEvent
[d:\builds\seamonkey\mozilla\view\src\nsViewManager2.cpp, line 1429]
HandleEvent
[d:\builds\seamonkey\mozilla\view\src\nsView.cpp, line 68]
nsWindow::DispatchEvent
[d:\builds\seamonkey\mozilla\widget\src\windows\nsWindow.cpp, line 618]
nsWindow::DispatchWindowEvent
[d:\builds\seamonkey\mozilla\widget\src\windows\nsWindow.cpp, line 635]
nsWindow::DispatchMouseEvent
[d:\builds\seamonkey\mozilla\widget\src\windows\nsWindow.cpp, line 3812]
ChildWindow::DispatchMouseEvent
[d:\builds\seamonkey\mozilla\widget\src\windows\nsWindow.cpp, line 4020]
nsWindow::ProcessMessage
[d:\builds\seamonkey\mozilla\widget\src\windows\nsWindow.cpp, line 2909]
nsWindow::WindowProc
[d:\builds\seamonkey\mozilla\widget\src\windows\nsWindow.cpp, line 884]
KERNEL32.DLL + 0x363b
(0xbff7363b)
KERNEL32.DLL + 0x242e7
(0xbff942e7)
0x00688b3e
Comment 16•24 years ago
|
||
Maybe retry using an 8-31 build? A major crash in nsView::HandleEvent was fixed
on 8-30.
Comment 17•24 years ago
|
||
Marc, I'm giving this back to you since I think it will be easier to change the
style code than the table code. I tried doing the parentage the other way in
tables and ran into problems which I can't seem to recall. We need to discuss
this further.
Assignee: karnaze → attinasi
Status: ASSIGNED → NEW
Comment 18•24 years ago
|
||
Tested on Win 98 with 8/31/12 build and no crash. Will try on Linux tomorrow but
as David indicated, the problem went away with a new build.
Comment 19•24 years ago
|
||
PDT thinks this sounds like a P3, as long as it doesn't crash (which it doesn't
today)
Priority: P1 → P3
Whiteboard: [nsbeta3+] → [nsbeta3+][PDTP3]
Assignee | ||
Updated•24 years ago
|
Status: NEW → ASSIGNED
Assignee | ||
Comment 20•24 years ago
|
||
Setting priority to P1 (leaving PDTP3 alone for PDT use).
There is a related problem with HTMLButtonControlFrame children having the wrong
parent style contexts. This needs to be fixed along with this bug I think, to
avoid the same problem there.
Priority: P3 → P1
Assignee | ||
Comment 21•24 years ago
|
||
Fixed. This required changes to: nsIFrame.h, nsFrame.h, nsFrame.cpp,
nsFrameManager.cpp, nsTableFrame.h, nsTableFrame.cpp, nsTableOuterFrame.h,
nsTableOuterFrame.cpp, and nsHTMLButtonControlFrame.cpp
Status: ASSIGNED → RESOLVED
Closed: 24 years ago
Resolution: --- → FIXED
Isn't similar work done to enable the .offsetParent DOM property?
Assignee | ||
Comment 23•24 years ago
|
||
Jonas, I'm not sure what you are refering to - can you point me to something
more specific to look at please? I'm guessing that you mean that some DOM code
is making assumptions about the frame tree matching the style tree? Thanks.
Comment 24•24 years ago
|
||
VERIFIED FIXED on Windows 2000 Commercial Build 2000091308 and Linux Commercial
Build 2000091312 using second testcase.
Status: RESOLVED → VERIFIED
You need to log in
before you can comment on or make changes to this bug.
Description
•