summaryrefslogtreecommitdiffstats
path: root/toolkit/components/contentanalysis/tests/browser/browser_clipboard_read_async_content_analysis.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/contentanalysis/tests/browser/browser_clipboard_read_async_content_analysis.js')
-rw-r--r--toolkit/components/contentanalysis/tests/browser/browser_clipboard_read_async_content_analysis.js195
1 files changed, 195 insertions, 0 deletions
diff --git a/toolkit/components/contentanalysis/tests/browser/browser_clipboard_read_async_content_analysis.js b/toolkit/components/contentanalysis/tests/browser/browser_clipboard_read_async_content_analysis.js
new file mode 100644
index 0000000000..7d180a048b
--- /dev/null
+++ b/toolkit/components/contentanalysis/tests/browser/browser_clipboard_read_async_content_analysis.js
@@ -0,0 +1,195 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+let mockCA = makeMockContentAnalysis();
+
+add_setup(async function test_setup() {
+ mockCA = mockContentAnalysisService(mockCA);
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.events.asyncClipboard.readText", true],
+ // This pref turns off the "Paste" popup
+ ["dom.events.testing.asyncClipboard", true],
+ ],
+ });
+});
+
+const PAGE_URL =
+ "https://example.com/browser/toolkit/components/contentanalysis/tests/browser/clipboard_read_async.html";
+const CLIPBOARD_TEXT_STRING = "Some plain text";
+const CLIPBOARD_HTML_STRING = "<b>Some HTML</b>";
+async function testClipboardReadAsync(allowPaste) {
+ mockCA.setupForTest(allowPaste);
+
+ setClipboardData();
+
+ let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, PAGE_URL);
+ let browser = tab.linkedBrowser;
+ {
+ let result = await setDataAndStartTest(browser, allowPaste, "read");
+ is(result, true, "Got unexpected result from page for read()");
+
+ is(
+ mockCA.calls.length,
+ 2,
+ "Correct number of calls to Content Analysis for read()"
+ );
+ // On Windows, widget adds extra data into HTML clipboard.
+ let expectedHtml = navigator.platform.includes("Win")
+ ? `<html><body>\n<!--StartFragment-->${CLIPBOARD_HTML_STRING}<!--EndFragment-->\n</body>\n</html>`
+ : CLIPBOARD_HTML_STRING;
+
+ assertContentAnalysisRequest(mockCA.calls[0], expectedHtml);
+ assertContentAnalysisRequest(mockCA.calls[1], CLIPBOARD_TEXT_STRING);
+ mockCA.clearCalls();
+ }
+
+ {
+ let result = await setDataAndStartTest(browser, allowPaste, "readText");
+ is(result, true, "Got unexpected result from page for readText()");
+
+ is(
+ mockCA.calls.length,
+ 1,
+ "Correct number of calls to Content Analysis for read()"
+ );
+ assertContentAnalysisRequest(mockCA.calls[0], CLIPBOARD_TEXT_STRING);
+ mockCA.clearCalls();
+ }
+
+ BrowserTestUtils.removeTab(tab);
+}
+
+async function testClipboardReadAsyncWithErrorHelper() {
+ mockCA.setupForTestWithError(Cr.NS_ERROR_NOT_AVAILABLE);
+
+ setClipboardData();
+
+ // This test throws a number of exceptions, so tell the framework this is OK.
+ // If an exception is thrown we won't get the right response from setDataAndStartTest()
+ // so this should be safe to do.
+ ignoreAllUncaughtExceptions();
+ let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, PAGE_URL);
+ let browser = tab.linkedBrowser;
+ {
+ let result = await setDataAndStartTest(browser, false, "read", true);
+ is(result, true, "Got unexpected result from page for read()");
+
+ is(
+ mockCA.calls.length,
+ 2,
+ "Correct number of calls to Content Analysis for read()"
+ );
+ // On Windows, widget adds extra data into HTML clipboard.
+ let expectedHtml = navigator.platform.includes("Win")
+ ? `<html><body>\n<!--StartFragment-->${CLIPBOARD_HTML_STRING}<!--EndFragment-->\n</body>\n</html>`
+ : CLIPBOARD_HTML_STRING;
+
+ assertContentAnalysisRequest(mockCA.calls[0], expectedHtml);
+ assertContentAnalysisRequest(mockCA.calls[1], CLIPBOARD_TEXT_STRING);
+ mockCA.clearCalls();
+ }
+
+ {
+ let result = await setDataAndStartTest(browser, false, "readText", true);
+ is(result, true, "Got unexpected result from page for readText()");
+
+ is(
+ mockCA.calls.length,
+ 1,
+ "Correct number of calls to Content Analysis for read()"
+ );
+ assertContentAnalysisRequest(mockCA.calls[0], CLIPBOARD_TEXT_STRING);
+ mockCA.clearCalls();
+ }
+
+ BrowserTestUtils.removeTab(tab);
+}
+
+function setDataAndStartTest(
+ browser,
+ allowPaste,
+ testType,
+ shouldError = false
+) {
+ return SpecialPowers.spawn(
+ browser,
+ [allowPaste, testType, shouldError],
+ (allowPaste, testType, shouldError) => {
+ return new Promise(resolve => {
+ content.document.addEventListener(
+ "testresult",
+ event => {
+ resolve(event.detail.result);
+ },
+ { once: true }
+ );
+ content.document.getElementById("pasteAllowed").checked = allowPaste;
+ content.document.getElementById("contentAnalysisReturnsError").checked =
+ shouldError;
+ content.document.dispatchEvent(
+ new content.CustomEvent("teststart", {
+ detail: Cu.cloneInto({ testType }, content),
+ })
+ );
+ });
+ }
+ );
+}
+
+function assertContentAnalysisRequest(request, expectedText) {
+ is(request.url.spec, PAGE_URL, "request has correct URL");
+ is(
+ request.analysisType,
+ Ci.nsIContentAnalysisRequest.eBulkDataEntry,
+ "request has correct analysisType"
+ );
+ is(
+ request.operationTypeForDisplay,
+ Ci.nsIContentAnalysisRequest.eClipboard,
+ "request has correct operationTypeForDisplay"
+ );
+ is(request.filePath, "", "request filePath should match");
+ is(request.textContent, expectedText, "request textContent should match");
+ is(request.printDataHandle, 0, "request printDataHandle should not be 0");
+ is(request.printDataSize, 0, "request printDataSize should not be 0");
+ ok(!!request.requestToken.length, "request requestToken should not be empty");
+}
+
+function setClipboardData() {
+ const trans = Cc["@mozilla.org/widget/transferable;1"].createInstance(
+ Ci.nsITransferable
+ );
+ trans.init(null);
+ {
+ trans.addDataFlavor("text/plain");
+ const str = Cc["@mozilla.org/supports-string;1"].createInstance(
+ Ci.nsISupportsString
+ );
+ str.data = CLIPBOARD_TEXT_STRING;
+ trans.setTransferData("text/plain", str);
+ }
+ {
+ trans.addDataFlavor("text/html");
+ const str = Cc["@mozilla.org/supports-string;1"].createInstance(
+ Ci.nsISupportsString
+ );
+ str.data = CLIPBOARD_HTML_STRING;
+ trans.setTransferData("text/html", str);
+ }
+
+ // Write to clipboard.
+ Services.clipboard.setData(trans, null, Ci.nsIClipboard.kGlobalClipboard);
+}
+
+add_task(async function testClipboardReadAsyncWithContentAnalysisAllow() {
+ await testClipboardReadAsync(true);
+});
+
+add_task(async function testClipboardReadAsyncWithContentAnalysisBlock() {
+ await testClipboardReadAsync(false);
+});
+
+add_task(async function testClipboardReadAsyncWithError() {
+ await testClipboardReadAsyncWithErrorHelper();
+});