DocShell/IRC Logs

From MozillaWiki
Jump to: navigation, search

DocShell IRC Logs

This page contains some IRC logs of discussions concerning docshell development. Some of the mentioned plans have now been implemented.

DocShell/DocLoader relationship: 2004-09-22 23:07 +0200

Sep 22 23:07:35 -->    Sie schreiben nun in #docloader
Sep 22 23:08:22 -->    bz (~bzbarsky@adsl-68-77-24-238.dsl.emhril.ameritech.net) hat #docloader
                betreten
Sep 22 23:08:23 <bz>    ok
Sep 22 23:08:29 <darin> what are the major issues we need to deal with?  or can we just punt since
                        this is like not a public interface?
Sep 22 23:08:39 <bz>    Like I said, I may need to go soon
Sep 22 23:08:43 <darin> is it not enough to just widdle away the interface over time?
Sep 22 23:08:44 <bz>    but I'm not sure when, so... ;)
Sep 22 23:08:50 <biesi> so firstly...
Sep 22 23:08:50 <darin> ok.. no problem
Sep 22 23:08:55 <biesi> why can't docshell send this progress stuff?
Sep 22 23:08:58 <darin> just wanted to hear the ideas that you guys have
Sep 22 23:09:00 <bz>    that was my question.  ;)
Sep 22 23:09:06 <bz>    that is, biesi's question.
Sep 22 23:09:19 <darin> so.. why isn't the docloader the docshell?
Sep 22 23:09:27 <bz>    Hesitant as I am to pile more crap on docshell
Sep 22 23:09:40 <darin> well.. there's all the documentopeninfo stuff..
Sep 22 23:09:41 <bz>    What we have now are two isomorphic trees that can't exist without each other
Sep 22 23:09:49 <biesi> documentopeninfo is unrelated to docloader, isn't it?
Sep 22 23:09:54 <darin> right right
Sep 22 23:09:58 * darin got confused for a minute
Sep 22 23:10:34 <darin> docshell is the nsIInterfaceRequestor, so he can be the nsIProgressEventSink
                        and the nsISecurityEventSink
Sep 22 23:10:38 <bz>    Also note that nsIDocumentLoaderFactory has nothing to do with this
Sep 22 23:10:45 <darin> right
Sep 22 23:10:47 <bz>    in spite of name.
Sep 22 23:10:49 <bz>    ok.
Sep 22 23:11:00 <darin> is it correct for docshell to also be a nsIWebProgress?
Sep 22 23:11:01 <bz>    So is my claim that docshell always has a docloader correct?
Sep 22 23:11:11 <darin> it would seem to be true
Sep 22 23:11:18 <darin> i wonder about the webprogress parent child relationship
Sep 22 23:11:24 <darin> does it correspond 1-1 to docshell tree
Sep 22 23:11:50 <bz>    you mean docloader?
Sep 22 23:12:00 <bz>    nsIWebProgress has no such relationships
Sep 22 23:12:08 <darin> right
Sep 22 23:12:17 <darin> well... actually
Sep 22 23:12:18 <biesi> well, there's also the docloader service
Sep 22 23:12:25 <biesi> which is, I think, parent of all other docloaders
Sep 22 23:12:29 <bz>    right.
Sep 22 23:12:31 <biesi> so the trees are not quite isomorphic
Sep 22 23:12:36 <darin> nsIWebProgressListener and nsIWebProgress implies a nsIWebProgress tree
Sep 22 23:12:46 <bz>    The question is whether anyone but URILoader uses the service
Sep 22 23:13:07 <darin> the docloader service is used to attach a nsIWebProgressListener to observe
                        all events in the system
Sep 22 23:13:18 <darin> there's plenty of code that depends on that
Sep 22 23:13:41 <biesi> yeah. but that's via nsIWebProgress
Sep 22 23:13:47 <darin> true
Sep 22 23:14:09 <darin> so assuming we aren't rocking the world too badly, then there will need to
                        be a root nsIWebProgress impl
Sep 22 23:14:10 <bz>    http://lxr.mozilla.org/seamonkey/ident?i=NS_DOCUMENTLOADER_SERVICE_CONTRACTID
Sep 22 23:14:15 <bz>    OK, we have some people relying on that...
Sep 22 23:14:25 <biesi> er, we aren't the only ones
Sep 22 23:14:44 <darin> i think the ClassID is used in some places too
Sep 22 23:14:51 <darin> right, extensions!
Sep 22 23:15:00 <biesi> the classid? that totally sucks
Sep 22 23:15:06 <biesi> arg
Sep 22 23:15:12 <bz>    if it's in our code, we can fix it
Sep 22 23:15:18 <bz>    would extensions assume nsIDocumentLoader?
Sep 22 23:15:19 <darin> i know of an example in our code
Sep 22 23:15:24 <bz>    Or just get it as an nsIWebProgress?
Sep 22 23:15:28 <darin> no.. extensions should not need nsIDocumentLoader
Sep 22 23:15:32 <biesi> they would likely want webprogress
Sep 22 23:15:35 <darin> right
Sep 22 23:15:38 * bz _hopes_ extensions would not need the class id
Sep 22 23:15:39 <biesi> since they just want to register as listener
Sep 22 23:15:41 <bz>    so we can have a real service
Sep 22 23:15:58 <darin> let's assume that we can kill the ClassID
Sep 22 23:16:01 <bz>    that  "root" docloaders (aka docshells) register with
Sep 22 23:16:03 <bz>    if desired
Sep 22 23:16:15 <biesi> does it need a list of children?
Sep 22 23:16:48 <bz>    makes total progress stuff work, no?
Sep 22 23:16:51 <bz>    Otherwise, how to do it?
Sep 22 23:17:08 <darin> nsIDocumentLoader::Stop trickles down to the children
Sep 22 23:17:28 <biesi> Stop can likely be killed
Sep 22 23:17:29 <bz>    whereas webnavigation::stop does not?
Sep 22 23:17:30 <biesi> use the loadgroup
Sep 22 23:17:33 <darin> IsBusy also depends on the childlist chain
Sep 22 23:17:38 <darin> right
Sep 22 23:17:39 <biesi> same for isbusy
Sep 22 23:17:49 <darin> wait.. there is one loadgroup for each webprogress right?
Sep 22 23:17:51 <bz>    isbusy is dead once that patch gets darin's sr
Sep 22 23:17:55 <biesi> hmm, maxtotalprogress can be an issue...
Sep 22 23:17:55 <darin> ok
Sep 22 23:18:00 <bz>    darin: there's one loadgroup per docloader, yes.
Sep 22 23:18:06 <biesi> ah, yeah...
Sep 22 23:18:13 <bz>    darin: with the loadgroups in a tree too, which is fine.
Sep 22 23:18:15 <darin> so you'd have to have a tree of loadgroups
Sep 22 23:18:15 <biesi> are the child loadgroups elements of the parent loadgroup?
Sep 22 23:18:22 <bz>    darin: you already do, no?
Sep 22 23:18:23 <darin> no, but they could be
Sep 22 23:18:28 <bz>    oh, they're not?
Sep 22 23:18:33 <darin> i don't think so
Sep 22 23:18:33 <biesi> so then a cancel() on the top could kill all loads
Sep 22 23:18:37 <darin> right
Sep 22 23:18:38 * bz sorta assumed that would be the simple way to implement a lot of this stuff.
Sep 22 23:18:57 <darin> when i made nsILoadGroup inherit from nsIRequest, that was something in the
                        back of my mind
Sep 22 23:19:04 <darin> i don't think it ever got implemented though
Sep 22 23:19:12 <darin> because we have docloader::stop walk the childlist
Sep 22 23:19:23 <darin> which calls cancel on each loadgorup
Sep 22 23:19:30 <bz>    Right.
Sep 22 23:19:33 <darin> we could get rid of that if the loadgroups were in a common loadgroup
Sep 22 23:19:36 <bz>    So maybe that should be the first step?
Sep 22 23:19:51 <bz>    put loadgroups in the parents, modify docloader to not do the child walk in
                        stop?
Sep 22 23:20:00 <bz>    This is if we want to do incremental betterment here.
Sep 22 23:20:09 <bz>    I think this change is a good one no matter what else we do with docloader.
Sep 22 23:20:12 <biesi> well, if 0th step is check my patch in ;)
Sep 22 23:20:31 <biesi> yeah, that first step sounds like a good idea
Sep 22 23:20:40 <bz>    biesi: get darin to sr.  ;)
Sep 22 23:20:45 <biesi> you r'd?
Sep 22 23:20:47 <bz>    yep
Sep 22 23:20:54 <bz>    back when I first pinged you in Mozilla
Sep 22 23:20:58 <biesi> ohh :)
Sep 22 23:21:25 * biesi looks at the darin: superreview+ in the bug
Sep 22 23:21:31 <darin> i will sr
Sep 22 23:21:48 <biesi> it looks like you did already
Sep 22 23:21:52 <darin> haven't had a chance to read bugmail yet today :(
Sep 22 23:21:53 <biesi> but feel free to re-sr :)
Sep 22 23:22:02 <darin> oh.. hmm.
Sep 22 23:22:18 <biesi> (long ago, on v1 of the patch)
Sep 22 23:22:22 <darin> oh, right
Sep 22 23:22:25 <darin> which bug is this?
Sep 22 23:22:30 <biesi> https://bugzilla.mozilla.org/show_bug.cgi?id=234257
Sep 22 23:22:37 * biesi goes to figure out if he promised any changes to bz
Sep 22 23:22:43 <bz>    not that I recall.
Sep 22 23:22:59 <bz>    So there is the question of what our goal is
Sep 22 23:23:10 <bz>    I think we're aiming to reduce the number of interfaces floating about
Sep 22 23:23:18 <bz>    and reduce the number of "global" objects involved.
Sep 22 23:23:33 <bz>    Esp. since that makes ref-cycle-avoidance easier.
Sep 22 23:23:38 <biesi> yeah
Sep 22 23:24:12 <bz>    So possible impl plan right now is:
Sep 22 23:24:20 <bz>    1)  Move docloader methods into docshell
Sep 22 23:24:48 <bz>    2)  Make the "docloader service" (with same contractid?) a real service
                        that root docshells register with and report progress to
Sep 22 23:25:00 <bz>    and make it implement nsIWebProgress.
Sep 22 23:25:22 <bz>    This service is the one thing that makes me not so happy about this... :(
Sep 22 23:25:25 <biesi> I think you don't need the "register with" part
Sep 22 23:25:39 <bz>    oh, because no need to know about kids?
Sep 22 23:25:44 <biesi> oh wait
Sep 22 23:25:50 <biesi> there's still the maxtotalprogress issue
Sep 22 23:28:02 <biesi> currently, nsdocloader asks the children by calling an nsDocLoaderImpl fcn on
                        them...
Sep 22 23:28:11 <bz>    yeah
Sep 22 23:28:34 <bz>    But all that does is add up mMaxSelfProgress over them all
Sep 22 23:29:14 <biesi> but if you distribute that over two classes (docshell + the service) that's
                        not so easy
Sep 22 23:29:36 <bz>    well, can't you keep a running total of mMaxSelfProgress's over all kids?
Sep 22 23:29:44 <bz>    Based on past OnProgress() notifications?
Sep 22 23:29:54 * bz agrees that this is the one hard part
Sep 22 23:30:06 <biesi> hmm
Sep 22 23:30:32 <biesi> that's an interesting idea...
Sep 22 23:35:29 <biesi> so each docshell keeps an (weak?) nsIWebProgressListener* mParent pointer,
                        and the toplevel docshells have one to the service
Sep 22 23:36:28 <biesi> hmm, do chrome docshells currently report progress? would it improve
                        Tp/Txul not to?
Sep 22 23:36:57 <bz>    docshells could just not have this pointer at all.
Sep 22 23:37:05 * darin catches up with the backlog
Sep 22 23:37:06 <bz>    and QI mParent as needed, and if mParent is null getService
Sep 22 23:37:52 <biesi> I liked the thought of avoiding that checks, but sure, that works
Sep 22 23:38:02 <biesi> but be careful, progress is reported a lot
Sep 22 23:38:07 <biesi> during pageload
Sep 22 23:38:15 <bz>    hmmm...
Sep 22 23:38:44 <bz>    one sec
Sep 22 23:38:46 <bz>    reading code
Sep 22 23:38:46 <darin>        so who's going to be cutting these patches? ;-)
Sep 22 23:39:26 <bz>    http://lxr.mozilla.org/seamonkey/source/docshell/base/nsDocShell.h#432
Sep 22 23:39:33 <bz>    432     nsIDocShellTreeItem *      mParent;  // Weak Reference
Sep 22 23:39:48 <bz>    There's no reason that can't be a nsDocShell*
Sep 22 23:39:55 <bz>    and then if mParent is non-null, we just call it.
Sep 22 23:40:08 <bz>    if it's null, we have a class static (cleaned up on shutdown) pointing to
                        the service
Sep 22 23:40:12 <bz>    fast, and all
Sep 22 23:40:21 <bz>    darin: well, that's a good question.
Sep 22 23:40:27 <bz>    darin: biesi or I, sounds like... ;)
Sep 22 23:40:38 <bz>    darin: assuming we come to an agreement about general direction
Sep 22 23:40:55 <biesi> bz, that'd work
Sep 22 23:41:46 <biesi> so docshell would be an iwebprogresslistener an iprogresseventsink?
Sep 22 23:42:51 <biesi> er, _and_ an iprogresseventsink
Sep 22 23:44:12 <darin> biesi: so, why does your patch need that call to SetLoadGroup?
Sep 22 23:44:21 * darin doesn't see a SetLoadGroup being removed
Sep 22 23:44:47 <biesi> the removed setloadgroup was part of NS_NewChannel, looks like
Sep 22 23:44:52 <darin> oh.. ok
Sep 22 23:47:42 <darin> sr marked in the bug
Sep 22 23:47:53 * biesi notices something...
Sep 22 23:48:03 <biesi> is it possible that it's not actually the docloader that's set as
                        notificationcallback?
Sep 22 23:52:59 <darin> it is the docshell, no?
Sep 22 23:53:15 <darin> line 4552 of nsDocShell.cpp
Sep 22 23:53:38 <darin> oh, hmm.. that's interesting
Sep 22 23:53:42 <darin> maybe a bug even
Sep 22 23:53:53 <darin> in the other place we set an InterfaceRequestorProxy as the notification
                        callbacks
Sep 22 23:54:05 <darin> oh, but that's for the loadgroup
Sep 22 23:55:11 <biesi>        http://lxr.mozilla.org/seamonkey/source/docshell/base/nsDocShell.cpp#5485
Sep 22 23:55:24 <biesi> is that a good idea?
Sep 22 23:55:57 <biesi> it means each caller of nsIURILoader::Open has to forward progresseventsink
                        requests to the docloader
Sep 22 23:56:06 <biesi> assuming he wants stuff to behave correctly
Sep 22 23:56:50 <darin> right
Sep 22 23:56:53 <darin> it's not ideal really
Sep 22 23:57:02 <darin> oh wait
Sep 22 23:57:31 <darin> nsDocShell::GetInterface returns the docloader for nsIProgressEventSink, no?
Sep 22 23:57:42 <biesi> yes, docshell does
Sep 22 23:58:07 <biesi> what about the others?
Sep 22 23:58:17 <darin> are there other callers of nsIURILoader::open ?
Sep 22 23:58:27 <biesi> yeah
Sep 22 23:58:35 <biesi> xremote, some mailnews stuff
Sep 22 23:58:56 <darin> oh yeah.. true
Sep 22 23:59:00 * darin lxr's and finds lots
Sep 23 00:00:09 <darin> hmm.. actually not that many
Sep 23 00:00:18 <darin> most references to nsIURILoader are for registering content listeners
Sep 23 00:00:26 <darin> but yeah.. xremote and nsURLFetcher (what is that for?)
Sep 23 00:01:01 * bz has to go
Sep 23 00:01:05 * biesi has no idea what urlfetcher does
Sep 23 00:01:07 <bz>    email me the log, please?
Sep 23 00:01:16 <biesi> the rest of it, or all?
Sep 23 00:07:25 <biesi> darin, so what do you think about setting the docloader as
                        notificationcallbacks?
Sep 23 00:08:05 <darin> setting the docloader to be the notification callbacks for the channel?
Sep 23 00:08:09 <biesi> yes
Sep 23 00:08:14 <darin> (because it is already the notification callbacks for the loadgroup)
Sep 23 00:08:26 <biesi> oh
Sep 23 00:08:36 <darin> but we use the notification callbacks to get to the docshell
Sep 23 00:08:36 <biesi> hmm, then that may not be needed
Sep 23 00:08:39 <darin> see nsCookiePermission.cpp
Sep 23 00:08:53 <darin> can we just make the docshell skip nsIProgressEventSink ? ;-)
Sep 23 00:08:55 <darin> etc.
Sep 23 00:08:59 <biesi> that sounds like a good idea
Sep 23 00:09:12 <biesi> because the code it has for that is somewhat sucky :)
Sep 23 00:09:18 <darin> so long as all of the channels do the right thing ;-)
Sep 23 00:09:52 <biesi> they better! :)
Sep 23 00:09:55 <darin> we should probably write a common routine (stick it in nsNetUtil.h) for
                        querying notification callbacks on a channel
Sep 23 00:10:10 <biesi> yeah
Sep 23 00:10:17 <darin> they don't
Sep 23 00:10:23 * darin points to nsFileChannel.cpp
Sep 23 00:10:27 <biesi> eww
Sep 23 00:10:33 <darin> so.. we'd need to patch that ;-)
Sep 23 00:10:41 <biesi> then there's externalprotocolchannel (sp) which I filed a bug about...
Sep 23 00:10:46 * darin blames himself for not being strict about that
Sep 23 00:12:38 <biesi> hmm, ftpchannel too, if I'm interpreting grep correctly...
Sep 23 00:13:47 <biesi> !!! not even HTTP gets it right
Sep 23 00:13:53 <biesi> nsHttpChannel::SetNotificationCallbacks(nsIInterfaceRequestor *callbacks)
Sep 23 00:13:53 <biesi> {
Sep 23 00:13:53 <biesi>     mCallbacks = callbacks;
Sep 23 00:13:53 <biesi>
Sep 23 00:13:53 <biesi>     mHttpEventSink = do_GetInterface(mCallbacks);
Sep 23 00:13:53 <biesi>     mProgressSink = do_GetInterface(mCallbacks);
Sep 23 00:14:23 <darin> yikes
Sep 23 00:14:40 <darin> http gets it right only for nsIPrompt, nsIAuthPrompt,
                        nsIAuthPromptProvider, etc.
Sep 23 00:14:48 <darin> ugh.. i suck :(
Sep 23 00:15:00 * darin files a bu
Sep 23 00:15:01 <darin> bug
Sep 23 00:16:07 <biesi> yeah, http is the "best" of the channels at this ;)
Sep 23 00:16:22 <biesi> the rest totally suck
Sep 23 00:17:47 <darin> https://bugzilla.mozilla.org/show_bug.cgi?id=261083
Sep 23 00:18:16 <biesi> good
Sep 23 00:19:03 * biesi goes to reassign his review comments bug to him, because it looks like it
                won't get fixed otherwise...
Sep 23 00:20:15 <darin> to me?
Sep 23 00:20:26 <biesi> no, to me
Sep 23 00:20:31 <biesi> unless you want it :)
Sep 23 00:20:58 <darin> you can have it :)
Sep 23 00:21:22 <biesi> thought so :)
Sep 23 00:23:58 <biesi> hmm, extensions/datetime and finger get it wrong too
Sep 23 00:24:06 * biesi wonders about mailnews
Sep 23 00:25:22 <biesi> well, hardly surprising, it does too
Sep 23 00:25:35 <darin> ;-)
Sep 23 00:26:25 * darin starts cutting a patch
Sep 23 00:32:00 * biesi goes to file bugs to remove progresseventsink from docshell::Getinterface,
                and to put loadgroups into parent loadgroups
Sep 23 00:33:02 <darin> ok
Sep 23 00:54:44 <darin> there are some issues with making this change to always query the loadgroup
Sep 23 00:55:02 <darin> whereas today we would query the notification callbacks when they are set,
                        we cannot do that now... b/c the loadgroup may not be set
Sep 23 00:55:10 <darin> we need to defer all of that until AsyncOpen / Open gets called
Sep 23 00:55:55 <biesi> hm?
Sep 23 00:56:00 <biesi> oh, true :/
Sep 23 00:56:36 <darin> yeah.. not a problem really
Sep 23 00:56:58 <darin> i'll just add code to the top of AsyncOpen (and in some cases Open) that
                        configures things like mProgressSink, etc.
Sep 23 00:57:05 <biesi> ah, yeah, true
Sep 23 00:57:52 * darin notices that he's practically eliminating all calls to do_GetInterface from
                necko
Sep 23 01:04:33 <darin> man ftp is a mess
Sep 23 01:05:06 * darin decides to get rid of all the useless mutex locking in ftp as well
Sep 23 01:23:20 <--    bz hat sich getrennt (Ping timeout: 378 seconds)

Concrete plans: 2004-10-18 18:10 -0600

<bz> biesi: I had a scary thought just now..
* biesi checks whether this container is indeed the docshell
<bz>    biesi: What we _really_ want is for every docshell to be a docloader,
right?
<bz>    biesi: but not all docloaders will be docshells?
<biesi> bz, only one docloader won't be a docshell, right?
<bz>    biesi: right
<bz>    biesi: the point is, perhaps docshell should just inherit from
docloader...
<bz>    biesi: and you can get back and forth with getinterface as needed
<bz>    biesi: that is, CallGetI to get from docloader to docshell
<bz>    biesi: nothing needed in the other direction
<biesi> bz, like class nsDocShell : public nsDocLoaderImpl?
<bz>    biesi yes
<bz>    biesi: with fixes to QI appropriately and all that
<biesi> that's an interesting idea
<biesi> dso-wise it works
<bz>    biesi: right
<biesi> bz, that may be the best solution