summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/contextMenu/browser_view_image.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/base/content/test/contextMenu/browser_view_image.js')
-rw-r--r--browser/base/content/test/contextMenu/browser_view_image.js197
1 files changed, 197 insertions, 0 deletions
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:"),
+ });
+});