browser_nosrc_and_error_media.js (3291B)
1 // Import this in order to use `triggerPictureInPicture()`. 2 Services.scriptloader.loadSubScript( 3 "chrome://mochitests/content/browser/toolkit/components/pictureinpicture/tests/head.js", 4 this 5 ); 6 7 const PAGE_NOSRC_MEDIA = 8 "https://example.com/browser/dom/media/mediacontrol/tests/browser/file_no_src_media.html"; 9 const PAGE_ERROR_MEDIA = 10 "https://example.com/browser/dom/media/mediacontrol/tests/browser/file_error_media.html"; 11 const PAGES = [PAGE_NOSRC_MEDIA, PAGE_ERROR_MEDIA]; 12 const testVideoId = "video"; 13 14 add_task(async function setupTestingPref() { 15 await SpecialPowers.pushPrefEnv({ 16 set: [["media.mediacontrol.testingevents.enabled", true]], 17 }); 18 }); 19 20 /** 21 * To ensure the no src media and media with error won't activate the media 22 * controller even if they enters PIP mode or fullscreen. 23 */ 24 add_task(async function testNoSrcOrErrorMediaEntersPIPMode() { 25 for (let page of PAGES) { 26 info(`open media page ${page}`); 27 const tab = await createLoadedTabWrapper(page, { needCheck: false }); 28 29 info(`controller should always inactive`); 30 const controller = tab.linkedBrowser.browsingContext.mediaController; 31 controller.onactivated = () => { 32 ok(false, "should not get activated!"); 33 }; 34 35 info(`enter PIP mode which would not affect controller`); 36 const winPIP = await triggerPictureInPicture( 37 tab.linkedBrowser, 38 testVideoId 39 ); 40 info(`leave PIP mode`); 41 await ensureMessageAndClosePiP( 42 tab.linkedBrowser, 43 testVideoId, 44 winPIP, 45 false 46 ); 47 ok(!controller.isActive, "controller is still inactive"); 48 49 info(`remove tab`); 50 await tab.close(); 51 } 52 }); 53 54 add_task(async function testNoSrcOrErrorMediaEntersFullscreen() { 55 for (let page of PAGES) { 56 info(`open media page ${page}`); 57 const tab = await createLoadedTabWrapper(page, { needCheck: false }); 58 59 info(`controller should always inactive`); 60 const controller = tab.linkedBrowser.browsingContext.mediaController; 61 controller.onactivated = () => { 62 ok(false, "should not get activated!"); 63 }; 64 65 info(`enter and leave fullscreen which would not affect controller`); 66 await enterAndLeaveFullScreen(tab, testVideoId); 67 ok(!controller.isActive, "controller is still inactive"); 68 69 info(`remove tab`); 70 await tab.close(); 71 } 72 }); 73 74 /** 75 * The following is helper function. 76 */ 77 async function enterAndLeaveFullScreen(tab, elementId) { 78 await new Promise(resolve => 79 SimpleTest.waitForFocus(resolve, tab.linkedBrowser.ownerGlobal) 80 ); 81 await SpecialPowers.spawn(tab.linkedBrowser, [elementId], elementId => { 82 return new Promise(r => { 83 const element = content.document.getElementById(elementId); 84 ok(!content.document.fullscreenElement, "no fullscreen element"); 85 element.requestFullscreen(); 86 element.onfullscreenchange = () => { 87 if (content.document.fullscreenElement) { 88 element.onfullscreenerror = null; 89 content.document.exitFullscreen(); 90 } else { 91 element.onfullscreenchange = null; 92 element.onfullscreenerror = null; 93 r(); 94 } 95 }; 96 element.onfullscreenerror = () => { 97 // Retry until the element successfully enters fullscreen. 98 element.requestFullscreen(); 99 }; 100 }); 101 }); 102 }