Implement the HTML5 canvas tainting rules to prevent potential data leakage
[WebKit-https.git] / LayoutTests / http / tests / security / canvas-remote-read-remote-image.html
1 <div id="log"></div>
2 <div id="console"></div>
3 <script>
4 if (window.layoutTestController) {
5     layoutTestController.dumpAsText();
6     layoutTestController.waitUntilDone();
7 }
8 var image = new Image();
9 image.onload = function() {
10     var canvas = document.createElement("canvas");
11     canvas.width = 100;
12     canvas.height = 100;
13     var context = canvas.getContext("2d");
14     if (context.getImageData(0,0,100,100)) {
15         document.getElementById("console").innerHTML += "PASS: Reading data from an untainted canvas was allowed<br/>";
16     } else {
17         document.getElementById("console").innerHTML = "FAIL: Reading data from an untainted canvas was not allowed<br/>";
18     }
19     context.drawImage(image, 0, 0, 100, 100);
20     if (context.getImageData(0,0,100,100) == null) {
21         document.getElementById("console").innerHTML += "PASS: Reading data from a canvas tainted by a remote image was not allowed<br/>";
22     } else {
23         document.getElementById("console").innerHTML += "FAIL: Reading data from a canvas tainted by a remote image was allowed<br/>";
24     }
25     document.getElementById("log").appendChild(canvas);
26     var dirtyCanvas = canvas;
27     
28     // Now test reading from a canvas after drawing a tainted canvas onto it
29     canvas = document.createElement("canvas");
30     canvas.width = 100;
31     canvas.height = 100;
32     var context = canvas.getContext("2d");
33     context.drawImage(dirtyCanvas, 0, 0, 100, 100);
34     if (context.getImageData(0,0,100,100) == null) {
35         document.getElementById("console").innerHTML += "PASS: Reading data from a canvas tainted by a tainted canvas was not allowed<br/>";
36     } else {
37         document.getElementById("console").innerHTML += "FAIL: Reading data from a canvas tainted by a tainted canvas was allowed<br/>";
38     }
39     
40     document.getElementById("log").appendChild(canvas);
41     
42     // Test reading after using a tainted pattern
43     canvas = document.createElement("canvas");
44     canvas.width = 100;
45     canvas.height = 100;
46     var context = canvas.getContext("2d");
47     var remoteImagePattern = context.createPattern(image, "repeat");
48     context.fillStyle = remoteImagePattern;
49     context.fillRect(0,0,100,100);
50     if (context.getImageData(0,0,100,100) == null) {
51         document.getElementById("console").innerHTML += "PASS: Reading data from a canvas tainted by a remote image tainted pattern was not allowed<br/>";
52     } else {
53         document.getElementById("console").innerHTML += "FAIL: Reading data from a canvas tainted by a remote image tainted pattern was allowed<br/>";
54     }
55     
56     document.getElementById("log").appendChild(canvas);
57     
58     // Test reading after using a tainted pattern
59     canvas = document.createElement("canvas");
60     canvas.width = 100;
61     canvas.height = 100;
62     var context = canvas.getContext("2d");
63     var taintedCanvasPattern = context.createPattern(dirtyCanvas, "repeat");
64     context.fillStyle = taintedCanvasPattern;
65     context.fillRect(0,0,100,100);
66     if (context.getImageData(0,0,100,100) == null) {
67         document.getElementById("console").innerHTML += "PASS: Reading data from a canvas tainted by a tainted canvas pattern was not allowed<br/>";
68     } else {
69         document.getElementById("console").innerHTML += "FAIL: Reading data from a canvas tainted by a tainted canvas pattern was allowed<br/>";
70     }
71     
72     document.getElementById("log").appendChild(canvas);
73     if (window.layoutTestController)
74         layoutTestController.notifyDone();
75 }
76 image.src = "http://localhost:8000/security/resources/abe.png";
77 </script>