diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /browser/base/content/test/general/browser_bug1297539.js | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | browser/base/content/test/general/browser_bug1297539.js | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/browser/base/content/test/general/browser_bug1297539.js b/browser/base/content/test/general/browser_bug1297539.js new file mode 100644 index 0000000000..dbd8b272fd --- /dev/null +++ b/browser/base/content/test/general/browser_bug1297539.js @@ -0,0 +1,126 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* 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 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Test for Bug 1297539 + * Test that the content event "pasteTransferable" + * (mozilla::EventMessage::eContentCommandPasteTransferable) + * is handled correctly for plain text and html in the remote case. + * + * Original test test_bug525389.html for command content event + * "pasteTransferable" runs only in the content process. + * This doesn't test the remote case. + * + */ + +"use strict"; + +function getLoadContext() { + return window.docShell.QueryInterface(Ci.nsILoadContext); +} + +function getTransferableFromClipboard(asHTML) { + let trans = Cc["@mozilla.org/widget/transferable;1"].createInstance( + Ci.nsITransferable + ); + trans.init(getLoadContext()); + if (asHTML) { + trans.addDataFlavor("text/html"); + } else { + trans.addDataFlavor("text/plain"); + } + Services.clipboard.getData( + trans, + Ci.nsIClipboard.kGlobalClipboard, + SpecialPowers.wrap(window).browsingContext.currentWindowContext + ); + return trans; +} + +async function cutCurrentSelection(elementQueryString, property, browser) { + // Cut the current selection. + await BrowserTestUtils.synthesizeKey("x", { accelKey: true }, browser); + + // The editor should be empty after cut. + await SpecialPowers.spawn( + browser, + [[elementQueryString, property]], + async function ([contentElementQueryString, contentProperty]) { + let element = content.document.querySelector(contentElementQueryString); + is( + element[contentProperty], + "", + `${contentElementQueryString} should be empty after cut (superkey + x)` + ); + } + ); +} + +// Test that you are able to pasteTransferable for plain text +// which is handled by TextEditor::PasteTransferable to paste into the editor. +add_task(async function test_paste_transferable_plain_text() { + let testPage = + "data:text/html," + + '<textarea id="textarea">Write something here</textarea>'; + + await BrowserTestUtils.withNewTab(testPage, async function (browser) { + // Select all the content in your editor element. + await BrowserTestUtils.synthesizeMouse("#textarea", 0, 0, {}, browser); + await BrowserTestUtils.synthesizeKey("a", { accelKey: true }, browser); + + await cutCurrentSelection("#textarea", "value", browser); + + let trans = getTransferableFromClipboard(false); + let DOMWindowUtils = EventUtils._getDOMWindowUtils(window); + DOMWindowUtils.sendContentCommandEvent("pasteTransferable", trans); + + await SpecialPowers.spawn(browser, [], async function () { + let textArea = content.document.querySelector("#textarea"); + is( + textArea.value, + "Write something here", + "Send content command pasteTransferable successful" + ); + }); + }); +}); + +// Test that you are able to pasteTransferable for html +// which is handled by HTMLEditor::PasteTransferable to paste into the editor. +// +// On Linux, +// BrowserTestUtils.synthesizeKey("a", {accelKey: true}, browser); +// doesn't seem to trigger for contenteditable which is why we use +// Selection to select the contenteditable contents. +add_task(async function test_paste_transferable_html() { + let testPage = + "data:text/html," + + '<div contenteditable="true"><b>Bold Text</b><i>italics</i></div>'; + + await BrowserTestUtils.withNewTab(testPage, async function (browser) { + // Select all the content in your editor element. + await BrowserTestUtils.synthesizeMouse("div", 0, 0, {}, browser); + await SpecialPowers.spawn(browser, [], async function () { + let element = content.document.querySelector("div"); + let selection = content.window.getSelection(); + selection.selectAllChildren(element); + }); + + await cutCurrentSelection("div", "textContent", browser); + + let trans = getTransferableFromClipboard(true); + let DOMWindowUtils = EventUtils._getDOMWindowUtils(window); + DOMWindowUtils.sendContentCommandEvent("pasteTransferable", trans); + + await SpecialPowers.spawn(browser, [], async function () { + let textArea = content.document.querySelector("div"); + is( + textArea.innerHTML, + "<b>Bold Text</b><i>italics</i>", + "Send content command pasteTransferable successful" + ); + }); + }); +}); |