Re: [whatwg] API to delay the document load event

Le 24/04/2013 13:51, Robert O'Callahan a écrit :
> Context: https://bugzilla.mozilla.org/show_bug.cgi?id=863499
>
> Use-cases:
> 1) User-agents provide thumbnails of Web pages (e.g. desktop Firefox,
> FirefoxOS and Safari do this). We want to avoid taking a thumbnail while
> the application is incompletely loaded. The firing of the document load
> event is not currently a reliable indicator since the application might
> have ongoing load activities (e.g. IndexedDB transactions, Websocket
> activity) that do not block the document load event.
Tools built on top of headless browser tools struggle with this kind of 
problem too. The user agent "load" event is most of the time meaningless 
at the application abstraction level.
Crawlers/search engines might be interested too as sometimes links in 
documents are added dynamically.

> 2) User-agent has UI to distinguish pages that are in the process of
> loading from pages that are fully loaded. As in use-case #1, relying on the
> document load event as currently defined to transition the UI to the "fully
> loaded" state may be inaccurate.
>
> Proposal:
> Give Web applications APIs to explicitly delay the document load event. In
> particular, add a method "document.delayLoadEvent()" that causes the
> document load event to be delayed until a corresponding
> "document.stopDelayingLoadEvent()" method is called. Allow these to nest so
> that the document load event is delayed until at least as many calls to
> stopDelayingLoadEvent() have been made as there were calls to
> delayLoadEvent().
Both of use cases suggest that the definition of an application being 
"loaded" or "ready" is different from the user agent definition, so I 
believe delaying the UA load event is a wrong approach as it will lead 
in confusion.

Also, I don't see how nested calls to delayLoadEvent help any of your 2 
use cases.


Proposal:
* Have a declarative way for an application to say "I'll tell you when 
I'm ready"
* A event dispatched by the application to tell when it is ready
Something along the lines of (better names and better details are welcome):

<html>
   <head>
     <meta name="customApplicationReadyEvent">
     <script>
         // do a lot of things
             document.dispatchEvent(
                 document.createEvent('AppReady', appReadydata)
             );
         //
     </script>
   </head>
</html>

This way, any tool waiting for the application to be ready can use the 
following algorithm (JS-like pseudo-code):
     // after <head> is parsed:
     if(document.applicationWillTellMeWhenReady){
         document.addEventListener('AppReady', takeScreenshot)
     }
     else{
         // waiting for load, like today
         document.addEventListener('load', takeScreenshot)
     }

Having a different independent event will also be the occasion to have a 
measure in PerformanceTiming [1] that is different than load. I believe 
having both is useful for different purposes (comparing "load" and 
"AppReady" across different user agents, etc.)
This also allows the 'AppReady' event to occur before the UA "load" 
which can make sense in some circumstances (below the fold images are 
still loading, but the app can already consider itself ready)

What do you think?

David

[1] 
https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/Overview.html#performancetiming

Received on Sunday, 28 April 2013 17:29:26 UTC