/* -*- 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," +
'';
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," +
'Bold Textitalics
';
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,
"Bold Textitalics",
"Send content command pasteTransferable successful"
);
});
});
});