diff --git a/mozilla/layout/html/forms/src/nsGfxTextControlFrame2.cpp b/mozilla/layout/html/forms/src/nsGfxTextControlFrame2.cpp
index 43e52ec5536..eb27d4cb03d 100644
--- a/mozilla/layout/html/forms/src/nsGfxTextControlFrame2.cpp
+++ b/mozilla/layout/html/forms/src/nsGfxTextControlFrame2.cpp
@@ -721,8 +721,40 @@ nsGfxTextControlFrame2::~nsGfxTextControlFrame2()
NS_IMETHODIMP
nsGfxTextControlFrame2::Destroy(nsIPresContext* aPresContext)
{
+ // Clean up the controller
+ nsCOMPtr controllers;
+ nsCOMPtr inputElement = do_QueryInterface(mContent);
+ if (inputElement)
+ inputElement->GetControllers(getter_AddRefs(controllers));
+ else
+ {
+ nsCOMPtr textAreaElement = do_QueryInterface(mContent);
+ textAreaElement->GetControllers(getter_AddRefs(controllers));
+ }
+
+ if (controllers)
+ {
+ PRUint32 numControllers;
+ nsresult rv = controllers->GetControllerCount(&numControllers);
+ NS_ASSERTION((NS_SUCCEEDED(rv)), "bad result in gfx text control destructor");
+ for (PRUint32 i = 0; i < numControllers; i ++)
+ {
+ nsCOMPtr controller;
+ rv = controllers->GetControllerAt(i, getter_AddRefs(controller));
+ if (NS_SUCCEEDED(rv) && controller)
+ {
+ nsCOMPtr editController = do_QueryInterface(controller);
+ if (editController)
+ {
+ editController->SetCommandRefCon(nsnull);
+ }
+ }
+ }
+ }
+
mSelCon = 0;
mEditor = 0;
+
if (mCachedState)
{
delete mCachedState;
@@ -1293,22 +1325,22 @@ nsGfxTextControlFrame2::CreateAnonymousContent(nsIPresContext* aPresContext,
mEditor->Init(domdoc, shell, content, mSelCon, editorFlags);
//initialize the controller for the editor
- nsCOMPtr textAreaElement = do_QueryInterface(mContent);
- nsCOMPtr inputElement = do_QueryInterface(mContent);
nsCOMPtr controllers;
- if (textAreaElement)
- textAreaElement->GetControllers(getter_AddRefs(controllers));
- else if (inputElement)
+ nsCOMPtr inputElement = do_QueryInterface(mContent);
+ if (inputElement)
inputElement->GetControllers(getter_AddRefs(controllers));
else
- return rv = NS_ERROR_FAILURE;
-
- if (NS_SUCCEEDED(rv))
{
- PRUint32 count;
+ nsCOMPtr textAreaElement = do_QueryInterface(mContent);
+ textAreaElement->GetControllers(getter_AddRefs(controllers));
+ }
+
+ if (controllers)
+ {
+ PRUint32 numControllers;
PRBool found = PR_FALSE;
- rv = controllers->GetControllerCount(&count);
- for (PRUint32 i = 0; i < count; i ++)
+ rv = controllers->GetControllerCount(&numControllers);
+ for (PRUint32 i = 0; i < numControllers; i ++)
{
nsCOMPtr controller;
rv = controllers->GetControllerAt(i, getter_AddRefs(controller));