197 lines
6.3 KiB
JavaScript
197 lines
6.3 KiB
JavaScript
/* 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:"),
|
|
});
|
|
});
|