Bug 472189. Delay attribute changes for progressmeter updates via script-runnables. r=enn,sr=roc

This commit is contained in:
Nickolay Ponomarev 2009-01-19 22:29:48 +13:00
parent 7c7e1bfe9e
commit dc72b9cc31
5 changed files with 55 additions and 7 deletions

View File

@ -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;
}

View File

@ -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__

View 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>

View File

@ -30,3 +30,4 @@ load 433296-1.xul
load 434458-1.xul
load 467481-1.xul
load 470063-1.html
load 472189.xul

View File

@ -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;
}