fune/browser/base/content/test/tabs/browser_preloadedBrowser_zoom.js
Emilio Cobos Álvarez d36c96ab4c Bug 1612068 - Move zoom from the content viewer to the browsing context. r=nika
We need it to live in BrowsingContext instead of WindowContext, because
we need to preserve the zoom level across same-origin navigation.

It'd be nice if it only lived in the top BC, but that's not possible at
the moment because a lot of tests rely on zooming only iframes. Some of
them can be adjusted for scaling the top instead, but not sure it's
worth it's worth fixing them and moving the zoom to be top-only, as it'd
be a bunch of effort, and the complexity and overhead of propagating the
zoom is not so big.

The print-preview-specific code in nsContentViewer is from before we did
the document cloning setup, and it seems useless. I've tested print
preview scaling before and after my patch and both behave the same.

The rest is just various test changes to use the SpecialPowers APIs or
BrowsingContext as needed instead of directly poking at the content
viewer.

I named the pres context hook RecomputeBrowsingContextDependentData, as
more stuff should move there like overrideDPPX and other media emulation
shenanigans.

I also have some ideas to simplify or even remove ZoomChild and such,
but that's followup work.

Differential Revision: https://phabricator.services.mozilla.com/D71969
2020-04-22 19:32:52 +00:00

89 lines
2.4 KiB
JavaScript

"use strict";
const ZOOM_CHANGE_TOPIC = "browser-fullZoom:location-change";
/**
* Helper to check the zoom level of the preloaded browser
*/
async function checkPreloadedZoom(level, message) {
// Clear up any previous preloaded to test a fresh version
NewTabPagePreloading.removePreloadedBrowser(window);
NewTabPagePreloading.maybeCreatePreloadedBrowser(window);
// Wait for zoom handling of preloaded
const browser = gBrowser.preloadedBrowser;
await new Promise(resolve =>
Services.obs.addObserver(function obs(subject) {
if (subject === browser) {
Services.obs.removeObserver(obs, ZOOM_CHANGE_TOPIC);
resolve();
}
}, ZOOM_CHANGE_TOPIC)
);
is(browser.fullZoom.toFixed(2), level, message);
// Clean up for other tests
NewTabPagePreloading.removePreloadedBrowser(window);
}
add_task(async function test_default_zoom() {
await checkPreloadedZoom(1, "default preloaded zoom is 1");
});
/**
* Helper to open about:newtab and zoom then check matching preloaded zoom
*/
async function zoomNewTab(changeZoom, message) {
const tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
"about:newtab"
);
changeZoom();
const level = tab.linkedBrowser.fullZoom.toFixed(2);
BrowserTestUtils.removeTab(tab);
// Wait for the the update of the full-zoom content pref value, that happens
// asynchronously after changing the zoom level.
let cps2 = Cc["@mozilla.org/content-pref/service;1"].getService(
Ci.nsIContentPrefService2
);
await BrowserTestUtils.waitForCondition(() => {
return new Promise(resolve => {
cps2.getByDomainAndName(
"about:newtab",
"browser.content.full-zoom",
null,
{
handleResult(pref) {
resolve(level == pref.value);
},
handleCompletion() {
console.log("handleCompletion");
},
}
);
});
});
await checkPreloadedZoom(level, `${message}: ${level}`);
}
add_task(async function test_preloaded_zoom_out() {
await zoomNewTab(() => FullZoom.reduce(), "zoomed out applied to preloaded");
});
add_task(async function test_preloaded_zoom_in() {
await zoomNewTab(() => {
FullZoom.enlarge();
FullZoom.enlarge();
}, "zoomed in applied to preloaded");
});
add_task(async function test_preloaded_zoom_default() {
await zoomNewTab(
() => FullZoom.reduce(),
"zoomed back to default applied to preloaded"
);
});