const DEFAULT_HW_ACCEL_PREF = Services.prefs
  .getDefaultBranch(null)
  .getBoolPref("layers.acceleration.disabled");
const DEFAULT_PROCESS_COUNT = Services.prefs
  .getDefaultBranch(null)
  .getIntPref("dom.ipc.processCount");

add_task(async function () {
  // We must temporarily disable `Once` StaticPrefs check for the duration of
  // this test (see bug 1556131). We must do so in a separate operation as
  // pushPrefEnv doesn't set the preferences in the order one could expect.
  await SpecialPowers.pushPrefEnv({
    set: [["preferences.force-disable.check.once.policy", true]],
  });
  await SpecialPowers.pushPrefEnv({
    set: [
      ["layers.acceleration.disabled", DEFAULT_HW_ACCEL_PREF],
      ["dom.ipc.processCount", DEFAULT_PROCESS_COUNT],
      ["browser.preferences.defaultPerformanceSettings.enabled", true],
    ],
  });
});

add_task(async function () {
  let prefs = await openPreferencesViaOpenPreferencesAPI("paneGeneral", {
    leaveOpen: true,
  });
  is(prefs.selectedPane, "paneGeneral", "General pane was selected");

  let doc = gBrowser.contentDocument;
  let useRecommendedPerformanceSettings = doc.querySelector(
    "#useRecommendedPerformanceSettings"
  );

  is(
    Services.prefs.getBoolPref(
      "browser.preferences.defaultPerformanceSettings.enabled"
    ),
    true,
    "pref value should be true before clicking on checkbox"
  );
  ok(
    useRecommendedPerformanceSettings.checked,
    "checkbox should be checked before clicking on checkbox"
  );

  useRecommendedPerformanceSettings.click();

  let performanceSettings = doc.querySelector("#performanceSettings");
  is(
    performanceSettings.hidden,
    false,
    "performance settings section is shown"
  );

  is(
    Services.prefs.getBoolPref(
      "browser.preferences.defaultPerformanceSettings.enabled"
    ),
    false,
    "pref value should be false after clicking on checkbox"
  );
  ok(
    !useRecommendedPerformanceSettings.checked,
    "checkbox should not be checked after clicking on checkbox"
  );

  let allowHWAccel = doc.querySelector("#allowHWAccel");
  let allowHWAccelPref = Services.prefs.getBoolPref(
    "layers.acceleration.disabled"
  );
  is(
    allowHWAccelPref,
    DEFAULT_HW_ACCEL_PREF,
    "pref value should be the default value before clicking on checkbox"
  );
  is(
    allowHWAccel.checked,
    !DEFAULT_HW_ACCEL_PREF,
    "checkbox should show the invert of the default value"
  );

  let contentProcessCount = doc.querySelector("#contentProcessCount");
  is(
    contentProcessCount.disabled,
    false,
    "process count control should be enabled"
  );
  is(
    Services.prefs.getIntPref("dom.ipc.processCount"),
    DEFAULT_PROCESS_COUNT,
    "default pref value should be default value"
  );
  is(
    contentProcessCount.selectedItem.value,
    "" + DEFAULT_PROCESS_COUNT,
    "selected item should be the default one"
  );

  allowHWAccel.click();
  allowHWAccelPref = Services.prefs.getBoolPref("layers.acceleration.disabled");
  is(
    allowHWAccelPref,
    !DEFAULT_HW_ACCEL_PREF,
    "pref value should be opposite of the default value after clicking on checkbox"
  );
  is(
    allowHWAccel.checked,
    !allowHWAccelPref,
    "checkbox should show the invert of the current value"
  );

  contentProcessCount.value = 7;
  contentProcessCount.doCommand();
  is(
    Services.prefs.getIntPref("dom.ipc.processCount"),
    7,
    "pref value should be 7"
  );
  is(contentProcessCount.selectedItem.value, "7", "selected item should be 7");

  allowHWAccel.click();
  allowHWAccelPref = Services.prefs.getBoolPref("layers.acceleration.disabled");
  is(
    allowHWAccelPref,
    DEFAULT_HW_ACCEL_PREF,
    "pref value should be the default value after clicking on checkbox"
  );
  is(
    allowHWAccel.checked,
    !allowHWAccelPref,
    "checkbox should show the invert of the current value"
  );

  contentProcessCount.value = DEFAULT_PROCESS_COUNT;
  contentProcessCount.doCommand();
  is(
    Services.prefs.getIntPref("dom.ipc.processCount"),
    DEFAULT_PROCESS_COUNT,
    "pref value should be default value"
  );
  is(
    contentProcessCount.selectedItem.value,
    "" + DEFAULT_PROCESS_COUNT,
    "selected item should be default one"
  );

  is(
    performanceSettings.hidden,
    false,
    "performance settings section should be still shown"
  );

  Services.prefs.setBoolPref(
    "browser.preferences.defaultPerformanceSettings.enabled",
    true
  );
  BrowserTestUtils.removeTab(gBrowser.selectedTab);
});

add_task(async function () {
  let prefs = await openPreferencesViaOpenPreferencesAPI("paneGeneral", {
    leaveOpen: true,
  });
  is(prefs.selectedPane, "paneGeneral", "General pane was selected");

  let doc = gBrowser.contentDocument;
  let useRecommendedPerformanceSettings = doc.querySelector(
    "#useRecommendedPerformanceSettings"
  );
  let allowHWAccel = doc.querySelector("#allowHWAccel");
  let contentProcessCount = doc.querySelector("#contentProcessCount");
  let performanceSettings = doc.querySelector("#performanceSettings");

  useRecommendedPerformanceSettings.click();
  allowHWAccel.click();
  contentProcessCount.value = 7;
  contentProcessCount.doCommand();
  useRecommendedPerformanceSettings.click();

  is(
    Services.prefs.getBoolPref(
      "browser.preferences.defaultPerformanceSettings.enabled"
    ),
    true,
    "pref value should be true before clicking on checkbox"
  );
  ok(
    useRecommendedPerformanceSettings.checked,
    "checkbox should be checked before clicking on checkbox"
  );
  is(
    performanceSettings.hidden,
    true,
    "performance settings section should be still shown"
  );

  Services.prefs.setBoolPref(
    "browser.preferences.defaultPerformanceSettings.enabled",
    true
  );
  BrowserTestUtils.removeTab(gBrowser.selectedTab);
});

add_task(async function () {
  let prefs = await openPreferencesViaOpenPreferencesAPI("paneGeneral", {
    leaveOpen: true,
  });
  is(prefs.selectedPane, "paneGeneral", "General pane was selected");

  let doc = gBrowser.contentDocument;
  let performanceSettings = doc.querySelector("#performanceSettings");

  is(
    performanceSettings.hidden,
    true,
    "performance settings section should not be shown"
  );

  Services.prefs.setBoolPref(
    "browser.preferences.defaultPerformanceSettings.enabled",
    false
  );

  is(
    performanceSettings.hidden,
    false,
    "performance settings section should be shown"
  );

  Services.prefs.setBoolPref(
    "browser.preferences.defaultPerformanceSettings.enabled",
    true
  );
  BrowserTestUtils.removeTab(gBrowser.selectedTab);
});

add_task(async function () {
  Services.prefs.setIntPref("dom.ipc.processCount", 7);

  let prefs = await openPreferencesViaOpenPreferencesAPI("paneGeneral", {
    leaveOpen: true,
  });
  is(prefs.selectedPane, "paneGeneral", "General pane was selected");

  let doc = gBrowser.contentDocument;

  let performanceSettings = doc.querySelector("#performanceSettings");
  is(
    performanceSettings.hidden,
    false,
    "performance settings section should be shown"
  );

  let contentProcessCount = doc.querySelector("#contentProcessCount");
  is(
    Services.prefs.getIntPref("dom.ipc.processCount"),
    7,
    "pref value should be 7"
  );
  is(contentProcessCount.selectedItem.value, "7", "selected item should be 7");

  Services.prefs.setBoolPref(
    "browser.preferences.defaultPerformanceSettings.enabled",
    true
  );
  BrowserTestUtils.removeTab(gBrowser.selectedTab);
});

add_task(async function () {
  Services.prefs.setBoolPref("layers.acceleration.disabled", true);

  let prefs = await openPreferencesViaOpenPreferencesAPI("paneGeneral", {
    leaveOpen: true,
  });
  is(prefs.selectedPane, "paneGeneral", "General pane was selected");

  let doc = gBrowser.contentDocument;

  let performanceSettings = doc.querySelector("#performanceSettings");
  is(
    performanceSettings.hidden,
    false,
    "performance settings section should be shown"
  );

  let allowHWAccel = doc.querySelector("#allowHWAccel");
  is(
    Services.prefs.getBoolPref("layers.acceleration.disabled"),
    true,
    "pref value is false"
  );
  ok(!allowHWAccel.checked, "checkbox should not be checked");

  Services.prefs.setBoolPref(
    "browser.preferences.defaultPerformanceSettings.enabled",
    true
  );
  BrowserTestUtils.removeTab(gBrowser.selectedTab);
});