/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/
 */

"use strict";

const { XPCOMUtils } = ChromeUtils.importESModule(
  "resource://gre/modules/XPCOMUtils.sys.mjs"
);

ChromeUtils.defineESModuleGetters(this, {
  RemoteSettings: "resource://services-settings/remote-settings.sys.mjs",
  TelemetryTestUtils: "resource://testing-common/TelemetryTestUtils.sys.mjs",
  sinon: "resource://testing-common/Sinon.sys.mjs",
});

XPCOMUtils.defineLazyModuleGetters(this, {
  HomePage: "resource:///modules/HomePage.jsm",
});

const HOMEPAGE_IGNORELIST = "homepage-urls";

/**
 * Provides a basic set of remote settings for use in tests.
 */
async function setupRemoteSettings() {
  const settings = await RemoteSettings("hijack-blocklists");
  sinon.stub(settings, "get").returns([
    {
      id: HOMEPAGE_IGNORELIST,
      matches: ["ignore=me", "ignoreCASE=ME"],
      _status: "synced",
    },
  ]);
}

add_task(async function setup() {
  await setupRemoteSettings();
});

add_task(async function test_initWithIgnoredPageCausesReset() {
  // Set the preference direct as the set() would block us.
  Services.prefs.setStringPref(
    "browser.startup.homepage",
    "http://bad/?ignore=me"
  );
  Assert.ok(HomePage.overridden, "Should have overriden the homepage");

  await HomePage.delayedStartup();

  Assert.ok(
    !HomePage.overridden,
    "Should no longer be overriding the homepage."
  );
  Assert.equal(
    HomePage.get(),
    HomePage.getDefault(),
    "Should have reset to the default preference"
  );

  TelemetryTestUtils.assertEvents(
    [{ object: "ignore", value: "saved_reset" }],
    {
      category: "homepage",
      method: "preference",
    }
  );
});

add_task(async function test_updateIgnoreListCausesReset() {
  Services.prefs.setStringPref(
    "browser.startup.homepage",
    "http://bad/?new=ignore"
  );
  Assert.ok(HomePage.overridden, "Should have overriden the homepage");

  // Simulate an ignore list update.
  await RemoteSettings("hijack-blocklists").emit("sync", {
    data: {
      current: [
        {
          id: HOMEPAGE_IGNORELIST,
          schema: 1553857697843,
          last_modified: 1553859483588,
          matches: ["ignore=me", "ignoreCASE=ME", "new=ignore"],
        },
      ],
    },
  });

  Assert.ok(
    !HomePage.overridden,
    "Should no longer be overriding the homepage."
  );
  Assert.equal(
    HomePage.get(),
    HomePage.getDefault(),
    "Should have reset to the default preference"
  );
  TelemetryTestUtils.assertEvents(
    [{ object: "ignore", value: "saved_reset" }],
    {
      category: "homepage",
      method: "preference",
    }
  );
});

async function testSetIgnoredUrl(url) {
  Assert.ok(!HomePage.overriden, "Should not be overriding the homepage");

  await HomePage.set(url);

  Assert.equal(
    HomePage.get(),
    HomePage.getDefault(),
    "Should still have the default homepage."
  );
  Assert.ok(!HomePage.overriden, "Should not be overriding the homepage.");
  TelemetryTestUtils.assertEvents(
    [{ object: "ignore", value: "set_blocked" }],
    {
      category: "homepage",
      method: "preference",
    }
  );
}

add_task(async function test_setIgnoredUrl() {
  await testSetIgnoredUrl("http://bad/?ignore=me");
});

add_task(async function test_setIgnoredUrl_case() {
  await testSetIgnoredUrl("http://bad/?Ignorecase=me");
});
