Commit 80b72917 authored by Karl Tomlinson's avatar Karl Tomlinson Committed by Pier Angelo Vendrame
Browse files

Bug 2022746 move reftest-wait to html element r=media-playback-reviewers,padenot

The test did crash without this, but is more thorough with a functional
reftest-wait and saves the same bug being copied to other tests.

Also remove the play() and the await for its Promise.
With https://github.com/mozilla/nestegg/pull/77,
the demux error is detected before "canplay".
The test still crashes in builds without the code fixes.

Differential Revision: https://phabricator.services.mozilla.com/D288803
parent 894a3183
Loading
Loading
Loading
Loading
+95 −0
Original line number Diff line number Diff line
<!doctype html>
<html lang="en" class="reftest-wait">
<head>
  <meta charset="utf-8">
  <title>Firefox WebM Alpha BlockAdditional</title>
</head>
<body>
  <h1>Firefox WebM Alpha BlockAdditional</h1>
  <p>
    This embeds a valid alpha WebM, rewrites the first
    <code>BlockMore</code> entry, creates a malformed <code>video/webm</code>
    Blob in JavaScript, and feeds it to a normal <code>&lt;video&gt;</code>
    element.
  </p>
  <a id="download" download="alpha-blockadditional-poc.webm">download malformed webm</a>
  <pre id="log"></pre>
  <video id="player" controls muted></video>
  <script>
    const SAMPLE_BASE64 =
      "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";
    const FIRST_BLOCK_MORE = 0x272;
    const EXPECTED_BYTES = [
      0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xee, 0x81, 0x01,
      0xa5, 0xb4
    ];
    const PATCH_BYTES = [
      0xa6, 0x86, 0xa5, 0x08, 0x10, 0x00, 0x00, 0x00, 0xec, 0xb8
    ];

    const logNode = document.getElementById("log");
    const player = document.getElementById("player");
    const download = document.getElementById("download");

    function log(message) {
      logNode.textContent += `${message}\n`;
    }

    function decodeBase64(base64) {
      const binary = atob(base64);
      const bytes = new Uint8Array(binary.length);
      for (let i = 0; i < binary.length; i++) {
        bytes[i] = binary.charCodeAt(i);
      }
      return bytes;
    }

    function expectBytes(bytes, offset, expected) {
      for (let i = 0; i < expected.length; i++) {
        if (bytes[offset + i] !== expected[i]) {
          const got = Array.from(bytes.slice(offset, offset + expected.length))
            .map((value) => value.toString(16).padStart(2, "0"))
            .join(" ");
          throw new Error(`unexpected bytes at 0x${offset.toString(16)}: ${got}`);
        }
      }
    }

    function buildMalformedBlob() {
      const bytes = decodeBase64(SAMPLE_BASE64);
      log(`decoded sample: ${bytes.length} bytes`);
      expectBytes(bytes, FIRST_BLOCK_MORE, EXPECTED_BYTES);

      bytes.set(PATCH_BYTES, FIRST_BLOCK_MORE);
      log("patched first BlockMore");
      log("  offset: 0x272");
      log("  bytes: a6 86 a5 08 10 00 00 00 ec b8");
      log("  result: BlockMore(size=6), BlockAdditional(size=0x10000000)");

      return new Blob([bytes], { type: "video/webm" });
    }

    async function run() {
      logNode.textContent = "";
      if (player.src) {
        URL.revokeObjectURL(player.src);
        player.removeAttribute("src");
        player.load();
      }

      const blob = buildMalformedBlob();
      const url = URL.createObjectURL(blob);
      download.href = url;
      player.src = url;
      log(`blob size: ${blob.size} bytes`);
      log("assigned malformed Blob URL to <video>");

      await new Promise(r => player.onerror = r);
      log("got error");
      document.documentElement.removeAttribute("class");
    }

    run();
  </script>
</body>
</html>