[whatwg] <video> resource selection algorithm and NETWORK_NO_SOURCE

Philip Jägenstedt philipj at opera.com
Fri Jul 23 07:16:27 PDT 2010


Silvia made we aware of discrepancy in how browsers implement the resource  
selection algorithm, see forwarded message. It's my assessment that Opera  
is the only browser following the spec. I've filed this bug with Mozilla:

https://bugzilla.mozilla.org/show_bug.cgi?id=581355

I've also reported bugs in Chrome and Safari, but can't see where they  
ended up.

The reason I'm writing this email is that apparently everyone but myself  
has a different interpretation of the spec, so perhaps this is something  
we need to discuss. Does any other browser ever set the state  
NETWORK_NO_SOURCE at all? I speculated that perhaps other browsers aren't  
very strict about which parts of the algorithm are run synchronously and  
not, but even checking the networkState after a setTimeout it still isn't  
NETWORK_NO_SOURCE.

Test case: http://people.opera.com/philipj/2010/07/23/networkState.html

Please fix implementation or spec :)

-- 
Philip Jägenstedt
Core Developer
Opera Software

------- Forwarded message -------
From: "Silvia Pfeiffer" <silviapfeiffer1 at gmail.com>
To: "Philip Jägenstedt" <philipj at opera.com>
Cc:
Subject: Re: bug in Opera video
Date: Thu, 22 Jul 2010 12:51:15 +0200

Hi Philip,

On Thu, Jul 22, 2010 at 8:02 PM, Philip Jägenstedt <philipj at opera.com>
wrote:
> On Thu, 22 Jul 2010 01:23:09 +0200, Silvia Pfeiffer
> <silviapfeiffer1 at gmail.com> wrote:
>
>> Hi Philip,
>>
>> I've just made an experiment with the play() function in Opera and it
>> seems that Opera doesn't support play() if currentSrc has not been
>> determined yet (i.e. if the media element doesn't have a loaded
>> resource). The spec says to deal with this situation and so do all
>> other browsers, bar Opera. Here is a test:
>>
>> <!DOCTYPE html>
>> <html lang="en">
>>  <body>
>>    <video controls width="400px">
>>      <source type="video/mp4">
>>      <source type="video/webm">
>>      <source type="video/ogg">
>>    </video>
>>    <p>currentSrc on start: <span id="currentSrc_first"></span>.</p>
>>    <p>currentSrc after loadedmetadata: <span
>> id="currentSrc_loadedmetadata"></span>.</p>
>>    <script type="text/javascript">
>>      video = document.getElementsByTagName("video")[0];
>>      source = document.getElementsByTagName("source");
>>
>>      span1 = document.getElementById("currentSrc_first");
>>      span1.innerHTML = video.currentSrc;
>>      source[0].src = "HelloWorld.mp4";
>>      source[1].src = "HelloWorld.webm";
>>      source[2].src = "HelloWorld.ogv";
>>      video.play();
>>
>>      span2 = document.getElementById("currentSrc_loadedmetadata");
>>      function span2Update(evt) {
>>          span2.innerHTML = video.currentSrc;
>>      }
>>      video.addEventListener("loadedmetadata", span2Update, false);
>>    </script>
>>  </body>
>> </html>
>>
>> The video.play() function should execute the resource selection and
>> fetching, but it doesn't. Not sure if this is deliberate and you want
>> a discussion on the whatwg about it, or just a bug.
>>
>> Cheers,
>> Silvia.
>>
>
> The spec says "If the media element's networkState attribute has the  
> value
> NETWORK_EMPTY, invoke the media element's resource selection algorithm."
>
> I added alert(video.networkState) just before video.play. In Opera it is  
> 3
> (NETWORK_NO_SOURCE) while in Chrome it is 0 (NETWORK_EMPTY).

Ah, yes, this is actually another thing I wanted to alert you to. All
other browsers set the @networkState to NETWORK_EMPTY at the start of
loading a new media resource (Firefox, Safari and Chrome). I was going
to discuss this with you, since Opera interprets the spec different
here - which is understandable, since the first step in the resource
selection algorithm says to:
1. Set the networkState to NETWORK_NO_SOURCE.

OTOH however, the description for the NETWORK_NO_SOURCE state is as
follows:
NETWORK_EMPTY (numeric value 0)
      The element has not yet been initialized. All attributes are in
their initial states.
and for NETWORK_NO_SOURCE is:
NETWORK_NO_SOURCE (numeric value 3)
      The element's resource selection algorithm is active, but it has
failed to find a resource to use.

Thus, I believe this may be a spec bug and really the first step in
the resource selection algorithm should say
1. Set the networkState to NETWORK_EMPTY.
which is more consistent with the implementations of the other
browsers and also consistent with the meaning of NETWORK_EMPTY and
NETWORK_NO_SOURCE.


> We are
> following the spec here, as the resource selection algorithm should be  
> run
> the first time when the video element is inserted into the DOM by the
> parser, then again after each source element is inserted. For this  
> markup,
> it will stay as NETWORK_NO_SOURCE in all cases, which is basically a  
> waiting
> state.
>
> There are a few ways we could go about solving this:
>
> 1. Make modifying the src attribute of source elements that are children  
> to
> a video element that has state EMPTY or NO_SOURCE run the resource  
> selection
> algorithm. I don't like this idea myself, it's unnecessarily complicated.
>
> 2. Let the other browsers follow the spec and add a call to video.load()
> before video.play().
>
> Please do bring this up with the WHATWG. If you like you can forward this
> mail verbatim. To anyone testing this, note that HelloWorld.mp4 has to
> actually exist (or changed to something that does) for the above test to
> work.

Actually, in cases where it doesn't exist, all other browsers can deal
with it, but Opera hangs. I have actually posted that to Opera bug
reports if you want to follow up on this, too.

I'm leaving it to you to bring it up at WHATWG, since it seems that
the Opera implementation is the odd one out. :-)

Cheers,
Silvia.


More information about the whatwg mailing list