mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-11 12:25:53 +00:00
Bug 472189. Delay attribute changes for progressmeter updates via script-runnables. r=enn,sr=roc
This commit is contained in:
parent
224321d82d
commit
1c31ed6481
@ -3086,3 +3086,22 @@ nsUnsetAttrRunnable::Run()
|
||||
{
|
||||
return mContent->UnsetAttr(kNameSpaceID_None, mAttrName, PR_TRUE);
|
||||
}
|
||||
|
||||
nsReflowFrameRunnable::nsReflowFrameRunnable(nsIFrame* aFrame,
|
||||
nsIPresShell::IntrinsicDirty aIntrinsicDirty,
|
||||
nsFrameState aBitToAdd)
|
||||
: mWeakFrame(aFrame),
|
||||
mIntrinsicDirty(aIntrinsicDirty),
|
||||
mBitToAdd(aBitToAdd)
|
||||
{
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsReflowFrameRunnable::Run()
|
||||
{
|
||||
if (mWeakFrame.IsAlive()) {
|
||||
mWeakFrame->PresContext()->PresShell()->
|
||||
FrameNeedsReflow(mWeakFrame, mIntrinsicDirty, mBitToAdd);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -59,6 +59,7 @@ class nsIFontMetrics;
|
||||
#include "nsIView.h"
|
||||
#include "nsIFrame.h"
|
||||
#include "nsThreadUtils.h"
|
||||
#include "nsIPresShell.h"
|
||||
|
||||
class nsBlockFrame;
|
||||
|
||||
@ -982,4 +983,18 @@ public:
|
||||
nsCOMPtr<nsIAtom> mAttrName;
|
||||
};
|
||||
|
||||
class nsReflowFrameRunnable : public nsRunnable
|
||||
{
|
||||
public:
|
||||
nsReflowFrameRunnable(nsIFrame* aFrame,
|
||||
nsIPresShell::IntrinsicDirty aIntrinsicDirty,
|
||||
nsFrameState aBitToAdd);
|
||||
|
||||
NS_DECL_NSIRUNNABLE
|
||||
|
||||
nsWeakFrame mWeakFrame;
|
||||
nsIPresShell::IntrinsicDirty mIntrinsicDirty;
|
||||
nsFrameState mBitToAdd;
|
||||
};
|
||||
|
||||
#endif // nsLayoutUtils_h__
|
||||
|
13
layout/xul/base/src/crashtests/472189.xul
Normal file
13
layout/xul/base/src/crashtests/472189.xul
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0"?>
|
||||
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
|
||||
<window id="yourwindow" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||
<script type="text/javascript">
|
||||
<![CDATA[
|
||||
function onload() {
|
||||
document.addEventListener("DOMAttrModified", function() {}, true);
|
||||
document.getElementById("test").setAttribute("value", "50");
|
||||
}
|
||||
]]>
|
||||
</script>
|
||||
<progressmeter id="test"/>
|
||||
</window>
|
@ -30,3 +30,4 @@ load 433296-1.xul
|
||||
load 434458-1.xul
|
||||
load 467481-1.xul
|
||||
load 470063-1.html
|
||||
load 472189.xul
|
@ -51,6 +51,7 @@
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsBoxLayoutState.h"
|
||||
#include "nsIReflowCallback.h"
|
||||
#include "nsContentUtils.h"
|
||||
//
|
||||
// NS_NewToolbarFrame
|
||||
//
|
||||
@ -154,14 +155,13 @@ nsProgressMeterFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsAutoString leftFlex, rightFlex;
|
||||
leftFlex.AppendInt(flex);
|
||||
rightFlex.AppendInt(remainder);
|
||||
nsWeakFrame weakFrame(this);
|
||||
barChild->GetContent()->SetAttr(kNameSpaceID_None, nsGkAtoms::flex, leftFlex, PR_TRUE);
|
||||
remainderContent->SetAttr(kNameSpaceID_None, nsGkAtoms::flex, rightFlex, PR_TRUE);
|
||||
|
||||
if (weakFrame.IsAlive()) {
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
nsContentUtils::AddScriptRunner(new nsSetAttrRunnable(
|
||||
barChild->GetContent(), nsGkAtoms::flex, leftFlex));
|
||||
nsContentUtils::AddScriptRunner(new nsSetAttrRunnable(
|
||||
remainderContent, nsGkAtoms::flex, rightFlex));
|
||||
nsContentUtils::AddScriptRunner(new nsReflowFrameRunnable(
|
||||
this, nsIPresShell::eTreeChange, NS_FRAME_IS_DIRTY));
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user