Skip to content

Commit e47c8a9

Browse files
Bug 1972647 - Don't hide Firefox Labs when studies or telemetry are disabled r=mkaply,akulyk
The UserMessaging:FirefoxLabs policy no longer has to set the "browser.preferences.experimental" pref because whether or not the Firefox Labs pane is registered is determined by the "FirefoxLabs" policy feature. Differential Revision: https://phabricator.services.mozilla.com/D269922
1 parent b8c619f commit e47c8a9

8 files changed

Lines changed: 31 additions & 212 deletions

‎browser/app/profile/firefox.js‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,8 +1347,6 @@ pref("accessibility.typeaheadfind.timeout", 5000);
13471347
pref("accessibility.typeaheadfind.linksonly", false);
13481348
pref("accessibility.typeaheadfind.flashBar", 1);
13491349

1350-
// Whether we can show the "Firefox Labs" section.
1351-
pref("browser.preferences.experimental", true);
13521350
// Whether we had to hide the "Firefox Labs" section because it would be empty.
13531351
pref("browser.preferences.experimental.hidden", false);
13541352
// Whether we show the "More from Mozilla" section.

‎browser/components/enterprisepolicies/Policies.sys.mjs‎

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2923,16 +2923,8 @@ export var Policies = {
29232923
param.Locked
29242924
);
29252925
}
2926-
if ("FirefoxLabs" in param) {
2927-
if (!param.FirefoxLabs) {
2928-
manager.disallowFeature("FirefoxLabs");
2929-
}
2930-
2931-
PoliciesUtils.setDefaultPref(
2932-
"browser.preferences.experimental",
2933-
param.FirefoxLabs,
2934-
param.Locked
2935-
);
2926+
if ("FirefoxLabs" in param && !param.FirefoxLabs) {
2927+
manager.disallowFeature("FirefoxLabs");
29362928
}
29372929
},
29382930
},

‎browser/components/preferences/experimental.js‎

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ const gExperimentalPane = {
2626

2727
this._onCheckboxChanged = this._onCheckboxChanged.bind(this);
2828
this._onNimbusUpdate = this._onNimbusUpdate.bind(this);
29-
this._onStudiesEnabledChanged = this._onStudiesEnabledChanged.bind(this);
3029
this._resetAllFeatures = this._resetAllFeatures.bind(this);
3130

3231
setEventListener(
@@ -35,10 +34,6 @@ const gExperimentalPane = {
3534
this._resetAllFeatures
3635
);
3736

38-
Services.obs.addObserver(
39-
this._onStudiesEnabledChanged,
40-
ExperimentAPI.STUDIES_ENABLED_CHANGED
41-
);
4237
window.addEventListener("unload", () => this._removeObservers());
4338

4439
await this._maybeRenderLabsRecipes();
@@ -169,24 +164,8 @@ const gExperimentalPane = {
169164
}
170165
},
171166

172-
async _onStudiesEnabledChanged() {
173-
const studiesEnabled = ExperimentAPI.studiesEnabled;
174-
175-
if (studiesEnabled) {
176-
await this._maybeRenderLabsRecipes();
177-
} else {
178-
this._setCategoryVisibility(true);
179-
this._removeLabsRecipes();
180-
this._firefoxLabs = null;
181-
}
182-
},
183-
184167
_removeObservers() {
185168
ExperimentAPI.manager.store.off("update", this._onNimbusUpdate);
186-
Services.obs.removeObserver(
187-
this._onStudiesEnabledChanged,
188-
ExperimentAPI.STUDIES_ENABLED_CHANGED
189-
);
190169
},
191170

192171
// Reset the features to their default values

‎browser/components/preferences/preferences.js‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ ChromeUtils.defineESModuleGetters(this, {
8181
ContextualIdentityService:
8282
"resource://gre/modules/ContextualIdentityService.sys.mjs",
8383
DownloadUtils: "resource://gre/modules/DownloadUtils.sys.mjs",
84+
ExperimentAPI: "resource://nimbus/ExperimentAPI.sys.mjs",
8485
ExtensionPreferencesManager:
8586
"resource://gre/modules/ExtensionPreferencesManager.sys.mjs",
8687
ExtensionSettingsStore:
@@ -242,16 +243,17 @@ function init_all() {
242243
if (Services.prefs.getBoolPref("browser.translations.newSettingsUI.enable")) {
243244
register_module("paneTranslations", gTranslationsPane);
244245
}
245-
if (Services.prefs.getBoolPref("browser.preferences.experimental")) {
246+
if (ExperimentAPI.labsEnabled) {
246247
// Set hidden based on previous load's hidden value or if Nimbus is
247248
// disabled.
248249
document.getElementById("category-experimental").hidden =
249-
!ExperimentAPI.studiesEnabled ||
250250
Services.prefs.getBoolPref(
251251
"browser.preferences.experimental.hidden",
252252
false
253253
);
254254
register_module("paneExperimental", gExperimentalPane);
255+
} else {
256+
document.getElementById("category-experimental").hidden = true;
255257
}
256258

257259
NimbusFeatures.moreFromMozilla.recordExposureEvent({ once: true });

‎browser/components/preferences/tests/browser_experimental_features.js‎

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,6 @@ add_setup(async function setup() {
88
registerCleanupFunction(cleanup);
99
});
1010

11-
add_task(async function testPrefRequired() {
12-
await SpecialPowers.pushPrefEnv({
13-
set: [["browser.preferences.experimental", false]],
14-
});
15-
16-
await openPreferencesViaOpenPreferencesAPI("paneHome", { leaveOpen: true });
17-
let doc = gBrowser.contentDocument;
18-
19-
let experimentalCategory = doc.getElementById("category-experimental");
20-
ok(experimentalCategory, "The category exists");
21-
ok(experimentalCategory.hidden, "The category is hidden");
22-
23-
BrowserTestUtils.removeTab(gBrowser.selectedTab);
24-
25-
await SpecialPowers.popPrefEnv();
26-
});
27-
2811
add_task(async function testCanOpenWithPref() {
2912
await SpecialPowers.pushPrefEnv({
3013
set: [["browser.preferences.experimental", true]],
@@ -58,10 +41,6 @@ add_task(async function testCanOpenWithPref() {
5841
});
5942

6043
add_task(async function testSearchFindsExperiments() {
61-
await SpecialPowers.pushPrefEnv({
62-
set: [["browser.preferences.experimental", true]],
63-
});
64-
6544
await openPreferencesViaOpenPreferencesAPI("paneHome", { leaveOpen: true });
6645
let doc = gBrowser.contentDocument;
6746

@@ -80,6 +59,4 @@ add_task(async function testSearchFindsExperiments() {
8059
);
8160

8261
BrowserTestUtils.removeTab(gBrowser.selectedTab);
83-
84-
await SpecialPowers.popPrefEnv();
8562
});

‎browser/components/preferences/tests/browser_experimental_features_filter.js‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,6 @@ add_task(async function testFilterFeatures() {
3636
];
3737
const cleanup = await setupLabsTest(recipes);
3838

39-
await SpecialPowers.pushPrefEnv({
40-
set: [["browser.preferences.experimental", true]],
41-
});
42-
4339
await BrowserTestUtils.openNewForegroundTab(
4440
gBrowser,
4541
"about:preferences#paneExperimental"

‎browser/components/preferences/tests/browser_experimental_features_hidden_when_not_public.js‎

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@
66
add_task(async function testNonPublicFeaturesShouldntGetDisplayed() {
77
const cleanup = await setupLabsTest();
88

9-
await SpecialPowers.pushPrefEnv({
10-
set: [["browser.preferences.experimental", true]],
11-
});
12-
139
await BrowserTestUtils.openNewForegroundTab(
1410
gBrowser,
1511
"about:preferences#paneExperimental"
@@ -42,18 +38,14 @@ add_task(async function testNonPublicFeaturesShouldntGetDisplayed() {
4238
BrowserTestUtils.removeTab(gBrowser.selectedTab);
4339

4440
await cleanup();
45-
await SpecialPowers.popPrefEnv();
4641
});
4742

4843
add_task(async function testNonPublicFeaturesShouldntGetDisplayed() {
4944
// Only recipes that do not match targeting or bucketing
5045
const cleanup = await setupLabsTest(DEFAULT_LABS_RECIPES.slice(2));
5146

5247
await SpecialPowers.pushPrefEnv({
53-
set: [
54-
["browser.preferences.experimental", true],
55-
["browser.preferences.experimental.hidden", false],
56-
],
48+
set: [["browser.preferences.experimental.hidden", false]],
5749
});
5850

5951
await BrowserTestUtils.openNewForegroundTab(

‎browser/components/preferences/tests/browser_experimental_features_studies_disabled.js‎

Lines changed: 24 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,20 @@
33

44
"use strict";
55

6-
add_task(async function testHiddenWhenStudiesDisabled() {
6+
const { EnterprisePolicyTesting } = ChromeUtils.importESModule(
7+
"resource://testing-common/EnterprisePolicyTesting.sys.mjs"
8+
);
9+
10+
add_task(async function testHiddenWhenLabsDisabled() {
711
const cleanup = await setupLabsTest();
812
await SpecialPowers.pushPrefEnv({
9-
set: [
10-
["browser.preferences.experimental", true],
11-
["browser.preferences.experimental.hidden", false],
12-
],
13+
set: [["browser.preferences.experimental.hidden", false]],
14+
});
15+
16+
await EnterprisePolicyTesting.setupPolicyEngineWithJson({
17+
policies: {
18+
UserMessaging: { FirefoxLabs: false },
19+
},
1320
});
1421

1522
await BrowserTestUtils.openNewForegroundTab(
@@ -19,151 +26,27 @@ add_task(async function testHiddenWhenStudiesDisabled() {
1926

2027
const doc = gBrowser.contentDocument;
2128

22-
await waitForExperimentalFeaturesShown(doc);
23-
24-
const enrollPromises = [
25-
promiseNimbusStoreUpdate("nimbus-qa-1", true),
26-
promiseNimbusStoreUpdate("nimbus-qa-2", true),
27-
];
28-
29-
await enrollByClick(doc.getElementById("nimbus-qa-1"), true);
30-
await enrollByClick(doc.getElementById("nimbus-qa-2"), true);
31-
32-
await enrollPromises;
33-
34-
const unenrollPromises = [
35-
promiseNimbusStoreUpdate("nimbus-qa-1", false),
36-
promiseNimbusStoreUpdate("nimbus-qa-2", false),
37-
];
38-
39-
// Disabling studies should remove the experimental pane.
40-
await SpecialPowers.pushPrefEnv({
41-
set: [["app.shield.optoutstudies.enabled", false]],
42-
});
43-
44-
await waitForExperimentalFeaturesHidden(doc);
45-
await unenrollPromises;
46-
47-
ok(
48-
!ExperimentAPI._manager.store.get("nimbus-qa-1")?.active,
49-
"Should unenroll from nimbus-qa-1"
50-
);
51-
ok(
52-
!ExperimentAPI._manager.store.get("nimbus-qa-2")?.active,
53-
"Should unenroll from nimbus-qa-2"
29+
await TestUtils.waitForCondition(
30+
() => doc.getElementById("category-experimental").hidden,
31+
"Wait for Experimental Features section label to become hidden"
5432
);
5533

56-
// Re-enabling studies should re-add it.
57-
await SpecialPowers.popPrefEnv();
58-
await waitForExperimentalFeaturesShown(doc);
59-
60-
// Navigate back to the experimental tab.
61-
EventUtils.synthesizeMouseAtCenter(
62-
doc.getElementById("category-experimental"),
63-
{},
64-
gBrowser.contentWindow
34+
is(
35+
doc.getElementById("pane-experimental-featureGates"),
36+
null,
37+
"Experimental Features section not added to the DOM"
6538
);
6639

67-
await waitForPageFlush();
68-
6940
is(
7041
doc.querySelector(".category[selected]").id,
71-
"category-experimental",
72-
"Experimental category selected"
73-
);
74-
75-
ok(
76-
!doc.getElementById("nimbus-qa-1").checked,
77-
"nimbus-qa-1 checkbox unchecked"
78-
);
79-
ok(
80-
!doc.getElementById("nimbus-qa-2").checked,
81-
"nimbus-qa-2 checkbox unchecked"
82-
);
83-
84-
await enrollByClick(doc.getElementById("nimbus-qa-1"), true);
85-
await enrollByClick(doc.getElementById("nimbus-qa-2"), true);
86-
87-
// Likewise, disabling telemetry should remove the experimental pane.
88-
await SpecialPowers.pushPrefEnv({
89-
set: [["datareporting.healthreport.uploadEnabled", false]],
90-
});
91-
92-
await waitForExperimentalFeaturesHidden(doc);
93-
94-
ok(
95-
!ExperimentAPI._manager.store.get("nimbus-qa-1")?.active,
96-
"Should unenroll from nimbus-qa-1"
97-
);
98-
ok(
99-
!ExperimentAPI._manager.store.get("nimbus-qa-2")?.active,
100-
"Should unenroll from nimbus-qa-2"
101-
);
102-
103-
await SpecialPowers.popPrefEnv();
104-
105-
// Re-enabling studies should re-add it.
106-
await waitForExperimentalFeaturesShown(doc);
107-
108-
ok(
109-
!doc.getElementById("nimbus-qa-1").checked,
110-
"nimbus-qa-1 checkbox unchecked"
111-
);
112-
ok(
113-
!doc.getElementById("nimbus-qa-2").checked,
114-
"nimbus-qa-2 checkbox unchecked"
42+
"category-general",
43+
"When the experimental features section is hidden, navigating to #experimental should redirect to #general"
11544
);
11645

11746
BrowserTestUtils.removeTab(gBrowser.selectedTab);
11847

119-
await cleanup();
12048
await SpecialPowers.popPrefEnv();
121-
});
122-
123-
async function waitForExperimentalFeaturesShown(doc) {
124-
await TestUtils.waitForCondition(
125-
() => doc.querySelector(".featureGate"),
126-
"Wait for features to be added to the DOM"
127-
);
128-
129-
ok(
130-
!doc.getElementById("category-experimental").hidden,
131-
"Experimental Features section should not be hidden"
132-
);
133-
134-
ok(
135-
!Services.prefs.getBoolPref("browser.preferences.experimental.hidden"),
136-
"Hidden pref should be false"
137-
);
138-
}
139-
140-
async function waitForExperimentalFeaturesHidden(doc) {
141-
await TestUtils.waitForCondition(
142-
() => doc.getElementById("category-experimental").hidden,
143-
"Wait for Experimental Features section to get hidden"
144-
);
145-
146-
ok(
147-
doc.getElementById("category-experimental").hidden,
148-
"Experimental Features section should be hidden when all features are hidden"
149-
);
150-
ok(
151-
doc.getElementById("firefoxExperimentalCategory").hidden,
152-
"Experimental Features header should be hidden when all features are hidden"
153-
);
154-
is(
155-
doc.querySelector(".category[selected]").id,
156-
"category-general",
157-
"When the experimental features section is hidden, navigating to #experimental should redirect to #general"
158-
);
159-
ok(
160-
Services.prefs.getBoolPref("browser.preferences.experimental.hidden"),
161-
"Hidden pref should be true"
162-
);
163-
}
49+
await cleanup();
16450

165-
function waitForPageFlush() {
166-
return new Promise(resolve =>
167-
requestAnimationFrame(() => requestAnimationFrame(resolve))
168-
);
169-
}
51+
await EnterprisePolicyTesting.setupPolicyEngineWithJson({});
52+
});

0 commit comments

Comments
 (0)