Michael A. Borisov wrote:
> Hello everybody,
>
> Can anybody help me with DocumentObserver please? I've created a child of
> nsIDocumentObserver than registered it with the nsIDocument::AddObserver
> method. I use BeginLoad and EndLoad methods to determin the start and end of
> document loading. But sometimes EndLoad isn't invoked (for some sites). Is
> it bug or feature? And what is the right way to determin the document
> loading end?
You probably want nsIWebProgress. Here is code I used to hook document
load.
// hook a web progress listener so we know when messages have
// finished rendering.
var interfaceRequestor =
document.getElementById('messagepane').docShell.QueryInterface
(Components.interfaces.nsIInterfaceRequestor);
var webProgress =
interfaceRequestor.getInterface(
Components.interfaces.nsIWebProgress);
msgWindowWebProgressListener = new nsMsgWindowWebProgressListener();
webProgress.addProgressListener(msgWindowWebProgressListener,
Components.interfaces.nsIWebProgress.NOTIFY_STATE_WINDOW);
And the implementation:
function nsMsgWindowWebProgressListener()
{
}
nsMsgWindowWebProgressListener.prototype =
{
QueryInterface : function(aIID) {
if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
aIID.equals(Components.interfaces.nsISupportsWeakReference))
return this;
throw Components.results.NS_NOINTERFACE;
},
onStateChange : function(aWebProgress, aRequest, aStateFlags, aStatus) {
if ((aStateFlags & ListenerState_Finished) == ListenerState_Finished) {
...
}
}
HTH,
Mark.