There is definitely a spec bug, because different locations of the spec say diverging things. While the first step in the resource selection algorithm states to go into NETWORK_NO_SOURCE state, the description of NETWORK_NO_SOURCE in the spec actually implies a state of failure. Since the first step in the resource selection algorithm really is a state where we know nothing about the resource yet, it matches more with the description of NETWORK_EMPTY:<br>

<br>NETWORK_EMPTY (numeric value 0)<br>
     The element has not yet been initialized. All attributes are in their initial states.<br><br>NETWORK_NO_SOURCE (numeric value 3)<br>
     The element's resource selection algorithm is active, but it has failed to find a resource to use.<br><br>In any case, it would be nice to get the spec corrected either way and the implementations aligned. :)<br>

<br>Cheers,<br>Silvia.<br><br><br><div class="gmail_quote">On Sat, Jul 24, 2010 at 12:16 AM, Philip Jägenstedt <span dir="ltr"><<a href="mailto:philipj@opera.com">philipj@opera.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

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:<div class="im">

<br>
<br>
<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=581355" target="_blank">https://bugzilla.mozilla.org/show_bug.cgi?id=581355</a><br>
<br></div>
I've also reported bugs in Chrome and Safari, but can't see where they ended up.<br>
<br>
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.<br>


<br>
Test case: <a href="http://people.opera.com/philipj/2010/07/23/networkState.html" target="_blank">http://people.opera.com/philipj/2010/07/23/networkState.html</a><br>
<br>
Please fix implementation or spec :)<div class="im"><br>
<br>
-- <br>
Philip Jägenstedt<br>
Core Developer<br>
Opera Software<br>
<br></div>
------- Forwarded message -------<br>
From: "Silvia Pfeiffer" <<a href="mailto:silviapfeiffer1@gmail.com" target="_blank">silviapfeiffer1@gmail.com</a>><br>
To: "Philip Jägenstedt" <<a href="mailto:philipj@opera.com" target="_blank">philipj@opera.com</a>><br>
Cc:<br>
Subject: Re: bug in Opera video<br>
Date: Thu, 22 Jul 2010 12:51:15 +0200<br>
<br>
Hi Philip,<br>
<br>
On Thu, Jul 22, 2010 at 8:02 PM, Philip Jägenstedt <<a href="mailto:philipj@opera.com" target="_blank">philipj@opera.com</a>><br>
wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
On Thu, 22 Jul 2010 01:23:09 +0200, Silvia Pfeiffer<br>
<<a href="mailto:silviapfeiffer1@gmail.com" target="_blank">silviapfeiffer1@gmail.com</a>> wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Hi Philip,<br>
<br>
I've just made an experiment with the play() function in Opera and it<br>
seems that Opera doesn't support play() if currentSrc has not been<br>
determined yet (i.e. if the media element doesn't have a loaded<br>
resource). The spec says to deal with this situation and so do all<br>
other browsers, bar Opera. Here is a test:<br>
<br>
<!DOCTYPE html><br>
<html lang="en"><br>
 <body><br>
   <video controls width="400px"><br>
     <source type="video/mp4"><br>
     <source type="video/webm"><br>
     <source type="video/ogg"><br>
   </video><br>
   <p>currentSrc on start: <span id="currentSrc_first"></span>.</p><br>
   <p>currentSrc after loadedmetadata: <span<br>
id="currentSrc_loadedmetadata"></span>.</p><br>
   <script type="text/javascript"><br>
     video = document.getElementsByTagName("video")[0];<br>
     source = document.getElementsByTagName("source");<br>
<br>
     span1 = document.getElementById("currentSrc_first");<br>
     span1.innerHTML = video.currentSrc;<br>
     source[0].src = "HelloWorld.mp4";<br>
     source[1].src = "HelloWorld.webm";<br>
     source[2].src = "HelloWorld.ogv";<br>
     video.play();<br>
<br>
     span2 = document.getElementById("currentSrc_loadedmetadata");<br>
     function span2Update(evt) {<br>
         span2.innerHTML = video.currentSrc;<br>
     }<br>
     video.addEventListener("loadedmetadata", span2Update, false);<br>
   </script><br>
 </body><br>
</html><br>
<br>
The video.play() function should execute the resource selection and<br>
fetching, but it doesn't. Not sure if this is deliberate and you want<br>
a discussion on the whatwg about it, or just a bug.<br>
<br>
Cheers,<br>
Silvia.<br>
<br>
</blockquote>
<br>
The spec says "If the media element's networkState attribute has the value<br>
NETWORK_EMPTY, invoke the media element's resource selection algorithm."<br>
<br>
I added alert(video.networkState) just before video.play. In Opera it is 3<br>
(NETWORK_NO_SOURCE) while in Chrome it is 0 (NETWORK_EMPTY).<br>
</blockquote>
<br>
Ah, yes, this is actually another thing I wanted to alert you to. All<br>
other browsers set the @networkState to NETWORK_EMPTY at the start of<br>
loading a new media resource (Firefox, Safari and Chrome). I was going<br>
to discuss this with you, since Opera interprets the spec different<br>
here - which is understandable, since the first step in the resource<br>
selection algorithm says to:<br>
1. Set the networkState to NETWORK_NO_SOURCE.<br>
<br>
OTOH however, the description for the NETWORK_NO_SOURCE state is as<br>
follows:<br>
NETWORK_EMPTY (numeric value 0)<br>
     The element has not yet been initialized. All attributes are in<br>
their initial states.<br>
and for NETWORK_NO_SOURCE is:<br>
NETWORK_NO_SOURCE (numeric value 3)<br>
     The element's resource selection algorithm is active, but it has<br>
failed to find a resource to use.<br>
<br>
Thus, I believe this may be a spec bug and really the first step in<br>
the resource selection algorithm should say<br>
1. Set the networkState to NETWORK_EMPTY.<br>
which is more consistent with the implementations of the other<br>
browsers and also consistent with the meaning of NETWORK_EMPTY and<br>
NETWORK_NO_SOURCE.<br>
<br>
<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
We are<br>
following the spec here, as the resource selection algorithm should be run<br>
the first time when the video element is inserted into the DOM by the<br>
parser, then again after each source element is inserted. For this markup,<br>
it will stay as NETWORK_NO_SOURCE in all cases, which is basically a waiting<br>
state.<br>
<br>
There are a few ways we could go about solving this:<br>
<br>
1. Make modifying the src attribute of source elements that are children to<br>
a video element that has state EMPTY or NO_SOURCE run the resource selection<br>
algorithm. I don't like this idea myself, it's unnecessarily complicated.<br>
<br>
2. Let the other browsers follow the spec and add a call to video.load()<br>
before video.play().<br>
<br>
Please do bring this up with the WHATWG. If you like you can forward this<br>
mail verbatim. To anyone testing this, note that HelloWorld.mp4 has to<br>
actually exist (or changed to something that does) for the above test to<br>
work.<br>
</blockquote>
<br>
Actually, in cases where it doesn't exist, all other browsers can deal<br>
with it, but Opera hangs. I have actually posted that to Opera bug<br>
reports if you want to follow up on this, too.<br>
<br>
I'm leaving it to you to bring it up at WHATWG, since it seems that<br>
the Opera implementation is the odd one out. :-)<br>
<br>
Cheers,<br>
Silvia.<br>
</blockquote></div><br>