gmail problem investigated: frame onload
David Faure
faure at kde.org
Mon Oct 4 15:41:41 BST 2004
With Rainder Endres' help, I managed to track down the reason gmail won't load.
The onload event listener for frames and iframes is registered on the wrong body:
the main body instead of the frame's body. Which means only one gets executed,
and the JS code waits for ever.
Testcase [gmail uses iframes, but it's the same with frames] :
==> blank.html <==
Hello world
==> frameset.html <==
<html>
<frameset rows="*,*,*">
<frame name="main" src="blank.html" onload="alert('loaded main')">
<frame name="blank" src="blank.html" onload="alert('loaded blank')">
</frameset>
</html>
The problem is HTMLFrameElementImpl::parseAttribute (for ATTR_ONLOAD).
The code says:
static_cast<HTMLDocumentImpl*>( getDocument() )->body()->
setHTMLEventListener(EventImpl::LOAD_EVENT,
getDocument()->createHTMLEventListener(attr->value().string(),"onload"));
And this obviously finds the main <body> element, since getDocument()
for the frame element finds the main document.
Did this ever work in KHTML? I thought it did, but looking at the code, I fail
to see how. Since the attributes are parsed before the frame is "attached",
so there is no KHTMLPart for the frame yet... i.e. no way to find the right
document (or body) from that code. So do we need to store the value of
the load and unload listeners until attach? We would then need to have some
code somewhere that sets the listener on the frame's body when creating
it..... I'm working now on a patch that attempts to do that.
--
David Faure, faure at kde.org, sponsored by Trolltech to work on KDE,
Konqueror (http://www.konqueror.org), and KOffice (http://www.koffice.org).
More information about the kfm-devel
mailing list