Closed
Bug 142635
Opened 22 years ago
Closed 17 years ago
Painting suppression doesn't unsuppress correctly
Categories
(Core :: Layout, defect, P2)
Core
Layout
Tracking
()
RESOLVED
INCOMPLETE
mozilla1.3alpha
People
(Reporter: jesup, Assigned: jesup)
References
(Blocks 1 open bug)
Details
(Keywords: perf, Whiteboard: [whitebox])
Attachments
(1 file)
764 bytes,
patch
|
Details | Diff | Splinter Review |
This is a spinoff of bug 110106, hyatt's "Investigate Win32-only paint suppression weirdness" bug. Sam Emrick posted a 1-liner patch that makes it actually unsuppress when it's supposed to. (discussed in n.p.m.performance) Patchto be attached.
Assignee | ||
Updated•22 years ago
|
Assignee | ||
Comment 1•22 years ago
|
||
Patch from 110106 as a patch, against branch. r/sr=? Looks like a pretty obvious "oops" patch.
Hmm. So, the only thing cv->Show() should do is call mWindow->Show(), which should make the widgets shown. Then just below we do set mPaintingSuppressed to false, and then invalidate the root frame. So I'm guessing: * ShowWindow on Windows is causing a paint, perhaps even synchronously, but that paint doesn't work if |mPaintingSuppressed| is still set. * The Invalidate just below is causing a much later paint (thanks to delayed paint event prioritization on Windows) * This patch seems like it might start causing double-paints, which are a performance hit. Maybe we should instead be doing the Invalidate before the cv->Show() ?
Has anybody investigated dbaron's thought-proviking questions?
pros/cons: since 'perception' is more important in this situation (win32-only),
the (one-off) double paint isn't too critical IMO, compared to the uncertainties
of the pandora box when trying to change the semantics at the last minute.
Of course doing the analysis is better (emrick?) even if it is just to improve
the understanding. But to improve the 'perception', I will go for the risk of
the (one-off) double-paint if the analysis is lacking.
To keep it in context, here is the initial n.p.m.performance post:
Sam Emrick wrote:
>
> I've investigated a problem that Ivan Eisen is seeing/reporting regarding
> instances of very long times for the initial paint of large/long documents.
> On Windows NT, the problem further seen by lockup of gui responsiveness for
> long periods in document load.
>
> The source of the problem is such. In layout\html\base\src\nsPresShell.cpp
> implements mPaintSuppressionTimer, with intent to supress initial painting
> of large docuements for a while, default 1200 ms. The timer itself is
> working okay, but the handling of the timer timeout is a bit broken. In
> PresShell::UnsuppressAndInvalidate() is a path leading to cv->Show(); The
> Show() leads to a reflow which should perform the paint. However, it
> doesn't because mPaintingSuppressed = PR_FALSE; hasn't been set yet. The
> mPaintingSuppressed = PR_FALSE needs to be set before the call to Show().
> When changed such, then the initial paint delay time is mush more closely
> honored.
> Sam
> PresShell::UnsuppressAndInvalidate() is a path leading to cv->Show(); The > Show() leads to a reflow which should perform the paint. This isn't entirely correct (but it is beside the point). Had a look and there is no further reflow at that stage. cv->Show(), i.e. DocumentViewerImpl::Show(), leads directly to paint (and although I didn't see it, admittedly there might be early returns in the paints because they test for mPaintingSuppressed in the presShell and bail out -- but in the adjacent chunk of code to cv->Show(), paint-suppression is cleared before doing the Invalidate). > Maybe we should instead be doing the Invalidate before the cv->Show() ? Seems to lead to the same effect as emrick's patch since Invalidate() will be done after enabling paint. The current code is doing: /* as dabron noted, perhaps the paint from cv->Show() is synchronous and might fire before the next statement */ cv->Show(); mPaintingSuppressed = PR_FALSE; rootFrame->Invalidate(); emrick's change is to do: mPaintingSuppressed = PR_FALSE; cv->Show(); rootFrame->Invalidate(); and inverting will just do: mPaintingSuppressed = PR_FALSE; rootFrame->Invalidate(); cv->Show(); (BTW, what's the rationale of further delaying the paint over there, i.e., Invalidate(.../*aImmediate=*/PR_FALSE)?)
Updated•22 years ago
|
Priority: P3 → P2
Comment 6•22 years ago
|
||
Targeting this one 1.1Beta
Keywords: mozilla1.0 → mozilla1.1
Target Milestone: mozilla1.0 → mozilla1.1beta
Updated•22 years ago
|
Keywords: mozilla1.2
Updated•22 years ago
|
Comment 7•22 years ago
|
||
Moving TM to some more realistic target.
Target Milestone: mozilla1.1beta → mozilla1.3alpha
Updated•22 years ago
|
Whiteboard: [whitebox]
Is this still needed with Cairo? And how do patches get noticed, by a keyword?
We don't have a testcase here. I suggest we close this as RESOLVED INCOMPLETE.
Status: NEW → RESOLVED
Closed: 17 years ago
Resolution: --- → INCOMPLETE
You need to log in
before you can comment on or make changes to this bug.
Description
•