summaryrefslogtreecommitdiffstats
path: root/dom/media/test/browser
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/test/browser')
-rw-r--r--dom/media/test/browser/browser.toml4
-rw-r--r--dom/media/test/browser/browser_encrypted_play_time_telemetry.js70
-rw-r--r--dom/media/test/browser/browser_glean_first_frame_loaded_time.js81
-rw-r--r--dom/media/test/browser/browser_tab_visibility_and_play_time.js2
-rw-r--r--dom/media/test/browser/head.js119
-rw-r--r--dom/media/test/browser/wmfme/browser.toml8
-rw-r--r--dom/media/test/browser/wmfme/browser_wmfme_glean_first_frame_loaded_time.js98
7 files changed, 310 insertions, 72 deletions
diff --git a/dom/media/test/browser/browser.toml b/dom/media/test/browser/browser.toml
index cf25369576..3e83448d47 100644
--- a/dom/media/test/browser/browser.toml
+++ b/dom/media/test/browser/browser.toml
@@ -2,6 +2,7 @@
subsuite = "media-bc"
prefs = ["gfx.font_loader.delay=0"]
support-files = [
+ "head.js",
"file_empty_page.html",
"file_media.html",
"../av1.mp4",
@@ -16,11 +17,14 @@ support-files = [
"../small-shot.mp3",
"../small-shot.ogg",
"../TestPatternHDR.mp4",
+ "../../mediasource/test/bipbop/bipbop2s.mp4",
]
["browser_encrypted_play_time_telemetry.js"]
skip-if = ["apple_silicon"] # Disabled due to bleedover with other tests when run in regular suites; passes in "failures" jobs
+["browser_glean_first_frame_loaded_time.js"]
+
["browser_tab_visibility_and_play_time.js"]
["browser_telemetry_video_hardware_decoding_support.js"]
diff --git a/dom/media/test/browser/browser_encrypted_play_time_telemetry.js b/dom/media/test/browser/browser_encrypted_play_time_telemetry.js
index ff4f2753ec..1a64717419 100644
--- a/dom/media/test/browser/browser_encrypted_play_time_telemetry.js
+++ b/dom/media/test/browser/browser_encrypted_play_time_telemetry.js
@@ -29,76 +29,6 @@ async function clearTelemetry() {
});
}
-// Opens a tab containing a blank page, returns a promise that will resolve
-// to that tab.
-async function openTab() {
- const emptyPageUri =
- "https://example.com/browser/dom/media/test/browser/file_empty_page.html";
- return BrowserTestUtils.openNewForegroundTab(window.gBrowser, emptyPageUri);
-}
-
-// Creates and configures a video element for EME playback in `tab`. Does not
-// start playback for the element. Returns a promise that will resolve once
-// the element is setup and ready for playback.
-async function loadEmeVideo(tab) {
- const emeHelperUri =
- gTestPath.substr(0, gTestPath.lastIndexOf("/")) + "/eme_standalone.js";
- return SpecialPowers.spawn(
- tab.linkedBrowser,
- [emeHelperUri],
- async _emeHelperUri => {
- // Begin helper functions.
- async function once(target, name) {
- return new Promise(r =>
- target.addEventListener(name, r, { once: true })
- );
- }
-
- // Helper to clone data into content so the EME helper can use the data.
- function cloneIntoContent(data) {
- return Cu.cloneInto(data, content.wrappedJSObject);
- }
- // End helper functions.
-
- // Load the EME helper into content.
- Services.scriptloader.loadSubScript(_emeHelperUri, content);
- // Setup EME with the helper.
- let video = content.document.createElement("video");
- video.id = "media";
- content.document.body.appendChild(video);
- let emeHelper = new content.wrappedJSObject.EmeHelper();
- emeHelper.SetKeySystem(
- content.wrappedJSObject.EmeHelper.GetClearkeyKeySystemString()
- );
- emeHelper.SetInitDataTypes(cloneIntoContent(["webm"]));
- emeHelper.SetVideoCapabilities(
- cloneIntoContent([{ contentType: 'video/webm; codecs="vp9"' }])
- );
- emeHelper.AddKeyIdAndKey(
- "2cdb0ed6119853e7850671c3e9906c3c",
- "808b9adac384de1e4f56140f4ad76194"
- );
- emeHelper.onerror = error => {
- is(false, `Got unexpected error from EME helper: ${error}`);
- };
- await emeHelper.ConfigureEme(video);
- // Done setting up EME.
-
- // Setup MSE.
- const ms = new content.wrappedJSObject.MediaSource();
- video.src = content.wrappedJSObject.URL.createObjectURL(ms);
- await once(ms, "sourceopen");
- const sb = ms.addSourceBuffer("video/webm");
- const videoFile = "sintel-short-clearkey-subsample-encrypted-video.webm";
- let fetchResponse = await content.fetch(videoFile);
- sb.appendBuffer(await fetchResponse.arrayBuffer());
- await once(sb, "updateend");
- ms.endOfStream();
- await once(ms, "sourceended");
- }
- );
-}
-
// Plays the media in `tab` until the 'ended' event is fire. Returns a promise
// that resolves once that state has been reached.
async function playMediaThrough(tab) {
diff --git a/dom/media/test/browser/browser_glean_first_frame_loaded_time.js b/dom/media/test/browser/browser_glean_first_frame_loaded_time.js
new file mode 100644
index 0000000000..1acfa9957e
--- /dev/null
+++ b/dom/media/test/browser/browser_glean_first_frame_loaded_time.js
@@ -0,0 +1,81 @@
+"use strict";
+
+// Disabling undef warning because in `run()` we use functions from head.js
+/* eslint-disable no-undef */
+
+/**
+ * This test is used to ensure that Glean probe 'first_frame_loaded' can be
+ * recorded correctly in different situations.
+ */
+
+const testCases = [
+ {
+ expected: {
+ playback_type: "Non-MSE playback",
+ video_codec: "video/avc",
+ resolution: "AV,240<h<=480",
+ key_system: undefined,
+ },
+ async run(tab) {
+ await loadVideo(tab);
+ },
+ },
+ {
+ expected: {
+ playback_type: "MSE playback",
+ video_codec: "video/avc",
+ resolution: "AV,240<h<=480",
+ key_system: undefined,
+ },
+ async run(tab) {
+ await loadMseVideo(tab);
+ },
+ },
+ {
+ expected: {
+ playback_type: "EME playback",
+ video_codec: "video/vp9",
+ resolution: "V,240<h<=480",
+ key_system: "org.w3.clearkey",
+ },
+ async run(tab) {
+ await loadEmeVideo(tab);
+ },
+ },
+];
+
+add_task(async function testGleanMediaPlayackFirstFrameLoaded() {
+ for (let test of testCases) {
+ Services.fog.testResetFOG();
+
+ const expected = test.expected;
+ info(`running test for '${expected.playback_type}'`);
+ const tab = await openTab();
+ await test.run(tab);
+
+ info(`waiting until glean probe is ready on the parent process`);
+ await Services.fog.testFlushAllChildren();
+
+ info("checking the collected results");
+ const extra = Glean.mediaPlayback.firstFrameLoaded.testGetValue()[0].extra;
+ Assert.greater(
+ parseInt(extra.first_frame_loaded_time),
+ 0,
+ `${extra.first_frame_loaded_time} is correct`
+ );
+ is(
+ extra.playback_type,
+ expected.playback_type,
+ `${extra.playback_type} is correct`
+ );
+ is(
+ extra.video_codec,
+ expected.video_codec,
+ `${extra.video_codec} is correct`
+ );
+ is(extra.resolution, expected.resolution, `${extra.resolution} is correct`);
+ is(extra.key_system, expected.key_system, `${extra.key_system} is correct`);
+
+ BrowserTestUtils.removeTab(tab);
+ }
+});
diff --git a/dom/media/test/browser/browser_tab_visibility_and_play_time.js b/dom/media/test/browser/browser_tab_visibility_and_play_time.js
index 4d33826091..b152f490c9 100644
--- a/dom/media/test/browser/browser_tab_visibility_and_play_time.js
+++ b/dom/media/test/browser/browser_tab_visibility_and_play_time.js
@@ -54,7 +54,7 @@ async function openMediaTab(url) {
return new Promise(resolve => {
element.addEventListener(
"timeupdate",
- e => {
+ () => {
resolve();
},
{ once: true }
diff --git a/dom/media/test/browser/head.js b/dom/media/test/browser/head.js
new file mode 100644
index 0000000000..7ef578a804
--- /dev/null
+++ b/dom/media/test/browser/head.js
@@ -0,0 +1,119 @@
+"use strict";
+
+/* import-globals-from ../eme_standalone.js */
+
+// Opens a tab containing a blank page, returns a promise that will resolve
+// to that tab.
+function openTab() {
+ const emptyPageUri =
+ "https://example.com/browser/dom/media/test/browser/file_empty_page.html";
+ return BrowserTestUtils.openNewForegroundTab(window.gBrowser, emptyPageUri);
+}
+
+// Creates and configures a video element for non-MSE playback in `tab`. Does not
+// start playback for the element. Returns a promise that will resolve once
+// the element is setup and ready for playback.
+function loadVideo(tab) {
+ return SpecialPowers.spawn(tab.linkedBrowser, [], async _ => {
+ let video = content.document.createElement("video");
+ video.id = "media";
+ content.document.body.appendChild(video);
+
+ video.src = "gizmo.mp4";
+ video.load();
+
+ info(`waiting 'loadeddata' event to ensure playback is ready`);
+ await new Promise(r => (video.onloadeddata = r));
+ });
+}
+
+// Creates and configures a video element for MSE playback in `tab`. Does not
+// start playback for the element. Returns a promise that will resolve once
+// the element is setup and ready for playback.
+function loadMseVideo(tab) {
+ return SpecialPowers.spawn(tab.linkedBrowser, [], async _ => {
+ async function once(target, name) {
+ return new Promise(r => target.addEventListener(name, r, { once: true }));
+ }
+
+ let video = content.document.createElement("video");
+ video.id = "media";
+ content.document.body.appendChild(video);
+
+ info(`starting setup MSE`);
+ const ms = new content.wrappedJSObject.MediaSource();
+ video.src = content.wrappedJSObject.URL.createObjectURL(ms);
+ await once(ms, "sourceopen");
+ const sb = ms.addSourceBuffer("video/mp4");
+ const videoFile = "bipbop2s.mp4";
+ let fetchResponse = await content.fetch(videoFile);
+ sb.appendBuffer(await fetchResponse.arrayBuffer());
+ await once(sb, "updateend");
+ ms.endOfStream();
+ await once(ms, "sourceended");
+
+ info(`waiting 'loadeddata' event to ensure playback is ready`);
+ await once(video, "loadeddata");
+ });
+}
+
+// Creates and configures a video element for EME playback in `tab`. Does not
+// start playback for the element. Returns a promise that will resolve once
+// the element is setup and ready for playback.
+function loadEmeVideo(tab) {
+ const emeHelperUri =
+ gTestPath.substr(0, gTestPath.lastIndexOf("/")) + "/eme_standalone.js";
+ return SpecialPowers.spawn(
+ tab.linkedBrowser,
+ [emeHelperUri],
+ async _emeHelperUri => {
+ async function once(target, name) {
+ return new Promise(r =>
+ target.addEventListener(name, r, { once: true })
+ );
+ }
+
+ // Helper to clone data into content so the EME helper can use the data.
+ function cloneIntoContent(data) {
+ return Cu.cloneInto(data, content.wrappedJSObject);
+ }
+
+ info(`starting setup EME`);
+ Services.scriptloader.loadSubScript(_emeHelperUri, content);
+ let video = content.document.createElement("video");
+ video.id = "media";
+ content.document.body.appendChild(video);
+ let emeHelper = new content.wrappedJSObject.EmeHelper();
+ emeHelper.SetKeySystem(
+ content.wrappedJSObject.EmeHelper.GetClearkeyKeySystemString()
+ );
+ emeHelper.SetInitDataTypes(cloneIntoContent(["webm"]));
+ emeHelper.SetVideoCapabilities(
+ cloneIntoContent([{ contentType: 'video/webm; codecs="vp9"' }])
+ );
+ emeHelper.AddKeyIdAndKey(
+ "2cdb0ed6119853e7850671c3e9906c3c",
+ "808b9adac384de1e4f56140f4ad76194"
+ );
+ emeHelper.onerror = error => {
+ is(false, `Got unexpected error from EME helper: ${error}`);
+ };
+ await emeHelper.ConfigureEme(video);
+
+ info(`starting setup MSE`);
+ const ms = new content.wrappedJSObject.MediaSource();
+ video.src = content.wrappedJSObject.URL.createObjectURL(ms);
+ await once(ms, "sourceopen");
+ const sb = ms.addSourceBuffer("video/webm");
+ const videoFile = "sintel-short-clearkey-subsample-encrypted-video.webm";
+ let fetchResponse = await content.fetch(videoFile);
+ sb.appendBuffer(await fetchResponse.arrayBuffer());
+ await once(sb, "updateend");
+ ms.endOfStream();
+ await once(ms, "sourceended");
+
+ info(`waiting 'loadeddata' event to ensure playback is ready`);
+ await once(video, "loadeddata");
+ }
+ );
+}
diff --git a/dom/media/test/browser/wmfme/browser.toml b/dom/media/test/browser/wmfme/browser.toml
index 422ea29228..7449d232d9 100644
--- a/dom/media/test/browser/wmfme/browser.toml
+++ b/dom/media/test/browser/wmfme/browser.toml
@@ -3,11 +3,17 @@ subsuite = "media-bc"
tags = "media-engine-compatible"
run-if = ["wmfme"]
support-files = [
- "head.js",
"file_video.html",
+ "head.js",
+ "../head.js",
+ "../../eme_standalone.js",
"../../gizmo.mp4",
+ "../../sintel-short-clearkey-subsample-encrypted-video.webm",
+ "../../../mediasource/test/bipbop/bipbop2s.mp4",
]
["browser_wmfme_crash.js"]
+["browser_wmfme_glean_first_frame_loaded_time.js"]
+
["browser_wmfme_max_crashes.js"]
diff --git a/dom/media/test/browser/wmfme/browser_wmfme_glean_first_frame_loaded_time.js b/dom/media/test/browser/wmfme/browser_wmfme_glean_first_frame_loaded_time.js
new file mode 100644
index 0000000000..f9e97aaa49
--- /dev/null
+++ b/dom/media/test/browser/wmfme/browser_wmfme_glean_first_frame_loaded_time.js
@@ -0,0 +1,98 @@
+"use strict";
+
+// Disabling undef warning because in `run()` we use functions from head.js
+/* eslint-disable no-undef */
+
+/**
+ * This test is used to ensure that Glean probe 'first_frame_loaded' can be
+ * recorded correctly in different situations.
+ */
+
+/* import-globals-from ../head.js */
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/dom/media/test/browser/head.js",
+ this
+);
+
+add_task(async function setupTestingPref() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["media.wmf.media-engine.enabled", 1],
+ ["media.wmf.media-engine.channel-decoder.enabled", true],
+ ["media.eme.wmf.clearkey.enabled", true],
+ ],
+ });
+});
+
+const testCases = [
+ {
+ expected: {
+ playback_type: "Non-MSE media-engine playback",
+ video_codec: "video/avc",
+ resolution: "AV,240<h<=480",
+ key_system: undefined,
+ },
+ async run(tab) {
+ await loadVideo(tab);
+ },
+ },
+ {
+ expected: {
+ playback_type: "MSE media-engine playback",
+ video_codec: "video/avc",
+ resolution: "AV,240<h<=480",
+ key_system: undefined,
+ },
+ async run(tab) {
+ await loadMseVideo(tab);
+ },
+ },
+ // TODO : we're not able to run MFCDM EME playback yet, see bug 1870722.
+ // {
+ // expected: {
+ // playback_type: "EME media-engine playback",
+ // video_codec: "video/vp9",
+ // resolution: "V,240<h<=480",
+ // key_system: "org.w3.clearkey",
+ // },
+ // async run(tab) {
+ // await loadEmeVideo(tab);
+ // },
+ // },
+];
+
+add_task(async function testGleanMediaPlayackFirstFrameLoaded() {
+ for (let test of testCases) {
+ Services.fog.testResetFOG();
+
+ const expected = test.expected;
+ info(`running test for '${expected.playback_type}'`);
+ const tab = await openTab();
+ await test.run(tab);
+
+ info(`waiting until glean probe is ready on the parent process`);
+ await Services.fog.testFlushAllChildren();
+
+ info("checking the collected results");
+ const extra = Glean.mediaPlayback.firstFrameLoaded.testGetValue()[0].extra;
+ Assert.greater(
+ parseInt(extra.first_frame_loaded_time),
+ 0,
+ `${extra.first_frame_loaded_time} is correct`
+ );
+ is(
+ extra.playback_type,
+ expected.playback_type,
+ `${extra.playback_type} is correct`
+ );
+ is(
+ extra.video_codec,
+ expected.video_codec,
+ `${extra.video_codec} is correct`
+ );
+ is(extra.resolution, expected.resolution, `${extra.resolution} is correct`);
+ is(extra.key_system, expected.key_system, `${extra.key_system} is correct`);
+
+ BrowserTestUtils.removeTab(tab);
+ }
+});