diff --git a/content/html/content/src/nsHTMLInputElement.cpp b/content/html/content/src/nsHTMLInputElement.cpp index e134db9068f3..bc764bd63c65 100644 --- a/content/html/content/src/nsHTMLInputElement.cpp +++ b/content/html/content/src/nsHTMLInputElement.cpp @@ -32,6 +32,8 @@ #include "nsIForm.h" #include "nsIWidget.h" #include "nsITextWidget.h" +#include "nsICheckButton.h" +#include "nsIRadioButton.h" // XXX align=left, hspace, vspace, border? other nav4 attrs @@ -40,6 +42,8 @@ static NS_DEFINE_IID(kIDOMHTMLFormElementIID, NS_IDOMHTMLFORMELEMENT_IID); static NS_DEFINE_IID(kIFormIID, NS_IFORM_IID); static NS_DEFINE_IID(kIFormControlIID, NS_IFORMCONTROL_IID); static NS_DEFINE_IID(kITextWidgetIID, NS_ITEXTWIDGET_IID); +static NS_DEFINE_IID(kIRadioIID, NS_IRADIOBUTTON_IID); +static NS_DEFINE_IID(kICheckButtonIID, NS_ICHECKBUTTON_IID); class nsHTMLInputElement : public nsIDOMHTMLInputElement, public nsIScriptObjectOwner, @@ -244,7 +248,7 @@ NS_IMPL_STRING_ATTR(nsHTMLInputElement, Accept, accept, eSetAttrNotify_None) NS_IMPL_STRING_ATTR(nsHTMLInputElement, AccessKey, accesskey, eSetAttrNotify_None) NS_IMPL_STRING_ATTR(nsHTMLInputElement, Align, align, eSetAttrNotify_Reflow) NS_IMPL_STRING_ATTR(nsHTMLInputElement, Alt, alt, eSetAttrNotify_None) -NS_IMPL_BOOL_ATTR(nsHTMLInputElement, Checked, checked, eSetAttrNotify_Render) +//NS_IMPL_BOOL_ATTR(nsHTMLInputElement, Checked, checked, eSetAttrNotify_Render) NS_IMPL_BOOL_ATTR(nsHTMLInputElement, Disabled, disabled, eSetAttrNotify_Render) NS_IMPL_INT_ATTR(nsHTMLInputElement, MaxLength, maxlength, eSetAttrNotify_Render) NS_IMPL_STRING_ATTR(nsHTMLInputElement, Name, name, eSetAttrNotify_Restart) @@ -253,7 +257,7 @@ NS_IMPL_STRING_ATTR(nsHTMLInputElement, Size, size, eSetAttrNotify_Render) NS_IMPL_STRING_ATTR(nsHTMLInputElement, Src, src, eSetAttrNotify_Render) NS_IMPL_INT_ATTR(nsHTMLInputElement, TabIndex, tabindex, eSetAttrNotify_Render) NS_IMPL_STRING_ATTR(nsHTMLInputElement, UseMap, usemap, eSetAttrNotify_None) -NS_IMPL_STRING_ATTR(nsHTMLInputElement, Value, value, eSetAttrNotify_Render) +//NS_IMPL_STRING_ATTR(nsHTMLInputElement, Value, value, eSetAttrNotify_Render) NS_IMETHODIMP nsHTMLInputElement::GetType(nsString& aValue) @@ -262,6 +266,113 @@ nsHTMLInputElement::GetType(nsString& aValue) return NS_OK; } +NS_IMETHODIMP +nsHTMLInputElement::GetValue(nsString& aValue) +{ + PRInt32 type; + GetType(&type); + if (NS_FORM_INPUT_TEXT == type) { + if (nsnull != mWidget) { + nsITextWidget* text = nsnull; + if (NS_OK == mWidget->QueryInterface(kITextWidgetIID,(void**)&text)) { + PRUint32 size; + text->GetText(aValue,0,size); + NS_RELEASE(text); + return NS_OK; + } + } + } + + return mInner.GetAttribute(nsHTMLAtoms::value, aValue); +} + + +NS_IMETHODIMP +nsHTMLInputElement::SetValue(const nsString& aValue) +{ + PRInt32 type; + GetType(&type); + if (NS_FORM_INPUT_TEXT == type) { + if (nsnull != mWidget) { + nsITextWidget* text = nsnull; + if (NS_OK == mWidget->QueryInterface(kITextWidgetIID,(void**)&text)) { + PRUint32 size; + text->SetText(aValue,size); + NS_RELEASE(text); + return NS_OK; + } + } + } + + return mInner.SetAttribute(nsHTMLAtoms::value, aValue, PR_TRUE); +} + +NS_IMETHODIMP +nsHTMLInputElement::GetChecked(PRBool* aValue) +{ + PRInt32 type; + GetType(&type); + if (NS_FORM_INPUT_CHECKBOX == type) { + if (nsnull != mWidget) { + nsICheckButton* checkbox = nsnull; + if (NS_OK == mWidget->QueryInterface(kICheckButtonIID,(void**)&checkbox)) { + checkbox->GetState(*aValue); + NS_RELEASE(checkbox); + return NS_OK; + } + } + } else if (NS_FORM_INPUT_RADIO == type) { + if (nsnull != mWidget) { + nsIRadioButton* radio = nsnull; + if (NS_OK == mWidget->QueryInterface(kIRadioIID,(void**)&radio)) { + radio->GetState(*aValue); + NS_RELEASE(radio); + return NS_OK; + } + } + } + + nsHTMLValue val; + nsresult rv = mInner.GetAttribute(nsHTMLAtoms::checked, val); + *aValue = (NS_CONTENT_ATTR_NOT_THERE != rv); + return NS_OK; +} + + +NS_IMETHODIMP +nsHTMLInputElement::SetChecked(PRBool aValue) +{ + PRInt32 type; + GetType(&type); + if (NS_FORM_INPUT_CHECKBOX == type) { + if (nsnull != mWidget) { + nsICheckButton* checkbox = nsnull; + if (NS_OK == mWidget->QueryInterface(kICheckButtonIID,(void**)&checkbox)) { + checkbox->SetState(aValue); + NS_RELEASE(checkbox); + return NS_OK; + } + } + } else if (NS_FORM_INPUT_RADIO == type) { + if (nsnull != mWidget) { + nsIRadioButton* radio = nsnull; + if (NS_OK == mWidget->QueryInterface(kIRadioIID,(void**)&radio)) { + radio->SetState(aValue); + NS_RELEASE(radio); + return NS_OK; + } + } + } + + nsAutoString empty; + if (aValue) { + return mInner.SetAttribute(nsHTMLAtoms::checked, empty, PR_TRUE); + } else { + mInner.UnsetAttribute(nsHTMLAtoms::checked, PR_TRUE); + return NS_OK; + } +} + NS_IMETHODIMP nsHTMLInputElement::Blur() { diff --git a/layout/html/content/src/nsHTMLInputElement.cpp b/layout/html/content/src/nsHTMLInputElement.cpp index e134db9068f3..bc764bd63c65 100644 --- a/layout/html/content/src/nsHTMLInputElement.cpp +++ b/layout/html/content/src/nsHTMLInputElement.cpp @@ -32,6 +32,8 @@ #include "nsIForm.h" #include "nsIWidget.h" #include "nsITextWidget.h" +#include "nsICheckButton.h" +#include "nsIRadioButton.h" // XXX align=left, hspace, vspace, border? other nav4 attrs @@ -40,6 +42,8 @@ static NS_DEFINE_IID(kIDOMHTMLFormElementIID, NS_IDOMHTMLFORMELEMENT_IID); static NS_DEFINE_IID(kIFormIID, NS_IFORM_IID); static NS_DEFINE_IID(kIFormControlIID, NS_IFORMCONTROL_IID); static NS_DEFINE_IID(kITextWidgetIID, NS_ITEXTWIDGET_IID); +static NS_DEFINE_IID(kIRadioIID, NS_IRADIOBUTTON_IID); +static NS_DEFINE_IID(kICheckButtonIID, NS_ICHECKBUTTON_IID); class nsHTMLInputElement : public nsIDOMHTMLInputElement, public nsIScriptObjectOwner, @@ -244,7 +248,7 @@ NS_IMPL_STRING_ATTR(nsHTMLInputElement, Accept, accept, eSetAttrNotify_None) NS_IMPL_STRING_ATTR(nsHTMLInputElement, AccessKey, accesskey, eSetAttrNotify_None) NS_IMPL_STRING_ATTR(nsHTMLInputElement, Align, align, eSetAttrNotify_Reflow) NS_IMPL_STRING_ATTR(nsHTMLInputElement, Alt, alt, eSetAttrNotify_None) -NS_IMPL_BOOL_ATTR(nsHTMLInputElement, Checked, checked, eSetAttrNotify_Render) +//NS_IMPL_BOOL_ATTR(nsHTMLInputElement, Checked, checked, eSetAttrNotify_Render) NS_IMPL_BOOL_ATTR(nsHTMLInputElement, Disabled, disabled, eSetAttrNotify_Render) NS_IMPL_INT_ATTR(nsHTMLInputElement, MaxLength, maxlength, eSetAttrNotify_Render) NS_IMPL_STRING_ATTR(nsHTMLInputElement, Name, name, eSetAttrNotify_Restart) @@ -253,7 +257,7 @@ NS_IMPL_STRING_ATTR(nsHTMLInputElement, Size, size, eSetAttrNotify_Render) NS_IMPL_STRING_ATTR(nsHTMLInputElement, Src, src, eSetAttrNotify_Render) NS_IMPL_INT_ATTR(nsHTMLInputElement, TabIndex, tabindex, eSetAttrNotify_Render) NS_IMPL_STRING_ATTR(nsHTMLInputElement, UseMap, usemap, eSetAttrNotify_None) -NS_IMPL_STRING_ATTR(nsHTMLInputElement, Value, value, eSetAttrNotify_Render) +//NS_IMPL_STRING_ATTR(nsHTMLInputElement, Value, value, eSetAttrNotify_Render) NS_IMETHODIMP nsHTMLInputElement::GetType(nsString& aValue) @@ -262,6 +266,113 @@ nsHTMLInputElement::GetType(nsString& aValue) return NS_OK; } +NS_IMETHODIMP +nsHTMLInputElement::GetValue(nsString& aValue) +{ + PRInt32 type; + GetType(&type); + if (NS_FORM_INPUT_TEXT == type) { + if (nsnull != mWidget) { + nsITextWidget* text = nsnull; + if (NS_OK == mWidget->QueryInterface(kITextWidgetIID,(void**)&text)) { + PRUint32 size; + text->GetText(aValue,0,size); + NS_RELEASE(text); + return NS_OK; + } + } + } + + return mInner.GetAttribute(nsHTMLAtoms::value, aValue); +} + + +NS_IMETHODIMP +nsHTMLInputElement::SetValue(const nsString& aValue) +{ + PRInt32 type; + GetType(&type); + if (NS_FORM_INPUT_TEXT == type) { + if (nsnull != mWidget) { + nsITextWidget* text = nsnull; + if (NS_OK == mWidget->QueryInterface(kITextWidgetIID,(void**)&text)) { + PRUint32 size; + text->SetText(aValue,size); + NS_RELEASE(text); + return NS_OK; + } + } + } + + return mInner.SetAttribute(nsHTMLAtoms::value, aValue, PR_TRUE); +} + +NS_IMETHODIMP +nsHTMLInputElement::GetChecked(PRBool* aValue) +{ + PRInt32 type; + GetType(&type); + if (NS_FORM_INPUT_CHECKBOX == type) { + if (nsnull != mWidget) { + nsICheckButton* checkbox = nsnull; + if (NS_OK == mWidget->QueryInterface(kICheckButtonIID,(void**)&checkbox)) { + checkbox->GetState(*aValue); + NS_RELEASE(checkbox); + return NS_OK; + } + } + } else if (NS_FORM_INPUT_RADIO == type) { + if (nsnull != mWidget) { + nsIRadioButton* radio = nsnull; + if (NS_OK == mWidget->QueryInterface(kIRadioIID,(void**)&radio)) { + radio->GetState(*aValue); + NS_RELEASE(radio); + return NS_OK; + } + } + } + + nsHTMLValue val; + nsresult rv = mInner.GetAttribute(nsHTMLAtoms::checked, val); + *aValue = (NS_CONTENT_ATTR_NOT_THERE != rv); + return NS_OK; +} + + +NS_IMETHODIMP +nsHTMLInputElement::SetChecked(PRBool aValue) +{ + PRInt32 type; + GetType(&type); + if (NS_FORM_INPUT_CHECKBOX == type) { + if (nsnull != mWidget) { + nsICheckButton* checkbox = nsnull; + if (NS_OK == mWidget->QueryInterface(kICheckButtonIID,(void**)&checkbox)) { + checkbox->SetState(aValue); + NS_RELEASE(checkbox); + return NS_OK; + } + } + } else if (NS_FORM_INPUT_RADIO == type) { + if (nsnull != mWidget) { + nsIRadioButton* radio = nsnull; + if (NS_OK == mWidget->QueryInterface(kIRadioIID,(void**)&radio)) { + radio->SetState(aValue); + NS_RELEASE(radio); + return NS_OK; + } + } + } + + nsAutoString empty; + if (aValue) { + return mInner.SetAttribute(nsHTMLAtoms::checked, empty, PR_TRUE); + } else { + mInner.UnsetAttribute(nsHTMLAtoms::checked, PR_TRUE); + return NS_OK; + } +} + NS_IMETHODIMP nsHTMLInputElement::Blur() {