diff --git a/mozilla/content/html/content/src/nsHTMLSelectElement.cpp b/mozilla/content/html/content/src/nsHTMLSelectElement.cpp
index 309cbac779a..73c0c8d1e8c 100644
--- a/mozilla/content/html/content/src/nsHTMLSelectElement.cpp
+++ b/mozilla/content/html/content/src/nsHTMLSelectElement.cpp
@@ -18,9 +18,6 @@
*/
#include "nsIDOMHTMLSelectElement.h"
#include "nsIDOMHTMLFormElement.h"
-#include "nsIFormControl.h"
-#include "nsIForm.h"
-#include "nsIDOMHTMLCollection.h"
#include "nsIScriptObjectOwner.h"
#include "nsIDOMEventReceiver.h"
#include "nsIHTMLContent.h"
@@ -30,15 +27,17 @@
#include "nsIStyleContext.h"
#include "nsStyleConsts.h"
#include "nsIPresContext.h"
-#include "nsIWidget.h"
-#include "nsHTMLAtoms.h"
#include "nsIHTMLAttributes.h"
+#include "nsIFormControl.h"
+#include "nsIForm.h"
+#include "nsIWidget.h"
+#include "nsIDOMHTMLCollection.h"
#include "nsIDOMHTMLOptionElement.h"
// Notify/query select frame for selectedIndex
-#include "nsIFormControlFrame.h"
#include "nsIDocument.h"
#include "nsIPresShell.h"
+#include "nsIFormControlFrame.h"
#include "nsIFrame.h"
static NS_DEFINE_IID(kIDOMHTMLSelectElementIID, NS_IDOMHTMLSELECTELEMENT_IID);
@@ -139,14 +138,10 @@ public:
NS_IMETHOD Init();
protected:
-
nsGenericHTMLContainerElement mInner;
nsIWidget* mWidget; // XXX this needs to go away when FindFrameWithContent is efficient
nsIForm* mForm;
nsOptionList* mOptions;
-
- // Return the primary frame associated with this content
- nsresult GetPrimaryFrame(nsIFormControlFrame *&aFormControlFrame);
};
@@ -318,7 +313,7 @@ NS_IMETHODIMP
nsHTMLSelectElement::GetSelectedIndex(PRInt32* aValue)
{
nsIFormControlFrame* formControlFrame = nsnull;
- if (NS_OK == GetPrimaryFrame(formControlFrame)) {
+ if (NS_OK == nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame)) {
nsString value;
formControlFrame->GetProperty(nsHTMLAtoms::selectedindex, value);
NS_RELEASE(formControlFrame);
@@ -331,8 +326,33 @@ nsHTMLSelectElement::GetSelectedIndex(PRInt32* aValue)
return NS_OK;
}
}
+ } else { // The frame hasn't been created yet. Use the options array
+ *aValue = -1;
+ nsIDOMHTMLCollection* options;
+ if (NS_OK == GetOptions(&options)) {
+ PRUint32 numOptions;
+ options->GetLength(&numOptions);
+
+ for (PRUint32 i = 0; i < numOptions; i++) {
+ nsIDOMNode* node = nsnull;
+ if ((NS_OK == options->Item(i, &node)) && node) {
+ nsIDOMHTMLOptionElement* option = nsnull;
+ if (NS_OK == node->QueryInterface(kIDOMHTMLOptionElementIID, (void**)&option)) {
+ PRBool selected;
+ option->GetDefaultSelected(&selected); // DefaultSelected == HTML Selected
+ NS_RELEASE(option);
+ if (selected) {
+ *aValue = i;
+ NS_RELEASE(node); // Have to release this as the call below is skipped.
+ break;
+ }
+ }
+ NS_RELEASE(node);
+ }
+ }
+ NS_RELEASE(options);
+ }
}
- *aValue = -1; // If no selectedIndex was to be had, make it -1 (none selected)
return NS_OK;
}
@@ -340,7 +360,7 @@ NS_IMETHODIMP
nsHTMLSelectElement::SetSelectedIndex(PRInt32 aValue)
{
nsIFormControlFrame* formControlFrame = nsnull;
- if (NS_OK == GetPrimaryFrame(formControlFrame)) {
+ if (NS_OK == nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame)) {
nsString value;
value.Append(aValue, 10);
formControlFrame->SetProperty(nsHTMLAtoms::selectedindex, value);
@@ -690,6 +710,7 @@ nsOptionList::Clear()
PRUint32 numOptions = mElements.Count();
for (PRUint32 i = 0; i < numOptions; i++) {
nsIDOMHTMLOptionElement* option = (nsIDOMHTMLOptionElement*)mElements.ElementAt(i);
+ NS_ASSERTION(option,"option already released");
NS_RELEASE(option);
}
mElements.Clear();
@@ -703,26 +724,3 @@ nsHTMLSelectElement::GetStyleHintForAttributeChange(
nsGenericHTMLElement::GetStyleHintForCommonAttributes(this, aAttribute, aHint);
return NS_OK;
}
-
-nsresult
-nsHTMLSelectElement::GetPrimaryFrame(nsIFormControlFrame *&aFormControlFrame)
-{
- nsIDocument* doc = nsnull;
- nsresult res = NS_NOINTERFACE;
- // Get the document
- if (NS_OK == GetDocument(doc)) {
- // Get presentation shell 0
- nsIPresShell* presShell = doc->GetShellAt(0);
- if (nsnull != presShell) {
- nsIFrame *frame = nsnull;
- presShell->GetPrimaryFrameFor(this, &frame);
- if (nsnull != frame) {
- res = frame->QueryInterface(kIFormControlFrameIID, (void**)&aFormControlFrame);
- }
- NS_RELEASE(presShell);
- }
- NS_RELEASE(doc);
- }
-
- return res;
-}
diff --git a/mozilla/layout/html/content/src/nsHTMLSelectElement.cpp b/mozilla/layout/html/content/src/nsHTMLSelectElement.cpp
index 309cbac779a..73c0c8d1e8c 100644
--- a/mozilla/layout/html/content/src/nsHTMLSelectElement.cpp
+++ b/mozilla/layout/html/content/src/nsHTMLSelectElement.cpp
@@ -18,9 +18,6 @@
*/
#include "nsIDOMHTMLSelectElement.h"
#include "nsIDOMHTMLFormElement.h"
-#include "nsIFormControl.h"
-#include "nsIForm.h"
-#include "nsIDOMHTMLCollection.h"
#include "nsIScriptObjectOwner.h"
#include "nsIDOMEventReceiver.h"
#include "nsIHTMLContent.h"
@@ -30,15 +27,17 @@
#include "nsIStyleContext.h"
#include "nsStyleConsts.h"
#include "nsIPresContext.h"
-#include "nsIWidget.h"
-#include "nsHTMLAtoms.h"
#include "nsIHTMLAttributes.h"
+#include "nsIFormControl.h"
+#include "nsIForm.h"
+#include "nsIWidget.h"
+#include "nsIDOMHTMLCollection.h"
#include "nsIDOMHTMLOptionElement.h"
// Notify/query select frame for selectedIndex
-#include "nsIFormControlFrame.h"
#include "nsIDocument.h"
#include "nsIPresShell.h"
+#include "nsIFormControlFrame.h"
#include "nsIFrame.h"
static NS_DEFINE_IID(kIDOMHTMLSelectElementIID, NS_IDOMHTMLSELECTELEMENT_IID);
@@ -139,14 +138,10 @@ public:
NS_IMETHOD Init();
protected:
-
nsGenericHTMLContainerElement mInner;
nsIWidget* mWidget; // XXX this needs to go away when FindFrameWithContent is efficient
nsIForm* mForm;
nsOptionList* mOptions;
-
- // Return the primary frame associated with this content
- nsresult GetPrimaryFrame(nsIFormControlFrame *&aFormControlFrame);
};
@@ -318,7 +313,7 @@ NS_IMETHODIMP
nsHTMLSelectElement::GetSelectedIndex(PRInt32* aValue)
{
nsIFormControlFrame* formControlFrame = nsnull;
- if (NS_OK == GetPrimaryFrame(formControlFrame)) {
+ if (NS_OK == nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame)) {
nsString value;
formControlFrame->GetProperty(nsHTMLAtoms::selectedindex, value);
NS_RELEASE(formControlFrame);
@@ -331,8 +326,33 @@ nsHTMLSelectElement::GetSelectedIndex(PRInt32* aValue)
return NS_OK;
}
}
+ } else { // The frame hasn't been created yet. Use the options array
+ *aValue = -1;
+ nsIDOMHTMLCollection* options;
+ if (NS_OK == GetOptions(&options)) {
+ PRUint32 numOptions;
+ options->GetLength(&numOptions);
+
+ for (PRUint32 i = 0; i < numOptions; i++) {
+ nsIDOMNode* node = nsnull;
+ if ((NS_OK == options->Item(i, &node)) && node) {
+ nsIDOMHTMLOptionElement* option = nsnull;
+ if (NS_OK == node->QueryInterface(kIDOMHTMLOptionElementIID, (void**)&option)) {
+ PRBool selected;
+ option->GetDefaultSelected(&selected); // DefaultSelected == HTML Selected
+ NS_RELEASE(option);
+ if (selected) {
+ *aValue = i;
+ NS_RELEASE(node); // Have to release this as the call below is skipped.
+ break;
+ }
+ }
+ NS_RELEASE(node);
+ }
+ }
+ NS_RELEASE(options);
+ }
}
- *aValue = -1; // If no selectedIndex was to be had, make it -1 (none selected)
return NS_OK;
}
@@ -340,7 +360,7 @@ NS_IMETHODIMP
nsHTMLSelectElement::SetSelectedIndex(PRInt32 aValue)
{
nsIFormControlFrame* formControlFrame = nsnull;
- if (NS_OK == GetPrimaryFrame(formControlFrame)) {
+ if (NS_OK == nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame)) {
nsString value;
value.Append(aValue, 10);
formControlFrame->SetProperty(nsHTMLAtoms::selectedindex, value);
@@ -690,6 +710,7 @@ nsOptionList::Clear()
PRUint32 numOptions = mElements.Count();
for (PRUint32 i = 0; i < numOptions; i++) {
nsIDOMHTMLOptionElement* option = (nsIDOMHTMLOptionElement*)mElements.ElementAt(i);
+ NS_ASSERTION(option,"option already released");
NS_RELEASE(option);
}
mElements.Clear();
@@ -703,26 +724,3 @@ nsHTMLSelectElement::GetStyleHintForAttributeChange(
nsGenericHTMLElement::GetStyleHintForCommonAttributes(this, aAttribute, aHint);
return NS_OK;
}
-
-nsresult
-nsHTMLSelectElement::GetPrimaryFrame(nsIFormControlFrame *&aFormControlFrame)
-{
- nsIDocument* doc = nsnull;
- nsresult res = NS_NOINTERFACE;
- // Get the document
- if (NS_OK == GetDocument(doc)) {
- // Get presentation shell 0
- nsIPresShell* presShell = doc->GetShellAt(0);
- if (nsnull != presShell) {
- nsIFrame *frame = nsnull;
- presShell->GetPrimaryFrameFor(this, &frame);
- if (nsnull != frame) {
- res = frame->QueryInterface(kIFormControlFrameIID, (void**)&aFormControlFrame);
- }
- NS_RELEASE(presShell);
- }
- NS_RELEASE(doc);
- }
-
- return res;
-}