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

// Tests resetting of preferences in blocklist entry when an add-on is blocked.
// See bug 802434.

// useMLBF=true only supports blocking, not resetting prefs, since extensions
// cannot set arbitrary prefs any more after the removal of legacy addons.
enable_blocklist_v2_instead_of_useMLBF();

const BLOCKLIST_DATA = [
  {
    guid: "block1@tests.mozilla.org",
    versionRange: [
      {
        severity: "1",
        targetApplication: [
          {
            guid: "xpcshell@tests.mozilla.org",
            maxVersion: "2.*",
            minVersion: "1",
          },
        ],
      },
    ],
    prefs: ["test.blocklist.pref1", "test.blocklist.pref2"],
  },
  {
    guid: "block2@tests.mozilla.org",
    versionRange: [
      {
        severity: "3",
        targetApplication: [
          {
            guid: "xpcshell@tests.mozilla.org",
            maxVersion: "2.*",
            minVersion: "1",
          },
        ],
      },
    ],
    prefs: ["test.blocklist.pref3", "test.blocklist.pref4"],
  },
];

add_task(async function setup() {
  createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1");

  await promiseStartupManager();

  // Add 2 extensions
  await promiseInstallWebExtension({
    manifest: {
      name: "Blocked add-on-1 with to-be-reset prefs",
      version: "1.0",
      browser_specific_settings: { gecko: { id: "block1@tests.mozilla.org" } },
    },
  });
  await promiseInstallWebExtension({
    manifest: {
      name: "Blocked add-on-2 with to-be-reset prefs",
      version: "1.0",
      browser_specific_settings: { gecko: { id: "block2@tests.mozilla.org" } },
    },
  });

  // Pre-set the preferences that we expect to get reset.
  Services.prefs.setIntPref("test.blocklist.pref1", 15);
  Services.prefs.setIntPref("test.blocklist.pref2", 15);
  Services.prefs.setBoolPref("test.blocklist.pref3", true);
  Services.prefs.setBoolPref("test.blocklist.pref4", true);

  // Before blocklist is loaded.
  let [a1, a2] = await AddonManager.getAddonsByIDs([
    "block1@tests.mozilla.org",
    "block2@tests.mozilla.org",
  ]);
  Assert.equal(a1.blocklistState, Ci.nsIBlocklistService.STATE_NOT_BLOCKED);
  Assert.equal(a2.blocklistState, Ci.nsIBlocklistService.STATE_NOT_BLOCKED);

  Assert.equal(Services.prefs.getIntPref("test.blocklist.pref1"), 15);
  Assert.equal(Services.prefs.getIntPref("test.blocklist.pref2"), 15);
  Assert.equal(Services.prefs.getBoolPref("test.blocklist.pref3"), true);
  Assert.equal(Services.prefs.getBoolPref("test.blocklist.pref4"), true);
});

add_task(async function test_blocks() {
  await AddonTestUtils.loadBlocklistRawData({ extensions: BLOCKLIST_DATA });

  // Blocklist changes should have applied and the prefs must be reset.
  let [a1, a2] = await AddonManager.getAddonsByIDs([
    "block1@tests.mozilla.org",
    "block2@tests.mozilla.org",
  ]);
  Assert.notEqual(a1, null);
  Assert.equal(a1.blocklistState, Ci.nsIBlocklistService.STATE_SOFTBLOCKED);
  Assert.notEqual(a2, null);
  Assert.equal(a2.blocklistState, Ci.nsIBlocklistService.STATE_BLOCKED);

  // All these prefs must be reset to defaults.
  Assert.equal(Services.prefs.prefHasUserValue("test.blocklist.pref1"), false);
  Assert.equal(Services.prefs.prefHasUserValue("test.blocklist.pref2"), false);
  Assert.equal(Services.prefs.prefHasUserValue("test.blocklist.pref3"), false);
  Assert.equal(Services.prefs.prefHasUserValue("test.blocklist.pref4"), false);
});
