From 00289ede87e90ecb47360441d3d6648ef760f856 Mon Sep 17 00:00:00 2001 From: "allan%beaufour.dk" Date: Mon, 22 May 2006 08:51:06 +0000 Subject: [PATCH] [XForms] Make recalculate, revalidate, refresh work as deferred update. Bug 300591, r=smaug+aaronr git-svn-id: svn://10.0.0.236/trunk@198143 18797224-902f-48f8-a5cc-f745e15eee43 --- .../xforms/nsIModelElementPrivate.idl | 63 ++++++-- .../xforms/nsIXFormsActionElement.idl | 12 +- .../extensions/xforms/nsXFormsAccessors.cpp | 21 +-- .../xforms/nsXFormsActionElement.cpp | 23 +-- .../xforms/nsXFormsDelegateStub.cpp | 14 +- .../xforms/nsXFormsInsertDeleteElement.cpp | 22 +-- .../extensions/xforms/nsXFormsMDGEngine.cpp | 138 ++++++---------- mozilla/extensions/xforms/nsXFormsMDGEngine.h | 21 ++- .../xforms/nsXFormsModelElement.cpp | 148 +++++++++++++++--- .../extensions/xforms/nsXFormsModelElement.h | 72 +++++++-- .../xforms/nsXFormsRebuildElement.cpp | 15 +- .../xforms/nsXFormsRecalculateElement.cpp | 13 +- .../xforms/nsXFormsRefreshElement.cpp | 15 +- .../xforms/nsXFormsResetElement.cpp | 16 +- .../xforms/nsXFormsRevalidateElement.cpp | 15 +- .../xforms/nsXFormsSetValueElement.cpp | 18 +-- .../xforms/nsXFormsUploadElement.cpp | 46 +++--- mozilla/extensions/xforms/nsXFormsUtils.cpp | 119 -------------- mozilla/extensions/xforms/nsXFormsUtils.h | 15 -- .../resources/locale/en-US/xforms.properties | 1 + 20 files changed, 379 insertions(+), 428 deletions(-) diff --git a/mozilla/extensions/xforms/nsIModelElementPrivate.idl b/mozilla/extensions/xforms/nsIModelElementPrivate.idl index ec877662f13..1f0498dbe95 100644 --- a/mozilla/extensions/xforms/nsIModelElementPrivate.idl +++ b/mozilla/extensions/xforms/nsIModelElementPrivate.idl @@ -47,7 +47,7 @@ interface nsIDOMNode; * Private interface implemented by the model element for other * elements to use. */ -[uuid(d84caeb1-355f-48ff-9180-a45d8352d26a)] +[uuid(3efcd516-387a-4d8b-bbeb-2fcc9a930814)] interface nsIModelElementPrivate : nsIXFormsModelElement { /** @@ -88,28 +88,35 @@ interface nsIModelElementPrivate : nsIXFormsModelElement /** * Set the value of an instance node. + * + * If doRefresh is true, the function will request xforms-recalculate, + * xforms-revalidate, and xforms-refresh to be dispatched to the model. + * + * @param instanceNode The node to set the value for + * @param nodeValue The value to set + * @param doRefresh Request value-changed event sequence + * @param nodeChanged Return whether the node was actually changed */ - void setNodeValue(in nsIDOMNode contextNode, + void setNodeValue(in nsIDOMNode instanceNode, in AString nodeValue, + in boolean doRefresh, out boolean nodeChanged); - /** - * Get the value of an instance node. - */ - void getNodeValue(in nsIDOMNode contextNode, - out AString nodeValue); - /** * Insert a set of nodes underneath an instance node. - * @param aContextNode The instance node - * @param aNodeContent Node that holds the contents to insert under + * + * If doRebuild is true, the function will request + * xforms-rebuild, xforms-recalculate, xforms-revalidate, and + * xforms-refresh to be dispatched to the model. + * + * @param node The instance node + * @param content Node that holds the contents to insert under * the instance node - * @param aNodeChanged Indicates whether the contents of the instance - * node really did change due to this action + * @param doRebuild Request rebuild event sequence */ - void setNodeContent(in nsIDOMNode aContextNode, - in nsIDOMNode aNodeContent, - out boolean aNodeChanged); + void setNodeContent(in nsIDOMNode node, + in nsIDOMNode content, + in boolean doRebuild); /** * Validates the instance node against the schemas loaded by the model. @@ -161,7 +168,7 @@ interface nsIModelElementPrivate : nsIXFormsModelElement * @param aType The type of the node * @param aNSURI The namespace of the type */ - void GetTypeFromNode(in nsIDOMNode aInstanceData, out AString aType, + void getTypeFromNode(in nsIDOMNode aInstanceData, out AString aType, out AString aNSUri); /** @@ -171,6 +178,30 @@ interface nsIModelElementPrivate : nsIXFormsModelElement */ void messageLoadFinished(); + /** + * Request an xforms-rebuild. + * + * If a previous request (of this or one of the 3 following events) is + * already being handled, the event will be queued, and sent after that. If + * multiple events are queued, they will be dispatched FIFO order. + */ + void requestRebuild(); + + /** + * Request an xforms-recalculate + */ + void requestRecalculate(); + + /** + * Request an xforms-revalidate + */ + void requestRevalidate(); + + /** + * Request an xforms-refresh + */ + void requestRefresh(); + /** * Returns true when the model has been notified that the DOMContentLoaded * event has been fired on the XForms document. diff --git a/mozilla/extensions/xforms/nsIXFormsActionElement.idl b/mozilla/extensions/xforms/nsIXFormsActionElement.idl index 93a3f7cfafe..6d89a29095f 100644 --- a/mozilla/extensions/xforms/nsIXFormsActionElement.idl +++ b/mozilla/extensions/xforms/nsIXFormsActionElement.idl @@ -38,15 +38,15 @@ #include "nsISupports.idl" -interface nsIDOMNode; +interface nsIModelElementPrivate; -[uuid(829a9aef-c832-48d7-b0a4-6f13cad2a14c)] +[uuid(ff229a9c-afb6-4103-a6ad-e81c455fe4dc)] interface nsIXFormsActionElement : nsISupports { - void setRebuild(in nsIDOMNode aModel, in boolean aEnable); - void setRecalculate(in nsIDOMNode aModel, in boolean aEnable); - void setRevalidate(in nsIDOMNode aModel, in boolean aEnable); - void setRefresh(in nsIDOMNode aModel, in boolean aEnable); + void setRebuild(in nsIModelElementPrivate aModel, in boolean aEnable); + void setRecalculate(in nsIModelElementPrivate aModel, in boolean aEnable); + void setRevalidate(in nsIModelElementPrivate aModel, in boolean aEnable); + void setRefresh(in nsIModelElementPrivate aModel, in boolean aEnable); }; diff --git a/mozilla/extensions/xforms/nsXFormsAccessors.cpp b/mozilla/extensions/xforms/nsXFormsAccessors.cpp index 53b6f2c793a..897f66a6d55 100644 --- a/mozilla/extensions/xforms/nsXFormsAccessors.cpp +++ b/mozilla/extensions/xforms/nsXFormsAccessors.cpp @@ -123,30 +123,13 @@ nsXFormsAccessors::SetContent(nsIDOMNode *aNode, PRBool aForceUpdate) nsCOMPtr boundNode; nsresult rv = GetBoundNode(getter_AddRefs(boundNode)); + NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_STATE(boundNode); nsCOMPtr modelPriv = nsXFormsUtils::GetModel(mElement); NS_ENSURE_STATE(modelPriv); - PRBool changed; - rv = modelPriv->SetNodeContent(boundNode, aNode, &changed); - NS_ENSURE_SUCCESS(rv, rv); - if (aForceUpdate) { - nsCOMPtr model = do_QueryInterface(modelPriv); - - if (model) { - rv = nsXFormsUtils::DispatchEvent(model, eEvent_Rebuild); - NS_ENSURE_SUCCESS(rv, rv); - rv = nsXFormsUtils::DispatchEvent(model, eEvent_Recalculate); - NS_ENSURE_SUCCESS(rv, rv); - rv = nsXFormsUtils::DispatchEvent(model, eEvent_Revalidate); - NS_ENSURE_SUCCESS(rv, rv); - rv = nsXFormsUtils::DispatchEvent(model, eEvent_Refresh); - NS_ENSURE_SUCCESS(rv, rv); - } - } - - return NS_OK; + return modelPriv->SetNodeContent(boundNode, aNode, aForceUpdate); } NS_IMETHODIMP diff --git a/mozilla/extensions/xforms/nsXFormsActionElement.cpp b/mozilla/extensions/xforms/nsXFormsActionElement.cpp index 06cdec95b98..711c4b21559 100644 --- a/mozilla/extensions/xforms/nsXFormsActionElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsActionElement.cpp @@ -97,15 +97,16 @@ PR_STATIC_CALLBACK(PLDHashOperator) DoDeferredActions(nsISupports * aModel, void * data) { if (aModel && aDeferred) { - nsCOMPtr element = NS_STATIC_CAST(nsIDOMNode *, aModel); + nsCOMPtr model = + NS_STATIC_CAST(nsIModelElementPrivate*, aModel); if (aDeferred & DEFERRED_REBUILD) - nsXFormsUtils::DispatchEvent(element, eEvent_Rebuild); + model->RequestRebuild(); if (aDeferred & DEFERRED_RECALCULATE) - nsXFormsUtils::DispatchEvent(element, eEvent_Recalculate); + model->RequestRecalculate(); if (aDeferred & DEFERRED_REVALIDATE) - nsXFormsUtils::DispatchEvent(element, eEvent_Revalidate); + model->RequestRevalidate(); if (aDeferred & DEFERRED_REFRESH) - nsXFormsUtils::DispatchEvent(element, eEvent_Refresh); + model->RequestRefresh(); } return PL_DHASH_NEXT; } @@ -150,7 +151,8 @@ nsXFormsActionElement::HandleAction(nsIDOMEvent* aEvent, } NS_IMETHODIMP -nsXFormsActionElement::SetRebuild(nsIDOMNode* aModel, PRBool aEnable) +nsXFormsActionElement::SetRebuild(nsIModelElementPrivate* aModel, + PRBool aEnable) { if (mParentAction) { return mParentAction->SetRebuild(aModel, aEnable); @@ -168,7 +170,8 @@ nsXFormsActionElement::SetRebuild(nsIDOMNode* aModel, PRBool aEnable) } NS_IMETHODIMP -nsXFormsActionElement::SetRecalculate(nsIDOMNode* aModel, PRBool aEnable) +nsXFormsActionElement::SetRecalculate(nsIModelElementPrivate* aModel, + PRBool aEnable) { if (mParentAction) { return mParentAction->SetRecalculate(aModel, aEnable); @@ -186,7 +189,8 @@ nsXFormsActionElement::SetRecalculate(nsIDOMNode* aModel, PRBool aEnable) } NS_IMETHODIMP -nsXFormsActionElement::SetRevalidate(nsIDOMNode* aModel, PRBool aEnable) +nsXFormsActionElement::SetRevalidate(nsIModelElementPrivate* aModel, + PRBool aEnable) { if (mParentAction) { return mParentAction->SetRevalidate(aModel, aEnable); @@ -204,7 +208,8 @@ nsXFormsActionElement::SetRevalidate(nsIDOMNode* aModel, PRBool aEnable) } NS_IMETHODIMP -nsXFormsActionElement::SetRefresh(nsIDOMNode* aModel, PRBool aEnable) +nsXFormsActionElement::SetRefresh(nsIModelElementPrivate* aModel, + PRBool aEnable) { if (mParentAction) { return mParentAction->SetRefresh(aModel, aEnable); diff --git a/mozilla/extensions/xforms/nsXFormsDelegateStub.cpp b/mozilla/extensions/xforms/nsXFormsDelegateStub.cpp index 70ad7681958..3d093887a39 100644 --- a/mozilla/extensions/xforms/nsXFormsDelegateStub.cpp +++ b/mozilla/extensions/xforms/nsXFormsDelegateStub.cpp @@ -156,20 +156,8 @@ nsXFormsDelegateStub::SetValue(const nsAString& aValue) return NS_OK; PRBool changed; - nsresult rv = mModel->SetNodeValue(mBoundNode, aValue, &changed); + nsresult rv = mModel->SetNodeValue(mBoundNode, aValue, PR_TRUE, &changed); NS_ENSURE_SUCCESS(rv, rv); - if (changed) { - nsCOMPtr model = do_QueryInterface(mModel); - - if (model) { - rv = nsXFormsUtils::DispatchEvent(model, eEvent_Recalculate); - NS_ENSURE_SUCCESS(rv, rv); - rv = nsXFormsUtils::DispatchEvent(model, eEvent_Revalidate); - NS_ENSURE_SUCCESS(rv, rv); - rv = nsXFormsUtils::DispatchEvent(model, eEvent_Refresh); - NS_ENSURE_SUCCESS(rv, rv); - } - } return NS_OK; } diff --git a/mozilla/extensions/xforms/nsXFormsInsertDeleteElement.cpp b/mozilla/extensions/xforms/nsXFormsInsertDeleteElement.cpp index 13a1c97232d..143088fe6ed 100644 --- a/mozilla/extensions/xforms/nsXFormsInsertDeleteElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsInsertDeleteElement.cpp @@ -239,18 +239,20 @@ nsXFormsInsertDeleteElement::HandleAction(nsIDOMEvent *aEvent, NS_ENSURE_SUCCESS(rv, rv); // Dispatch refreshing events to the model - nsCOMPtr modelElem(do_QueryInterface(model)); - NS_ASSERTION(modelElem, "Model not implementing nsIDOMElement?!"); if (aParentAction) { - aParentAction->SetRebuild(modelElem, PR_TRUE); - aParentAction->SetRecalculate(modelElem, PR_TRUE); - aParentAction->SetRevalidate(modelElem, PR_TRUE); - aParentAction->SetRefresh(modelElem, PR_TRUE); + aParentAction->SetRebuild(model, PR_TRUE); + aParentAction->SetRecalculate(model, PR_TRUE); + aParentAction->SetRevalidate(model, PR_TRUE); + aParentAction->SetRefresh(model, PR_TRUE); } else { - nsXFormsUtils::DispatchEvent(modelElem, eEvent_Rebuild); - nsXFormsUtils::DispatchEvent(modelElem, eEvent_Recalculate); - nsXFormsUtils::DispatchEvent(modelElem, eEvent_Revalidate); - nsXFormsUtils::DispatchEvent(modelElem, eEvent_Refresh); + rv = model->RequestRebuild(); + NS_ENSURE_SUCCESS(rv, rv); + rv = model->RequestRecalculate(); + NS_ENSURE_SUCCESS(rv, rv); + rv = model->RequestRevalidate(); + NS_ENSURE_SUCCESS(rv, rv); + rv = model->RequestRefresh(); + NS_ENSURE_SUCCESS(rv, rv); } return NS_OK; diff --git a/mozilla/extensions/xforms/nsXFormsMDGEngine.cpp b/mozilla/extensions/xforms/nsXFormsMDGEngine.cpp index d17faf82504..e18179aa51e 100644 --- a/mozilla/extensions/xforms/nsXFormsMDGEngine.cpp +++ b/mozilla/extensions/xforms/nsXFormsMDGEngine.cpp @@ -228,31 +228,50 @@ nsXFormsMDGEngine::AddMIP(ModelItemPropName aType, nsresult nsXFormsMDGEngine::MarkNodeAsChanged(nsIDOMNode* aContextNode) { - nsXFormsNodeState* ns = GetNCNodeState(aContextNode); - NS_ENSURE_TRUE(ns, NS_ERROR_FAILURE); - - ns->Set(kFlags_ALL_DISPATCH, PR_TRUE); - - // Get the node, eMode_type == get any type of node - nsXFormsMDGNode* n = GetNode(aContextNode, eModel_type, PR_FALSE); - if (n) { - while (n) { - n->MarkDirty(); - n = n->mNext; - } - } else { - // Add constraint to trigger validation of node - n = GetNode(aContextNode, eModel_constraint, PR_TRUE); - if (!n) { - return NS_ERROR_OUT_OF_MEMORY; - } - n->MarkDirty(); - NS_ENSURE_TRUE(mGraph.AppendElement(n), NS_ERROR_OUT_OF_MEMORY); - } - return mMarkedNodes.AppendObject(aContextNode); } +nsresult +nsXFormsMDGEngine::HandleMarkedNodes(nsCOMArray *aArray) +{ + NS_ENSURE_ARG_POINTER(aArray); + + // Handle nodes marked as changed + for (PRInt32 i = 0; i < mMarkedNodes.Count(); ++i) { + nsCOMPtr node = mMarkedNodes.ObjectAt(i); + nsXFormsNodeState* ns = GetNCNodeState(node); + NS_ENSURE_TRUE(ns, NS_ERROR_FAILURE); + + ns->Set(kFlags_ALL_DISPATCH, PR_TRUE); + + // Get the node, eMode_type == get any type of node + nsXFormsMDGNode* n = GetNode(node, eModel_type, PR_FALSE); + if (n) { + while (n) { + n->MarkDirty(); + n = n->mNext; + } + } else { + // Add constraint to trigger validation of node + n = GetNode(node, eModel_constraint, PR_TRUE); + if (!n) { + return NS_ERROR_OUT_OF_MEMORY; + } + n->MarkDirty(); + NS_ENSURE_TRUE(mGraph.AppendElement(n), NS_ERROR_OUT_OF_MEMORY); + } + + NS_ENSURE_TRUE(aArray->AppendObjects(mMarkedNodes), + NS_ERROR_OUT_OF_MEMORY); + + } + + mMarkedNodes.Clear(); + + return NS_OK; +} + + #ifdef DEBUG_beaufour #include #include @@ -308,9 +327,10 @@ nsXFormsMDGEngine::Recalculate(nsCOMArray *aChangedNodes) aChangedNodes->Count()); #endif - NS_ENSURE_TRUE(aChangedNodes->AppendObjects(mMarkedNodes), NS_ERROR_OUT_OF_MEMORY); - - mMarkedNodes.Clear(); + // XXX: There's something wrong with the marking of nodes, as we assume that + // recalculate will always be called first. bug 338146 + nsresult rv = HandleMarkedNodes(aChangedNodes); + NS_ENSURE_SUCCESS(rv, rv); PRBool res = PR_TRUE; @@ -324,7 +344,6 @@ nsXFormsMDGEngine::Recalculate(nsCOMArray *aChangedNodes) #endif // Go through all dirty nodes in the graph - nsresult rv; nsXFormsMDGNode* g; for (PRInt32 i = 0; i < mGraph.Count(); ++i) { g = NS_STATIC_CAST(nsXFormsMDGNode*, mGraph[i]); @@ -596,58 +615,6 @@ nsXFormsMDGEngine::Clear() { return NS_OK; } -nsresult -nsXFormsMDGEngine::GetNodeValue(nsIDOMNode *aContextNode, - nsAString &aNodeValue) -{ - nsresult rv; - nsCOMPtr childNode; - - PRUint16 nodeType; - rv = aContextNode->GetNodeType(&nodeType); - NS_ENSURE_SUCCESS(rv, rv); - - switch(nodeType) { - case nsIDOMNode::ATTRIBUTE_NODE: - case nsIDOMNode::TEXT_NODE: - case nsIDOMNode::CDATA_SECTION_NODE: - case nsIDOMNode::PROCESSING_INSTRUCTION_NODE: - case nsIDOMNode::COMMENT_NODE: - rv = aContextNode->GetNodeValue(aNodeValue); - NS_ENSURE_SUCCESS(rv, rv); - break; - - case nsIDOMNode::ELEMENT_NODE: - rv = aContextNode->GetFirstChild(getter_AddRefs(childNode)); - if (NS_FAILED(rv) || !childNode) { - // No child - aNodeValue.Truncate(0); - } else { - PRUint16 childType; - rv = childNode->GetNodeType(&childType); - NS_ENSURE_SUCCESS(rv, rv); - - if ( childType == nsIDOMNode::TEXT_NODE - || childType == nsIDOMNode::CDATA_SECTION_NODE) { - rv = childNode->GetNodeValue(aNodeValue); - NS_ENSURE_SUCCESS(rv, rv); - } else { - // Not a text child - aNodeValue.Truncate(0); - } - } - break; - - default: - /// Asked for a node which cannot have a text child - /// @todo Should return more specific error? (XXX) - return NS_ERROR_ILLEGAL_VALUE; - break; - } - - return NS_OK; -} - nsresult nsXFormsMDGEngine::SetNodeValue(nsIDOMNode *aContextNode, const nsAString &aNodeValue, @@ -688,8 +655,7 @@ nsXFormsMDGEngine::SetNodeValueInternal(nsIDOMNode *aContextNode, NS_ENSURE_SUCCESS(rv, rv); nsAutoString oldValue; - rv = GetNodeValue(aContextNode, oldValue); - NS_ENSURE_SUCCESS(rv, rv); + nsXFormsUtils::GetNodeValue(aContextNode, oldValue); if (oldValue.Equals(aNodeValue)) { return NS_OK; } @@ -749,8 +715,7 @@ nsXFormsMDGEngine::SetNodeValueInternal(nsIDOMNode *aContextNode, nsresult nsXFormsMDGEngine::SetNodeContent(nsIDOMNode *aContextNode, - nsIDOMNode *aContentEnvelope, - PRBool *aNodeChanged) + nsIDOMNode *aContentEnvelope) { NS_ENSURE_ARG(aContextNode); NS_ENSURE_ARG(aContentEnvelope); @@ -760,10 +725,6 @@ nsXFormsMDGEngine::SetNodeContent(nsIDOMNode *aContextNode, // aContentEnvelope has no contents, then any contents that aContextNode // has will still be removed. - if (aNodeChanged) { - *aNodeChanged = PR_FALSE; - } - const nsXFormsNodeState* ns = GetNodeState(aContextNode); NS_ENSURE_TRUE(ns, NS_ERROR_FAILURE); @@ -880,11 +841,6 @@ nsXFormsMDGEngine::SetNodeContent(nsIDOMNode *aContextNode, resultNode.swap(childNode); } - // NB: Never reached for Readonly nodes. - if (aNodeChanged) { - *aNodeChanged = PR_TRUE; - } - return NS_OK; } diff --git a/mozilla/extensions/xforms/nsXFormsMDGEngine.h b/mozilla/extensions/xforms/nsXFormsMDGEngine.h index 64785ce030f..4d6e970ed40 100644 --- a/mozilla/extensions/xforms/nsXFormsMDGEngine.h +++ b/mozilla/extensions/xforms/nsXFormsMDGEngine.h @@ -327,6 +327,14 @@ protected: PRBool aIsCalculate = PR_FALSE, PRBool *aNodeChanged = nsnull); + /** + * Handle nodes nodes marked as dirty, and insert into "changed nodes + * array". + * + * @param aArray The "changed nodes array" to insert into + */ + nsresult HandleMarkedNodes(nsCOMArray *aArray); + public: /** * Constructor @@ -411,26 +419,15 @@ public: const nsAString &aNodeValue, PRBool *aNodeChanged = nsnull); - /** - * Get the value of a node. (used by nsXFormsMDG) - - * @param aContextNode The node to get the value for - * @param aNodeValue The value of the node - */ - nsresult GetNodeValue(nsIDOMNode *aContextNode, - nsAString &aNodeValue); - /** * Set the contents of a node * * @param aContextNode The node to set the contents of * @param aContentEnvelope The container of the contents that need to be * moved under aContextNode - * @param aNodeChanged Was node changed? */ nsresult SetNodeContent(nsIDOMNode *aContextNode, - nsIDOMNode *aContentEnvelope, - PRBool *aNodeChanged = nsnull); + nsIDOMNode *aContentEnvelope); /** * External interface of GetNCNodeState(), returns const pointer to the node diff --git a/mozilla/extensions/xforms/nsXFormsModelElement.cpp b/mozilla/extensions/xforms/nsXFormsModelElement.cpp index 3592de2341c..db8ab6578fd 100644 --- a/mozilla/extensions/xforms/nsXFormsModelElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsModelElement.cpp @@ -77,6 +77,8 @@ #include "nsIProgrammingLanguage.h" #include "nsDOMError.h" #include "nsXFormsControlStub.h" +#include "nsIPrefService.h" +#include "nsIPrefBranch.h" #define XFORMS_LAZY_INSTANCE_BINDING \ "chrome://xforms/content/xforms.xml#xforms-lazy-instance" @@ -640,9 +642,11 @@ nsXFormsModelElement::nsXFormsModelElement() mNeedsRefresh(PR_FALSE), mInstancesInitialized(PR_FALSE), mReadyHandled(PR_FALSE), - mInstanceDocuments(nsnull), mLazyModel(PR_FALSE), - mConstructDoneHandled(PR_FALSE) + mConstructDoneHandled(PR_FALSE), + mProcessingUpdateEvent(PR_FALSE), + mLoopMax(600), + mInstanceDocuments(nsnull) { } @@ -991,6 +995,15 @@ nsXFormsModelElement::OnCreated(nsIXTFGenericElementWrapper *aWrapper) NS_ENSURE_TRUE(mNodeToType.Init(), NS_ERROR_OUT_OF_MEMORY); NS_ENSURE_TRUE(mNodeToP3PType.Init(), NS_ERROR_OUT_OF_MEMORY); + + // Get eventual user-set loop maximum. Used by RequestUpdateEvent(). + nsCOMPtr pref = do_GetService(NS_PREFSERVICE_CONTRACTID, &rv); + if (NS_SUCCEEDED(rv) && pref) { + PRInt32 val; + if (NS_SUCCEEDED(pref->GetIntPref("xforms.modelLoopMax", &val))) + mLoopMax = val; + } + return NS_OK; } @@ -1534,31 +1547,46 @@ nsXFormsModelElement::FindInstanceElement(const nsAString &aID, } NS_IMETHODIMP -nsXFormsModelElement::SetNodeValue(nsIDOMNode *aContextNode, +nsXFormsModelElement::SetNodeValue(nsIDOMNode *aNode, const nsAString &aNodeValue, + PRBool aDoRefresh, PRBool *aNodeChanged) -{ - return mMDG.SetNodeValue(aContextNode, - aNodeValue, - aNodeChanged); +{ + NS_ENSURE_ARG_POINTER(aNodeChanged); + nsresult rv = mMDG.SetNodeValue(aNode, aNodeValue, aNodeChanged); + NS_ENSURE_SUCCESS(rv, rv); + if (*aNodeChanged && aDoRefresh) { + rv = RequestRecalculate(); + NS_ENSURE_SUCCESS(rv, rv); + rv = RequestRevalidate(); + NS_ENSURE_SUCCESS(rv, rv); + rv = RequestRefresh(); + NS_ENSURE_SUCCESS(rv, rv); + } + + return NS_OK; } NS_IMETHODIMP -nsXFormsModelElement::GetNodeValue(nsIDOMNode *aContextNode, - nsAString &aNodeValue) -{ - return mMDG.GetNodeValue(aContextNode, - aNodeValue); -} - -NS_IMETHODIMP -nsXFormsModelElement::SetNodeContent(nsIDOMNode *aContextNode, - nsIDOMNode *aNodeContent, - PRBool *aNodeChanged) +nsXFormsModelElement::SetNodeContent(nsIDOMNode *aNode, + nsIDOMNode *aNodeContent, + PRBool aDoRebuild) { - return mMDG.SetNodeContent(aContextNode, - aNodeContent, - aNodeChanged); + nsresult rv = mMDG.SetNodeContent(aNode, aNodeContent); + NS_ENSURE_SUCCESS(rv, rv); + + if (aDoRebuild) { + rv = RequestRebuild(); + NS_ENSURE_SUCCESS(rv, rv); + rv = RequestRecalculate(); + NS_ENSURE_SUCCESS(rv, rv); + rv = RequestRevalidate(); + NS_ENSURE_SUCCESS(rv, rv); + rv = RequestRefresh(); + NS_ENSURE_SUCCESS(rv, rv); + } + + return NS_OK; } NS_IMETHODIMP @@ -1773,6 +1801,84 @@ nsXFormsModelElement::GetTypeFromNode(nsIDOMNode *aInstanceData, return rv; } +/** + * Poor man's try-catch to make sure that we set mProcessingUpdateEvent to + * when leaving scope. If we actually bail with an error at some time, + * something is pretty rotten, but at least we will not prevent any further + * updates. + */ +class Updating { +private: + nsXFormsModelElement* mModel; + +public: + Updating(nsXFormsModelElement* aModel) + : mModel(aModel) { mModel->mProcessingUpdateEvent = PR_TRUE; }; + ~Updating() { mModel->mProcessingUpdateEvent = PR_FALSE; }; +}; + +nsresult +nsXFormsModelElement::RequestUpdateEvent(nsXFormsEvent aEvent) +{ + if (mProcessingUpdateEvent) { + mUpdateEventQueue.AppendElement(NS_INT32_TO_PTR(aEvent)); + return NS_OK; + } + + Updating upd(this); + + // Send the requested event + nsresult rv = nsXFormsUtils::DispatchEvent(mElement, aEvent); + NS_ENSURE_SUCCESS(rv, rv); + + // Process queued events + PRInt32 loopCount = 0; + while (mUpdateEventQueue.Count()) { + nsXFormsEvent event = + NS_STATIC_CAST(nsXFormsEvent, NS_PTR_TO_UINT32(mUpdateEventQueue[0])); + NS_ENSURE_TRUE(mUpdateEventQueue.RemoveElementAt(0), NS_ERROR_FAILURE); + + rv = nsXFormsUtils::DispatchEvent(mElement, event); + NS_ENSURE_SUCCESS(rv, rv); + ++loopCount; + if (mLoopMax && loopCount > mLoopMax) { + // Note: we could also popup a dialog asking the user whether or not to + // continue. + nsXFormsUtils::ReportError(NS_LITERAL_STRING("modelLoopError"), mElement); + nsXFormsUtils::HandleFatalError(mElement, NS_LITERAL_STRING("LoopError")); + return NS_ERROR_FAILURE; + } + } + + return NS_OK; +} + + +NS_IMETHODIMP +nsXFormsModelElement::RequestRebuild() +{ + return RequestUpdateEvent(eEvent_Rebuild); +} + +NS_IMETHODIMP +nsXFormsModelElement::RequestRecalculate() +{ + return RequestUpdateEvent(eEvent_Recalculate); +} + +NS_IMETHODIMP +nsXFormsModelElement::RequestRevalidate() +{ + return RequestUpdateEvent(eEvent_Revalidate); +} + +NS_IMETHODIMP +nsXFormsModelElement::RequestRefresh() +{ + return RequestUpdateEvent(eEvent_Refresh); +} + + // nsIXFormsContextControl NS_IMETHODIMP diff --git a/mozilla/extensions/xforms/nsXFormsModelElement.h b/mozilla/extensions/xforms/nsXFormsModelElement.h index c9fe8feef00..959b35a5f13 100644 --- a/mozilla/extensions/xforms/nsXFormsModelElement.h +++ b/mozilla/extensions/xforms/nsXFormsModelElement.h @@ -360,6 +360,15 @@ private: NS_HIDDEN_(nsresult) ValidateDocument(nsIDOMDocument *aInstanceDocument, PRBool *aResult); + /** + * Request to send an update event to the model. If an update is already + * running, the event will be queued, and sent after that. If multiple + * events are queued, they will be dispatched FIFO order. + * + * @param aEvent The requested event + */ + NS_HIDDEN_(nsresult) RequestUpdateEvent(nsXFormsEvent aEvent); + nsIDOMElement *mElement; nsCOMPtr mSchemas; nsStringArray mPendingInlineSchemas; @@ -378,20 +387,58 @@ private: */ nsCOMArray mChangedNodes; - // This flag indicates whether or not the document fired DOMContentLoaded - PRBool mDocumentLoaded; + /** + * This flag indicates whether or not the document has fired + * DOMContentLoaded + */ + PRPackedBool mDocumentLoaded; - // This flag indicates whether a xforms-rebuild has been called, but no - // xforms-revalidate yet - PRBool mNeedsRefresh; + /** + * Indicates whether all controls should be refreshed on the next Refresh() + * run. + */ + PRPackedBool mNeedsRefresh; - // This flag indicates whether instance elements have been initialized - PRBool mInstancesInitialized; + /** + * Indicates whether instance elements have been initialized + */ + PRPackedBool mInstancesInitialized; /** * Indicates whether the model has handled the xforms-ready event */ - PRBool mReadyHandled; + PRPackedBool mReadyHandled; + + /** + * Indicates whether the model's instance was built by lazy authoring + */ + PRPackedBool mLazyModel; + + /** + * Indicates whether the model has handled the xforms-model-construct-done + * event + */ + PRPackedBool mConstructDoneHandled; + + /** + * Indicates whether the model is currently processing an update event, + * ie. xforms-rebuild, xforms-recalculate, xforms-revalidate, or + * xforms-refresh. + */ + PRPackedBool mProcessingUpdateEvent; + + /** + * A list of update events that have been queued, because they were + * requested while another update was running. + */ + nsVoidArray mUpdateEventQueue; + + /** + * The maximum allowed number of iterations of queued event dispatching in + * RequestUpdateEvent(), before there is believe to be a loop, and + * processing stops. + */ + PRInt32 mLoopMax; /** * All instance documents contained by this model, including lazy-authored @@ -399,9 +446,6 @@ private: */ nsRefPtr mInstanceDocuments; - // Indicates whether the model's instance was built by lazy authoring - PRBool mLazyModel; - /** * Type information for nodes, with their type set through \. * @@ -417,11 +461,7 @@ private: */ nsClassHashtable mNodeToP3PType; - /** - * Indicates whether the model has handled the xforms-model-construct-done - * event - */ - PRBool mConstructDoneHandled; + friend class Updating; }; /** diff --git a/mozilla/extensions/xforms/nsXFormsRebuildElement.cpp b/mozilla/extensions/xforms/nsXFormsRebuildElement.cpp index e7cd6a2466c..8ad919699e4 100644 --- a/mozilla/extensions/xforms/nsXFormsRebuildElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsRebuildElement.cpp @@ -54,16 +54,13 @@ NS_IMETHODIMP nsXFormsRebuildElement::HandleAction(nsIDOMEvent* aEvent, nsIXFormsActionElement *aParentAction) { - nsCOMPtr modelPriv = nsXFormsUtils::GetModel(mElement); - nsCOMPtr model = do_QueryInterface(modelPriv); - - if (model) { - if (aParentAction) { - aParentAction->SetRebuild(model, PR_FALSE); - } - return nsXFormsUtils::DispatchEvent(model, eEvent_Rebuild); + nsCOMPtr model = nsXFormsUtils::GetModel(mElement); + NS_ENSURE_STATE(model); + + if (aParentAction) { + aParentAction->SetRebuild(model, PR_FALSE); } - return NS_OK; + return model->Rebuild(); } NS_HIDDEN_(nsresult) diff --git a/mozilla/extensions/xforms/nsXFormsRecalculateElement.cpp b/mozilla/extensions/xforms/nsXFormsRecalculateElement.cpp index 1b7cccc2d5e..8605eb08d6c 100644 --- a/mozilla/extensions/xforms/nsXFormsRecalculateElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsRecalculateElement.cpp @@ -54,16 +54,13 @@ NS_IMETHODIMP nsXFormsRecalculateElement::HandleAction(nsIDOMEvent* aEvent, nsIXFormsActionElement *aParentAction) { - nsCOMPtr modelPriv = nsXFormsUtils::GetModel(mElement); - nsCOMPtr model = do_QueryInterface(modelPriv); + nsCOMPtr model = nsXFormsUtils::GetModel(mElement); + NS_ENSURE_STATE(model); - if (model) { - if (aParentAction) { - aParentAction->SetRecalculate(model, PR_FALSE); - } - return nsXFormsUtils::DispatchEvent(model, eEvent_Recalculate); + if (aParentAction) { + aParentAction->SetRecalculate(model, PR_FALSE); } - return NS_OK; + return model->Recalculate(); } NS_HIDDEN_(nsresult) diff --git a/mozilla/extensions/xforms/nsXFormsRefreshElement.cpp b/mozilla/extensions/xforms/nsXFormsRefreshElement.cpp index 0dca75489d8..9369884b456 100644 --- a/mozilla/extensions/xforms/nsXFormsRefreshElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsRefreshElement.cpp @@ -54,16 +54,13 @@ NS_IMETHODIMP nsXFormsRefreshElement::HandleAction(nsIDOMEvent* aEvent, nsIXFormsActionElement *aParentAction) { - nsCOMPtr modelPriv = nsXFormsUtils::GetModel(mElement); - nsCOMPtr model = do_QueryInterface(modelPriv); - - if (model) { - if (aParentAction) { - aParentAction->SetRefresh(model, PR_FALSE); - } - return nsXFormsUtils::DispatchEvent(model, eEvent_Refresh); + nsCOMPtr model = nsXFormsUtils::GetModel(mElement); + NS_ENSURE_STATE(model); + + if (aParentAction) { + aParentAction->SetRefresh(model, PR_FALSE); } - return NS_OK; + return model->Refresh(); } NS_HIDDEN_(nsresult) diff --git a/mozilla/extensions/xforms/nsXFormsResetElement.cpp b/mozilla/extensions/xforms/nsXFormsResetElement.cpp index 8662ff7352e..4dfffc86ead 100644 --- a/mozilla/extensions/xforms/nsXFormsResetElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsResetElement.cpp @@ -55,17 +55,15 @@ nsXFormsResetElement::HandleAction(nsIDOMEvent* aEvent, { nsCOMPtr modelPriv = nsXFormsUtils::GetModel(mElement); nsCOMPtr model = do_QueryInterface(modelPriv); + NS_ENSURE_STATE(model); - if (model) { - if (aParentAction) { - aParentAction->SetRebuild(model, PR_FALSE); - aParentAction->SetRecalculate(model, PR_FALSE); - aParentAction->SetRevalidate(model, PR_FALSE); - aParentAction->SetRefresh(model, PR_FALSE); - } - return nsXFormsUtils::DispatchEvent(model, eEvent_Reset); + if (aParentAction) { + aParentAction->SetRebuild(modelPriv, PR_FALSE); + aParentAction->SetRecalculate(modelPriv, PR_FALSE); + aParentAction->SetRevalidate(modelPriv, PR_FALSE); + aParentAction->SetRefresh(modelPriv, PR_FALSE); } - return NS_OK; + return nsXFormsUtils::DispatchEvent(model, eEvent_Reset); } NS_HIDDEN_(nsresult) diff --git a/mozilla/extensions/xforms/nsXFormsRevalidateElement.cpp b/mozilla/extensions/xforms/nsXFormsRevalidateElement.cpp index 1513644275f..d239016d691 100644 --- a/mozilla/extensions/xforms/nsXFormsRevalidateElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsRevalidateElement.cpp @@ -54,16 +54,13 @@ NS_IMETHODIMP nsXFormsRevalidateElement::HandleAction(nsIDOMEvent* aEvent, nsIXFormsActionElement *aParentAction) { - nsCOMPtr modelPriv = nsXFormsUtils::GetModel(mElement); - nsCOMPtr model = do_QueryInterface(modelPriv); - - if (model) { - if (aParentAction) { - aParentAction->SetRevalidate(model, PR_FALSE); - } - return nsXFormsUtils::DispatchEvent(model, eEvent_Revalidate); + nsCOMPtr model = nsXFormsUtils::GetModel(mElement); + NS_ENSURE_STATE(model); + + if (aParentAction) { + aParentAction->SetRevalidate(model, PR_FALSE); } - return NS_OK; + return model->Revalidate(); } NS_HIDDEN_(nsresult) diff --git a/mozilla/extensions/xforms/nsXFormsSetValueElement.cpp b/mozilla/extensions/xforms/nsXFormsSetValueElement.cpp index 49600a32d46..3762f9f8c9e 100644 --- a/mozilla/extensions/xforms/nsXFormsSetValueElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsSetValueElement.cpp @@ -97,21 +97,13 @@ nsXFormsSetValueElement::HandleAction(nsIDOMEvent* aEvent, } PRBool changed; - rv = modelPriv->SetNodeValue(singleNode, value, &changed); + rv = modelPriv->SetNodeValue(singleNode, value, !aParentAction, &changed); NS_ENSURE_SUCCESS(rv, rv); - if (changed) { - nsCOMPtr model = do_QueryInterface(modelPriv); - NS_ENSURE_STATE(model); - if (aParentAction) { - aParentAction->SetRecalculate(model, PR_TRUE); - aParentAction->SetRevalidate(model, PR_TRUE); - aParentAction->SetRefresh(model, PR_TRUE); - } else { - nsXFormsUtils::DispatchEvent(model, eEvent_Recalculate); - nsXFormsUtils::DispatchEvent(model, eEvent_Revalidate); - nsXFormsUtils::DispatchEvent(model, eEvent_Refresh); - } + if (changed && aParentAction) { + aParentAction->SetRecalculate(modelPriv, PR_TRUE); + aParentAction->SetRevalidate(modelPriv, PR_TRUE); + aParentAction->SetRefresh(modelPriv, PR_TRUE); } return NS_OK; diff --git a/mozilla/extensions/xforms/nsXFormsUploadElement.cpp b/mozilla/extensions/xforms/nsXFormsUploadElement.cpp index fd646324178..60286c5902c 100644 --- a/mozilla/extensions/xforms/nsXFormsUploadElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsUploadElement.cpp @@ -273,7 +273,8 @@ nsXFormsUploadElement::SetFile(nsILocalFile *aFile) if (!aFile) { // clear instance data content->DeleteProperty(nsXFormsAtoms::uploadFileProperty); - rv = mModel->SetNodeValue(mBoundNode, EmptyString(), &dataChanged); + rv = mModel->SetNodeValue(mBoundNode, EmptyString(), PR_FALSE, + &dataChanged); } else { // set file into instance data @@ -283,14 +284,14 @@ nsXFormsUploadElement::SetFile(nsILocalFile *aFile) nsCAutoString spec; NS_GetURLSpecFromFile(aFile, spec); rv = mModel->SetNodeValue(mBoundNode, NS_ConvertUTF8toUTF16(spec), - &dataChanged); + PR_FALSE, &dataChanged); } else if (type == TYPE_BASE64 || type == TYPE_HEX) { // encode file contents in base64/hex and set into instance data node PRUnichar *fileData; rv = EncodeFileContents(aFile, type, &fileData); if (NS_SUCCEEDED(rv)) { rv = mModel->SetNodeValue(mBoundNode, nsDependentString(fileData), - &dataChanged); + PR_FALSE, &dataChanged); nsMemory::Free(fileData); } } else { @@ -317,16 +318,12 @@ nsXFormsUploadElement::SetFile(nsILocalFile *aFile) NS_ENSURE_SUCCESS(rv, rv); if (dataChanged || childrenChanged) { - nsCOMPtr model = do_QueryInterface(mModel); - - if (model) { - rv = nsXFormsUtils::DispatchEvent(model, eEvent_Recalculate); - NS_ENSURE_SUCCESS(rv, rv); - rv = nsXFormsUtils::DispatchEvent(model, eEvent_Revalidate); - NS_ENSURE_SUCCESS(rv, rv); - rv = nsXFormsUtils::DispatchEvent(model, eEvent_Refresh); - NS_ENSURE_SUCCESS(rv, rv); - } + rv = mModel->RequestRecalculate(); + NS_ENSURE_SUCCESS(rv, rv); + rv = mModel->RequestRevalidate(); + NS_ENSURE_SUCCESS(rv, rv); + rv = mModel->RequestRefresh(); + NS_ENSURE_SUCCESS(rv, rv); } return NS_OK; @@ -336,9 +333,9 @@ nsresult nsXFormsUploadElement::HandleChildElements(nsILocalFile *aFile, PRBool *aChanged) { - if (!aChanged) { - return NS_ERROR_NULL_POINTER; - } + NS_ENSURE_ARG_POINTER(aChanged); + NS_ENSURE_STATE(mModel); + *aChanged = PR_FALSE; // return immediately if we have no children @@ -381,12 +378,12 @@ nsXFormsUploadElement::HandleChildElements(nsILocalFile *aFile, nsAutoString filename; rv = aFile->GetLeafName(filename); if (!filename.IsEmpty()) { - rv = nsXFormsUtils::SetSingleNodeBindingValue(filenameElem, filename, - &filenameChanged); + rv = mModel->SetNodeValue(filenameElem, filename, PR_FALSE, + &filenameChanged); } } else { - rv = nsXFormsUtils::SetSingleNodeBindingValue(filenameElem, EmptyString(), - &filenameChanged); + rv = mModel->SetNodeValue(filenameElem, EmptyString(), + PR_FALSE, &filenameChanged); } NS_ENSURE_SUCCESS(rv, rv); } @@ -404,12 +401,13 @@ nsXFormsUploadElement::HandleChildElements(nsILocalFile *aFile, if (NS_FAILED(rv)) { contentType.AssignLiteral("application/octet-stream"); } - rv = nsXFormsUtils::SetSingleNodeBindingValue(mediatypeElem, - NS_ConvertUTF8toUTF16(contentType), &mediatypechanged); + rv = mModel->SetNodeValue(mediatypeElem, + NS_ConvertUTF8toUTF16(contentType), + PR_FALSE, &mediatypechanged); } } else { - rv = nsXFormsUtils::SetSingleNodeBindingValue(mediatypeElem, - EmptyString(), &mediatypechanged); + rv = mModel->SetNodeValue(mediatypeElem, EmptyString(), + PR_FALSE, &mediatypechanged); } } diff --git a/mozilla/extensions/xforms/nsXFormsUtils.cpp b/mozilla/extensions/xforms/nsXFormsUtils.cpp index 3c4783a7430..abc21b904f0 100644 --- a/mozilla/extensions/xforms/nsXFormsUtils.cpp +++ b/mozilla/extensions/xforms/nsXFormsUtils.cpp @@ -730,107 +730,6 @@ nsXFormsUtils::GetNodeValue(nsIDOMNode* aDataNode, nsAString& aNodeValue) } } -/* static */ void -nsXFormsUtils::SetNodeValue(nsIDOMNode* aDataNode, const nsString& aNodeValue) -{ - PRUint16 nodeType; - aDataNode->GetNodeType(&nodeType); - - switch(nodeType) { - case nsIDOMNode::ATTRIBUTE_NODE: - // "The string-value of the attribute is replaced with a string - // corresponding to the new value." - aDataNode->SetNodeValue(aNodeValue); - break; - - case nsIDOMNode::TEXT_NODE: - // "The text node is replaced with a new one corresponding to the new - // value". - { - nsCOMPtr document; - aDataNode->GetOwnerDocument(getter_AddRefs(document)); - if (!document) - break; - - nsCOMPtr textNode; - document->CreateTextNode(aNodeValue, getter_AddRefs(textNode)); - if (!textNode) - break; - - nsCOMPtr parentNode; - aDataNode->GetParentNode(getter_AddRefs(parentNode)); - if (parentNode) { - nsCOMPtr childReturn; - parentNode->ReplaceChild(textNode, aDataNode, - getter_AddRefs(childReturn)); - } - - break; - } - - case nsIDOMNode::ELEMENT_NODE: - { - // "If the element has any child text nodes, the first text node is - // replaced with one corresponding to the new value." - - // Start by creating a text node for the new value. - nsCOMPtr document; - aDataNode->GetOwnerDocument(getter_AddRefs(document)); - if (!document) - break; - - nsCOMPtr textNode; - document->CreateTextNode(aNodeValue, getter_AddRefs(textNode)); - if (!textNode) - break; - - // Now find the first child text node. - nsCOMPtr childNodes; - aDataNode->GetChildNodes(getter_AddRefs(childNodes)); - - if (!childNodes) - break; - - nsCOMPtr child, childReturn; - PRUint32 childCount; - childNodes->GetLength(&childCount); - - for (PRUint32 i = 0; i < childCount; ++i) { - childNodes->Item(i, getter_AddRefs(child)); - NS_ASSERTION(child, "DOMNodeList length is wrong!"); - - child->GetNodeType(&nodeType); - if (nodeType == nsIDOMNode::TEXT_NODE) { - // We found one, replace it with our new text node. - aDataNode->ReplaceChild(textNode, child, - getter_AddRefs(childReturn)); - return; - } - } - - // "If no child text nodes are present, a text node is created, - // corresponding to the new value, and appended as the first child node." - - // XXX This is a bit vague since "appended as the first child node" - // implies that there are no child nodes at all, but all we've - // established is that there are no child _text_nodes. - // Taking this to mean "inserted as the first child node" until this is - // clarified. - - aDataNode->GetFirstChild(getter_AddRefs(child)); - if (child) - aDataNode->InsertBefore(textNode, child, getter_AddRefs(childReturn)); - else - aDataNode->AppendChild(textNode, getter_AddRefs(childReturn)); - - } - break; - - default: - NS_WARNING("Trying to set node value for unsupported node type"); - } -} - /* static */ PRBool nsXFormsUtils::GetSingleNodeBinding(nsIDOMElement* aElement, nsIDOMNode** aNode, @@ -883,24 +782,6 @@ nsXFormsUtils::GetSingleNodeBindingValue(nsIDOMElement* aElement, return PR_FALSE; } -/* static */ PRBool -nsXFormsUtils::SetSingleNodeBindingValue(nsIDOMElement *aElement, - const nsAString &aValue, - PRBool *aChanged) -{ - *aChanged = PR_FALSE; - nsCOMPtr node; - nsCOMPtr model; - if (GetSingleNodeBinding(aElement, getter_AddRefs(node), - getter_AddRefs(model))) - { - nsresult rv = model->SetNodeValue(node, aValue, aChanged); - if (NS_SUCCEEDED(rv)) - return PR_TRUE; - } - return PR_FALSE; -} - nsresult DispatchXFormsEvent(nsIDOMNode* aTarget, nsXFormsEvent aEvent, PRBool *aDefaultActionEnabled) diff --git a/mozilla/extensions/xforms/nsXFormsUtils.h b/mozilla/extensions/xforms/nsXFormsUtils.h index 00da41e836a..db57c22a65c 100644 --- a/mozilla/extensions/xforms/nsXFormsUtils.h +++ b/mozilla/extensions/xforms/nsXFormsUtils.h @@ -272,13 +272,6 @@ public: static NS_HIDDEN_(void) GetNodeValue(nsIDOMNode *aDataNode, nsAString &aNodeValue); - /** - * Given a node in the instance data and a string, store the value according - * to section 10.1.9 of the XForms specification. - */ - static NS_HIDDEN_(void) SetNodeValue(nsIDOMNode *aDataNode, - const nsString &aNodeValue); - /** * Convenience method for doing XPath evaluations to get bound node * for an element. Also returns the associated model if aModel != null. @@ -296,14 +289,6 @@ public: static NS_HIDDEN_(PRBool) GetSingleNodeBindingValue(nsIDOMElement* aElement, nsString& aValue); - /** - * Convenience method for doing XPath evaluations to set string value - * for an element. - * Returns PR_TRUE if the evaluation succeeds. - */ - static NS_HIDDEN_(PRBool) - SetSingleNodeBindingValue(nsIDOMElement *aElement, const nsAString &aValue, - PRBool *aChanged); /** * Dispatch an XForms event. aDefaultActionEnabled is returned indicating * if the default action of the dispatched event was enabled. aSrcElement diff --git a/mozilla/extensions/xforms/resources/locale/en-US/xforms.properties b/mozilla/extensions/xforms/resources/locale/en-US/xforms.properties index 3b6e792a5f1..a729b50fc4e 100644 --- a/mozilla/extensions/xforms/resources/locale/en-US/xforms.properties +++ b/mozilla/extensions/xforms/resources/locale/en-US/xforms.properties @@ -74,6 +74,7 @@ MDGLoopError = XForms Error (35): There are loops in the bindings of the invalidExtFunction = XForms Error (36): Non-existant extension functions listed in this model's function attribute inlineInstanceNoChildError = XForms Error (37): Inline instance has no child elements. This is illegal. inlineInstanceMultipleElementsError = XForms Error (38): Inline instance has multiple child elements. This is illegal. +modelLoopError = XForms Error (39): There seems to be an infinite loop in the event handling for the form. The maximum loop value can be set via xforms.modelLoopMax. # Warning Messages: warnSOAP = XForms Warning (1): You are using the SOAP post feature, which is an experimental feature! Beware that the functionality might change, and forms may stop working at any time.