1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
<pre id="console"></pre>
<script>
if (window.layoutTestController) {
layoutTestController.dumpAsText();
layoutTestController.waitUntilDone();
}
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 CORS-untainted 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");
// Control tests
log("Untainted canvas:");
try {
var imageData = context.getImageData(0, 0, 100, 100);
log("PASS: Calling getImageData() from an untainted canvas was allowed.");
} catch (e) {
log("FAIL: Calling getImageData() from an untainted canvas was not allowed: Threw error: " + e + ".");
}
try {
var dataURL = canvas.toDataURL();
log("PASS: Calling toDataURL() on an untainted canvas was allowed.");
} catch (e) {
log("FAIL: Calling toDataURL() on an untainted canvas was not allowed: Threw error: " + e + ".");
}
log("\n");
log("Tainted canvas:");
// Test reading from a canvas after drawing a remote image onto it
context.drawImage(image, 0, 0, 100, 100);
test(canvas, "remote image");
var dirtyCanvas = canvas;
// Now test reading from a canvas after drawing a tainted canvas onto it
canvas = document.createElement("canvas");
canvas.width = 100;
canvas.height = 100;
var context = canvas.getContext("2d");
context.drawImage(dirtyCanvas, 0, 0, 100, 100);
test(canvas, "CORS-untained canvas");
// Test reading after using a tainted 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, "remote image tainted pattern");
// Test reading after using a tainted pattern
canvas = document.createElement("canvas");
canvas.width = 100;
canvas.height = 100;
var context = canvas.getContext("2d");
var taintedCanvasPattern = context.createPattern(dirtyCanvas, "repeat");
context.fillStyle = taintedCanvasPattern;
context.fillRect(0, 0, 100, 100);
test(canvas, "CORS-untainted canvas pattern");
if (window.layoutTestController)
layoutTestController.notifyDone();
}
image.crossOrigin = "anonymous";
image.src = "http://localhost:8000/security/resources/abe-allow-star.php";
</script>
|