diff options
Diffstat (limited to 'toolkit/components/telemetry/tests/browser/browser_media_element_in_page_scalar.js')
-rw-r--r-- | toolkit/components/telemetry/tests/browser/browser_media_element_in_page_scalar.js | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/toolkit/components/telemetry/tests/browser/browser_media_element_in_page_scalar.js b/toolkit/components/telemetry/tests/browser/browser_media_element_in_page_scalar.js new file mode 100644 index 0000000000..3c9dd8f8ee --- /dev/null +++ b/toolkit/components/telemetry/tests/browser/browser_media_element_in_page_scalar.js @@ -0,0 +1,128 @@ +"use strict"; + +const { TelemetryTestUtils } = ChromeUtils.importESModule( + "resource://testing-common/TelemetryTestUtils.sys.mjs" +); +const LOCATION = + "https://example.com/browser/toolkit/components/telemetry/tests/browser/"; +const CORS_LOCATION = + "https://example.org/browser/toolkit/components/telemetry/tests/browser/"; +const MEDIA_SCALAR_NAME = "media.element_in_page_count"; + +/** + * 'media.element_in_page_count' is a permanant scalar, this test is used to + * check if that scalar can be accumulated correctly under different situations. + */ +add_task(async function start_tests() { + // Clean all scalars first to prevent being interfered by former test. + TelemetryTestUtils.getProcessScalars("parent", false, true /* clear */); + + await testMediaInPageScalar({ + description: "load a page with one media element", + url: "file_media.html", + expectedScalarCount: 1, + }); + await testMediaInPageScalar({ + description: "load a page with multiple media elements", + url: "file_media.html", + options: { + createSecondMedia: true, + }, + expectedScalarCount: 1, + }); + await testMediaInPageScalar({ + description: "load a page with media element created from iframe", + url: "file_iframe.html", + options: { + iframeUrl: "file_media.html", + }, + expectedScalarCount: 1, + }); + await testMediaInPageScalar({ + description: "load a page with media element created from CORS iframe", + url: "file_iframe.html", + options: { + iframeUrl: "file_media.html", + CORSIframe: true, + }, + expectedScalarCount: 1, + }); + await testMediaInPageScalar({ + description: "run multiple tabs, all loading media page", + url: "file_media.html", + options: { + tabNums: 2, + }, + expectedScalarCount: 2, + }); +}); + +async function testMediaInPageScalar({ + description, + url, + options, + expectedScalarCount, +} = {}) { + info(`media scalar should be undefined in the start`); + let scalars = TelemetryTestUtils.getProcessScalars("parent"); + is(scalars[MEDIA_SCALAR_NAME], undefined, "has not created media scalar yet"); + + info(`run test '${description}'`); + url = LOCATION + url; + await runMediaPage(url, options); + + info(`media scalar should be increased to ${expectedScalarCount}`); + scalars = TelemetryTestUtils.getProcessScalars( + "parent", + false, + true /* clear */ + ); + is( + scalars[MEDIA_SCALAR_NAME], + expectedScalarCount, + "media scalar count is correct" + ); + info("============= Next Testcase ============="); +} + +/** + * The following are helper functions. + */ +async function runMediaPage(url, options = {}) { + const tabNums = options.tabNums ? options.tabNums : 1; + for (let idx = 0; idx < tabNums; idx++) { + info(`open a tab loading media page`); + const tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, url); + if (options.iframeUrl) { + let iframeURL = options.CORSIframe ? CORS_LOCATION : LOCATION; + iframeURL += options.iframeUrl; + await loadPageForIframe(tab, iframeURL); + } + + if (options.createSecondMedia) { + info(`create second media in the page`); + await createMedia(tab); + } + + info(`remove tab`); + await BrowserTestUtils.removeTab(tab); + await BrowserUtils.promiseObserved("window-global-destroyed"); + } +} + +function createMedia(tab) { + return SpecialPowers.spawn(tab.linkedBrowser, [], _ => { + const video = content.document.createElement("VIDEO"); + video.src = "gizmo.mp4"; + video.loop = true; + content.document.body.appendChild(video); + }); +} + +function loadPageForIframe(tab, url) { + return SpecialPowers.spawn(tab.linkedBrowser, [url], async url => { + const iframe = content.document.getElementById("iframe"); + iframe.src = url; + await new Promise(r => (iframe.onload = r)); + }); +} |