From 5048f2617774976125fdda57b6a7ff736263baf6 Mon Sep 17 00:00:00 2001 From: "allan%beaufour.dk" Date: Sat, 29 Jan 2005 20:36:09 +0000 Subject: [PATCH] Remove direct access to MDG in nsIModelElementPrivate and save pointer to model in nsXFormsControlStub. Bug 278370, r=smaug, sr=bryner git-svn-id: svn://10.0.0.236/trunk@168509 18797224-902f-48f8-a5cc-f745e15eee43 --- .../xforms/nsIModelElementPrivate.idl | 17 ++++--- .../extensions/xforms/nsXFormsControlStub.cpp | 47 +++++++++---------- .../extensions/xforms/nsXFormsControlStub.h | 14 ++---- .../xforms/nsXFormsInputElement.cpp | 14 ++---- .../extensions/xforms/nsXFormsItemElement.cpp | 6 +-- .../xforms/nsXFormsModelElement.cpp | 23 ++++++--- .../xforms/nsXFormsOutputElement.cpp | 5 +- .../xforms/nsXFormsRepeatElement.cpp | 5 +- .../xforms/nsXFormsSetValueElement.cpp | 7 +-- .../xforms/nsXFormsUploadElement.cpp | 6 +-- 10 files changed, 67 insertions(+), 77 deletions(-) diff --git a/mozilla/extensions/xforms/nsIModelElementPrivate.idl b/mozilla/extensions/xforms/nsIModelElementPrivate.idl index e995cfe592e..c2654c13681 100644 --- a/mozilla/extensions/xforms/nsIModelElementPrivate.idl +++ b/mozilla/extensions/xforms/nsIModelElementPrivate.idl @@ -41,7 +41,7 @@ interface nsIXFormsControl; interface nsISchemaType; interface nsIInstanceElementPrivate; -interface nsXFormsMDGEngine; +interface nsIDOMNode; /** * Private interface implemented by the model element for other @@ -78,12 +78,17 @@ interface nsIModelElementPrivate : nsIXFormsModelElement nsIInstanceElementPrivate findInstanceElement(in AString id); /** - * The model's MDG. - * - * @bug nsXFormsMDGEngine is not an interface. - * @see https://bugzilla.mozilla.org/show_bug.cgi?id=278370 + * Set the value of an instance node. */ - readonly attribute nsXFormsMDGEngine MDG; + void setNodeValue(in nsIDOMNode contextNode, + in AString nodeValue, + out boolean nodeChanged); + + /** + * Get the value of an instance node. + */ + void getNodeValue(in nsIDOMNode contextNode, + out AString nodeValue); /** * Validates the instance node against the schemas loaded by the model. diff --git a/mozilla/extensions/xforms/nsXFormsControlStub.cpp b/mozilla/extensions/xforms/nsXFormsControlStub.cpp index 32d60fdfba0..de7066a47e2 100644 --- a/mozilla/extensions/xforms/nsXFormsControlStub.cpp +++ b/mozilla/extensions/xforms/nsXFormsControlStub.cpp @@ -92,7 +92,6 @@ nsXFormsControlStub::ProcessNodeBinding(const nsString &aBindingAttr, { nsresult rv; - mMDG = nsnull; if (!mDependencies) { rv = NS_NewArray(getter_AddRefs(mDependencies)); } else { @@ -100,23 +99,21 @@ nsXFormsControlStub::ProcessNodeBinding(const nsString &aBindingAttr, } NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr model; rv = nsXFormsUtils::EvaluateNodeBinding(mElement, kElementFlags, aBindingAttr, EmptyString(), aResultType, - getter_AddRefs(model), + getter_AddRefs(mModel), aResult, mDependencies); NS_ENSURE_SUCCESS(rv, rv); - if (model) { - model->AddFormControl(this); - model->GetMDG(&mMDG); + if (mModel) { + mModel->AddFormControl(this); if (aModel) { - NS_ADDREF(*aModel = model); + NS_ADDREF(*aModel = mModel); } } @@ -127,25 +124,19 @@ PRBool nsXFormsControlStub::GetReadOnlyState() { PRBool res = PR_FALSE; - if (mBoundNode && mMDG) { - const nsXFormsNodeState* ns = mMDG->GetNodeState(mBoundNode); - if (ns) { - res = ns->IsReadonly(); - } - } + if (mElement) { + mElement->HasAttribute(NS_LITERAL_STRING("read-only"), &res); + } return res; } PRBool nsXFormsControlStub::GetRelevantState() { - PRBool res = PR_TRUE; - if (mBoundNode && mMDG) { - const nsXFormsNodeState* ns = mMDG->GetNodeState(mBoundNode); - if (ns) { - res = ns->IsRelevant(); - } - } + PRBool res = PR_FALSE; + if (mElement) { + mElement->HasAttribute(NS_LITERAL_STRING("enabled"), &res); + } return res; } @@ -153,8 +144,10 @@ void nsXFormsControlStub::ToggleProperty(const nsAString &aOn, const nsAString &aOff) { - mElement->SetAttribute(aOn, NS_LITERAL_STRING("1")); - mElement->RemoveAttribute(aOff); + if (mElement) { + mElement->SetAttribute(aOn, NS_LITERAL_STRING("1")); + mElement->RemoveAttribute(aOff); + } } NS_IMETHODIMP @@ -220,7 +213,10 @@ nsXFormsControlStub::OnCreated(nsIXTFXMLVisualWrapper *aWrapper) NS_IMETHODIMP nsXFormsControlStub::OnDestroyed() { - mMDG = nsnull; + if (mModel) { + mModel->RemoveFormControl(this); + mModel = nsnull; + } mElement = nsnull; return NS_OK; @@ -258,9 +254,8 @@ nsXFormsControlStub::WillSetAttribute(nsIAtom *aName, const nsAString &aValue) if (aName == nsXFormsAtoms::model || aName == nsXFormsAtoms::bind || aName == nsXFormsAtoms::ref) { - nsCOMPtr model = nsXFormsUtils::GetModel(mElement); - if (model) - model->RemoveFormControl(this); + if (mModel) + mModel->RemoveFormControl(this); } return NS_OK; diff --git a/mozilla/extensions/xforms/nsXFormsControlStub.h b/mozilla/extensions/xforms/nsXFormsControlStub.h index 445f6062388..17bfd2fb2c7 100644 --- a/mozilla/extensions/xforms/nsXFormsControlStub.h +++ b/mozilla/extensions/xforms/nsXFormsControlStub.h @@ -47,15 +47,14 @@ #include "nsIDOMNode.h" #include "nsIXTFElement.h" +#include "nsIModelElementPrivate.h" #include "nsIXFormsControl.h" #include "nsXFormsStubElement.h" #include "nsXFormsUtils.h" class nsIDOMEvent; class nsIDOMXPathResult; -class nsIModelElementPrivate; class nsIXTFXMLVisualWrapper; -class nsXFormsMDGEngine; /** * Common stub for all XForms controls that inherit from nsIXFormsControl and @@ -66,10 +65,6 @@ class nsXFormsMDGEngine; * * @todo nsIXFormsContextControl-stub should probably also be included here * (mBoundNode is in fact also the context) (XXX) - * - * @todo I guess it would make sense to call - * nsIModelElementPrivate->RemoveFormControl in OnDestroyed()? (XXX) - * We should possible save the model as a member variable... */ class nsXFormsControlStub : public nsIXFormsControl, public nsXFormsXMLVisualStub @@ -110,8 +105,7 @@ public: nsIXTFElement::NOTIFY_DOCUMENT_CHANGED | nsIXTFElement::NOTIFY_PARENT_CHANGED | nsIXTFElement::NOTIFY_HANDLE_DEFAULT), - kElementFlags(nsXFormsUtils::ELEMENT_WITH_MODEL_ATTR), - mMDG(nsnull) + kElementFlags(nsXFormsUtils::ELEMENT_WITH_MODEL_ATTR) {}; protected: @@ -134,8 +128,8 @@ protected: */ nsCOMPtr mDependencies; - /** The MDG for the control */ - nsXFormsMDGEngine *mMDG; + /** The model for the control */ + nsCOMPtr mModel; /** Returns the read only state of the control (ie. mBoundNode) */ PRBool GetReadOnlyState(); diff --git a/mozilla/extensions/xforms/nsXFormsInputElement.cpp b/mozilla/extensions/xforms/nsXFormsInputElement.cpp index 1dd99d80020..85e7f2dbb79 100644 --- a/mozilla/extensions/xforms/nsXFormsInputElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsInputElement.cpp @@ -56,7 +56,6 @@ #include "nsIModelElementPrivate.h" #include "nsIContent.h" #include "nsIDOMXPathExpression.h" -#include "nsXFormsMDGEngine.h" /** * Implementation of the \, \, and \ elements. @@ -224,7 +223,7 @@ nsXFormsInputElement::Focus(nsIDOMEvent *aEvent) NS_IMETHODIMP nsXFormsInputElement::Blur(nsIDOMEvent *aEvent) { - if (!mControl && !mBoundNode && !mMDG) + if (!mControl && !mBoundNode && !mModel) return NS_OK; nsAutoString value; @@ -249,11 +248,10 @@ nsXFormsInputElement::Blur(nsIDOMEvent *aEvent) } PRBool changed; - nsresult rv = mMDG->SetNodeValue(mBoundNode, value, PR_TRUE, &changed); + nsresult rv = mModel->SetNodeValue(mBoundNode, value, &changed); NS_ENSURE_SUCCESS(rv, rv); if (changed) { - nsCOMPtr modelPriv = nsXFormsUtils::GetModel(mElement); - nsCOMPtr model = do_QueryInterface(modelPriv); + nsCOMPtr model = do_QueryInterface(mModel); if (model) { rv = nsXFormsUtils::DispatchEvent(model, eEvent_Recalculate); @@ -295,7 +293,7 @@ nsXFormsInputElement::Bind() NS_IMETHODIMP nsXFormsInputElement::Refresh() { - if (!mControl && !mMDG) + if (!mControl || !mModel) return NS_OK; nsAutoString text; @@ -316,9 +314,7 @@ nsXFormsInputElement::Refresh() if (mType == eType_Input) { nsCOMPtr type; - /// @todo: Enable type support. This will be moved away from the model, - /// will it not? (XXX) - // model->GetTypeForControl(this, getter_AddRefs(type)); + mModel->GetTypeForControl(this, getter_AddRefs(type)); nsCOMPtr biType = do_QueryInterface(type); PRUint16 typeValue = nsISchemaBuiltinType::BUILTIN_TYPE_STRING; if (biType) diff --git a/mozilla/extensions/xforms/nsXFormsItemElement.cpp b/mozilla/extensions/xforms/nsXFormsItemElement.cpp index fd5244ca9bc..be66de23bb1 100644 --- a/mozilla/extensions/xforms/nsXFormsItemElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsItemElement.cpp @@ -52,7 +52,6 @@ #include "nsIXTFXMLVisualWrapper.h" #include "nsIXFormsContextControl.h" #include "nsIModelElementPrivate.h" -#include "nsXFormsMDGEngine.h" /** * nsXFormsItemElement implements the XForms \ element. @@ -322,12 +321,9 @@ nsXFormsItemElement::WriteSelectedItems(nsIDOMNode *aContainer) /// @see https://bugzilla.mozilla.org/show_bug.cgi?id=278207 /// Wherever its final resting place might be, it should be shared /// with the code in nsXFormsInputElement - nsXFormsMDGEngine* MDG; - model->GetMDG(&MDG); - NS_ENSURE_STATE(MDG); PRBool changed; - rv = MDG->SetNodeValue(textNode, value, PR_TRUE, &changed); + rv = model->SetNodeValue(textNode, value, &changed); NS_ENSURE_SUCCESS(rv, rv); if (changed) { rv = nsXFormsUtils::DispatchEvent(modelNode, eEvent_Recalculate); diff --git a/mozilla/extensions/xforms/nsXFormsModelElement.cpp b/mozilla/extensions/xforms/nsXFormsModelElement.cpp index 03e89b008a4..acea4cddc7d 100644 --- a/mozilla/extensions/xforms/nsXFormsModelElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsModelElement.cpp @@ -771,14 +771,25 @@ nsXFormsModelElement::FindInstanceElement(const nsAString &aID, return NS_OK; } -nsresult -nsXFormsModelElement::GetMDG(nsXFormsMDGEngine **aMDG) -{ - if (aMDG) - *aMDG = &mMDG; - return NS_OK; +NS_IMETHODIMP +nsXFormsModelElement::SetNodeValue(nsIDOMNode *aContextNode, + const nsAString &aNodeValue, + PRBool *aNodeChanged) +{ + return mMDG.SetNodeValue(aContextNode, + aNodeValue, + PR_TRUE, + aNodeChanged); } +NS_IMETHODIMP +nsXFormsModelElement::GetNodeValue(nsIDOMNode *aContextNode, + nsAString &aNodeValue) +{ + return mMDG.GetNodeValue(aContextNode, + aNodeValue); +} + NS_IMETHODIMP nsXFormsModelElement::ValidateNode(nsIDOMNode *aInstanceNode, PRBool *aResult) { diff --git a/mozilla/extensions/xforms/nsXFormsOutputElement.cpp b/mozilla/extensions/xforms/nsXFormsOutputElement.cpp index eafb5430f00..5f0a5dc4622 100755 --- a/mozilla/extensions/xforms/nsXFormsOutputElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsOutputElement.cpp @@ -184,9 +184,8 @@ nsXFormsOutputElement::WillSetAttribute(nsIAtom *aName, const nsAString &aValue) aName == nsXFormsAtoms::ref || aName == nsXFormsAtoms::model || aName == nsXFormsAtoms::value) { - nsCOMPtr model = nsXFormsUtils::GetModel(mElement); - if (model) - model->RemoveFormControl(this); + if (mModel) + mModel->RemoveFormControl(this); } return NS_OK; diff --git a/mozilla/extensions/xforms/nsXFormsRepeatElement.cpp b/mozilla/extensions/xforms/nsXFormsRepeatElement.cpp index dbacfdd26c9..18071ee6d41 100644 --- a/mozilla/extensions/xforms/nsXFormsRepeatElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsRepeatElement.cpp @@ -231,9 +231,8 @@ nsXFormsRepeatElement::WillSetAttribute(nsIAtom *aName, const nsAString &aValue) if (aName == nsXFormsAtoms::bind || aName == nsXFormsAtoms::nodeset || aName == nsXFormsAtoms::model) { - nsCOMPtr model = nsXFormsUtils::GetModel(mElement); - if (model) { - model->RemoveFormControl(this); + if (mModel) { + mModel->RemoveFormControl(this); } } diff --git a/mozilla/extensions/xforms/nsXFormsSetValueElement.cpp b/mozilla/extensions/xforms/nsXFormsSetValueElement.cpp index 09a393c9a56..b1733fd811a 100644 --- a/mozilla/extensions/xforms/nsXFormsSetValueElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsSetValueElement.cpp @@ -104,13 +104,8 @@ nsXFormsSetValueElement::HandleAction(nsIDOMEvent* aEvent, n3->GetTextContent(value); } - nsXFormsMDGEngine* MDG; - modelPriv->GetMDG(&MDG); - if (!MDG) - return NS_ERROR_FAILURE; - PRBool changed; - rv = MDG->SetNodeValue(singleNode, value, PR_TRUE, &changed); + rv = modelPriv->SetNodeValue(singleNode, value, &changed); NS_ENSURE_SUCCESS(rv, rv); if (changed) { diff --git a/mozilla/extensions/xforms/nsXFormsUploadElement.cpp b/mozilla/extensions/xforms/nsXFormsUploadElement.cpp index f3762991d12..1b466c9772e 100644 --- a/mozilla/extensions/xforms/nsXFormsUploadElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsUploadElement.cpp @@ -56,7 +56,6 @@ #include "nsIContent.h" #include "nsIDOMXPathExpression.h" #include "nsNetUtil.h" -#include "nsXFormsMDGEngine.h" static void ReleaseObject(void *aObject, @@ -213,7 +212,7 @@ nsXFormsUploadElement::Focus(nsIDOMEvent *aEvent) NS_IMETHODIMP nsXFormsUploadElement::Blur(nsIDOMEvent *aEvent) { - if (!mInput || mBoundNode || mMDG) + if (!mInput || !mBoundNode || !mModel) return NS_OK; nsAutoString value; @@ -236,7 +235,8 @@ nsXFormsUploadElement::Blur(nsIDOMEvent *aEvent) // sync with what is actually submitted. nsCAutoString spec; NS_GetURLSpecFromFile(file, spec); - mMDG->SetNodeValue(mBoundNode, NS_ConvertUTF8toUTF16(spec)); + PRBool changed; + mModel->SetNodeValue(mBoundNode, NS_ConvertUTF8toUTF16(spec), &changed); return NS_OK; }