diff --git a/mozilla/content/html/content/src/nsHTMLFormElement.cpp b/mozilla/content/html/content/src/nsHTMLFormElement.cpp
index 0655124eb72..566f0ef4a11 100644
--- a/mozilla/content/html/content/src/nsHTMLFormElement.cpp
+++ b/mozilla/content/html/content/src/nsHTMLFormElement.cpp
@@ -161,7 +161,7 @@ nsHTMLFormElement::nsHTMLFormElement(nsIAtom* aTag)
mInner.Init(this, aTag);
mControls = new nsFormControlList();
NS_ADDREF(mControls);
-//nsTraceRefcnt::Create((nsIForm*)this, "nsHTMLFormElement", __FILE__, __LINE__);
+nsTraceRefcnt::Create((nsIForm*)this, "nsHTMLFormElement", __FILE__, __LINE__);
}
nsHTMLFormElement::~nsHTMLFormElement()
@@ -180,7 +180,7 @@ nsHTMLFormElement::~nsHTMLFormElement()
NS_RELEASE(mControls);
-//nsTraceRefcnt::Destroy((nsIForm*)this, __FILE__, __LINE__);
+nsTraceRefcnt::Destroy((nsIForm*)this, __FILE__, __LINE__);
}
// nsISupports
@@ -209,7 +209,7 @@ nsHTMLFormElement::QueryInterface(REFNSIID aIID, void** aInstancePtr)
NS_IMETHODIMP
nsHTMLFormElement::AddRef(void)
{
-//nsTraceRefcnt::AddRef((nsIForm*)this, mRefCnt+1, __FILE__, __LINE__);
+nsTraceRefcnt::AddRef((nsIForm*)this, mRefCnt+1, __FILE__, __LINE__);
PRInt32 refCnt = mRefCnt; // debugging
return ++mRefCnt;
}
@@ -217,7 +217,7 @@ nsHTMLFormElement::AddRef(void)
NS_IMETHODIMP_(nsrefcnt)
nsHTMLFormElement::Release()
{
-//nsTraceRefcnt::Release((nsIForm*)this, mRefCnt-1, __FILE__, __LINE__);
+nsTraceRefcnt::Release((nsIForm*)this, mRefCnt-1, __FILE__, __LINE__);
--mRefCnt;
PRUint32 numChildren;
GetElementCount(&numChildren);
diff --git a/mozilla/layout/html/content/src/nsHTMLFormElement.cpp b/mozilla/layout/html/content/src/nsHTMLFormElement.cpp
index 0655124eb72..566f0ef4a11 100644
--- a/mozilla/layout/html/content/src/nsHTMLFormElement.cpp
+++ b/mozilla/layout/html/content/src/nsHTMLFormElement.cpp
@@ -161,7 +161,7 @@ nsHTMLFormElement::nsHTMLFormElement(nsIAtom* aTag)
mInner.Init(this, aTag);
mControls = new nsFormControlList();
NS_ADDREF(mControls);
-//nsTraceRefcnt::Create((nsIForm*)this, "nsHTMLFormElement", __FILE__, __LINE__);
+nsTraceRefcnt::Create((nsIForm*)this, "nsHTMLFormElement", __FILE__, __LINE__);
}
nsHTMLFormElement::~nsHTMLFormElement()
@@ -180,7 +180,7 @@ nsHTMLFormElement::~nsHTMLFormElement()
NS_RELEASE(mControls);
-//nsTraceRefcnt::Destroy((nsIForm*)this, __FILE__, __LINE__);
+nsTraceRefcnt::Destroy((nsIForm*)this, __FILE__, __LINE__);
}
// nsISupports
@@ -209,7 +209,7 @@ nsHTMLFormElement::QueryInterface(REFNSIID aIID, void** aInstancePtr)
NS_IMETHODIMP
nsHTMLFormElement::AddRef(void)
{
-//nsTraceRefcnt::AddRef((nsIForm*)this, mRefCnt+1, __FILE__, __LINE__);
+nsTraceRefcnt::AddRef((nsIForm*)this, mRefCnt+1, __FILE__, __LINE__);
PRInt32 refCnt = mRefCnt; // debugging
return ++mRefCnt;
}
@@ -217,7 +217,7 @@ nsHTMLFormElement::AddRef(void)
NS_IMETHODIMP_(nsrefcnt)
nsHTMLFormElement::Release()
{
-//nsTraceRefcnt::Release((nsIForm*)this, mRefCnt-1, __FILE__, __LINE__);
+nsTraceRefcnt::Release((nsIForm*)this, mRefCnt-1, __FILE__, __LINE__);
--mRefCnt;
PRUint32 numChildren;
GetElementCount(&numChildren);
diff --git a/mozilla/layout/html/forms/src/nsFormFrame.cpp b/mozilla/layout/html/forms/src/nsFormFrame.cpp
index 8f795098b5a..ca7f4e207d6 100644
--- a/mozilla/layout/html/forms/src/nsFormFrame.cpp
+++ b/mozilla/layout/html/forms/src/nsFormFrame.cpp
@@ -79,6 +79,71 @@ static NS_DEFINE_IID(kIFrameIID, NS_IFRAME_IID);
nsFormFrameTable* nsFormFrame::gFormFrameTable = new nsFormFrameTable();
+nsFormFrameTableEntry::
+nsFormFrameTableEntry(nsIPresContext& aPresContext,
+ nsIDOMHTMLFormElement& aFormElement,
+ nsFormFrame& aFormFrame) : mPresContext(&aPresContext),
+ mFormElement(&aFormElement),
+ mFormFrame(&aFormFrame)
+{
+}
+
+nsFormFrameTableEntry::~nsFormFrameTableEntry()
+{
+}
+
+nsFormFrameTable::~nsFormFrameTable()
+{
+ PRInt32 count = mEntries.Count();
+ for (PRInt32 i = 0; i < count; i++) {
+ delete mEntries.ElementAt(i);
+ }
+ mEntries.Clear();
+}
+
+nsFormFrame*
+nsFormFrameTable::Get(nsIPresContext& aPresContext, nsIDOMHTMLFormElement& aFormElem)
+{
+ PRInt32 count = mEntries.Count();
+ for (PRInt32 i = 0; i < count; i++) {
+ nsFormFrameTableEntry* entry = (nsFormFrameTableEntry *)mEntries.ElementAt(i);
+ if ((entry->mPresContext == &aPresContext) && (entry->mFormElement == &aFormElem)) {
+ return entry->mFormFrame;
+ }
+ }
+ return nsnull;
+}
+
+void
+nsFormFrameTable::Put(nsIPresContext& aPresContext, nsIDOMHTMLFormElement& aFormElem,
+ nsFormFrame& aFormFrame)
+{
+ NS_ADDREF(&aFormElem);
+ mEntries.AppendElement(new nsFormFrameTableEntry(aPresContext, aFormElem, aFormFrame));
+}
+
+void
+nsFormFrameTable::Remove(nsFormFrame& aFormFrame)
+{
+ PRInt32 hits[10];
+ PRInt32 hitIndex = 0;
+ PRInt32 count = mEntries.Count();
+ PRInt32 i;
+ for (i = 0; i < count; i++) {
+ nsFormFrameTableEntry* entry = (nsFormFrameTableEntry *)mEntries.ElementAt(i);
+ if (entry->mFormFrame == &aFormFrame) {
+ hits[hitIndex] = i;
+ hitIndex++;
+ NS_IF_RELEASE(entry->mFormElement);
+ }
+ }
+ for (i = hitIndex-1; i >= 0; i--) {
+ delete mEntries.ElementAt(i);
+ mEntries.RemoveElementAt(i);
+ }
+}
+
+
NS_IMETHODIMP
nsFormFrame::QueryInterface(REFNSIID aIID, void** aInstancePtr)
{
@@ -110,6 +175,7 @@ nsFormFrame::nsFormFrame(nsIContent* aContent, nsIFrame* aParentFrame)
nsFormFrame::~nsFormFrame()
{
mFormControls.Clear();
+ RemoveFormFrame(*this);
}
PRBool
@@ -224,6 +290,7 @@ nsFormFrame::SetInitialChildList(nsIPresContext& aPresContext,
nsresult result = mContent->QueryInterface(kIDOMHTMLFormElementIID, (void**)&content);
if ((NS_OK == result) && (nsnull != content)) {
nsFormFrame::PutFormFrame(aPresContext, *content, *this);
+ NS_RELEASE(content);
}
}
return result;
diff --git a/mozilla/layout/html/forms/src/nsFormFrame.h b/mozilla/layout/html/forms/src/nsFormFrame.h
index 58f2e3babfc..6f89221b904 100644
--- a/mozilla/layout/html/forms/src/nsFormFrame.h
+++ b/mozilla/layout/html/forms/src/nsFormFrame.h
@@ -44,33 +44,17 @@ struct nsFormFrameTableEntry
nsFormFrame* mFormFrame;
nsFormFrameTableEntry(nsIPresContext& aPresContext,
nsIDOMHTMLFormElement& aFormElement,
- nsFormFrame& aFormFrame) : mPresContext(&aPresContext),
- mFormElement(&aFormElement),
- mFormFrame(&aFormFrame) {}
+ nsFormFrame& aFormFrame);
+ ~nsFormFrameTableEntry();
};
struct nsFormFrameTable
{
nsVoidArray mEntries;
nsFormFrameTable() {}
- nsFormFrame* Get(nsIPresContext& aPresContext, nsIDOMHTMLFormElement& aFormElem) {
- PRInt32 count = mEntries.Count();
- for (PRInt32 i = 0; i < count; i++) {
- nsFormFrameTableEntry* entry = (nsFormFrameTableEntry *)mEntries.ElementAt(i);
- if ((entry->mPresContext == &aPresContext) && (entry->mFormElement == &aFormElem)) {
- return entry->mFormFrame;
- }
- }
- return nsnull;
- }
- void Put(nsIPresContext& aPresContext, nsIDOMHTMLFormElement& aFormElem, nsFormFrame& aFormFrame) {
- mEntries.AppendElement(new nsFormFrameTableEntry(aPresContext, aFormElem, aFormFrame));
- }
- ~nsFormFrameTable() {
- PRInt32 count = mEntries.Count();
- for (PRInt32 i = 0; i < count; i++) {
- delete mEntries.ElementAt(i);
- }
- }
+ ~nsFormFrameTable();
+ void Put(nsIPresContext& aPresContext, nsIDOMHTMLFormElement& aFormElem, nsFormFrame& aFormFrame);
+ nsFormFrame* Get(nsIPresContext& aPresContext, nsIDOMHTMLFormElement& aFormElem);
+ void Remove(nsFormFrame& aFormFrame);
};
class nsFormFrame : public nsLeafFrame,
@@ -120,6 +104,9 @@ public:
gFormFrameTable->Put(aPresContext, aFormElem, aFrame);
}
+ static void RemoveFormFrame(nsFormFrame& aFrame) {
+ gFormFrameTable->Remove(aFrame);
+ }
// static helper functions for nsIFormControls
static PRBool GetDisabled(nsIFrame* aChildFrame, nsIContent* aContent = 0);
diff --git a/mozilla/layout/html/forms/src/nsSelectControlFrame.cpp b/mozilla/layout/html/forms/src/nsSelectControlFrame.cpp
index d5f4d938be6..2622460fff2 100644
--- a/mozilla/layout/html/forms/src/nsSelectControlFrame.cpp
+++ b/mozilla/layout/html/forms/src/nsSelectControlFrame.cpp
@@ -212,6 +212,7 @@ nsSelectControlFrame::GetDesiredSize(nsIPresContext* aPresContext,
}
nsIDOMHTMLCollection* options = GetOptions(select);
if (!options) {
+ NS_RELEASE(select);
return;
}
@@ -289,6 +290,7 @@ nsSelectControlFrame::GetDesiredSize(nsIPresContext* aPresContext,
aDesiredLayoutSize.ascent = aDesiredLayoutSize.height;
}
+ NS_RELEASE(select);
NS_RELEASE(options);
}