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