Closed Bug 99639 Opened 23 years ago Closed 20 years ago

Freeze nsIWebProgress and nsIWebProgressListener

Categories

(Core Graveyard :: Embedding: APIs, defect)

defect
Not set
normal

Tracking

(Not tracked)

RESOLVED FIXED
mozilla1.8beta1

People

(Reporter: chak, Assigned: darin.moz)

References

Details

(Keywords: embed, fixed1.7.5, topembed-)

Attachments

(5 files, 6 obsolete files)

Freeze nsIWebProgress and nsIWebProgressListener Please refer to http://www.mozilla.org/projects/embedding/EmbedInterfaceFreeze.html for the issues to be addressed, if any, for this interface. Please follow the guidelines outlined in "How to mark an interface as frozen?" section of the document above.
Blocks: 98417
QA Contact: mdunn → depstein
->0.9.6
Target Milestone: --- → mozilla0.9.6
-> 0.9.7
Target Milestone: mozilla0.9.6 → mozilla0.9.7
Depends on: 46856
Target Milestone: mozilla0.9.7 → mozilla1.0
Keywords: topembed
Keywords: topembedembed, topembed-
making bug 86521 a dependency. need to decide what to do with nsIRequest parameter in nsIWebProgressListener::OnLocationChange().
Depends on: 86521
QA Contact: depstein → carosendahl
mass reassign of various rpotts bugs to me
Assignee: rpotts → darin
Blocks: 157137
Would it be a good idea to change the parameters of onProgressChange to use 64-bit integers, rather than 32-bit ones, to support large files?
Looks like we may need this for accessibility -- unless I can get sr= for bug 208898
a number of other interfaces have been frozen with 32-bit file size limitations unfortunately :( complete support for 64-bit file lengths might have to be a mozilla-2.0 thing.
Target Milestone: mozilla1.0 → Future
Blocks: 248683
I think we may need to freeze these interfaces as is. Many extensions and embedding applications depend on these interfaces already. 64-bit support may need to happen via nsIWebProgressListener2 (perhaps with an onProgressChange64 method) :-/
Status: NEW → ASSIGNED
Target Milestone: Future → mozilla1.8beta
Attached patch v1 patch (obsolete) (deleted) — Splinter Review
An attempt at cleaning up some of the comments for nsIWebProgress.idl and nsIWebProgressListener.idl. Let's not pretend that we can actually fix snafus in these interfaces. They're de facto frozen. If anyone has any useful documentation to add to the IDL files, please speak up. Otherwise, let's get these stamped for 1.8.
Attachment #157221 - Flags: superreview?(bzbarsky)
Attachment #157221 - Flags: review?(cbiesinger)
OS: Windows 2000 → All
Hardware: PC → All
erm. i have a change to the mozilla implementation of nsIWebProgress. i've lost track of where it is in the mozilla review process but i'm really uncomfortable with this stuff freezing before that lands. + * Called when the window being watched changes the location that is + * currently. is currently.. what? + * @return NS_OK should always be returned. that's not a return, lose it :)
further, while you're cleaning the documentation, it is still wrong.
Depends on: 248705
> further, while you're cleaning the documentation, it is still wrong. uhm... care to elaborate? :-/
(In reply to comment #11) > erm. i have a change to the mozilla implementation of nsIWebProgress. i've lost track of where it is in > the mozilla review process but i'm really uncomfortable with this stuff freezing before that lands. bug 253550, waiting for my review...
OK, but the patch in bug 253550 doesn't change either of these interfaces. Sure, it may affect how they are used, but that's a matter of proper documentation. For example, I don't see any of the existing nsIWebProgressListener implementations being modified as part of the patch for bug 253550. Should they be?
the point is that i don't want those things frozen until my changes land. they may or may not change the behavior of the interface, and the consumers may or may not need changes to handle them, but they are critical to my product and i'm not going to wait 2 years for another interface which may happen 5 years from now.
I'm not likely to have a chance to give this the careful look it deserves until I get back into town a week and a half from now...
Comment on attachment 157221 [details] [diff] [review] v1 patch I am also opposed to doing behavioural changes to nsDocLoader after freezing webprogresslistener. But if 1.8beta is your target, that should be easily doable. As I recall addProgressListener requires the listener to also implement nsISupportsWeakReference... please document that too. const unsigned long STATE_IS_REQUEST = 0x00010000; const unsigned long STATE_IS_DOCUMENT = 0x00020000; const unsigned long STATE_IS_NETWORK = 0x00040000; const unsigned long STATE_IS_WINDOW = 0x00080000; The meaning of these flags is somewhat unclear... it'd be really good to document what they are supposed to do before freezing what they do.
Comment on attachment 157221 [details] [diff] [review] v1 patch darin is working on a new patch
Attachment #157221 - Flags: superreview?(bzbarsky)
Attachment #157221 - Flags: review?(cbiesinger)
Attachment #157221 - Flags: review-
Attached patch v1.1 patch (obsolete) (deleted) — Splinter Review
Revised patch, including much improved documentation.
Attachment #157221 - Attachment is obsolete: true
Attachment #159664 - Flags: review?(cbiesinger)
Comment on attachment 159664 [details] [diff] [review] v1.1 patch nsIWebProgress.idl * @status UNDER_REVIEW you aren't marking it frozen yet? for addProgressListener: there's a third return value it may return, NS_ERROR_OUT_OF_MEMORY... for completeness, it would probably be good to mention it too nsIWebProgressListener.idl + * These flags indicate the various states that documents and requests may + * transition through as they are being loaded. each of those flags occurs at most once, right? when STATE_REDIRECTING, will a STATE_STOP happen? events corresponding to a child + * nsIWebProgress instance. hmm... I'd probably make this "corresponding to a subdocument" - the interface does not require a tree of nsIWebProgress instances. (hm... ok, implicitly it does, because a subdocument will have a different domwindow) + * STATE_IS_WINDOW hmm, code looks like this will only be set for the stop onStateChange, not for the start one... + * @param aStatus + * This value is not an error code. Instead, it is a numeric value + * that indicates the current status of the request. ok, that's nice to know. it does not say how to find out what the possible values are or what they mean, though :) (it's probably nsITransport/nsISocketTransport status codes, right?) this is excellent documentation. thank you for doing this!
Attachment #159664 - Flags: review?(cbiesinger) → review+
i can't look at this before next tuesday, but i definitely need to before it's frozen.
> you aren't marking it frozen yet? not in this patch. i want to get the big patch in quickly, and then take more time before marking it frozen. i don't want this patch hanging around in the bug waiting for final decisions, etc. we can always do a followup patch to revise anything that needs revising. > for addProgressListener: there's a third return value it may return, > NS_ERROR_OUT_OF_MEMORY... for completeness, it would probably be good to > mention it too maybe. NS_ERROR_OUT_OF_MEMORY is pretty much implied as a possible exception from any XPCOM method, right? i'd have to add mention of it to every XPCOM method declaration, which would seem like noise to me. > each of those flags occurs at most once, right? right. i'll clarify that in the docs. > when STATE_REDIRECTING, will a STATE_STOP happen? good question. the answer i believe is yes, but i should confirm and document the exact behavior. > events corresponding to a child > + * nsIWebProgress instance. > > hmm... I'd probably make this "corresponding to a subdocument" - the interface > does not require a tree of nsIWebProgress instances. (hm... ok, implicitly it > does, because a subdocument will have a different domwindow) ok > + * STATE_IS_WINDOW > > hmm, code looks like this will only be set for the stop onStateChange, not for > the start one... yeah, that's wierd. i don't fully grok the point of STATE_IS_WINDOW, nor the reason that we get two STATE_STOP events for every document that completes. perhaps we should add STATE_IS_WINDOW to the document STATE_START event. > ok, that's nice to know. it does not say how to find out what the possible > values are or what they mean, though :) > (it's probably nsITransport/nsISocketTransport status codes, right?) yes, that is true. i'm not sure yet exactly how we want to go about exposing those values. i'm not too happy with the fact that they collide with other nsresult values because it'd be nice to be able to use nsIErrorService (or something like it) to further explain any given nsresult code in the system.
Attached patch v1.2 patch (obsolete) (deleted) — Splinter Review
Attachment #159664 - Attachment is obsolete: true
I checked in the v1.2 patch on the trunk. If anyone has any further comments or documentation suggestions for these interfaces, please speak up. I plan to mark these interfaces frozen soon. I will be posting a similar message to n.p.m.embedding shortly.
Comment on attachment 160455 [details] [diff] [review] v1.2 patch > const unsigned long STATE_IS_REQUEST = 0x00010000; > const unsigned long STATE_IS_DOCUMENT = 0x00020000; > const unsigned long STATE_IS_NETWORK = 0x00040000; > const unsigned long STATE_IS_WINDOW = 0x00080000; I've had to deal with this set of states a few times, and I've never really understood them. These comments help some, but I'm not sure they're entirely correct, at least in terms of what we do now, and I'm skeptical that these descriptions are clear enough for freezing. For example: >+ * STATE_IS_REQUEST >+ * This flag indicates that the state transition is for a non-document >+ * request (e.g., an inline image request). >+ * >+ * STATE_IS_DOCUMENT >+ * This flag indicates that the state transition is for a document request, >+ * which includes documents in sub-frames. These descriptions make it sound like these two bits should be mutually exclusive, yet all but one of the places in nsDocLoader.cpp that pass STATE_IS_DOCUMENT also pass STATE_IS_REQUEST. >+ * STATE_IS_NETWORK >+ * This flag indicates that the state transition corresponds to a network >+ * level event. A nsIWebProgressListener attached to a nsIWebProgress will >+ * not see this flag for onStateChange events corresponding to a >+ * subdocument. Given this description, is it a bug that the very first bit of nsDocLoaderImpl::FireOnStateChange checks |mIsLoadingDocument|?
> I've had to deal with this set of states a few times, and I've never really > understood them. Yes, these flags in particular are poorly defined. > These descriptions make it sound like these two bits should be mutually > exclusive, yet all but one of the places in nsDocLoader.cpp that pass > STATE_IS_DOCUMENT also pass STATE_IS_REQUEST. You are correct. The documentation is flat out wrong. STATE_IS_REQUEST appears to indicate a state transistion corresponding to a nsIRequest instance, and each STATE_IS_DOCUMENT should (it would seem) be OR'd with STATE_IS_REQUEST. I don't understand why that is not the case for doStopDocumentLoad. > Given this description, is it a bug that the very first bit of > nsDocLoaderImpl::FireOnStateChange checks |mIsLoadingDocument|? No, I don't think so because it would appear that we only pass STATE_IS_NETWORK to FireOnStateChange from doStartDocumentLoad and doStopDocumentLoad, and in those cases mIsLoadingDocument should be true. Oh, wait.. hmm.. doStopDocumentLoad is called from DocLoaderIsEmpty, which sets mIsLoadingDocument to false before it calls doStopDocumentLoad. But, FireOnStateChange calls mParent->FireOnStateChange, which means that the parent may still have mIsLoadingDocument set to true. So, that is consistent with the comment I added to the IDL. Of course, DocLoaderIsEmpty calls mParent->DocLoaderIsEmpty, so it would seem that later on there might be OnStateChange events with STATE_IS_NETWORK for the parent webprogress instances. This code is such a mess :-( I'm not very happy with the current implementation. I'm not really sure why anyone would really care about STATE_IS_NETWORK and STATE_IS_WINDOW. Indeed, LXR shows that nothing in our codebase looks at STATE_IS_WINDOW. We could just remove it, or keep it and mark it as unused, like I did for STATE_NEGOTIATING (to avoid triggering exceptions for embedders or extension authors). STATE_IS_NETWORK seems to be used in a lot of places, but I'm not sure that the information it conveys could not be extracted in some other way. It seems to mean something to browser.js. Hmm...
I think there may be some significance to the fact that we have two OnStateChange calls inside doStopDocumentLoad, and it probably has to do with wanting to "complete" stuff in two phases: first stuff triggered off of STATE_IS_DOCUMENT and second stuff triggered off of STATE_IS_NETWORK. Perhaps STATE_IS_NETWORK, which only appears with STATE_START or STATE_STOP, is (or was) in some way intended to denote the starting and stopping of overall network activity. I don't think it denotes that today since we see STATE_IS_NETWORK sent for each subdocument start and stop.
This JS component hooks itself up to the toplevel webprogress and records all events. It's interesting to note when STATE_IS_NETWORK appears. Apparently, one can use it to determine when a frameset completes loading because STATE_STOP | STATE_IS_NETWORK only appears once all of the frames have finished loading. I think this is by design, and I should probably document it.
OK, STATE_IS_WINDOW appears to exist so that we have a STATE_IS_ flag when STATE_IS_NETWORK is stripped. Basically, whenever a document completes, we generate the following three calls to onStateChange: 1) STATE_STOP | STATE_IS_REQUEST 2) STATE_STOP | STATE_IS_DOCUMENT 3) STATE_STOP | STATE_IS_NETWORK | STATE_IS_WINDOW <or> STATE_STOP | STATE_IS_WINDOW For toplevel documents, #2 and #3 are delayed until all of the subdocuments have completed. STATE_IS_NETWORK is sent to a listener's onStateChange only when the webprogress instance, on which the listener is attached, reaches #3. In that way, a listener can attach itself to a webprogress object and expect to see STATE_STOP | STATE_IS_NETWORK when everything in that webprogress completes. STATE_IS_WINDOW appears to exist so that we have a STATE_IS_ bit to pass to onStateChange when STATE_IS_NETWORK is not set! I think it roughly indicates that the webprogress is completing but that it is not the one you (the listener) attached yourself to. I'd like to either remove STATE_IS_WINDOW, and not send the corresponding onStateChange event, or make sure that STATE_IS_WINDOW has a corresponding STATE_START event. Since the listener can choose to not receive STATE_IS_WINDOW events, I think I might prefer to keep the STATE_IS_WINDOW state and go ahead and add a corresponding STATE_START for STATE_IS_WINDOW. Does that make sense to everyone?
Attachment #160565 - Flags: superreview?(bzbarsky)
Attachment #160565 - Flags: review?(cbiesinger)
I can't even make a meaningful estimate of when I'll get to this review... I have some long reviews in my queue already, and term has started, so the time I have to spend on Mozilla is rapidly approaching 0.
Comment on attachment 160565 [details] [diff] [review] patch to make STATE_IS_WINDOW more meaningful OK, bz... thanks for the heads-up... I'll pick on dbaron since he expressed "interest" ;-)
Attachment #160565 - Flags: superreview?(bzbarsky) → superreview?(dbaron)
Here's what the output of webprogresslistener.js looks like with the last patch applied to the tree. I'm thinking that it might be nice to include something like this in nsIWebProgressListener.idl
> Here's what the output of webprogresslistener.js looks like... I should have mentioned what the HTML files look like in this case: test.html: <html><body> <iframe src="test_frame.html"></iframe> </body></html> test_frame.html: <html><body> hello </body></html>
we really need to figure out how these changes affect us. please don't flash freeze, we're in crunch time and don't have time for anything :(
> we really need to figure out how these changes affect us. please don't flash > freeze, we're in crunch time and don't have time for anything :( timeless: no where in the tree was STATE_IS_WINDOW being referenced (except in logging code). adding STATE_IS_WINDOW to doStartDocumentLoad only makes sense to balance the STATE_IS_WINDOW in doStopDocumentLoad. grep your tree... i'd be surprised if you were using STATE_IS_WINDOW.
Comment on attachment 160565 [details] [diff] [review] patch to make STATE_IS_WINDOW more meaningful ok, this patch looks good; it's good that STATE_IS_WINDOW now has both a START and a STOP event. what I'm wondering, though... why does doStopDocumentLoad send two notifications, rather than one with all the flags...?
Attachment #160565 - Flags: review?(cbiesinger) → review+
> what I'm wondering, though... why does doStopDocumentLoad send two > notifications, rather than one with all the flags...? I'm not sure, but that's not something I'd venture to change. I suspect the ordering is critical for some reason. NOTE: The interface doesn't promise that the final notification will be split like this. Maybe it should because someone may depend on it being that way.
Attachment #160565 - Flags: superreview?(dbaron) → superreview+
ok, the "patch to make STATE_IS_WINDOW more meaningful" has been checked in on the trunk.
Depends on: 253550
> 106 * STATE_IS_NETWORK > 107 * This flag indicates that the state transition corresponds to a toplevel > 108 * document, and is accompanied by either STATE_START or STATE_STOP. is wrong. toplevel document would be the root frame. but if i click in a subframe, then something still sends is_network. > 132 * STATE_IS_BROKEN > 133 * This flag indicates an unknown security state. This may mean that the > 134 * request is being loaded as part of a page in which some content was > 135 * received over an insecure channel. still absolutely sucks > 146 const unsigned long STATE_SECURE_HIGH = 0x00040000; > 147 const unsigned long STATE_SECURE_MED = 0x00010000; > 148 const unsigned long STATE_SECURE_LOW = 0x00020000; is still not documented > 187 * @param aCurTotalProgress > 188 * The current progress for all the requests being monitored. is meaningless. what keeps track of 'all the requests being monitored'? > 193 * NOTE: For download sizes that exceed the maximum value representable by > 194 * type long, -1 will be used. clarify that you mean signed long. > 250 * NOTE: These notification will only occur if a security package is > 251 * installed. notifications -- if some of these flags can grow in the future, this should be indicated (somehow).
> > 106 * STATE_IS_NETWORK > > 107 * This flag indicates that the state transition corresponds to a toplevel > > 108 * document, and is accompanied by either STATE_START or STATE_STOP. > > is wrong. > > toplevel document would be the root frame. but if i click in a subframe, then > something still sends is_network. toplevel in this context means the frame in which content is being loaded, where that frame may itself contain other frames. nothing precludes that toplevel frame from being itself part of another frameset. the point of this flag is to mark the start and stop of an entire load, including all subframe loads. if you are only navigating within a subframe, and if only that subframe loads content, then that subframe is considered toplevel for the duration of that load. perhaps this needs to be spelled out more clearly. > > 132 * STATE_IS_BROKEN ... > still absolutely sucks ok, care to explain why you feel that way? > > 146 const unsigned long STATE_SECURE_HIGH = 0x00040000; > > 147 const unsigned long STATE_SECURE_MED = 0x00010000; > > 148 const unsigned long STATE_SECURE_LOW = 0x00020000; > > is still not documented These flags are documented in the comment for STATE_IS_SECURE. I did not feel the need to add redundant documentation for these "sub"-flags. > > 187 * @param aCurTotalProgress > > 188 * The current progress for all the requests being monitored. > > is meaningless. what keeps track of 'all the requests being monitored'? > > > 193 * NOTE: For download sizes that exceed the maximum value representable by > > 194 * type long, -1 will be used. > > clarify that you mean signed long. Why do we need to spell out the fact that |long| means signed? I think we should assume some basic knowledge of XPIDL types when people are reading our .idl files. > > 250 * NOTE: These notification will only occur if a security package is > > 251 * installed. > > notifications Thanks > if some of these flags can grow in the future, this should be indicated (somehow). Indeed. "Any unspecified bits are reserved for future use."
Attached patch mark interfaces frozen, move into SDK (obsolete) (deleted) — Splinter Review
Attachment #161019 - Flags: superreview?(bzbarsky)
Attachment #161019 - Flags: review?(cbiesinger)
nsIWebProgress.idl: darin%meer.net: + * The nsIWebProgress interface is used to look at the progress of documents darin%meer.net: + * loading in a particular DOM window and any descendent DOM windows. hm... that does not seem entirely true. what if I get the nsIWebProgress service and register my listener there? then it catches all progress everywhere, not just in a particular window... darin%meer.net: + * These flags indicate the state transistions to observe, corresponding to darin%meer.net: + * nsIWebProgressListener::onStateChange. (not new) "transitions" I note you didn't address timeless's toplevel comment... can that be considered "obvious"?
> nsIWebProgress.idl: > darin%meer.net: + * The nsIWebProgress interface is used to look at the > progress of documents > darin%meer.net: + * loading in a particular DOM window and any descendent DOM > windows. > > hm... that does not seem entirely true. what if I get the nsIWebProgress service > and register my listener there? then it catches all progress everywhere, not > just in a particular window... ok, sure that is true. that is an exception though, and it should probably be documented separately. most users of this interface are either attaching themselves to a <browser> instance or hooking themselves up to the root webprogress. > darin%meer.net: + * These flags indicate the state transistions to observe, > corresponding to > darin%meer.net: + * nsIWebProgressListener::onStateChange. > > (not new) "transitions" I don't understand this comment. > I note you didn't address timeless's toplevel comment... can that be considered > "obvious"? My change to nsIWebProgress.idl was meant to address his toplevel comment (i.e., that when you attach your WPL to a WP instance you are asking to receive events for that WP and any child WP instances, corresponding to child DOM windows). Perhaps I should spell that out more clearly.
> darin%meer.net: + * These flags indicate the state transistions to observe, I meant that "transistions" is misspelled. > My change to nsIWebProgress.idl was meant to address his toplevel comment ah, hm... but http://lxr.mozilla.org/seamonkey/source/uriloader/base/nsIWebProgressListener.idl#106 still talks about "toplevel"...
If anyone has additional thoughts or comments on these interfaces, please let them be known ASAP. Thanks!
Attachment #161019 - Flags: review?(cbiesinger) → review+
> toplevel in this context means the frame in which content is being loaded, where > that frame may itself contain other frames. nothing precludes that toplevel > frame from being itself part of another frameset. the point of this flag is to > mark the start and stop of an entire load, including all subframe loads. if you > are only navigating within a subframe, and if only that subframe loads content, > then that subframe is considered toplevel for the duration of that load. > perhaps this needs to be spelled out more clearly. It does. > 137 * STATE_IS_SECURE > 138 * This flag indicates that the data corresponding to the request was > 139 * received over a secure channel. The degree of security is expressed by > 140 * STATE_SECURE_HIGH, STATE_SECURE_MED, or STATE_SECURE_LOW. This is not documentation. I have no clue what it means and short of getting the wrong impression from the code, which is the original problem i ran into, this is not the way to do business. > > 187 * @param aCurTotalProgress > > 188 * The current progress for all the requests being monitored. > > is meaningless. what keeps track of 'all the requests being monitored'? you still haven't addressed this. -- general idl comment. if you comment the individual constants instead of the group, things like unstable.elemental.com/mozilla will be able to pull out documentation for the individual items.
> > toplevel in this context means the frame in which content is being loaded, I presume this was meant as a contribution to the documentation for nsIWebProgress.idl?? If so, then thanks. > This is not documentation. I have no clue what it means and short of getting It looks like documentation to me. How is the meaning not clear? > > is meaningless. what keeps track of 'all the requests being monitored'? > > you still haven't addressed this. The web progress object, which may correspond to a frameset or document, encompasses the loading of many requests. I guess you feel that that is somehow not clear. > general idl comment. if you comment the individual constants instead of the > group, things like unstable.elemental.com/mozilla will be able to pull out > documentation for the individual items. I looked at unstable, and I'm not unhappy with the current results there: http://unstable.elemental.com/mozilla/build/latest/mozilla/uriloader/dox/interfacensIWebProgressListener.html The fact that it groups the constants, and then provides documentation for that group is apparent, and IMO a good thing for clarifying that the grouping of related flags.
> I presume this was meant as a contribution to the documentation for nsIWebProgress.idl you wrote it. just so long as you stick something in there. > It looks like documentation to me. How is the meaning not clear? what is medium?
> you wrote it. just so long as you stick something in there. doh! brain-fart > > It looks like documentation to me. How is the meaning not clear? > > what is medium? something between high and low? seriously, i think it's intentionally meant to be a little bit vague. PSM or NSS is making a determination about the level of encryption, and it is reflected in this value. one might use the flag to color code an encryption indicator perhaps. to understand what it means precisely would require additional information from some other interface. so, is STATE_SECURE_MED the only thing that bothers you?
all three bother me. yes they were clearly meant to be intentionally vague. i think that when you're freezing an interface you should specify what they mean. the next round will have to use a new interface or new constants, so it's ok to freeze the meanings of all three.
> all three bother me. yes they were clearly meant to be intentionally vague. i > think that when you're freezing an interface you should specify what they > mean. I'm not sure I agree. I think it is appropriate and fine to have flags that offer a vague determination of security level, and then I think we should point consumers at the place to go to get more detailed security info. This way, applications do not have to decide for themselves, by inspecting the detailed security info, that the security level is low, medium, or high (which are states that an application may wish to expose in some GUI). > the next round will have to use a new interface or new constants, so it's ok > to freeze the meanings of all three. There only needs to be a next round if something is wrong with the interface. So far, the only thing that is really wrong with this interface is the fact that it cannot represent progress for 64-bit stream lengths. That doesn't necessarily mean an entirely new interface. It may only mean that we add a subclass of nsIWebProgressListener that has an onProgressChange64 method or something like that. At least, there are options there. What I see us doing in the future is offering better low-level interfaces to inspect the security state that is being reported here. Those interfaces can be in addition to nsIWebProgressListener.idl as it is today. (See nsIChannel::securityInfo, and nsITransportSecurityInfo, but that latter interface needs work if it is to be frozen.)
ok, revised patch with comment additions per feedback from timeless.
Attachment #160455 - Attachment is obsolete: true
Attachment #161019 - Attachment is obsolete: true
Attachment #162628 - Flags: superreview?(bzbarsky)
Attachment #162628 - Flags: review?(cbiesinger)
Attachment #161019 - Flags: superreview?(bzbarsky)
Attachment #162628 - Flags: review?(cbiesinger) → review+
Comment on attachment 162628 [details] [diff] [review] mark interfaces frozen, move into SDK, tweak a few comments >Index: nsIWebProgressListener.idl Some things that need additional documentation or consideration, imo: 1) Will there be any progress notifications for requests that somehow fail (eg 404 replies, host not found, etc). If so, what kind? 2) (related) At what point will STATE_START fire? When we make the request? When we get the server response? 3) Which request is passed to STATE_REDIRECTING notifications? Will the STATE_STOP for the old request happen after the STATE_REDIRECTING? That's what the comment seems to say, but it may be worth being more explicit about event ordering here. 4) If STATE_NEGOTIATING is not used, couldn't we remove it? Without changing anything else in the API? 5) Is there ever a case when STATE_IS_REQUEST is not set? If so, when? If not, could we indicate that? 6) What exactly is the difference between a STATE_IS_DOCUMENT and a STATE_IS_WINDOW? That's not clear to me from reading this api. 7) What is "the document being loaded" in the onStateChange comments? 8) In the comments on onProgressChange, it's not clear what value will have -1 used if things don't fit in type long... 9) onLocationChange documentation talks about watching a window. Aren't we actually watching an nsIWebProgress instance? This goes back to the earlier confusion about windows vs documents. Is this interface usable with documents that have no window associated to them? (XBL, XSLT, SVG, random XML loaded via our XML-loading apis, etc all come to mind.) 10) Will onSecurityChange always have an nsIRequest? Do we make any promises on what that request will be? Could it be a request for an image inside a document that's loading, say? 11) Should this interface say anything about how exceptions thrown from the various methods will be handled? Or even whether those methods are allowed to throw exceptions? Maybe not necessary, I guess.... Comments on the patch itself: > * Notification that the progress has changed for one of the requests being >- * monitored. >+ * monitored by aWebProgress. A nsIWebProgress instance generally Maybe "aWebProgress generally corresponds to a document"? The documentation for onSecurityChange should say "Security State Flags and Security Strength Flags" where it now says "Security State Flags". >Index: nsIWebProgress.idl This interface makes it clearer that all this only works if we have a DOM window about... The actual implementation of AddProgressListener (in docloader) will throw NS_ERROR_FAILURE in some out-of-memory conditions. That should be fixed... The interface should probably document that NS_ERROR_OUT_OF_MEMORY can get thrown by this method. Accessing the DOMWindow property can throw. This should be documented (or better yet, fixed? But the root docloader is an nsIWebProgress... then again, nothing in this interface mentions the root docloader; people using it are just asking for trouble imo). Does isLoadingDocument correspond to just the document for DOMWindow, or any subdocument too? Overall, I think these interfaces are in pretty good shape... Marking sr- pending answers to the issues raised above, though. Next time I can do this much faster, now that I know what things are like here. I do believe this is the first time I've read these IDL files... ;)
Attachment #162628 - Flags: superreview?(bzbarsky) → superreview-
> 1) Will there be any progress notifications for requests that somehow > fail (eg 404 replies, host not found, etc). If so, what kind? STATE_START | START_IS_REQUEST STATE_STOP | STATE_IS_REQUEST w/ aStatus set to a failure code > 2) (related) At what point will STATE_START fire? When we make the > request? When we get the server response? STATE_START fires for a request when the request is initiated. > 3) Which request is passed to STATE_REDIRECTING notifications? Will the request that is being redirected. > the STATE_STOP for the old request happen after the > STATE_REDIRECTING? yes. note: there isn't really a way with this API to link the old request to the new request. instead, listener's just see that a request is being redirected... and they expect to see another request start after that. > 4) If STATE_NEGOTIATING is not used, couldn't we remove it? Without > changing anything else in the API? i didn't want to remove it for two reasons: - some JS component may be referencing the constant, and removing it could cause unexpected exceptions. - if we ever define new bits for the state flags, i don't want us to reuse this bit, so keeping it in the API helps avoid that. > 5) Is there ever a case when STATE_IS_REQUEST is not set? If so, > when? If not, could we indicate that? yes, STATE_STOP | STATE_IS_WINDOW happens. > 6) What exactly is the difference between a STATE_IS_DOCUMENT and a > STATE_IS_WINDOW? That's not clear to me from reading this api. as discussed on irc, the difference is subtle. i think STATE_IS_WINDOW exists purely so that we have an object to speak of when we send the second STATE_STOP event corresponding to document completion. that's a very difficult thing to clearly explain. and i'm not sure exactly why the two events even exist. > 7) What is "the document being loaded" in the onStateChange comments? the webprogress... i think i need to replace all mentions of frame, document, and window with "webprogress" ... and make it clearer somewhere what a webprogress instance represents. > 8) In the comments on onProgressChange, it's not clear what value > will have -1 used if things don't fit in type long... how is the comment not clear? it says: "For download sizes that exceed the maximum value representable by type long, -1 will be used." ... what else could "download sizes" mean other than the parameters that indicate size in the function call? > 9) onLocationChange documentation talks about watching a window. > Aren't we actually watching an nsIWebProgress instance? This goes > back to the earlier confusion about windows vs documents. Is this > interface usable with documents that have no window associated to > them? (XBL, XSLT, SVG, random XML loaded via our XML-loading > apis, etc all come to mind.) apparently, yes... nsIWebBrowserPersist uses this interface. but, it passes null for the webprogress parameter, so maybe that's a bad example. clearly, the root docloader (nsIWebProgress instance) does not have a nsIDOMWindow associated with it. so, i think we should simply talk of webprogress instances in the comments for WPL, and then in the comments for WP, we can talk about the possible relation to things like documents and windows. > 10) Will onSecurityChange always have an nsIRequest? Do we make any > promises on what that request will be? Could it be a request for > an image inside a document that's loading, say? i don't think we make any promises about what any of the requests will be. they can even be null in some cases. i suppose it is probably the request that caused the security state to change. > 11) Should this interface say anything about how exceptions thrown > from the various methods will be handled? Or even whether those > methods are allowed to throw exceptions? Maybe not necessary, I > guess.... I guess we can just say that exceptions are ignored. > Maybe "aWebProgress generally corresponds to a document"? perhaps.. but now i prefer to not mention document and window in nsIWPL. > The documentation for onSecurityChange should say "Security State Flags and > Security Strength Flags" where it now says "Security State Flags". ok, thanks. ("Security Strength Flags" was a recent addition to the documentation.) > The actual implementation of AddProgressListener (in docloader) will throw > NS_ERROR_FAILURE in some out-of-memory conditions. That should be fixed... > The interface should probably document that NS_ERROR_OUT_OF_MEMORY can get > thrown by this method. any xpcom method may throw NS_ERROR_OUT_OF_MEMORY as well as a host of other generic exceptions. consider language bindings, and distributed xpcom, etc. the only exceptions worth mentioning are the ones that are not so generic. i don't think we should document NS_ERROR_OUT_OF_MEMORY on every xpcom method call... that would be overly verbose. > Accessing the DOMWindow property can throw. This should be documented (or > better yet, fixed? can't be fixed. should be documented. > But the root docloader is an nsIWebProgress... then again, > nothing in this interface mentions the root docloader; people using it are > just asking for trouble imo). we need to make the root docloader something that is frozen. people use it to attach global WPL instances, and we need to / should support that. > Does isLoadingDocument correspond to just the document for DOMWindow, or any > subdocument too? i think it just refers to the current webprogress instance, but i'll verify and document it. thanks bz for the thoughtful review :)
> nsIWebBrowserPersist uses this interface so does nsExternalAppHandler, btw... (i.e. the nsIDownload implementation is expected to implement nsIWPL)
> yes, STATE_STOP | STATE_IS_WINDOW happens. And the aRequest is null, in that case, I'm guessing? Document that, along with the other answers to my questions, please. > how is the comment not clear? It's not clear, for example, whether one of the values being out of range will force all the others to be -1 as well. That is, if we know that the max progress overflows a 32-bit int, will we always have -1 for the current progress, or will we have a real number for a while and then -1 until it's done? I suspect we do the latter, though the former is possibly less confusing for callers to deal with...
> And the aRequest is null, in that case, I'm guessing? Document that, along > with the other answers to my questions, please. no, it is not null in that case. it is in fact the same request that was passed to onStateChange(STATE_STOP|STATE_IS_DOCUMENT). i'm not sure that that makes much sense. i plan on documenting all of the stuff we've just discussed. ok, i see now why you thought the -1 stuff was unclear. thanks for clarifying.
Attached patch revised patch per bz's review comments (obsolete) (deleted) — Splinter Review
Attachment #162628 - Attachment is obsolete: true
Attachment #163911 - Flags: superreview?(bzbarsky)
Comment on attachment 163911 [details] [diff] [review] revised patch per bz's review comments + * @throw NS_ERROR_FAILURE + * Indicates that there is no associated DOM window. so, this will never be null when the method returns successfully?
it looks like in some very unexpected situations that it could end up returning NS_ERROR_NO_INTERFACE. but, i don't think it will ever return NS_OK and a NULL valued DOM window.
Comment on attachment 163911 [details] [diff] [review] revised patch per bz's review comments >Index: nsIWebProgressListener.idl >+ * For any given request, onStateChange is called once with the STATE_START >+ * flag, zero or more times with the STATE_TRANSFERRING flag or once with the >+ * STATE_REDIRECTING flag, and then finally once with the STATE_STOP flag. Except when it's called twice with the STATE_STOP flag... say "once or twice" here and reference the STATE_IS_WINDOW documentation? > * STATE_IS_NETWORK >+ this flag is only set when onStateChange's aWebProgress >+ * is the nsIWebProgress to which the nsIWebProgressListener was added or >+ * if the nsIWebProgress to which the nsIWebProgressListener was added is >+ * not busy loading any requests. I'm not sure what this last part means.... Perhaps say that this is set if this is the first STATE_START or last STATE_STOP associated with the nsIWebProgress instance being observed? Is that even true? In any case, this part needs a bit more work... Other than that, this looks much better!
> Except when it's called twice with the STATE_STOP flag... say "once or twice" > here and reference the STATE_IS_WINDOW documentation? well, it is once with STATE_IS_REQUEST... then again with STATE_IS_WINDOW if the request is a document request. yeah, i'll try to find a way to document that. > > * STATE_IS_NETWORK ... > I'm not sure what this last part means.... Perhaps say that this is set if > this is the first STATE_START or last STATE_STOP associated with the > nsIWebProgress instance being observed? Is that even true? In any case, this > part needs a bit more work... yeah, this is the most complicated thing to document. basically, if you are attached as a listener to a webprogress, you'll get STATE_IS_NETWORK|STATE_START to tell you when activity is beginning in your webprogress or possibly just in a webprogress corresponding to a subframe. in other words, your own webprogress may not be loading a document, but one of it's child webprogress instances may be loading a new document. in that case you'd see STATE_IS_NETWORK start and stop to mark the start and stop of that child webprogress. so, that's what i was trying to describe, but yeah... i should just be more verbose or something.
Yeah, I think just explaining it at length, if needed, is the way to go.
Attachment #163911 - Attachment is obsolete: true
Attachment #164034 - Flags: superreview?(bzbarsky)
Attachment #163911 - Flags: superreview?(bzbarsky)
Comment on attachment 164034 [details] [diff] [review] revised patch per recent comments sr=bzbarsky
Attachment #164034 - Flags: superreview?(bzbarsky) → superreview+
fixed-on-trunk
Status: ASSIGNED → RESOLVED
Closed: 20 years ago
Resolution: --- → FIXED
Blocks: 268520
So I just ran into something interesting... the two interfaces have methods with identical names, so implementing both on the same object, in JS say, can be pretty nontrivial...
Er, nevermind. Actually, what I ran into is nsIWebProgressListener colliding with nsISecurityEventSink....
Attached patch complete diff (deleted) — Splinter Review
created by diffing MOZILLA_1_7_BRANCH with HEAD for the three files and removing the REQUIRES change that happened.
Comment on attachment 166894 [details] [diff] [review] complete diff this is a collection of all of the above patches. it consists only of comment changes and has therefore no risk. in order to make the gecko sdk for the next branch release more useful, it would be nice to have this on the branch.
Attachment #166894 - Flags: approval1.7.x?
Comment on attachment 166894 [details] [diff] [review] complete diff a=mkaply
Attachment #166894 - Flags: approval1.7.x? → approval1.7.x+
fixed on the 1.7 branch.
Keywords: fixed1.7.x
Product: Core → Core Graveyard
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: