tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

browser_glean_media_error.js (3408B)


      1 "use strict";
      2 
      3 /**
      4 * This test is used to ensure that Glean probe 'media::error' and
      5 * 'mediaPlayback::decodeError` can be recorded correctly.
      6 */
      7 
      8 const testCases = [
      9  // Will fail on reading metadata
     10  {
     11    fileName: "bogus.wav",
     12    mediaError: {
     13      error_type: "SrcNotSupportedErr",
     14    },
     15  },
     16  {
     17    fileName: "404.webm",
     18    mediaError: {
     19      error_type: "SrcNotSupportedErr",
     20    },
     21  },
     22  // Failed with the key system
     23  {
     24    fileName: "404.mp4",
     25    mediaError: {
     26      error_type: "SrcNotSupportedErr",
     27      key_system: "org.w3.clearkey",
     28      error_name: "NS_ERROR_DOM_MEDIA_NOT_SUPPORTED_ERR",
     29    },
     30  },
     31  // Failed during decoding
     32  {
     33    fileName: "decode_error_vp9.webm",
     34    mediaError: {
     35      error_type: "DecodeErr",
     36      error_name: "NS_ERROR_DOM_MEDIA_DECODE_ERR",
     37    },
     38    decodeError: {
     39      mime_type: "video/vp9",
     40      error_name: "NS_ERROR_DOM_MEDIA_DECODE_ERR",
     41    },
     42  },
     43 ];
     44 
     45 add_task(async function testGleanMediaErrorProbe() {
     46  const tab = await openTab();
     47  for (let test of testCases) {
     48    // always reset FOG to clean up all previous probes
     49    Services.fog.testResetFOG();
     50 
     51    info(`running test for '${test.fileName}'`);
     52    await PlayMediaAndWaitForError(tab, test);
     53 
     54    info(`waiting until glean probe is ready on the parent process`);
     55    await Services.fog.testFlushAllChildren();
     56 
     57    info(`checking the collected results for '${test.fileName}'`);
     58    await CheckMediaErrorProbe(test.mediaError);
     59    if (test.decodeError !== undefined) {
     60      await CheckDecodeErrorProbe(test.decodeError);
     61    }
     62  }
     63  BrowserTestUtils.removeTab(tab);
     64 });
     65 
     66 // Following are helper functions
     67 async function PlayMediaAndWaitForError(tab, testInfo) {
     68  await SpecialPowers.spawn(tab.linkedBrowser, [testInfo], async testInfo => {
     69    const video = content.document.createElement("video");
     70    if (testInfo.mediaError.key_system) {
     71      let keySystemAccess = await content.navigator.requestMediaKeySystemAccess(
     72        testInfo.mediaError.key_system,
     73        [{ "": [{ "": "" }] }]
     74      );
     75      let mediaKeys = await keySystemAccess.createMediaKeys();
     76      await video.setMediaKeys(mediaKeys);
     77    }
     78    video.src = testInfo.fileName;
     79    video.play();
     80    info(`waiting for an error`);
     81    ok(
     82      await new Promise(r => (video.onerror = r)).then(
     83        _ => true,
     84        _ => false
     85      ),
     86      "Got a media error"
     87    );
     88  });
     89 }
     90 
     91 async function CheckMediaErrorProbe(expected) {
     92  const extra = await Glean.media.error.testGetValue()[0].extra;
     93  is(
     94    extra.error_type,
     95    expected.error_type,
     96    `'${extra.error_type}' is equal to expected '${expected.error_type}'`
     97  );
     98  if (expected.error_name !== undefined) {
     99    is(
    100      extra.error_name,
    101      expected.error_name,
    102      `'${extra.error_name}' is equal to expected '${expected.error_name}'`
    103    );
    104  }
    105  if (expected.key_system !== undefined) {
    106    is(
    107      extra.key_system,
    108      expected.key_system,
    109      `'${extra.key_system}' is equal to expected '${expected.key_system}'`
    110    );
    111  }
    112 }
    113 
    114 async function CheckDecodeErrorProbe(expected) {
    115  const extra = await Glean.mediaPlayback.decodeError.testGetValue()[0].extra;
    116  is(
    117    extra.mime_type,
    118    expected.mime_type,
    119    `'${extra.mime_type}' is equal to expected '${expected.mime_type}'`
    120  );
    121  is(
    122    extra.error_name,
    123    expected.error_name,
    124    `'${extra.error_name}' is equal to expected '${expected.error_name}'`
    125  );
    126 }