| <html> |
| <title>Test media source replacement</title> |
| <body> |
| |
| <p>Test that media keeps playing when the source element is replaced.</p> |
| |
| <script src=video-test.js></script> |
| <script src=media-file.js></script> |
| <script src=../resources/gc.js></script> |
| <script> |
| var timeupdateEventCount = 0; |
| var skippedCount = 0; |
| var sourceReplaced = false; |
| |
| function swapAudio() { |
| v = document.getElementsByTagName('audio')[0]; |
| v.removeChild(v.childNodes[0]); |
| var s = document.createElement('source'); |
| s.src = findMediaFile("audio", "content/test"); |
| v.appendChild(s); |
| } |
| |
| function errorListener(event) |
| { |
| logResult(false, "Caught 'error' event, audio.error.code = " + this.error.code); |
| endTest(); |
| } |
| |
| function canplaythroughListener(event) |
| { |
| consoleWrite("EVENT(canplaythrough)"); |
| testElement = this; |
| testExpected("testElement.currentTime", 0); |
| this.play(); |
| } |
| |
| function playingListener(event) |
| { |
| consoleWrite("EVENT(playing)"); |
| } |
| |
| function timeupdateListener(event) |
| { |
| ++timeupdateEventCount; |
| |
| if (timeupdateEventCount-skippedCount == 1) { |
| // First time update after source replacement should be 0. |
| // We allow one late time update to come in from the previous |
| // source element. This was done to help the cr-linux test |
| // pass, and does not necessarily indicate a problem. |
| if (sourceReplaced) { |
| if (skippedCount >= 1 || this.currentTime == 0) { |
| testElement = this; |
| testExpected("testElement.currentTime", 0); |
| } else { |
| // The time is not 0 as expected. Hope this is a |
| // late update from the previous source. |
| ++skippedCount; |
| } |
| } |
| } else if (timeupdateEventCount-skippedCount >= 2) { |
| // We wait 2 timeupdate events so we are sure the media engine |
| // is playing the media, and make sure time is advancing. |
| testElement = this; |
| testExpected("testElement.currentTime", 0, '>'); |
| if (!sourceReplaced) { |
| consoleWrite("Replacing the media's source element:"); |
| sourceReplaced = true; |
| timeupdateEventCount = 0; |
| skippedCount = 0; |
| // The ports are not consistent in regards to whether |
| // the canplaythrough and playing events are triggered |
| // a second time, so stop listening for them. This was |
| // done to help the cr-linux test pass, and does not |
| // necessarily indicate a problem. |
| this.removeEventListener('playing', playingListener); |
| this.removeEventListener('canplaythrough', canplaythroughListener); |
| swapAudio(); |
| } else { |
| this.removeEventListener('timeupdate', timeupdateListener); |
| this.pause(); |
| endTest(); |
| } |
| } |
| } |
| |
| function testAudioElement(count) |
| { |
| timeupdateEventCount = 0; |
| skippedCount = 0; |
| var audioElement = document.getElementsByTagName('audio')[count]; |
| //audioElement.removeChild(audioElement.childNodes[0]); |
| audioElement.addEventListener('error', errorListener); |
| audioElement.addEventListener('canplaythrough', canplaythroughListener); |
| audioElement.addEventListener('timeupdate', timeupdateListener); |
| audioElement.addEventListener('playing', playingListener); |
| |
| var s = document.createElement('source'); |
| s.src = findMediaFile("audio", "content/silence"); |
| audioElement.appendChild(s); |
| |
| } |
| |
| document.write("<audio controls></audio>"); |
| testAudioElement(0); |
| gc(); |
| gc(); |
| </script> |
| |
| </body> |
| </html> |