blob: 4e22624500f67c5070cfdbe60294e782bd767ff0 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test.js"></script>
<script>
var testDataTransfer;
var nonConvertibleToString = {toString: function() { throw "Exception in toString()"; }};
function legacyCopyStart(dataTransfer)
{
testDataTransfer = dataTransfer;
dataTransfer.setData('text', 'sample');
dataTransfer.setData('url', 'http://www.google.com/');
dataTransfer.setData('text/html', '<em>Markup</em>');
dataTransfer.setData('custom-data', 'hello world');
shouldBeEqualToString('testDataTransfer.getData("custom-data")', 'hello world');
shouldThrow('testDataTransfer.clearData(nonConvertibleToString)', '"Exception in toString()"');
shouldBeEqualToString('testDataTransfer.getData("custom-data")', 'hello world');
}
function itemListCopyStart(dataTransfer)
{
testDataTransfer = dataTransfer;
shouldBeUndefined('testDataTransfer.items.item');
dataTransfer.items.add('sample', 'text/plain');
dataTransfer.items.add('http://www.google.com/', 'text/uri-list');
dataTransfer.items.add('<em>Markup</em>', 'text/html');
dataTransfer.items.add('hello world', 'custom-data');
}
function copy(event)
{
event.preventDefault();
var copyMethod = document.getElementById('copyMethod');
if (copyMethod.selectedIndex == 0)
legacyCopyStart(event.clipboardData);
else if (copyMethod.selectedIndex == 1)
itemListCopyStart(event.clipboardData);
}
function legacyPaste(dataTransfer)
{
testDataTransfer = dataTransfer;
shouldBe('testDataTransfer.types.length', '4');
shouldBeTrue('testDataTransfer.types.indexOf("text/plain") >= 0');
shouldBeTrue('testDataTransfer.types.indexOf("text/uri-list") >= 0');
shouldBeTrue('testDataTransfer.types.indexOf("text/html") >= 0');
shouldBeTrue('testDataTransfer.types.indexOf("custom-data") >= 0');
shouldBeEqualToString('testDataTransfer.getData("text")', 'sample');
shouldBeEqualToString('testDataTransfer.getData("url")', 'http://www.google.com/');
shouldBeEqualToString('testDataTransfer.getData("text/html")', '<em>Markup</em>');
shouldBeEqualToString('testDataTransfer.getData("custom-data")', 'hello world');
setTimeout(runNext, 0);
}
var testData, expectedTestData;
var types, expectedTypes;
var outstandingRequests;
function itemListPaste(dataTransfer)
{
testDataTransfer = dataTransfer;
outstandingRequests = 0;
shouldBe('testDataTransfer.items.length', '4');
types = [];
for (var i = 0; i < dataTransfer.items.length; ++i) {
types.push({kind: dataTransfer.items[i].kind, type: dataTransfer.items[i].type});
}
types.sort(function (a, b) { return a.type.localeCompare(b.type); });
expectedTypes = [
{ kind: 'string', type: 'custom-data'},
{ kind: 'string', type: 'text/html'},
{ kind: 'string', type: 'text/plain'},
{ kind: 'string', type: 'text/uri-list'},
];
shouldBe('JSON.stringify(expectedTypes)', 'JSON.stringify(types)');
var expectedResults = {
'custom-data': 'hello world',
'text/html': '<em>Markup</em>',
'text/plain': 'sample',
'text/uri-list': 'http://www.google.com/',
}
function makeClosure(expectedData)
{
++outstandingRequests;
return function (data) {
expectedTestData = expectedData;
testData = data;
shouldBe('testData', 'expectedTestData');
if (--outstandingRequests == 0)
setTimeout(runNext, 0);
}
}
// We use this funky loop to make sure we always print out results in the same order.
for (var i = 0; i < types.length; ++i) {
for (var j = 0; j < dataTransfer.items.length; ++j) {
if (types[i].type == dataTransfer.items[j].type) {
dataTransfer.items[j].getAsString(makeClosure(expectedResults[types[i].type]));
break;
}
}
}
}
function paste(event)
{
var pasteMethod= document.getElementById('pasteMethod');
if (pasteMethod.selectedIndex == 0)
legacyPaste(event.clipboardData);
else if (pasteMethod.selectedIndex == 1)
itemListPaste(event.clipboardData);
}
function runTest(copyMethodIndex, pasteMethodIndex)
{
var copyMethod = document.getElementById('copyMethod');
var pasteMethod = document.getElementById('pasteMethod');
copyMethod.selectedIndex = copyMethodIndex;
pasteMethod.selectedIndex = pasteMethodIndex;
debug('Running test with ' + copyMethod.value + ' copy handler and ' + pasteMethod.value + ' paste handler');
document.execCommand('copy');
document.execCommand('paste');
}
var testCases = [
[0, 0],
[0, 1],
[1, 0],
[1, 1],
];
function runNext()
{
if (!window.testRunner)
return;
var testCase = testCases.shift();
if (testCase)
runTest.apply(null, testCase);
else
finishJSTest();
}
</script>
</head>
<body oncopy="copy(event)" onpaste="paste(event)">
<p>To manually test, press your browser shortcut for copy and then for paste. Several lines that say 'PASS' should appear below.
<div>Copy handler: <select id="copyMethod"><option>Legacy</option><option>DataTransferItemList</option></select></div>
<div>Paste handler: <select id="pasteMethod"><option>Legacy</option><option>DataTransferItemList</option></select></div>
<div id="console"></div>
<script>
description("Tests copy / paste and DataTransferItemList");
window.jsTestIsAsync = true;
runNext();
</script>
</body>
</html>