forked from mirrors/gecko-dev
This patch refactors the SearchService private initialized variables and how the SearchService stores its initialization status. These changes capture whether the SearchService has succeeded, failed or hasn't finished initialization yet. There are also changes made to UrlbarSearchUtils on handling when SearchService has failed to initialize or when it hasn't finished initializing yet and we wait. In the case where the SearchService has failed on initialization, We allow the code to continue so that it can reach UrlbarProviderPlaces. Once we are able to reach UrlbarProviderPlaces, we can make database calls for the user's history and bookmarks. This allows the user to interact with the addressbar and search their history and bookmarks even if SearchService has failed to initialize. Differential Revision: https://phabricator.services.mozilla.com/D176936
1943 lines
44 KiB
JavaScript
1943 lines
44 KiB
JavaScript
"use strict";
|
|
|
|
let contextMenu;
|
|
let LOGIN_FILL_ITEMS = ["---", null, "manage-saved-logins", true];
|
|
let NAVIGATION_ITEMS =
|
|
AppConstants.platform == "macosx"
|
|
? [
|
|
"context-back",
|
|
false,
|
|
"context-forward",
|
|
false,
|
|
"context-reload",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarkpage",
|
|
true,
|
|
]
|
|
: [
|
|
"context-navigation",
|
|
null,
|
|
[
|
|
"context-back",
|
|
false,
|
|
"context-forward",
|
|
false,
|
|
"context-reload",
|
|
true,
|
|
"context-bookmarkpage",
|
|
true,
|
|
],
|
|
null,
|
|
"---",
|
|
null,
|
|
];
|
|
let hasPocket = Services.prefs.getBoolPref("extensions.pocket.enabled");
|
|
let hasContainers =
|
|
Services.prefs.getBoolPref("privacy.userContext.enabled") &&
|
|
ContextualIdentityService.getPublicIdentities().length;
|
|
|
|
const example_base =
|
|
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
|
"http://example.com/browser/browser/base/content/test/contextMenu/";
|
|
const chrome_base =
|
|
"chrome://mochitests/content/browser/browser/base/content/test/contextMenu/";
|
|
const head_base =
|
|
"chrome://mochitests/content/browser/browser/base/content/test/contextMenu/";
|
|
|
|
/* import-globals-from contextmenu_common.js */
|
|
Services.scriptloader.loadSubScript(
|
|
chrome_base + "contextmenu_common.js",
|
|
this
|
|
);
|
|
|
|
function getThisFrameSubMenu(base_menu) {
|
|
if (AppConstants.NIGHTLY_BUILD) {
|
|
let osPidItem = ["context-frameOsPid", false];
|
|
base_menu = base_menu.concat(osPidItem);
|
|
}
|
|
return base_menu;
|
|
}
|
|
|
|
add_setup(async function () {
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
["browser.search.separatePrivateDefault.ui.enabled", true],
|
|
["extensions.screenshots.disabled", false],
|
|
["layout.forms.reveal-password-context-menu.enabled", true],
|
|
],
|
|
});
|
|
});
|
|
|
|
// Below are test cases for XUL element
|
|
add_task(async function test_xul_text_link_label() {
|
|
let url = chrome_base + "subtst_contextmenu_xul.xhtml";
|
|
|
|
await BrowserTestUtils.openNewForegroundTab({
|
|
gBrowser,
|
|
url,
|
|
waitForLoad: true,
|
|
waitForStateStop: true,
|
|
});
|
|
|
|
await test_contextmenu("#test-xul-text-link-label", [
|
|
"context-openlinkintab",
|
|
true,
|
|
...(hasContainers ? ["context-openlinkinusercontext-menu", true] : []),
|
|
// We need a blank entry here because the containers submenu is
|
|
// dynamically generated with no ids.
|
|
...(hasContainers ? ["", null] : []),
|
|
"context-openlink",
|
|
true,
|
|
"context-openlinkprivate",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarklink",
|
|
true,
|
|
"context-savelink",
|
|
true,
|
|
...(hasPocket ? ["context-savelinktopocket", true] : []),
|
|
"context-copylink",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-searchselect",
|
|
true,
|
|
"context-searchselect-private",
|
|
true,
|
|
]);
|
|
|
|
// Clean up so won't affect HTML element test cases.
|
|
lastElementSelector = null;
|
|
gBrowser.removeCurrentTab();
|
|
});
|
|
|
|
// Below are test cases for HTML element.
|
|
|
|
add_task(async function test_setup_html() {
|
|
let url = example_base + "subtst_contextmenu.html";
|
|
|
|
await BrowserTestUtils.openNewForegroundTab(gBrowser, url);
|
|
|
|
await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function () {
|
|
let doc = content.document;
|
|
let audioIframe = doc.querySelector("#test-audio-in-iframe");
|
|
// media documents always use a <video> tag.
|
|
let audio = audioIframe.contentDocument.querySelector("video");
|
|
let videoIframe = doc.querySelector("#test-video-in-iframe");
|
|
let video = videoIframe.contentDocument.querySelector("video");
|
|
|
|
audio.loop = true;
|
|
audio.src = "audio.ogg";
|
|
video.loop = true;
|
|
video.src = "video.ogg";
|
|
|
|
let awaitPause = ContentTaskUtils.waitForEvent(audio, "pause");
|
|
await ContentTaskUtils.waitForCondition(
|
|
() => !audio.paused,
|
|
"Making sure audio is playing before calling pause"
|
|
);
|
|
audio.pause();
|
|
await awaitPause;
|
|
|
|
awaitPause = ContentTaskUtils.waitForEvent(video, "pause");
|
|
await ContentTaskUtils.waitForCondition(
|
|
() => !video.paused,
|
|
"Making sure video is playing before calling pause"
|
|
);
|
|
video.pause();
|
|
await awaitPause;
|
|
});
|
|
});
|
|
|
|
let plainTextItems;
|
|
add_task(async function test_plaintext() {
|
|
await test_contextmenu("#test-text", [
|
|
...NAVIGATION_ITEMS,
|
|
"context-savepage",
|
|
true,
|
|
...(hasPocket ? ["context-pocket", true] : []),
|
|
"context-selectall",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-take-screenshot",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewsource",
|
|
true,
|
|
]);
|
|
});
|
|
|
|
const kLinkItems = [
|
|
"context-openlinkintab",
|
|
true,
|
|
...(hasContainers ? ["context-openlinkinusercontext-menu", true] : []),
|
|
// We need a blank entry here because the containers submenu is
|
|
// dynamically generated with no ids.
|
|
...(hasContainers ? ["", null] : []),
|
|
"context-openlink",
|
|
true,
|
|
"context-openlinkprivate",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarklink",
|
|
true,
|
|
"context-savelink",
|
|
true,
|
|
...(hasPocket ? ["context-savelinktopocket", true] : []),
|
|
"context-copylink",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-searchselect",
|
|
true,
|
|
"context-searchselect-private",
|
|
true,
|
|
];
|
|
|
|
add_task(async function test_link() {
|
|
await test_contextmenu("#test-link", kLinkItems);
|
|
});
|
|
|
|
add_task(async function test_link_in_shadow_dom() {
|
|
await test_contextmenu("#shadow-host", kLinkItems, {
|
|
offsetX: 6,
|
|
offsetY: 6,
|
|
});
|
|
});
|
|
|
|
add_task(async function test_link_over_shadow_dom() {
|
|
await test_contextmenu("#shadow-host-in-link", kLinkItems, {
|
|
offsetX: 6,
|
|
offsetY: 6,
|
|
});
|
|
});
|
|
|
|
add_task(async function test_mailto() {
|
|
await test_contextmenu("#test-mailto", [
|
|
"context-copyemail",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-searchselect",
|
|
true,
|
|
"context-searchselect-private",
|
|
true,
|
|
]);
|
|
});
|
|
|
|
add_task(async function test_tel() {
|
|
await test_contextmenu("#test-tel", [
|
|
"context-copyphone",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-searchselect",
|
|
true,
|
|
"context-searchselect-private",
|
|
true,
|
|
]);
|
|
});
|
|
|
|
add_task(async function test_image() {
|
|
for (let selector of ["#test-image", "#test-svg-image"]) {
|
|
await test_contextmenu(
|
|
selector,
|
|
[
|
|
"context-viewimage",
|
|
true,
|
|
"context-saveimage",
|
|
true,
|
|
"context-copyimage-contents",
|
|
true,
|
|
"context-copyimage",
|
|
true,
|
|
"context-sendimage",
|
|
true,
|
|
...getTextRecognitionItems(),
|
|
...(Services.prefs.getBoolPref("browser.menu.showViewImageInfo", false)
|
|
? ["context-viewimageinfo", true]
|
|
: []),
|
|
"---",
|
|
null,
|
|
"context-setDesktopBackground",
|
|
true,
|
|
],
|
|
{
|
|
onContextMenuShown() {
|
|
is(
|
|
typeof gContextMenu.imageInfo.height,
|
|
"number",
|
|
"Should have height"
|
|
);
|
|
is(
|
|
typeof gContextMenu.imageInfo.width,
|
|
"number",
|
|
"Should have width"
|
|
);
|
|
},
|
|
}
|
|
);
|
|
}
|
|
});
|
|
|
|
add_task(async function test_canvas() {
|
|
await test_contextmenu("#test-canvas", [
|
|
"context-viewimage",
|
|
true,
|
|
"context-saveimage",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-selectall",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-take-screenshot",
|
|
true,
|
|
]);
|
|
});
|
|
|
|
add_task(async function test_video_ok() {
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["media.videocontrols.picture-in-picture.enabled", true]],
|
|
});
|
|
|
|
await test_contextmenu("#test-video-ok", [
|
|
"context-media-play",
|
|
true,
|
|
"context-media-mute",
|
|
true,
|
|
"context-media-playbackrate",
|
|
null,
|
|
[
|
|
"context-media-playbackrate-050x",
|
|
true,
|
|
"context-media-playbackrate-100x",
|
|
true,
|
|
"context-media-playbackrate-125x",
|
|
true,
|
|
"context-media-playbackrate-150x",
|
|
true,
|
|
"context-media-playbackrate-200x",
|
|
true,
|
|
],
|
|
null,
|
|
"context-media-loop",
|
|
true,
|
|
"context-video-fullscreen",
|
|
true,
|
|
"context-media-hidecontrols",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewvideo",
|
|
true,
|
|
"context-video-pictureinpicture",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-video-saveimage",
|
|
true,
|
|
"context-savevideo",
|
|
true,
|
|
"context-copyvideourl",
|
|
true,
|
|
"context-sendvideo",
|
|
true,
|
|
]);
|
|
|
|
await SpecialPowers.popPrefEnv();
|
|
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["media.videocontrols.picture-in-picture.enabled", false]],
|
|
});
|
|
|
|
await test_contextmenu("#test-video-ok", [
|
|
"context-media-play",
|
|
true,
|
|
"context-media-mute",
|
|
true,
|
|
"context-media-playbackrate",
|
|
null,
|
|
[
|
|
"context-media-playbackrate-050x",
|
|
true,
|
|
"context-media-playbackrate-100x",
|
|
true,
|
|
"context-media-playbackrate-125x",
|
|
true,
|
|
"context-media-playbackrate-150x",
|
|
true,
|
|
"context-media-playbackrate-200x",
|
|
true,
|
|
],
|
|
null,
|
|
"context-media-loop",
|
|
true,
|
|
"context-video-fullscreen",
|
|
true,
|
|
"context-media-hidecontrols",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewvideo",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-video-saveimage",
|
|
true,
|
|
"context-savevideo",
|
|
true,
|
|
"context-copyvideourl",
|
|
true,
|
|
"context-sendvideo",
|
|
true,
|
|
]);
|
|
|
|
await SpecialPowers.popPrefEnv();
|
|
});
|
|
|
|
add_task(async function test_audio_in_video() {
|
|
await test_contextmenu("#test-audio-in-video", [
|
|
"context-media-play",
|
|
true,
|
|
"context-media-mute",
|
|
true,
|
|
"context-media-playbackrate",
|
|
null,
|
|
[
|
|
"context-media-playbackrate-050x",
|
|
true,
|
|
"context-media-playbackrate-100x",
|
|
true,
|
|
"context-media-playbackrate-125x",
|
|
true,
|
|
"context-media-playbackrate-150x",
|
|
true,
|
|
"context-media-playbackrate-200x",
|
|
true,
|
|
],
|
|
null,
|
|
"context-media-loop",
|
|
true,
|
|
"context-media-showcontrols",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-saveaudio",
|
|
true,
|
|
"context-copyaudiourl",
|
|
true,
|
|
"context-sendaudio",
|
|
true,
|
|
]);
|
|
});
|
|
|
|
add_task(async function test_video_bad() {
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["media.videocontrols.picture-in-picture.enabled", true]],
|
|
});
|
|
|
|
await test_contextmenu("#test-video-bad", [
|
|
"context-media-play",
|
|
false,
|
|
"context-media-mute",
|
|
false,
|
|
"context-media-playbackrate",
|
|
null,
|
|
[
|
|
"context-media-playbackrate-050x",
|
|
false,
|
|
"context-media-playbackrate-100x",
|
|
false,
|
|
"context-media-playbackrate-125x",
|
|
false,
|
|
"context-media-playbackrate-150x",
|
|
false,
|
|
"context-media-playbackrate-200x",
|
|
false,
|
|
],
|
|
null,
|
|
"context-media-loop",
|
|
true,
|
|
"context-video-fullscreen",
|
|
false,
|
|
"context-media-hidecontrols",
|
|
false,
|
|
"---",
|
|
null,
|
|
"context-viewvideo",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-video-saveimage",
|
|
false,
|
|
"context-savevideo",
|
|
true,
|
|
"context-copyvideourl",
|
|
true,
|
|
"context-sendvideo",
|
|
true,
|
|
]);
|
|
|
|
await SpecialPowers.popPrefEnv();
|
|
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["media.videocontrols.picture-in-picture.enabled", false]],
|
|
});
|
|
|
|
await test_contextmenu("#test-video-bad", [
|
|
"context-media-play",
|
|
false,
|
|
"context-media-mute",
|
|
false,
|
|
"context-media-playbackrate",
|
|
null,
|
|
[
|
|
"context-media-playbackrate-050x",
|
|
false,
|
|
"context-media-playbackrate-100x",
|
|
false,
|
|
"context-media-playbackrate-125x",
|
|
false,
|
|
"context-media-playbackrate-150x",
|
|
false,
|
|
"context-media-playbackrate-200x",
|
|
false,
|
|
],
|
|
null,
|
|
"context-media-loop",
|
|
true,
|
|
"context-video-fullscreen",
|
|
false,
|
|
"context-media-hidecontrols",
|
|
false,
|
|
"---",
|
|
null,
|
|
"context-viewvideo",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-video-saveimage",
|
|
false,
|
|
"context-savevideo",
|
|
true,
|
|
"context-copyvideourl",
|
|
true,
|
|
"context-sendvideo",
|
|
true,
|
|
]);
|
|
|
|
await SpecialPowers.popPrefEnv();
|
|
});
|
|
|
|
add_task(async function test_video_bad2() {
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["media.videocontrols.picture-in-picture.enabled", true]],
|
|
});
|
|
|
|
await test_contextmenu("#test-video-bad2", [
|
|
"context-media-play",
|
|
false,
|
|
"context-media-mute",
|
|
false,
|
|
"context-media-playbackrate",
|
|
null,
|
|
[
|
|
"context-media-playbackrate-050x",
|
|
false,
|
|
"context-media-playbackrate-100x",
|
|
false,
|
|
"context-media-playbackrate-125x",
|
|
false,
|
|
"context-media-playbackrate-150x",
|
|
false,
|
|
"context-media-playbackrate-200x",
|
|
false,
|
|
],
|
|
null,
|
|
"context-media-loop",
|
|
true,
|
|
"context-video-fullscreen",
|
|
false,
|
|
"context-media-hidecontrols",
|
|
false,
|
|
"---",
|
|
null,
|
|
"context-viewvideo",
|
|
false,
|
|
"---",
|
|
null,
|
|
"context-video-saveimage",
|
|
false,
|
|
"context-savevideo",
|
|
false,
|
|
"context-copyvideourl",
|
|
false,
|
|
"context-sendvideo",
|
|
false,
|
|
]);
|
|
|
|
await SpecialPowers.popPrefEnv();
|
|
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["media.videocontrols.picture-in-picture.enabled", false]],
|
|
});
|
|
|
|
await test_contextmenu("#test-video-bad2", [
|
|
"context-media-play",
|
|
false,
|
|
"context-media-mute",
|
|
false,
|
|
"context-media-playbackrate",
|
|
null,
|
|
[
|
|
"context-media-playbackrate-050x",
|
|
false,
|
|
"context-media-playbackrate-100x",
|
|
false,
|
|
"context-media-playbackrate-125x",
|
|
false,
|
|
"context-media-playbackrate-150x",
|
|
false,
|
|
"context-media-playbackrate-200x",
|
|
false,
|
|
],
|
|
null,
|
|
"context-media-loop",
|
|
true,
|
|
"context-video-fullscreen",
|
|
false,
|
|
"context-media-hidecontrols",
|
|
false,
|
|
"---",
|
|
null,
|
|
"context-viewvideo",
|
|
false,
|
|
"---",
|
|
null,
|
|
"context-video-saveimage",
|
|
false,
|
|
"context-savevideo",
|
|
false,
|
|
"context-copyvideourl",
|
|
false,
|
|
"context-sendvideo",
|
|
false,
|
|
]);
|
|
|
|
await SpecialPowers.popPrefEnv();
|
|
});
|
|
|
|
add_task(async function test_iframe() {
|
|
await test_contextmenu("#test-iframe", [
|
|
...NAVIGATION_ITEMS,
|
|
"context-savepage",
|
|
true,
|
|
...(hasPocket ? ["context-pocket", true] : []),
|
|
"context-selectall",
|
|
true,
|
|
"---",
|
|
null,
|
|
"frame",
|
|
null,
|
|
getThisFrameSubMenu([
|
|
"context-showonlythisframe",
|
|
true,
|
|
"context-openframeintab",
|
|
true,
|
|
"context-openframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-reloadframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarkframe",
|
|
true,
|
|
"context-saveframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-printframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-take-frame-screenshot",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewframesource",
|
|
true,
|
|
"context-viewframeinfo",
|
|
true,
|
|
]),
|
|
null,
|
|
"---",
|
|
null,
|
|
"context-viewsource",
|
|
true,
|
|
]);
|
|
});
|
|
|
|
add_task(async function test_video_in_iframe() {
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["media.videocontrols.picture-in-picture.enabled", true]],
|
|
});
|
|
|
|
await test_contextmenu("#test-video-in-iframe", [
|
|
"context-media-play",
|
|
true,
|
|
"context-media-mute",
|
|
true,
|
|
"context-media-playbackrate",
|
|
null,
|
|
[
|
|
"context-media-playbackrate-050x",
|
|
true,
|
|
"context-media-playbackrate-100x",
|
|
true,
|
|
"context-media-playbackrate-125x",
|
|
true,
|
|
"context-media-playbackrate-150x",
|
|
true,
|
|
"context-media-playbackrate-200x",
|
|
true,
|
|
],
|
|
null,
|
|
"context-media-loop",
|
|
true,
|
|
"context-video-fullscreen",
|
|
true,
|
|
"context-media-hidecontrols",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewvideo",
|
|
true,
|
|
"context-video-pictureinpicture",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-video-saveimage",
|
|
true,
|
|
"context-savevideo",
|
|
true,
|
|
"context-copyvideourl",
|
|
true,
|
|
"context-sendvideo",
|
|
true,
|
|
"---",
|
|
null,
|
|
"frame",
|
|
null,
|
|
getThisFrameSubMenu([
|
|
"context-showonlythisframe",
|
|
true,
|
|
"context-openframeintab",
|
|
true,
|
|
"context-openframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-reloadframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarkframe",
|
|
true,
|
|
"context-saveframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-printframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewframeinfo",
|
|
true,
|
|
]),
|
|
null,
|
|
]);
|
|
|
|
await SpecialPowers.popPrefEnv();
|
|
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["media.videocontrols.picture-in-picture.enabled", false]],
|
|
});
|
|
|
|
await test_contextmenu("#test-video-in-iframe", [
|
|
"context-media-play",
|
|
true,
|
|
"context-media-mute",
|
|
true,
|
|
"context-media-playbackrate",
|
|
null,
|
|
[
|
|
"context-media-playbackrate-050x",
|
|
true,
|
|
"context-media-playbackrate-100x",
|
|
true,
|
|
"context-media-playbackrate-125x",
|
|
true,
|
|
"context-media-playbackrate-150x",
|
|
true,
|
|
"context-media-playbackrate-200x",
|
|
true,
|
|
],
|
|
null,
|
|
"context-media-loop",
|
|
true,
|
|
"context-video-fullscreen",
|
|
true,
|
|
"context-media-hidecontrols",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewvideo",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-video-saveimage",
|
|
true,
|
|
"context-savevideo",
|
|
true,
|
|
"context-copyvideourl",
|
|
true,
|
|
"context-sendvideo",
|
|
true,
|
|
"---",
|
|
null,
|
|
"frame",
|
|
null,
|
|
getThisFrameSubMenu([
|
|
"context-showonlythisframe",
|
|
true,
|
|
"context-openframeintab",
|
|
true,
|
|
"context-openframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-reloadframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarkframe",
|
|
true,
|
|
"context-saveframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-printframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewframeinfo",
|
|
true,
|
|
]),
|
|
null,
|
|
]);
|
|
|
|
await SpecialPowers.popPrefEnv();
|
|
});
|
|
|
|
add_task(async function test_audio_in_iframe() {
|
|
await test_contextmenu("#test-audio-in-iframe", [
|
|
"context-media-play",
|
|
true,
|
|
"context-media-mute",
|
|
true,
|
|
"context-media-playbackrate",
|
|
null,
|
|
[
|
|
"context-media-playbackrate-050x",
|
|
true,
|
|
"context-media-playbackrate-100x",
|
|
true,
|
|
"context-media-playbackrate-125x",
|
|
true,
|
|
"context-media-playbackrate-150x",
|
|
true,
|
|
"context-media-playbackrate-200x",
|
|
true,
|
|
],
|
|
null,
|
|
"context-media-loop",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-saveaudio",
|
|
true,
|
|
"context-copyaudiourl",
|
|
true,
|
|
"context-sendaudio",
|
|
true,
|
|
"---",
|
|
null,
|
|
"frame",
|
|
null,
|
|
getThisFrameSubMenu([
|
|
"context-showonlythisframe",
|
|
true,
|
|
"context-openframeintab",
|
|
true,
|
|
"context-openframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-reloadframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarkframe",
|
|
true,
|
|
"context-saveframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-printframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewframeinfo",
|
|
true,
|
|
]),
|
|
null,
|
|
]);
|
|
});
|
|
|
|
add_task(async function test_image_in_iframe() {
|
|
await test_contextmenu("#test-image-in-iframe", [
|
|
"context-viewimage",
|
|
true,
|
|
"context-saveimage",
|
|
true,
|
|
"context-copyimage-contents",
|
|
true,
|
|
"context-copyimage",
|
|
true,
|
|
"context-sendimage",
|
|
true,
|
|
...getTextRecognitionItems(),
|
|
...(Services.prefs.getBoolPref("browser.menu.showViewImageInfo", false)
|
|
? ["context-viewimageinfo", true]
|
|
: []),
|
|
"---",
|
|
null,
|
|
"context-setDesktopBackground",
|
|
true,
|
|
"---",
|
|
null,
|
|
"frame",
|
|
null,
|
|
getThisFrameSubMenu([
|
|
"context-showonlythisframe",
|
|
true,
|
|
"context-openframeintab",
|
|
true,
|
|
"context-openframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-reloadframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarkframe",
|
|
true,
|
|
"context-saveframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-printframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewframeinfo",
|
|
true,
|
|
]),
|
|
null,
|
|
]);
|
|
});
|
|
|
|
add_task(async function test_pdf_viewer_in_iframe() {
|
|
await test_contextmenu(
|
|
"#test-pdf-viewer-in-frame",
|
|
[
|
|
...NAVIGATION_ITEMS,
|
|
"context-savepage",
|
|
true,
|
|
...(hasPocket ? ["context-pocket", true] : []),
|
|
"context-selectall",
|
|
true,
|
|
"---",
|
|
null,
|
|
"frame",
|
|
null,
|
|
getThisFrameSubMenu([
|
|
"context-showonlythisframe",
|
|
true,
|
|
"context-openframeintab",
|
|
true,
|
|
"context-openframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-reloadframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarkframe",
|
|
true,
|
|
"context-saveframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-printframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-take-frame-screenshot",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewframeinfo",
|
|
true,
|
|
]),
|
|
null,
|
|
"---",
|
|
null,
|
|
"context-viewsource",
|
|
true,
|
|
],
|
|
{
|
|
shiftkey: true,
|
|
}
|
|
);
|
|
});
|
|
|
|
add_task(async function test_textarea() {
|
|
// Disabled since this is seeing spell-check-enabled
|
|
// instead of spell-add-dictionaries-main
|
|
todo(false, "spell checker tests are failing, bug 1246296");
|
|
|
|
/*
|
|
yield test_contextmenu("#test-textarea",
|
|
["context-undo", false,
|
|
"context-redo", false,
|
|
"---", null,
|
|
"context-cut", true,
|
|
"context-copy", true,
|
|
"context-paste", null,
|
|
"context-delete", false,
|
|
"---", null,
|
|
"context-selectall", true,
|
|
"---", null,
|
|
"spell-add-dictionaries-main", true,
|
|
],
|
|
{
|
|
skipFocusChange: true,
|
|
}
|
|
);
|
|
*/
|
|
});
|
|
|
|
add_task(async function test_textarea_spellcheck() {
|
|
todo(false, "spell checker tests are failing, bug 1246296");
|
|
|
|
/*
|
|
yield test_contextmenu("#test-textarea",
|
|
["*chubbiness", true, // spelling suggestion
|
|
"spell-add-to-dictionary", true,
|
|
"---", null,
|
|
"context-undo", false,
|
|
"context-redo", false,
|
|
"---", null,
|
|
"context-cut", true,
|
|
"context-copy", true,
|
|
"context-paste", null, // ignore clipboard state
|
|
"context-delete", false,
|
|
"---", null,
|
|
"context-selectall", true,
|
|
"---", null,
|
|
"spell-check-enabled", true,
|
|
"spell-dictionaries", true,
|
|
["spell-check-dictionary-en-US", true,
|
|
"---", null,
|
|
"spell-add-dictionaries", true], null
|
|
],
|
|
{
|
|
waitForSpellCheck: true,
|
|
offsetX: 6,
|
|
offsetY: 6,
|
|
postCheckContextMenuFn() {
|
|
document.getElementById("spell-add-to-dictionary").doCommand();
|
|
}
|
|
}
|
|
);
|
|
*/
|
|
});
|
|
|
|
add_task(async function test_plaintext2() {
|
|
await test_contextmenu("#test-text", plainTextItems);
|
|
});
|
|
|
|
add_task(async function test_undo_add_to_dictionary() {
|
|
todo(false, "spell checker tests are failing, bug 1246296");
|
|
|
|
/*
|
|
yield test_contextmenu("#test-textarea",
|
|
["spell-undo-add-to-dictionary", true,
|
|
"---", null,
|
|
"context-undo", false,
|
|
"context-redo", false,
|
|
"---", null,
|
|
"context-cut", true,
|
|
"context-copy", true,
|
|
"context-paste", null, // ignore clipboard state
|
|
"context-delete", false,
|
|
"context-selectall", true,
|
|
"---", null,
|
|
"spell-check-enabled", true,
|
|
"spell-dictionaries", true,
|
|
["spell-check-dictionary-en-US", true,
|
|
"---", null,
|
|
"spell-add-dictionaries", true], null
|
|
],
|
|
{
|
|
waitForSpellCheck: true,
|
|
postCheckContextMenuFn() {
|
|
document.getElementById("spell-undo-add-to-dictionary")
|
|
.doCommand();
|
|
}
|
|
}
|
|
);
|
|
*/
|
|
});
|
|
|
|
add_task(async function test_contenteditable() {
|
|
todo(false, "spell checker tests are failing, bug 1246296");
|
|
|
|
/*
|
|
yield test_contextmenu("#test-contenteditable",
|
|
["spell-no-suggestions", false,
|
|
"spell-add-to-dictionary", true,
|
|
"---", null,
|
|
"context-undo", false,
|
|
"context-redo", false,
|
|
"---", null,
|
|
"context-cut", true,
|
|
"context-copy", true,
|
|
"context-paste", null, // ignore clipboard state
|
|
"context-delete", false,
|
|
"context-selectall", true,
|
|
"---", null,
|
|
"spell-check-enabled", true,
|
|
"spell-dictionaries", true,
|
|
["spell-check-dictionary-en-US", true,
|
|
"---", null,
|
|
"spell-add-dictionaries", true], null
|
|
],
|
|
{waitForSpellCheck: true}
|
|
);
|
|
*/
|
|
});
|
|
|
|
add_task(async function test_copylinkcommand() {
|
|
await test_contextmenu("#test-link", null, {
|
|
async postCheckContextMenuFn() {
|
|
document.commandDispatcher
|
|
.getControllerForCommand("cmd_copyLink")
|
|
.doCommand("cmd_copyLink");
|
|
|
|
// The easiest way to check the clipboard is to paste the contents
|
|
// into a textbox.
|
|
await SpecialPowers.spawn(
|
|
gBrowser.selectedBrowser,
|
|
[],
|
|
async function () {
|
|
let doc = content.document;
|
|
let input = doc.getElementById("test-input");
|
|
input.focus();
|
|
input.value = "";
|
|
}
|
|
);
|
|
document.commandDispatcher
|
|
.getControllerForCommand("cmd_paste")
|
|
.doCommand("cmd_paste");
|
|
await SpecialPowers.spawn(
|
|
gBrowser.selectedBrowser,
|
|
[],
|
|
async function () {
|
|
let doc = content.document;
|
|
let input = doc.getElementById("test-input");
|
|
Assert.equal(
|
|
input.value,
|
|
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
|
"http://mozilla.com/",
|
|
"paste for command cmd_paste"
|
|
);
|
|
// Don't keep focus, because that may affect clipboard commands in
|
|
// subsequently-opened menus.
|
|
input.blur();
|
|
}
|
|
);
|
|
},
|
|
});
|
|
});
|
|
|
|
add_task(async function test_dom_full_screen() {
|
|
let fullscreenItems = NAVIGATION_ITEMS.concat([
|
|
"context-leave-dom-fullscreen",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-savepage",
|
|
true,
|
|
...(hasPocket ? ["context-pocket", true] : []),
|
|
"context-selectall",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-take-screenshot",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewsource",
|
|
true,
|
|
]);
|
|
if (AppConstants.platform == "macosx") {
|
|
// Put the bookmarks item next to save page:
|
|
const bmPageIndex = fullscreenItems.indexOf("context-bookmarkpage");
|
|
let bmPageItems = fullscreenItems.splice(bmPageIndex, 2);
|
|
fullscreenItems.splice(
|
|
fullscreenItems.indexOf("context-savepage"),
|
|
0,
|
|
...bmPageItems
|
|
);
|
|
}
|
|
await test_contextmenu("#test-dom-full-screen", fullscreenItems, {
|
|
shiftkey: true,
|
|
async preCheckContextMenuFn() {
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
["full-screen-api.allow-trusted-requests-only", false],
|
|
["full-screen-api.transition-duration.enter", "0 0"],
|
|
["full-screen-api.transition-duration.leave", "0 0"],
|
|
],
|
|
});
|
|
await SpecialPowers.spawn(
|
|
gBrowser.selectedBrowser,
|
|
[],
|
|
async function () {
|
|
let doc = content.document;
|
|
let win = doc.defaultView;
|
|
let full_screen_element = doc.getElementById("test-dom-full-screen");
|
|
let awaitFullScreenChange = ContentTaskUtils.waitForEvent(
|
|
win,
|
|
"fullscreenchange"
|
|
);
|
|
full_screen_element.requestFullscreen();
|
|
await awaitFullScreenChange;
|
|
}
|
|
);
|
|
},
|
|
async postCheckContextMenuFn() {
|
|
await SpecialPowers.spawn(
|
|
gBrowser.selectedBrowser,
|
|
[],
|
|
async function () {
|
|
let win = content.document.defaultView;
|
|
let awaitFullScreenChange = ContentTaskUtils.waitForEvent(
|
|
win,
|
|
"fullscreenchange"
|
|
);
|
|
content.document.exitFullscreen();
|
|
await awaitFullScreenChange;
|
|
}
|
|
);
|
|
},
|
|
});
|
|
});
|
|
|
|
add_task(async function test_pagemenu2() {
|
|
await test_contextmenu(
|
|
"#test-text",
|
|
[
|
|
...NAVIGATION_ITEMS,
|
|
"context-savepage",
|
|
true,
|
|
...(hasPocket ? ["context-pocket", true] : []),
|
|
"context-selectall",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-take-screenshot",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewsource",
|
|
true,
|
|
],
|
|
{ shiftkey: true }
|
|
);
|
|
});
|
|
|
|
add_task(async function test_select_text() {
|
|
await test_contextmenu(
|
|
"#test-select-text",
|
|
[
|
|
"context-copy",
|
|
true,
|
|
"context-selectall",
|
|
true,
|
|
"context-print-selection",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-take-screenshot",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-searchselect",
|
|
true,
|
|
"context-searchselect-private",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewpartialsource-selection",
|
|
true,
|
|
],
|
|
{
|
|
offsetX: 6,
|
|
offsetY: 6,
|
|
async preCheckContextMenuFn() {
|
|
await selectText("#test-select-text");
|
|
},
|
|
}
|
|
);
|
|
});
|
|
|
|
add_task(async function test_select_text_search_service_not_initialized() {
|
|
// Pretend the search service is not initialised.
|
|
Services.search.wrappedJSObject.forceInitializationStatusForTests(
|
|
"not initialized"
|
|
);
|
|
await test_contextmenu(
|
|
"#test-select-text",
|
|
[
|
|
"context-copy",
|
|
true,
|
|
"context-selectall",
|
|
true,
|
|
"context-print-selection",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-take-screenshot",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewpartialsource-selection",
|
|
true,
|
|
],
|
|
{
|
|
offsetX: 6,
|
|
offsetY: 6,
|
|
async preCheckContextMenuFn() {
|
|
await selectText("#test-select-text");
|
|
},
|
|
}
|
|
);
|
|
|
|
// Restore the search service initialization status
|
|
Services.search.wrappedJSObject.forceInitializationStatusForTests("success");
|
|
});
|
|
|
|
add_task(async function test_select_text_link() {
|
|
await test_contextmenu(
|
|
"#test-select-text-link",
|
|
[
|
|
"context-openlinkincurrent",
|
|
true,
|
|
"context-openlinkintab",
|
|
true,
|
|
...(hasContainers ? ["context-openlinkinusercontext-menu", true] : []),
|
|
// We need a blank entry here because the containers submenu is
|
|
// dynamically generated with no ids.
|
|
...(hasContainers ? ["", null] : []),
|
|
"context-openlink",
|
|
true,
|
|
"context-openlinkprivate",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarklink",
|
|
true,
|
|
"context-savelink",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-copy",
|
|
true,
|
|
"context-selectall",
|
|
true,
|
|
"context-print-selection",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-searchselect",
|
|
true,
|
|
"context-searchselect-private",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewpartialsource-selection",
|
|
true,
|
|
],
|
|
{
|
|
offsetX: 6,
|
|
offsetY: 6,
|
|
async preCheckContextMenuFn() {
|
|
await selectText("#test-select-text-link");
|
|
},
|
|
async postCheckContextMenuFn() {
|
|
await SpecialPowers.spawn(
|
|
gBrowser.selectedBrowser,
|
|
[],
|
|
async function () {
|
|
let win = content.document.defaultView;
|
|
win.getSelection().removeAllRanges();
|
|
}
|
|
);
|
|
},
|
|
}
|
|
);
|
|
});
|
|
|
|
add_task(async function test_imagelink() {
|
|
await test_contextmenu("#test-image-link", [
|
|
"context-openlinkintab",
|
|
true,
|
|
...(hasContainers ? ["context-openlinkinusercontext-menu", true] : []),
|
|
// We need a blank entry here because the containers submenu is
|
|
// dynamically generated with no ids.
|
|
...(hasContainers ? ["", null] : []),
|
|
"context-openlink",
|
|
true,
|
|
"context-openlinkprivate",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarklink",
|
|
true,
|
|
"context-savelink",
|
|
true,
|
|
...(hasPocket ? ["context-savelinktopocket", true] : []),
|
|
"context-copylink",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewimage",
|
|
true,
|
|
"context-saveimage",
|
|
true,
|
|
"context-copyimage-contents",
|
|
true,
|
|
"context-copyimage",
|
|
true,
|
|
"context-sendimage",
|
|
true,
|
|
...getTextRecognitionItems(),
|
|
...(Services.prefs.getBoolPref("browser.menu.showViewImageInfo", false)
|
|
? ["context-viewimageinfo", true]
|
|
: []),
|
|
"---",
|
|
null,
|
|
"context-setDesktopBackground",
|
|
true,
|
|
]);
|
|
});
|
|
|
|
add_task(async function test_select_input_text() {
|
|
todo(false, "spell checker tests are failing, bug 1246296");
|
|
|
|
/*
|
|
yield test_contextmenu("#test-select-input-text",
|
|
["context-undo", false,
|
|
"context-redo", false,
|
|
"---", null,
|
|
"context-cut", true,
|
|
"context-copy", true,
|
|
"context-paste", null, // ignore clipboard state
|
|
"context-delete", true,
|
|
"context-selectall", true,
|
|
"---", null,
|
|
"context-searchselect", true,
|
|
"context-searchselect-private", true,
|
|
"---", null,
|
|
"spell-check-enabled", true
|
|
].concat(LOGIN_FILL_ITEMS),
|
|
{
|
|
*preCheckContextMenuFn() {
|
|
yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
|
|
let doc = content.document;
|
|
let win = doc.defaultView;
|
|
win.getSelection().removeAllRanges();
|
|
let element = doc.querySelector("#test-select-input-text");
|
|
element.select();
|
|
});
|
|
}
|
|
}
|
|
);
|
|
*/
|
|
});
|
|
|
|
add_task(async function test_select_input_text_password() {
|
|
todo(false, "spell checker tests are failing, bug 1246296");
|
|
|
|
/*
|
|
yield test_contextmenu("#test-select-input-text-type-password",
|
|
["context-undo", false,
|
|
"context-redo", false,
|
|
"---", null,
|
|
"context-cut", true,
|
|
"context-copy", true,
|
|
"context-paste", null, // ignore clipboard state
|
|
"context-delete", true,
|
|
"context-selectall", true,
|
|
"---", null,
|
|
"spell-check-enabled", true,
|
|
// spell checker is shown on input[type="password"] on this testcase
|
|
"spell-dictionaries", true,
|
|
["spell-check-dictionary-en-US", true,
|
|
"---", null,
|
|
"spell-add-dictionaries", true], null
|
|
].concat(LOGIN_FILL_ITEMS),
|
|
{
|
|
*preCheckContextMenuFn() {
|
|
yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
|
|
let doc = content.document;
|
|
let win = doc.defaultView;
|
|
win.getSelection().removeAllRanges();
|
|
let element = doc.querySelector("#test-select-input-text-type-password");
|
|
element.select();
|
|
});
|
|
},
|
|
*postCheckContextMenuFn() {
|
|
yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
|
|
let win = content.document.defaultView;
|
|
win.getSelection().removeAllRanges();
|
|
});
|
|
}
|
|
}
|
|
);
|
|
*/
|
|
});
|
|
|
|
add_task(async function test_longdesc() {
|
|
await test_contextmenu("#test-longdesc", [
|
|
"context-viewimage",
|
|
true,
|
|
"context-saveimage",
|
|
true,
|
|
"context-copyimage-contents",
|
|
true,
|
|
"context-copyimage",
|
|
true,
|
|
"context-sendimage",
|
|
true,
|
|
...getTextRecognitionItems(),
|
|
...(Services.prefs.getBoolPref("browser.menu.showViewImageInfo", false)
|
|
? ["context-viewimageinfo", true]
|
|
: []),
|
|
"context-viewimagedesc",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-setDesktopBackground",
|
|
true,
|
|
]);
|
|
});
|
|
|
|
add_task(async function test_srcdoc() {
|
|
await test_contextmenu("#test-srcdoc", [
|
|
...NAVIGATION_ITEMS,
|
|
"context-savepage",
|
|
true,
|
|
...(hasPocket ? ["context-pocket", true] : []),
|
|
"context-selectall",
|
|
true,
|
|
"---",
|
|
null,
|
|
"frame",
|
|
null,
|
|
getThisFrameSubMenu([
|
|
"context-reloadframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-saveframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-printframe",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-take-frame-screenshot",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewframesource",
|
|
true,
|
|
"context-viewframeinfo",
|
|
true,
|
|
]),
|
|
null,
|
|
"---",
|
|
null,
|
|
"context-viewsource",
|
|
true,
|
|
]);
|
|
});
|
|
|
|
add_task(async function test_input_spell_false() {
|
|
todo(false, "spell checker tests are failing, bug 1246296");
|
|
|
|
/*
|
|
yield test_contextmenu("#test-contenteditable-spellcheck-false",
|
|
["context-undo", false,
|
|
"context-redo", false,
|
|
"---", null,
|
|
"context-cut", true,
|
|
"context-copy", true,
|
|
"context-paste", null, // ignore clipboard state
|
|
"context-delete", false,
|
|
"context-selectall", true,
|
|
]
|
|
);
|
|
*/
|
|
});
|
|
|
|
add_task(async function test_svg_link() {
|
|
await test_contextmenu("#svg-with-link > a", [
|
|
"context-openlinkintab",
|
|
true,
|
|
...(hasContainers ? ["context-openlinkinusercontext-menu", true] : []),
|
|
// We need a blank entry here because the containers submenu is
|
|
// dynamically generated with no ids.
|
|
...(hasContainers ? ["", null] : []),
|
|
"context-openlink",
|
|
true,
|
|
"context-openlinkprivate",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarklink",
|
|
true,
|
|
"context-savelink",
|
|
true,
|
|
...(hasPocket ? ["context-savelinktopocket", true] : []),
|
|
"context-copylink",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-searchselect",
|
|
true,
|
|
"context-searchselect-private",
|
|
true,
|
|
]);
|
|
|
|
await test_contextmenu("#svg-with-link2 > a", [
|
|
"context-openlinkintab",
|
|
true,
|
|
...(hasContainers ? ["context-openlinkinusercontext-menu", true] : []),
|
|
// We need a blank entry here because the containers submenu is
|
|
// dynamically generated with no ids.
|
|
...(hasContainers ? ["", null] : []),
|
|
"context-openlink",
|
|
true,
|
|
"context-openlinkprivate",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarklink",
|
|
true,
|
|
"context-savelink",
|
|
true,
|
|
...(hasPocket ? ["context-savelinktopocket", true] : []),
|
|
"context-copylink",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-searchselect",
|
|
true,
|
|
"context-searchselect-private",
|
|
true,
|
|
]);
|
|
|
|
await test_contextmenu("#svg-with-link3 > a", [
|
|
"context-openlinkintab",
|
|
true,
|
|
...(hasContainers ? ["context-openlinkinusercontext-menu", true] : []),
|
|
// We need a blank entry here because the containers submenu is
|
|
// dynamically generated with no ids.
|
|
...(hasContainers ? ["", null] : []),
|
|
"context-openlink",
|
|
true,
|
|
"context-openlinkprivate",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarklink",
|
|
true,
|
|
"context-savelink",
|
|
true,
|
|
...(hasPocket ? ["context-savelinktopocket", true] : []),
|
|
"context-copylink",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-searchselect",
|
|
true,
|
|
"context-searchselect-private",
|
|
true,
|
|
]);
|
|
});
|
|
|
|
add_task(async function test_svg_relative_link() {
|
|
await test_contextmenu("#svg-with-relative-link > a", [
|
|
"context-openlinkintab",
|
|
true,
|
|
...(hasContainers ? ["context-openlinkinusercontext-menu", true] : []),
|
|
// We need a blank entry here because the containers submenu is
|
|
// dynamically generated with no ids.
|
|
...(hasContainers ? ["", null] : []),
|
|
"context-openlink",
|
|
true,
|
|
"context-openlinkprivate",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarklink",
|
|
true,
|
|
"context-savelink",
|
|
true,
|
|
...(hasPocket ? ["context-savelinktopocket", true] : []),
|
|
"context-copylink",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-searchselect",
|
|
true,
|
|
"context-searchselect-private",
|
|
true,
|
|
]);
|
|
|
|
await test_contextmenu("#svg-with-relative-link2 > a", [
|
|
"context-openlinkintab",
|
|
true,
|
|
...(hasContainers ? ["context-openlinkinusercontext-menu", true] : []),
|
|
// We need a blank entry here because the containers submenu is
|
|
// dynamically generated with no ids.
|
|
...(hasContainers ? ["", null] : []),
|
|
"context-openlink",
|
|
true,
|
|
"context-openlinkprivate",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarklink",
|
|
true,
|
|
"context-savelink",
|
|
true,
|
|
...(hasPocket ? ["context-savelinktopocket", true] : []),
|
|
"context-copylink",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-searchselect",
|
|
true,
|
|
"context-searchselect-private",
|
|
true,
|
|
]);
|
|
|
|
await test_contextmenu("#svg-with-relative-link3 > a", [
|
|
"context-openlinkintab",
|
|
true,
|
|
...(hasContainers ? ["context-openlinkinusercontext-menu", true] : []),
|
|
// We need a blank entry here because the containers submenu is
|
|
// dynamically generated with no ids.
|
|
...(hasContainers ? ["", null] : []),
|
|
"context-openlink",
|
|
true,
|
|
"context-openlinkprivate",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarklink",
|
|
true,
|
|
"context-savelink",
|
|
true,
|
|
...(hasPocket ? ["context-savelinktopocket", true] : []),
|
|
"context-copylink",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-searchselect",
|
|
true,
|
|
"context-searchselect-private",
|
|
true,
|
|
]);
|
|
});
|
|
|
|
add_task(async function test_background_image() {
|
|
let bgImageItems = [
|
|
"context-viewimage",
|
|
true,
|
|
"context-copyimage",
|
|
true,
|
|
"context-sendimage",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-savepage",
|
|
true,
|
|
...(hasPocket ? ["context-pocket", true] : []),
|
|
"context-selectall",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-take-screenshot",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewsource",
|
|
true,
|
|
];
|
|
if (AppConstants.platform == "macosx") {
|
|
// Back/fwd/(stop|reload) and their separator go before the image items,
|
|
// followed by the bookmark item which goes with save page - so we need
|
|
// to split up NAVIGATION_ITEMS and bgImageItems:
|
|
bgImageItems = [
|
|
...NAVIGATION_ITEMS.slice(0, 8),
|
|
...bgImageItems.slice(0, 8),
|
|
...NAVIGATION_ITEMS.slice(8),
|
|
...bgImageItems.slice(8),
|
|
];
|
|
} else {
|
|
bgImageItems = NAVIGATION_ITEMS.concat(bgImageItems);
|
|
}
|
|
await test_contextmenu("#test-background-image", bgImageItems);
|
|
|
|
// Don't show image related context menu commands for links with background images.
|
|
await test_contextmenu("#test-background-image-link", [
|
|
"context-openlinkintab",
|
|
true,
|
|
...(hasContainers ? ["context-openlinkinusercontext-menu", true] : []),
|
|
// We need a blank entry here because the containers submenu is
|
|
// dynamically generated with no ids.
|
|
...(hasContainers ? ["", null] : []),
|
|
"context-openlink",
|
|
true,
|
|
"context-openlinkprivate",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-bookmarklink",
|
|
true,
|
|
"context-savelink",
|
|
true,
|
|
"context-copylink",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-searchselect",
|
|
true,
|
|
"context-searchselect-private",
|
|
true,
|
|
]);
|
|
|
|
// Don't show image related context menu commands when there is a selection
|
|
// with background images.
|
|
await test_contextmenu(
|
|
"#test-background-image",
|
|
[
|
|
"context-copy",
|
|
true,
|
|
"context-selectall",
|
|
true,
|
|
"context-print-selection",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-take-screenshot",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-searchselect",
|
|
true,
|
|
"context-searchselect-private",
|
|
true,
|
|
"---",
|
|
null,
|
|
"context-viewpartialsource-selection",
|
|
true,
|
|
],
|
|
{
|
|
async preCheckContextMenuFn() {
|
|
await selectText("#test-background-image");
|
|
},
|
|
}
|
|
);
|
|
});
|
|
|
|
add_task(async function test_cleanup_html() {
|
|
gBrowser.removeCurrentTab();
|
|
});
|
|
|
|
/**
|
|
* Selects the text of the element that matches the provided `selector`
|
|
*
|
|
* @param {String} selector
|
|
* A selector passed to querySelector to find
|
|
* the element that will be referenced.
|
|
*/
|
|
async function selectText(selector) {
|
|
await SpecialPowers.spawn(
|
|
gBrowser.selectedBrowser,
|
|
[selector],
|
|
async function (contentSelector) {
|
|
info(`Selecting text of ${contentSelector}`);
|
|
let doc = content.document;
|
|
let win = doc.defaultView;
|
|
win.getSelection().removeAllRanges();
|
|
let div = doc.createRange();
|
|
let element = doc.querySelector(contentSelector);
|
|
Assert.ok(element, "Found element to select text from");
|
|
div.setStartBefore(element);
|
|
div.setEndAfter(element);
|
|
win.getSelection().addRange(div);
|
|
}
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Not all platforms support text recognition.
|
|
* @returns {string[]}
|
|
*/
|
|
function getTextRecognitionItems() {
|
|
return Services.prefs.getBoolPref("dom.text-recognition.enabled") &&
|
|
Services.appinfo.isTextRecognitionSupported
|
|
? ["context-imagetext", true]
|
|
: [];
|
|
}
|