{
  "results": [
    {
      "test": "/media-source/mediasource-play.html",
      "status": "ERROR",
      "message": "The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.",
      "subtests": [
        {
          "name": "Test normal playback case with MediaSource API",
          "status": "TIMEOUT",
          "message": "Test timed out"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-redundant-seek.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test redundant fully prebuffered seek",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-appendwindow.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test correctly reset appendWindowStart and appendWindowEnd values",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test set wrong values to appendWindowStart and appendWindowEnd.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test set correct values to appendWindowStart and appendWindowEnd.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test appendwindow throw error when mediasource object is not associated with a sourebuffer.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test set appendWindowStart and appendWindowEnd when source buffer updating.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test appendWindowStart and appendWindowEnd value after a sourceBuffer.abort().",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test read appendWindowStart and appendWindowEnd initial values.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-changetype-play.html",
      "status": "ERROR",
      "message": "The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.",
      "subtests": [
        {
          "name": "Check if browser supports enough test media types",
          "status": "FAIL",
          "message": "assert_true: Browser doesn't support at least 2 types of video test media expected true got false"
        },
        {
          "name": "Test audio-only changeType for audio/mp4; codecs=\"mp4a.40.2\" <-> audio/mp4; codecs=\"mp4a.40.2\"",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Test audio-only changeType for audio/mp4; codecs=\"mp4a.40.2\" <-> audio/mpeg",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Test audio-only changeType for audio/mpeg <-> audio/mp4; codecs=\"mp4a.40.2\"",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Test audio-only changeType for audio/mpeg <-> audio/mpeg",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Test video-only changeType for video/mp4; codecs=\"avc1.4D4001\" <-> video/mp4; codecs=\"avc1.4D4001\"",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-play-then-seek-back.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test playing then seeking back.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-config-change-webm-v-bitrate.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Tests webm video-only bitrate changes.",
          "status": "FAIL",
          "message": "assert_true: video/webm;codecs=\"vp8\" is supported. expected true got false"
        }
      ]
    },
    {
      "test": "/media-source/SourceBuffer-abort-updating.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "SourceBuffer#abort() (video/webm; codecs=\"vorbis,vp8\") : Check the algorithm when the updating attribute is true.",
          "status": "FAIL",
          "message": "assert_unreached: Browser doesn't support the MIME used in this test: video/webm; codecs=\"vorbis,vp8\" Reached unreachable code"
        },
        {
          "name": "SourceBuffer#abort() (video/mp4) : Check the algorithm when the updating attribute is true.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-config-change-mp4-av-audio-bitrate.html",
      "status": "ERROR",
      "message": "The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.",
      "subtests": [
        {
          "name": "Tests mp4 audio bitrate changes in multiplexed content.",
          "status": "TIMEOUT",
          "message": "Test timed out"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-sourcebuffer-mode-timestamps.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "audio/aac : If generate timestamps flag equals true and new mode equals \"segments\", then throw a TypeError exception and abort these steps.",
          "status": "FAIL",
          "message": "assert_throws: SourceBuffer#mode with generate timestamps flag true function \"function () {\n                              sourceBuffer.mode = \"segments\";\n                          }\" threw object \"InvalidAccessError: The object does not support the operation or argument.\" (\"InvalidAccessError\") expected object \"[object Object]\" (\"TypeError\")"
        },
        {
          "name": "audio/mpeg : If generate timestamps flag equals true and new mode equals \"segments\", then throw a TypeError exception and abort these steps.",
          "status": "FAIL",
          "message": "assert_throws: SourceBuffer#mode with generate timestamps flag true function \"function () {\n                              sourceBuffer.mode = \"segments\";\n                          }\" threw object \"InvalidAccessError: The object does not support the operation or argument.\" (\"InvalidAccessError\") expected object \"[object Object]\" (\"TypeError\")"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-buffered.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Demuxed content with different lengths",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Muxed content with different lengths",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Demuxed content with an empty buffered range on one SourceBuffer",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Muxed content empty buffered ranges.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Get buffered range when sourcebuffer is empty.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Get buffered range when only init segment is appended.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Get buffered range after removing sourcebuffer.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-endofstream-invaliderror.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test MediaSource.endOfStream() with invalid non-empty error string.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test MediaSource.endOfStream() with invalid empty error string.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test MediaSource.endOfStream() with invalid null error parameter.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/SourceBuffer-abort.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "SourceBuffer#abort() (video/webm; codecs=\"vorbis,vp8\"): Check the values of appendWindowStart and appendWindowEnd.",
          "status": "FAIL",
          "message": "assert_true: Browser doesn't support the MIME used in this test: video/webm; codecs=\"vorbis,vp8\" expected true got false"
        },
        {
          "name": "SourceBuffer#abort() (video/mp4): Check the values of appendWindowStart and appendWindowEnd.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-multiple-attach.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test exactly one succeeds when two MediaElements attach to same MediaSource",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test that MediaSource can reattach if closed first",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-config-change-webm-av-audio-bitrate.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Tests webm audio bitrate changes in multiplexed content.",
          "status": "FAIL",
          "message": "assert_true: video/webm;codecs=\"vp8,vorbis\" is supported. expected true got false"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-append-buffer.html",
      "status": "TIMEOUT",
      "message": null,
      "subtests": [
        {
          "name": "Test SourceBuffer.appendBuffer() event dispatching.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test SourceBuffer.appendBuffer() call during a pending appendBuffer().",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test SourceBuffer.abort() call during a pending appendBuffer().",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test SourceBuffer.appendBuffer() triggering an 'ended' to 'open' transition.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test zero byte SourceBuffer.appendBuffer() call triggering an 'ended' to 'open' transition.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test MediaSource.removeSourceBuffer() call during a pending appendBuffer().",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test set MediaSource.duration during a pending appendBuffer() for one of its SourceBuffers.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test MediaSource.endOfStream() during a pending appendBuffer() for one of its SourceBuffers.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test set SourceBuffer.timestampOffset during a pending appendBuffer().",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test appending an empty ArrayBufferView.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test appending a neutered ArrayBufferView.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test appending an empty ArrayBuffer.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test appending a neutered ArrayBuffer.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test appendBuffer with partial init segments.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test appendBuffer with partial media segments.",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Test appendBuffer events order.",
          "status": "FAIL",
          "message": "assert_true: expected true got false"
        },
        {
          "name": "Test abort in the middle of an initialization segment.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test abort after removing sourcebuffer.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test abort after readyState is ended following init segment and media segment.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test abort after appendBuffer update ends.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test appending null.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test appending after removeSourceBuffer().",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test slow appending does not trigger stalled events.",
          "status": "FAIL",
          "message": "assert_unreached: Unexpected 'stalled' event. Reached unreachable code"
        }
      ]
    },
    {
      "test": "/media-source/idlharness.any.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "media-source interfaces",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Partial interface URL: original interface defined",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Partial interface URL: valid exposure set",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Partial interface AudioTrack: original interface defined",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Partial interface VideoTrack: original interface defined",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Partial interface TextTrack: original interface defined",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: existence and properties of interface object",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface object length",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface object name",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: existence and properties of interface prototype object",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: existence and properties of interface prototype object's \"constructor\" property",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: existence and properties of interface prototype object's @@unscopables property",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: attribute sourceBuffers",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: attribute activeSourceBuffers",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: attribute readyState",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: attribute duration",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: attribute onsourceopen",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: attribute onsourceended",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: attribute onsourceclose",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: operation addSourceBuffer(DOMString)",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: operation removeSourceBuffer(SourceBuffer)",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: operation endOfStream(EndOfStreamError)",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: operation setLiveSeekableRange(double, double)",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: operation clearLiveSeekableRange()",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: operation isTypeSupported(DOMString)",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource must be primary interface of mediaSource",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Stringification of mediaSource",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: mediaSource must inherit property \"sourceBuffers\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: mediaSource must inherit property \"activeSourceBuffers\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: mediaSource must inherit property \"readyState\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: mediaSource must inherit property \"duration\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: mediaSource must inherit property \"onsourceopen\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: mediaSource must inherit property \"onsourceended\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: mediaSource must inherit property \"onsourceclose\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: mediaSource must inherit property \"addSourceBuffer(DOMString)\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: calling addSourceBuffer(DOMString) on mediaSource with too few arguments must throw TypeError",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: mediaSource must inherit property \"removeSourceBuffer(SourceBuffer)\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: calling removeSourceBuffer(SourceBuffer) on mediaSource with too few arguments must throw TypeError",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: mediaSource must inherit property \"endOfStream(EndOfStreamError)\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: calling endOfStream(EndOfStreamError) on mediaSource with too few arguments must throw TypeError",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: mediaSource must inherit property \"setLiveSeekableRange(double, double)\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: calling setLiveSeekableRange(double, double) on mediaSource with too few arguments must throw TypeError",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: mediaSource must inherit property \"clearLiveSeekableRange()\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: mediaSource must inherit property \"isTypeSupported(DOMString)\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource interface: calling isTypeSupported(DOMString) on mediaSource with too few arguments must throw TypeError",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: existence and properties of interface object",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface object length",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface object name",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: existence and properties of interface prototype object",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: existence and properties of interface prototype object's \"constructor\" property",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: existence and properties of interface prototype object's @@unscopables property",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: attribute mode",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: attribute updating",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: attribute buffered",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: attribute timestampOffset",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: attribute audioTracks",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: attribute videoTracks",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: attribute textTracks",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: attribute appendWindowStart",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: attribute appendWindowEnd",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: attribute onupdatestart",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: attribute onupdate",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: attribute onupdateend",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: attribute onerror",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: attribute onabort",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: operation appendBuffer(BufferSource)",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: operation abort()",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: operation remove(double, unrestricted double)",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer must be primary interface of sourceBuffer",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Stringification of sourceBuffer",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: sourceBuffer must inherit property \"mode\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: sourceBuffer must inherit property \"updating\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: sourceBuffer must inherit property \"buffered\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: sourceBuffer must inherit property \"timestampOffset\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: sourceBuffer must inherit property \"audioTracks\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: sourceBuffer must inherit property \"videoTracks\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: sourceBuffer must inherit property \"textTracks\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: sourceBuffer must inherit property \"appendWindowStart\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: sourceBuffer must inherit property \"appendWindowEnd\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: sourceBuffer must inherit property \"onupdatestart\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: sourceBuffer must inherit property \"onupdate\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: sourceBuffer must inherit property \"onupdateend\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: sourceBuffer must inherit property \"onerror\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: sourceBuffer must inherit property \"onabort\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: sourceBuffer must inherit property \"appendBuffer(BufferSource)\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: calling appendBuffer(BufferSource) on sourceBuffer with too few arguments must throw TypeError",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: sourceBuffer must inherit property \"abort()\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: sourceBuffer must inherit property \"remove(double, unrestricted double)\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer interface: calling remove(double, unrestricted double) on sourceBuffer with too few arguments must throw TypeError",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBufferList interface: existence and properties of interface object",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBufferList interface object length",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBufferList interface object name",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBufferList interface: existence and properties of interface prototype object",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBufferList interface: existence and properties of interface prototype object's \"constructor\" property",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBufferList interface: existence and properties of interface prototype object's @@unscopables property",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBufferList interface: attribute length",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBufferList interface: attribute onaddsourcebuffer",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBufferList interface: attribute onremovesourcebuffer",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBufferList must be primary interface of mediaSource.sourceBuffers",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Stringification of mediaSource.sourceBuffers",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBufferList interface: mediaSource.sourceBuffers must inherit property \"length\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBufferList interface: mediaSource.sourceBuffers must inherit property \"onaddsourcebuffer\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBufferList interface: mediaSource.sourceBuffers must inherit property \"onremovesourcebuffer\" with the proper type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "AudioTrack interface: attribute sourceBuffer",
          "status": "PASS",
          "message": null
        },
        {
          "name": "VideoTrack interface: attribute sourceBuffer",
          "status": "PASS",
          "message": null
        },
        {
          "name": "TextTrack interface: attribute sourceBuffer",
          "status": "PASS",
          "message": null
        },
        {
          "name": "URL interface: operation createObjectURL(MediaSource)",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-trackdefault.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test valid audio kinds: type 'audio', language 'en-US', label 'audio label', multiple kinds, byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid audio kinds: type 'audio', language 'en-US', label 'audio label', kind 'alternative', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid audio kinds: type 'audio', language 'en-US', label 'audio label', kind 'descriptions', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid audio kinds: type 'audio', language 'en-US', label 'audio label', kind 'main', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid audio kinds: type 'audio', language 'en-US', label 'audio label', kind 'main-desc', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid audio kinds: type 'audio', language 'en-US', label 'audio label', kind 'translation', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid audio kinds: type 'audio', language 'en-US', label 'audio label', kind 'commentary', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid audio kinds: type 'audio', language 'en-US', label 'audio label', kind '', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid video kinds: type 'video', language 'en-US', label 'video label', multiple kinds, byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid video kinds: type 'video', language 'en-US', label 'video label', kind 'alternative', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid video kinds: type 'video', language 'en-US', label 'video label', kind 'captions', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid video kinds: type 'video', language 'en-US', label 'video label', kind 'main', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid video kinds: type 'video', language 'en-US', label 'video label', kind 'sign', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid video kinds: type 'video', language 'en-US', label 'video label', kind 'subtitles', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid video kinds: type 'video', language 'en-US', label 'video label', kind 'commentary', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid video kinds: type 'video', language 'en-US', label 'video label', kind '', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid text kinds: type 'text', language 'en-US', label 'text label', multiple kinds, byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid text kinds: type 'text', language 'en-US', label 'text label', kind 'subtitles', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid text kinds: type 'text', language 'en-US', label 'text label', kind 'captions', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid text kinds: type 'text', language 'en-US', label 'text label', kind 'descriptions', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid text kinds: type 'text', language 'en-US', label 'text label', kind 'chapters', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test valid text kinds: type 'text', language 'en-US', label 'text label', kind 'metadata', byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test mixed valid and invalid audio kinds: type 'audio', language 'en-US', label 'audio label', multiple kinds, byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "assert_throws: TrackDefault construction threw an exception function \"function () { new TrackDefault(type, language, label, kinds, byteStreamTrackID); }\" threw object \"ReferenceError: Can't find variable: TrackDefault\" (\"ReferenceError\") expected object \"TypeError\" (\"TypeError\")"
        },
        {
          "name": "Test mixed valid and invalid video kinds: type 'video', language 'en-US', label 'video label', multiple kinds, byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "assert_throws: TrackDefault construction threw an exception function \"function () { new TrackDefault(type, language, label, kinds, byteStreamTrackID); }\" threw object \"ReferenceError: Can't find variable: TrackDefault\" (\"ReferenceError\") expected object \"TypeError\" (\"TypeError\")"
        },
        {
          "name": "Test mixed valid and invalid text kinds: type 'text', language 'en-US', label 'text label', multiple kinds, byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "assert_throws: TrackDefault construction threw an exception function \"function () { new TrackDefault(type, language, label, kinds, byteStreamTrackID); }\" threw object \"ReferenceError: Can't find variable: TrackDefault\" (\"ReferenceError\") expected object \"TypeError\" (\"TypeError\")"
        },
        {
          "name": "Test invalid 'type' parameter type passed to TrackDefault constructor: type 'invalid type', language 'en-US', label 'label', multiple kinds, byteStreamTrackID '1'",
          "status": "FAIL",
          "message": "assert_throws: TrackDefault construction threw an exception function \"function () { new TrackDefault(type, language, label, kinds, byteStreamTrackID); }\" threw object \"ReferenceError: Can't find variable: TrackDefault\" (\"ReferenceError\") expected object \"TypeError\" (\"TypeError\")"
        },
        {
          "name": "Test invalid 'kinds' parameter type passed to TrackDefault constructor",
          "status": "FAIL",
          "message": "assert_throws: TrackDefault construction threw an exception function \"function () { new TrackDefault(type, language, label, kinds, byteStreamTrackID); }\" threw object \"ReferenceError: Can't find variable: TrackDefault\" (\"ReferenceError\") expected object \"TypeError\" (\"TypeError\")"
        },
        {
          "name": "Test updating the retval of TrackDefault.kinds does not modify TrackDefault.kinds",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        }
      ]
    },
    {
      "test": "/media-source/SourceBuffer-abort-readyState.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "SourceBuffer#abort() (video/webm; codecs=\"vorbis,vp8\") : If the readyState attribute of the parent media source is not in the \"open\" state then throw an INVALID_STATE_ERR exception and abort these steps.",
          "status": "FAIL",
          "message": "assert_unreached: Browser doesn't support the MIME used in this test: video/webm; codecs=\"vorbis,vp8\" Reached unreachable code"
        },
        {
          "name": "SourceBuffer#abort() (video/mp4) : If the readyState attribute of the parent media source is not in the \"open\" state then throw an INVALID_STATE_ERR exception and abort these steps.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-addsourcebuffer.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test addSourceBuffer() in 'ended' state.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test addSourceBuffer() with empty type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test addSourceBuffer() with null",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test addSourceBuffer() with unsupported type",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test addSourceBuffer() with Vorbis and VP8",
          "status": "FAIL",
          "message": "assert_true: video/webm;codecs=\"vp8,vorbis\" is supported expected true got false"
        },
        {
          "name": "Test addSourceBuffer() with Vorbis and VP8 in separate SourceBuffers",
          "status": "FAIL",
          "message": "assert_true: video/webm;codecs=\"vp8\" is supported expected true got false"
        },
        {
          "name": "Test addSourceBuffer() video only",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test addSourceBuffer() audio only",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test addSourceBuffer() with AAC and H.264",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test addSourceBuffer() with AAC and H.264 in separate SourceBuffers",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-sourcebufferlist.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test SourceBufferList getter method",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test SourceBufferList event dispatching.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test that only 1 removesourcebuffer event fires on each SourceBufferList when the MediaSource closes.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-config-change-mp4-av-framesize.html",
      "status": "ERROR",
      "message": "The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.",
      "subtests": [
        {
          "name": "Tests mp4 frame size changes in multiplexed content.",
          "status": "TIMEOUT",
          "message": "Test timed out"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-sequencemode-append-buffer.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test sequence AppendMode appendBuffer(first media segment)",
          "status": "FAIL",
          "message": "assert_equals: sourceBuffer.buffered range begins where expected before EOS expected 0.095 but got 0"
        },
        {
          "name": "Test sequence AppendMode appendBuffer(second media segment)",
          "status": "FAIL",
          "message": "assert_equals: expectedTimestampOffset expected -0.882 but got 0"
        },
        {
          "name": "Test sequence AppendMode appendBuffer(second media segment, then first media segment)",
          "status": "FAIL",
          "message": "assert_equals: expectedTimestampOffset expected 0.814 but got 1.672"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-appendbuffer-quota-exceeded.html",
      "status": "TIMEOUT",
      "message": null,
      "subtests": [
        {
          "name": "Appending data repeatedly should fill up the buffer and throw a QuotaExceededError when buffer is full.",
          "status": "TIMEOUT",
          "message": "Test timed out"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-config-change-webm-av-framesize.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Tests webm frame size changes in multiplexed content.",
          "status": "FAIL",
          "message": "assert_true: video/webm;codecs=\"vp8,vorbis\" is supported. expected true got false"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-detach.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test media.load() before appending data will trigger MediaSource detaching from a media element.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test media.load() after appending data will trigger MediaSource detaching from a media element.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-preload.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "sourceopen occurs with element preload=auto",
          "status": "PASS",
          "message": null
        },
        {
          "name": "sourceopen occurs with element preload=metadata",
          "status": "PASS",
          "message": null
        },
        {
          "name": "sourceopen occurs with element preload=none",
          "status": "PASS",
          "message": null
        },
        {
          "name": "error occurs with bogus blob URL (revoked MediaSource object URL) and element preload=auto",
          "status": "PASS",
          "message": null
        },
        {
          "name": "error occurs with bogus blob URL (revoked MediaSource object URL) and element preload=metadata",
          "status": "PASS",
          "message": null
        },
        {
          "name": "error occurs with bogus blob URL (corrupted MediaSource object URL) and element preload=auto",
          "status": "PASS",
          "message": null
        },
        {
          "name": "error occurs with bogus blob URL (corrupted MediaSource object URL) and element preload=metadata",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-avtracks.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Check that media tracks and their properties are populated properly",
          "status": "FAIL",
          "message": "assert_equals: videoTrack.language expected \"eng\" but got \"\""
        },
        {
          "name": "Media tracks must be removed when the SourceBuffer is removed from the MediaSource",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Media tracks must be removed when the HTMLMediaElement.src is changed",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Media tracks must be removed when HTMLMediaElement.load() is called",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-addsourcebuffer-mode.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "addSourceBuffer() sets SourceBuffer.mode to 'segments' when the generate timestamps flag is false",
          "status": "PASS",
          "message": null
        },
        {
          "name": "addSourceBuffer() sets SourceBuffer.mode to 'sequence' when the generate timestamps flag is true",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/URL-createObjectURL-revoke.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Check revoking behavior of URL.revokeObjectURL(url).",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Check referenced MediaSource can open after URL.revokeObjectURL(url).",
          "status": "FAIL",
          "message": "assert_unreached: Unexpected error. Reached unreachable code"
        },
        {
          "name": "Check auto-revoking behavior with URL.createObjectURL(MediaSource).",
          "status": "FAIL",
          "message": "assert_unreached: url should not reference MediaSource. Reached unreachable code"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-timestamp-offset.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test setting SourceBuffer.timestampOffset to a positive number.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting SourceBuffer.timestampOffset to a negative number.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting SourceBuffer.timestampOffset to zero.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting SourceBuffer.timestampOffset to positive infinity.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting SourceBuffer.timestampOffset to negative infinity.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting SourceBuffer.timestampOffset to NaN.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting SourceBuffer.timestampOffset to undefined.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting SourceBuffer.timestampOffset to null.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting SourceBuffer.timestampOffset to false.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting SourceBuffer.timestampOffset to true.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting SourceBuffer.timestampOffset to a number string.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting SourceBuffer.timestampOffset to an empty string.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting timestampOffset in 'ended' state causes a transition to 'open'.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test getting the initial value of timestampOffset.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting timestampoffset after removing the sourcebuffer.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-config-change-mp4-v-framesize.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Tests mp4 video-only frame size changes.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-config-change-webm-v-framerate.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Tests webm video-only frame rate changes.",
          "status": "FAIL",
          "message": "assert_true: video/webm;codecs=\"vp8\" is supported. expected true got false"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-changetype.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test changeType with an empty type.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test changeType after SourceBuffer removed from mediaSource.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test changeType while update pending.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test changeType with null type.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test changeType with unsupported type.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test changeType transitioning readyState from 'ended' to 'open'.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test changeType sets mode to sequence for change to type that generates timestamps",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test changeType retains previous mode when changing to type that doesn't generate timestamps",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-closed.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test attribute values on a closed MediaSource object.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test addSourceBuffer() while closed.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test removeSourceBuffer() while closed.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test endOfStream() while closed.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test endOfStream(decode) while closed.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test endOfStream(network) while closed.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting duration while closed.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting duration while open->closed.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test getting duration while open->closed.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test sourcebuffer.abort when closed.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-activesourcebuffers.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "SourceBuffer added to activeSourceBuffers list when its only audio track gets loaded (and thus becomes enabled).",
          "status": "PASS",
          "message": null
        },
        {
          "name": "SourceBuffer added to activeSourceBuffers list when its only video track gets loaded (and thus becomes selected).",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Active SourceBuffers must appear in the same order as they appear in the sourceBuffers attribute: audio is first sourceBuffer, audio media appended first",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Active SourceBuffers must appear in the same order as they appear in the sourceBuffers attribute: audio is first sourceBuffer, video media appended first",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Active SourceBuffers must appear in the same order as they appear in the sourceBuffers attribute: video is first sourceBuffer, audio media appended first",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Active SourceBuffers must appear in the same order as they appear in the sourceBuffers attribute: video is first sourceBuffer, video media appended first",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Active SourceBuffers list reflects changes to selected audio/video tracks associated with separate SourceBuffers.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Active SourceBuffers list ignores changes to selected audio/video tracks that do not affect the activation of the SourceBuffer.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-sourcebuffer-trackdefaults.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test round-trip of empty SourceBuffer.trackDefaults",
          "status": "FAIL",
          "message": "assert_array_equals: Empty initial SourceBuffer.trackDefaults value is undefined, expected array"
        },
        {
          "name": "Test round-trip of non-empty SourceBuffer.trackDefaults",
          "status": "FAIL",
          "message": "assert_array_equals: Empty initial SourceBuffer.trackDefaults value is undefined, expected array"
        },
        {
          "name": "Test setting trackDefaults on an already-removed SourceBuffer",
          "status": "FAIL",
          "message": "assert_array_equals: Empty initial SourceBuffer.trackDefaults value is undefined, expected array"
        },
        {
          "name": "Test setting trackDefaults on a SourceBuffer that is updating",
          "status": "FAIL",
          "message": "assert_array_equals: Empty initial SourceBuffer.trackDefaults value is undefined, expected array"
        },
        {
          "name": "Test setting null SourceBuffer.trackDefaults",
          "status": "FAIL",
          "message": "assert_array_equals: Empty initial SourceBuffer.trackDefaults value is undefined, expected array"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-seek-during-pending-seek.html",
      "status": "ERROR",
      "message": "The operation was aborted.",
      "subtests": [
        {
          "name": "Test seeking to a new location before transitioning beyond HAVE_METADATA.",
          "status": "FAIL",
          "message": "assert_true: expected true got false"
        },
        {
          "name": "Test seeking to a new location during a pending seek.",
          "status": "FAIL",
          "message": "assert_true: expected true got false"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-config-change-webm-v-framesize.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Tests webm video-only frame size changes.",
          "status": "FAIL",
          "message": "assert_true: video/webm;codecs=\"vp8\" is supported. expected true got false"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-config-change-webm-av-video-bitrate.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Tests webm video bitrate changes in multiplexed content.",
          "status": "FAIL",
          "message": "assert_true: video/webm;codecs=\"vp8,vorbis\" is supported. expected true got false"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-config-change-mp4-v-framerate.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Tests mp4 video-only frame rate changes.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/URL-createObjectURL.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "URL.createObjectURL(mediaSource) should return a unique Blob URI.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/SourceBuffer-abort-removed.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "SourceBuffer#abort (video/webm; codecs=\"vorbis,vp8\") : if this object has been removed from the sourceBuffers attribute of the parent media source, then throw an INVALID_STATE_ERR exception and abort these steps.",
          "status": "FAIL",
          "message": "assert_unreached: Browser doesn't support the MIME used in this test: video/webm; codecs=\"vorbis,vp8\" Reached unreachable code"
        },
        {
          "name": "SourceBuffer#abort (video/mp4) : if this object has been removed from the sourceBuffers attribute of the parent media source, then throw an INVALID_STATE_ERR exception and abort these steps.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-seekable.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Get seekable time ranges when the sourcebuffer is empty.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Get seekable time ranges after init segment received.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Get seekable time ranges on an infinite stream.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-attach-stops-delaying-load-event.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "MediaSource attachment should immediately stop delaying the load event",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-config-change-mp4-av-video-bitrate.html",
      "status": "ERROR",
      "message": "The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.",
      "subtests": [
        {
          "name": "Tests mp4 video bitrate changes in multiplexed content.",
          "status": "TIMEOUT",
          "message": "Test timed out"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-endofstream.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "MediaSource.endOfStream(): duration truncated to 0 when there are no buffered coded frames",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource.endOfStream(): media element notified that it now has all of the media data",
          "status": "PASS",
          "message": null
        },
        {
          "name": "MediaSource.endOfStream(): duration and buffered range end time before and after endOfStream",
          "status": "FAIL",
          "message": "assert_equals: SegmentInfo duration should still roughly match mediaSource duration expected 6.548 but got 6.549"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-liveseekable.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "setLiveSeekableRange throws an InvalidStateError exception if the readyState attribute is not 'open'",
          "status": "PASS",
          "message": null
        },
        {
          "name": "clearLiveSeekableRange throws an InvalidStateError exception if the readyState attribute is not 'open'",
          "status": "PASS",
          "message": null
        },
        {
          "name": "setLiveSeekableRange does not restrict to not currently updating",
          "status": "PASS",
          "message": null
        },
        {
          "name": "clearLiveSeekableRange does not restrict to not currently updating",
          "status": "PASS",
          "message": null
        },
        {
          "name": "setLiveSeekableRange throws a TypeError if start is negative",
          "status": "PASS",
          "message": null
        },
        {
          "name": "setLiveSeekableRange throws a TypeError if start is greater than end",
          "status": "PASS",
          "message": null
        },
        {
          "name": "setLiveSeekableRange returns with no error when conditions are correct",
          "status": "PASS",
          "message": null
        },
        {
          "name": "clearLiveSeekableRange returns with no error when conditions are correct",
          "status": "PASS",
          "message": null
        },
        {
          "name": "HTMLMediaElement.seekable returns the live seekable range or an empty range if that range was cleared when nothing is buffered",
          "status": "PASS",
          "message": null
        },
        {
          "name": "HTMLMediaElement.seekable returns the union of the buffered range and the live seekable range, when set",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-is-type-supported.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test invalid MIME format \"video\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid MIME format \"video/\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid MIME format \"video/webm\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid MIME format \"video/webm;\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid MIME format \"video/webm;codecs\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid MIME format \"video/webm;codecs=\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid MIME format \"video/webm;codecs=\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid MIME format \"video/webm;codecs=\"\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid MIME format \"video/webm;codecs=\",\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid MIME format \"unsupported_mediatype\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid MIME format \"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid MIME format \"null\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid MSE MIME media type \"xxx\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid MSE MIME media type \"text/html\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid MSE MIME media type \"image/jpeg\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid mismatch between MIME type and codec ID \"audio/webm;codecs=\"vp8\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid mismatch between MIME type and codec ID \"audio/mp4;codecs=\"avc1.4d001e\"\"",
          "status": "FAIL",
          "message": "assert_equals: supported expected false but got true"
        },
        {
          "name": "Test invalid mismatch between MIME type and codec ID \"audio/mp4;codecs=\"vorbis\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid mismatch between MIME type and codec ID \"audio/webm;codecs=\"mp4a.40.2\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid mismatch between MIME type and codec ID \"video/mp4;codecs=\"vp8\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid mismatch between MIME type and codec ID \"video/mp4;codecs=\"vorbis\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid mismatch between MIME type and codec ID \"video/webm;codecs=\"mp4a.40.2\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid codec ID \"audio/mp4;codecs=\"mp4a\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test invalid codec ID \"audio/mp4;codecs=\"mp4a.40\"\"",
          "status": "FAIL",
          "message": "assert_equals: supported expected false but got true"
        },
        {
          "name": "Test invalid codec ID \"audio/mp4;codecs=\"mp4a.40.\"\"",
          "status": "FAIL",
          "message": "assert_equals: supported expected false but got true"
        },
        {
          "name": "Test invalid codec ID \"audio/mp4;codecs=\"mp4a.67.3\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test valid WebM type \"video/webm;codecs=\"vp8\"\"",
          "status": "FAIL",
          "message": "assert_equals: supported expected true but got false"
        },
        {
          "name": "Test valid WebM type \"video/webm;codecs=\"vorbis\"\"",
          "status": "FAIL",
          "message": "assert_equals: supported expected true but got false"
        },
        {
          "name": "Test valid WebM type \"video/webm;codecs=\"vp8,vorbis\"\"",
          "status": "FAIL",
          "message": "assert_equals: supported expected true but got false"
        },
        {
          "name": "Test valid WebM type \"video/webm;codecs=\"vorbis, vp8\"\"",
          "status": "FAIL",
          "message": "assert_equals: supported expected true but got false"
        },
        {
          "name": "Test valid WebM type \"audio/webm;codecs=\"vorbis\"\"",
          "status": "FAIL",
          "message": "assert_equals: supported expected true but got false"
        },
        {
          "name": "Test valid WebM type \"AUDIO/WEBM;CODECS=\"vorbis\"\"",
          "status": "FAIL",
          "message": "assert_equals: supported expected true but got false"
        },
        {
          "name": "Test valid MP4 type \"video/mp4;codecs=\"avc1.4d001e\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test valid MP4 type \"video/mp4;codecs=\"avc1.42001e\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test valid MP4 type \"audio/mp4;codecs=\"mp4a.40.2\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test valid MP4 type \"audio/mp4;codecs=\"mp4a.40.5\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test valid MP4 type \"audio/mp4;codecs=\"mp4a.67\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test valid MP4 type \"video/mp4;codecs=\"mp4a.40.2\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test valid MP4 type \"video/mp4;codecs=\"avc1.4d001e,mp4a.40.2\"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test valid MP4 type \"video/mp4;codecs=\"mp4a.40.2 , avc1.4d001e \"\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test valid MP4 type \"video/mp4;codecs=\"avc1.4d001e,mp4a.40.5\"\"",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-config-change-mp4-v-bitrate.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Tests mp4 video-only bitrate changes.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-getvideoplaybackquality.html",
      "status": "ERROR",
      "message": "The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.",
      "subtests": [
        {
          "name": "Test HTMLVideoElement.getVideoPlaybackQuality() with MediaSource API",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Test the totalFrameDelay attribute of HTMLVideoElement.getVideoPlaybackQuality() with MediaSource API",
          "status": "TIMEOUT",
          "message": "Test timed out"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-seek-beyond-duration.html",
      "status": "ERROR",
      "message": "The operation was aborted.",
      "subtests": [
        {
          "name": "Test seeking beyond updated media duration.",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Test seeking beyond media duration.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-errors.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Appending media segment before the first initialization segment.",
          "status": "FAIL",
          "message": "assert_equals: Event types match. expected \"error\" but got \"updateend\""
        },
        {
          "name": "Signaling 'decode' error via endOfStream() before initialization segment has been appended.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Signaling 'network' error via endOfStream() before initialization segment has been appended.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Signaling 'decode' error via endOfStream() after initialization segment has been appended and the HTMLMediaElement has reached HAVE_METADATA.",
          "status": "FAIL",
          "message": "assert_equals: expected \"ended\" but got \"closed\""
        },
        {
          "name": "Signaling 'network' error via endOfStream() after initialization segment has been appended and the HTMLMediaElement has reached HAVE_METADATA.",
          "status": "FAIL",
          "message": "assert_equals: expected \"ended\" but got \"closed\""
        },
        {
          "name": "Signaling 'decode' error via segment parser loop algorithm after initialization segment has been appended.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Signaling 'decode' error via segment parser loop algorithm.",
          "status": "FAIL",
          "message": "assert_unreached: 'loadedmetadata' should not be fired on mediaElement Reached unreachable code"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-duration-boundaryconditions.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Set duration to 2^31 - 1",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Set duration to 1",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Set duration to Number.MAX_VALUE",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Set duration to Number.MIN_VALUE",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Set duration to Number.MAX_VALUE - 1",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Set duration to Number.MIN_VALUE - 1",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Set duration to Number.POSITIVE_INFINITY",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Set duration to Number.NEGATIVE_INFINITY",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Set duration to lowest value.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Set duration to a negative double.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Set duration to a positive double.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Set duration to zero",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Set duration to NaN",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/URL-createObjectURL-null.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "URL.createObjectURL(null)",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-sourcebuffer-mode.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test initial value of SourceBuffer.mode is \"segments\"",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting SourceBuffer.mode",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting a removed SourceBuffer's mode",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting SourceBuffer.mode while still updating",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting SourceBuffer.mode triggers parent MediaSource 'ended' to 'open' transition.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test setting SourceBuffer.mode and SourceBuffer.timestampOffset while parsing media segment.",
          "status": "FAIL",
          "message": "assert_throws: Setting valid sourceBuffer.mode while still parsing media segment threw InvalidStateError. function \"function () { sourceBuffer.mode = 'segments'; }\" did not throw"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-config-change-mp4-a-bitrate.html",
      "status": "ERROR",
      "message": "The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.",
      "subtests": [
        {
          "name": "Tests mp4 audio-only bitrate changes.",
          "status": "TIMEOUT",
          "message": "Test timed out"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-config-change-webm-a-bitrate.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Tests webm audio-only bitrate changes.",
          "status": "FAIL",
          "message": "assert_true: audio/webm;codecs=\"vorbis\" is supported. expected true got false"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-trackdefaultlist.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test track default list construction, length, and indexed property getter",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefault"
        },
        {
          "name": "Test empty track default list construction with and without optional trackDefaults parameter",
          "status": "FAIL",
          "message": "Can't find variable: TrackDefaultList"
        }
      ]
    },
    {
      "test": "/media-source/mediasource-remove.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test remove with an negative start.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test remove with non-finite start.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test remove with a start beyond the duration.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test remove with a start larger than the end.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test remove with a NEGATIVE_INFINITY end.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test remove with a NaN end.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test remove after SourceBuffer removed from mediaSource.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test remove with a NaN duration.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test remove while update pending.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test aborting a remove operation.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test remove with a start at the duration.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test remove transitioning readyState from 'ended' to 'open'.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test removing all appended data.",
          "status": "FAIL",
          "message": "assert_equals: Initial buffered range. expected \"{ [0.095, 6.548) }\" but got \"{ [0.000, 6.548) }\""
        },
        {
          "name": "Test removing beginning of appended data.",
          "status": "FAIL",
          "message": "assert_equals: Initial buffered range. expected \"{ [0.095, 6.548) }\" but got \"{ [0.000, 6.548) }\""
        },
        {
          "name": "Test removing the middle of appended data.",
          "status": "FAIL",
          "message": "assert_equals: Initial buffered range. expected \"{ [0.095, 6.548) }\" but got \"{ [0.000, 6.548) }\""
        },
        {
          "name": "Test removing the end of appended data.",
          "status": "FAIL",
          "message": "assert_equals: Initial buffered range. expected \"{ [0.095, 6.548) }\" but got \"{ [0.000, 6.548) }\""
        }
      ]
    },
    {
      "test": "/media-source/mediasource-removesourcebuffer.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test addSourceBuffer(), removeSourceBuffer(), addSourceBuffer() sequence.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test removeSourceBuffer() with null",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test calling removeSourceBuffer() twice with the same object.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test calling removeSourceBuffer() for a sourceBuffer belonging to a different mediaSource instance.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test calling removeSourceBuffer() in ended state.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test removesourcebuffer event on activeSourceBuffers.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test abort event when removeSourceBuffer() called while SourceBuffer is updating",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/media-source/mediasource-duration.html",
      "status": "TIMEOUT",
      "message": null,
      "subtests": [
        {
          "name": "Test seek starts on duration truncation below currentTime",
          "status": "FAIL",
          "message": "The object is in an invalid state."
        },
        {
          "name": "Test appendBuffer completes previous seek to truncated duration",
          "status": "FAIL",
          "message": "The object is in an invalid state."
        },
        {
          "name": "Test endOfStream completes previous seek to truncated duration",
          "status": "FAIL",
          "message": "The object is in an invalid state."
        },
        {
          "name": "Test setting same duration multiple times does not fire duplicate durationchange",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Test setting the duration to less than the highest starting presentation timestamp will throw",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Truncating the duration throws an InvalidStateError exception when new duration is less than the highest buffered range start time of one of the track buffers",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Truncating the duration throws an InvalidStateError exception when new duration is less than a buffered coded frame presentation time",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Increasing the duration does not trigger any SourceBuffer update",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Increasing the duration during media playback does not trigger any SourceBuffer update",
          "status": "PASS",
          "message": null
        }
      ]
    }
  ]
}