"use strict";

const { TelemetryTestUtils } = ChromeUtils.importESModule(
  "resource://testing-common/TelemetryTestUtils.sys.mjs"
);

// eslint-disable-next-line
const ROOT = getRootDirectory(gTestPath).replace(
  "chrome://mochitests/content",
  "https://example.com"
);
const PAGE_URL = ROOT + "file_access_sanitized_pref.html";

async function waitForEventCount(
  count,
  process = "content",
  category = "security",
  method = "prefUsage"
) {
  // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
  await new Promise(resolve => setTimeout(resolve, 100));
  let returned_events = await TestUtils.waitForCondition(() => {
    let events = Services.telemetry.snapshotEvents(
      Ci.nsITelemetry.DATASET_PRERELEASE_CHANNELS,
      false
    )[process];

    if (!events) {
      return null;
    }

    events = events.filter(e => e[1] == category && e[2] == method);
    dump(`Waiting for ${count} events, got ${events.length}\n`);
    return events.length >= count ? events : null;
  }, "waiting for telemetry event count of: " + count);
  return returned_events;
}

add_task(async function sanitized_pref_test() {
  await SpecialPowers.pushPrefEnv({
    set: [
      ["fission.omitBlocklistedPrefsInSubprocesses", true],
      ["fission.enforceBlocklistedPrefsInSubprocesses", false],
    ],
  });

  Services.telemetry.setEventRecordingEnabled("security", true);
  Services.telemetry.clearEvents();

  TelemetryTestUtils.assertNumberOfEvents(0, { process: "content" });

  await BrowserTestUtils.withNewTab(
    { gBrowser, url: PAGE_URL },
    async function (browser) {}
  );

  // Needed because otherwise we advance too quickly
  await waitForEventCount(1);

  let events = TelemetryTestUtils.getEvents(
    { category: "security", method: "prefUsage", object: "contentProcess" },
    { process: "content" }
  );

  let count = 0,
    foundIt = false;
  for (let i = 0; i < events.length; i++) {
    if (events[i].value == "extensions.webextensions.uuids") {
      foundIt = true;
      count++;
    }
  }

  // We may have more than one event entries because we take two paths in the preference code
  // in this access pattern, but in other patterns we may only take one of those
  // paths, so we happen to count it twice this way.  No big deal. Sometimes we even have 4
  // or 6 based on timing
  dump(
    `We found ${events.length} events, ${count} of which were 'extensions.webextensions.uuids'.`
  );

  // eslint-disable-next-line
  Assert.ok(
    foundIt,
    "We did not find an event for 'extensions.webextensions.uuids'"
  );

  await SpecialPowers.popPrefEnv();
});
