Closed
Bug 183899
Opened 22 years ago
Closed 10 years ago
preference changes cause layout to reflow and reflow and reflow ...
Categories
(Core :: Layout, defect, P3)
Tracking
()
RESOLVED
DUPLICATE
of bug 303987
Future
People
(Reporter: timeless, Unassigned)
References
Details
(Keywords: arch, perf)
Ok. so i did something stupid. i made a lot of maybe changes to the fonts pref panel, or maybe i only looked at the different panes, i don't think i actually changed the values, but how should i remember? i hadn't touched the prefence dialog since i opened it a few sleep cycles ago. and now my gecko is stuck reflowing a lot. because as soon as it finishes reflowing everything (for a pref which didn't matter because the font wasn't in any of my pages anyway) it gets to do it all over again for the next preference. -- this is stupid. What's happening is that each font pref change is causing a stack that looks like this: PresShell::ReconstructFrames() line 5361 + 41 bytes PresShell::SetPreferenceStyleRules(PresShell * const 0x06c1c570, int 1) line 2223 nsPresContext::PreferenceChanged(const char * 0x05428768) line 623 nsPresContext::PrefChangedCallback(const char * 0x05428768, void * 0x08276b10) line 107 pref_DoCallback(const char * 0x05428768) line 1187 + 17 bytes pref_HashPref(const char * 0x05428768, PrefValue {...}, PrefType PREF_STRING, PrefAction PREF_SETUSER) line 1073 + 9 bytes PREF_SetCharPref(const char * 0x05428768, const char * 0x0012e91c) line 551 + 17 bytes nsPrefBranch::SetCharPref(nsPrefBranch * const 0x00f44f98, const char * 0x05428768, const char * 0x0012e91c) line 230 + 13 bytes nsPrefBranch::SetComplexValue(nsPrefBranch * const 0x00f44f98, const char * 0x05428768, const nsID & {...}, nsISupports * 0x07d8ab58) line 474 + 59 bytes nsPrefService::SetComplexValue(nsPrefService * const 0x00f44f38, const char * 0x05428768, const nsID & {...}, nsISupports * 0x07d8ab58) line 57 + 42 bytes nsPref::SetUnicharPref(nsPref * const 0x00f44e60, const char * 0x05428768, const unsigned short * 0x07d4e128) line 426 + 42 bytes XPTC_InvokeByIndex(nsISupports * 0x00f44e60, unsigned int 37, unsigned int 2, nsXPTCVariant * 0x0012edd8) line 106 XPCWrappedNative::CallMethod(XPCCallContext & {...}, XPCWrappedNative::CallMode CALL_METHOD) line 2016 + 42 bytes XPC_WN_CallMethod(JSContext * 0x06697968, JSObject * 0x06501b70, unsigned int 2, long * 0x07e53dd4, long * 0x0012f07c) line 1283 + 14 bytes js_Invoke(JSContext * 0x06697968, unsigned int 2, unsigned int 0) line 839 + 23 bytes js_Interpret(JSContext * 0x06697968, long * 0x0012f998) line 2803 + 15 bytes js_Invoke(JSContext * 0x06697968, unsigned int 2, unsigned int 2) line 856 + 13 bytes js_InternalInvoke(JSContext * 0x06697968, JSObject * 0x0588e4f8, long 91142216, unsigned int 0, unsigned int 2, long * 0x07a2c7d0, long * 0x0012fac4) line 931 + 20 bytes JS_CallFunctionValue(JSContext * 0x06697968, JSObject * 0x0588e4f8, long 91142216, unsigned int 2, long * 0x07a2c7d0, long * 0x0012fac4) line 3431 + 31 bytes nsJSContext::CallEventHandler(nsJSContext * const 0x06f6ed90, void * 0x0588e4f8, void * 0x056eb848, unsigned int 2, void * 0x07a2c7d0, int * 0x0012fb5c, int 0) line 1041 + 33 bytes GlobalWindowImpl::RunTimeout(nsTimeoutImpl * 0x074b49c0) line 4625 + 84 bytes GlobalWindowImpl::TimerCallback(nsITimer * 0x07c81608, void * 0x074b49c0) line 4976 nsTimerImpl::Fire() line 367 + 17 bytes nsTimerManager::FireNextIdleTimer(nsTimerManager * const 0x014b3f90) line 595 nsAppShell::Run(nsAppShell * const 0x00f864d0) line 177 nsAppShellService::Run(nsAppShellService * const 0x00f8d728) line 472 main1(int 3, char * * 0x002844d0, nsISupports * 0x00276f08) line 1541 + 32 bytes main(int 3, char * * 0x002844d0) line 1902 + 37 bytes mainCRTStartup() line 338 + 17 bytes KERNEL32! 77e87903() And there are *lots* of them. There has to be a way for preferences to say "warning: we're about to send you a batch of preference changes, you might not want to do something complicated until we're done". + aPrefName 0x05428768 "font.name.sans-serif.th" + aPrefName 0x07958078 "font.name.cursive.th" + aPrefName 0x07016ed8 "font.name.fantasy.th" + aPrefName 0x0796fbc0 "font.name.monospace.th" + aPrefName 0x07b702f8 "font.name.cursive.he" + aPrefName 0x09d56bd8 "font.name.cursive.ar" + aPrefName 0x09d56c88 "font.name.fantasy.ar" + aPrefName 0x073b2328 "font.language.group" This is the list of prefs that changed after i spent time investigating note that at some point i got sick of doing it so i poked the code so that it cmp , 1 <- instead of cmp, 0 and jne <- instead of je that meant that i actually left the loop in a relatively timely manner. You can either batch the changes or be smart enough to ignore changes that don't actually affect a given pres context. i don't care which is done, perhaps both should be.
Comment 1•22 years ago
|
||
So... I think what we may need is for the pref observer API should have beginchange/endchange notifications....
Comment 2•22 years ago
|
||
Oh, and we should not be reconstructing the frame tree for font changes.
Depends on: 168326
Comment 3•22 years ago
|
||
Maybe we should reflow asynchronously off a reflow event?
i like that idea. we should probably revoke and reissue the event each time we get a new prefchange notification because the js processing might sleep to allow things to breathe which could allow the presshell to start reflowing before all of the pref changes happen.
Updated•22 years ago
|
Priority: -- → P3
Target Milestone: --- → Future
Updated•15 years ago
|
Assignee: layout → nobody
QA Contact: ian → layout
Comment 6•10 years ago
|
||
This was fixed in bug 303987.
Status: NEW → RESOLVED
Closed: 10 years ago
Flags: needinfo?(bzbarsky)
Resolution: --- → DUPLICATE
You need to log in
before you can comment on or make changes to this bug.
Description
•