Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- Manifest: dom/events/test/clipboard/browser.toml
/* -*- Mode: JavaScript; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
"use strict";
const kContentFileUrl = kBaseUrlForContent + "simple_page_ext.html";
beforeEach(async () => {
info("Write random text to clipboard");
await promiseWritingRandomTextToClipboard();
});
describe("test paste comment", () => {
it(`called from system principal`, async () => {
document.clearUserGestureActivation();
ok(
document.queryCommandSupported("paste"),
"Check if the 'paste' command is supported"
);
// Test without editing.
ok(
!document.queryCommandEnabled("paste"),
"Check if the 'paste' command is enabled without editing"
);
ok(
!document.execCommand("paste"),
"Check if the 'paste' command is succeed without editing"
);
// Test with editing.
const textArea = document.createElement("textarea");
document.body.appendChild(textArea);
textArea.textContent = "textarea text";
textArea.setSelectionRange(0, textArea.value.length);
textArea.focus();
ok(
document.queryCommandEnabled("paste"),
"Check if the 'paste' command is enabled when editing"
);
ok(
document.execCommand("paste"),
"Check if the 'paste' command is succeed when editing"
);
textArea.remove();
});
it(`called from web content`, async () => {
await BrowserTestUtils.withNewTab(kContentFileUrl, async browser => {
await SpecialPowers.spawn(browser, [], async () => {
const doc = Cu.waiveXrays(content.document);
ok(
!doc.queryCommandSupported("paste"),
`Check if the 'paste' command is supported`
);
// Test no user activation.
content.document.clearUserGestureActivation();
ok(
!doc.queryCommandEnabled("paste"),
"Check if the 'paste' command is enabled without user activation"
);
ok(
!doc.execCommand("paste"),
"Check if the 'paste' command is succeed without user activation"
);
// Test with user activation.
content.document.notifyUserGestureActivation();
ok(
!doc.queryCommandEnabled("paste"),
"Check if the 'paste' command is enabled with user activation"
);
ok(
!doc.execCommand("paste"),
"Check if the 'paste' command is succeed with user activation"
);
// Test with editing.
const textArea = content.document.createElement("textarea");
content.document.body.appendChild(textArea);
textArea.textContent = "textarea text";
textArea.setSelectionRange(0, textArea.value.length);
textArea.focus();
// Test no user activation.
content.document.clearUserGestureActivation();
ok(
!doc.queryCommandEnabled("paste"),
"Check if the 'paste' command is enabled without user activation when editing"
);
ok(
!doc.execCommand("paste"),
"Check if the 'paste' command is succeed without user activation when editing"
);
// Test with user activation.
textArea.textContent = "textarea text";
textArea.setSelectionRange(0, textArea.value.length);
textArea.focus();
content.document.notifyUserGestureActivation();
ok(
!doc.queryCommandEnabled("paste"),
"Check if the 'paste' command is enabled with user activation when editing"
);
ok(
!doc.execCommand("paste"),
"Check if the 'paste' command is succeed with user activation when editing"
);
});
});
});
[true, false].forEach(aPermission => {
describe(`extension ${aPermission ? "with" : "without"} clipboardRead permission`, () => {
const sharedScript = function () {
this.testPasteCommand = function () {
return [
document.queryCommandSupported("paste"),
document.queryCommandEnabled("paste"),
document.execCommand("paste"),
];
};
};
it("called from content script", async () => {
const contentScript = function () {
document
.querySelector("button")
.addEventListener("click", function (e) {
browser.test.sendMessage("result", testPasteCommand());
});
browser.test.sendMessage("ready", testPasteCommand());
};
const extensionData = {
manifest: {
content_scripts: [
{
js: ["sharedScript.js", "contentscript.js"],
},
],
},
files: {
"sharedScript.js": sharedScript,
"contentscript.js": contentScript,
},
};
if (aPermission) {
extensionData.manifest.permissions = ["clipboardRead"];
}
// Load and start the extension.
const extension = ExtensionTestUtils.loadExtension(extensionData);
await extension.startup();
await BrowserTestUtils.withNewTab(kContentFileUrl, async browser => {
let [supported, enabled, succeed] =
await extension.awaitMessage("ready");
is(
supported,
aPermission,
"Check if the 'paste' command is supported"
);
is(
enabled,
aPermission,
"Check if the 'paste' command is enabled without user activation"
);
is(
succeed,
aPermission,
"Check if the 'paste' command is succeed without user activation"
);
// Click on the content to trigger user activation.
promiseClickContentElement(browser, "btn");
[supported, enabled, succeed] =
await extension.awaitMessage("result");
is(
enabled,
aPermission,
"Check if the 'paste' command is enabled with user activation"
);
is(
succeed,
aPermission,
"Check if the 'paste' command is succeed with user activation"
);
});
await extension.unload();
});
it("called from content script when editing", async () => {
const contentScript = function () {
const textArea = document.createElement("textarea");
document.body.appendChild(textArea);
const testPasteCommandWhenEditing = function () {
// Start editing.
textArea.textContent = "textarea text";
textArea.setSelectionRange(0, textArea.value.length);
textArea.focus();
return testPasteCommand();
};
document
.querySelector("button")
.addEventListener("click", function (e) {
browser.test.sendMessage("result", testPasteCommandWhenEditing());
});
browser.test.sendMessage("ready", testPasteCommandWhenEditing());
};
const extensionData = {
manifest: {
content_scripts: [
{
js: ["sharedScript.js", "contentscript.js"],
},
],
},
files: {
"sharedScript.js": sharedScript,
"contentscript.js": contentScript,
},
};
if (aPermission) {
extensionData.manifest.permissions = ["clipboardRead"];
}
// Load and start the extension.
const extension = ExtensionTestUtils.loadExtension(extensionData);
await extension.startup();
await BrowserTestUtils.withNewTab(kContentFileUrl, async browser => {
let [supported, enabled, succeed] =
await extension.awaitMessage("ready");
is(
supported,
aPermission,
"Check if the 'paste' command is supported"
);
is(
enabled,
aPermission,
"Check if the 'paste' command is enabled without user activation"
);
is(
succeed,
aPermission,
"Check if the 'paste' command is succeed without user activation"
);
// Click on the content to trigger user activation.
promiseClickContentElement(browser, "btn");
[supported, enabled, succeed] =
await extension.awaitMessage("result");
is(
enabled,
aPermission,
"Check if the 'paste' command is enabled with user activation"
);
is(
succeed,
aPermission,
"Check if the 'paste' command is succeed with user activation"
);
});
await extension.unload();
});
it("called from background script", async () => {
const backgroundScript = function () {
browser.test.sendMessage("ready", testPasteCommand());
};
const extensionData = {
background: [sharedScript, backgroundScript],
};
if (aPermission) {
extensionData.manifest = {
permissions: ["clipboardRead"],
};
}
// Load and start the extension.
const extension = ExtensionTestUtils.loadExtension(extensionData);
await extension.startup();
await BrowserTestUtils.withNewTab(kContentFileUrl, async browser => {
let [supported, enabled, succeed] =
await extension.awaitMessage("ready");
is(
supported,
aPermission,
"Check if the 'paste' command is supported"
);
is(enabled, aPermission, "Check if the 'paste' command is enabled");
is(succeed, aPermission, "Check if the 'paste' command is succeed");
});
await extension.unload();
});
});
});
});