| Index: third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp | 
| diff --git a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp | 
| index a3da846049bfe5db49feaba7ced2aecc5124e88d..2e4d08e3517505ff324c0dfa3537013d9e1ef600 100644 | 
| --- a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp | 
| +++ b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp | 
| @@ -248,17 +248,18 @@ void WebGL2RenderingContextBase::initializeNewContext() { | 
| WebGLRenderingContextBase::initializeNewContext(); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::bufferData(GLenum target, | 
| -                                            DOMArrayBufferView* srcData, | 
| -                                            GLenum usage, | 
| -                                            GLuint srcOffset, | 
| -                                            GLuint length) { | 
| +void WebGL2RenderingContextBase::bufferData( | 
| +    GLenum target, | 
| +    const NotShared<DOMArrayBufferView>& srcData, | 
| +    GLenum usage, | 
| +    GLuint srcOffset, | 
| +    GLuint length) { | 
| if (isContextLost()) | 
| return; | 
| void* subBaseAddress = nullptr; | 
| long long subByteLength = 0; | 
| -  if (!validateSubSourceAndGetData(srcData, srcOffset, length, &subBaseAddress, | 
| -                                   &subByteLength)) { | 
| +  if (!validateSubSourceAndGetData(srcData.view(), srcOffset, length, | 
| +                                   &subBaseAddress, &subByteLength)) { | 
| synthesizeGLError(GL_INVALID_VALUE, "bufferData", | 
| "srcOffset + length too large"); | 
| return; | 
| @@ -278,23 +279,25 @@ void WebGL2RenderingContextBase::bufferData(GLenum target, | 
| WebGLRenderingContextBase::bufferData(target, data, usage); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::bufferData(GLenum target, | 
| -                                            DOMArrayBufferView* data, | 
| -                                            GLenum usage) { | 
| +void WebGL2RenderingContextBase::bufferData( | 
| +    GLenum target, | 
| +    const NotShared<DOMArrayBufferView>& data, | 
| +    GLenum usage) { | 
| WebGLRenderingContextBase::bufferData(target, data, usage); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::bufferSubData(GLenum target, | 
| -                                               GLintptr dstByteOffset, | 
| -                                               DOMArrayBufferView* srcData, | 
| -                                               GLuint srcOffset, | 
| -                                               GLuint length) { | 
| +void WebGL2RenderingContextBase::bufferSubData( | 
| +    GLenum target, | 
| +    GLintptr dstByteOffset, | 
| +    const NotShared<DOMArrayBufferView>& srcData, | 
| +    GLuint srcOffset, | 
| +    GLuint length) { | 
| if (isContextLost()) | 
| return; | 
| void* subBaseAddress = nullptr; | 
| long long subByteLength = 0; | 
| -  if (!validateSubSourceAndGetData(srcData, srcOffset, length, &subBaseAddress, | 
| -                                   &subByteLength)) { | 
| +  if (!validateSubSourceAndGetData(srcData.view(), srcOffset, length, | 
| +                                   &subBaseAddress, &subByteLength)) { | 
| synthesizeGLError(GL_INVALID_VALUE, "bufferSubData", | 
| "srcOffset + length too large"); | 
| return; | 
| @@ -365,16 +368,17 @@ void WebGL2RenderingContextBase::copyBufferSubData(GLenum readTarget, | 
| static_cast<GLintptr>(writeOffset), static_cast<GLsizeiptr>(size)); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::getBufferSubData(GLenum target, | 
| -                                                  long long srcByteOffset, | 
| -                                                  DOMArrayBufferView* dstData, | 
| -                                                  GLuint dstOffset, | 
| -                                                  GLuint length) { | 
| +void WebGL2RenderingContextBase::getBufferSubData( | 
| +    GLenum target, | 
| +    long long srcByteOffset, | 
| +    const NotShared<DOMArrayBufferView>& dstData, | 
| +    GLuint dstOffset, | 
| +    GLuint length) { | 
| WebGLBuffer* sourceBuffer = nullptr; | 
| void* destinationDataPtr = nullptr; | 
| long long destinationByteLength = 0; | 
| const char* message = validateGetBufferSubData( | 
| -      __FUNCTION__, target, srcByteOffset, dstData, dstOffset, length, | 
| +      __FUNCTION__, target, srcByteOffset, dstData.view(), dstOffset, length, | 
| &sourceBuffer, &destinationDataPtr, &destinationByteLength); | 
| if (message) { | 
| // If there was a GL error, it was already synthesized in | 
| @@ -765,13 +769,14 @@ void WebGL2RenderingContextBase::pixelStorei(GLenum pname, GLint param) { | 
| contextGL()->PixelStorei(pname, param); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::readPixels(GLint x, | 
| -                                            GLint y, | 
| -                                            GLsizei width, | 
| -                                            GLsizei height, | 
| -                                            GLenum format, | 
| -                                            GLenum type, | 
| -                                            DOMArrayBufferView* pixels) { | 
| +void WebGL2RenderingContextBase::readPixels( | 
| +    GLint x, | 
| +    GLint y, | 
| +    GLsizei width, | 
| +    GLsizei height, | 
| +    GLenum format, | 
| +    GLenum type, | 
| +    const NotShared<DOMArrayBufferView>& pixels) { | 
| if (isContextLost()) | 
| return; | 
| if (m_boundPixelPackBuffer.get()) { | 
| @@ -780,17 +785,18 @@ void WebGL2RenderingContextBase::readPixels(GLint x, | 
| return; | 
| } | 
|  | 
| -  readPixelsHelper(x, y, width, height, format, type, pixels, 0); | 
| +  readPixelsHelper(x, y, width, height, format, type, pixels.view(), 0); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::readPixels(GLint x, | 
| -                                            GLint y, | 
| -                                            GLsizei width, | 
| -                                            GLsizei height, | 
| -                                            GLenum format, | 
| -                                            GLenum type, | 
| -                                            DOMArrayBufferView* pixels, | 
| -                                            GLuint offset) { | 
| +void WebGL2RenderingContextBase::readPixels( | 
| +    GLint x, | 
| +    GLint y, | 
| +    GLsizei width, | 
| +    GLsizei height, | 
| +    GLenum format, | 
| +    GLenum type, | 
| +    const NotShared<DOMArrayBufferView>& pixels, | 
| +    GLuint offset) { | 
| if (isContextLost()) | 
| return; | 
| if (m_boundPixelPackBuffer.get()) { | 
| @@ -799,7 +805,7 @@ void WebGL2RenderingContextBase::readPixels(GLint x, | 
| return; | 
| } | 
|  | 
| -  readPixelsHelper(x, y, width, height, format, type, pixels, offset); | 
| +  readPixelsHelper(x, y, width, height, format, type, pixels.view(), offset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::readPixels(GLint x, | 
| @@ -1142,15 +1148,16 @@ void WebGL2RenderingContextBase::texSubImage2D(GLenum target, | 
| reinterpret_cast<const void*>(offset)); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::texImage2D(GLenum target, | 
| -                                            GLint level, | 
| -                                            GLint internalformat, | 
| -                                            GLsizei width, | 
| -                                            GLsizei height, | 
| -                                            GLint border, | 
| -                                            GLenum format, | 
| -                                            GLenum type, | 
| -                                            DOMArrayBufferView* data) { | 
| +void WebGL2RenderingContextBase::texImage2D( | 
| +    GLenum target, | 
| +    GLint level, | 
| +    GLint internalformat, | 
| +    GLsizei width, | 
| +    GLsizei height, | 
| +    GLint border, | 
| +    GLenum format, | 
| +    GLenum type, | 
| +    const NotShared<DOMArrayBufferView>& data) { | 
| if (isContextLost()) | 
| return; | 
| if (m_boundPixelUnpackBuffer) { | 
| @@ -1162,16 +1169,17 @@ void WebGL2RenderingContextBase::texImage2D(GLenum target, | 
| height, border, format, type, data); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::texImage2D(GLenum target, | 
| -                                            GLint level, | 
| -                                            GLint internalformat, | 
| -                                            GLsizei width, | 
| -                                            GLsizei height, | 
| -                                            GLint border, | 
| -                                            GLenum format, | 
| -                                            GLenum type, | 
| -                                            DOMArrayBufferView* data, | 
| -                                            GLuint srcOffset) { | 
| +void WebGL2RenderingContextBase::texImage2D( | 
| +    GLenum target, | 
| +    GLint level, | 
| +    GLint internalformat, | 
| +    GLsizei width, | 
| +    GLsizei height, | 
| +    GLint border, | 
| +    GLenum format, | 
| +    GLenum type, | 
| +    const NotShared<DOMArrayBufferView>& data, | 
| +    GLuint srcOffset) { | 
| if (isContextLost()) | 
| return; | 
| if (m_boundPixelUnpackBuffer) { | 
| @@ -1181,7 +1189,7 @@ void WebGL2RenderingContextBase::texImage2D(GLenum target, | 
| } | 
| texImageHelperDOMArrayBufferView(TexImage2D, target, level, internalformat, | 
| width, height, 1, border, format, type, 0, 0, | 
| -                                   0, data, NullNotReachable, srcOffset); | 
| +                                   0, data.view(), NullNotReachable, srcOffset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::texImage2D(GLenum target, | 
| @@ -1385,15 +1393,16 @@ void WebGL2RenderingContextBase::texImage2D(GLenum target, | 
| type, imageBitMap, exceptionState); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::texSubImage2D(GLenum target, | 
| -                                               GLint level, | 
| -                                               GLint xoffset, | 
| -                                               GLint yoffset, | 
| -                                               GLsizei width, | 
| -                                               GLsizei height, | 
| -                                               GLenum format, | 
| -                                               GLenum type, | 
| -                                               DOMArrayBufferView* pixels) { | 
| +void WebGL2RenderingContextBase::texSubImage2D( | 
| +    GLenum target, | 
| +    GLint level, | 
| +    GLint xoffset, | 
| +    GLint yoffset, | 
| +    GLsizei width, | 
| +    GLsizei height, | 
| +    GLenum format, | 
| +    GLenum type, | 
| +    const NotShared<DOMArrayBufferView>& pixels) { | 
| if (isContextLost()) | 
| return; | 
| if (m_boundPixelUnpackBuffer) { | 
| @@ -1405,16 +1414,17 @@ void WebGL2RenderingContextBase::texSubImage2D(GLenum target, | 
| width, height, format, type, pixels); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::texSubImage2D(GLenum target, | 
| -                                               GLint level, | 
| -                                               GLint xoffset, | 
| -                                               GLint yoffset, | 
| -                                               GLsizei width, | 
| -                                               GLsizei height, | 
| -                                               GLenum format, | 
| -                                               GLenum type, | 
| -                                               DOMArrayBufferView* pixels, | 
| -                                               GLuint srcOffset) { | 
| +void WebGL2RenderingContextBase::texSubImage2D( | 
| +    GLenum target, | 
| +    GLint level, | 
| +    GLint xoffset, | 
| +    GLint yoffset, | 
| +    GLsizei width, | 
| +    GLsizei height, | 
| +    GLenum format, | 
| +    GLenum type, | 
| +    const NotShared<DOMArrayBufferView>& pixels, | 
| +    GLuint srcOffset) { | 
| if (isContextLost()) | 
| return; | 
| if (m_boundPixelUnpackBuffer) { | 
| @@ -1422,9 +1432,9 @@ void WebGL2RenderingContextBase::texSubImage2D(GLenum target, | 
| "a buffer is bound to PIXEL_UNPACK_BUFFER"); | 
| return; | 
| } | 
| -  texImageHelperDOMArrayBufferView(TexSubImage2D, target, level, 0, width, | 
| -                                   height, 1, 0, format, type, xoffset, yoffset, | 
| -                                   0, pixels, NullNotReachable, srcOffset); | 
| +  texImageHelperDOMArrayBufferView( | 
| +      TexSubImage2D, target, level, 0, width, height, 1, 0, format, type, | 
| +      xoffset, yoffset, 0, pixels.view(), NullNotReachable, srcOffset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::texSubImage2D(GLenum target, | 
| @@ -1655,32 +1665,34 @@ void WebGL2RenderingContextBase::texStorage3D(GLenum target, | 
| depth); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::texImage3D(GLenum target, | 
| -                                            GLint level, | 
| -                                            GLint internalformat, | 
| -                                            GLsizei width, | 
| -                                            GLsizei height, | 
| -                                            GLsizei depth, | 
| -                                            GLint border, | 
| -                                            GLenum format, | 
| -                                            GLenum type, | 
| -                                            DOMArrayBufferView* pixels) { | 
| +void WebGL2RenderingContextBase::texImage3D( | 
| +    GLenum target, | 
| +    GLint level, | 
| +    GLint internalformat, | 
| +    GLsizei width, | 
| +    GLsizei height, | 
| +    GLsizei depth, | 
| +    GLint border, | 
| +    GLenum format, | 
| +    GLenum type, | 
| +    const NotShared<DOMArrayBufferView>& pixels) { | 
| texImageHelperDOMArrayBufferView(TexImage3D, target, level, internalformat, | 
| width, height, depth, border, format, type, | 
| -                                   0, 0, 0, pixels, NullAllowed, 0); | 
| +                                   0, 0, 0, pixels.view(), NullAllowed, 0); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::texImage3D(GLenum target, | 
| -                                            GLint level, | 
| -                                            GLint internalformat, | 
| -                                            GLsizei width, | 
| -                                            GLsizei height, | 
| -                                            GLsizei depth, | 
| -                                            GLint border, | 
| -                                            GLenum format, | 
| -                                            GLenum type, | 
| -                                            DOMArrayBufferView* pixels, | 
| -                                            GLuint srcOffset) { | 
| +void WebGL2RenderingContextBase::texImage3D( | 
| +    GLenum target, | 
| +    GLint level, | 
| +    GLint internalformat, | 
| +    GLsizei width, | 
| +    GLsizei height, | 
| +    GLsizei depth, | 
| +    GLint border, | 
| +    GLenum format, | 
| +    GLenum type, | 
| +    const NotShared<DOMArrayBufferView>& pixels, | 
| +    GLuint srcOffset) { | 
| if (isContextLost()) | 
| return; | 
| if (m_boundPixelUnpackBuffer) { | 
| @@ -1690,7 +1702,7 @@ void WebGL2RenderingContextBase::texImage3D(GLenum target, | 
| } | 
| texImageHelperDOMArrayBufferView( | 
| TexImage3D, target, level, internalformat, width, height, depth, border, | 
| -      format, type, 0, 0, 0, pixels, NullNotReachable, srcOffset); | 
| +      format, type, 0, 0, 0, pixels.view(), NullNotReachable, srcOffset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::texImage3D(GLenum target, | 
| @@ -1840,18 +1852,19 @@ void WebGL2RenderingContextBase::texImage3D(GLenum target, | 
| m_unpackImageHeight, exceptionState); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::texSubImage3D(GLenum target, | 
| -                                               GLint level, | 
| -                                               GLint xoffset, | 
| -                                               GLint yoffset, | 
| -                                               GLint zoffset, | 
| -                                               GLsizei width, | 
| -                                               GLsizei height, | 
| -                                               GLsizei depth, | 
| -                                               GLenum format, | 
| -                                               GLenum type, | 
| -                                               DOMArrayBufferView* pixels, | 
| -                                               GLuint srcOffset) { | 
| +void WebGL2RenderingContextBase::texSubImage3D( | 
| +    GLenum target, | 
| +    GLint level, | 
| +    GLint xoffset, | 
| +    GLint yoffset, | 
| +    GLint zoffset, | 
| +    GLsizei width, | 
| +    GLsizei height, | 
| +    GLsizei depth, | 
| +    GLenum format, | 
| +    GLenum type, | 
| +    const NotShared<DOMArrayBufferView>& pixels, | 
| +    GLuint srcOffset) { | 
| if (isContextLost()) | 
| return; | 
| if (m_boundPixelUnpackBuffer) { | 
| @@ -1861,7 +1874,7 @@ void WebGL2RenderingContextBase::texSubImage3D(GLenum target, | 
| } | 
| texImageHelperDOMArrayBufferView( | 
| TexSubImage3D, target, level, 0, width, height, depth, 0, format, type, | 
| -      xoffset, yoffset, zoffset, pixels, NullNotReachable, srcOffset); | 
| +      xoffset, yoffset, zoffset, pixels.view(), NullNotReachable, srcOffset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::texSubImage3D(GLenum target, | 
| @@ -2051,7 +2064,7 @@ void WebGL2RenderingContextBase::compressedTexImage2D( | 
| GLsizei width, | 
| GLsizei height, | 
| GLint border, | 
| -    DOMArrayBufferView* data) { | 
| +    const NotShared<DOMArrayBufferView>& data) { | 
| if (isContextLost()) | 
| return; | 
| if (m_boundPixelUnpackBuffer) { | 
| @@ -2070,7 +2083,7 @@ void WebGL2RenderingContextBase::compressedTexImage2D( | 
| GLsizei width, | 
| GLsizei height, | 
| GLint border, | 
| -    DOMArrayBufferView* data, | 
| +    const NotShared<DOMArrayBufferView>& data, | 
| GLuint srcOffset, | 
| GLuint srcLengthOverride) { | 
| if (isContextLost()) | 
| @@ -2084,21 +2097,21 @@ void WebGL2RenderingContextBase::compressedTexImage2D( | 
| return; | 
| if (!validateCompressedTexFormat("compressedTexImage2D", internalformat)) | 
| return; | 
| -  if (srcOffset > data->byteLength()) { | 
| +  if (srcOffset > data.view()->byteLength()) { | 
| synthesizeGLError(GL_INVALID_VALUE, "compressedTexImage2D", | 
| "srcOffset is out of range"); | 
| return; | 
| } | 
| if (srcLengthOverride == 0) { | 
| -    srcLengthOverride = data->byteLength() - srcOffset; | 
| -  } else if (srcLengthOverride > data->byteLength() - srcOffset) { | 
| +    srcLengthOverride = data.view()->byteLength() - srcOffset; | 
| +  } else if (srcLengthOverride > data.view()->byteLength() - srcOffset) { | 
| synthesizeGLError(GL_INVALID_VALUE, "compressedTexImage2D", | 
| "srcLengthOverride is out of range"); | 
| return; | 
| } | 
| contextGL()->CompressedTexImage2D( | 
| target, level, internalformat, width, height, border, srcLengthOverride, | 
| -      static_cast<uint8_t*>(data->baseAddress()) + srcOffset); | 
| +      static_cast<uint8_t*>(data.view()->baseAddress()) + srcOffset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::compressedTexImage2D(GLenum target, | 
| @@ -2129,7 +2142,7 @@ void WebGL2RenderingContextBase::compressedTexSubImage2D( | 
| GLsizei width, | 
| GLsizei height, | 
| GLenum format, | 
| -    DOMArrayBufferView* data) { | 
| +    const NotShared<DOMArrayBufferView>& data) { | 
| if (isContextLost()) | 
| return; | 
| if (m_boundPixelUnpackBuffer) { | 
| @@ -2149,7 +2162,7 @@ void WebGL2RenderingContextBase::compressedTexSubImage2D( | 
| GLsizei width, | 
| GLsizei height, | 
| GLenum format, | 
| -    DOMArrayBufferView* data, | 
| +    const NotShared<DOMArrayBufferView>& data, | 
| GLuint srcOffset, | 
| GLuint srcLengthOverride) { | 
| if (isContextLost()) | 
| @@ -2163,21 +2176,21 @@ void WebGL2RenderingContextBase::compressedTexSubImage2D( | 
| return; | 
| if (!validateCompressedTexFormat("compressedTexSubImage2D", format)) | 
| return; | 
| -  if (srcOffset > data->byteLength()) { | 
| +  if (srcOffset > data.view()->byteLength()) { | 
| synthesizeGLError(GL_INVALID_VALUE, "compressedTexSubImage2D", | 
| "srcOffset is out of range"); | 
| return; | 
| } | 
| if (srcLengthOverride == 0) { | 
| -    srcLengthOverride = data->byteLength() - srcOffset; | 
| -  } else if (srcLengthOverride > data->byteLength() - srcOffset) { | 
| +    srcLengthOverride = data.view()->byteLength() - srcOffset; | 
| +  } else if (srcLengthOverride > data.view()->byteLength() - srcOffset) { | 
| synthesizeGLError(GL_INVALID_VALUE, "compressedTexImage2D", | 
| "srcLengthOverride is out of range"); | 
| return; | 
| } | 
| contextGL()->CompressedTexSubImage2D( | 
| target, level, xoffset, yoffset, width, height, format, srcLengthOverride, | 
| -      static_cast<uint8_t*>(data->baseAddress()) + srcOffset); | 
| +      static_cast<uint8_t*>(data.view()->baseAddress()) + srcOffset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::compressedTexSubImage2D(GLenum target, | 
| @@ -2209,7 +2222,7 @@ void WebGL2RenderingContextBase::compressedTexImage3D( | 
| GLsizei height, | 
| GLsizei depth, | 
| GLint border, | 
| -    DOMArrayBufferView* data, | 
| +    const NotShared<DOMArrayBufferView>& data, | 
| GLuint srcOffset, | 
| GLuint srcLengthOverride) { | 
| if (isContextLost()) | 
| @@ -2223,14 +2236,14 @@ void WebGL2RenderingContextBase::compressedTexImage3D( | 
| return; | 
| if (!validateCompressedTexFormat("compressedTexImage3D", internalformat)) | 
| return; | 
| -  if (srcOffset > data->byteLength()) { | 
| +  if (srcOffset > data.view()->byteLength()) { | 
| synthesizeGLError(GL_INVALID_VALUE, "compressedTexImage3D", | 
| "srcOffset is out of range"); | 
| return; | 
| } | 
| if (srcLengthOverride == 0) { | 
| -    srcLengthOverride = data->byteLength() - srcOffset; | 
| -  } else if (srcLengthOverride > data->byteLength() - srcOffset) { | 
| +    srcLengthOverride = data.view()->byteLength() - srcOffset; | 
| +  } else if (srcLengthOverride > data.view()->byteLength() - srcOffset) { | 
| synthesizeGLError(GL_INVALID_VALUE, "compressedTexImage3D", | 
| "srcLengthOverride is out of range"); | 
| return; | 
| @@ -2238,7 +2251,7 @@ void WebGL2RenderingContextBase::compressedTexImage3D( | 
| contextGL()->CompressedTexImage3D( | 
| target, level, internalformat, width, height, depth, border, | 
| srcLengthOverride, | 
| -      static_cast<uint8_t*>(data->baseAddress()) + srcOffset); | 
| +      static_cast<uint8_t*>(data.view()->baseAddress()) + srcOffset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::compressedTexImage3D(GLenum target, | 
| @@ -2272,7 +2285,7 @@ void WebGL2RenderingContextBase::compressedTexSubImage3D( | 
| GLsizei height, | 
| GLsizei depth, | 
| GLenum format, | 
| -    DOMArrayBufferView* data, | 
| +    const NotShared<DOMArrayBufferView>& data, | 
| GLuint srcOffset, | 
| GLuint srcLengthOverride) { | 
| if (isContextLost()) | 
| @@ -2286,14 +2299,14 @@ void WebGL2RenderingContextBase::compressedTexSubImage3D( | 
| return; | 
| if (!validateCompressedTexFormat("compressedTexSubImage3D", format)) | 
| return; | 
| -  if (srcOffset > data->byteLength()) { | 
| +  if (srcOffset > data.view()->byteLength()) { | 
| synthesizeGLError(GL_INVALID_VALUE, "compressedTexSubImage3D", | 
| "srcOffset is out of range"); | 
| return; | 
| } | 
| if (srcLengthOverride == 0) { | 
| -    srcLengthOverride = data->byteLength() - srcOffset; | 
| -  } else if (srcLengthOverride > data->byteLength() - srcOffset) { | 
| +    srcLengthOverride = data.view()->byteLength() - srcOffset; | 
| +  } else if (srcLengthOverride > data.view()->byteLength() - srcOffset) { | 
| synthesizeGLError(GL_INVALID_VALUE, "compressedTexSubImage3D", | 
| "srcLengthOverride is out of range"); | 
| return; | 
| @@ -2301,7 +2314,7 @@ void WebGL2RenderingContextBase::compressedTexSubImage3D( | 
| contextGL()->CompressedTexSubImage3D( | 
| target, level, xoffset, yoffset, zoffset, width, height, depth, format, | 
| srcLengthOverride, | 
| -      static_cast<uint8_t*>(data->baseAddress()) + srcOffset); | 
| +      static_cast<uint8_t*>(data.view()->baseAddress()) + srcOffset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::compressedTexSubImage3D(GLenum target, | 
| @@ -2777,17 +2790,17 @@ void WebGL2RenderingContextBase::uniform4uiv( | 
| void WebGL2RenderingContextBase::uniformMatrix2fv( | 
| const WebGLUniformLocation* location, | 
| GLboolean transpose, | 
| -    DOMFloat32Array* v, | 
| +    const NotShared<DOMFloat32Array>& v, | 
| GLuint srcOffset, | 
| GLuint srcLength) { | 
| if (isContextLost() || | 
| !validateUniformMatrixParameters("uniformMatrix2fv", location, transpose, | 
| -                                       v, 4, srcOffset, srcLength)) | 
| +                                       v.view(), 4, srcOffset, srcLength)) | 
| return; | 
| contextGL()->UniformMatrix2fv( | 
| location->location(), | 
| -      (srcLength ? srcLength : (v->length() - srcOffset)) >> 2, transpose, | 
| -      v->data() + srcOffset); | 
| +      (srcLength ? srcLength : (v.view()->length() - srcOffset)) >> 2, | 
| +      transpose, v.view()->data() + srcOffset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::uniformMatrix2fv( | 
| @@ -2810,17 +2823,17 @@ void WebGL2RenderingContextBase::uniformMatrix2fv( | 
| void WebGL2RenderingContextBase::uniformMatrix3fv( | 
| const WebGLUniformLocation* location, | 
| GLboolean transpose, | 
| -    DOMFloat32Array* v, | 
| +    const NotShared<DOMFloat32Array>& v, | 
| GLuint srcOffset, | 
| GLuint srcLength) { | 
| if (isContextLost() || | 
| !validateUniformMatrixParameters("uniformMatrix3fv", location, transpose, | 
| -                                       v, 9, srcOffset, srcLength)) | 
| +                                       v.view(), 9, srcOffset, srcLength)) | 
| return; | 
| contextGL()->UniformMatrix3fv( | 
| location->location(), | 
| -      (srcLength ? srcLength : (v->length() - srcOffset)) / 9, transpose, | 
| -      v->data() + srcOffset); | 
| +      (srcLength ? srcLength : (v.view()->length() - srcOffset)) / 9, transpose, | 
| +      v.view()->data() + srcOffset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::uniformMatrix3fv( | 
| @@ -2843,17 +2856,17 @@ void WebGL2RenderingContextBase::uniformMatrix3fv( | 
| void WebGL2RenderingContextBase::uniformMatrix4fv( | 
| const WebGLUniformLocation* location, | 
| GLboolean transpose, | 
| -    DOMFloat32Array* v, | 
| +    const NotShared<DOMFloat32Array>& v, | 
| GLuint srcOffset, | 
| GLuint srcLength) { | 
| if (isContextLost() || | 
| !validateUniformMatrixParameters("uniformMatrix4fv", location, transpose, | 
| -                                       v, 16, srcOffset, srcLength)) | 
| +                                       v.view(), 16, srcOffset, srcLength)) | 
| return; | 
| contextGL()->UniformMatrix4fv( | 
| location->location(), | 
| -      (srcLength ? srcLength : (v->length() - srcOffset)) >> 4, transpose, | 
| -      v->data() + srcOffset); | 
| +      (srcLength ? srcLength : (v.view()->length() - srcOffset)) >> 4, | 
| +      transpose, v.view()->data() + srcOffset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::uniformMatrix4fv( | 
| @@ -2876,18 +2889,17 @@ void WebGL2RenderingContextBase::uniformMatrix4fv( | 
| void WebGL2RenderingContextBase::uniformMatrix2x3fv( | 
| const WebGLUniformLocation* location, | 
| GLboolean transpose, | 
| -    DOMFloat32Array* value, | 
| +    const NotShared<DOMFloat32Array>& value, | 
| GLuint srcOffset, | 
| GLuint srcLength) { | 
| -  if (isContextLost() || | 
| -      !validateUniformMatrixParameters("uniformMatrix2x3fv", location, | 
| -                                       transpose, value, 6, srcOffset, | 
| -                                       srcLength)) | 
| +  if (isContextLost() || !validateUniformMatrixParameters( | 
| +                             "uniformMatrix2x3fv", location, transpose, | 
| +                             value.view(), 6, srcOffset, srcLength)) | 
| return; | 
| contextGL()->UniformMatrix2x3fv( | 
| location->location(), | 
| -      (srcLength ? srcLength : (value->length() - srcOffset)) / 6, transpose, | 
| -      value->data() + srcOffset); | 
| +      (srcLength ? srcLength : (value.view()->length() - srcOffset)) / 6, | 
| +      transpose, value.view()->data() + srcOffset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::uniformMatrix2x3fv( | 
| @@ -2910,18 +2922,17 @@ void WebGL2RenderingContextBase::uniformMatrix2x3fv( | 
| void WebGL2RenderingContextBase::uniformMatrix3x2fv( | 
| const WebGLUniformLocation* location, | 
| GLboolean transpose, | 
| -    DOMFloat32Array* value, | 
| +    const NotShared<DOMFloat32Array>& value, | 
| GLuint srcOffset, | 
| GLuint srcLength) { | 
| -  if (isContextLost() || | 
| -      !validateUniformMatrixParameters("uniformMatrix3x2fv", location, | 
| -                                       transpose, value, 6, srcOffset, | 
| -                                       srcLength)) | 
| +  if (isContextLost() || !validateUniformMatrixParameters( | 
| +                             "uniformMatrix3x2fv", location, transpose, | 
| +                             value.view(), 6, srcOffset, srcLength)) | 
| return; | 
| contextGL()->UniformMatrix3x2fv( | 
| location->location(), | 
| -      (srcLength ? srcLength : (value->length() - srcOffset)) / 6, transpose, | 
| -      value->data() + srcOffset); | 
| +      (srcLength ? srcLength : (value.view()->length() - srcOffset)) / 6, | 
| +      transpose, value.view()->data() + srcOffset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::uniformMatrix3x2fv( | 
| @@ -2944,18 +2955,17 @@ void WebGL2RenderingContextBase::uniformMatrix3x2fv( | 
| void WebGL2RenderingContextBase::uniformMatrix2x4fv( | 
| const WebGLUniformLocation* location, | 
| GLboolean transpose, | 
| -    DOMFloat32Array* value, | 
| +    const NotShared<DOMFloat32Array>& value, | 
| GLuint srcOffset, | 
| GLuint srcLength) { | 
| -  if (isContextLost() || | 
| -      !validateUniformMatrixParameters("uniformMatrix2x4fv", location, | 
| -                                       transpose, value, 8, srcOffset, | 
| -                                       srcLength)) | 
| +  if (isContextLost() || !validateUniformMatrixParameters( | 
| +                             "uniformMatrix2x4fv", location, transpose, | 
| +                             value.view(), 8, srcOffset, srcLength)) | 
| return; | 
| contextGL()->UniformMatrix2x4fv( | 
| location->location(), | 
| -      (srcLength ? srcLength : (value->length() - srcOffset)) >> 3, transpose, | 
| -      value->data() + srcOffset); | 
| +      (srcLength ? srcLength : (value.view()->length() - srcOffset)) >> 3, | 
| +      transpose, value.view()->data() + srcOffset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::uniformMatrix2x4fv( | 
| @@ -2978,18 +2988,17 @@ void WebGL2RenderingContextBase::uniformMatrix2x4fv( | 
| void WebGL2RenderingContextBase::uniformMatrix4x2fv( | 
| const WebGLUniformLocation* location, | 
| GLboolean transpose, | 
| -    DOMFloat32Array* value, | 
| +    const NotShared<DOMFloat32Array>& value, | 
| GLuint srcOffset, | 
| GLuint srcLength) { | 
| -  if (isContextLost() || | 
| -      !validateUniformMatrixParameters("uniformMatrix4x2fv", location, | 
| -                                       transpose, value, 8, srcOffset, | 
| -                                       srcLength)) | 
| +  if (isContextLost() || !validateUniformMatrixParameters( | 
| +                             "uniformMatrix4x2fv", location, transpose, | 
| +                             value.view(), 8, srcOffset, srcLength)) | 
| return; | 
| contextGL()->UniformMatrix4x2fv( | 
| location->location(), | 
| -      (srcLength ? srcLength : (value->length() - srcOffset)) >> 3, transpose, | 
| -      value->data() + srcOffset); | 
| +      (srcLength ? srcLength : (value.view()->length() - srcOffset)) >> 3, | 
| +      transpose, value.view()->data() + srcOffset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::uniformMatrix4x2fv( | 
| @@ -3012,18 +3021,17 @@ void WebGL2RenderingContextBase::uniformMatrix4x2fv( | 
| void WebGL2RenderingContextBase::uniformMatrix3x4fv( | 
| const WebGLUniformLocation* location, | 
| GLboolean transpose, | 
| -    DOMFloat32Array* value, | 
| +    const NotShared<DOMFloat32Array>& value, | 
| GLuint srcOffset, | 
| GLuint srcLength) { | 
| -  if (isContextLost() || | 
| -      !validateUniformMatrixParameters("uniformMatrix3x4fv", location, | 
| -                                       transpose, value, 12, srcOffset, | 
| -                                       srcLength)) | 
| +  if (isContextLost() || !validateUniformMatrixParameters( | 
| +                             "uniformMatrix3x4fv", location, transpose, | 
| +                             value.view(), 12, srcOffset, srcLength)) | 
| return; | 
| contextGL()->UniformMatrix3x4fv( | 
| location->location(), | 
| -      (srcLength ? srcLength : (value->length() - srcOffset)) / 12, transpose, | 
| -      value->data() + srcOffset); | 
| +      (srcLength ? srcLength : (value.view()->length() - srcOffset)) / 12, | 
| +      transpose, value.view()->data() + srcOffset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::uniformMatrix3x4fv( | 
| @@ -3046,18 +3054,17 @@ void WebGL2RenderingContextBase::uniformMatrix3x4fv( | 
| void WebGL2RenderingContextBase::uniformMatrix4x3fv( | 
| const WebGLUniformLocation* location, | 
| GLboolean transpose, | 
| -    DOMFloat32Array* value, | 
| +    const NotShared<DOMFloat32Array>& value, | 
| GLuint srcOffset, | 
| GLuint srcLength) { | 
| -  if (isContextLost() || | 
| -      !validateUniformMatrixParameters("uniformMatrix4x3fv", location, | 
| -                                       transpose, value, 12, srcOffset, | 
| -                                       srcLength)) | 
| +  if (isContextLost() || !validateUniformMatrixParameters( | 
| +                             "uniformMatrix4x3fv", location, transpose, | 
| +                             value.view(), 12, srcOffset, srcLength)) | 
| return; | 
| contextGL()->UniformMatrix4x3fv( | 
| location->location(), | 
| -      (srcLength ? srcLength : (value->length() - srcOffset)) / 12, transpose, | 
| -      value->data() + srcOffset); | 
| +      (srcLength ? srcLength : (value.view()->length() - srcOffset)) / 12, | 
| +      transpose, value.view()->data() + srcOffset); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::uniformMatrix4x3fv( | 
| @@ -3176,7 +3183,7 @@ void WebGL2RenderingContextBase::uniform4iv( | 
| void WebGL2RenderingContextBase::uniformMatrix2fv( | 
| const WebGLUniformLocation* location, | 
| GLboolean transpose, | 
| -    DOMFloat32Array* v) { | 
| +    const NotShared<DOMFloat32Array>& v) { | 
| WebGLRenderingContextBase::uniformMatrix2fv(location, transpose, v); | 
| } | 
|  | 
| @@ -3190,7 +3197,7 @@ void WebGL2RenderingContextBase::uniformMatrix2fv( | 
| void WebGL2RenderingContextBase::uniformMatrix3fv( | 
| const WebGLUniformLocation* location, | 
| GLboolean transpose, | 
| -    DOMFloat32Array* v) { | 
| +    const NotShared<DOMFloat32Array>& v) { | 
| WebGLRenderingContextBase::uniformMatrix3fv(location, transpose, v); | 
| } | 
|  | 
| @@ -3204,7 +3211,7 @@ void WebGL2RenderingContextBase::uniformMatrix3fv( | 
| void WebGL2RenderingContextBase::uniformMatrix4fv( | 
| const WebGLUniformLocation* location, | 
| GLboolean transpose, | 
| -    DOMFloat32Array* v) { | 
| +    const NotShared<DOMFloat32Array>& v) { | 
| WebGLRenderingContextBase::uniformMatrix4fv(location, transpose, v); | 
| } | 
|  | 
| @@ -3226,15 +3233,16 @@ void WebGL2RenderingContextBase::vertexAttribI4i(GLuint index, | 
| setVertexAttribType(index, Int32ArrayType); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::vertexAttribI4iv(GLuint index, | 
| -                                                  const DOMInt32Array* v) { | 
| +void WebGL2RenderingContextBase::vertexAttribI4iv( | 
| +    GLuint index, | 
| +    const NotShared<const DOMInt32Array>& v) { | 
| if (isContextLost()) | 
| return; | 
| -  if (!v || v->length() < 4) { | 
| +  if (!v.view() || v.view()->length() < 4) { | 
| synthesizeGLError(GL_INVALID_VALUE, "vertexAttribI4iv", "invalid array"); | 
| return; | 
| } | 
| -  contextGL()->VertexAttribI4iv(index, v->data()); | 
| +  contextGL()->VertexAttribI4iv(index, v.view()->data()); | 
| setVertexAttribType(index, Int32ArrayType); | 
| } | 
|  | 
| @@ -3261,15 +3269,16 @@ void WebGL2RenderingContextBase::vertexAttribI4ui(GLuint index, | 
| setVertexAttribType(index, Uint32ArrayType); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::vertexAttribI4uiv(GLuint index, | 
| -                                                   const DOMUint32Array* v) { | 
| +void WebGL2RenderingContextBase::vertexAttribI4uiv( | 
| +    GLuint index, | 
| +    const NotShared<const DOMUint32Array>& v) { | 
| if (isContextLost()) | 
| return; | 
| -  if (!v || v->length() < 4) { | 
| +  if (!v.view() || v.view()->length() < 4) { | 
| synthesizeGLError(GL_INVALID_VALUE, "vertexAttribI4uiv", "invalid array"); | 
| return; | 
| } | 
| -  contextGL()->VertexAttribI4uiv(index, v->data()); | 
| +  contextGL()->VertexAttribI4uiv(index, v.view()->data()); | 
| setVertexAttribType(index, Uint32ArrayType); | 
| } | 
|  | 
| @@ -3482,14 +3491,15 @@ WebGLTexture* WebGL2RenderingContextBase::validateTexImageBinding( | 
| return validateTexture2DBinding(funcName, target); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::clearBufferiv(GLenum buffer, | 
| -                                               GLint drawbuffer, | 
| -                                               DOMInt32Array* value) { | 
| +void WebGL2RenderingContextBase::clearBufferiv( | 
| +    GLenum buffer, | 
| +    GLint drawbuffer, | 
| +    const NotShared<DOMInt32Array>& value) { | 
| if (isContextLost() || | 
| -      !validateClearBuffer("clearBufferiv", buffer, value->length())) | 
| +      !validateClearBuffer("clearBufferiv", buffer, value.view()->length())) | 
| return; | 
|  | 
| -  contextGL()->ClearBufferiv(buffer, drawbuffer, value->data()); | 
| +  contextGL()->ClearBufferiv(buffer, drawbuffer, value.view()->data()); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::clearBufferiv(GLenum buffer, | 
| @@ -3502,14 +3512,15 @@ void WebGL2RenderingContextBase::clearBufferiv(GLenum buffer, | 
| contextGL()->ClearBufferiv(buffer, drawbuffer, value.data()); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::clearBufferuiv(GLenum buffer, | 
| -                                                GLint drawbuffer, | 
| -                                                DOMUint32Array* value) { | 
| +void WebGL2RenderingContextBase::clearBufferuiv( | 
| +    GLenum buffer, | 
| +    GLint drawbuffer, | 
| +    const NotShared<DOMUint32Array>& value) { | 
| if (isContextLost() || | 
| -      !validateClearBuffer("clearBufferuiv", buffer, value->length())) | 
| +      !validateClearBuffer("clearBufferuiv", buffer, value.view()->length())) | 
| return; | 
|  | 
| -  contextGL()->ClearBufferuiv(buffer, drawbuffer, value->data()); | 
| +  contextGL()->ClearBufferuiv(buffer, drawbuffer, value.view()->data()); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::clearBufferuiv(GLenum buffer, | 
| @@ -3522,14 +3533,15 @@ void WebGL2RenderingContextBase::clearBufferuiv(GLenum buffer, | 
| contextGL()->ClearBufferuiv(buffer, drawbuffer, value.data()); | 
| } | 
|  | 
| -void WebGL2RenderingContextBase::clearBufferfv(GLenum buffer, | 
| -                                               GLint drawbuffer, | 
| -                                               DOMFloat32Array* value) { | 
| +void WebGL2RenderingContextBase::clearBufferfv( | 
| +    GLenum buffer, | 
| +    GLint drawbuffer, | 
| +    const NotShared<DOMFloat32Array>& value) { | 
| if (isContextLost() || | 
| -      !validateClearBuffer("clearBufferfv", buffer, value->length())) | 
| +      !validateClearBuffer("clearBufferfv", buffer, value.view()->length())) | 
| return; | 
|  | 
| -  contextGL()->ClearBufferfv(buffer, drawbuffer, value->data()); | 
| +  contextGL()->ClearBufferfv(buffer, drawbuffer, value.view()->data()); | 
| } | 
|  | 
| void WebGL2RenderingContextBase::clearBufferfv(GLenum buffer, | 
|  |