|  | <!doctype html> | 
|  | <meta charset=utf-8> | 
|  | <title>Media Source Extensions IDL tests</title> | 
|  | <div id=log></div> | 
|  | <script src=/resources/testharness.js></script> | 
|  | <script src=/resources/testharnessreport.js></script> | 
|  | <script src=/resources/WebIDLParser.js></script> | 
|  | <script src=/resources/idlharness.js></script> | 
|  | <script type=text/plain class=untested> | 
|  | interface EventTarget { | 
|  | void addEventListener(DOMString type, EventListener? callback, optional boolean capture /* = false */); | 
|  | void removeEventListener(DOMString type, EventListener? callback, optional boolean capture /* = false */); | 
|  | boolean dispatchEvent(Event event); | 
|  | }; | 
|  | interface URL {}; | 
|  | interface HTMLVideoElement {}; | 
|  | interface AudioTrack {}; | 
|  | interface VideoTrack {}; | 
|  | interface TextTrack {}; | 
|  | interface TimeRanges {}; | 
|  | typedef double DOMHighResTimeStamp; | 
|  | </script> | 
|  | <script type=text/plain> | 
|  | [Constructor] | 
|  | interface MediaSource : EventTarget { | 
|  | readonly    attribute SourceBufferList    sourceBuffers; | 
|  | readonly    attribute SourceBufferList    activeSourceBuffers; | 
|  | readonly    attribute ReadyState          readyState; | 
|  | attribute unrestricted double duration; | 
|  | SourceBuffer   addSourceBuffer (DOMString type); | 
|  | void           removeSourceBuffer (SourceBuffer sourceBuffer); | 
|  | void           endOfStream (optional EndOfStreamError error); | 
|  | static boolean isTypeSupported (DOMString type); | 
|  | }; | 
|  |  | 
|  | interface SourceBuffer : EventTarget { | 
|  | attribute AppendMode          mode; | 
|  | readonly    attribute boolean             updating; | 
|  | readonly    attribute TimeRanges          buffered; | 
|  | attribute double              timestampOffset; | 
|  | readonly    attribute AudioTrackList      audioTracks; | 
|  | readonly    attribute VideoTrackList      videoTracks; | 
|  | readonly    attribute TextTrackList       textTracks; | 
|  | attribute double              appendWindowStart; | 
|  | attribute unrestricted double appendWindowEnd; | 
|  | void appendBuffer (ArrayBuffer data); | 
|  | void appendBuffer (ArrayBufferView data); | 
|  | void appendStream (Stream stream, [EnforceRange] optional unsigned long long maxSize); | 
|  | void abort (); | 
|  | void remove (double start, double end); | 
|  | }; | 
|  |  | 
|  | interface SourceBufferList : EventTarget { | 
|  | readonly    attribute unsigned long length; | 
|  | getter SourceBuffer (unsigned long index); | 
|  | }; | 
|  |  | 
|  | interface VideoPlaybackQuality { | 
|  | readonly    attribute DOMHighResTimeStamp creationTime; | 
|  | readonly    attribute unsigned long       totalVideoFrames; | 
|  | readonly    attribute unsigned long       droppedVideoFrames; | 
|  | readonly    attribute unsigned long       corruptedVideoFrames; | 
|  | readonly    attribute double              totalFrameDelay; | 
|  | }; | 
|  |  | 
|  | partial interface URL { | 
|  | static DOMString createObjectURL (MediaSource mediaSource); | 
|  | }; | 
|  |  | 
|  | partial interface HTMLVideoElement { | 
|  | VideoPlaybackQuality getVideoPlaybackQuality (); | 
|  | }; | 
|  |  | 
|  | partial interface AudioTrack { | 
|  | attribute DOMString     kind; | 
|  | attribute DOMString     language; | 
|  | readonly    attribute SourceBuffer? sourceBuffer; | 
|  | }; | 
|  |  | 
|  | partial interface VideoTrack { | 
|  | attribute DOMString     kind; | 
|  | attribute DOMString     language; | 
|  | readonly    attribute SourceBuffer? sourceBuffer; | 
|  | }; | 
|  |  | 
|  | partial interface TextTrack { | 
|  | attribute DOMString     kind; | 
|  | attribute DOMString     language; | 
|  | readonly    attribute SourceBuffer? sourceBuffer; | 
|  | }; | 
|  |  | 
|  | enum EndOfStreamError { | 
|  | "network", | 
|  | "decode" | 
|  | }; | 
|  | enum AppendMode { | 
|  | "segments", | 
|  | "sequence" | 
|  | }; | 
|  |  | 
|  | enum ReadyState { | 
|  | "closed", | 
|  | "open", | 
|  | "ended" | 
|  | }; | 
|  |  | 
|  | </script> | 
|  | <script> | 
|  | "use strict"; | 
|  | var mediaSource; | 
|  | var sourceBuffer; | 
|  | var video = document.createElement("video"); | 
|  | var idlCheck = function() { | 
|  | var idlArray = new IdlArray(); | 
|  | [].forEach.call(document.querySelectorAll("script[type=text\\/plain]"), function(node) { | 
|  | if (node.className == "untested") { | 
|  | idlArray.add_untested_idls(node.textContent); | 
|  | } else { | 
|  | idlArray.add_idls(node.textContent); | 
|  | } | 
|  | }); | 
|  | idlArray.add_objects({ | 
|  | MediaSource: ['mediaSource'], | 
|  | SourceBuffer: ['sourceBuffer'], | 
|  | SourceBufferList: ['mediaSource.sourceBuffers'], | 
|  | VideoPlaybackQuality: ['video.getVideoPlaybackQuality()'], | 
|  | }); | 
|  | idlArray.test(); | 
|  | } | 
|  | mediaSource = new MediaSource(); | 
|  | video.src = URL.createObjectURL(mediaSource); | 
|  | mediaSource.addEventListener("sourceopen", function () { | 
|  | var defaultType ='video/webm;codecs="vp8,vorbis"'; | 
|  | if (video.canPlayType(defaultType)) { | 
|  | sourceBuffer = mediaSource.addSourceBuffer(defaultType); | 
|  | } else { | 
|  | sourceBuffer = mediaSource.addSourceBuffer('video/mp4'); | 
|  | } | 
|  | sourceBuffer.addEventListener("updateend", function (e) { | 
|  | mediaSource.endOfStream(); | 
|  | idlCheck(); | 
|  | }); | 
|  | sourceBuffer.appendBuffer(new ArrayBuffer()); | 
|  | }); | 
|  | </script> |