Commit bd7797ce authored by Christina Lin's avatar Christina Lin Committed by tjovanovic@mozilla.com
Browse files

Bug 1946600 - Add browserSetting verticalTabs. r=zombie,webidl,smaug

parent 63543399
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -55,6 +55,8 @@ skip-if = [

["browser_ExtensionControlledPopup.js"]

["browser_browserSetting_vertical_tabs.js"]

["browser_ext_action_popup_allowed_urls.js"]

["browser_ext_activeScript.js"]
+111 −0
Original line number Diff line number Diff line
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

/**
 * This file tests the behaviour of the browserSetting verticalTabs against
 * sidebar verticalTabs.
 */
"use strict";

const SIDEBAR_VERTICAL_TABS = "sidebar.verticalTabs";

const isSidebarVerticalTabs = () => {
  const isEnabled = Services.prefs.getBoolPref(SIDEBAR_VERTICAL_TABS);
  Assert.equal(
    isEnabled,
    CustomizableUI.verticalTabsEnabled,
    "Preference is synced with CustomizableUI bool."
  );
  return isEnabled;
};

add_task(async function test_multiple_extensions_overriding_home_page() {
  function background() {
    browser.test.onMessage.addListener(async (msg, value) => {
      switch (msg) {
        case "tryGet": {
          let getResult = await browser.browserSettings.verticalTabs.get({});
          browser.test.sendMessage("verticalTabsGet", getResult);
          break;
        }
        case "trySet": {
          await browser.browserSettings.verticalTabs.set({
            value,
          });
          browser.test.sendMessage("verticalTabsSet");
          break;
        }
        case "tryClear": {
          await browser.browserSettings.verticalTabs.clear({});
          browser.test.sendMessage("verticalTabsClear");
          break;
        }
      }
    });
  }

  let extObj = {
    manifest: {
      chrome_settings_overrides: {},
      permissions: ["browserSettings"],
    },
    useAddonManager: "temporary",
    background,
  };

  let ext = ExtensionTestUtils.loadExtension(extObj);
  await ext.startup();

  async function checkVerticalTabsGet(expectedValue) {
    ext.sendMessage("tryGet");
    let verticalTabsGet = await ext.awaitMessage("verticalTabsGet");
    is(
      verticalTabsGet.value,
      expectedValue,
      `verticalTabs setting returns the expected value: ${expectedValue}.`
    );
  }

  // Changes through sidebar.verticalTabs are reflected in browserSettings.verticalTabs.
  await SpecialPowers.pushPrefEnv({
    set: [[SIDEBAR_VERTICAL_TABS, false]],
  });

  await checkVerticalTabsGet(false);
  ok(!isSidebarVerticalTabs(), `expect ${SIDEBAR_VERTICAL_TABS} to be false.`);

  await SpecialPowers.pushPrefEnv({
    set: [[SIDEBAR_VERTICAL_TABS, true]],
  });

  await checkVerticalTabsGet(true);
  ok(isSidebarVerticalTabs(), `expect ${SIDEBAR_VERTICAL_TABS} to be true.`);

  await SpecialPowers.pushPrefEnv({
    set: [[SIDEBAR_VERTICAL_TABS, false]],
  });

  await checkVerticalTabsGet(false);
  ok(!isSidebarVerticalTabs(), `expect ${SIDEBAR_VERTICAL_TABS} to be false.`);

  // Changes through browserSettings.verticalTabs are reflected in sidebar.verticalTabs.
  ext.sendMessage("trySet", true);
  await ext.awaitMessage("verticalTabsSet");
  await checkVerticalTabsGet(true);
  ok(isSidebarVerticalTabs(), `expect ${SIDEBAR_VERTICAL_TABS} to be true.`);

  ext.sendMessage("trySet", false);
  await ext.awaitMessage("verticalTabsSet");
  await checkVerticalTabsGet(false);
  ok(!isSidebarVerticalTabs(), `expect ${SIDEBAR_VERTICAL_TABS} to be false.`);

  ext.sendMessage("trySet", true);
  await ext.awaitMessage("verticalTabsSet");

  ext.sendMessage("tryClear");
  await ext.awaitMessage("verticalTabsClear");
  await checkVerticalTabsGet(false);
  ok(!isSidebarVerticalTabs(), `expect ${SIDEBAR_VERTICAL_TABS} to be false.`);

  await ext.unload();
});
+3 −0
Original line number Diff line number Diff line
@@ -84,6 +84,9 @@ interface ExtensionBrowserSettings {
  [Replaceable]
  readonly attribute ExtensionSetting zoomSiteSpecific;

  [Replaceable]
  readonly attribute ExtensionSetting verticalTabs;

  // API child namespaces.

  [Replaceable, SameObject,
+35 −0
Original line number Diff line number Diff line
@@ -334,6 +334,27 @@ ExtensionPreferencesManager.addSetting("zoomSiteSpecific", {
  },
});

ExtensionPreferencesManager.addSetting("verticalTabs", {
  permission: "browserSettings",
  prefNames: ["sidebar.verticalTabs"],

  setCallback(value) {
    return { [this.prefNames[0]]: value };
  },

  getCallback() {
    return Services.prefs.getBoolPref("sidebar.verticalTabs");
  },

  validate() {
    if (AppConstants.platform == "android") {
      throw new ExtensionError(
        `android is not a supported platform for verticalTabs.`
      );
    }
  },
});

this.browserSettings = class extends ExtensionAPI {
  homePageOverrideListener(fire) {
    let listener = () => {
@@ -579,6 +600,20 @@ this.browserSettings = class extends ExtensionAPI {
            );
          },
        }),
        verticalTabs: Object.assign(makeSettingsAPI("verticalTabs"), {
          set: details => {
            if (typeof details.value !== "boolean") {
              throw new ExtensionError(
                `${details.value} is not a valid value for verticalTabs.`
              );
            }
            return ExtensionPreferencesManager.setSetting(
              extension.id,
              "verticalTabs",
              details.value
            );
          },
        }),
        colorManagement: {
          mode: makeSettingsAPI("colorManagement.mode"),
          useNativeSRGB: makeSettingsAPI("colorManagement.useNativeSRGB"),
+4 −0
Original line number Diff line number Diff line
@@ -110,6 +110,10 @@
      "zoomSiteSpecific": {
        "$ref": "types.Setting",
        "description": "This boolean setting controls whether zoom is applied on a per-site basis or to the current tab only. If privacy.resistFingerprinting is true, this setting has no effect and zoom is applied to the current tab only."
      },
      "verticalTabs": {
        "$ref": "types.Setting",
        "description": "This boolean setting controls whether vertical tabs are enabled."
      }
    }
  },
Loading