Skip to content

Commit

Permalink
Bug 1317322 - Activate paste in menus when within <textarea> contro…
Browse files Browse the repository at this point in the history
…ls, r=ehsan

MozReview-Commit-ID: 7YD8qtsC3u6
  • Loading branch information
mystor committed Jan 18, 2017
1 parent c5d028b commit 2038086
Show file tree
Hide file tree
Showing 9 changed files with 72 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,11 @@ add_task(function* () {
is(cmdDelete.getAttribute("disabled"), "true", "cmdDelete is disabled");
is(cmdSelectAll.getAttribute("disabled"), "true", "cmdSelectAll is disabled");

// Cut/Copy items are enabled in context menu even if there
// is no selection. See also Bug 1303033
// Cut/Copy/Paste items are enabled in context menu even if there is no
// selection. See also Bug 1303033, and 1317322
is(cmdCut.getAttribute("disabled"), "", "cmdCut is enabled");
is(cmdCopy.getAttribute("disabled"), "", "cmdCopy is enabled");

if (isWindows()) {
// emptyClipboard only works on Windows (666254), assert paste only for this OS.
is(cmdPaste.getAttribute("disabled"), "true", "cmdPaste is disabled");
}
is(cmdPaste.getAttribute("disabled"), "", "cmdPaste is enabled");

info("Closing context menu");
let onContextMenuHidden = once(searchContextMenu, "popuphidden");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,11 @@ add_task(function* () {
is(cmdDelete.getAttribute("disabled"), "true", "cmdDelete is disabled");
is(cmdSelectAll.getAttribute("disabled"), "true", "cmdSelectAll is disabled");

// Cut/Copy items are enabled in context menu even if there
// is no selection. See also Bug 1303033
// Cut/Copy/Paste items are enabled in context menu even if there is no
// selection. See also Bug 1303033, and 1317322
is(cmdCut.getAttribute("disabled"), "", "cmdCut is enabled");
is(cmdCopy.getAttribute("disabled"), "", "cmdCopy is enabled");

if (isWindows()) {
// emptyClipboard only works on Windows (666254), assert paste only for this OS.
is(cmdPaste.getAttribute("disabled"), "true", "cmdPaste is disabled");
}
is(cmdPaste.getAttribute("disabled"), "", "cmdPaste is enabled");

info("Closing context menu");
let onContextMenuHidden = once(searchContextMenu, "popuphidden");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,10 @@ add_task(function* () {
is(cmdSelectAll.getAttribute("disabled"), "true", "cmdSelectAll is disabled");

// Cut/Copy items are enabled in context menu even if there
// is no selection. See also Bug 1303033
// is no selection. See also Bug 1303033, and 1317322
is(cmdCut.getAttribute("disabled"), "", "cmdCut is enabled");
is(cmdCopy.getAttribute("disabled"), "", "cmdCopy is enabled");

if (isWindows()) {
// emptyClipboard only works on Windows (666254), assert paste only for this OS.
is(cmdPaste.getAttribute("disabled"), "true", "cmdPaste is disabled");
}
is(cmdPaste.getAttribute("disabled"), "", "cmdPaste is enabled");

info("Closing context menu");
let onContextMenuHidden = once(searchContextMenu, "popuphidden");
Expand Down
7 changes: 7 additions & 0 deletions editor/libeditor/HTMLEditorDataTransfer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1538,6 +1538,13 @@ HTMLEditor::CanPaste(int32_t aSelectionType,
NS_ENSURE_ARG_POINTER(aCanPaste);
*aCanPaste = false;

// Always enable the paste command when inside of a HTML or XHTML document.
nsCOMPtr<nsIDocument> doc = GetDocument();
if (doc && doc->IsHTMLOrXHTML()) {
*aCanPaste = true;
return NS_OK;
}

// can't paste if readonly
if (!IsModifiable()) {
return NS_OK;
Expand Down
7 changes: 7 additions & 0 deletions editor/libeditor/TextEditorDataTransfer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,13 @@ TextEditor::CanPaste(int32_t aSelectionType,
NS_ENSURE_ARG_POINTER(aCanPaste);
*aCanPaste = false;

// Always enable the paste command when inside of a HTML or XHTML document.
nsCOMPtr<nsIDocument> doc = GetDocument();
if (doc && doc->IsHTMLOrXHTML()) {
*aCanPaste = true;
return NS_OK;
}

// can't paste if readonly
if (!IsModifiable()) {
return NS_OK;
Expand Down
1 change: 1 addition & 0 deletions editor/libeditor/tests/chrome.ini
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ support-files = green.png
[test_htmleditor_keyevent_handling.html]
[test_texteditor_keyevent_handling.html]
skip-if = (debug && os=='win') || (os == 'linux') # Bug 1116205, leaks on windows debug, fails delete key on linux
[test_pasteImgTextarea.xul]
2 changes: 2 additions & 0 deletions editor/libeditor/tests/mochitest.ini
Original file line number Diff line number Diff line change
Expand Up @@ -239,3 +239,5 @@ skip-if = toolkit == 'android'
[test_css_chrome_load_access.html]
skip-if = toolkit == 'android' # chrome urls not available due to packaging
[test_selection_move_commands.html]
[test_pasteImgTextarea.html]
skip-if = toolkit == 'android' # bug 1299578
20 changes: 20 additions & 0 deletions editor/libeditor/tests/test_pasteImgTextarea.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<!doctype html>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<script src="/tests/SimpleTest/SpawnTask.js"></script>
<img id="i" src="green.png">
<textarea id="t"></textarea>

<script>
let loaded = new Promise(resolve => addLoadEvent(resolve));
add_task(function*() {
yield loaded;
SpecialPowers.setCommandNode(window, document.getElementById("i"));
SpecialPowers.doCommand(window, "cmd_copyImageContents");
let input = document.getElementById("t");
input.focus();
var controller =
SpecialPowers.wrap(input).controllers.getControllerForCommand("cmd_paste");
is(controller.isCommandEnabled("cmd_paste"), true,
"paste should be enabled in html textareas when an image is on the clipboard");
});
</script>
27 changes: 27 additions & 0 deletions editor/libeditor/tests/test_pasteImgTextarea.xul
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?>
<window xmlns:html="http://www.w3.org/1999/xhtml"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SpawnTask.js"></script>

<body xmlns="http://www.w3.org/1999/xhtml">
<html:img id="i" src="green.png" />
<html:textarea id="t"></html:textarea>
</body>
<script type="text/javascript"><![CDATA[
let loaded = new Promise(resolve => addLoadEvent(resolve));
add_task(function*() {
yield loaded;
SpecialPowers.setCommandNode(window, document.getElementById("i"));
SpecialPowers.doCommand(window, "cmd_copyImageContents");
let input = document.getElementById("t");
input.focus();
var controller =
SpecialPowers.wrap(input).controllers.getControllerForCommand("cmd_paste");
is(controller.isCommandEnabled("cmd_paste"), false,
"paste should not be enabled in xul textareas when an image is on the clipboard");
});
]]></script>
</window>

0 comments on commit 2038086

Please sign in to comment.