Don't run XBL constructors during frame construction, ever. Bug 398006,

r=sicking, sr=roc
This commit is contained in:
bzbarsky%mit.edu 2007-10-19 03:51:16 +00:00
Родитель b952e27f49
Коммит 11ca9b18e5
2 изменённых файлов: 18 добавлений и 1 удалений

Просмотреть файл

@ -7009,8 +7009,13 @@ nsElementSH::PostCreate(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
} }
if (binding) { if (binding) {
// Make sure the presshell is in a state where it's safe to execute script
PRBool safeToRunScript = PR_FALSE;
pctx->PresShell()->IsSafeToFlush(safeToRunScript);
if (safeToRunScript) {
binding->ExecuteAttachedHandler(); binding->ExecuteAttachedHandler();
} }
}
return NS_OK; return NS_OK;
} }

Просмотреть файл

@ -3332,7 +3332,11 @@ PresShell::RecreateFramesFor(nsIContent* aContent)
nsStyleChangeList changeList; nsStyleChangeList changeList;
changeList.AppendChange(nsnull, aContent, nsChangeHint_ReconstructFrame); changeList.AppendChange(nsnull, aContent, nsChangeHint_ReconstructFrame);
// Mark ourselves as not safe to flush while we're doing frame construction.
++mChangeNestCount;
nsresult rv = mFrameConstructor->ProcessRestyledFrames(changeList); nsresult rv = mFrameConstructor->ProcessRestyledFrames(changeList);
--mChangeNestCount;
mViewManager->EndUpdateViewBatch(NS_VMREFRESH_NO_SYNC); mViewManager->EndUpdateViewBatch(NS_VMREFRESH_NO_SYNC);
#ifdef ACCESSIBILITY #ifdef ACCESSIBILITY
InvalidateAccessibleSubtree(aContent); InvalidateAccessibleSubtree(aContent);
@ -6031,6 +6035,10 @@ PresShell::DidCauseReflow()
if (--mChangeNestCount == 0) { if (--mChangeNestCount == 0) {
// We may have had more reflow commands appended to the queue during // We may have had more reflow commands appended to the queue during
// our reflow. Make sure these get processed at some point. // our reflow. Make sure these get processed at some point.
// XXXbz why is this really needed? ProcessReflowCommands handles posting
// reflow events if there are reflow roots remaining, and FrameNeedsReflow
// posts events as needed as well. I think we should remove this.
PostReflowEvent(); PostReflowEvent();
} }
@ -6375,7 +6383,11 @@ PresShell::Observe(nsISupports* aSubject,
nsStyleChangeList changeList; nsStyleChangeList changeList;
WalkFramesThroughPlaceholders(mPresContext, rootFrame, WalkFramesThroughPlaceholders(mPresContext, rootFrame,
ReframeImageBoxes, &changeList); ReframeImageBoxes, &changeList);
// Mark ourselves as not safe to flush while we're doing frame
// construction.
++mChangeNestCount;
mFrameConstructor->ProcessRestyledFrames(changeList); mFrameConstructor->ProcessRestyledFrames(changeList);
--mChangeNestCount;
mViewManager->EndUpdateViewBatch(NS_VMREFRESH_NO_SYNC); mViewManager->EndUpdateViewBatch(NS_VMREFRESH_NO_SYNC);
#ifdef ACCESSIBILITY #ifdef ACCESSIBILITY