Skip to content

Commit b496d88

Browse files
committed
Bug 1789727 - Default to the component implementation of Screenshots for nightly builds. r=extension-reviewers,sfoster,robwu,chutten
* Flip the component pref to true by default for nightly builds only * Move the pref check and initialization to a startup idle task * And be a bit smarter about when we get and disable the addon * Fix a bug where we try to communicate with the overlay after the window actor is destroyed when the component pref gets flipped off during use Differential Revision: https://phabricator.services.mozilla.com/D196888
1 parent 1426e39 commit b496d88

File tree

7 files changed

+107
-53
lines changed

7 files changed

+107
-53
lines changed

browser/app/profile/firefox.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2404,8 +2404,12 @@ pref("browser.suppress_first_window_animation", true);
24042404
// Preference that allows individual users to disable Screenshots.
24052405
pref("extensions.screenshots.disabled", false);
24062406

2407-
// Preference that determines whether Screenshots is opened as a dedicated browser component
2408-
pref("screenshots.browser.component.enabled", false);
2407+
// Preference that determines whether Screenshots uses the dedicated browser component
2408+
#ifdef NIGHTLY_BUILD
2409+
pref("screenshots.browser.component.enabled", true);
2410+
#else
2411+
pref("screenshots.browser.component.enabled", false);
2412+
#endif
24092413

24102414
// Preference that determines what button to focus
24112415
pref("screenshots.browser.component.last-saved-method", "download");

browser/base/content/test/performance/browser_startup_content_mainthreadio.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,13 @@ const processes = {
152152
condition: WIN,
153153
stat: 1,
154154
},
155+
{
156+
// We should remove this in bug 1882427
157+
path: "*screenshots@mozilla.org.xpi",
158+
condition: true,
159+
ignoreIfUnused: true,
160+
close: 1,
161+
},
155162
],
156163
};
157164

browser/components/BrowserGlue.sys.mjs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2144,26 +2144,31 @@ BrowserGlue.prototype = {
21442144
const COMPONENT_PREF = "screenshots.browser.component.enabled";
21452145
const ID = "screenshots@mozilla.org";
21462146
const _checkScreenshotsPref = async () => {
2147-
let addon = await lazy.AddonManager.getAddonByID(ID);
2148-
if (!addon) {
2149-
return;
2150-
}
21512147
let screenshotsDisabled = Services.prefs.getBoolPref(
21522148
SCREENSHOTS_PREF,
21532149
false
21542150
);
2155-
let componentEnabled = Services.prefs.getBoolPref(COMPONENT_PREF, false);
2151+
let componentEnabled = Services.prefs.getBoolPref(COMPONENT_PREF, true);
2152+
2153+
let screenshotsAddon = await lazy.AddonManager.getAddonByID(ID);
2154+
21562155
if (screenshotsDisabled) {
21572156
if (componentEnabled) {
21582157
lazy.ScreenshotsUtils.uninitialize();
2159-
} else {
2160-
await addon.disable({ allowSystemAddons: true });
2158+
} else if (screenshotsAddon?.isActive) {
2159+
await screenshotsAddon.disable({ allowSystemAddons: true });
21612160
}
21622161
} else if (componentEnabled) {
21632162
lazy.ScreenshotsUtils.initialize();
2164-
await addon.disable({ allowSystemAddons: true });
2163+
if (screenshotsAddon?.isActive) {
2164+
await screenshotsAddon.disable({ allowSystemAddons: true });
2165+
}
21652166
} else {
2166-
await addon.enable({ allowSystemAddons: true });
2167+
try {
2168+
await screenshotsAddon.enable({ allowSystemAddons: true });
2169+
} catch (ex) {
2170+
console.error(`Error trying to enable screenshots extension: ${ex}`);
2171+
}
21672172
lazy.ScreenshotsUtils.uninitialize();
21682173
}
21692174
};
@@ -2434,7 +2439,6 @@ BrowserGlue.prototype = {
24342439
LATE_TASKS_IDLE_TIME_SEC
24352440
);
24362441

2437-
this._monitorScreenshotsPref();
24382442
this._monitorWebcompatReporterPref();
24392443
this._monitorHTTPSOnlyPref();
24402444
this._monitorIonPref();
@@ -2787,13 +2791,9 @@ BrowserGlue.prototype = {
27872791
},
27882792

27892793
{
2790-
name: "ScreenshotsUtils.initialize",
2794+
name: "BrowserGlue._monitorScreenshotsPref",
27912795
task: () => {
2792-
if (
2793-
Services.prefs.getBoolPref("screenshots.browser.component.enabled")
2794-
) {
2795-
lazy.ScreenshotsUtils.initialize();
2796-
}
2796+
this._monitorScreenshotsPref();
27972797
},
27982798
},
27992799

browser/components/screenshots/ScreenshotsUtils.sys.mjs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,12 @@ export var ScreenshotsUtils = {
544544
* @param browser The current browser.
545545
*/
546546
closeOverlay(browser, options = {}) {
547-
let actor = this.getActor(browser);
547+
// If the actor has been unregistered (e.g. if the component enabled pref is flipped false)
548+
// its possible getActor will throw an exception. That's ok.
549+
let actor;
550+
try {
551+
actor = this.getActor(browser);
552+
} catch (ex) {}
548553
actor?.sendAsyncMessage("Screenshots:HideOverlay", options);
549554

550555
if (this.browserToScreenshotsState.has(browser)) {

browser/components/screenshots/tests/browser/browser_screenshots_test_toggle_pref.js

Lines changed: 64 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const { sinon } = ChromeUtils.importESModule(
99

1010
ChromeUtils.defineESModuleGetters(this, {
1111
ScreenshotsUtils: "resource:///modules/ScreenshotsUtils.sys.mjs",
12+
AddonManager: "resource://gre/modules/AddonManager.sys.mjs",
1213
});
1314
ChromeUtils.defineLazyGetter(this, "ExtensionManagement", () => {
1415
const { Management } = ChromeUtils.importESModule(
@@ -17,7 +18,11 @@ ChromeUtils.defineLazyGetter(this, "ExtensionManagement", () => {
1718
return Management;
1819
});
1920

20-
add_task(async function test() {
21+
const COMPONENT_PREF = "screenshots.browser.component.enabled";
22+
const SCREENSHOTS_PREF = "extensions.screenshots.disabled";
23+
const SCREENSHOT_EXTENSION = "screenshots@mozilla.org";
24+
25+
add_task(async function test_toggling_screenshots_pref() {
2126
let observerSpy = sinon.spy();
2227
let notifierSpy = sinon.spy();
2328

@@ -31,13 +36,24 @@ add_task(async function test() {
3136
ScreenshotsUtils.notify.wrappedMethod.apply(this, arguments);
3237
});
3338

39+
// wait for startup idle tasks to complete
40+
await new Promise(resolve => ChromeUtils.idleDispatch(resolve));
41+
ok(Services.prefs.getBoolPref(COMPONENT_PREF), "Component enabled");
42+
ok(!Services.prefs.getBoolPref(SCREENSHOTS_PREF), "Screenshots enabled");
43+
44+
let addon = await AddonManager.getAddonByID(SCREENSHOT_EXTENSION);
45+
await BrowserTestUtils.waitForCondition(
46+
() => !addon.isActive,
47+
"The extension is not active when the component is prefd on"
48+
);
49+
3450
await BrowserTestUtils.withNewTab(
3551
{
3652
gBrowser,
3753
url: SHORT_TEST_PAGE,
3854
},
3955
async browser => {
40-
function awaitExtensionEvent(eventName, id) {
56+
function extensionEventPromise(eventName, id) {
4157
return new Promise(resolve => {
4258
let listener = (_eventName, ...args) => {
4359
let extension = args[0];
@@ -49,9 +65,21 @@ add_task(async function test() {
4965
ExtensionManagement.on(eventName, listener);
5066
});
5167
}
52-
const SCREENSHOT_EXTENSION = "screenshots@mozilla.org";
5368

5469
let helper = new ScreenshotsHelper(browser);
70+
ok(
71+
addon.userDisabled,
72+
"The extension is disabled when the component is prefd on"
73+
);
74+
ok(
75+
!addon.isActive,
76+
"The extension is not initially active when the component is prefd on"
77+
);
78+
await BrowserTestUtils.waitForCondition(
79+
() => ScreenshotsUtils.initialized,
80+
"The component is initialized"
81+
);
82+
ok(ScreenshotsUtils.initialized, "The component is initialized");
5583

5684
ok(observerSpy.notCalled, "Observer not called");
5785
helper.triggerUIFromToolbar();
@@ -80,12 +108,20 @@ add_task(async function test() {
80108

81109
Assert.equal(observerSpy.callCount, 3, "Observer function called thrice");
82110

83-
const COMPONENT_PREF = "screenshots.browser.component.enabled";
84-
await SpecialPowers.pushPrefEnv({
85-
set: [[COMPONENT_PREF, false]],
86-
});
111+
let extensionReadyPromise = extensionEventPromise(
112+
"ready",
113+
SCREENSHOT_EXTENSION
114+
);
115+
Services.prefs.setBoolPref(COMPONENT_PREF, false);
87116
ok(!Services.prefs.getBoolPref(COMPONENT_PREF), "Extension enabled");
88-
await awaitExtensionEvent("ready", SCREENSHOT_EXTENSION);
117+
118+
info("Waiting for the extension ready event");
119+
await extensionReadyPromise;
120+
await BrowserTestUtils.waitForCondition(
121+
() => !addon.userDisabled,
122+
"The extension gets un-disabled when the component is prefd off"
123+
);
124+
ok(addon.isActive, "Extension is active");
89125

90126
helper.triggerUIFromToolbar();
91127
Assert.equal(
@@ -94,6 +130,7 @@ add_task(async function test() {
94130
"Observer function still called thrice"
95131
);
96132

133+
info("Waiting for the extensions overlay");
97134
await SpecialPowers.spawn(
98135
browser,
99136
["#firefox-screenshots-preselection-iframe"],
@@ -115,6 +152,7 @@ add_task(async function test() {
115152
}
116153
);
117154

155+
info("Waiting for the extensions overlay");
118156
helper.triggerUIFromToolbar();
119157
await SpecialPowers.spawn(
120158
browser,
@@ -202,9 +240,7 @@ add_task(async function test() {
202240
"screenshots-component-initialized"
203241
);
204242

205-
await SpecialPowers.pushPrefEnv({
206-
set: [[COMPONENT_PREF, true]],
207-
});
243+
Services.prefs.setBoolPref(COMPONENT_PREF, true);
208244
ok(Services.prefs.getBoolPref(COMPONENT_PREF), "Component enabled");
209245
// Needed for component to initialize
210246
await componentReady;
@@ -215,12 +251,6 @@ add_task(async function test() {
215251
4,
216252
"Observer function called four times"
217253
);
218-
219-
const SCREENSHOTS_PREF = "extensions.screenshots.disabled";
220-
await SpecialPowers.pushPrefEnv({
221-
set: [[SCREENSHOTS_PREF, true]],
222-
});
223-
ok(Services.prefs.getBoolPref(SCREENSHOTS_PREF), "Screenshots disabled");
224254
}
225255
);
226256

@@ -230,7 +260,9 @@ add_task(async function test() {
230260
url: SHORT_TEST_PAGE,
231261
},
232262
async browser => {
233-
const SCREENSHOTS_PREF = "extensions.screenshots.disabled";
263+
Services.prefs.setBoolPref(SCREENSHOTS_PREF, true);
264+
Services.prefs.setBoolPref(COMPONENT_PREF, true);
265+
234266
ok(Services.prefs.getBoolPref(SCREENSHOTS_PREF), "Screenshots disabled");
235267

236268
ok(
@@ -255,22 +287,23 @@ add_task(async function test() {
255287
menu.hidePopup();
256288
await popuphidden;
257289

258-
await SpecialPowers.pushPrefEnv({
259-
set: [[SCREENSHOTS_PREF, false]],
260-
});
261-
ok(!Services.prefs.getBoolPref(SCREENSHOTS_PREF), "Screenshots enabled");
262-
}
263-
);
290+
let componentReady = TestUtils.topicObserved(
291+
"screenshots-component-initialized"
292+
);
293+
294+
Services.prefs.setBoolPref(SCREENSHOTS_PREF, false);
264295

265-
await BrowserTestUtils.withNewTab(
266-
{
267-
gBrowser,
268-
url: SHORT_TEST_PAGE,
269-
},
270-
async browser => {
271-
const SCREENSHOTS_PREF = "extensions.screenshots.disabled";
272296
ok(!Services.prefs.getBoolPref(SCREENSHOTS_PREF), "Screenshots enabled");
273297

298+
await componentReady;
299+
300+
ok(ScreenshotsUtils.initialized, "The component is initialized");
301+
302+
ok(
303+
!document.getElementById("screenshot-button").disabled,
304+
"Toolbar button is enabled"
305+
);
306+
274307
let helper = new ScreenshotsHelper(browser);
275308

276309
helper.triggerUIFromToolbar();
@@ -284,6 +317,4 @@ add_task(async function test() {
284317

285318
observerStub.restore();
286319
notifierStub.restore();
287-
288-
await SpecialPowers.popPrefEnv();
289320
});

browser/extensions/screenshots/test/browser/browser.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
[DEFAULT]
2-
prefs = ["extensions.screenshots.disabled=false",] # The Screenshots extension is disabled by default in Mochitests. We re-enable it here, since it's a more realistic configuration.
2+
# The Screenshots extension is disabled by default in Mochitests. We re-enable it here, since it's a more realistic configuration.
3+
prefs = [
4+
"extensions.screenshots.disabled=false",
5+
"screenshots.browser.component.enabled=false",
6+
]
37

48
["browser_screenshot_button.js"]
59

toolkit/components/telemetry/tests/marionette/harness/telemetry_harness/runner.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ def __init__(self, **kwargs):
5252
# Disable Normandy a little harder (bug 1608807).
5353
# This should also disable Nimbus.
5454
"app.shield.optoutstudies.enabled": False,
55+
# Bug 1789727: Keep the screenshots extension disabled to avoid
56+
# disabling the addon resulting in extra subsessions
57+
"screenshots.browser.component.enabled": False,
5558
}
5659
)
5760

0 commit comments

Comments
 (0)