Skip to content

Commit 400988a

Browse files
chrstinalinzombie
authored andcommitted
Bug 1946600 - Add browserSetting verticalTabs. r=zombie,webidl,smaug
Differential Revision: https://phabricator.services.mozilla.com/D247436
1 parent 3ca5ad1 commit 400988a

File tree

8 files changed

+226
-1
lines changed

8 files changed

+226
-1
lines changed

browser/components/extensions/test/browser/browser.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ skip-if = [
5555

5656
["browser_ExtensionControlledPopup.js"]
5757

58+
["browser_browserSetting_vertical_tabs.js"]
59+
5860
["browser_ext_action_popup_allowed_urls.js"]
5961

6062
["browser_ext_activeScript.js"]
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
/* Any copyright is dedicated to the Public Domain.
2+
http://creativecommons.org/publicdomain/zero/1.0/ */
3+
4+
/**
5+
* This file tests the behaviour of the browserSetting verticalTabs against
6+
* sidebar verticalTabs.
7+
*/
8+
"use strict";
9+
10+
const SIDEBAR_VERTICAL_TABS = "sidebar.verticalTabs";
11+
12+
const isSidebarVerticalTabs = () => {
13+
const isEnabled = Services.prefs.getBoolPref(SIDEBAR_VERTICAL_TABS);
14+
Assert.equal(
15+
isEnabled,
16+
CustomizableUI.verticalTabsEnabled,
17+
"Preference is synced with CustomizableUI bool."
18+
);
19+
return isEnabled;
20+
};
21+
22+
add_task(async function test_browserSetting_vertical_tabs() {
23+
function background() {
24+
browser.test.onMessage.addListener(async (msg, value) => {
25+
switch (msg) {
26+
case "tryGet": {
27+
let getResult = await browser.browserSettings.verticalTabs.get({});
28+
browser.test.sendMessage("verticalTabsGet", getResult);
29+
break;
30+
}
31+
case "trySet": {
32+
await browser.browserSettings.verticalTabs.set({
33+
value,
34+
});
35+
browser.test.sendMessage("verticalTabsSet");
36+
break;
37+
}
38+
case "tryBadSet": {
39+
await browser.test.assertRejects(
40+
browser.browserSettings.verticalTabs.set({ value: 0 }),
41+
/0 is not a valid value for verticalTabs/,
42+
"verticalTabs.set rejects with an invalid value."
43+
);
44+
45+
await browser.test.assertRejects(
46+
browser.browserSettings.verticalTabs.set({ value: "bad" }),
47+
/bad is not a valid value for verticalTabs/,
48+
"verticalTabs.set rejects with an invalid value."
49+
);
50+
browser.test.sendMessage("verticalTabsBadSet");
51+
break;
52+
}
53+
case "tryClear": {
54+
await browser.browserSettings.verticalTabs.clear({});
55+
browser.test.sendMessage("verticalTabsClear");
56+
break;
57+
}
58+
}
59+
});
60+
}
61+
62+
let extObj = {
63+
manifest: {
64+
chrome_settings_overrides: {},
65+
permissions: ["browserSettings"],
66+
},
67+
useAddonManager: "temporary",
68+
background,
69+
};
70+
71+
let ext = ExtensionTestUtils.loadExtension(extObj);
72+
await ext.startup();
73+
74+
async function checkVerticalTabsGet(expectedValue) {
75+
ext.sendMessage("tryGet");
76+
let verticalTabsGet = await ext.awaitMessage("verticalTabsGet");
77+
is(
78+
verticalTabsGet.value,
79+
expectedValue,
80+
`verticalTabs setting returns the expected value: ${expectedValue}.`
81+
);
82+
}
83+
84+
// Changes through sidebar.verticalTabs are reflected in browserSettings.verticalTabs.
85+
await SpecialPowers.pushPrefEnv({
86+
set: [[SIDEBAR_VERTICAL_TABS, false]],
87+
});
88+
89+
await checkVerticalTabsGet(false);
90+
ok(!isSidebarVerticalTabs(), `expect ${SIDEBAR_VERTICAL_TABS} to be false.`);
91+
92+
await SpecialPowers.pushPrefEnv({
93+
set: [[SIDEBAR_VERTICAL_TABS, true]],
94+
});
95+
96+
await checkVerticalTabsGet(true);
97+
ok(isSidebarVerticalTabs(), `expect ${SIDEBAR_VERTICAL_TABS} to be true.`);
98+
99+
await SpecialPowers.pushPrefEnv({
100+
set: [[SIDEBAR_VERTICAL_TABS, false]],
101+
});
102+
103+
await checkVerticalTabsGet(false);
104+
ok(!isSidebarVerticalTabs(), `expect ${SIDEBAR_VERTICAL_TABS} to be false.`);
105+
106+
// Changes through browserSettings.verticalTabs are reflected in sidebar.verticalTabs.
107+
ext.sendMessage("trySet", true);
108+
await ext.awaitMessage("verticalTabsSet");
109+
await checkVerticalTabsGet(true);
110+
ok(isSidebarVerticalTabs(), `expect ${SIDEBAR_VERTICAL_TABS} to be true.`);
111+
112+
ext.sendMessage("trySet", false);
113+
await ext.awaitMessage("verticalTabsSet");
114+
await checkVerticalTabsGet(false);
115+
ok(!isSidebarVerticalTabs(), `expect ${SIDEBAR_VERTICAL_TABS} to be false.`);
116+
117+
ext.sendMessage("trySet", true);
118+
await ext.awaitMessage("verticalTabsSet");
119+
120+
ext.sendMessage("tryClear");
121+
await ext.awaitMessage("verticalTabsClear");
122+
await checkVerticalTabsGet(false);
123+
ok(!isSidebarVerticalTabs(), `expect ${SIDEBAR_VERTICAL_TABS} to be false.`);
124+
125+
// Non-boolean values cannot be set.
126+
ext.sendMessage("tryBadSet");
127+
await ext.awaitMessage("verticalTabsBadSet");
128+
129+
await ext.unload();
130+
});

dom/webidl/ExtensionBrowserSettings.webidl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ interface ExtensionBrowserSettings {
8484
[Replaceable]
8585
readonly attribute ExtensionSetting zoomSiteSpecific;
8686

87+
[Replaceable]
88+
readonly attribute ExtensionSetting verticalTabs;
89+
8790
// API child namespaces.
8891

8992
[Replaceable, SameObject,

toolkit/components/extensions/parent/ext-browserSettings.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,27 @@ ExtensionPreferencesManager.addSetting("zoomSiteSpecific", {
334334
},
335335
});
336336

337+
ExtensionPreferencesManager.addSetting("verticalTabs", {
338+
permission: "browserSettings",
339+
prefNames: ["sidebar.verticalTabs"],
340+
341+
setCallback(value) {
342+
return { [this.prefNames[0]]: value };
343+
},
344+
345+
getCallback() {
346+
return Services.prefs.getBoolPref("sidebar.verticalTabs");
347+
},
348+
349+
validate() {
350+
if (AppConstants.platform == "android") {
351+
throw new ExtensionError(
352+
`android is not a supported platform for verticalTabs.`
353+
);
354+
}
355+
},
356+
});
357+
337358
this.browserSettings = class extends ExtensionAPI {
338359
homePageOverrideListener(fire) {
339360
let listener = () => {
@@ -579,6 +600,20 @@ this.browserSettings = class extends ExtensionAPI {
579600
);
580601
},
581602
}),
603+
verticalTabs: Object.assign(makeSettingsAPI("verticalTabs"), {
604+
set: details => {
605+
if (typeof details.value !== "boolean") {
606+
throw new ExtensionError(
607+
`${details.value} is not a valid value for verticalTabs.`
608+
);
609+
}
610+
return ExtensionPreferencesManager.setSetting(
611+
extension.id,
612+
"verticalTabs",
613+
details.value
614+
);
615+
},
616+
}),
582617
colorManagement: {
583618
mode: makeSettingsAPI("colorManagement.mode"),
584619
useNativeSRGB: makeSettingsAPI("colorManagement.useNativeSRGB"),

toolkit/components/extensions/schemas/browser_settings.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,10 @@
110110
"zoomSiteSpecific": {
111111
"$ref": "types.Setting",
112112
"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."
113+
},
114+
"verticalTabs": {
115+
"$ref": "types.Setting",
116+
"description": "This boolean setting controls whether vertical tabs are enabled."
113117
}
114118
}
115119
},

toolkit/components/extensions/test/xpcshell/test_ext_browserSettings.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,16 @@ add_task(async function test_browser_settings() {
317317
"gfx.webrender.compositor": true,
318318
});
319319

320+
if (AppConstants.platform !== "android") {
321+
await testSetting("verticalTabs", false, {
322+
"sidebar.verticalTabs": false,
323+
});
324+
325+
await testSetting("verticalTabs", true, {
326+
"sidebar.verticalTabs": true,
327+
});
328+
}
329+
320330
await extension.unload();
321331
await promiseShutdownManager();
322332
});
@@ -377,6 +387,18 @@ add_task(async function test_bad_value() {
377387
"zoomSiteSpecific.set rejects with an invalid value."
378388
);
379389

390+
await browser.test.assertRejects(
391+
browser.browserSettings.verticalTabs.set({ value: 0 }),
392+
/0 is not a valid value for verticalTabs/,
393+
"verticalTabs.set rejects with an invalid value."
394+
);
395+
396+
await browser.test.assertRejects(
397+
browser.browserSettings.verticalTabs.set({ value: "bad" }),
398+
/bad is not a valid value for verticalTabs/,
399+
"verticalTabs.set rejects with an invalid value."
400+
);
401+
380402
browser.test.sendMessage("done");
381403
}
382404

@@ -416,6 +438,30 @@ add_task(async function test_bad_value_android() {
416438
"closeTabsByDoubleClick.clear rejects on Android."
417439
);
418440

441+
await browser.test.assertRejects(
442+
browser.browserSettings.verticalTabs.set({ value: true }),
443+
/android is not a supported platform for verticalTabs/,
444+
"verticalTabs.set rejects on Android."
445+
);
446+
447+
await browser.test.assertRejects(
448+
browser.browserSettings.verticalTabs.set({ value: "bad" }),
449+
/android is not a supported platform for verticalTabs/,
450+
"verticalTabs.set rejects on Android."
451+
);
452+
453+
await browser.test.assertRejects(
454+
browser.browserSettings.verticalTabs.get({}),
455+
/android is not a supported platform for verticalTabs/,
456+
"verticalTabs.get rejects on Android."
457+
);
458+
459+
await browser.test.assertRejects(
460+
browser.browserSettings.verticalTabs.clear({}),
461+
/android is not a supported platform for verticalTabs/,
462+
"verticalTabs.clear rejects on Android."
463+
);
464+
419465
browser.test.sendMessage("done");
420466
}
421467

toolkit/components/extensions/webidl-api/ExtensionBrowserSettings.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(
2525
mOpenSearchResultsInNewTabsSetting, mOpenUrlbarResultsInNewTabsSetting,
2626
mWebNotificationsDisabledSetting, mOverrideDocumentColorsSetting,
2727
mOverrideContentColorSchemeSetting, mUseDocumentFontsSetting,
28-
mZoomFullPageSetting, mZoomSiteSpecificSetting, mColorManagementNamespace);
28+
mVerticalTabsSetting, mZoomFullPageSetting, mZoomSiteSpecificSetting,
29+
mColorManagementNamespace);
2930

3031
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ExtensionBrowserSettings)
3132
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
@@ -71,6 +72,8 @@ NS_IMPL_WEBEXT_SETTING(ExtensionBrowserSettings, u"zoomFullPage"_ns,
7172
ZoomFullPage)
7273
NS_IMPL_WEBEXT_SETTING(ExtensionBrowserSettings, u"zoomSiteSpecific"_ns,
7374
ZoomSiteSpecific)
75+
NS_IMPL_WEBEXT_SETTING(ExtensionBrowserSettings, u"verticalTabs"_ns,
76+
VerticalTabs)
7477

7578
ExtensionBrowserSettings::ExtensionBrowserSettings(
7679
nsIGlobalObject* aGlobal, ExtensionBrowser* aExtensionBrowser)

toolkit/components/extensions/webidl-api/ExtensionBrowserSettings.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class ExtensionBrowserSettings final : public nsISupports,
6767
ExtensionSetting* OverrideDocumentColors();
6868
ExtensionSetting* OverrideContentColorScheme();
6969
ExtensionSetting* UseDocumentFonts();
70+
ExtensionSetting* VerticalTabs();
7071
ExtensionSetting* ZoomFullPage();
7172
ExtensionSetting* ZoomSiteSpecific();
7273

@@ -97,6 +98,7 @@ class ExtensionBrowserSettings final : public nsISupports,
9798
RefPtr<ExtensionSetting> mOverrideDocumentColorsSetting;
9899
RefPtr<ExtensionSetting> mOverrideContentColorSchemeSetting;
99100
RefPtr<ExtensionSetting> mUseDocumentFontsSetting;
101+
RefPtr<ExtensionSetting> mVerticalTabsSetting;
100102
RefPtr<ExtensionSetting> mZoomFullPageSetting;
101103
RefPtr<ExtensionSetting> mZoomSiteSpecificSetting;
102104
RefPtr<ExtensionBrowserSettingsColorManagement> mColorManagementNamespace;

0 commit comments

Comments
 (0)