| OLD | NEW |
| 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" | 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" |
| 2 "http://www.w3.org/TR/html4/loose.dtd"> | 2 "http://www.w3.org/TR/html4/loose.dtd"> |
| 3 <html> | 3 <html> |
| 4 <head> | 4 <head> |
| 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
| 6 <title>WebGL Origin Restrictions Conformance Tests</title> | 6 <title>WebGL Origin Restrictions Conformance Tests</title> |
| 7 <script> | 7 <script> |
| 8 function create3DContext(canvas, attributes) | 8 function create3DContext(canvas, attributes) |
| 9 { | 9 { |
| 10 if (!canvas) | 10 if (!canvas) |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 function causedException(func) { | 75 function causedException(func) { |
| 76 var hadException = false; | 76 var hadException = false; |
| 77 try { | 77 try { |
| 78 func(); | 78 func(); |
| 79 } catch(e) { | 79 } catch(e) { |
| 80 hadException = true; | 80 hadException = true; |
| 81 } | 81 } |
| 82 return hadException; | 82 return hadException; |
| 83 } | 83 } |
| 84 | 84 |
| 85 var testVideo = false; |
| 86 |
| 85 function init() { | 87 function init() { |
| 86 var video = document.getElementById("video"); | 88 var video = document.getElementById("video"); |
| 87 | 89 |
| 88 var base = "http://localhost:8000/resources/"; | 90 var base = "http://localhost:8000/resources/"; |
| 89 var videos = [ | 91 var videos = [ |
| 90 ["video/mp4", base + "test.mp4"], | 92 ["video/mp4", base + "test.mp4"], |
| 91 ["video/ogg", base + "test.ogv"], | 93 ["video/ogg", base + "test.ogv"], |
| 92 ]; | 94 ]; |
| 93 var videoFile = null; | 95 var videoFile = null; |
| 94 for (var i = 0; i < videos.length; ++i) { | 96 for (var i = 0; i < videos.length; ++i) { |
| 95 if (video.canPlayType(videos[i][0])) { | 97 if (video.canPlayType(videos[i][0])) { |
| 96 videoFile = videos[i][1]; | 98 videoFile = videos[i][1]; |
| 97 break; | 99 break; |
| 98 } | 100 } |
| 99 } | 101 } |
| 100 assertMsg(videoFile, "Playable video format found"); | 102 assertMsg(videoFile, "Playable video format found"); |
| 101 | 103 |
| 102 if (videoFile) { | 104 if (videoFile) { |
| 103 if (window.layoutTestController) { | 105 if (window.layoutTestController) { |
| 104 layoutTestController.overridePreference("WebKitWebGLEnabled", "1"); | 106 layoutTestController.overridePreference("WebKitWebGLEnabled", "1"); |
| 105 layoutTestController.dumpAsText(); | 107 layoutTestController.dumpAsText(); |
| 106 layoutTestController.waitUntilDone(); | 108 layoutTestController.waitUntilDone(); |
| 107 } | 109 } |
| 108 video.src = videoFile; | 110 video.src = videoFile; |
| 109 video.addEventListener("playing", runTests); | 111 video.addEventListener("playing", runTests); |
| 110 video.play(); | 112 video.play(); |
| 113 testVideo = true; |
| 111 } else { | 114 } else { |
| 112 // Still run the other tests, even if the video failed. | 115 // Still run the other tests, even if the video failed. |
| 113 runTests(); | 116 runTests(); |
| 114 } | 117 } |
| 115 } | 118 } |
| 116 | 119 |
| 117 function runTests() { | 120 function runTests() { |
| 118 description("This test ensures WebGL implementations follow proper origin rest
rictions."); | 121 description("This test ensures WebGL implementations follow proper same-origin
restrictions."); |
| 119 var img = document.getElementById("img"); | 122 var img = document.getElementById("img"); |
| 120 assertMsg(img.width > 0 && img.height > 0, "img was loaded"); | 123 assertMsg(img.width > 0 && img.height > 0, "img was loaded"); |
| 121 | 124 |
| 125 function makeTexImage2D(gl, src) { |
| 126 return function() { |
| 127 gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, src); |
| 128 }; |
| 129 } |
| 130 |
| 131 function makeTexSubImage2D(gl, src) { |
| 132 return function() { |
| 133 gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, src); |
| 134 }; |
| 135 } |
| 136 |
| 122 function makeReadPixels(gl) { | 137 function makeReadPixels(gl) { |
| 123 return function() { | 138 return function() { |
| 124 var buf = new Uint8Array(4); | 139 var buf = new Uint8Array(4); |
| 125 gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, buf); | 140 gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, buf); |
| 126 }; | 141 }; |
| 127 } | 142 } |
| 128 | 143 |
| 129 function makeToDataURL(canvas) { | 144 function makeToDataURL(canvas) { |
| 130 return function() { | 145 return function() { |
| 131 var data = canvas.toDataURL(); | 146 var data = canvas.toDataURL(); |
| 132 } | 147 } |
| 133 } | 148 } |
| 134 | 149 |
| 135 debug(""); | |
| 136 debug("check that copying an img from another origin clears the origin-clean f
lag."); | |
| 137 var canvas1 = document.getElementById("canvas1"); | 150 var canvas1 = document.getElementById("canvas1"); |
| 138 var gl1 = create3DContext(canvas1); | 151 var gl = create3DContext(canvas1); |
| 139 assertMsg(!causedException(makeReadPixels(gl1)), | |
| 140 "should not throw exception by readPixels for origin clean canvas.")
; | |
| 141 assertMsg(!causedException(makeToDataURL(canvas1)), | |
| 142 "should not throw exception by toDataURL for origin clean canvas."); | |
| 143 | |
| 144 var tex = gl1.createTexture(); | |
| 145 gl1.bindTexture(gl1.TEXTURE_2D, tex); | |
| 146 gl1.texImage2D(gl1.TEXTURE_2D, 0, gl1.RGBA, gl1.RGBA, gl1.UNSIGNED_BYTE, img); | |
| 147 | |
| 148 assertMsg(causedException(makeReadPixels(gl1)), | |
| 149 "should throw exception by readPixels for NON origin clean canvas.")
; | |
| 150 assertMsg(causedException(makeToDataURL(canvas1)), | |
| 151 "should throw exception by toDataURL for NON origin clean canvas."); | |
| 152 | 152 |
| 153 debug(""); | 153 debug(""); |
| 154 debug("check that copying from 1 unclean 3d canvas to another clears the origi
n-clean flag on the second canvas."); | 154 debug("check that an attempt to upload an image from another origin throws an
exception."); |
| 155 var tex = gl.createTexture(); |
| 156 gl.bindTexture(gl.TEXTURE_2D, tex); |
| 157 gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 256, 256, 0, gl.RGBA, gl.UNSIGNED_BYT
E, null); |
| 158 assertMsg(causedException(makeTexImage2D(gl, img)), |
| 159 "texImage2D with cross-origin image should throw exception."); |
| 160 assertMsg(causedException(makeTexSubImage2D(gl, img)), |
| 161 "texSubImage2D with cross-origin image should throw exception."); |
| 162 |
| 163 debug("check that readPixels and toDataURL continue to work against this canva
s."); |
| 164 assertMsg(!causedException(makeReadPixels(gl)), |
| 165 "readPixels should never throw exception -- not possible to dirty or
igin of WebGL canvas."); |
| 166 assertMsg(!causedException(makeToDataURL(canvas1)), |
| 167 "should not throw exception by toDataURL for WebGL canvas, which sho
uld stay origin clean."); |
| 168 |
| 169 debug("check that an attempt to upload a tainted canvas throws an exception.")
; |
| 155 var canvas2 = document.getElementById("canvas2"); | 170 var canvas2 = document.getElementById("canvas2"); |
| 156 var gl2 = create3DContext(canvas2); | 171 var ctx2d = canvas2.getContext("2d"); |
| 157 | 172 ctx2d.drawImage(img, 0, 0); |
| 158 assertMsg(!causedException(makeReadPixels(gl2)), | |
| 159 "should not throw exception by readPixels for origin clean canvas.")
; | |
| 160 assertMsg(!causedException(makeToDataURL(canvas2)), | |
| 161 "should not throw exception by toDataURL for origin clean canvas."); | |
| 162 | |
| 163 var tex = gl2.createTexture(); | |
| 164 gl2.bindTexture(gl2.TEXTURE_2D, tex); | |
| 165 gl2.texImage2D( | |
| 166 gl2.TEXTURE_2D, 0, gl2.RGBA, gl2.RGBA, gl2.UNSIGNED_BYTE, canvas1); | |
| 167 | |
| 168 assertMsg(causedException(makeReadPixels(gl2)), | |
| 169 "should throw exception by readPixels for NON origin clean canvas.")
; | |
| 170 assertMsg(causedException(makeToDataURL(canvas2)), | 173 assertMsg(causedException(makeToDataURL(canvas2)), |
| 171 "should throw exception by toDataURL for NON origin clean canvas."); | 174 "should throw exception by toDataURL for NON origin clean canvas."); |
| 175 assertMsg(causedException(makeTexImage2D(gl, canvas2)), |
| 176 "texImage2D with NON origin clean canvas should throw exception."); |
| 177 assertMsg(causedException(makeTexSubImage2D(gl, canvas2)), |
| 178 "texSubImage2D with NON origin clean canvas should throw exception."
); |
| 172 | 179 |
| 173 debug(""); | 180 debug("check that readPixels and toDataURL continue to work against this canva
s."); |
| 174 debug("check that copying from 1 unclean 3d canvas to a 2d canvas clears the o
rigin-clean flag on the 2d canvas."); | 181 assertMsg(!causedException(makeReadPixels(gl)), |
| 175 var canvas3 = document.getElementById("canvas3"); | 182 "readPixels should never throw exception -- not possible to dirty or
igin of WebGL canvas."); |
| 176 var ctx2d = canvas3.getContext("2d"); | 183 assertMsg(!causedException(makeToDataURL(canvas1)), |
| 177 assertMsg(!causedException(makeToDataURL(canvas3)), | 184 "should not throw exception by toDataURL for WebGL canvas, which sho
uld stay origin clean."); |
| 178 "should not throw exception by toDataURL for origin clean canvas."); | |
| 179 ctx2d.drawImage(canvas2, 0, 0); | |
| 180 assertMsg(causedException(makeToDataURL(canvas3)), | |
| 181 "should throw exception by toDataURL for NON origin clean canvas."); | |
| 182 | 185 |
| 183 debug(""); | 186 if (testVideo) { |
| 184 debug("check that copying a video from another origin clears the origin-clean
flag."); | 187 debug("check that an attempt to upload a video from another origin throws an
exception."); |
| 185 var canvas4 = document.getElementById("canvas4"); | 188 var video = document.getElementById("video"); |
| 186 var gl4 = create3DContext(canvas4); | 189 assertMsg(causedException(makeTexImage2D(gl, video)), |
| 187 assertMsg(!causedException(makeReadPixels(gl4)), | 190 "texImage2D with cross-origin video should throw exception."); |
| 188 "should not throw exception by readPixels for origin clean canvas.")
; | 191 assertMsg(causedException(makeTexSubImage2D(gl, video)), |
| 189 assertMsg(!causedException(makeToDataURL(canvas4)), | 192 "texSubImage2D with cross-origin video should throw exception."); |
| 190 "should not throw exception by toDataURL for origin clean canvas."); | 193 |
| 191 var tex4 = gl4.createTexture(); | 194 debug("check that readPixels and toDataURL continue to work against this can
vas."); |
| 192 gl4.bindTexture(gl4.TEXTURE_2D, tex4); | 195 assertMsg(!causedException(makeReadPixels(gl)), |
| 193 gl4.texImage2D( | 196 "readPixels should never throw exception -- not possible to dirty
origin of WebGL canvas."); |
| 194 gl4.TEXTURE_2D, 0, gl4.RGBA, gl4.RGBA, gl4.UNSIGNED_BYTE, video); | 197 assertMsg(!causedException(makeToDataURL(canvas1)), |
| 195 assertMsg(causedException(makeReadPixels(gl4)), | 198 "should not throw exception by toDataURL for WebGL canvas, which s
hould stay origin clean."); |
| 196 "should throw exception by readPixels for NON origin clean canvas.")
; | 199 } |
| 197 assertMsg(causedException(makeToDataURL(canvas4)), | |
| 198 "should throw exception by toDataURL for NON origin clean canvas."); | |
| 199 | 200 |
| 200 debug('<br /><span class="pass">TEST COMPLETE</span>'); | 201 debug('<br /><span class="pass">TEST COMPLETE</span>'); |
| 201 if (window.layoutTestController) | 202 if (window.layoutTestController) |
| 202 layoutTestController.waitUntilDone(); | 203 layoutTestController.waitUntilDone(); |
| 203 if (window.layoutTestController) { | 204 if (window.layoutTestController) { |
| 204 layoutTestController.notifyDone(); | 205 layoutTestController.notifyDone(); |
| 205 } | 206 } |
| 206 } | 207 } |
| 207 </script> | 208 </script> |
| 208 </head> | 209 </head> |
| 209 <body onload="init()"> | 210 <body onload="init()"> |
| 210 <div id="description"></div> | 211 <div id="description"></div> |
| 211 <div id="console"></div> | 212 <div id="console"></div> |
| 212 <canvas id="canvas1"></canvas> | 213 <canvas id="canvas1"></canvas> |
| 213 <canvas id="canvas2"></canvas> | 214 <canvas id="canvas2"></canvas> |
| 214 <canvas id="canvas3"></canvas> | |
| 215 <canvas id="canvas4"></canvas> | |
| 216 <img id="img" src="http://localhost:8000/local/resources/abe.png" style="display
:none;"> | 215 <img id="img" src="http://localhost:8000/local/resources/abe.png" style="display
:none;"> |
| 217 <video id="video" style="display:none;"/> | 216 <video id="video" style="display:none;"/> |
| 218 </body> | 217 </body> |
| 219 </html> | 218 </html> |
| OLD | NEW |