Skip to content

Commit 71c340f

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

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: 34 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 = () => {
@@ -398,6 +419,9 @@ this.browserSettings = class extends ExtensionAPI {
398419
});
399420
}
400421

422+
const verticalTabsSettingsAPI = makeSettingsAPI("verticalTabs");
423+
const verticalTabsSet = verticalTabsSettingsAPI.set;
424+
401425
return {
402426
browserSettings: {
403427
allowPopupsForUserEvents: makeSettingsAPI("allowPopupsForUserEvents"),
@@ -579,6 +603,16 @@ this.browserSettings = class extends ExtensionAPI {
579603
);
580604
},
581605
}),
606+
verticalTabs: Object.assign(verticalTabsSettingsAPI, {
607+
set: details => {
608+
if (typeof details.value !== "boolean") {
609+
throw new ExtensionError(
610+
`${details.value} is not a valid value for verticalTabs.`
611+
);
612+
}
613+
return verticalTabsSet(details);
614+
},
615+
}),
582616
colorManagement: {
583617
mode: makeSettingsAPI("colorManagement.mode"),
584618
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: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ add_task(async function test_browser_settings() {
4242
"browser.display.use_document_fonts": 1,
4343
"browser.zoom.full": true,
4444
"browser.zoom.siteSpecific": true,
45+
"sidebar.verticalTabs": false,
4546
};
4647

4748
async function background() {
@@ -317,6 +318,16 @@ add_task(async function test_browser_settings() {
317318
"gfx.webrender.compositor": true,
318319
});
319320

321+
if (AppConstants.platform !== "android") {
322+
await testSetting("verticalTabs", false, {
323+
"sidebar.verticalTabs": false,
324+
});
325+
326+
await testSetting("verticalTabs", true, {
327+
"sidebar.verticalTabs": true,
328+
});
329+
}
330+
320331
await extension.unload();
321332
await promiseShutdownManager();
322333
});
@@ -377,6 +388,18 @@ add_task(async function test_bad_value() {
377388
"zoomSiteSpecific.set rejects with an invalid value."
378389
);
379390

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

@@ -416,6 +439,30 @@ add_task(async function test_bad_value_android() {
416439
"closeTabsByDoubleClick.clear rejects on Android."
417440
);
418441

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

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)