blob: 5538c8855015aa322a6705c0dfffb1fde56b4bb1 [file] [log] [blame]
<!DOCTYPE html>
<html>
<body oncopy="copy(event)" onpaste="paste(event)">
<div>This file tests the basic functionality and properties of DataTransferItems. This test requires DRT.</div>
<div id="console"></div>
<script src="../editing.js"></script>
<script>
var undefined;
var pendingCallbacks = 0;
var savedDataTransferItems = null;
var savedDataTransferItem = null;
function log(text)
{
var console = document.getElementById('console');
console.appendChild(document.createTextNode(text));
console.appendChild(document.createElement('br'));
}
function removeFontName(text)
{
if (!text)
return text;
return text.replace(/font-family: [^;]+;/g, '');
}
function handleEvent(data)
{
log(data);
if (--pendingCallbacks == 0) {
window.testRunner.notifyDone();
}
}
function copy(ev)
{
var items = event.clipboardData.items;
log('Populating DataTransferItems...');
items.add('Hello World!', 'text/plain');
items.add('<b>Hello World!', 'text/html');
// Check that an exception is properly raised when attempting to add a duplicate string type.
try {
items.add('Moo', 'text/plain');
} catch (e) {
log('Caught exception "' + e + '" as expected.');
}
// Check that the container didn't change.
log('Verifying contents of DataTransferItems...');
log('items.length: ' + items.length);
log('items[0].kind: ' + items[0].kind);
log('items[0].type: ' + items[0].type);
log('items[1].kind: ' + items[1].kind);
log('items[1].type: ' + items[1].type);
items[0].getAsString(function (data) { handleEvent('copy: items[0] value: ' + data); });
pendingCallbacks++;
items[1].getAsString(function (data) { handleEvent('copy: items[1] value: ' + data); });
pendingCallbacks++;
log('Checking if items past the end of the collection can be indexed:');
log('items[2] is undefined: ' + typeof items[2]);
}
function paste(ev)
{
var items = event.clipboardData.items;
// Cache references to make sure they aren't accessible outside the event handler.
savedDataTransferItems = items;
savedDataTransferItem = items[0];
var originalLength = items.length;
log('Checking that a read-only DataTransferItems cannot be mutated...');
// Should be immutable.
items.add('Hello World!', 'text/plain');
log('items.length: ' + items.length);
log('items[0].kind: ' + items[0].kind);
log('items[0].type: ' + items[0].type);
items[0].getAsString(function (data) { handleEvent('paste: items[0] value: ' + removeFontName(data)); });
pendingCallbacks++;
log('items[1].kind: ' + items[1].kind);
log('items[1].type: ' + items[1].type);
items[1].getAsString(function (data) { handleEvent('paste: items[1] value: ' + removeFontName(data)); });
pendingCallbacks++;
log('items[2] is undefined: ' + typeof items[2]);
}
function runTest() {
if (!window.testRunner)
return;
testRunner.waitUntilDone();
testRunner.dumpAsText();
eventSender.mouseMoveTo(0, 0);
for (var i = 0; i < 3; i++) {
eventSender.mouseDown();
eventSender.mouseUp();
}
copyCommand();
pasteCommand();
log('Testing if DataTransferItems can be accessed outside an event handler...');
if (savedDataTransferItems.length != 0) {
log('DataTransferItems.length non-zero outside event handler!');
}
savedDataTransferItems.add('Security?', 'text/foo');
if (savedDataTransferItems.length != 0) {
log('DataTransferItems mutated outside event handler!');
}
if (typeof savedDataTransferItems[0] == 'undefined') {
log('DataTransferItem accessed outside event handler!');
}
if (typeof savedDataTransferItem == 'undefined') {
log('DataTransferItem accessed outside event handler!');
}
}
runTest();
</script>
</body>
</html>