From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../content/test/contextMenu/browser_view_image.js | 197 +++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 browser/base/content/test/contextMenu/browser_view_image.js (limited to 'browser/base/content/test/contextMenu/browser_view_image.js') diff --git a/browser/base/content/test/contextMenu/browser_view_image.js b/browser/base/content/test/contextMenu/browser_view_image.js new file mode 100644 index 0000000000..485fdf3fb2 --- /dev/null +++ b/browser/base/content/test/contextMenu/browser_view_image.js @@ -0,0 +1,197 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const chrome_base = getRootDirectory(gTestPath); + +/* import-globals-from contextmenu_common.js */ +Services.scriptloader.loadSubScript( + chrome_base + "contextmenu_common.js", + this +); +const http_base = chrome_base.replace( + "chrome://mochitests/content", + "https://example.com" +); + +async function test_view_image_works({ page, selector, urlChecker }) { + let mainURL = http_base + page; + let accel = AppConstants.platform == "macosx" ? "metaKey" : "ctrlKey"; + let tests = { + tab: { + modifiers: { [accel]: true }, + async loadedPromise() { + return BrowserTestUtils.waitForNewTab(gBrowser, urlChecker, true).then( + t => t.linkedBrowser + ); + }, + cleanup(browser) { + BrowserTestUtils.removeTab(gBrowser.getTabForBrowser(browser)); + }, + }, + window: { + modifiers: { shiftKey: true }, + async loadedPromise() { + // Unfortunately we can't predict the URL so can't just pass that to waitForNewWindow + let w = await BrowserTestUtils.waitForNewWindow(); + let browser = w.gBrowser.selectedBrowser; + let getCx = () => browser.browsingContext; + await TestUtils.waitForCondition( + () => + getCx() && urlChecker(getCx().currentWindowGlobal.documentURI.spec) + ); + await SpecialPowers.spawn(browser, [], () => { + return ContentTaskUtils.waitForCondition( + () => content.document.readyState == "complete" + ); + }); + return browser; + }, + async cleanup(browser) { + return BrowserTestUtils.closeWindow(browser.ownerGlobal); + }, + }, + tab_default: { + modifiers: {}, + async loadedPromise() { + return BrowserTestUtils.waitForNewTab(gBrowser, urlChecker, true).then( + t => { + is(t.selected, false, "Tab should not be selected."); + return t.linkedBrowser; + } + ); + }, + cleanup(browser) { + is(gBrowser.tabs.length, 3, "number of tabs"); + BrowserTestUtils.removeTab(gBrowser.getTabForBrowser(browser)); + }, + }, + tab_default_flip_bg_pref: { + prefs: [["browser.tabs.loadInBackground", false]], + modifiers: {}, + async loadedPromise() { + return BrowserTestUtils.waitForNewTab(gBrowser, urlChecker, true).then( + t => { + is(t.selected, true, "Tab should be selected with pref flipped."); + return t.linkedBrowser; + } + ); + }, + cleanup(browser) { + is(gBrowser.tabs.length, 3, "number of tabs"); + BrowserTestUtils.removeTab(gBrowser.getTabForBrowser(browser)); + }, + }, + }; + await BrowserTestUtils.withNewTab(mainURL, async browser => { + await SpecialPowers.spawn(browser, [], () => { + return ContentTaskUtils.waitForCondition( + () => !content.document.documentElement.classList.contains("wait") + ); + }); + for (let [testLabel, test] of Object.entries(tests)) { + if (test.prefs) { + await SpecialPowers.pushPrefEnv({ set: test.prefs }); + } + let contextMenu = document.getElementById("contentAreaContextMenu"); + is( + contextMenu.state, + "closed", + `${testLabel} - checking if popup is closed` + ); + let promisePopupShown = BrowserTestUtils.waitForEvent( + contextMenu, + "popupshown" + ); + await BrowserTestUtils.synthesizeMouse( + selector, + 2, + 2, + { type: "contextmenu", button: 2 }, + browser + ); + await promisePopupShown; + info(`${testLabel} - Popup Shown`); + let promisePopupHidden = BrowserTestUtils.waitForEvent( + contextMenu, + "popuphidden" + ); + let browserPromise = test.loadedPromise(); + contextMenu.activateItem( + document.getElementById("context-viewimage"), + test.modifiers + ); + await promisePopupHidden; + + let newBrowser = await browserPromise; + let { documentURI } = newBrowser.browsingContext.currentWindowGlobal; + if (documentURI.spec.startsWith("data:image/svg")) { + await SpecialPowers.spawn(newBrowser, [testLabel], msgPrefix => { + let svgEl = content.document.querySelector("svg"); + ok(svgEl, `${msgPrefix} - should have loaded SVG.`); + is(svgEl.height.baseVal.value, 500, `${msgPrefix} - SVG has height`); + is(svgEl.width.baseVal.value, 500, `${msgPrefix} - SVG has height`); + }); + } else { + await SpecialPowers.spawn(newBrowser, [testLabel], msgPrefix => { + let img = content.document.querySelector("img"); + ok( + img instanceof Ci.nsIImageLoadingContent, + `${msgPrefix} - Image should have loaded content.` + ); + const request = img.getRequest( + Ci.nsIImageLoadingContent.CURRENT_REQUEST + ); + ok( + request.imageStatus & request.STATUS_LOAD_COMPLETE, + `${msgPrefix} - Should have loaded image.` + ); + }); + } + await test.cleanup(newBrowser); + if (test.prefs) { + await SpecialPowers.popPrefEnv(); + } + } + }); +} + +/** + * Verify that the 'view image' context menu in a new tab for a canvas works, + * when opened in a new tab, a new window, or in the same tab. + */ +add_task(async function test_view_image_canvas_works() { + await test_view_image_works({ + page: "subtst_contextmenu.html", + selector: "#test-canvas", + urlChecker: url => url.startsWith("blob:"), + }); +}); + +/** + * Test for https://bugzilla.mozilla.org/show_bug.cgi?id=1625786 + */ +add_task(async function test_view_image_revoked_cached_blob() { + await test_view_image_works({ + page: "test_view_image_revoked_cached_blob.html", + selector: "#second", + urlChecker: url => url.startsWith("blob:"), + }); +}); + +/** + * Test for https://bugzilla.mozilla.org/show_bug.cgi?id=1738190 + * Inline SVG data URIs as a background image should also open. + */ +add_task(async function test_view_image_inline_svg_bgimage() { + await SpecialPowers.pushPrefEnv({ + // This is the default but we turn it off for unit tests. + set: [["security.data_uri.block_toplevel_data_uri_navigations", true]], + }); + await test_view_image_works({ + page: "test_view_image_inline_svg.html", + selector: "body", + urlChecker: url => url.startsWith("data:"), + }); +}); -- cgit v1.2.3