From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../tests/browser/browser_to_handle_telemetry.js | 199 +++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 browser/components/tests/browser/browser_to_handle_telemetry.js (limited to 'browser/components/tests/browser/browser_to_handle_telemetry.js') diff --git a/browser/components/tests/browser/browser_to_handle_telemetry.js b/browser/components/tests/browser/browser_to_handle_telemetry.js new file mode 100644 index 0000000000..92c8202e94 --- /dev/null +++ b/browser/components/tests/browser/browser_to_handle_telemetry.js @@ -0,0 +1,199 @@ +/* Any copyright is dedicated to the Public Domain. +http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +async function handleCommandLine(args, state) { + let newWinPromise; + let target = args[args.length - 1]; + + const EXISTING_FILE = Cc["@mozilla.org/file/local;1"].createInstance( + Ci.nsIFile + ); + EXISTING_FILE.initWithPath(getTestFilePath("dummy.pdf")); + + if (!target.includes("://")) { + // For simplicity, we handle only absolute paths. We could resolve relative + // paths, but that would itself require the functionality of the + // `nsICommandLine` instance we produce using this input. + const file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); + file.initWithPath(target); + target = Services.io.newFileURI(file).spec; + } + + if (state == Ci.nsICommandLine.STATE_INITIAL_LAUNCH) { + newWinPromise = BrowserTestUtils.waitForNewWindow({ + url: target, // N.b.: trailing slashes matter when matching. + }); + } + + let cmdLineHandler = Cc["@mozilla.org/browser/final-clh;1"].getService( + Ci.nsICommandLineHandler + ); + + let fakeCmdLine = Cu.createCommandLine(args, EXISTING_FILE.parent, state); + cmdLineHandler.handle(fakeCmdLine); + + if (newWinPromise) { + let newWin = await newWinPromise; + await BrowserTestUtils.closeWindow(newWin); + } else { + BrowserTestUtils.removeTab(gBrowser.selectedTab); + } +} + +function assertToHandleTelemetry(assertions) { + const scalars = TelemetryTestUtils.getProcessScalars("parent", true, true); + + const { invoked, launched, ...unknown } = assertions; + if (Object.keys(unknown).length) { + throw Error( + `Unknown keys given to assertToHandleTelemetry: ${JSON.stringify( + unknown + )}` + ); + } + if (invoked === undefined && launched === undefined) { + throw Error("No known keys given to assertToHandleTelemetry"); + } + + for (let scalar of ["invoked", "launched"]) { + if (scalar in assertions) { + const { handled, not_handled } = assertions[scalar] || {}; + if (handled) { + TelemetryTestUtils.assertKeyedScalar( + scalars, + `os.environment.${scalar}_to_handle`, + handled, + 1, + `${scalar} to handle '${handled}' 1 times` + ); + // Intentionally nested. + if (not_handled) { + Assert.equal( + not_handled in scalars[`os.environment.${scalar}_to_handle`], + false, + `${scalar} to handle '${not_handled}' 0 times` + ); + } + } else { + TelemetryTestUtils.assertScalarUnset( + scalars, + `os.environment.${scalar}_to_handle` + ); + + if (not_handled) { + throw new Error( + `In ${scalar}, 'not_handled' is only valid with 'handled'` + ); + } + } + } + } +} + +add_task(async function test_invoked_to_handle_registered_file_type() { + await handleCommandLine( + [ + "-osint", + "-url", + getTestFilePath("../../../../dom/security/test/csp/dummy.pdf"), + ], + Ci.nsICommandLine.STATE_REMOTE_EXPLICIT + ); + + assertToHandleTelemetry({ + invoked: { handled: ".pdf", not_handled: ".html" }, + launched: null, + }); +}); + +add_task(async function test_invoked_to_handle_unregistered_file_type() { + await handleCommandLine( + ["-osint", "-url", getTestFilePath("browser.ini")], + Ci.nsICommandLine.STATE_REMOTE_EXPLICIT + ); + + assertToHandleTelemetry({ + invoked: { handled: ".", not_handled: ".ini" }, + launched: null, + }); +}); + +add_task(async function test_invoked_to_handle_registered_protocol() { + await handleCommandLine( + ["-osint", "-url", "https://example.com/"], + Ci.nsICommandLine.STATE_REMOTE_EXPLICIT + ); + + assertToHandleTelemetry({ + invoked: { handled: "https", not_handled: "mailto" }, + launched: null, + }); +}); + +add_task(async function test_invoked_to_handle_unregistered_protocol() { + // Truly unknown protocols get "URI fixed up" to search provider queries. + // `ftp` does not get fixed up. + await handleCommandLine( + ["-osint", "-url", "ftp://example.com/"], + Ci.nsICommandLine.STATE_REMOTE_EXPLICIT + ); + + assertToHandleTelemetry({ + invoked: { handled: "", not_handled: "ftp" }, + launched: null, + }); +}); + +add_task(async function test_launched_to_handle_registered_protocol() { + await handleCommandLine( + ["-osint", "-url", "https://example.com/"], + Ci.nsICommandLine.STATE_INITIAL_LAUNCH + ); + + assertToHandleTelemetry({ + invoked: null, + launched: { handled: "https", not_handled: "mailto" }, + }); +}); + +add_task(async function test_launched_to_handle_registered_file_type() { + await handleCommandLine( + [ + "-osint", + "-url", + getTestFilePath("../../../../dom/security/test/csp/dummy.pdf"), + ], + Ci.nsICommandLine.STATE_INITIAL_LAUNCH + ); + + assertToHandleTelemetry({ + invoked: null, + launched: { handled: ".pdf", not_handled: ".html" }, + }); +}); + +add_task(async function test_invoked_no_osint() { + await handleCommandLine( + ["-url", "https://example.com/"], + Ci.nsICommandLine.STATE_REMOTE_EXPLICIT + ); + + assertToHandleTelemetry({ + invoked: null, + launched: null, + }); +}); + +add_task(async function test_launched_no_osint() { + await handleCommandLine( + ["-url", "https://example.com/"], + Ci.nsICommandLine.STATE_INITIAL_LAUNCH + ); + + assertToHandleTelemetry({ + invoked: null, + launched: null, + }); +}); -- cgit v1.2.3