<!DOCTYPE HTML>
<html>
<head>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=575946
-->
  <title>Test for Bug 575946</title>
  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript" src="fileutils.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>

<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=575946">Mozilla Bug 575946</a>
<p id="display">
  <canvas id=canvas width=1100 height=1100 hidden moz-opaque></canvas>
  <canvas id=testcanvas hidden moz-opaque></canvas>
  <input id="fileList" type="file"></input>
</p>
<div id="content" style="display: none">
</div>

<pre id="test">
<script class="testbody" type="text/javascript">
var fileNum = 1;
SimpleTest.waitForExplicitFinish();

// Create files containing data we'll test with. We'll want long
// strings to ensure they span multiple buffers while loading

// Create a decent-sized image
cx = $("canvas").getContext('2d');
var s = cx.canvas.width;
var grad = cx.createLinearGradient(0, 0, s-1, s-1);
for (i = 0; i < 0.95; i += .1) {
  grad.addColorStop(i, "white");
  grad.addColorStop(i + .05, "black");
}
grad.addColorStop(1, "white");
cx.fillStyle = grad;
cx.fillRect(0, 0, s-1, s-1);
cx.fillStyle = "rgba(200, 0, 0, 0.9)";
cx.fillRect(.1 * s, .1 * s, .7 * s, .7 * s);
cx.strokeStyle = "rgba(0, 0, 130, 0.5)";
cx.lineWidth = .14 * s;
cx.beginPath();
cx.arc(.6 * s, .6 * s, .3 * s, 0, Math.PI*2, true);
cx.stroke();
cx.closePath();
cx.fillStyle = "rgb(0, 255, 0)";
cx.beginPath();
cx.arc(.1 * s, .8 * s, .1 * s, 0, Math.PI*2, true);
cx.fill();
cx.closePath();


function imageLoadHandler(event) {
  var origcanvas = $("canvas");
  var testcanvas = $("testcanvas");
  var image = event.target;
  is(image.naturalWidth, origcanvas.width, "width correct");
  is(image.naturalHeight, origcanvas.height, "height correct");

  testcanvas.width = origcanvas.width;
  testcanvas.height = origcanvas.height;
  testcanvas.getContext("2d").drawImage(image, 0, 0);
  // Do not use |is(testcanvas.toDataURL("image/png"), origcanvas.toDataURL("image/png"), "...");| that results in a _very_ long line.
  var origDataURL = origcanvas.toDataURL("image/png");
  var testDataURL = testcanvas.toDataURL("image/png");
  is(testDataURL.length, origDataURL.length,
     "Length of correct image data");
  ok(testDataURL == origDataURL,
     "Content of correct image data");

  testHasRun();
}

var fileData =
  atob(cx.canvas.toDataURL("image/png").substring("data:text/png;base64,".length + 1));
var size = fileData.length;
var testBinaryData = "";

// This might fail if we dramatically improve the png encoder. If that happens
// please increase the complexity or size of the image generated above to ensure
// that we're testing with files that are large enough.
ok(size > 65536, "test data sufficiently large");

SpecialPowers.createFiles([{name: "basicTestFile", data: fileData}],
                          basicTest);

function basicTest(files) {
  var fileFile = files[0];

  // Test that basic properties work
  var memFile = cx.canvas.mozGetAsFile("image/png");
  testSlice(memFile, size, "image/png", fileData, "memFile");
  testSlice(fileFile, size, "", fileData, "fileFile");

  // Try loading directly from slice into an image
  for (var i = 0; i < 256; i++) {
    testBinaryData += String.fromCharCode(i);
  }
  while (testBinaryData.length < 20000) {
    testBinaryData += testBinaryData;
  }

  // image in the middle
  SpecialPowers.createFiles([{name: "middleTestFile",
                             data: testBinaryData + fileData + testBinaryData}],
                            imageMiddleTest);
}

function imageMiddleTest(files) {
  var imgfile = files[0];
  is(imgfile.size, size + testBinaryData.length * 2, "correct file size (middle)");
  var img = new Image;
  img.src = URL.createObjectURL(imgfile.slice(testBinaryData.length, testBinaryData.length + size));
  img.onload = imageLoadHandler;
  expectedTestCount++;

  // image at start
  SpecialPowers.createFiles([{name: "startTestFile",
                             data: fileData + testBinaryData}],
                            imageStartTest);
}

function imageStartTest(files) {
  var imgfile = files[0];
  is(imgfile.size, size + testBinaryData.length, "correct file size (start)");
  var img = new Image;
  img.src = URL.createObjectURL(imgfile.slice(0, size));
  img.onload = imageLoadHandler;
  expectedTestCount++;

  // image at end
  SpecialPowers.createFiles([{name: "endTestFile",
                             data: testBinaryData + fileData}],
                            imageEndTest);
}

function imageEndTest(files) {
  var imgfile = files[0];
  is(imgfile.size, size + testBinaryData.length, "correct file size (end)");
  var img = new Image;
  img.src = URL.createObjectURL(imgfile.slice(testBinaryData.length, testBinaryData.length + size));
  img.onload = imageLoadHandler;
  expectedTestCount++;

  // image past end
  SpecialPowers.createFiles([{name: "pastEndTestFile",
                             data: testBinaryData + fileData}],
                            imagePastEndTest);
}

function imagePastEndTest(files) {
  var imgfile = files[0];
  is(imgfile.size, size + testBinaryData.length, "correct file size (past end)");
  var img = new Image;
  img.src = URL.createObjectURL(imgfile.slice(testBinaryData.length, testBinaryData.length + size + 1000));
  img.onload = imageLoadHandler;
  expectedTestCount++;
}

</script>
</pre>
</body>
</html>