/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; const DOC_SMALL = toDataURL("
Hello world"); const DOC_LARGE = toDataURL("
Hello world"); const MAX_WINDOW_SIZE = 10000000; function getContentDPR() { info(`Retrieve device pixel ratio in content`); return SpecialPowers.spawn( gBrowser.selectedBrowser, [], _ => content.browsingContext.overrideDPPX || content.devicePixelRatio ); } add_task(async function dimensionsSmallerThanWindow({ client }) { const { Emulation, Page } = client; await loadURL(DOC_SMALL); const { layoutViewport } = await Page.getLayoutMetrics(); const overrideSettings = { width: Math.floor(layoutViewport.clientWidth / 2), height: Math.floor(layoutViewport.clientHeight / 3), deviceScaleFactor: 1.0, }; await Emulation.setDeviceMetricsOverride(overrideSettings); await loadURL(DOC_SMALL); const updatedLayoutMetrics = await Page.getLayoutMetrics(); is( updatedLayoutMetrics.layoutViewport.clientWidth, overrideSettings.width, "Expected layout viewport width set" ); is( updatedLayoutMetrics.layoutViewport.clientHeight, overrideSettings.height, "Expected layout viewport height set" ); is( updatedLayoutMetrics.contentSize.width, overrideSettings.width, "Expected content size width set" ); is( updatedLayoutMetrics.contentSize.height, overrideSettings.height, "Expected content size height set" ); }); add_task(async function dimensionsLargerThanWindow({ client }) { const { Emulation, Page } = client; await loadURL(DOC_LARGE); const { layoutViewport } = await Page.getLayoutMetrics(); const overrideSettings = { width: layoutViewport.clientWidth * 2, height: layoutViewport.clientHeight * 2, deviceScaleFactor: 1.0, }; await Emulation.setDeviceMetricsOverride(overrideSettings); await loadURL(DOC_LARGE); const scrollbarSize = await getScrollbarSize(); const updatedLayoutMetrics = await Page.getLayoutMetrics(); is( updatedLayoutMetrics.layoutViewport.clientWidth, overrideSettings.width - scrollbarSize.width, "Expected layout viewport width set" ); is( updatedLayoutMetrics.layoutViewport.clientHeight, overrideSettings.height - scrollbarSize.height, "Expected layout viewport height set" ); }); add_task(async function noSizeChangeForSameWidthAndHeight({ client }) { const { Emulation, Page } = client; await loadURL(DOC_SMALL); const { layoutViewport } = await Page.getLayoutMetrics(); const overrideSettings = { width: layoutViewport.clientWidth, height: layoutViewport.clientHeight, deviceScaleFactor: 1.0, }; await Emulation.setDeviceMetricsOverride(overrideSettings); await loadURL(DOC_SMALL); const updatedLayoutMetrics = await Page.getLayoutMetrics(); is( updatedLayoutMetrics.layoutViewport.clientWidth, layoutViewport.clientWidth, "Expected layout viewport width set" ); is( updatedLayoutMetrics.layoutViewport.clientHeight, layoutViewport.clientHeight, "Expected layout viewport height set" ); }); add_task(async function noWidthChangeWithZeroWidth({ client }) { const { Emulation, Page } = client; await loadURL(DOC_SMALL); const { layoutViewport } = await Page.getLayoutMetrics(); const overrideSettings = { width: 0, height: Math.floor(layoutViewport.clientHeight / 3), deviceScaleFactor: 1.0, }; await Emulation.setDeviceMetricsOverride(overrideSettings); await loadURL(DOC_SMALL); const updatedLayoutMetrics = await Page.getLayoutMetrics(); is( updatedLayoutMetrics.layoutViewport.clientWidth, layoutViewport.clientWidth, "Expected layout viewport width set" ); is( updatedLayoutMetrics.layoutViewport.clientHeight, overrideSettings.height, "Expected layout viewport height set" ); }); add_task(async function noHeightChangeWithZeroHeight({ client }) { const { Emulation, Page } = client; await loadURL(DOC_SMALL); const { layoutViewport } = await Page.getLayoutMetrics(); const overrideSettings = { width: Math.floor(layoutViewport.clientWidth / 2), height: 0, deviceScaleFactor: 1.0, }; await Emulation.setDeviceMetricsOverride(overrideSettings); await loadURL(DOC_SMALL); const updatedLayoutMetrics = await Page.getLayoutMetrics(); is( updatedLayoutMetrics.layoutViewport.clientWidth, overrideSettings.width, "Expected layout viewport width set" ); is( updatedLayoutMetrics.layoutViewport.clientHeight, layoutViewport.clientHeight, "Expected layout viewport height set" ); }); add_task(async function nosizeChangeWithZeroWidthAndHeight({ client }) { const { Emulation, Page } = client; await loadURL(DOC_SMALL); const { layoutViewport } = await Page.getLayoutMetrics(); const overrideSettings = { width: 0, height: 0, deviceScaleFactor: 1.0, }; await Emulation.setDeviceMetricsOverride(overrideSettings); await loadURL(DOC_SMALL); const updatedLayoutMetrics = await Page.getLayoutMetrics(); is( updatedLayoutMetrics.layoutViewport.clientWidth, layoutViewport.clientWidth, "Expected layout viewport width set" ); is( updatedLayoutMetrics.layoutViewport.clientHeight, layoutViewport.clientHeight, "Expected layout viewport height set" ); }); add_task(async function failsWithNegativeWidth({ client }) { const { Emulation, Page } = client; await loadURL(DOC_SMALL); const { layoutViewport } = await Page.getLayoutMetrics(); const ratio = await getContentDPR(); const overrideSettings = { width: -1, height: Math.floor(layoutViewport.clientHeight / 3), deviceScaleFactor: 1.0, }; await Assert.rejects( Emulation.setDeviceMetricsOverride(overrideSettings), err => err.message.includes( "Width and height values must be positive, not greater than 10000000" ), "Negative width raised error" ); await loadURL(DOC_SMALL); const updatedLayoutMetrics = await Page.getLayoutMetrics(); is( updatedLayoutMetrics.layoutViewport.clientWidth, layoutViewport.clientWidth, "Visible layout width hasn't been changed" ); is( updatedLayoutMetrics.layoutViewport.clientHeight, layoutViewport.clientHeight, "Visible layout height hasn't been changed" ); is(await getContentDPR(), ratio, "Device pixel ratio hasn't been changed"); }); add_task(async function failsWithTooLargeWidth({ client }) { const { Emulation, Page } = client; await loadURL(DOC_SMALL); const { layoutViewport } = await Page.getLayoutMetrics(); const ratio = await getContentDPR(); const overrideSettings = { width: MAX_WINDOW_SIZE + 1, height: Math.floor(layoutViewport.clientHeight / 3), deviceScaleFactor: 1.0, }; await Assert.rejects( Emulation.setDeviceMetricsOverride(overrideSettings), err => err.message.includes( "Width and height values must be positive, not greater than 10000000" ), "Too large width raised error" ); await loadURL(DOC_SMALL); const updatedLayoutMetrics = await Page.getLayoutMetrics(); is( updatedLayoutMetrics.layoutViewport.clientWidth, layoutViewport.clientWidth, "Visible layout width hasn't been changed" ); is( updatedLayoutMetrics.layoutViewport.clientHeight, layoutViewport.clientHeight, "Visible layout height hasn't been changed" ); is(await getContentDPR(), ratio, "Device pixel ratio hasn't been changed"); }); add_task(async function failsWithNegativeHeight({ client }) { const { Emulation, Page } = client; await loadURL(DOC_SMALL); const { layoutViewport } = await Page.getLayoutMetrics(); const ratio = await getContentDPR(); const overrideSettings = { width: Math.floor(layoutViewport.clientWidth / 2), height: -1, deviceScaleFactor: 1.0, }; await Assert.rejects( Emulation.setDeviceMetricsOverride(overrideSettings), err => err.message.includes( "Width and height values must be positive, not greater than 10000000" ), "Negative height raised error" ); await loadURL(DOC_SMALL); const updatedLayoutMetrics = await Page.getLayoutMetrics(); is( updatedLayoutMetrics.layoutViewport.clientWidth, layoutViewport.clientWidth, "Visible layout width hasn't been changed" ); is( updatedLayoutMetrics.layoutViewport.clientHeight, layoutViewport.clientHeight, "Visible layout height hasn't been changed" ); is(await getContentDPR(), ratio, "Device pixel ratio hasn't been changed"); }); add_task(async function failsWithTooLargeHeight({ client }) { const { Emulation, Page } = client; await loadURL(DOC_SMALL); const { layoutViewport } = await Page.getLayoutMetrics(); const ratio = await getContentDPR(); const overrideSettings = { width: Math.floor(layoutViewport.clientWidth / 2), height: MAX_WINDOW_SIZE + 1, deviceScaleFactor: 1.0, }; await Assert.rejects( Emulation.setDeviceMetricsOverride(overrideSettings), err => err.message.includes( "Width and height values must be positive, not greater than 10000000" ), "Too large height raised error" ); await loadURL(DOC_SMALL); const updatedLayoutMetrics = await Page.getLayoutMetrics(); is( updatedLayoutMetrics.layoutViewport.clientWidth, layoutViewport.clientWidth, "Visible layout width hasn't been changed" ); is( updatedLayoutMetrics.layoutViewport.clientHeight, layoutViewport.clientHeight, "Visible layout height hasn't been changed" ); is(await getContentDPR(), ratio, "Device pixel ratio hasn't been changed"); }); add_task(async function setDevicePixelRatio({ client }) { const { Emulation, Page } = client; await loadURL(DOC_SMALL); const { layoutViewport } = await Page.getLayoutMetrics(); const ratio_orig = await getContentDPR(); const overrideSettings = { width: layoutViewport.clientWidth, height: layoutViewport.clientHeight, deviceScaleFactor: ratio_orig * 2, }; // Set a custom pixel ratio await Emulation.setDeviceMetricsOverride(overrideSettings); await loadURL(DOC_SMALL); is(await getContentDPR(), ratio_orig * 2, "Expected device pixel ratio set"); }); add_task(async function failsWithNegativeRatio({ client }) { const { Emulation, Page } = client; await loadURL(DOC_SMALL); const { layoutViewport } = await Page.getLayoutMetrics(); const ratio = await getContentDPR(); const overrideSettings = { width: Math.floor(layoutViewport.clientHeight / 2), height: Math.floor(layoutViewport.clientHeight / 3), deviceScaleFactor: -1, }; await Assert.rejects( Emulation.setDeviceMetricsOverride(overrideSettings), err => err.message.includes("deviceScaleFactor: must be positive"), "Negative device scale factor raised error" ); await loadURL(DOC_SMALL); const updatedLayoutMetrics = await Page.getLayoutMetrics(); is( updatedLayoutMetrics.layoutViewport.clientWidth, layoutViewport.clientWidth, "Visible layout width hasn't been changed" ); is( updatedLayoutMetrics.layoutViewport.clientHeight, layoutViewport.clientHeight, "Visible layout height hasn't been changed" ); is(await getContentDPR(), ratio, "Device pixel ratio hasn't been changed"); });