1 /* Any copyright is dedicated to the Public Domain.
2 http://creativecommons.org/publicdomain/zero/1.0/ */
4 /* import-globals-from clipboard_helper.js */
8 clipboardTypes.forEach(function (type) {
9 if (!clipboard.isClipboardTypeSupported(type)) {
10 add_task(async function test_clipboard_asyncGetData_not_support() {
11 info(`Test asyncGetData request throwing on ${type}`);
13 () => clipboard.asyncGetData(["text/plain"], type, {}),
14 "Passing unsupported clipboard type should throw"
20 add_task(async function test_clipboard_asyncGetData_throw() {
21 info(`Test asyncGetData request throwing on ${type}`);
23 () => clipboard.asyncGetData([], type, {}),
24 "Passing empty flavor list should throw"
28 () => clipboard.asyncGetData(["text/plain"], type, null),
29 "Passing no callback should throw"
33 add_task(async function test_clipboard_asyncGetData_no_matched_flavor() {
34 info(`Test asyncGetData have no matched flavor on ${type}`);
35 cleanupAllClipboard();
36 is(getClipboardData("text/plain", type), null, "ensure clipboard is empty");
38 writeRandomStringToClipboard("text/plain", type);
39 let request = await new Promise(resolve => {
40 clipboard.asyncGetData(
44 SpecialPowers.Services.scriptSecurityManager.getSystemPrincipal(),
46 QueryInterface: SpecialPowers.ChromeUtils.generateQI([
47 "nsIAsyncClipboardGetCallback",
49 // nsIAsyncClipboardGetCallback
50 onSuccess: SpecialPowers.wrapCallback(function (
51 aAsyncGetClipboardData
53 resolve(aAsyncGetClipboardData);
58 isDeeply(request.flavorList, [], "Check flavorList");
61 add_task(async function test_empty_data() {
62 info(`Test asyncGetData request with empty data on ${type}`);
63 cleanupAllClipboard();
64 is(getClipboardData("text/plain", type), null, "ensure clipboard is empty");
66 let request = await asyncGetClipboardData(type);
67 isDeeply(request.flavorList, [], "Check flavorList");
68 await asyncClipboardRequestGetData(request, "text/plain", true).catch(
73 add_task(async function test_clipboard_asyncGetData_after_write() {
74 info(`Test asyncGetData request after write on ${type}`);
76 let str = writeRandomStringToClipboard("text/plain", type);
77 let request = await asyncGetClipboardData(type);
78 isDeeply(request.flavorList, ["text/plain"], "Check flavorList");
80 await asyncClipboardRequestGetData(request, "text/plain"),
84 ok(request.valid, "request should still be valid");
85 // Requesting a flavor that is not in the list should throw error.
86 await asyncClipboardRequestGetData(request, "text/html", true).catch(
89 ok(request.valid, "request should still be valid");
91 // Writing a new data should invalid existing get request.
92 str = writeRandomStringToClipboard("text/plain", type);
93 await asyncClipboardRequestGetData(request, "text/plain").then(
95 ok(false, "asyncClipboardRequestGetData should not success");
98 ok(true, "asyncClipboardRequestGetData should reject");
101 ok(!request.valid, "request should no longer be valid");
103 info(`check clipboard data again`);
104 request = await asyncGetClipboardData(type);
105 isDeeply(request.flavorList, ["text/plain"], "Check flavorList");
107 await asyncClipboardRequestGetData(request, "text/plain"),
112 cleanupAllClipboard();
115 add_task(async function test_clipboard_asyncGetData_after_empty() {
116 info(`Test asyncGetData request after empty on ${type}`);
118 let str = writeRandomStringToClipboard("text/plain", type);
119 let request = await asyncGetClipboardData(type);
120 isDeeply(request.flavorList, ["text/plain"], "Check flavorList");
122 await asyncClipboardRequestGetData(request, "text/plain"),
126 ok(request.valid, "request should still be valid");
128 // Empty clipboard data
129 emptyClipboardData(type);
130 is(getClipboardData("text/plain", type), null, "ensure clipboard is empty");
132 await asyncClipboardRequestGetData(request, "text/plain").then(
134 ok(false, "asyncClipboardRequestGetData should not success");
137 ok(true, "asyncClipboardRequestGetData should reject");
140 ok(!request.valid, "request should no longer be valid");
142 info(`check clipboard data again`);
143 request = await asyncGetClipboardData(type);
144 isDeeply(request.flavorList, [], "Check flavorList");
146 cleanupAllClipboard();
150 add_task(async function test_html_data() {
151 info(`Test asyncGetData request with html data`);
153 const html_str = `<img src="https://example.com/oops">`;
154 writeStringToClipboard(html_str, "text/html", clipboard.kGlobalClipboard);
156 let request = await asyncGetClipboardData(clipboard.kGlobalClipboard);
157 isDeeply(request.flavorList, ["text/html"], "Check flavorList");
159 await asyncClipboardRequestGetData(request, "text/html"),
160 // On Windows, widget adds extra data into HTML clipboard.
161 navigator.platform.includes("Win")
162 ? `<html><body>\n<!--StartFragment-->${html_str}<!--EndFragment-->\n</body>\n</html>`
166 // Requesting a flavor that is not in the list should throw error.
167 await asyncClipboardRequestGetData(request, "text/plain", true).catch(