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", "
\n bla\n \n
"); 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
  1. foo
  2. \n \n
  3. bar
  4. \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", "
\n mzla\n \n
"); 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", "

Xdiv11

"); 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", "

Xdiv12

"); michael@0: setTimeout(function(){ michael@0: testSelectionToString("div12"); michael@0: setTimeout(SimpleTest.finish,0); michael@0: },0); michael@0: },0); michael@0: }