gecko-dev/dom/events/test/test_paste_image.html

197 строки
6.6 KiB
HTML

<html><head>
<title>Test for bug 891247</title>
<link rel="stylesheet" href="/tests/SimpleTest/test.css">
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
<script class="testbody" type="application/javascript">
function ImageTester() {
var counter = 0;
var images = [];
var that = this;
this.add = function(aFile) {
images.push(aFile);
};
this.test = function() {
for (var i = 0; i < images.length; i++) {
testImageSize(images[i]);
}
};
this.returned = function() {
counter++;
info("returned=" + counter + " images.length=" + images.length);
if (counter == images.length) {
info("test finish");
SimpleTest.finish();
}
};
function testImageSize(aFile) {
var source = window.URL.createObjectURL(aFile);
var image = new Image();
image.src = source;
var imageTester = that;
image.onload = function() {
is(this.width, 62, "Check generated image width");
is(this.height, 71, "Check generated image height");
if (aFile.type == "image/gif") {
// this test fails for image/jpeg and image/png because the images
// generated are slightly different
testImageCanvas(image);
}
imageTester.returned();
}
document.body.appendChild(image);
};
function testImageCanvas(aImage) {
var canvas = drawToCanvas(aImage);
var refImage = document.getElementById('image');
var refCanvas = drawToCanvas(refImage);
is(canvas.toDataURL(), refCanvas.toDataURL(), "Image should map pixel-by-pixel");
}
function drawToCanvas(aImage) {
var canvas = document.createElement("CANVAS");
document.body.appendChild(canvas);
canvas.width = aImage.width;
canvas.height = aImage.height;
canvas.getContext('2d').drawImage(aImage, 0, 0);
return canvas;
}
}
function copyImage(aImageId) {
// selection of the node
var node = document.getElementById(aImageId);
var webnav = SpecialPowers.wrap(window)
.QueryInterface(SpecialPowers.Ci.nsIInterfaceRequestor)
.getInterface(SpecialPowers.Ci.nsIWebNavigation)
var docShell = webnav.QueryInterface(SpecialPowers.Ci.nsIDocShell);
// let's copy the node
var documentViewer = docShell.contentViewer
.QueryInterface(SpecialPowers.Ci.nsIContentViewerEdit);
documentViewer.setCommandNode(node);
documentViewer.copyImage(documentViewer.COPY_IMAGE_ALL);
}
function doTest() {
SimpleTest.waitForExplicitFinish();
copyImage('image');
//--------- now check the content of the clipboard
var clipboard = SpecialPowers.Cc["@mozilla.org/widget/clipboard;1"]
.getService(SpecialPowers.Ci.nsIClipboard);
// does the clipboard contain text/unicode data ?
ok(clipboard.hasDataMatchingFlavors(["text/unicode"], 1, clipboard.kGlobalClipboard),
"clipboard contains unicode text");
// does the clipboard contain text/html data ?
ok(clipboard.hasDataMatchingFlavors(["text/html"], 1, clipboard.kGlobalClipboard),
"clipboard contains html text");
// does the clipboard contain image data ?
ok(clipboard.hasDataMatchingFlavors(["image/png"], 1, clipboard.kGlobalClipboard),
"clipboard contains image");
window.addEventListener("paste", onPaste);
var textarea = SpecialPowers.wrap(document.getElementById('textarea'));
textarea.focus();
textarea.editor.paste(clipboard.kGlobalClipboard);
}
function onPaste(e) {
var imageTester = new ImageTester;
testFiles(e, imageTester);
testItems(e, imageTester);
imageTester.test();
}
function testItems(e, imageTester) {
var items = e.clipboardData.items;
is(items, e.clipboardData.items,
"Getting @items twice should return the same object");
var haveFiles = false;
ok(items instanceof DataTransferItemList, "@items implements DataTransferItemList");
ok(items.length > 0, "@items is not empty");
for (var i = 0; i < items.length; i++) {
var item = items[i];
ok(item instanceof DataTransferItem, "each element of @items must implement DataTransferItem");
if (item.kind == "file") {
var file = item.getAsFile();
ok(file instanceof File, ".getAsFile() returns a File object");
ok(file.size > 0, "Files shouldn't have size 0");
imageTester.add(file);
}
}
}
function testFiles(e, imageTester) {
var files = e.clipboardData.files;
is(files, e.clipboardData.files,
"Getting the files array twice should return the same array");
ok(files.length > 0, "There should be at least one file in the clipboard");
for (var i = 0; i < files.length; i++) {
var file = files[i];
ok(file instanceof File, ".files should contain only File objects");
ok(file.size > 0, "This file shouldn't have size 0");
if (file.name == "image.png") {
is(file.type, "image/png", "This file should be a image/png");
} else if (file.name == "image.jpeg") {
is(file.type, "image/jpeg", "This file should be a image/jpeg");
} else if (file.name == "image.gif") {
is(file.type, "image/gif", "This file should be a image/gif");
} else {
info("file.name=" + file.name);
ok(false, "Unexpected file name");
}
testSlice(file);
imageTester.add(file);
// Adding the same image again so we can test concurrency
imageTester.add(file);
}
}
function testSlice(aFile) {
var blob = aFile.slice();
ok(blob instanceof Blob, ".slice returns a blob");
is(blob.size, aFile.size, "the blob has the same size");
blob = aFile.slice(123123);
is(blob.size, 0, ".slice overflow check");
blob = aFile.slice(123, 123141);
is(blob.size, aFile.size - 123, ".slice @size check");
blob = aFile.slice(123, 12);
is(blob.size, 0, ".slice @size check 2");
blob = aFile.slice(124, 134, "image/png");
is(blob.size, 10, ".slice @size check 3");
is(blob.type, "image/png", ".slice @type check");
}
</script>
<body onload="doTest();">
<img id="image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABHCA
IAAADQjmMaAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3goUAwAgSAORBwAAABl0RVh0Q29
tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAABPSURBVGje7c4BDQAACAOga//OmuMbJGAurTbq
6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6s31B0IqAY2/t
QVCAAAAAElFTkSuQmCC" />
<form>
<textarea id="textarea"></textarea>
</form>
</body>
</html>