зеркало из https://github.com/mozilla/gecko-dev.git
Bug 961702 - "Copy" context menu action doesn't copy rich content while document in design mode (or inside container that allows to edit its content). r=sfoster
--HG-- rename : browser/metro/base/tests/mochitest/browser_context_menu_tests_04.html => browser/metro/base/tests/mochitest/browser_context_menu_tests_05.html
This commit is contained in:
Родитель
9ad450b900
Коммит
9e840cbd3c
|
@ -165,6 +165,13 @@ var ContextMenuHandler = {
|
||||||
} else {
|
} else {
|
||||||
Util.dumpLn("error: target element does not support nsIDOMNSEditableElement");
|
Util.dumpLn("error: target element does not support nsIDOMNSEditableElement");
|
||||||
}
|
}
|
||||||
|
} else if (Util.isEditableContent(this._target)) {
|
||||||
|
try {
|
||||||
|
this._target.ownerDocument.execCommand("copy", false);
|
||||||
|
} catch (ex) {
|
||||||
|
dump("ContextMenuHandler: exception copying from contentEditable: " +
|
||||||
|
ex.message + "\n");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
let selectionText = this._previousState.string;
|
let selectionText = this._previousState.string;
|
||||||
|
|
||||||
|
|
|
@ -744,7 +744,7 @@ gTests.push({
|
||||||
// Case #2: Document isn't in design mode and text is selected.
|
// Case #2: Document isn't in design mode and text is selected.
|
||||||
tabWindow.getSelection().selectAllChildren(testSpan);
|
tabWindow.getSelection().selectAllChildren(testSpan);
|
||||||
|
|
||||||
let promise = waitForEvent(tabWindow.document, "popupshown");
|
let promise = waitForEvent(document, "popupshown");
|
||||||
sendContextMenuClickToSelection(tabWindow);
|
sendContextMenuClickToSelection(tabWindow);
|
||||||
yield promise;
|
yield promise;
|
||||||
|
|
||||||
|
@ -758,7 +758,7 @@ gTests.push({
|
||||||
tabWindow.document.designMode = "on";
|
tabWindow.document.designMode = "on";
|
||||||
tabWindow.getSelection().removeAllRanges();
|
tabWindow.getSelection().removeAllRanges();
|
||||||
|
|
||||||
promise = waitForEvent(tabWindow.document, "popupshown");
|
promise = waitForEvent(document, "popupshown");
|
||||||
sendContextMenuClickToElement(tabWindow, testSpan);
|
sendContextMenuClickToElement(tabWindow, testSpan);
|
||||||
yield promise;
|
yield promise;
|
||||||
|
|
||||||
|
@ -771,7 +771,7 @@ gTests.push({
|
||||||
// Case #4: Document is in design mode and text is selected.
|
// Case #4: Document is in design mode and text is selected.
|
||||||
tabWindow.getSelection().selectAllChildren(testSpan);
|
tabWindow.getSelection().selectAllChildren(testSpan);
|
||||||
|
|
||||||
promise = waitForEvent(tabWindow.document, "popupshown");
|
promise = waitForEvent(document, "popupshown");
|
||||||
sendContextMenuClickToSelection(tabWindow);
|
sendContextMenuClickToSelection(tabWindow);
|
||||||
yield promise;
|
yield promise;
|
||||||
|
|
||||||
|
@ -787,6 +787,93 @@ gTests.push({
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
gTests.push({
|
||||||
|
desc: "Bug 961702 - 'Copy' context menu action does not copy rich content " +
|
||||||
|
"while document in design mode (or inside container that allows to " +
|
||||||
|
"edit its content)",
|
||||||
|
run: function test() {
|
||||||
|
info(chromeRoot + "browser_context_menu_tests_05.html");
|
||||||
|
yield addTab(chromeRoot + "browser_context_menu_tests_05.html");
|
||||||
|
|
||||||
|
purgeEventQueue();
|
||||||
|
emptyClipboard();
|
||||||
|
ContextUI.dismiss();
|
||||||
|
|
||||||
|
yield waitForCondition(() => !ContextUI.navbarVisible);
|
||||||
|
|
||||||
|
let tabWindow = Browser.selectedTab.browser.contentWindow;
|
||||||
|
let testDiv = tabWindow.document.getElementById("div1");
|
||||||
|
|
||||||
|
// Case #1: Document is in design mode.
|
||||||
|
tabWindow.document.designMode = "on";
|
||||||
|
|
||||||
|
let promise = waitForEvent(document, "popupshown");
|
||||||
|
sendContextMenuClickToElement(tabWindow, testDiv);
|
||||||
|
yield promise;
|
||||||
|
|
||||||
|
let selectAllMenuItem = document.getElementById("context-select-all");
|
||||||
|
promise = waitForEvent(document, "popuphidden");
|
||||||
|
sendNativeTap(selectAllMenuItem);
|
||||||
|
yield promise;
|
||||||
|
|
||||||
|
promise = waitForEvent(document, "popupshown");
|
||||||
|
sendContextMenuClickToSelection(tabWindow);
|
||||||
|
yield promise;
|
||||||
|
|
||||||
|
let copyMenuItem = document.getElementById("context-copy");
|
||||||
|
promise = waitForEvent(document, "popuphidden");
|
||||||
|
sendNativeTap(copyMenuItem);
|
||||||
|
yield promise;
|
||||||
|
|
||||||
|
// The wait is needed to give time to populate the clipboard.
|
||||||
|
let clipboardContent = "";
|
||||||
|
let contentToCopy = tabWindow.document.body.innerHTML;
|
||||||
|
yield waitForCondition(function () {
|
||||||
|
clipboardContent = SpecialPowers.getClipboardData("text/html");
|
||||||
|
return clipboardContent == contentToCopy;
|
||||||
|
});
|
||||||
|
ok(clipboardContent == contentToCopy, "Rich content copied.");
|
||||||
|
|
||||||
|
// Case #2: Container with editable content.
|
||||||
|
emptyClipboard();
|
||||||
|
tabWindow.document.designMode = "off";
|
||||||
|
tabWindow.getSelection().removeAllRanges();
|
||||||
|
|
||||||
|
promise = waitForEvent(tabWindow.document.body, "focus");
|
||||||
|
sendNativeTap(testDiv);
|
||||||
|
yield promise;
|
||||||
|
|
||||||
|
promise = waitForEvent(document, "popupshown");
|
||||||
|
sendContextMenuClickToElement(tabWindow, testDiv);
|
||||||
|
yield promise;
|
||||||
|
|
||||||
|
selectAllMenuItem = document.getElementById("context-select-all");
|
||||||
|
promise = waitForEvent(document, "popuphidden");
|
||||||
|
sendNativeTap(selectAllMenuItem);
|
||||||
|
yield promise;
|
||||||
|
|
||||||
|
promise = waitForEvent(document, "popupshown");
|
||||||
|
sendContextMenuClickToSelection(tabWindow);
|
||||||
|
yield promise;
|
||||||
|
|
||||||
|
copyMenuItem = document.getElementById("context-copy");
|
||||||
|
promise = waitForEvent(document, "popuphidden");
|
||||||
|
sendNativeTap(copyMenuItem);
|
||||||
|
yield promise;
|
||||||
|
|
||||||
|
// The wait is needed to give time to populate the clipboard.
|
||||||
|
clipboardContent = "";
|
||||||
|
contentToCopy = testDiv.innerHTML;
|
||||||
|
yield waitForCondition(function () {
|
||||||
|
clipboardContent = SpecialPowers.getClipboardData("text/html");
|
||||||
|
return clipboardContent == contentToCopy;
|
||||||
|
});
|
||||||
|
ok(clipboardContent == contentToCopy, "Rich content copied.");
|
||||||
|
|
||||||
|
Browser.closeTab(Browser.selectedTab, { forceClose: true });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
function test() {
|
function test() {
|
||||||
setDevPixelEqualToPx();
|
setDevPixelEqualToPx();
|
||||||
runTests();
|
runTests();
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<style>
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body style="padding: 10px; margin: 10px;">
|
||||||
|
<span id="text1">Test text</span>
|
||||||
|
<div contenteditable="true" id="div1" style="border: 2px solid blue; width: 200px; height: 200px;">
|
||||||
|
<table>
|
||||||
|
<tr><td>Test content</td></tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -4,6 +4,7 @@ support-files =
|
||||||
browser_context_menu_tests_02.html
|
browser_context_menu_tests_02.html
|
||||||
browser_context_menu_tests_03.html
|
browser_context_menu_tests_03.html
|
||||||
browser_context_menu_tests_04.html
|
browser_context_menu_tests_04.html
|
||||||
|
browser_context_menu_tests_05.html
|
||||||
browser_findbar.html
|
browser_findbar.html
|
||||||
browser_form_auto_complete.html
|
browser_form_auto_complete.html
|
||||||
browser_form_selects.html
|
browser_form_selects.html
|
||||||
|
|
Загрузка…
Ссылка в новой задаче