<pre id="console"></pre>
<script>
if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

// Set the "have set document.domain" flag.
document.domain = document.domain;

log = function(msg)
{
    document.getElementById('console').appendChild(document.createTextNode(msg + "\n"));
}

testGetImageData = function(context, description)
{
    description = "Calling getImageData() from a canvas tainted by a " + description;
    try {
        var imageData = context.getImageData(0,0,100,100);
        log("PASS: " + description + " was allowed.");
    } catch (e) {
        log("FAIL: " + description + " was not allowed - Threw error: " + e + ".");
    }
}

testToDataURL = function(canvas, description)
{
    description = "Calling toDataURL() on a canvas tainted by a " + description;
    try {
        var dataURL = canvas.toDataURL();
        log("PASS: " + description + " was allowed.");
    } catch (e) {
        log("FAIL: " + description + " was not allowed - Threw error: " + e + ".");
    }
}

test = function(canvas, description)
{
    testGetImageData(canvas.getContext("2d"), description);
    testToDataURL(canvas, description);
}

var image = new Image();
image.onload = function() {
    var canvas = document.createElement("canvas");
    canvas.width = 100;
    canvas.height = 100;
    var context = canvas.getContext("2d");

    // Test reading from a canvas after drawing an image onto it
    context.drawImage(image, 0, 0, 100, 100);

    test(canvas, "document.domain image");

    // Test reading after using a pattern
    canvas = document.createElement("canvas");
    canvas.width = 100;
    canvas.height = 100;
    var context = canvas.getContext("2d");
    var remoteImagePattern = context.createPattern(image, "repeat");
    context.fillStyle = remoteImagePattern;
    context.fillRect(0, 0, 100, 100);

    test(canvas, "document.domain image pattern");

    if (window.testRunner)
        testRunner.notifyDone();
}
image.src = "http://127.0.0.1:8000/security/resources/abe.png";
</script>
