michael@0: /* Any copyright is dedicated to the Public Domain.
michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ */
michael@0:
michael@0: function modifySelection(s) {
michael@0: var g = window.getSelection();
michael@0: var l = g.getRangeAt(0);
michael@0: var d = document.createElement("p");
michael@0: d.innerHTML = s;
michael@0: d.appendChild(l.cloneContents());
michael@0:
michael@0: var e = document.createElement("div");
michael@0: document.body.appendChild(e);
michael@0: e.appendChild(d);
michael@0: var a = document.createRange();
michael@0: a.selectNode(d);
michael@0: g.removeAllRanges();
michael@0: g.addRange(a);
michael@0: window.setTimeout(function () {
michael@0: e.parentNode.removeChild(e);
michael@0: g.removeAllRanges();
michael@0: g.addRange(l);
michael@0: }, 0)
michael@0: }
michael@0:
michael@0: function getLoadContext() {
michael@0: var Ci = SpecialPowers.Ci;
michael@0: return SpecialPowers.wrap(window).QueryInterface(Ci.nsIInterfaceRequestor)
michael@0: .getInterface(Ci.nsIWebNavigation)
michael@0: .QueryInterface(Ci.nsILoadContext);
michael@0: }
michael@0:
michael@0: function testCopyPaste (isXHTML) {
michael@0: var suppressUnicodeCheckIfHidden = !!isXHTML;
michael@0: var suppressHTMLCheck = !!isXHTML;
michael@0:
michael@0: var webnav = SpecialPowers.wrap(window).QueryInterface(SpecialPowers.Ci.nsIInterfaceRequestor)
michael@0: .getInterface(SpecialPowers.Ci.nsIWebNavigation)
michael@0:
michael@0: var docShell = webnav.QueryInterface(SpecialPowers.Ci.nsIDocShell);
michael@0:
michael@0: var documentViewer = docShell.contentViewer
michael@0: .QueryInterface(SpecialPowers.Ci.nsIContentViewerEdit);
michael@0:
michael@0: var clipboard = SpecialPowers.Services.clipboard;
michael@0:
michael@0: var textarea = SpecialPowers.wrap(document.getElementById('input'));
michael@0:
michael@0: function copySelectionToClipboard(suppressUnicodeCheck) {
michael@0: documentViewer.copySelection();
michael@0: if (!suppressUnicodeCheck)
michael@0: ok(clipboard.hasDataMatchingFlavors(["text/unicode"], 1,1), "check text/unicode");
michael@0: if (!suppressHTMLCheck)
michael@0: ok(clipboard.hasDataMatchingFlavors(["text/html"], 1,1), "check text/html");
michael@0: }
michael@0: function copyToClipboard(node, suppressUnicodeCheck) {
michael@0: textarea.blur();
michael@0: clipboard.emptyClipboard(1);
michael@0: var sel = window.getSelection();
michael@0: sel.removeAllRanges();
michael@0: var r = document.createRange();
michael@0: r.selectNode(node);
michael@0: window.getSelection().addRange(r);
michael@0: copySelectionToClipboard(suppressUnicodeCheck);
michael@0: }
michael@0: function copyRangeToClipboard(startNode,startIndex,endNode,endIndex,suppressUnicodeCheck) {
michael@0: textarea.blur();
michael@0: clipboard.emptyClipboard(1);
michael@0: var sel = window.getSelection();
michael@0: sel.removeAllRanges();
michael@0: var r = document.createRange();
michael@0: r.setStart(startNode,startIndex)
michael@0: r.setEnd(endNode,endIndex)
michael@0: window.getSelection().addRange(r);
michael@0: copySelectionToClipboard(suppressUnicodeCheck);
michael@0: }
michael@0: function copyChildrenToClipboard(id) {
michael@0: textarea.blur();
michael@0: clipboard.emptyClipboard(1);
michael@0: window.getSelection().selectAllChildren(document.getElementById(id));
michael@0: copySelectionToClipboard();
michael@0: }
michael@0: function getClipboardData(mime) {
michael@0: var transferable = SpecialPowers.Cc['@mozilla.org/widget/transferable;1']
michael@0: .createInstance(SpecialPowers.Ci.nsITransferable);
michael@0: transferable.init(getLoadContext());
michael@0: transferable.addDataFlavor(mime);
michael@0: clipboard.getData(transferable, 1);
michael@0: var data = SpecialPowers.createBlankObject();
michael@0: transferable.getTransferData(mime, data, {}) ;
michael@0: return data;
michael@0: }
michael@0: function testClipboardValue(mime, expected) {
michael@0: if (suppressHTMLCheck && mime == "text/html")
michael@0: return null;
michael@0: var data = SpecialPowers.wrap(getClipboardData(mime));
michael@0: is (data.value == null ? data.value :
michael@0: data.value.QueryInterface(SpecialPowers.Ci.nsISupportsString).data,
michael@0: expected,
michael@0: mime + " value in the clipboard");
michael@0: return data.value;
michael@0: }
michael@0: function testPasteText(expected) {
michael@0: textarea.value="";
michael@0: textarea.focus();
michael@0: textarea.editor.paste(1);
michael@0: is(textarea.value, expected, "value of the textarea after the paste");
michael@0: }
michael@0: function testSelectionToString(expected) {
michael@0: is(window.getSelection().toString().replace(/\r\n/g,"\n"), expected, "Selection.toString");
michael@0: }
michael@0: function testInnerHTML(id, expected) {
michael@0: var value = document.getElementById(id).innerHTML;
michael@0: is(value, expected, id + ".innerHTML");
michael@0: }
michael@0: function testEmptyChildren(id) {
michael@0: copyChildrenToClipboard(id);
michael@0: testSelectionToString("");
michael@0: testClipboardValue("text/unicode", null);
michael@0: testClipboardValue("text/html", null);
michael@0: testPasteText("");
michael@0: }
michael@0:
michael@0: copyChildrenToClipboard("draggable");
michael@0: testSelectionToString("This is a draggable bit of text.");
michael@0: testClipboardValue("text/unicode",
michael@0: "This is a draggable bit of text.");
michael@0: testClipboardValue("text/html",
michael@0: "
This is a draggable bit of text.
");
michael@0: testPasteText("This is a draggable bit of text.");
michael@0:
michael@0: copyChildrenToClipboard("alist");
michael@0: testSelectionToString(" bla\n\n foo\n bar\n\n");
michael@0: testClipboardValue("text/unicode", " bla\n\n foo\n bar\n\n");
michael@0: testClipboardValue("text/html", "");
michael@0: testPasteText(" bla\n\n foo\n bar\n\n");
michael@0:
michael@0: copyChildrenToClipboard("blist");
michael@0: testSelectionToString(" mozilla\n\n foo\n bar\n\n");
michael@0: testClipboardValue("text/unicode", " mozilla\n\n foo\n bar\n\n");
michael@0: testClipboardValue("text/html", "\n mozilla\n
\n - foo
\n \n - bar
\n
\n
");
michael@0: testPasteText(" mozilla\n\n foo\n bar\n\n");
michael@0:
michael@0: copyChildrenToClipboard("clist");
michael@0: testSelectionToString(" mzla\n\n foo\n bazzinga!\n bar\n\n");
michael@0: testClipboardValue("text/unicode", " mzla\n\n foo\n bazzinga!\n bar\n\n");
michael@0: testClipboardValue("text/html", "");
michael@0: testPasteText(" mzla\n\n foo\n bazzinga!\n bar\n\n");
michael@0:
michael@0: copyChildrenToClipboard("div4");
michael@0: testSelectionToString(" Tt t t ");
michael@0: testClipboardValue("text/unicode", " Tt t t ");
michael@0: if (isXHTML) {
michael@0: testClipboardValue("text/html", "\n T\n
");
michael@0: testInnerHTML("div4", "\n T\n");
michael@0: }
michael@0: else {
michael@0: testClipboardValue("text/html", "\n T\n
");
michael@0: testInnerHTML("div4", "\n T\n");
michael@0: }
michael@0: testPasteText(" Tt t t ");
michael@0:
michael@0: copyChildrenToClipboard("div5");
michael@0: testSelectionToString(" T ");
michael@0: testClipboardValue("text/unicode", " T ");
michael@0: if (isXHTML) {
michael@0: testClipboardValue("text/html", "\n T\n
");
michael@0: testInnerHTML("div5", "\n T\n");
michael@0: }
michael@0: else {
michael@0: testClipboardValue("text/html", "\n T\n
");
michael@0: testInnerHTML("div5", "\n T\n");
michael@0: }
michael@0: testPasteText(" T ");
michael@0:
michael@0: copyRangeToClipboard($("div6").childNodes[0],0, $("div6").childNodes[1],1,suppressUnicodeCheckIfHidden);
michael@0: testSelectionToString("");
michael@0: // START Disabled due to bug 564688
michael@0: if (false) {
michael@0: testClipboardValue("text/unicode", "");
michael@0: testClipboardValue("text/html", "");
michael@0: }
michael@0: // END Disabled due to bug 564688
michael@0: testInnerHTML("div6", "div6");
michael@0:
michael@0: copyRangeToClipboard($("div7").childNodes[0],0, $("div7").childNodes[0],4,suppressUnicodeCheckIfHidden);
michael@0: testSelectionToString("");
michael@0: // START Disabled due to bug 564688
michael@0: if (false) {
michael@0: testClipboardValue("text/unicode", "");
michael@0: testClipboardValue("text/html", "");
michael@0: }
michael@0: // END Disabled due to bug 564688
michael@0: testInnerHTML("div7", "div7");
michael@0:
michael@0: copyRangeToClipboard($("div8").childNodes[0],0, $("div8").childNodes[0],4,suppressUnicodeCheckIfHidden);
michael@0: testSelectionToString("");
michael@0: // START Disabled due to bug 564688
michael@0: if (false) {
michael@0: testClipboardValue("text/unicode", "");
michael@0: testClipboardValue("text/html", "");
michael@0: }
michael@0: // END Disabled due to bug 564688
michael@0: testInnerHTML("div8", "div8");
michael@0:
michael@0: copyRangeToClipboard($("div9").childNodes[0],0, $("div9").childNodes[0],4,suppressUnicodeCheckIfHidden);
michael@0: testSelectionToString("div9");
michael@0: testClipboardValue("text/unicode", "div9");
michael@0: testClipboardValue("text/html", "div9");
michael@0: testInnerHTML("div9", "div9");
michael@0:
michael@0: copyToClipboard($("div10"), suppressUnicodeCheckIfHidden);
michael@0: testSelectionToString("");
michael@0: testInnerHTML("div10", "div10");
michael@0:
michael@0: copyToClipboard($("div10").firstChild, suppressUnicodeCheckIfHidden);
michael@0: testSelectionToString("");
michael@0:
michael@0: copyRangeToClipboard($("div10").childNodes[0],0, $("div10").childNodes[0],1,suppressUnicodeCheckIfHidden);
michael@0: testSelectionToString("");
michael@0:
michael@0: copyRangeToClipboard($("div10").childNodes[1],0, $("div10").childNodes[1],1,suppressUnicodeCheckIfHidden);
michael@0: testSelectionToString("");
michael@0:
michael@0: // ============ copy/paste test from/to a textarea
michael@0:
michael@0: var val = "1\n 2\n 3";
michael@0: textarea.value=val;
michael@0: textarea.select();
michael@0: textarea.editor.copy();
michael@0:
michael@0: textarea.value="";
michael@0: textarea.editor.paste(1);
michael@0: is(textarea.value, val);
michael@0: textarea.value="";
michael@0:
michael@0: // ============ NOSCRIPT should not be copied
michael@0:
michael@0: copyChildrenToClipboard("div13");
michael@0: testSelectionToString("__");
michael@0: testClipboardValue("text/unicode", "__");
michael@0: testClipboardValue("text/html", "__
");
michael@0: testPasteText("__");
michael@0:
michael@0: // ============ converting cell boundaries to tabs in tables
michael@0:
michael@0: copyToClipboard($("tr1"));
michael@0: testClipboardValue("text/unicode", "foo\tbar");
michael@0:
michael@0: // ============ manipulating Selection in oncopy
michael@0:
michael@0: copyRangeToClipboard($("div11").childNodes[0],0, $("div11").childNodes[1],2);
michael@0: testClipboardValue("text/unicode", "Xdiv11");
michael@0: testClipboardValue("text/html", "");
michael@0: setTimeout(function(){testSelectionToString("div11")},0);
michael@0:
michael@0: setTimeout(function(){
michael@0: copyRangeToClipboard($("div12").childNodes[0],0, $("div12").childNodes[1],2);
michael@0: testClipboardValue("text/unicode", "Xdiv12");
michael@0: testClipboardValue("text/html", "");
michael@0: setTimeout(function(){
michael@0: testSelectionToString("div12");
michael@0: setTimeout(SimpleTest.finish,0);
michael@0: },0);
michael@0: },0);
michael@0: }