- From: Olli Pettay <Olli.Pettay@helsinki.fi>
- Date: Wed, 21 Dec 2011 21:15:34 +0200
- To: Jarred Nicholls <jarred@webkit.org>
- CC: Anne van Kesteren <annevk@opera.com>, WebApps WG <public-webapps@w3.org>
On 12/21/2011 08:59 PM, Jarred Nicholls wrote: > On Wed, Dec 21, 2011 at 1:34 PM, Olli Pettay <Olli.Pettay@helsinki.fi > <mailto:Olli.Pettay@helsinki.fi>> wrote: > > On 12/21/2011 05:59 PM, Jarred Nicholls wrote: > > On Wed, Dec 21, 2011 at 10:47 AM, Anne van Kesteren > <annevk@opera.com <mailto:annevk@opera.com> > <mailto:annevk@opera.com <mailto:annevk@opera.com>>> wrote: > > On Wed, 21 Dec 2011 16:25:33 +0100, Jarred Nicholls > <jarred@webkit.org <mailto:jarred@webkit.org> > <mailto:jarred@webkit.org <mailto:jarred@webkit.org>>> wrote: > > 1. The spec says the timeout should fire after the specified > number of > > milliseconds has elapsed since the start of the request. I > presume this means literally that, with no bearing on > whether or > not data is coming over the wire? > > > Right. > > > 2. Given we have progress events, we can determine that > data is > coming > > over the wire and react accordingly (though in an ugly > fashion, > semantically). E.g., the author can disable the timeout or > increase the timeout. Is that use case possible? In other > words, should setting the timeout value during an active > request > reset the timer? Or should the > timer always be basing its elapsed time on the start > time of the > request + the specified timeout value (an absolute point > in the > future)? I > understand the language in the spec is saying the > latter, but > perhaps could use emphasis that the timeout value can be > changed > mid-request. > > > http://dvcs.w3.org/hg/xhr/rev/____2ffc908d998f > <http://dvcs.w3.org/hg/xhr/rev/__2ffc908d998f> > > <http://dvcs.w3.org/hg/xhr/__rev/2ffc908d998f > <http://dvcs.w3.org/hg/xhr/rev/2ffc908d998f>> > > > Brilliant, no doubts about it now ;) > > > > > Furthermore, if the timeout value is set to a value > 0 > but less > than the original value, and the elapsed time is past the > (start_time + timeout), do we fire the timeout or do we > effectively disable it? > > > The specification says "has passed" which seems reasonably > clear to > me. I.e. you fire it. > > > Cool, agreed. > > > > 3. Since network stacks typically operate w/ timeouts > based on data > > coming over the wire, what about a different timeout > attribute > that fires a timeout event when data has stalled, e.g., > dataTimeout? I think this type of timeout would be more > desirable by authors to have control over for > async requests, since today it's kludgey to try and simulate > that with > timers/progress events + abort(). Whereas with the > overall request > timeout, library authors already simulate that easily with > timers + abort() in the async context. For sync requests in > worker contexts, I can see a dataTimeout as being heavily > desired over a simple request timeout. > > > So if you receive no octet for dataTimeout milliseconds you > get the > timeout event and the request terminates? Sounds reasonable. > > > Correct. Same timeout exception/event shared with the request > timeout > attribute, and similar setter/getter steps; just having that > separate > criteria for triggering it. > > > > Is there really need for dataTimeout? You could easily use progress > events and .timeout to achieve similar functionality. > This was the reason why I originally asked that .timeout can be set > also when XHR is active. > > xhr.onprogress = function() { > this.timeout += 250; > } > > > Then why have timeout at all? Your workaround for a native dataTimeout > is analogous to using a setTimeout + xhr.abort() to simulate the request > timeout. > > I can tell you why I believe we should have dataTimeout in addition to > timeout: > > 1. Clean code, which is better for authors and the web platform. To > achieve the same results as a native dataTimeout, your snippet would > need to be amended to maintain the time of the start of the request > and calculate the difference between that and the time the progress > event fired + your timeout value: > > xhr.timeout = ((new Date()).getTime() - requestStart) + myTimeout; > > A dataTimeout is a buffered timer that's reset on each octet of data > that's received; a sliding window of elapsed time before timing out. > Every time the above snippet is calculated, it becomes more and > more erroneous; the margin of error increases because of time delays > of JS events being dispatched, etc. > 2. Synchronous requests in worker contexts have no way to simulate this > behavior, for request timeouts nor for data timeouts. Most of the > network stacks in browsers have a default data timeout (e.g. 10 > seconds) but allowing the author to override that timeout has value > I'd think. With that said... synchronous requests? What are those? :) > Ah, sync XHR in workers is a good case. So dataTimeout would fire if no data has been received in the dataTimeout period? And receiving some data would basically restart the timer? > > > (timeout is being implemented in Gecko) > > > Awesome! > > > > > -Olli > > > > > > > > > -- > Anne van Kesteren > http://annevankesteren.nl/ > > > Thanks, > Jarred > > >
Received on Wednesday, 21 December 2011 19:16:34 UTC