veeru
2010-04-19 10:36:28 UTC
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.
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.