forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			159 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * Test whether the wakelock state is correct under different situations. However,
 | 
						|
 * the lock state of power manager doesn't equal to the actual platform lock.
 | 
						|
 * Now we don't have any way to detect whether platform lock is set correctly or
 | 
						|
 * not, but we can at least make sure the specific topic's state in power manager
 | 
						|
 * is correct.
 | 
						|
 */
 | 
						|
"use strict";
 | 
						|
 | 
						|
// Import this in order to use `triggerPictureInPicture()`.
 | 
						|
Services.scriptloader.loadSubScript(
 | 
						|
  "chrome://mochitests/content/browser/toolkit/components/pictureinpicture/tests/head.js",
 | 
						|
  this
 | 
						|
);
 | 
						|
 | 
						|
const LOCATION = "https://example.com/browser/toolkit/content/tests/browser/";
 | 
						|
const AUDIO_WAKELOCK_NAME = "audio-playing";
 | 
						|
const VIDEO_WAKELOCK_NAME = "video-playing";
 | 
						|
 | 
						|
add_task(async function testCheckWakelockWhenChangeTabVisibility() {
 | 
						|
  await checkWakelockWhenChangeTabVisibility({
 | 
						|
    description: "playing video",
 | 
						|
    url: "file_video.html",
 | 
						|
    lockAudio: true,
 | 
						|
    lockVideo: true,
 | 
						|
  });
 | 
						|
  await checkWakelockWhenChangeTabVisibility({
 | 
						|
    description: "playing muted video",
 | 
						|
    url: "file_video.html",
 | 
						|
    additionalParams: {
 | 
						|
      muted: true,
 | 
						|
    },
 | 
						|
    lockAudio: false,
 | 
						|
    lockVideo: true,
 | 
						|
  });
 | 
						|
  await checkWakelockWhenChangeTabVisibility({
 | 
						|
    description: "playing volume=0 video",
 | 
						|
    url: "file_video.html",
 | 
						|
    additionalParams: {
 | 
						|
      volume: 0.0,
 | 
						|
    },
 | 
						|
    lockAudio: false,
 | 
						|
    lockVideo: true,
 | 
						|
  });
 | 
						|
  await checkWakelockWhenChangeTabVisibility({
 | 
						|
    description: "playing video without audio in it",
 | 
						|
    url: "file_videoWithoutAudioTrack.html",
 | 
						|
    lockAudio: false,
 | 
						|
    lockVideo: false,
 | 
						|
  });
 | 
						|
  await checkWakelockWhenChangeTabVisibility({
 | 
						|
    description: "playing audio in video element",
 | 
						|
    url: "file_videoWithAudioOnly.html",
 | 
						|
    lockAudio: true,
 | 
						|
    lockVideo: false,
 | 
						|
  });
 | 
						|
  await checkWakelockWhenChangeTabVisibility({
 | 
						|
    description: "playing audio in audio element",
 | 
						|
    url: "file_mediaPlayback2.html",
 | 
						|
    lockAudio: true,
 | 
						|
    lockVideo: false,
 | 
						|
  });
 | 
						|
  await checkWakelockWhenChangeTabVisibility({
 | 
						|
    description: "playing video from media stream with audio and video tracks",
 | 
						|
    url: "browser_mediaStreamPlayback.html",
 | 
						|
    lockAudio: true,
 | 
						|
    lockVideo: true,
 | 
						|
  });
 | 
						|
  await checkWakelockWhenChangeTabVisibility({
 | 
						|
    description: "playing video from media stream without audio track",
 | 
						|
    url: "browser_mediaStreamPlaybackWithoutAudio.html",
 | 
						|
    lockAudio: true,
 | 
						|
    lockVideo: true,
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
/**
 | 
						|
 * Following are helper functions.
 | 
						|
 */
 | 
						|
async function checkWakelockWhenChangeTabVisibility({
 | 
						|
  description,
 | 
						|
  url,
 | 
						|
  additionalParams,
 | 
						|
  lockAudio,
 | 
						|
  lockVideo,
 | 
						|
}) {
 | 
						|
  const originalTab = gBrowser.selectedTab;
 | 
						|
  info(`start a new tab for '${description}'`);
 | 
						|
  const mediaTab = await BrowserTestUtils.openNewForegroundTab(
 | 
						|
    window.gBrowser,
 | 
						|
    LOCATION + url
 | 
						|
  );
 | 
						|
 | 
						|
  info(`wait for media starting playing`);
 | 
						|
  await waitUntilVideoStarted(mediaTab, additionalParams);
 | 
						|
  await waitForExpectedWakeLockState(AUDIO_WAKELOCK_NAME, {
 | 
						|
    needLock: lockAudio,
 | 
						|
    isForegroundLock: true,
 | 
						|
  });
 | 
						|
  await waitForExpectedWakeLockState(VIDEO_WAKELOCK_NAME, {
 | 
						|
    needLock: lockVideo,
 | 
						|
    isForegroundLock: true,
 | 
						|
  });
 | 
						|
 | 
						|
  info(`switch media tab to background`);
 | 
						|
  await BrowserTestUtils.switchTab(window.gBrowser, originalTab);
 | 
						|
  await waitForExpectedWakeLockState(AUDIO_WAKELOCK_NAME, {
 | 
						|
    needLock: lockAudio,
 | 
						|
    isForegroundLock: false,
 | 
						|
  });
 | 
						|
  await waitForExpectedWakeLockState(VIDEO_WAKELOCK_NAME, {
 | 
						|
    needLock: lockVideo,
 | 
						|
    isForegroundLock: false,
 | 
						|
  });
 | 
						|
 | 
						|
  info(`switch media tab to foreground again`);
 | 
						|
  await BrowserTestUtils.switchTab(window.gBrowser, mediaTab);
 | 
						|
  await waitForExpectedWakeLockState(AUDIO_WAKELOCK_NAME, {
 | 
						|
    needLock: lockAudio,
 | 
						|
    isForegroundLock: true,
 | 
						|
  });
 | 
						|
  await waitForExpectedWakeLockState(VIDEO_WAKELOCK_NAME, {
 | 
						|
    needLock: lockVideo,
 | 
						|
    isForegroundLock: true,
 | 
						|
  });
 | 
						|
 | 
						|
  info(`remove tab`);
 | 
						|
  if (mediaTab.PIPWindow) {
 | 
						|
    await BrowserTestUtils.closeWindow(mediaTab.PIPWindow);
 | 
						|
  }
 | 
						|
  BrowserTestUtils.removeTab(mediaTab);
 | 
						|
}
 | 
						|
 | 
						|
async function waitUntilVideoStarted(tab, { muted, volume } = {}) {
 | 
						|
  await SpecialPowers.spawn(
 | 
						|
    tab.linkedBrowser,
 | 
						|
    [muted, volume],
 | 
						|
    async (muted, volume) => {
 | 
						|
      const video = content.document.getElementById("v");
 | 
						|
      if (!video) {
 | 
						|
        ok(false, "can't get media element!");
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      if (muted) {
 | 
						|
        video.muted = muted;
 | 
						|
      }
 | 
						|
      if (volume !== undefined) {
 | 
						|
        video.volume = volume;
 | 
						|
      }
 | 
						|
      ok(
 | 
						|
        await video.play().then(
 | 
						|
          () => true,
 | 
						|
          () => false
 | 
						|
        ),
 | 
						|
        `video started playing.`
 | 
						|
      );
 | 
						|
    }
 | 
						|
  );
 | 
						|
}
 |