Backed out changeset 2450366cf7ca (bug 1891629) for causing win msix mochitest failures
[gecko.git] / widget / tests / file_test_clipboard_asyncGetData.js
blob3ff5700e1a92dbb55e68ae80257d5241c21911d0
1 /* Any copyright is dedicated to the Public Domain.
2    http://creativecommons.org/publicdomain/zero/1.0/ */
4 /* import-globals-from clipboard_helper.js */
6 "use strict";
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}`);
12       SimpleTest.doesThrow(
13         () => clipboard.asyncGetData(["text/plain"], type, {}),
14         "Passing unsupported clipboard type should throw"
15       );
16     });
17     return;
18   }
20   add_task(async function test_clipboard_asyncGetData_throw() {
21     info(`Test asyncGetData request throwing on ${type}`);
22     SimpleTest.doesThrow(
23       () => clipboard.asyncGetData([], type, {}),
24       "Passing empty flavor list should throw"
25     );
27     SimpleTest.doesThrow(
28       () => clipboard.asyncGetData(["text/plain"], type, null),
29       "Passing no callback should throw"
30     );
31   });
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(
41         ["text/html"],
42         type,
43         null,
44         SpecialPowers.Services.scriptSecurityManager.getSystemPrincipal(),
45         {
46           QueryInterface: SpecialPowers.ChromeUtils.generateQI([
47             "nsIAsyncClipboardGetCallback",
48           ]),
49           // nsIAsyncClipboardGetCallback
50           onSuccess: SpecialPowers.wrapCallback(function (
51             aAsyncGetClipboardData
52           ) {
53             resolve(aAsyncGetClipboardData);
54           }),
55         }
56       );
57     });
58     isDeeply(request.flavorList, [], "Check flavorList");
59   });
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(
69       () => {}
70     );
71   });
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");
79     is(
80       await asyncClipboardRequestGetData(request, "text/plain"),
81       str,
82       "Check data"
83     );
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(
87       () => {}
88     );
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(
94       () => {
95         ok(false, "asyncClipboardRequestGetData should not success");
96       },
97       () => {
98         ok(true, "asyncClipboardRequestGetData should reject");
99       }
100     );
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");
106     is(
107       await asyncClipboardRequestGetData(request, "text/plain"),
108       str,
109       "Check data"
110     );
112     cleanupAllClipboard();
113   });
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");
121     is(
122       await asyncClipboardRequestGetData(request, "text/plain"),
123       str,
124       "Check data"
125     );
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(
133       () => {
134         ok(false, "asyncClipboardRequestGetData should not success");
135       },
136       () => {
137         ok(true, "asyncClipboardRequestGetData should reject");
138       }
139     );
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();
147   });
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");
158   is(
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>`
163       : html_str,
164     "Check data"
165   );
166   // Requesting a flavor that is not in the list should throw error.
167   await asyncClipboardRequestGetData(request, "text/plain", true).catch(
168     () => {}
169   );