Hi again,

I want to delete/destroy all the objects  when the browser window is
destroyed, but my application crashes. I saw there is a Release() function.
I think this function must be called to destroy the objects, in't it? If
not, what is the way to destroy the objects (nsIWebBrowser, and other
objects that implement mozilla interfaces)

For example, I created a class called EmbedEventListener, and it implements
the nsIDOMKeyListener, nsIDOMMouseListener and nsIDOMUIListener interfaces.

I created the object after add the browser progress listener. This is the
code:

        mBrowserBaseWindow = do_QueryInterface ( mWebBrowser ) ;

mBrowserBaseWindow->InitWindow( mWindow, nsnull, x, y, width, height );
mBrowserBaseWindow->Create();

nsCOMPtr<nsISupports> mPG;
mPG = static_cast<nsIWebProgressListener *>(this);

nsCOMPtr<nsISupportsWeakReference> supportsWeak;
supportsWeak = do_QueryInterface(mPG);

nsCOMPtr<nsIWeakReference> weakRef;
supportsWeak->GetWeakReference(getter_AddRefs(weakRef));
mWebBrowser->AddWebBrowserListener(weakRef,
NS_GET_IID(nsIWebProgressListener));


mEventListener = new EmbedEventListener();  //OBJECT CREATION!

        nsIDOMEventListener *eventListener =
static_cast<nsIDOMEventListener *>(static_cast<nsIDOMKeyListener
*>(mEventListener));

nsCOMPtr<nsPIDOMWindow> pDomWin;
GetPIDOMWindow(getter_AddRefs(pDomWin));

mEventTarget = do_QueryInterface(pDomWin->GetChromeEventHandler());

// add the key listener
rv = mEventTarget->AddEventListenerByIID(eventListener,
   NS_GET_IID(nsIDOMKeyListener));
if (NS_FAILED(rv))
   printf("Failed to add key listener\n");fflush(stdout);

rv = mEventTarget->AddEventListenerByIID(eventListener,
   NS_GET_IID(nsIDOMMouseListener));
if (NS_FAILED(rv))
   printf("Failed to add mouse listener\n");fflush(stdout);

rv = mEventTarget->AddEventListenerByIID(eventListener,
   NS_GET_IID(nsIDOMUIListener));
if (NS_FAILED(rv))
  printf("Failed to add UI listener\n");fflush(stdout);


I delete the mEventListener object in DestroyBrowserWindow function after
remove the events listeners, but the applications crashes. Why? I tried to
call mEventListener->Release() before delete the object, but it crashes
executing Release() function;

This is the code:

NS_IMETHODIMP IkusiBrowser::DestroyBrowserWindow ( void )
{
printf ( "DestroyBrowserWindow\n" );fflush(stdout);

        // Release our progress listener
nsCOMPtr<nsISupports> mPG;
mPG = static_cast<nsIWebProgressListener *>(this);
nsCOMPtr<nsISupportsWeakReference> supportsWeak;
supportsWeak = do_QueryInterface(mPG);
nsCOMPtr<nsIWeakReference> weakRef;
supportsWeak->GetWeakReference(getter_AddRefs(weakRef));
mWebBrowser->RemoveWebBrowserListener(weakRef,
NS_GET_IID(nsIWebProgressListener));

weakRef = nsnull;
supportsWeak = nsnull;

nsCOMPtr<nsIBaseWindow> browserBaseWindow ( do_QueryInterface ( mWebBrowser
) );
browserBaseWindow->Destroy();


nsIDOMEventListener *eventListener = static_cast<nsIDOMEventListener
*>(static_cast<nsIDOMKeyListener *>(mEventListener));


nsresult rv = mEventTarget->RemoveEventListenerByIID(eventListener,
   NS_GET_IID(nsIDOMKeyListener));
if (NS_FAILED(rv))
  printf("Failed to remove key listener\n");fflush(stdout);

rv = mEventTarget->RemoveEventListenerByIID(eventListener,
   NS_GET_IID(nsIDOMMouseListener));
if (NS_FAILED(rv))
  printf("Failed to remove mouse listener\n");fflush(stdout);
 rv = mEventTarget->RemoveEventListenerByIID(eventListener,
   NS_GET_IID(nsIDOMUIListener));
if (NS_FAILED(rv))
  printf("Failed to remove UI listener\n");fflush(stdout);

        /*
if(mEventListener){
mEventListener->Release(); //The application crashes here if this code is
uncommented
delete mEventListener;
}*/

       if(mEventListener)
           delete (mEventListener); //The application crashes here if the
other if is commented.
}
_______________________________________________
dev-embedding mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-embedding

Reply via email to