From f0069ea30f992569c3e243ecb6f075eab0df02b1 Mon Sep 17 00:00:00 2001 From: "aaronr%us.ibm.com" Date: Thu, 26 Apr 2007 00:17:57 +0000 Subject: [PATCH] [XForms] fix deferred events. Bug 378702, r=surkov+olli git-svn-id: svn://10.0.0.236/trunk@225055 18797224-902f-48f8-a5cc-f745e15eee43 --- .../xforms/nsXFormsActionElement.cpp | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/mozilla/extensions/xforms/nsXFormsActionElement.cpp b/mozilla/extensions/xforms/nsXFormsActionElement.cpp index 6e64d4a0261..9e10594f711 100644 --- a/mozilla/extensions/xforms/nsXFormsActionElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsActionElement.cpp @@ -140,8 +140,8 @@ PR_STATIC_CALLBACK(PLDHashOperator) DoDeferredActions(nsISupports * aModel, void * data) { if (aModel && aDeferred) { - nsCOMPtr model = - NS_STATIC_CAST(nsIModelElementPrivate*, aModel); + nsCOMPtr model(do_QueryInterface(aModel)); + if (aDeferred & DEFERRED_REBUILD) model->RequestRebuild(); if (aDeferred & DEFERRED_RECALCULATE) @@ -228,13 +228,19 @@ nsXFormsActionElement::SetRecalculate(nsIModelElementPrivate* aModel, } PRUint32 deferred = 0; - mDeferredUpdates.Get(aModel, &deferred); + + // It is possible that QI's to an interface that isn't nsISupports (like + // nsIModelElementPrivate) could produce different values even from the same + // model element. So we'll convert the model to nsISupports before querying + // it or storing it via hashtable. + nsCOMPtr temp(do_QueryInterface(aModel)); + mDeferredUpdates.Get(temp, &deferred); if (aEnable) { deferred |= DEFERRED_RECALCULATE; } else { deferred &= ~DEFERRED_RECALCULATE; } - mDeferredUpdates.Put(aModel, deferred); + mDeferredUpdates.Put(temp, deferred); return NS_OK; } @@ -247,13 +253,19 @@ nsXFormsActionElement::SetRevalidate(nsIModelElementPrivate* aModel, } PRUint32 deferred = 0; - mDeferredUpdates.Get(aModel, &deferred); + + // It is possible that QI's to an interface that isn't nsISupports (like + // nsIModelElementPrivate) could produce different values even from the same + // model element. So we'll convert the model to nsISupports before querying + // it or storing it via hashtable. + nsCOMPtr temp(do_QueryInterface(aModel)); + mDeferredUpdates.Get(temp, &deferred); if (aEnable) { deferred |= DEFERRED_REVALIDATE; } else { deferred &= ~DEFERRED_REVALIDATE; } - mDeferredUpdates.Put(aModel, deferred); + mDeferredUpdates.Put(temp, deferred); return NS_OK; } @@ -266,13 +278,19 @@ nsXFormsActionElement::SetRefresh(nsIModelElementPrivate* aModel, } PRUint32 deferred = 0; - mDeferredUpdates.Get(aModel, &deferred); + + // It is possible that QI's to an interface that isn't nsISupports (like + // nsIModelElementPrivate) could produce different values even from the same + // model element. So we'll convert the model to nsISupports before querying + // it or storing it via hashtable. + nsCOMPtr temp(do_QueryInterface(aModel)); + mDeferredUpdates.Get(temp, &deferred); if (aEnable) { deferred |= DEFERRED_REFRESH; } else { deferred &= ~DEFERRED_REFRESH; } - mDeferredUpdates.Put(aModel, deferred); + mDeferredUpdates.Put(temp, deferred); return NS_OK; }