From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- .../components/pdfjs/test/browser_pdfjs_zoom.js | 279 +++++++++++++++++++++ 1 file changed, 279 insertions(+) create mode 100644 toolkit/components/pdfjs/test/browser_pdfjs_zoom.js (limited to 'toolkit/components/pdfjs/test/browser_pdfjs_zoom.js') diff --git a/toolkit/components/pdfjs/test/browser_pdfjs_zoom.js b/toolkit/components/pdfjs/test/browser_pdfjs_zoom.js new file mode 100644 index 0000000000..e00dede422 --- /dev/null +++ b/toolkit/components/pdfjs/test/browser_pdfjs_zoom.js @@ -0,0 +1,279 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +requestLongerTimeout(2); + +const RELATIVE_DIR = "toolkit/components/pdfjs/test/"; +const TESTROOT = "http://example.com/browser/" + RELATIVE_DIR; + +const TESTS = [ + { + action: { + selector: "button#zoomIn", + event: "click", + }, + expectedZoom: 1, // 1 - zoom in + message: "Zoomed in using the '+' (zoom in) button", + }, + + { + action: { + selector: "button#zoomOut", + event: "click", + }, + expectedZoom: -1, // -1 - zoom out + message: "Zoomed out using the '-' (zoom out) button", + }, + + { + action: { + keyboard: true, + keyCode: 61, + event: "+", + }, + expectedZoom: 1, // 1 - zoom in + message: "Zoomed in using the CTRL++ keys", + }, + + { + action: { + keyboard: true, + keyCode: 109, + event: "-", + }, + expectedZoom: -1, // -1 - zoom out + message: "Zoomed out using the CTRL+- keys", + }, + + { + action: { + selector: "select#scaleSelect", + index: 5, + event: "change", + }, + expectedZoom: -1, // -1 - zoom out + message: "Zoomed using the zoom picker", + }, +]; + +add_task(async function test() { + let mimeService = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService); + let handlerInfo = mimeService.getFromTypeAndExtension( + "application/pdf", + "pdf" + ); + + // Make sure pdf.js is the default handler. + is( + handlerInfo.alwaysAskBeforeHandling, + false, + "pdf handler defaults to always-ask is false" + ); + is( + handlerInfo.preferredAction, + Ci.nsIHandlerInfo.handleInternally, + "pdf handler defaults to internal" + ); + + info("Pref action: " + handlerInfo.preferredAction); + + await BrowserTestUtils.withNewTab( + { gBrowser, url: "about:blank" }, + async function (newTabBrowser) { + await waitForPdfJS( + newTabBrowser, + TESTROOT + "file_pdfjs_test.pdf#zoom=100" + ); + + await SpecialPowers.spawn( + newTabBrowser, + [TESTS], + async function (contentTESTS) { + let document = content.document; + + function waitForRender() { + return new Promise(resolve => { + document.addEventListener( + "pagerendered", + function onPageRendered(e) { + if (e.detail.pageNumber !== 1) { + return; + } + + document.removeEventListener( + "pagerendered", + onPageRendered, + true + ); + resolve(); + }, + true + ); + }); + } + + // check that PDF is opened with internal viewer + Assert.ok( + content.document.querySelector("div#viewer"), + "document content has viewer UI" + ); + + let initialWidth, previousWidth; + initialWidth = previousWidth = parseInt( + content.getComputedStyle( + content.document.querySelector("div.page[data-page-number='1']") + ).width + ); + + for (let subTest of contentTESTS) { + // We zoom using an UI element + var ev; + if (subTest.action.selector) { + // Get the element and trigger the action for changing the zoom + var el = document.querySelector(subTest.action.selector); + Assert.ok( + el, + "Element '" + subTest.action.selector + "' has been found" + ); + + if (subTest.action.index) { + el.selectedIndex = subTest.action.index; + } + + // Dispatch the event for changing the zoom + ev = new content.Event(subTest.action.event); + } else { + // We zoom using keyboard + // Simulate key press + ev = new content.KeyboardEvent("keydown", { + key: subTest.action.event, + keyCode: subTest.action.keyCode, + ctrlKey: true, + }); + el = content; + } + + el.dispatchEvent(ev); + await waitForRender(); + + var pageZoomScale = + content.document.querySelector("select#scaleSelect"); + + // The zoom value displayed in the zoom select + var zoomValue = + pageZoomScale.options[pageZoomScale.selectedIndex].innerHTML; + + let pageContainer = content.document.querySelector( + "div.page[data-page-number='1']" + ); + let actualWidth = parseInt( + content.getComputedStyle(pageContainer).width + ); + + // the actual zoom of the PDF document + let computedZoomValue = + parseInt((actualWidth / initialWidth).toFixed(2) * 100) + "%"; + Assert.equal( + computedZoomValue, + zoomValue, + "Content has correct zoom" + ); + + // Check that document zooms in the expected way (in/out) + let zoom = (actualWidth - previousWidth) * subTest.expectedZoom; + Assert.ok(zoom > 0, subTest.message); + + previousWidth = actualWidth; + } + + var viewer = content.wrappedJSObject.PDFViewerApplication; + await viewer.close(); + } + ); + } + ); +}); + +// Performs a SpecialPowers.spawn round-trip to ensure that any setup +// that needs to be done in the content process by any pending tasks has +// a chance to complete before continuing. +function waitForRoundTrip(browser) { + return SpecialPowers.spawn(browser, [], () => {}); +} + +async function waitForRenderAndGetWidth(newTabBrowser) { + return SpecialPowers.spawn(newTabBrowser, [], async function () { + function waitForRender(document) { + return new Promise(resolve => { + document.addEventListener( + "pagerendered", + function onPageRendered(e) { + if (e.detail.pageNumber !== 1) { + return; + } + + document.removeEventListener("pagerendered", onPageRendered, true); + resolve(); + }, + true + ); + }); + } + // check that PDF is opened with internal viewer + Assert.ok( + content.document.querySelector("div#viewer"), + "document content has viewer UI" + ); + + await waitForRender(content.document); + + return parseInt( + content.getComputedStyle( + content.document.querySelector("div.page[data-page-number='1']") + ).width + ); + }); +} + +add_task(async function test_browser_zoom() { + await BrowserTestUtils.withNewTab( + { gBrowser, url: "about:blank" }, + async function (newTabBrowser) { + await waitForPdfJS(newTabBrowser, TESTROOT + "file_pdfjs_test.pdf"); + + const initialWidth = await waitForRenderAndGetWidth(newTabBrowser); + + // Zoom in + let newWidthPromise = waitForRenderAndGetWidth(newTabBrowser); + await waitForRoundTrip(newTabBrowser); + FullZoom.enlarge(); + Assert.greater( + await newWidthPromise, + initialWidth, + "Zoom in makes the page bigger." + ); + + // Reset + newWidthPromise = waitForRenderAndGetWidth(newTabBrowser); + await waitForRoundTrip(newTabBrowser); + FullZoom.reset(); + is(await newWidthPromise, initialWidth, "Zoom reset restores page."); + + // Zoom out + newWidthPromise = waitForRenderAndGetWidth(newTabBrowser); + await waitForRoundTrip(newTabBrowser); + FullZoom.reduce(); + Assert.less( + await newWidthPromise, + initialWidth, + "Zoom out makes the page smaller." + ); + + // Clean-up after the PDF viewer. + await SpecialPowers.spawn(newTabBrowser, [], function () { + const viewer = content.wrappedJSObject.PDFViewerApplication; + return viewer.close(); + }); + } + ); +}); -- cgit v1.2.3