summaryrefslogtreecommitdiffstats
path: root/toolkit/components/passwordmgr/test/browser/browser_username_only_form_telemetry.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/passwordmgr/test/browser/browser_username_only_form_telemetry.js')
-rw-r--r--toolkit/components/passwordmgr/test/browser/browser_username_only_form_telemetry.js198
1 files changed, 198 insertions, 0 deletions
diff --git a/toolkit/components/passwordmgr/test/browser/browser_username_only_form_telemetry.js b/toolkit/components/passwordmgr/test/browser/browser_username_only_form_telemetry.js
new file mode 100644
index 0000000000..54304c24ac
--- /dev/null
+++ b/toolkit/components/passwordmgr/test/browser/browser_username_only_form_telemetry.js
@@ -0,0 +1,198 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/* eslint-disable mozilla/no-arbitrary-setTimeout */
+
+"use strict";
+
+async function setupForms(numUsernameOnly, numBasic, numOther) {
+ const TEST_HOSTNAME = "https://example.com";
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ TEST_HOSTNAME + DIRECTORY_PATH + "empty.html"
+ );
+
+ await SpecialPowers.spawn(
+ tab.linkedBrowser,
+ [
+ {
+ numUsernameOnly,
+ numBasic,
+ },
+ ],
+ async function (data) {
+ // type: 1: basic, 2:usernameOnly, 3:other
+ function addForm(type) {
+ const form = content.document.createElement("form");
+ content.document.body.appendChild(form);
+
+ const user = content.document.createElement("input");
+ if (type === 3) {
+ user.type = "url";
+ } else {
+ user.type = "text";
+ user.autocomplete = "username";
+ }
+ form.appendChild(user);
+
+ if (type === 1) {
+ const password = content.document.createElement("input");
+ password.type = "password";
+ form.appendChild(password);
+ }
+ }
+ for (let i = 0; i < data.numBasic; i++) {
+ addForm(1);
+ }
+ for (let i = 0; i < data.numUsernameOnly; i++) {
+ addForm(2);
+ }
+ for (let i = 0; i < data.numOther; i++) {
+ addForm(3);
+ }
+ }
+ );
+
+ return tab;
+}
+
+async function checkChildHistogram(id, index, expected) {
+ let histogram;
+ await TestUtils.waitForCondition(() => {
+ let histograms = Services.telemetry.getSnapshotForHistograms(
+ "main",
+ false /* clear */
+ ).content;
+
+ histogram = histograms[id];
+ return !!histogram && histogram.values[index] == expected;
+ });
+ Assert.equal(histogram.values[index], expected);
+}
+
+add_setup(async function () {
+ SpecialPowers.pushPrefEnv({
+ set: [
+ ["signon.usernameOnlyForm.enabled", true],
+ ["signon.usernameOnlyForm.lookupThreshold", 100], // ignore the threshold in test
+ ],
+ });
+
+ // Wait 1sec to make sure all the telemetry data recorded prior to the beginning of the
+ // test is cleared.
+ await new Promise(res => setTimeout(res, 1000));
+ Services.telemetry.getSnapshotForHistograms("main", true /* clear */);
+});
+
+add_task(async function test_oneUsernameOnlyForm() {
+ const numUsernameOnlyForms = 1;
+ const numBasicForms = 0;
+
+ // number of "other" forms doesn't change the outcome, set it to 2 here and
+ // in the following testcase just to ensure it doesn't affect the result.
+ let tab = await setupForms(numUsernameOnlyForms, numBasicForms, 2);
+
+ await checkChildHistogram(
+ "PWMGR_IS_USERNAME_ONLY_FORM",
+ 1,
+ numUsernameOnlyForms
+ );
+ await checkChildHistogram(
+ "PWMGR_NUM_FORM_HAS_POSSIBLE_USERNAME_EVENT_PER_DOC",
+ numUsernameOnlyForms,
+ 1
+ );
+
+ BrowserTestUtils.removeTab(tab);
+ Services.telemetry.getSnapshotForHistograms("main", true /* clear */);
+});
+
+add_task(async function test_multipleUsernameOnlyForms() {
+ const numUsernameOnlyForms = 3;
+ const numBasicForms = 2;
+
+ let tab = await setupForms(numUsernameOnlyForms, numBasicForms, 2);
+
+ await checkChildHistogram(
+ "PWMGR_IS_USERNAME_ONLY_FORM",
+ 1,
+ numUsernameOnlyForms
+ );
+ await checkChildHistogram(
+ "PWMGR_NUM_FORM_HAS_POSSIBLE_USERNAME_EVENT_PER_DOC",
+ 5,
+ 1
+ );
+
+ BrowserTestUtils.removeTab(tab);
+ Services.telemetry.getSnapshotForHistograms("main", true /* clear */);
+});
+
+add_task(async function test_multipleDocument() {
+ // The first document
+ let numUsernameOnlyForms1 = 2;
+ let numBasicForms1 = 2;
+
+ let tab1 = await setupForms(numUsernameOnlyForms1, numBasicForms1, 2);
+
+ await checkChildHistogram(
+ "PWMGR_IS_USERNAME_ONLY_FORM",
+ 1,
+ numUsernameOnlyForms1
+ );
+ await checkChildHistogram(
+ "PWMGR_NUM_FORM_HAS_POSSIBLE_USERNAME_EVENT_PER_DOC",
+ numUsernameOnlyForms1 + numBasicForms1,
+ 1
+ );
+
+ // The second document
+ let numUsernameOnlyForms2 = 15;
+ let numBasicForms2 = 3;
+
+ let tab2 = await setupForms(numUsernameOnlyForms2, numBasicForms2, 2);
+
+ await checkChildHistogram(
+ "PWMGR_IS_USERNAME_ONLY_FORM",
+ 1,
+ numUsernameOnlyForms1 + numUsernameOnlyForms2
+ );
+
+ // the result is stacked, so the new document add a counter to all
+ // buckets under "numUsernameOnlyForms2 + numBasicForms2"
+ await checkChildHistogram(
+ "PWMGR_NUM_FORM_HAS_POSSIBLE_USERNAME_EVENT_PER_DOC",
+ numUsernameOnlyForms1 + numBasicForms1,
+ 2
+ );
+ await checkChildHistogram(
+ "PWMGR_NUM_FORM_HAS_POSSIBLE_USERNAME_EVENT_PER_DOC",
+ numUsernameOnlyForms2 + numBasicForms2,
+ 1
+ );
+
+ BrowserTestUtils.removeTab(tab1);
+ BrowserTestUtils.removeTab(tab2);
+ Services.telemetry.getSnapshotForHistograms("main", true /* clear */);
+});
+
+add_task(async function test_tooManyUsernameOnlyForms() {
+ const numUsernameOnlyForms = 25;
+ const numBasicForms = 2;
+
+ let tab = await setupForms(numUsernameOnlyForms, numBasicForms, 2);
+
+ await checkChildHistogram(
+ "PWMGR_IS_USERNAME_ONLY_FORM",
+ 1,
+ numUsernameOnlyForms
+ );
+ await checkChildHistogram(
+ "PWMGR_NUM_FORM_HAS_POSSIBLE_USERNAME_EVENT_PER_DOC",
+ 21,
+ numUsernameOnlyForms + numBasicForms - 20 // maximum is 20
+ );
+
+ BrowserTestUtils.removeTab(tab);
+ Services.telemetry.getSnapshotForHistograms("main", true /* clear */);
+});