| <!doctype html> |
| <html> |
| <head> |
| <style> |
| video { background-color: yellow; width: 320px; height: 240px;} |
| </style> |
| <script src=media-file.js></script> |
| <script src=video-test.js></script> |
| </head> |
| <body> |
| <video controls ></video> |
| <p>Test to ensure that a media file blocked by a beforeload handler generates an error |
| and does not block the document's 'load' event.</p> |
| |
| <script> |
| if (window.testRunner) |
| testRunner.dumpAsText(); |
| |
| var blockedURL; |
| var allowedURL; |
| var test; |
| var loadedmetadataFired = false; |
| var loadedFired = false; |
| var lastErrorFired = false; |
| |
| function logEvent(evt) |
| { |
| consoleWrite("<br>EVENT('" + evt.type + "')"); |
| } |
| |
| function loadedmetadata(evt) |
| { |
| loadedmetadataFired = true; |
| checkEndTest(); |
| } |
| |
| function setupSourceTest() |
| { |
| consoleWrite("<br>*** Test using the <source> element ***"); |
| blockedURL = relativeURL(video.src); |
| allowedURL = findMediaFile("audio", "content/test"); |
| |
| // Remove 'src' attribute so <source> will be used when we force a reload |
| video.removeAttribute('src'); |
| |
| var blockedSource = document.createElement('source'); |
| blockedSource.src = blockedURL; |
| blockedSource.type = mimeTypeForExtension(blockedSource.src.split('.').pop()); |
| video.appendChild(blockedSource); |
| |
| var allowedSource = document.createElement('source'); |
| allowedSource.src = allowedURL; |
| allowedSource.type = mimeTypeForExtension(allowedSource.src.split('.').pop()); |
| video.appendChild(allowedSource); |
| |
| test = 2; |
| video.load(); |
| }; |
| |
| function error(evt) |
| { |
| logEvent(evt); |
| switch (test) |
| { |
| case 1: |
| testExpected("event.target.tagName", "VIDEO"); |
| testExpected("video.error", null, "!="); |
| testExpected("video.error.code", MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED); |
| testExpected("video.networkState", HTMLMediaElement.NETWORK_NO_SOURCE); |
| |
| setupSourceTest(); |
| break; |
| case 2: |
| // The error should have been fired at the <source> and the media element should |
| // not be in an error state. |
| testExpected("event.target.tagName", "SOURCE"); |
| testExpected("video.error", null); |
| lastErrorFired = true; |
| checkEndTest(); |
| break; |
| case 3: |
| failTest("Unexpected 'error' event fired!"); |
| break; |
| } |
| } |
| |
| function beforeload(evt) |
| { |
| logEvent(evt); |
| testExpected("event.target.tagName", "VIDEO"); |
| switch (test) |
| { |
| case 1: |
| consoleWrite("blocking load of 'src'"); |
| evt.preventDefault(); |
| break; |
| |
| case 2: |
| if (relativeURL(evt.url) == blockedURL) { |
| consoleWrite("blocking load of first <source> element"); |
| evt.preventDefault(); |
| } else { |
| consoleWrite("allowing load of second <source> element"); |
| } |
| break; |
| } |
| } |
| |
| function loaded(evt) |
| { |
| loadedFired = true; |
| checkEndTest(); |
| }; |
| |
| function checkEndTest() |
| { |
| if (loadedmetadataFired && loadedFired && lastErrorFired) |
| endTest(); |
| }; |
| |
| findMediaElement(); |
| |
| video.addEventListener('loadedmetadata', loadedmetadata, true); |
| video.addEventListener('beforeload', beforeload, true); |
| video.addEventListener('error', error, true); |
| window.addEventListener('load', loaded, true); |
| |
| consoleWrite("*** Test initial state ***"); |
| testExpected("video.networkState", HTMLMediaElement.NETWORK_EMPTY); |
| testExpected("video.error", null); |
| |
| consoleWrite("<br>*** Test blocking the 'src' attribute ***"); |
| test = 1; |
| var mediaFile = findMediaFile("video", "content/test"); |
| video.src = mediaFile; |
| </script> |
| |
| </body> |
| </html> |