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 }