diff options
Diffstat (limited to 'toolkit/components/contentanalysis/tests/browser/browser_clipboard_paste_inputandtextarea_content_analysis.js')
-rw-r--r-- | toolkit/components/contentanalysis/tests/browser/browser_clipboard_paste_inputandtextarea_content_analysis.js | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/toolkit/components/contentanalysis/tests/browser/browser_clipboard_paste_inputandtextarea_content_analysis.js b/toolkit/components/contentanalysis/tests/browser/browser_clipboard_paste_inputandtextarea_content_analysis.js new file mode 100644 index 0000000000..6fe37c3368 --- /dev/null +++ b/toolkit/components/contentanalysis/tests/browser/browser_clipboard_paste_inputandtextarea_content_analysis.js @@ -0,0 +1,112 @@ +/* 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); +}); + +const PAGE_URL = + "https://example.com/browser/toolkit/components/contentanalysis/tests/browser/clipboard_paste_inputandtextarea.html"; +const CLIPBOARD_TEXT_STRING = "Just some text"; +async function testClipboardPaste(allowPaste) { + mockCA.setupForTest(allowPaste); + + setClipboardData(); + + let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, PAGE_URL); + let browser = tab.linkedBrowser; + + await SpecialPowers.spawn(browser, [allowPaste], async allowPaste => { + content.document.getElementById("pasteAllowed").checked = allowPaste; + }); + await testPasteWithElementId("testInput", browser, allowPaste); + await testPasteWithElementId("testTextArea", browser, allowPaste); + + BrowserTestUtils.removeTab(tab); +} + +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); + + // Write to clipboard. + Services.clipboard.setData(trans, null, Ci.nsIClipboard.kGlobalClipboard); +} + +async function testPasteWithElementId(elementId, browser, allowPaste) { + let resultPromise = SpecialPowers.spawn(browser, [], () => { + return new Promise(resolve => { + content.document.addEventListener( + "testresult", + event => { + resolve(event.detail.result); + }, + { once: true } + ); + }); + }); + + // Paste into content + await SpecialPowers.spawn(browser, [elementId], async elementId => { + content.document.getElementById(elementId).focus(); + }); + await BrowserTestUtils.synthesizeKey("v", { accelKey: true }, browser); + let result = await resultPromise; + is(result, undefined, "Got unexpected result from page"); + + // Because we call event.clipboardData.getData in the test, this causes another call to + // content analysis. + is(mockCA.calls.length, 2, "Correct number of calls to Content Analysis"); + assertContentAnalysisRequest(mockCA.calls[0], CLIPBOARD_TEXT_STRING); + assertContentAnalysisRequest(mockCA.calls[1], CLIPBOARD_TEXT_STRING); + mockCA.clearCalls(); + let value = await getElementValue(browser, elementId); + is( + value, + allowPaste ? CLIPBOARD_TEXT_STRING : "", + "element has correct value" + ); +} + +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"); +} + +async function getElementValue(browser, elementId) { + return await SpecialPowers.spawn(browser, [elementId], async elementId => { + return content.document.getElementById(elementId).value; + }); +} + +add_task(async function testClipboardPasteWithContentAnalysisAllow() { + await testClipboardPaste(true); +}); + +add_task(async function testClipboardPasteWithContentAnalysisBlock() { + await testClipboardPaste(false); +}); |