Imitating "load" event in C++ (XPCOM)

veeru <[email protected]> Mon, 19 Apr 2010 03:36:28 -0700 (PDT)
Newsgroups gmane.comp.mozilla.devel.dom
Organization http://groups.google.com
Message-ID <848190bf-57c5-4414-a496-e22956ce4b73@v20g2000yqv.googlegroups.com>
Hi,

I would like to imitate the following statement in C++.

window.addEventListener('load', func1(), false);

I tried in nsiWebProgressListener::OnStateChange(), but I am getting
"load" event multiple times. Sometimes I get "unload" event before
"load" event.

How can we achieve the same as above javascript statement.

See the code below I've written OnStateChange

//////////////////////////////////
NS_IMETHODIMP
CMyExt::OnStateChange(
	nsIWebProgress *aWebProgress,
	nsIRequest *aRequest,
	PRUint32 aStateFlags,
	nsresult aStatus
	)
{
	nsresult rv;
	//if ((aStateFlags & nsIWebProgressListener::STATE_START) &&
(aStateFlags & nsIWebProgressListener::STATE_IS_NETWORK))
	if ((aStateFlags & nsIWebProgressListener::STATE_START) &&
(aStateFlags & nsIWebProgressListener::STATE_IS_DOCUMENT)
	{
		nsCOMPtr<nsIDOMWindow> domWindow;
		rv = aWebProgress->GetDOMWindow(getter_AddRefs(domWindow));
		if (FAILED(rv))
			return NS_ERROR_FAILURE;

		if(domWindow)
		{
			nsCOMPtr<nsIDOMEventTarget> eventTarget =
do_QueryInterface(domWindow);
			eventTarget->AddEventListener(NS_LITERAL_STRING("load"), this,
PR_FALSE);
			eventTarget->AddEventListener(NS_LITERAL_STRING("unload"), this,
PR_FALSE);
		}
	}

	if ((aStateFlags & nsIWebProgressListener::STATE_STOP) &&
(aStateFlags & nsIWebProgressListener::STATE_IS_NETWORK))
	{
		nsCOMPtr<nsIDOMWindow> domWindow;
		rv = aWebProgress->GetDOMWindow(getter_AddRefs(domWindow));
		if (FAILED(rv))
			return NS_ERROR_FAILURE;

		if(domWindow)
		{
			nsCOMPtr<nsIDOMEventTarget> eventTarget =
do_QueryInterface(domWindow);
			eventTarget->RemoveEventListener(NS_LITERAL_STRING("load"), this,
PR_FALSE);
			eventTarget->RemoveEventListener(NS_LITERAL_STRING("unload"), this,
PR_FALSE);
		}
	}

	return NS_OK;
}
/////////////////////////////////

In AddProgressListener I've used both STATE_IS_NETWORK |
STATE_IS_DOCUMENT.
I've tried both combination, but still facing the same problem.

Where am I going wrong? Can someone correct me?

Thank you.