<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[179675] branches/safari-600.1.4.15-branch</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/179675">179675</a></dd>
<dt>Author</dt> <dd>lforschler@apple.com</dd>
<dt>Date</dt> <dd>2015-02-04 22:18:25 -0800 (Wed, 04 Feb 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merged <a href="http://trac.webkit.org/projects/webkit/changeset/177165">r177165</a>.  rdar://problem/19718875</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branchessafari6001415branchLayoutTestsChangeLog">branches/safari-600.1.4.15-branch/LayoutTests/ChangeLog</a></li>
<li><a href="#branchessafari6001415branchSourceWebCoreChangeLog">branches/safari-600.1.4.15-branch/Source/WebCore/ChangeLog</a></li>
<li><a href="#branchessafari6001415branchSourceWebCorehtmlcanvasWebGLRenderingContextcpp">branches/safari-600.1.4.15-branch/Source/WebCore/html/canvas/WebGLRenderingContext.cpp</a></li>
<li><a href="#branchessafari6001415branchSourceWebCorehtmlcanvasWebGLRenderingContexth">branches/safari-600.1.4.15-branch/Source/WebCore/html/canvas/WebGLRenderingContext.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#branchessafari6001415branchLayoutTestsfastcanvaswebglangleinstancedarraysoutofboundsexpectedtxt">branches/safari-600.1.4.15-branch/LayoutTests/fast/canvas/webgl/angle-instanced-arrays-out-of-bounds-expected.txt</a></li>
<li><a href="#branchessafari6001415branchLayoutTestsfastcanvaswebglangleinstancedarraysoutofboundshtml">branches/safari-600.1.4.15-branch/LayoutTests/fast/canvas/webgl/angle-instanced-arrays-out-of-bounds.html</a></li>
<li><a href="#branchessafari6001415branchLayoutTestsfastcanvaswebglresourcesoutofboundstestjs">branches/safari-600.1.4.15-branch/LayoutTests/fast/canvas/webgl/resources/out-of-bounds-test.js</a></li>
<li><a href="#branchessafari6001415branchLayoutTestsplatformmacmountainlionfastcanvaswebglangleinstancedarraysoutofboundsexpectedtxt">branches/safari-600.1.4.15-branch/LayoutTests/platform/mac-mountainlion/fast/canvas/webgl/angle-instanced-arrays-out-of-bounds-expected.txt</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchessafari6001415branchLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-600.1.4.15-branch/LayoutTests/ChangeLog (179674 => 179675)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-600.1.4.15-branch/LayoutTests/ChangeLog        2015-02-05 05:41:30 UTC (rev 179674)
+++ branches/safari-600.1.4.15-branch/LayoutTests/ChangeLog        2015-02-05 06:18:25 UTC (rev 179675)
</span><span class="lines">@@ -1,5 +1,25 @@
</span><span class="cx"> 2015-02-04  Lucas Forschler  &lt;lforschler@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Merge r177165
+
+    2014-12-10  Dean Jackson  &lt;dino@apple.com&gt;
+
+            InstancedArray crashes attempting to draw out of bounds
+            https://bugs.webkit.org/show_bug.cgi?id=139521
+            &lt;rdar://problem/17540398&gt;
+
+            Reviewed by Simon Fraser.
+
+            This is a copy of the official webgl/1.0.3 test.
+
+            * platform/mac-mountainlion/fast/canvas/webgl/angle-instanced-arrays-out-of-bounds-expected.txt: Added. This extension is not available on Mountain Lion.
+            * fast/canvas/webgl/angle-instanced-arrays-out-of-bounds-expected.txt: Added.
+            * fast/canvas/webgl/angle-instanced-arrays-out-of-bounds.html: Added.
+            * fast/canvas/webgl/resources/out-of-bounds-test.js: Added.
+            (OutOfBoundsTest):
+
+2015-02-04  Lucas Forschler  &lt;lforschler@apple.com&gt;
+
</ins><span class="cx">         Merge r177089
</span><span class="cx"> 
</span><span class="cx">     2014-12-10  Antti Koivisto  &lt;antti@apple.com&gt;
</span></span></pre></div>
<a id="branchessafari6001415branchLayoutTestsfastcanvaswebglangleinstancedarraysoutofboundsexpectedtxtfromrev177165trunkLayoutTestsfastcanvaswebglangleinstancedarraysoutofboundsexpectedtxt"></a>
<div class="copfile"><h4>Copied: branches/safari-600.1.4.15-branch/LayoutTests/fast/canvas/webgl/angle-instanced-arrays-out-of-bounds-expected.txt (from rev 177165, trunk/LayoutTests/fast/canvas/webgl/angle-instanced-arrays-out-of-bounds-expected.txt) (0 => 179675)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-600.1.4.15-branch/LayoutTests/fast/canvas/webgl/angle-instanced-arrays-out-of-bounds-expected.txt                                (rev 0)
+++ branches/safari-600.1.4.15-branch/LayoutTests/fast/canvas/webgl/angle-instanced-arrays-out-of-bounds-expected.txt        2015-02-05 06:18:25 UTC (rev 179675)
</span><span class="lines">@@ -0,0 +1,386 @@
</span><ins>+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: no ELEMENT_ARRAY_BUFFER bound
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: no ELEMENT_ARRAY_BUFFER bound
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawArraysInstanced: first or count &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_VALUE: drawElementsInstanced: count or offset &lt; 0
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: request out of bounds for current ELEMENT_ARRAY_BUFFER
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: no ELEMENT_ARRAY_BUFFER bound
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: no ELEMENT_ARRAY_BUFFER bound
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawArraysInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: drawElementsInstanced: attempt to access out of bounds arrays
+Test of drawArraysInstancedANGLE and drawElementsInstancedANGLE with out-of-bounds parameters
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+ PASS Successfully enabled ANGLE_instanced_arrays extension
+
+Test with 1 instance without instanced attributes
+
+Test empty buffer
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 1, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 10000, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 10000000000000, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 1, 0, 1) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 0, 1) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 100, 0, 1) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, -1, 1) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, -1, 0, 1) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 1, -1, 1) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, -1, 1, 1) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 0xffffffff, 1) was expected value: INVALID_VALUE.
+
+Test buffer with 3 float vectors
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 3, 1) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 3, 2, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 10000, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 10000000000000, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 0, 1) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 100, 0, 1) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, -1, 1) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, -1, 0, 1) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 1, -1, 1) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, -1, 1, 1) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 0xffffffff, 1) was expected value: INVALID_VALUE.
+
+Test buffer with interleaved (3+2) float vectors
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 9, 1) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, -500, 1) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, -200, 1, 1) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, -200, -500, 1) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 0xffffffff, 1) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0xffffffff, 0xffffffff, 1) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0xffffffff, 1, 1) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 200, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 0x7fffffff, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0x7fffffff, 1, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0x7fffffff, 0x7fffffff, 1) was expected value: INVALID_OPERATION.
+
+Test empty index buffer
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0, gl.UNSIGNED_BYTE, 0, 1) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 3, gl.UNSIGNED_BYTE, 0, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 10000, gl.UNSIGNED_BYTE, 0, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 10000000000000, gl.UNSIGNED_BYTE, 0, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 1, gl.UNSIGNED_BYTE, 0, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, -1, gl.UNSIGNED_BYTE, 0, 1) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0, gl.UNSIGNED_BYTE, -1, 1) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, -1, gl.UNSIGNED_BYTE, 1, 1) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 1, gl.UNSIGNED_BYTE, -1, 1) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0xffffffff, gl.UNSIGNED_BYTE, 0, 1) was expected value: INVALID_VALUE.
+
+Test buffer with 3 byte indexes
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 3, gl.UNSIGNED_BYTE, 0, 1) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 3, gl.UNSIGNED_BYTE, 2, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 10000, gl.UNSIGNED_BYTE, 0, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 10000000000000, gl.UNSIGNED_BYTE, 0, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, -1, gl.UNSIGNED_BYTE, 0, 1) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0, gl.UNSIGNED_BYTE, -1, 1) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, -1, gl.UNSIGNED_BYTE, 1, 1) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 1, gl.UNSIGNED_BYTE, -1, 1) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0xffffffff, gl.UNSIGNED_BYTE, 0, 1) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0, gl.UNSIGNED_BYTE, 4, 1) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0x7fffffff, gl.UNSIGNED_BYTE, 0, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0x7fffffff, gl.UNSIGNED_BYTE, 0x7fffffff, 1) was expected value: INVALID_OPERATION.
+PASS gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, (new Uint8Array([ 3, 0, 1, 2 ])).subarray(1), gl.STATIC_DRAW) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 3, gl.UNSIGNED_BYTE, 0, 1) was expected value: NO_ERROR.
+PASS gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, new Uint8Array([ 3, 0, 1])) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 3, gl.UNSIGNED_BYTE, 0, 1) was expected value: INVALID_OPERATION.
+PASS gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, (new Uint8Array([ 3, 0, 1, 2 ])).subarray(1)) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 3, gl.UNSIGNED_BYTE, 0, 1) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0, gl.UNSIGNED_BYTE, 0, 1) was expected value: NO_ERROR.
+
+Test buffer with interleaved (3+2) float vectors
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_SHORT, 0, 1) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_SHORT, 1000, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 12, gl.UNSIGNED_SHORT, 0, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 15, gl.UNSIGNED_SHORT, 0, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 18, gl.UNSIGNED_SHORT, 0, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 30, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0xffffffff, gl.UNSIGNED_SHORT, 0, 1) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 1, gl.UNSIGNED_SHORT, 0xffffffff, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0x7fffffff, gl.UNSIGNED_SHORT, 0, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0, gl.UNSIGNED_SHORT, 0, 1) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0, 1) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 1, 1) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 2, 1) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0, 1) was expected value: INVALID_OPERATION.
+
+Test buffer setting attrib 0 to a buffer too small and disable it.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 2, 1) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 2, 1) was expected value: INVALID_OPERATION.
+
+Test with 2 instances without instanced attributes
+
+Test empty buffer
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 1, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 10000, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 10000000000000, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 1, 0, 2) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 0, 2) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 100, 0, 2) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, -1, 2) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, -1, 0, 2) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 1, -1, 2) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, -1, 1, 2) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 0xffffffff, 2) was expected value: INVALID_VALUE.
+
+Test buffer with 3 float vectors
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 3, 2) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 3, 2, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 10000, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 10000000000000, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 0, 2) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 100, 0, 2) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, -1, 2) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, -1, 0, 2) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 1, -1, 2) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, -1, 1, 2) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 0xffffffff, 2) was expected value: INVALID_VALUE.
+
+Test buffer with interleaved (3+2) float vectors
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 9, 2) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, -500, 2) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, -200, 1, 2) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, -200, -500, 2) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 0xffffffff, 2) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0xffffffff, 0xffffffff, 2) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0xffffffff, 1, 2) was expected value: INVALID_VALUE.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 200, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 0x7fffffff, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0x7fffffff, 1, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0x7fffffff, 0x7fffffff, 2) was expected value: INVALID_OPERATION.
+
+Test empty index buffer
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0, gl.UNSIGNED_BYTE, 0, 2) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 3, gl.UNSIGNED_BYTE, 0, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 10000, gl.UNSIGNED_BYTE, 0, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 10000000000000, gl.UNSIGNED_BYTE, 0, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 1, gl.UNSIGNED_BYTE, 0, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, -1, gl.UNSIGNED_BYTE, 0, 2) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0, gl.UNSIGNED_BYTE, -1, 2) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, -1, gl.UNSIGNED_BYTE, 1, 2) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 1, gl.UNSIGNED_BYTE, -1, 2) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0xffffffff, gl.UNSIGNED_BYTE, 0, 2) was expected value: INVALID_VALUE.
+
+Test buffer with 3 byte indexes
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 3, gl.UNSIGNED_BYTE, 0, 2) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 3, gl.UNSIGNED_BYTE, 2, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 10000, gl.UNSIGNED_BYTE, 0, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 10000000000000, gl.UNSIGNED_BYTE, 0, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, -1, gl.UNSIGNED_BYTE, 0, 2) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0, gl.UNSIGNED_BYTE, -1, 2) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, -1, gl.UNSIGNED_BYTE, 1, 2) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 1, gl.UNSIGNED_BYTE, -1, 2) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0xffffffff, gl.UNSIGNED_BYTE, 0, 2) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0, gl.UNSIGNED_BYTE, 4, 2) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0x7fffffff, gl.UNSIGNED_BYTE, 0, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0x7fffffff, gl.UNSIGNED_BYTE, 0x7fffffff, 2) was expected value: INVALID_OPERATION.
+PASS gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, (new Uint8Array([ 3, 0, 1, 2 ])).subarray(1), gl.STATIC_DRAW) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 3, gl.UNSIGNED_BYTE, 0, 2) was expected value: NO_ERROR.
+PASS gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, new Uint8Array([ 3, 0, 1])) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 3, gl.UNSIGNED_BYTE, 0, 2) was expected value: INVALID_OPERATION.
+PASS gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, (new Uint8Array([ 3, 0, 1, 2 ])).subarray(1)) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 3, gl.UNSIGNED_BYTE, 0, 2) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0, gl.UNSIGNED_BYTE, 0, 2) was expected value: NO_ERROR.
+
+Test buffer with interleaved (3+2) float vectors
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_SHORT, 0, 2) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_SHORT, 1000, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 12, gl.UNSIGNED_SHORT, 0, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 15, gl.UNSIGNED_SHORT, 0, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 18, gl.UNSIGNED_SHORT, 0, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 30, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0xffffffff, gl.UNSIGNED_SHORT, 0, 2) was expected value: INVALID_VALUE.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 1, gl.UNSIGNED_SHORT, 0xffffffff, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0x7fffffff, gl.UNSIGNED_SHORT, 0, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 0, gl.UNSIGNED_SHORT, 0, 2) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0, 2) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 1, 2) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 2, 2) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0, 2) was expected value: INVALID_OPERATION.
+
+Test buffer setting attrib 0 to a buffer too small and disable it.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 2, 2) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 2, 2) was expected value: INVALID_OPERATION.
+
+Test out-of-range instanced attributes
+
+Test with an empty buffer for the instanced attribute
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 9, 0) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 10000, 0) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 9, 1) was expected value: INVALID_OPERATION.
+Test with a buffer with 1 float for the instanced attribute
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 9, 0) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 10000, 0) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 9, 1) was expected value: INVALID_OPERATION.
+
+Test with a buffer with 2 floats for the instanced attribute
+Divisor 1
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 9, 1) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 9, 2) was expected value: INVALID_OPERATION.
+Divisor 3
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 9, 3) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 9, 4) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 9, 10000) was expected value: INVALID_OPERATION.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 9, 0x7fffffff) was expected value: INVALID_OPERATION.
+
+Test with a buffer with 4 floats for the instanced attribute
+Divisor 1
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 9, 2) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 9, 3) was expected value: INVALID_OPERATION.
+Divisor 2
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 9, 4) was expected value: NO_ERROR.
+PASS ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 9, 5) was expected value: INVALID_OPERATION.
+
+Test out-of-range instanced attributes
+
+Test with an empty buffer for the instanced attribute
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_BYTE, 0, 0) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 10000, gl.UNSIGNED_BYTE, 0, 0) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_BYTE, 0, 1) was expected value: INVALID_OPERATION.
+Test with a buffer with 1 float for the instanced attribute
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_BYTE, 0, 0) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 10000, gl.UNSIGNED_BYTE, 0, 0) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_BYTE, 0, 1) was expected value: INVALID_OPERATION.
+
+Test with a buffer with 2 floats for the instanced attribute
+Divisor 1
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_BYTE, 0, 1) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_BYTE, 0, 2) was expected value: INVALID_OPERATION.
+Divisor 3
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_BYTE, 0, 3) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_BYTE, 0, 4) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_BYTE, 0, 10000) was expected value: INVALID_OPERATION.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_BYTE, 0, 0x7fffffff) was expected value: INVALID_OPERATION.
+
+Test with a buffer with 4 floats for the instanced attribute
+Divisor 1
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_BYTE, 0, 2) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_BYTE, 0, 3) was expected value: INVALID_OPERATION.
+Divisor 2
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_BYTE, 0, 4) was expected value: NO_ERROR.
+PASS ext.drawElementsInstancedANGLE(gl.TRIANGLES, 9, gl.UNSIGNED_BYTE, 0, 5) was expected value: INVALID_OPERATION.
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="branchessafari6001415branchLayoutTestsfastcanvaswebglangleinstancedarraysoutofboundshtmlfromrev177165trunkLayoutTestsfastcanvaswebglangleinstancedarraysoutofboundshtml"></a>
<div class="copfile"><h4>Copied: branches/safari-600.1.4.15-branch/LayoutTests/fast/canvas/webgl/angle-instanced-arrays-out-of-bounds.html (from rev 177165, trunk/LayoutTests/fast/canvas/webgl/angle-instanced-arrays-out-of-bounds.html) (0 => 179675)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-600.1.4.15-branch/LayoutTests/fast/canvas/webgl/angle-instanced-arrays-out-of-bounds.html                                (rev 0)
+++ branches/safari-600.1.4.15-branch/LayoutTests/fast/canvas/webgl/angle-instanced-arrays-out-of-bounds.html        2015-02-05 06:18:25 UTC (rev 179675)
</span><span class="lines">@@ -0,0 +1,80 @@
</span><ins>+&lt;!--
+
+/*
+** Copyright (c) 2014 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** &quot;Materials&quot;), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+--&gt;
+
+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;meta charset=&quot;utf-8&quot;&gt;
+&lt;link rel=&quot;stylesheet&quot; href=&quot;../../../resources/js-test-style.css&quot;/&gt;
+&lt;script src=&quot;resources/desktop-gl-constants.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/webgl-test.js&quot;&gt; &lt;/script&gt;
+&lt;script src=&quot;resources/webgl-test-utils.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/out-of-bounds-test.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
+&lt;canvas id=&quot;canvas&quot; style=&quot;width: 50px; height: 50px;&quot;&gt;&lt;/canvas&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+
+&lt;script&gt;
+&quot;use strict&quot;;
+description(&quot;Test of drawArraysInstancedANGLE and drawElementsInstancedANGLE with out-of-bounds parameters&quot;);
+
+var wtu = WebGLTestUtils;
+var canvas = document.getElementById(&quot;canvas&quot;);
+var gl = wtu.create3DContext(canvas);
+var ext = wtu.getExtensionWithKnownPrefixes(gl, &quot;ANGLE_instanced_arrays&quot;);
+if (!ext) {
+    testPassed(&quot;No ANGLE_instanced_arrays support -- this is legal&quot;);
+} else {
+    testPassed(&quot;Successfully enabled ANGLE_instanced_arrays extension&quot;);
+    debug(&quot;&quot;);
+    debug(&quot;Test with 1 instance without instanced attributes&quot;);
+    debug(&quot;&quot;);
+    OutOfBoundsTest.runDrawArraysTest(&quot;ext.drawArraysInstancedANGLE(gl.TRIANGLES, $(offset), $(count), 1)&quot;, gl, wtu, ext);
+    debug(&quot;&quot;);
+    OutOfBoundsTest.runDrawElementsTest(&quot;ext.drawElementsInstancedANGLE(gl.TRIANGLES, $(count), $(type), $(offset), 1)&quot;, gl, wtu, ext);
+    debug(&quot;&quot;);
+    debug(&quot;Test with 2 instances without instanced attributes&quot;);
+    debug(&quot;&quot;);
+    OutOfBoundsTest.runDrawArraysTest(&quot;ext.drawArraysInstancedANGLE(gl.TRIANGLES, $(offset), $(count), 2)&quot;, gl, wtu, ext);
+    debug(&quot;&quot;);
+    OutOfBoundsTest.runDrawElementsTest(&quot;ext.drawElementsInstancedANGLE(gl.TRIANGLES, $(count), $(type), $(offset), 2)&quot;, gl, wtu, ext);
+    debug(&quot;&quot;);
+    OutOfBoundsTest.runDrawArraysInstancedTest(&quot;ext.drawArraysInstancedANGLE(gl.TRIANGLES, $(offset), $(count), $(primcount))&quot;, gl, wtu, ext);
+    debug(&quot;&quot;);
+    OutOfBoundsTest.runDrawElementsInstancedTest(&quot;ext.drawElementsInstancedANGLE(gl.TRIANGLES, $(count), $(type), $(offset), $(primcount))&quot;, gl, wtu, ext);
+    debug(&quot;&quot;);
+}
+
+var successfullyParsed = true;
+&lt;/script&gt;
+
+&lt;script src=&quot;../../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="branchessafari6001415branchLayoutTestsfastcanvaswebglresourcesoutofboundstestjsfromrev177165trunkLayoutTestsfastcanvaswebglresourcesoutofboundstestjs"></a>
<div class="copfile"><h4>Copied: branches/safari-600.1.4.15-branch/LayoutTests/fast/canvas/webgl/resources/out-of-bounds-test.js (from rev 177165, trunk/LayoutTests/fast/canvas/webgl/resources/out-of-bounds-test.js) (0 => 179675)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-600.1.4.15-branch/LayoutTests/fast/canvas/webgl/resources/out-of-bounds-test.js                                (rev 0)
+++ branches/safari-600.1.4.15-branch/LayoutTests/fast/canvas/webgl/resources/out-of-bounds-test.js        2015-02-05 06:18:25 UTC (rev 179675)
</span><span class="lines">@@ -0,0 +1,329 @@
</span><ins>+/*
+** Copyright (c) 2014 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** &quot;Materials&quot;), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+'use strict';
+
+var OutOfBoundsTest = (function() {
+
+var runCommonInvalidValueTests = function(callTemplate, gl, wtu, ext) {
+    wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, wtu.replaceParams(callTemplate, {count: -1, type: 'gl.UNSIGNED_BYTE', offset: 0}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, wtu.replaceParams(callTemplate, {count: 0, type: 'gl.UNSIGNED_BYTE', offset: -1}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, wtu.replaceParams(callTemplate, {count: -1, type: 'gl.UNSIGNED_BYTE', offset: 1}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, wtu.replaceParams(callTemplate, {count: 1, type: 'gl.UNSIGNED_BYTE', offset: -1}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, wtu.replaceParams(callTemplate, {count: '0xffffffff', type: 'gl.UNSIGNED_BYTE', offset: 0}));
+};
+
+var setupProgramAndBindVertexArray = function(gl, wtu) {
+    var program = wtu.loadStandardProgram(gl);
+
+    gl.useProgram(program);
+    var vertexObject = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
+    gl.enableVertexAttribArray(0);
+
+    return program;
+};
+
+var setupProgram2 = function(gl, wtu) {
+    var vshader = [
+        'attribute vec3 aOne;',
+        'attribute vec2 aTwo;',
+        'void main() {',
+        '  gl_Position = vec4(aOne, 1.0) + vec4(aTwo, 0.0, 1.0);',
+        '}'
+    ].join('\n');
+
+    var fshader = [
+        'void main() {',
+        '  gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);',
+        '}'
+    ].join('\n');
+
+    var program = wtu.setupProgram(gl, [vshader, fshader], [ &quot;aOne&quot;, &quot;aTwo&quot; ]);
+    if (!program) {
+        testFailed(&quot;failed to create test program&quot;);
+    }
+    return program;
+};
+
+var runDrawArraysTest = function(callTemplate, gl, wtu, ext) {
+    var program = setupProgramAndBindVertexArray(gl, wtu);
+
+    debug(&quot;Test empty buffer&quot;)
+    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([  ]), gl.STATIC_DRAW);
+    gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: 0, count: 1}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: 0, count: 10000}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: 0, count: 10000000000000}));
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {offset: 1, count: 0}));
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {offset: 0, count: 0}));
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {offset: 100, count: 0}));
+    runCommonInvalidValueTests(callTemplate, gl, wtu, ext);
+
+    debug(&quot;&quot;)
+    debug(&quot;Test buffer with 3 float vectors&quot;)
+    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 0,0.5,0, -0.5,-0.5,0, 0.5,-0.5,0 ]), gl.STATIC_DRAW);
+    gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {offset: 0, count: 3}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: 3, count: 2}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: 0, count: 10000}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: 0, count: 10000000000000}));
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {offset: 0, count: 0}));
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {offset: 100, count: 0}));
+    runCommonInvalidValueTests(callTemplate, gl, wtu, ext);
+
+    debug(&quot;&quot;)
+    debug(&quot;Test buffer with interleaved (3+2) float vectors&quot;)
+
+    setupProgram2(gl, wtu);
+
+    var vbo = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
+    // enough for 9 vertices, so 3 triangles
+    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(9*5), gl.STATIC_DRAW);
+
+    // bind first 3 elements, with a stride of 5 float elements
+    gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 5*4, 0);
+    // bind 2 elements, starting after the first 3; same stride of 5 float elements
+    gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 5*4, 3*4);
+
+    gl.enableVertexAttribArray(0);
+    gl.enableVertexAttribArray(1);
+
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {offset: 0, count: 9}));
+
+    // negative values must generate INVALID_VALUE; they can never be valid
+    wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, wtu.replaceParams(callTemplate, {offset: 0, count: -500}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, wtu.replaceParams(callTemplate, {offset: -200, count: 1}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, wtu.replaceParams(callTemplate, {offset: -200, count: -500}));
+
+    // 0xffffffff needs to convert to a 'long' IDL argument as -1, as per
+    // WebIDL 4.1.7.  JS ToInt32(0xffffffff) == -1. Thus INVALID_VALUE.
+    wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, wtu.replaceParams(callTemplate, {offset: 0, count: '0xffffffff'}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, wtu.replaceParams(callTemplate, {offset: '0xffffffff', count: '0xffffffff'}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, wtu.replaceParams(callTemplate, {offset: '0xffffffff', count: 1}));
+
+    // values that could otherwise be valid but aren't due to bindings generate
+    // INVALID_OPERATION
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: 0, count: 200}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: 0, count: '0x7fffffff'}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: '0x7fffffff', count: 1}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: '0x7fffffff', count: '0x7fffffff'}));
+};
+
+var runDrawElementsTest = function(callTemplate, gl, wtu, ext) {
+    var program = setupProgramAndBindVertexArray(gl, wtu);
+
+    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 0,0.5,0, -0.5,-0.5,0, 0.5,-0.5,0 ]), gl.STATIC_DRAW);
+    gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
+
+    var indexObject = gl.createBuffer();
+
+    debug('Test empty index buffer');
+    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexObject);
+    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint8Array([  ]), gl.STATIC_DRAW);
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {count: 0, type: 'gl.UNSIGNED_BYTE', offset: 0}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: 3, type: 'gl.UNSIGNED_BYTE', offset: 0}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: 10000, type: 'gl.UNSIGNED_BYTE', offset: 0}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: 10000000000000, type: 'gl.UNSIGNED_BYTE', offset: 0}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: 1, type: 'gl.UNSIGNED_BYTE', offset: 0}));
+    runCommonInvalidValueTests(callTemplate, gl, wtu, ext);
+
+    debug('');
+    debug('Test buffer with 3 byte indexes');
+    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexObject);
+    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint8Array([ 0, 1, 2 ]), gl.STATIC_DRAW);
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {count: 3, type: 'gl.UNSIGNED_BYTE', offset: 0}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: 3, type: 'gl.UNSIGNED_BYTE', offset: 2}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: 10000, type: 'gl.UNSIGNED_BYTE', offset: 0}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: 10000000000000, type: 'gl.UNSIGNED_BYTE', offset: 0}));
+    runCommonInvalidValueTests(callTemplate, gl, wtu, ext);
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {count: 0, type: 'gl.UNSIGNED_BYTE', offset: 4}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: '0x7fffffff', type: 'gl.UNSIGNED_BYTE', offset: 0}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: '0x7fffffff', type: 'gl.UNSIGNED_BYTE', offset: '0x7fffffff'}));
+
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, 'gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, (new Uint8Array([ 3, 0, 1, 2 ])).subarray(1), gl.STATIC_DRAW)');
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {count: 3, type: 'gl.UNSIGNED_BYTE', offset: 0}));
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, 'gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, new Uint8Array([ 3, 0, 1]))');
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: 3, type: 'gl.UNSIGNED_BYTE', offset: 0}));
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, 'gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, (new Uint8Array([ 3, 0, 1, 2 ])).subarray(1))');
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {count: 3, type: 'gl.UNSIGNED_BYTE', offset: 0}));
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {count: 0, type: 'gl.UNSIGNED_BYTE', offset: 0}));
+
+    debug('');
+    debug('Test buffer with interleaved (3+2) float vectors');
+
+    setupProgram2(gl, wtu);
+
+    var vbo = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
+    // enough for 9 vertices, so 3 triangles
+    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(9*5), gl.STATIC_DRAW);
+
+    // bind first 3 elements, with a stride of 5 float elements
+    gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 5*4, 0);
+    // bind 2 elements, starting after the first 3; same stride of 5 float elements
+    gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 5*4, 3*4);
+
+    gl.enableVertexAttribArray(0);
+    gl.enableVertexAttribArray(1);
+
+    var ebo = gl.createBuffer();
+    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ebo);
+    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(
+        [ 0, 1, 2,
+          1, 2, 0,
+          2, 0, 1,
+          200, 200, 200,
+          0x7fff, 0x7fff, 0x7fff,
+          0xffff, 0xffff, 0xffff ]),
+        gl.STATIC_DRAW);
+
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {count: 9, type: 'gl.UNSIGNED_SHORT', offset: 0}));
+
+
+    // invalid operation with indices that would be valid with correct bindings
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: 9, type: 'gl.UNSIGNED_SHORT', offset: 1000}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: 12, type: 'gl.UNSIGNED_SHORT', offset: 0}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: 15, type: 'gl.UNSIGNED_SHORT', offset: 0}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: 18, type: 'gl.UNSIGNED_SHORT', offset: 0}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: 3, type: 'gl.UNSIGNED_SHORT', offset: 2*15}));
+
+    // 0xffffffff needs to convert to a 'long' IDL argument as -1, as per
+    // WebIDL 4.1.7.  JS ToInt32(0xffffffff) == -1. Thus INVALID_VALUE.
+    wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, wtu.replaceParams(callTemplate, {count: '0xffffffff', type: 'gl.UNSIGNED_SHORT', offset: 0}));
+    // offset is defined as GLintptr, which is long long in IDL (64-bit).
+    // 2^32 - 1 should not overflow, and only result in INVALID_OPERATION.
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: 1, type: 'gl.UNSIGNED_SHORT', offset: '0xffffffff'}));
+
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: '0x7fffffff', type: 'gl.UNSIGNED_SHORT', offset: 0}));
+
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {count: 0, type: 'gl.UNSIGNED_SHORT', offset: 0}));
+
+    // invalid operation with offset that's not a multiple of the type size
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {count: 6, type: 'gl.UNSIGNED_SHORT', offset: 0}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: 6, type: 'gl.UNSIGNED_SHORT', offset: 1}));
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {count: 6, type: 'gl.UNSIGNED_SHORT', offset: 2}));
+
+    // invalid operation if no buffer is bound to ELEMENT_ARRAY_BUFFER
+    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: 6, type: 'gl.UNSIGNED_SHORT', offset: 0}));
+    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ebo);
+
+    debug('');
+    debug('Test buffer setting attrib 0 to a buffer too small and disable it.');
+    var smallVBO = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, smallVBO);
+    gl.bufferData(gl.ARRAY_BUFFER, 1, gl.STATIC_DRAW);
+    gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0x10);
+    gl.disableVertexAttribArray(0);
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {count: 6, type: 'gl.UNSIGNED_SHORT', offset: 2}));
+    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {count: 6, type: 'gl.UNSIGNED_SHORT', offset: 2}));
+};
+
+var runInstancedTest = function(callTemplate, gl, wtu, ext) {
+    setupProgram2(gl, wtu);
+
+    // Initialize non-instanced attribute data.
+    // Enough for 9 vertices, so 3 triangles.
+    var vbo = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
+    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(9*3), gl.STATIC_DRAW);
+
+    gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
+
+    // Setup buffer for instanced attribute data.
+    var vbo2 = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, vbo2);
+    gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0);
+
+    gl.enableVertexAttribArray(0);
+    gl.enableVertexAttribArray(1);
+
+    debug('Test out-of-range instanced attributes');
+    debug('');
+
+    debug('Test with an empty buffer for the instanced attribute');
+    ext.vertexAttribDivisorANGLE(1, 1);
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {offset: 0, count: 9, primcount: 0}));
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {offset: 0, count: 10000, primcount: 0}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: 0, count: 9, primcount: 1}));
+
+    debug('Test with a buffer with 1 float for the instanced attribute');
+    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(1), gl.STATIC_DRAW);
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {offset: 0, count: 9, primcount: 0}));
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {offset: 0, count: 10000, primcount: 0}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: 0, count: 9, primcount: 1}));
+
+    debug('');
+    debug('Test with a buffer with 2 floats for the instanced attribute');
+    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(2), gl.STATIC_DRAW);
+    debug('Divisor 1');
+    ext.vertexAttribDivisorANGLE(1, 1);
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {offset: 0, count: 9, primcount: 1}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: 0, count: 9, primcount: 2}));
+    debug('Divisor 3');
+    ext.vertexAttribDivisorANGLE(1, 3);
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {offset: 0, count: 9, primcount: 3}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: 0, count: 9, primcount: 4}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: 0, count: 9, primcount: 10000}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: 0, count: 9, primcount: '0x7fffffff'}));
+
+    debug('');
+    debug('Test with a buffer with 4 floats for the instanced attribute');
+    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(4), gl.STATIC_DRAW);
+    debug('Divisor 1');
+    ext.vertexAttribDivisorANGLE(1, 1);
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {offset: 0, count: 9, primcount: 2}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: 0, count: 9, primcount: 3}));
+    debug('Divisor 2');
+    ext.vertexAttribDivisorANGLE(1, 2);
+    wtu.shouldGenerateGLError(gl, gl.NO_ERROR, wtu.replaceParams(callTemplate, {offset: 0, count: 9, primcount: 4}));
+    wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION, wtu.replaceParams(callTemplate, {offset: 0, count: 9, primcount: 5}));
+};
+
+var runDrawArraysInstancedTest = function(callTemplate, gl, wtu, ext) {
+    runInstancedTest(callTemplate, gl, wtu, ext);
+};
+
+var runDrawElementsInstancedTest = function(callTemplate, gl, wtu, ext) {
+    var ebo = gl.createBuffer();
+    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ebo);
+    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint8Array(
+        [ 0, 1, 2,
+          5, 4, 3,
+          6, 7, 8 ]),
+        gl.STATIC_DRAW);
+    callTemplate = wtu.replaceParams(callTemplate, {type: 'gl.UNSIGNED_BYTE', offset: '$(offset)', count: '$(count)', primcount: '$(primcount)'});
+    runInstancedTest(callTemplate, gl, wtu, ext);
+};
+
+return {
+    runDrawArraysTest: runDrawArraysTest,
+    runDrawArraysInstancedTest: runDrawArraysInstancedTest,
+    runDrawElementsTest: runDrawElementsTest,
+    runDrawElementsInstancedTest: runDrawElementsInstancedTest
+};
+
+})();
</ins></span></pre></div>
<a id="branchessafari6001415branchLayoutTestsplatformmacmountainlionfastcanvaswebglangleinstancedarraysoutofboundsexpectedtxtfromrev177165trunkLayoutTestsplatformmacmountainlionfastcanvaswebglangleinstancedarraysoutofboundsexpectedtxt"></a>
<div class="copfile"><h4>Copied: branches/safari-600.1.4.15-branch/LayoutTests/platform/mac-mountainlion/fast/canvas/webgl/angle-instanced-arrays-out-of-bounds-expected.txt (from rev 177165, trunk/LayoutTests/platform/mac-mountainlion/fast/canvas/webgl/angle-instanced-arrays-out-of-bounds-expected.txt) (0 => 179675)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-600.1.4.15-branch/LayoutTests/platform/mac-mountainlion/fast/canvas/webgl/angle-instanced-arrays-out-of-bounds-expected.txt                                (rev 0)
+++ branches/safari-600.1.4.15-branch/LayoutTests/platform/mac-mountainlion/fast/canvas/webgl/angle-instanced-arrays-out-of-bounds-expected.txt        2015-02-05 06:18:25 UTC (rev 179675)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+Test of drawArraysInstancedANGLE and drawElementsInstancedANGLE with out-of-bounds parameters
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+ PASS No ANGLE_instanced_arrays support -- this is legal
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="branchessafari6001415branchSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-600.1.4.15-branch/Source/WebCore/ChangeLog (179674 => 179675)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-600.1.4.15-branch/Source/WebCore/ChangeLog        2015-02-05 05:41:30 UTC (rev 179674)
+++ branches/safari-600.1.4.15-branch/Source/WebCore/ChangeLog        2015-02-05 06:18:25 UTC (rev 179675)
</span><span class="lines">@@ -1,5 +1,35 @@
</span><span class="cx"> 2015-02-04  Lucas Forschler  &lt;lforschler@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Merge r177165
+
+    2014-12-10  Dean Jackson  &lt;dino@apple.com&gt;
+
+            InstancedArray crashes attempting to draw out of bounds
+            https://bugs.webkit.org/show_bug.cgi?id=139521
+
+            Reviewed by Simon Fraser.
+
+            We were not doing index validation correctly for instancing.
+
+            Test: fast/canvas/webgl/angle-instanced-arrays-out-of-bounds.html
+
+            * html/canvas/WebGLRenderingContext.cpp:
+            (WebCore::WebGLRenderingContext::validateVertexAttributes): We need to check
+            the number of instances drawn against the amount of instance data that has
+            been provided, taking into account the number of repeats (the divisor).
+            (WebCore::WebGLRenderingContext::drawArrays): Added some whitespace to make it more clear.
+            (WebCore::WebGLRenderingContext::validateDrawElements): This needs to take a primcount
+            parameter so that it can correctly validate the call (when used from drawElementsInstanced).
+            (WebCore::WebGLRenderingContext::drawElements): New signature to validate.
+            (WebCore::WebGLRenderingContext::drawArraysInstanced): Rearrange this a bit. The
+            primcount validation is already being done by the validateDrawArrays call. Also, there
+            was a bogus UNUSED_PARAM hanging around.
+            (WebCore::WebGLRenderingContext::drawElementsInstanced): Similar rearrangement. Use
+            the primcount parameter.
+            * html/canvas/WebGLRenderingContext.h:
+
+2015-02-04  Lucas Forschler  &lt;lforschler@apple.com&gt;
+
</ins><span class="cx">         Merge r177089
</span><span class="cx"> 
</span><span class="cx">     2014-12-10  Antti Koivisto  &lt;antti@apple.com&gt;
</span></span></pre></div>
<a id="branchessafari6001415branchSourceWebCorehtmlcanvasWebGLRenderingContextcpp"></a>
<div class="modfile"><h4>Modified: branches/safari-600.1.4.15-branch/Source/WebCore/html/canvas/WebGLRenderingContext.cpp (179674 => 179675)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-600.1.4.15-branch/Source/WebCore/html/canvas/WebGLRenderingContext.cpp        2015-02-05 05:41:30 UTC (rev 179674)
+++ branches/safari-600.1.4.15-branch/Source/WebCore/html/canvas/WebGLRenderingContext.cpp        2015-02-05 06:18:25 UTC (rev 179675)
</span><span class="lines">@@ -1953,10 +1953,16 @@
</span><span class="cx">                 ASSERT(state.stride &gt; 0);
</span><span class="cx">                 if (bytesRemaining &gt;= state.bytesPerElement)
</span><span class="cx">                     numElements = 1 + (bytesRemaining - state.bytesPerElement) / state.stride;
</span><del>-                if (!state.divisor)
</del><ins>+                unsigned instancesRequired = 0;
+                if (state.divisor) {
+                    instancesRequired = ceil(static_cast&lt;float&gt;(primitiveCount) / state.divisor);
+                    if (instancesRequired &gt; numElements)
+                        return false;
+                } else {
</ins><span class="cx">                     sawNonInstancedAttrib = true;
</span><del>-                if ((!state.divisor &amp;&amp; elementCount &gt; numElements) || (state.divisor &amp;&amp; primitiveCount &gt; numElements))
-                    return false;
</del><ins>+                    if (elementCount &gt; numElements)
+                        return false;
+                }
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -1980,7 +1986,7 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool WebGLRenderingContext::validateDrawArrays(const char* functionName, GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei primcount)
</del><ins>+bool WebGLRenderingContext::validateDrawArrays(const char* functionName, GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei primitiveCount)
</ins><span class="cx"> {
</span><span class="cx">     if (isContextLostOrPending() || !validateDrawMode(functionName, mode))
</span><span class="cx">         return false;
</span><span class="lines">@@ -1998,7 +2004,7 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (primcount &lt; 0) {
</del><ins>+    if (primitiveCount &lt; 0) {
</ins><span class="cx">         synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;primcount &lt; 0&quot;);
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="lines">@@ -2008,8 +2014,8 @@
</span><span class="cx">         Checked&lt;GC3Dint, RecordOverflow&gt; checkedFirst(first);
</span><span class="cx">         Checked&lt;GC3Dint, RecordOverflow&gt; checkedCount(count);
</span><span class="cx">         Checked&lt;GC3Dint, RecordOverflow&gt; checkedSum = checkedFirst + checkedCount;
</span><del>-        Checked&lt;GC3Dint, RecordOverflow&gt; checkedPrimCount(primcount);
-        if (checkedSum.hasOverflowed() || checkedPrimCount.hasOverflowed() || !validateVertexAttributes(checkedSum.unsafeGet(), checkedPrimCount.unsafeGet())) {
</del><ins>+        Checked&lt;GC3Dint, RecordOverflow&gt; checkedPrimitiveCount(primitiveCount);
+        if (checkedSum.hasOverflowed() || checkedPrimitiveCount.hasOverflowed() || !validateVertexAttributes(checkedSum.unsafeGet(), checkedPrimitiveCount.unsafeGet())) {
</ins><span class="cx">             synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;attempt to access out of bounds arrays&quot;);
</span><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="lines">@@ -2043,7 +2049,9 @@
</span><span class="cx">         vertexAttrib0Simulated = simulateVertexAttrib0(first + count - 1);
</span><span class="cx">     if (!isGLES2NPOTStrict())
</span><span class="cx">         checkTextureCompleteness(&quot;drawArrays&quot;, true);
</span><ins>+
</ins><span class="cx">     m_context-&gt;drawArrays(mode, first, count);
</span><ins>+
</ins><span class="cx">     if (!isGLES2Compliant() &amp;&amp; vertexAttrib0Simulated)
</span><span class="cx">         restoreStatesAfterVertexAttrib0Simulation();
</span><span class="cx">     if (!isGLES2NPOTStrict())
</span><span class="lines">@@ -2051,7 +2059,7 @@
</span><span class="cx">     markContextChanged();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool WebGLRenderingContext::validateDrawElements(const char* functionName, GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, unsigned&amp; numElements)
</del><ins>+bool WebGLRenderingContext::validateDrawElements(const char* functionName, GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, unsigned&amp; numElements, GC3Dsizei primitiveCount)
</ins><span class="cx"> {
</span><span class="cx">     if (isContextLostOrPending() || !validateDrawMode(functionName, mode))
</span><span class="cx">         return false;
</span><span class="lines">@@ -2083,6 +2091,11 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (primitiveCount &lt; 0) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;primcount &lt; 0&quot;);
+        return false;
+    }
+
</ins><span class="cx">     if (!m_boundVertexArrayObject-&gt;getElementArrayBuffer()) {
</span><span class="cx">         synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;no ELEMENT_ARRAY_BUFFER bound&quot;);
</span><span class="cx">         return false;
</span><span class="lines">@@ -2096,8 +2109,16 @@
</span><span class="cx">         }
</span><span class="cx">         if (!count)
</span><span class="cx">             return false;
</span><del>-        if (!validateIndexArrayConservative(type, numElements) || !validateVertexAttributes(numElements)) {
-            if (!validateIndexArrayPrecise(count, type, static_cast&lt;GC3Dintptr&gt;(offset), numElements) || !validateVertexAttributes(numElements)) {
</del><ins>+
+        Checked&lt;GC3Dint, RecordOverflow&gt; checkedCount(count);
+        Checked&lt;GC3Dint, RecordOverflow&gt; checkedPrimitiveCount(primitiveCount);
+        if (checkedCount.hasOverflowed() || checkedPrimitiveCount.hasOverflowed()) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;attempt to access out of bounds arrays&quot;);
+            return false;
+        }
+
+        if (!validateIndexArrayConservative(type, numElements) || !validateVertexAttributes(numElements, checkedPrimitiveCount.unsafeGet())) {
+            if (!validateIndexArrayPrecise(checkedCount.unsafeGet(), type, static_cast&lt;GC3Dintptr&gt;(offset), numElements) || !validateVertexAttributes(numElements, checkedPrimitiveCount.unsafeGet())) {
</ins><span class="cx">                 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;attempt to access out of bounds arrays&quot;);
</span><span class="cx">                 return false;
</span><span class="cx">             }
</span><span class="lines">@@ -2123,7 +2144,7 @@
</span><span class="cx">     UNUSED_PARAM(ec);
</span><span class="cx"> 
</span><span class="cx">     unsigned numElements = 0;
</span><del>-    if (!validateDrawElements(&quot;drawElements&quot;, mode, count, type, offset, numElements))
</del><ins>+    if (!validateDrawElements(&quot;drawElements&quot;, mode, count, type, offset, numElements, 0))
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     clearIfComposited();
</span><span class="lines">@@ -2136,7 +2157,9 @@
</span><span class="cx">     }
</span><span class="cx">     if (!isGLES2NPOTStrict())
</span><span class="cx">         checkTextureCompleteness(&quot;drawElements&quot;, true);
</span><ins>+
</ins><span class="cx">     m_context-&gt;drawElements(mode, count, type, static_cast&lt;GC3Dintptr&gt;(offset));
</span><ins>+
</ins><span class="cx">     if (!isGLES2Compliant() &amp;&amp; vertexAttrib0Simulated)
</span><span class="cx">         restoreStatesAfterVertexAttrib0Simulation();
</span><span class="cx">     if (!isGLES2NPOTStrict())
</span><span class="lines">@@ -6179,19 +6202,14 @@
</span><span class="cx"> 
</span><span class="cx"> void WebGLRenderingContext::drawArraysInstanced(GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei primcount)
</span><span class="cx"> {
</span><del>-    if (!validateDrawArrays(&quot;drawArraysInstanced&quot;, mode, first, count, primcount))
-        return;
-
-    if (primcount &lt; 0) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;drawArraysInstanced&quot;, &quot;primcount &lt; 0&quot;);
-        return;
-    }
-
</del><span class="cx">     if (!primcount) {
</span><span class="cx">         markContextChanged();
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (!validateDrawArrays(&quot;drawArraysInstanced&quot;, mode, first, count, primcount))
+        return;
+
</ins><span class="cx">     clearIfComposited();
</span><span class="cx"> 
</span><span class="cx">     bool vertexAttrib0Simulated = false;
</span><span class="lines">@@ -6199,8 +6217,9 @@
</span><span class="cx">         vertexAttrib0Simulated = simulateVertexAttrib0(first + count - 1);
</span><span class="cx">     if (!isGLES2NPOTStrict())
</span><span class="cx">         checkTextureCompleteness(&quot;drawArraysInstanced&quot;, true);
</span><del>-    UNUSED_PARAM(primcount);
</del><ins>+
</ins><span class="cx">     m_context-&gt;drawArraysInstanced(mode, first, count, primcount);
</span><ins>+
</ins><span class="cx">     if (!isGLES2Compliant() &amp;&amp; vertexAttrib0Simulated)
</span><span class="cx">         restoreStatesAfterVertexAttrib0Simulation();
</span><span class="cx">     if (!isGLES2NPOTStrict())
</span><span class="lines">@@ -6210,20 +6229,15 @@
</span><span class="cx"> 
</span><span class="cx"> void WebGLRenderingContext::drawElementsInstanced(GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, GC3Dsizei primcount)
</span><span class="cx"> {
</span><del>-    unsigned numElements = 0;
-    if (!validateDrawElements(&quot;drawElementsInstanced&quot;, mode, count, type, offset, numElements))
-        return;
-
-    if (primcount &lt; 0) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;drawElementsInstanced&quot;, &quot;primcount &lt; 0&quot;);
-        return;
-    }
-
</del><span class="cx">     if (!primcount) {
</span><span class="cx">         markContextChanged();
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    unsigned numElements = 0;
+    if (!validateDrawElements(&quot;drawElementsInstanced&quot;, mode, count, type, offset, numElements, primcount))
+        return;
+
</ins><span class="cx">     clearIfComposited();
</span><span class="cx"> 
</span><span class="cx">     bool vertexAttrib0Simulated = false;
</span><span class="lines">@@ -6234,7 +6248,9 @@
</span><span class="cx">     }
</span><span class="cx">     if (!isGLES2NPOTStrict())
</span><span class="cx">         checkTextureCompleteness(&quot;drawElementsInstanced&quot;, true);
</span><ins>+
</ins><span class="cx">     m_context-&gt;drawElementsInstanced(mode, count, type, static_cast&lt;GC3Dintptr&gt;(offset), primcount);
</span><ins>+
</ins><span class="cx">     if (!isGLES2Compliant() &amp;&amp; vertexAttrib0Simulated)
</span><span class="cx">         restoreStatesAfterVertexAttrib0Simulation();
</span><span class="cx">     if (!isGLES2NPOTStrict())
</span></span></pre></div>
<a id="branchessafari6001415branchSourceWebCorehtmlcanvasWebGLRenderingContexth"></a>
<div class="modfile"><h4>Modified: branches/safari-600.1.4.15-branch/Source/WebCore/html/canvas/WebGLRenderingContext.h (179674 => 179675)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-600.1.4.15-branch/Source/WebCore/html/canvas/WebGLRenderingContext.h        2015-02-05 05:41:30 UTC (rev 179674)
+++ branches/safari-600.1.4.15-branch/Source/WebCore/html/canvas/WebGLRenderingContext.h        2015-02-05 06:18:25 UTC (rev 179675)
</span><span class="lines">@@ -388,7 +388,7 @@
</span><span class="cx">     bool validateWebGLObject(const char*, WebGLObject*);
</span><span class="cx"> 
</span><span class="cx">     bool validateDrawArrays(const char* functionName, GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei primcount);
</span><del>-    bool validateDrawElements(const char* functionName, GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, unsigned&amp; numElements);
</del><ins>+    bool validateDrawElements(const char* functionName, GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, unsigned&amp; numElements, GC3Dsizei primcount);
</ins><span class="cx"> 
</span><span class="cx">     // Adds a compressed texture format.
</span><span class="cx">     void addCompressedTextureFormat(GC3Denum);
</span></span></pre>
</div>
</div>

</body>
</html>