<!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>[178390] trunk/Source/WebCore</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/178390">178390</a></dd>
<dt>Author</dt> <dd>roger_fong@apple.com</dd>
<dt>Date</dt> <dd>2015-01-13 16:33:09 -0800 (Tue, 13 Jan 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>WebGL2: Support webgl2 context creation.
https://bugs.webkit.org/show_bug.cgi?id=126408
&lt;rdar://problem/15002170&gt;
Reviewed by Dean Jackson.
Tests covered by existing Khronos tests for WebGL 1.0 conformance.
Create a WebGLRenderingContextBase class that extends to a WebGL1RenderingContext and WebGL2RenderingContext.
Replace all previous instances of WebGLRenderingContext usages with WebGLRenderingContextBase usages for now.
As the first step, the WebGL1 and WebGL2 contexts will have the exact same functionality.
* CMakeLists.txt:
* DerivedSources.make:
* WebCore.xcodeproj/project.pbxproj:
* bindings/js/JSCanvasRenderingContextCustom.cpp:
(WebCore::toJS):
* bindings/js/JSDocumentCustom.cpp:
* bindings/js/JSHTMLCanvasElementCustom.cpp:
* bindings/js/JSWebGL1RenderingContextCustom.cpp: Copied from Source/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp.
* bindings/js/JSWebGL2RenderingContextCustom.cpp: Added.
(WebCore::JSWebGL2RenderingContext::visitAdditionalChildren):
* bindings/js/JSWebGLRenderingContextBaseCustom.cpp: Added.
* bindings/js/JSWebGLRenderingContextCustom.cpp: Removed.
* bindings/scripts/CodeGeneratorJS.pm:
(GenerateImplementation):
* html/HTMLCanvasElement.cpp:
(WebCore::HTMLCanvasElement::getContext):
(WebCore::HTMLCanvasElement::is3dType):
(WebCore::HTMLCanvasElement::reset):
(WebCore::HTMLCanvasElement::paint):
(WebCore::HTMLCanvasElement::getImageData):
* html/canvas/ANGLEInstancedArrays.cpp:
(WebCore::ANGLEInstancedArrays::ANGLEInstancedArrays):
(WebCore::ANGLEInstancedArrays::supported):
* html/canvas/ANGLEInstancedArrays.h:
* html/canvas/CanvasRenderingContext.h:
(WebCore::CanvasRenderingContext::type):
* html/canvas/CanvasRenderingContext2D.cpp:
(WebCore::CanvasRenderingContext2D::CanvasRenderingContext2D):
* html/canvas/EXTBlendMinMax.cpp:
(WebCore::EXTBlendMinMax::EXTBlendMinMax):
* html/canvas/EXTBlendMinMax.h:
* html/canvas/EXTFragDepth.cpp:
(WebCore::EXTFragDepth::EXTFragDepth):
* html/canvas/EXTFragDepth.h:
* html/canvas/EXTShaderTextureLOD.cpp:
(WebCore::EXTShaderTextureLOD::EXTShaderTextureLOD):
* html/canvas/EXTShaderTextureLOD.h:
* html/canvas/EXTTextureFilterAnisotropic.cpp:
(WebCore::EXTTextureFilterAnisotropic::EXTTextureFilterAnisotropic):
* html/canvas/EXTTextureFilterAnisotropic.h:
* html/canvas/EXTsRGB.cpp:
(WebCore::EXTsRGB::EXTsRGB):
* html/canvas/EXTsRGB.h:
* html/canvas/OESElementIndexUint.cpp:
(WebCore::OESElementIndexUint::OESElementIndexUint):
* html/canvas/OESElementIndexUint.h:
* html/canvas/OESStandardDerivatives.cpp:
(WebCore::OESStandardDerivatives::OESStandardDerivatives):
* html/canvas/OESStandardDerivatives.h:
* html/canvas/OESTextureFloat.cpp:
(WebCore::OESTextureFloat::OESTextureFloat):
* html/canvas/OESTextureFloat.h:
* html/canvas/OESTextureFloatLinear.cpp:
(WebCore::OESTextureFloatLinear::OESTextureFloatLinear):
* html/canvas/OESTextureFloatLinear.h:
* html/canvas/OESTextureHalfFloat.cpp:
(WebCore::OESTextureHalfFloat::OESTextureHalfFloat):
* html/canvas/OESTextureHalfFloat.h:
* html/canvas/OESTextureHalfFloatLinear.cpp:
(WebCore::OESTextureHalfFloatLinear::OESTextureHalfFloatLinear):
* html/canvas/OESTextureHalfFloatLinear.h:
* html/canvas/OESVertexArrayObject.cpp:
(WebCore::OESVertexArrayObject::OESVertexArrayObject):
* html/canvas/OESVertexArrayObject.h:
* html/canvas/WebGL1RenderingContext.cpp: Copied from Source/WebCore/html/canvas/WebGLRenderingContext.cpp.
* html/canvas/WebGL1RenderingContext.h: Copied from Source/WebCore/html/canvas/WebGLRenderingContext.h.
* html/canvas/WebGL1RenderingContext.idl: Copied from Source/WebCore/html/canvas/WebGLRenderingContext.idl.
* html/canvas/WebGL2RenderingContext.cpp: Added.
(WebCore::WebGL2RenderingContext::WebGL2RenderingContext):
* html/canvas/WebGL2RenderingContext.h: Added.
* html/canvas/WebGL2RenderingContext.idl: Added.
* html/canvas/WebGLBuffer.cpp:
(WebCore::WebGLBuffer::create):
(WebCore::WebGLBuffer::WebGLBuffer):
* html/canvas/WebGLBuffer.h:
* html/canvas/WebGLCompressedTextureATC.cpp:
(WebCore::WebGLCompressedTextureATC::WebGLCompressedTextureATC):
(WebCore::WebGLCompressedTextureATC::supported):
* html/canvas/WebGLCompressedTextureATC.h:
* html/canvas/WebGLCompressedTexturePVRTC.cpp:
(WebCore::WebGLCompressedTexturePVRTC::WebGLCompressedTexturePVRTC):
(WebCore::WebGLCompressedTexturePVRTC::supported):
* html/canvas/WebGLCompressedTexturePVRTC.h:
* html/canvas/WebGLCompressedTextureS3TC.cpp:
(WebCore::WebGLCompressedTextureS3TC::WebGLCompressedTextureS3TC):
(WebCore::WebGLCompressedTextureS3TC::supported):
* html/canvas/WebGLCompressedTextureS3TC.h:
* html/canvas/WebGLContextGroup.cpp:
(WebCore::WebGLContextGroup::getAGraphicsContext3D):
(WebCore::WebGLContextGroup::addContext):
(WebCore::WebGLContextGroup::removeContext):
(WebCore::WebGLContextGroup::loseContextGroup):
* html/canvas/WebGLContextGroup.h:
* html/canvas/WebGLContextObject.cpp:
(WebCore::WebGLContextObject::WebGLContextObject):
* html/canvas/WebGLContextObject.h:
(WebCore::WebGLContextObject::context):
* html/canvas/WebGLDebugRendererInfo.cpp:
(WebCore::WebGLDebugRendererInfo::WebGLDebugRendererInfo):
* html/canvas/WebGLDebugRendererInfo.h:
* html/canvas/WebGLDebugShaders.cpp:
(WebCore::WebGLDebugShaders::WebGLDebugShaders):
* html/canvas/WebGLDebugShaders.h:
* html/canvas/WebGLDepthTexture.cpp:
(WebCore::WebGLDepthTexture::WebGLDepthTexture):
* html/canvas/WebGLDepthTexture.h:
* html/canvas/WebGLDrawBuffers.cpp:
(WebCore::WebGLDrawBuffers::WebGLDrawBuffers):
(WebCore::WebGLDrawBuffers::supported):
(WebCore::WebGLDrawBuffers::satisfiesWebGLRequirements):
* html/canvas/WebGLDrawBuffers.h:
* html/canvas/WebGLExtension.cpp:
(WebCore::WebGLExtension::WebGLExtension):
* html/canvas/WebGLExtension.h:
(WebCore::WebGLExtension::context):
* html/canvas/WebGLFramebuffer.cpp:
(WebCore::WebGLFramebuffer::create):
(WebCore::WebGLFramebuffer::WebGLFramebuffer):
* html/canvas/WebGLFramebuffer.h:
* html/canvas/WebGLLoseContext.cpp:
(WebCore::WebGLLoseContext::WebGLLoseContext):
(WebCore::WebGLLoseContext::loseContext):
* html/canvas/WebGLLoseContext.h:
* html/canvas/WebGLObject.cpp:
(WebCore::WebGLObject::WebGLObject):
* html/canvas/WebGLObject.h:
* html/canvas/WebGLProgram.cpp:
(WebCore::WebGLProgram::create):
(WebCore::WebGLProgram::WebGLProgram):
* html/canvas/WebGLProgram.h:
* html/canvas/WebGLRenderbuffer.cpp:
(WebCore::WebGLRenderbuffer::create):
(WebCore::WebGLRenderbuffer::WebGLRenderbuffer):
* html/canvas/WebGLRenderbuffer.h:
* html/canvas/WebGLRenderingContext.cpp: Removed.
* html/canvas/WebGLRenderingContext.h: Removed.
* html/canvas/WebGLRenderingContext.idl: Removed.
* html/canvas/WebGLRenderingContextBase.cpp: Added.
* html/canvas/WebGLRenderingContextBase.h: Added.
* html/canvas/WebGLRenderingContextBase.idl: Added.
* html/canvas/WebGLShader.cpp:
(WebCore::WebGLShader::create):
(WebCore::WebGLShader::WebGLShader):
* html/canvas/WebGLShader.h:
* html/canvas/WebGLSharedObject.cpp:
(WebCore::WebGLSharedObject::WebGLSharedObject):
* html/canvas/WebGLSharedObject.h:
* html/canvas/WebGLTexture.cpp:
(WebCore::WebGLTexture::create):
(WebCore::WebGLTexture::WebGLTexture):
* html/canvas/WebGLTexture.h:
* html/canvas/WebGLVertexArrayObjectOES.cpp:
(WebCore::WebGLVertexArrayObjectOES::create):
(WebCore::WebGLVertexArrayObjectOES::WebGLVertexArrayObjectOES):
* html/canvas/WebGLVertexArrayObjectOES.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreDerivedSourcesmake">trunk/Source/WebCore/DerivedSources.make</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSCanvasRenderingContextCustomcpp">trunk/Source/WebCore/bindings/js/JSCanvasRenderingContextCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDocumentCustomcpp">trunk/Source/WebCore/bindings/js/JSDocumentCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSHTMLCanvasElementCustomcpp">trunk/Source/WebCore/bindings/js/JSHTMLCanvasElementCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm">trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLCanvasElementcpp">trunk/Source/WebCore/html/HTMLCanvasElement.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasANGLEInstancedArrayscpp">trunk/Source/WebCore/html/canvas/ANGLEInstancedArrays.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasANGLEInstancedArraysh">trunk/Source/WebCore/html/canvas/ANGLEInstancedArrays.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasCanvasRenderingContexth">trunk/Source/WebCore/html/canvas/CanvasRenderingContext.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasCanvasRenderingContext2Dcpp">trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasEXTBlendMinMaxcpp">trunk/Source/WebCore/html/canvas/EXTBlendMinMax.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasEXTBlendMinMaxh">trunk/Source/WebCore/html/canvas/EXTBlendMinMax.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasEXTFragDepthcpp">trunk/Source/WebCore/html/canvas/EXTFragDepth.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasEXTFragDepthh">trunk/Source/WebCore/html/canvas/EXTFragDepth.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasEXTShaderTextureLODcpp">trunk/Source/WebCore/html/canvas/EXTShaderTextureLOD.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasEXTShaderTextureLODh">trunk/Source/WebCore/html/canvas/EXTShaderTextureLOD.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasEXTTextureFilterAnisotropiccpp">trunk/Source/WebCore/html/canvas/EXTTextureFilterAnisotropic.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasEXTTextureFilterAnisotropich">trunk/Source/WebCore/html/canvas/EXTTextureFilterAnisotropic.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasEXTsRGBcpp">trunk/Source/WebCore/html/canvas/EXTsRGB.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasEXTsRGBh">trunk/Source/WebCore/html/canvas/EXTsRGB.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasOESElementIndexUintcpp">trunk/Source/WebCore/html/canvas/OESElementIndexUint.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasOESElementIndexUinth">trunk/Source/WebCore/html/canvas/OESElementIndexUint.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasOESStandardDerivativescpp">trunk/Source/WebCore/html/canvas/OESStandardDerivatives.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasOESStandardDerivativesh">trunk/Source/WebCore/html/canvas/OESStandardDerivatives.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasOESTextureFloatcpp">trunk/Source/WebCore/html/canvas/OESTextureFloat.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasOESTextureFloath">trunk/Source/WebCore/html/canvas/OESTextureFloat.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasOESTextureFloatLinearcpp">trunk/Source/WebCore/html/canvas/OESTextureFloatLinear.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasOESTextureFloatLinearh">trunk/Source/WebCore/html/canvas/OESTextureFloatLinear.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasOESTextureHalfFloatcpp">trunk/Source/WebCore/html/canvas/OESTextureHalfFloat.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasOESTextureHalfFloath">trunk/Source/WebCore/html/canvas/OESTextureHalfFloat.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasOESTextureHalfFloatLinearcpp">trunk/Source/WebCore/html/canvas/OESTextureHalfFloatLinear.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasOESTextureHalfFloatLinearh">trunk/Source/WebCore/html/canvas/OESTextureHalfFloatLinear.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasOESVertexArrayObjectcpp">trunk/Source/WebCore/html/canvas/OESVertexArrayObject.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasOESVertexArrayObjecth">trunk/Source/WebCore/html/canvas/OESVertexArrayObject.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLBuffercpp">trunk/Source/WebCore/html/canvas/WebGLBuffer.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLBufferh">trunk/Source/WebCore/html/canvas/WebGLBuffer.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLCompressedTextureATCcpp">trunk/Source/WebCore/html/canvas/WebGLCompressedTextureATC.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLCompressedTextureATCh">trunk/Source/WebCore/html/canvas/WebGLCompressedTextureATC.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLCompressedTexturePVRTCcpp">trunk/Source/WebCore/html/canvas/WebGLCompressedTexturePVRTC.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLCompressedTexturePVRTCh">trunk/Source/WebCore/html/canvas/WebGLCompressedTexturePVRTC.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLCompressedTextureS3TCcpp">trunk/Source/WebCore/html/canvas/WebGLCompressedTextureS3TC.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLCompressedTextureS3TCh">trunk/Source/WebCore/html/canvas/WebGLCompressedTextureS3TC.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLContextGroupcpp">trunk/Source/WebCore/html/canvas/WebGLContextGroup.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLContextGrouph">trunk/Source/WebCore/html/canvas/WebGLContextGroup.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLContextObjectcpp">trunk/Source/WebCore/html/canvas/WebGLContextObject.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLContextObjecth">trunk/Source/WebCore/html/canvas/WebGLContextObject.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLDebugRendererInfocpp">trunk/Source/WebCore/html/canvas/WebGLDebugRendererInfo.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLDebugRendererInfoh">trunk/Source/WebCore/html/canvas/WebGLDebugRendererInfo.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLDebugShaderscpp">trunk/Source/WebCore/html/canvas/WebGLDebugShaders.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLDebugShadersh">trunk/Source/WebCore/html/canvas/WebGLDebugShaders.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLDepthTexturecpp">trunk/Source/WebCore/html/canvas/WebGLDepthTexture.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLDepthTextureh">trunk/Source/WebCore/html/canvas/WebGLDepthTexture.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLDrawBufferscpp">trunk/Source/WebCore/html/canvas/WebGLDrawBuffers.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLDrawBuffersh">trunk/Source/WebCore/html/canvas/WebGLDrawBuffers.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLExtensioncpp">trunk/Source/WebCore/html/canvas/WebGLExtension.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLExtensionh">trunk/Source/WebCore/html/canvas/WebGLExtension.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLFramebuffercpp">trunk/Source/WebCore/html/canvas/WebGLFramebuffer.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLFramebufferh">trunk/Source/WebCore/html/canvas/WebGLFramebuffer.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLLoseContextcpp">trunk/Source/WebCore/html/canvas/WebGLLoseContext.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLLoseContexth">trunk/Source/WebCore/html/canvas/WebGLLoseContext.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLObjectcpp">trunk/Source/WebCore/html/canvas/WebGLObject.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLObjecth">trunk/Source/WebCore/html/canvas/WebGLObject.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLProgramcpp">trunk/Source/WebCore/html/canvas/WebGLProgram.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLProgramh">trunk/Source/WebCore/html/canvas/WebGLProgram.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLRenderbuffercpp">trunk/Source/WebCore/html/canvas/WebGLRenderbuffer.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLRenderbufferh">trunk/Source/WebCore/html/canvas/WebGLRenderbuffer.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLShadercpp">trunk/Source/WebCore/html/canvas/WebGLShader.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLShaderh">trunk/Source/WebCore/html/canvas/WebGLShader.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLSharedObjectcpp">trunk/Source/WebCore/html/canvas/WebGLSharedObject.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLSharedObjecth">trunk/Source/WebCore/html/canvas/WebGLSharedObject.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLTexturecpp">trunk/Source/WebCore/html/canvas/WebGLTexture.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLTextureh">trunk/Source/WebCore/html/canvas/WebGLTexture.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLVertexArrayObjectOEScpp">trunk/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLVertexArrayObjectOESh">trunk/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebCorebindingsjsJSWebGL1RenderingContextCustomcpp">trunk/Source/WebCore/bindings/js/JSWebGL1RenderingContextCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSWebGL2RenderingContextCustomcpp">trunk/Source/WebCore/bindings/js/JSWebGL2RenderingContextCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSWebGLRenderingContextBaseCustomcpp">trunk/Source/WebCore/bindings/js/JSWebGLRenderingContextBaseCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGL1RenderingContextcpp">trunk/Source/WebCore/html/canvas/WebGL1RenderingContext.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGL1RenderingContexth">trunk/Source/WebCore/html/canvas/WebGL1RenderingContext.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGL1RenderingContextidl">trunk/Source/WebCore/html/canvas/WebGL1RenderingContext.idl</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGL2RenderingContextcpp">trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGL2RenderingContexth">trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGL2RenderingContextidl">trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.idl</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLRenderingContextBasecpp">trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLRenderingContextBaseh">trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLRenderingContextBaseidl">trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.idl</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceWebCorebindingsjsJSWebGLRenderingContextCustomcpp">trunk/Source/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLRenderingContextcpp">trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLRenderingContexth">trunk/Source/WebCore/html/canvas/WebGLRenderingContext.h</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasWebGLRenderingContextidl">trunk/Source/WebCore/html/canvas/WebGLRenderingContext.idl</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/CMakeLists.txt        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -540,6 +540,8 @@
</span><span class="cx">     html/canvas/OESTextureHalfFloat.idl
</span><span class="cx">     html/canvas/OESTextureHalfFloatLinear.idl
</span><span class="cx">     html/canvas/OESVertexArrayObject.idl
</span><ins>+    html/canvas/WebGL1RenderingContext.idl
+    html/canvas/WebGL2RenderingContext.idl
</ins><span class="cx">     html/canvas/WebGLActiveInfo.idl
</span><span class="cx">     html/canvas/WebGLBuffer.idl
</span><span class="cx">     html/canvas/WebGLCompressedTextureATC.idl
</span><span class="lines">@@ -555,7 +557,7 @@
</span><span class="cx">     html/canvas/WebGLLoseContext.idl
</span><span class="cx">     html/canvas/WebGLProgram.idl
</span><span class="cx">     html/canvas/WebGLRenderbuffer.idl
</span><del>-    html/canvas/WebGLRenderingContext.idl
</del><ins>+    html/canvas/WebGLRenderingContextBase.idl
</ins><span class="cx">     html/canvas/WebGLShader.idl
</span><span class="cx">     html/canvas/WebGLShaderPrecisionFormat.idl
</span><span class="cx">     html/canvas/WebGLTexture.idl
</span><span class="lines">@@ -1145,7 +1147,7 @@
</span><span class="cx">     bindings/js/JSTreeWalkerCustom.cpp
</span><span class="cx">     bindings/js/JSVideoTrackCustom.cpp
</span><span class="cx">     bindings/js/JSVideoTrackListCustom.cpp
</span><del>-    bindings/js/JSWebGLRenderingContextCustom.cpp
</del><ins>+    bindings/js/JSWebGLRenderingContextBaseCustom.cpp
</ins><span class="cx">     bindings/js/JSWebKitPointCustom.cpp
</span><span class="cx">     bindings/js/JSWorkerCustom.cpp
</span><span class="cx">     bindings/js/JSWorkerGlobalScopeBase.cpp
</span><span class="lines">@@ -1669,6 +1671,8 @@
</span><span class="cx">     html/canvas/OESTextureHalfFloat.cpp
</span><span class="cx">     html/canvas/OESTextureHalfFloatLinear.cpp
</span><span class="cx">     html/canvas/OESVertexArrayObject.cpp
</span><ins>+    html/canvas/WebGL1RenderingContext.cpp
+    html/canvas/WebGL2RenderingContext.cpp
</ins><span class="cx">     html/canvas/WebGLBuffer.cpp
</span><span class="cx">     html/canvas/WebGLCompressedTextureATC.cpp
</span><span class="cx">     html/canvas/WebGLCompressedTexturePVRTC.cpp
</span><span class="lines">@@ -1688,7 +1692,7 @@
</span><span class="cx">     html/canvas/WebGLObject.cpp
</span><span class="cx">     html/canvas/WebGLProgram.cpp
</span><span class="cx">     html/canvas/WebGLRenderbuffer.cpp
</span><del>-    html/canvas/WebGLRenderingContext.cpp
</del><ins>+    html/canvas/WebGLRenderingContextBase.cpp
</ins><span class="cx">     html/canvas/WebGLShader.cpp
</span><span class="cx">     html/canvas/WebGLShaderPrecisionFormat.cpp
</span><span class="cx">     html/canvas/WebGLSharedObject.cpp
</span><span class="lines">@@ -2766,6 +2770,8 @@
</span><span class="cx">         html/canvas/OESTextureHalfFloat.cpp
</span><span class="cx">         html/canvas/OESTextureHalfFloatLinear.cpp
</span><span class="cx">         html/canvas/OESVertexArrayObject.cpp
</span><ins>+        html/canvas/WebGL1RenderingContext.cpp
+        html/canvas/WebGL2RenderingContext.cpp
</ins><span class="cx">         html/canvas/WebGLBuffer.cpp
</span><span class="cx">         html/canvas/WebGLCompressedTextureATC.cpp
</span><span class="cx">         html/canvas/WebGLCompressedTexturePVRTC.cpp
</span><span class="lines">@@ -2785,7 +2791,7 @@
</span><span class="cx">         html/canvas/WebGLObject.cpp
</span><span class="cx">         html/canvas/WebGLProgram.cpp
</span><span class="cx">         html/canvas/WebGLRenderbuffer.cpp
</span><del>-        html/canvas/WebGLRenderingContext.cpp
</del><ins>+        html/canvas/WebGLRenderingContextBase.cpp
</ins><span class="cx">         html/canvas/WebGLShader.cpp
</span><span class="cx">         html/canvas/WebGLShaderPrecisionFormat.cpp
</span><span class="cx">         html/canvas/WebGLSharedObject.cpp
</span><span class="lines">@@ -2807,6 +2813,8 @@
</span><span class="cx">         html/canvas/OESTextureHalfFloat.idl
</span><span class="cx">         html/canvas/OESTextureHalfFloatLinear.idl
</span><span class="cx">         html/canvas/OESVertexArrayObject.idl
</span><ins>+        html/canvas/WebGL1RenderingContext.idl
+        html/canvas/WebGL2RenderingContext.idl
</ins><span class="cx">         html/canvas/WebGLActiveInfo.idl
</span><span class="cx">         html/canvas/WebGLBuffer.idl
</span><span class="cx">         html/canvas/WebGLCompressedTextureATC.idl
</span><span class="lines">@@ -2822,7 +2830,7 @@
</span><span class="cx">         html/canvas/WebGLLoseContext.idl
</span><span class="cx">         html/canvas/WebGLProgram.idl
</span><span class="cx">         html/canvas/WebGLRenderbuffer.idl
</span><del>-        html/canvas/WebGLRenderingContext.idl
</del><ins>+        html/canvas/WebGLRenderingContextBase.idl
</ins><span class="cx">         html/canvas/WebGLShader.idl
</span><span class="cx">         html/canvas/WebGLShaderPrecisionFormat.idl
</span><span class="cx">         html/canvas/WebGLTexture.idl
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/ChangeLog        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -1,3 +1,173 @@
</span><ins>+2015-01-13  Roger Fong  &lt;roger_fong@apple.com&gt;
+
+        WebGL2: Support webgl2 context creation.
+        https://bugs.webkit.org/show_bug.cgi?id=126408
+        &lt;rdar://problem/15002170&gt;
+
+        Reviewed by Dean Jackson.
+
+        Tests covered by existing Khronos tests for WebGL 1.0 conformance.
+
+        Create a WebGLRenderingContextBase class that extends to a WebGL1RenderingContext and WebGL2RenderingContext.
+        Replace all previous instances of WebGLRenderingContext usages with WebGLRenderingContextBase usages for now.
+        As the first step, the WebGL1 and WebGL2 contexts will have the exact same functionality.
+
+        * CMakeLists.txt:
+        * DerivedSources.make:
+        * WebCore.xcodeproj/project.pbxproj:
+        * bindings/js/JSCanvasRenderingContextCustom.cpp:
+        (WebCore::toJS):
+        * bindings/js/JSDocumentCustom.cpp:
+        * bindings/js/JSHTMLCanvasElementCustom.cpp:
+        * bindings/js/JSWebGL1RenderingContextCustom.cpp: Copied from Source/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp.
+        * bindings/js/JSWebGL2RenderingContextCustom.cpp: Added.
+        (WebCore::JSWebGL2RenderingContext::visitAdditionalChildren):
+        * bindings/js/JSWebGLRenderingContextBaseCustom.cpp: Added.
+        * bindings/js/JSWebGLRenderingContextCustom.cpp: Removed.
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (GenerateImplementation):
+        * html/HTMLCanvasElement.cpp:
+        (WebCore::HTMLCanvasElement::getContext):
+        (WebCore::HTMLCanvasElement::is3dType):
+        (WebCore::HTMLCanvasElement::reset):
+        (WebCore::HTMLCanvasElement::paint):
+        (WebCore::HTMLCanvasElement::getImageData):
+        * html/canvas/ANGLEInstancedArrays.cpp:
+        (WebCore::ANGLEInstancedArrays::ANGLEInstancedArrays):
+        (WebCore::ANGLEInstancedArrays::supported):
+        * html/canvas/ANGLEInstancedArrays.h:
+        * html/canvas/CanvasRenderingContext.h:
+        (WebCore::CanvasRenderingContext::type):
+        * html/canvas/CanvasRenderingContext2D.cpp:
+        (WebCore::CanvasRenderingContext2D::CanvasRenderingContext2D):
+        * html/canvas/EXTBlendMinMax.cpp:
+        (WebCore::EXTBlendMinMax::EXTBlendMinMax):
+        * html/canvas/EXTBlendMinMax.h:
+        * html/canvas/EXTFragDepth.cpp:
+        (WebCore::EXTFragDepth::EXTFragDepth):
+        * html/canvas/EXTFragDepth.h:
+        * html/canvas/EXTShaderTextureLOD.cpp:
+        (WebCore::EXTShaderTextureLOD::EXTShaderTextureLOD):
+        * html/canvas/EXTShaderTextureLOD.h:
+        * html/canvas/EXTTextureFilterAnisotropic.cpp:
+        (WebCore::EXTTextureFilterAnisotropic::EXTTextureFilterAnisotropic):
+        * html/canvas/EXTTextureFilterAnisotropic.h:
+        * html/canvas/EXTsRGB.cpp:
+        (WebCore::EXTsRGB::EXTsRGB):
+        * html/canvas/EXTsRGB.h:
+        * html/canvas/OESElementIndexUint.cpp:
+        (WebCore::OESElementIndexUint::OESElementIndexUint):
+        * html/canvas/OESElementIndexUint.h:
+        * html/canvas/OESStandardDerivatives.cpp:
+        (WebCore::OESStandardDerivatives::OESStandardDerivatives):
+        * html/canvas/OESStandardDerivatives.h:
+        * html/canvas/OESTextureFloat.cpp:
+        (WebCore::OESTextureFloat::OESTextureFloat):
+        * html/canvas/OESTextureFloat.h:
+        * html/canvas/OESTextureFloatLinear.cpp:
+        (WebCore::OESTextureFloatLinear::OESTextureFloatLinear):
+        * html/canvas/OESTextureFloatLinear.h:
+        * html/canvas/OESTextureHalfFloat.cpp:
+        (WebCore::OESTextureHalfFloat::OESTextureHalfFloat):
+        * html/canvas/OESTextureHalfFloat.h:
+        * html/canvas/OESTextureHalfFloatLinear.cpp:
+        (WebCore::OESTextureHalfFloatLinear::OESTextureHalfFloatLinear):
+        * html/canvas/OESTextureHalfFloatLinear.h:
+        * html/canvas/OESVertexArrayObject.cpp:
+        (WebCore::OESVertexArrayObject::OESVertexArrayObject):
+        * html/canvas/OESVertexArrayObject.h:
+        * html/canvas/WebGL1RenderingContext.cpp: Copied from Source/WebCore/html/canvas/WebGLRenderingContext.cpp.
+        * html/canvas/WebGL1RenderingContext.h: Copied from Source/WebCore/html/canvas/WebGLRenderingContext.h.
+        * html/canvas/WebGL1RenderingContext.idl: Copied from Source/WebCore/html/canvas/WebGLRenderingContext.idl.
+        * html/canvas/WebGL2RenderingContext.cpp: Added.
+        (WebCore::WebGL2RenderingContext::WebGL2RenderingContext):
+        * html/canvas/WebGL2RenderingContext.h: Added.
+        * html/canvas/WebGL2RenderingContext.idl: Added.
+        * html/canvas/WebGLBuffer.cpp:
+        (WebCore::WebGLBuffer::create):
+        (WebCore::WebGLBuffer::WebGLBuffer):
+        * html/canvas/WebGLBuffer.h:
+        * html/canvas/WebGLCompressedTextureATC.cpp:
+        (WebCore::WebGLCompressedTextureATC::WebGLCompressedTextureATC):
+        (WebCore::WebGLCompressedTextureATC::supported):
+        * html/canvas/WebGLCompressedTextureATC.h:
+        * html/canvas/WebGLCompressedTexturePVRTC.cpp:
+        (WebCore::WebGLCompressedTexturePVRTC::WebGLCompressedTexturePVRTC):
+        (WebCore::WebGLCompressedTexturePVRTC::supported):
+        * html/canvas/WebGLCompressedTexturePVRTC.h:
+        * html/canvas/WebGLCompressedTextureS3TC.cpp:
+        (WebCore::WebGLCompressedTextureS3TC::WebGLCompressedTextureS3TC):
+        (WebCore::WebGLCompressedTextureS3TC::supported):
+        * html/canvas/WebGLCompressedTextureS3TC.h:
+        * html/canvas/WebGLContextGroup.cpp:
+        (WebCore::WebGLContextGroup::getAGraphicsContext3D):
+        (WebCore::WebGLContextGroup::addContext):
+        (WebCore::WebGLContextGroup::removeContext):
+        (WebCore::WebGLContextGroup::loseContextGroup):
+        * html/canvas/WebGLContextGroup.h:
+        * html/canvas/WebGLContextObject.cpp:
+        (WebCore::WebGLContextObject::WebGLContextObject):
+        * html/canvas/WebGLContextObject.h:
+        (WebCore::WebGLContextObject::context):
+        * html/canvas/WebGLDebugRendererInfo.cpp:
+        (WebCore::WebGLDebugRendererInfo::WebGLDebugRendererInfo):
+        * html/canvas/WebGLDebugRendererInfo.h:
+        * html/canvas/WebGLDebugShaders.cpp:
+        (WebCore::WebGLDebugShaders::WebGLDebugShaders):
+        * html/canvas/WebGLDebugShaders.h:
+        * html/canvas/WebGLDepthTexture.cpp:
+        (WebCore::WebGLDepthTexture::WebGLDepthTexture):
+        * html/canvas/WebGLDepthTexture.h:
+        * html/canvas/WebGLDrawBuffers.cpp:
+        (WebCore::WebGLDrawBuffers::WebGLDrawBuffers):
+        (WebCore::WebGLDrawBuffers::supported):
+        (WebCore::WebGLDrawBuffers::satisfiesWebGLRequirements):
+        * html/canvas/WebGLDrawBuffers.h:
+        * html/canvas/WebGLExtension.cpp:
+        (WebCore::WebGLExtension::WebGLExtension):
+        * html/canvas/WebGLExtension.h:
+        (WebCore::WebGLExtension::context):
+        * html/canvas/WebGLFramebuffer.cpp:
+        (WebCore::WebGLFramebuffer::create):
+        (WebCore::WebGLFramebuffer::WebGLFramebuffer):
+        * html/canvas/WebGLFramebuffer.h:
+        * html/canvas/WebGLLoseContext.cpp:
+        (WebCore::WebGLLoseContext::WebGLLoseContext):
+        (WebCore::WebGLLoseContext::loseContext):
+        * html/canvas/WebGLLoseContext.h:
+        * html/canvas/WebGLObject.cpp:
+        (WebCore::WebGLObject::WebGLObject):
+        * html/canvas/WebGLObject.h:
+        * html/canvas/WebGLProgram.cpp:
+        (WebCore::WebGLProgram::create):
+        (WebCore::WebGLProgram::WebGLProgram):
+        * html/canvas/WebGLProgram.h:
+        * html/canvas/WebGLRenderbuffer.cpp:
+        (WebCore::WebGLRenderbuffer::create):
+        (WebCore::WebGLRenderbuffer::WebGLRenderbuffer):
+        * html/canvas/WebGLRenderbuffer.h:
+        * html/canvas/WebGLRenderingContext.cpp: Removed.
+        * html/canvas/WebGLRenderingContext.h: Removed.
+        * html/canvas/WebGLRenderingContext.idl: Removed.
+        * html/canvas/WebGLRenderingContextBase.cpp: Added.
+        * html/canvas/WebGLRenderingContextBase.h: Added.
+        * html/canvas/WebGLRenderingContextBase.idl: Added.
+        * html/canvas/WebGLShader.cpp:
+        (WebCore::WebGLShader::create):
+        (WebCore::WebGLShader::WebGLShader):
+        * html/canvas/WebGLShader.h:
+        * html/canvas/WebGLSharedObject.cpp:
+        (WebCore::WebGLSharedObject::WebGLSharedObject):
+        * html/canvas/WebGLSharedObject.h:
+        * html/canvas/WebGLTexture.cpp:
+        (WebCore::WebGLTexture::create):
+        (WebCore::WebGLTexture::WebGLTexture):
+        * html/canvas/WebGLTexture.h:
+        * html/canvas/WebGLVertexArrayObjectOES.cpp:
+        (WebCore::WebGLVertexArrayObjectOES::create):
+        (WebCore::WebGLVertexArrayObjectOES::WebGLVertexArrayObjectOES):
+        * html/canvas/WebGLVertexArrayObjectOES.h:
+
</ins><span class="cx"> 2015-01-13  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, fix Mac build after r178388
</span></span></pre></div>
<a id="trunkSourceWebCoreDerivedSourcesmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/DerivedSources.make (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/DerivedSources.make        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/DerivedSources.make        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -444,12 +444,14 @@
</span><span class="cx">     $(WebCore)/html/canvas/WebGLLoseContext.idl \
</span><span class="cx">     $(WebCore)/html/canvas/WebGLProgram.idl \
</span><span class="cx">     $(WebCore)/html/canvas/WebGLRenderbuffer.idl \
</span><del>-    $(WebCore)/html/canvas/WebGLRenderingContext.idl \
</del><span class="cx">     $(WebCore)/html/canvas/WebGLShader.idl \
</span><span class="cx">     $(WebCore)/html/canvas/WebGLShaderPrecisionFormat.idl \
</span><span class="cx">     $(WebCore)/html/canvas/WebGLTexture.idl \
</span><span class="cx">     $(WebCore)/html/canvas/WebGLUniformLocation.idl \
</span><span class="cx">     $(WebCore)/html/canvas/WebGLVertexArrayObjectOES.idl \
</span><ins>+    $(WebCore)/html/canvas/WebGLRenderingContextBase.idl \
+    $(WebCore)/html/canvas/WebGL1RenderingContext.idl \
+        $(WebCore)/html/canvas/WebGL2RenderingContext.idl \
</ins><span class="cx">     $(WebCore)/html/track/AudioTrack.idl \
</span><span class="cx">     $(WebCore)/html/track/AudioTrackList.idl \
</span><span class="cx">     $(WebCore)/html/track/DataCue.idl \
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -1725,8 +1725,8 @@
</span><span class="cx">                 49C7B9DA1042D32F0009D447 /* WebGLRenderbuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 49C7B9BA1042D32F0009D447 /* WebGLRenderbuffer.h */; };
</span><span class="cx">                 49C7B9DC1042D32F0009D447 /* CanvasRenderingContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49C7B9BC1042D32F0009D447 /* CanvasRenderingContext.cpp */; };
</span><span class="cx">                 49C7B9DD1042D32F0009D447 /* CanvasRenderingContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 49C7B9BD1042D32F0009D447 /* CanvasRenderingContext.h */; };
</span><del>-                49C7B9DF1042D32F0009D447 /* WebGLRenderingContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49C7B9BF1042D32F0009D447 /* WebGLRenderingContext.cpp */; };
-                49C7B9E01042D32F0009D447 /* WebGLRenderingContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 49C7B9C01042D32F0009D447 /* WebGLRenderingContext.h */; };
</del><ins>+                49C7B9DF1042D32F0009D447 /* WebGL1RenderingContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49C7B9BF1042D32F0009D447 /* WebGL1RenderingContext.cpp */; };
+                49C7B9E01042D32F0009D447 /* WebGL1RenderingContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 49C7B9C01042D32F0009D447 /* WebGL1RenderingContext.h */; };
</ins><span class="cx">                 49C7B9E21042D32F0009D447 /* WebGLShader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49C7B9C21042D32F0009D447 /* WebGLShader.cpp */; };
</span><span class="cx">                 49C7B9E31042D32F0009D447 /* WebGLShader.h in Headers */ = {isa = PBXBuildFile; fileRef = 49C7B9C31042D32F0009D447 /* WebGLShader.h */; };
</span><span class="cx">                 49C7B9E51042D32F0009D447 /* WebGLTexture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49C7B9C51042D32F0009D447 /* WebGLTexture.cpp */; };
</span><span class="lines">@@ -1766,10 +1766,10 @@
</span><span class="cx">                 49EED1431051969400099FAB /* JSCanvasRenderingContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 49EED13D1051969400099FAB /* JSCanvasRenderingContext.h */; };
</span><span class="cx">                 49EED1441051969400099FAB /* JSCanvasRenderingContext2D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49EED13E1051969400099FAB /* JSCanvasRenderingContext2D.cpp */; };
</span><span class="cx">                 49EED1451051969400099FAB /* JSCanvasRenderingContext2D.h in Headers */ = {isa = PBXBuildFile; fileRef = 49EED13F1051969400099FAB /* JSCanvasRenderingContext2D.h */; };
</span><del>-                49EED1461051969400099FAB /* JSWebGLRenderingContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49EED1401051969400099FAB /* JSWebGLRenderingContext.cpp */; };
-                49EED1471051969400099FAB /* JSWebGLRenderingContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 49EED1411051969400099FAB /* JSWebGLRenderingContext.h */; };
</del><ins>+                49EED1461051969400099FAB /* JSWebGL1RenderingContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49EED1401051969400099FAB /* JSWebGL1RenderingContext.cpp */; };
+                49EED1471051969400099FAB /* JSWebGL1RenderingContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 49EED1411051969400099FAB /* JSWebGL1RenderingContext.h */; };
</ins><span class="cx">                 49EED14E1051971A00099FAB /* JSCanvasRenderingContext2DCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49EED14B1051971900099FAB /* JSCanvasRenderingContext2DCustom.cpp */; };
</span><del>-                49EED14F1051971A00099FAB /* JSWebGLRenderingContextCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49EED14C1051971A00099FAB /* JSWebGLRenderingContextCustom.cpp */; };
</del><ins>+                49EED14F1051971A00099FAB /* JSWebGL1RenderingContextCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49EED14C1051971A00099FAB /* JSWebGL1RenderingContextCustom.cpp */; };
</ins><span class="cx">                 49EED1501051971A00099FAB /* JSCanvasRenderingContextCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49EED14D1051971A00099FAB /* JSCanvasRenderingContextCustom.cpp */; };
</span><span class="cx">                 49FC7A501444AF5F00A5D864 /* DisplayRefreshMonitor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49FC7A4F1444AF5F00A5D864 /* DisplayRefreshMonitor.cpp */; };
</span><span class="cx">                 49FFBF1D11C8550E006A7118 /* GraphicsContext3DMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 49FFBF1C11C8550E006A7118 /* GraphicsContext3DMac.mm */; };
</span><span class="lines">@@ -5838,6 +5838,12 @@
</span><span class="cx">                 D359D793129CA3C00006E5D2 /* DOMHTMLDetailsElementInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = D359D790129CA3C00006E5D2 /* DOMHTMLDetailsElementInternal.h */; };
</span><span class="cx">                 D359D8BE129CA55C0006E5D2 /* JSHTMLDetailsElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D359D8BC129CA55C0006E5D2 /* JSHTMLDetailsElement.cpp */; };
</span><span class="cx">                 D359D8BF129CA55C0006E5D2 /* JSHTMLDetailsElement.h in Headers */ = {isa = PBXBuildFile; fileRef = D359D8BD129CA55C0006E5D2 /* JSHTMLDetailsElement.h */; };
</span><ins>+                D39C72D71A5C8B0B00AED89C /* WebGLRenderingContextBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D39C72D51A5C8B0B00AED89C /* WebGLRenderingContextBase.cpp */; };
+                D39C72D81A5C8B0B00AED89C /* WebGLRenderingContextBase.h in Headers */ = {isa = PBXBuildFile; fileRef = D39C72D61A5C8B0B00AED89C /* WebGLRenderingContextBase.h */; };
+                D39C72DD1A5C8C8E00AED89C /* WebGL2RenderingContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D39C72DB1A5C8C8E00AED89C /* WebGL2RenderingContext.cpp */; };
+                D39C72DE1A5C8C8E00AED89C /* WebGL2RenderingContext.h in Headers */ = {isa = PBXBuildFile; fileRef = D39C72DC1A5C8C8E00AED89C /* WebGL2RenderingContext.h */; };
+                D39C72E41A5C93AF00AED89C /* JSWebGL2RenderingContextCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D39C72E31A5C93AF00AED89C /* JSWebGL2RenderingContextCustom.cpp */; };
+                D39C72E61A5C940B00AED89C /* JSWebGLRenderingContextBaseCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D39C72E51A5C940B00AED89C /* JSWebGLRenderingContextBaseCustom.cpp */; };
</ins><span class="cx">                 D3A94A38122DABAC00A37BBC /* MediaQueryList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3A94A31122DABAC00A37BBC /* MediaQueryList.cpp */; };
</span><span class="cx">                 D3A94A39122DABAC00A37BBC /* MediaQueryList.h in Headers */ = {isa = PBXBuildFile; fileRef = D3A94A32122DABAC00A37BBC /* MediaQueryList.h */; };
</span><span class="cx">                 D3A94A3B122DABAC00A37BBC /* MediaQueryListListener.h in Headers */ = {isa = PBXBuildFile; fileRef = D3A94A34122DABAC00A37BBC /* MediaQueryListListener.h */; };
</span><span class="lines">@@ -5847,6 +5853,10 @@
</span><span class="cx">                 D3AA10F4123A98AA0092152B /* MediaQueryMatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = D3AA10F2123A98AA0092152B /* MediaQueryMatcher.h */; };
</span><span class="cx">                 D3D4E972130C7CFE007BA540 /* HTMLSummaryElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3D4E970130C7CFE007BA540 /* HTMLSummaryElement.cpp */; };
</span><span class="cx">                 D3D4E973130C7CFE007BA540 /* HTMLSummaryElement.h in Headers */ = {isa = PBXBuildFile; fileRef = D3D4E971130C7CFE007BA540 /* HTMLSummaryElement.h */; };
</span><ins>+                D3E14BB51A5DCF4B0097A6E9 /* JSWebGL2RenderingContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3E14BB31A5DCF4B0097A6E9 /* JSWebGL2RenderingContext.cpp */; };
+                D3E14BB61A5DCF4B0097A6E9 /* JSWebGL2RenderingContext.h in Headers */ = {isa = PBXBuildFile; fileRef = D3E14BB41A5DCF4B0097A6E9 /* JSWebGL2RenderingContext.h */; };
+                D3E14BB91A5DCF7B0097A6E9 /* JSWebGLRenderingContextBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3E14BB71A5DCF7B0097A6E9 /* JSWebGLRenderingContextBase.cpp */; };
+                D3E14BBA1A5DCF7B0097A6E9 /* JSWebGLRenderingContextBase.h in Headers */ = {isa = PBXBuildFile; fileRef = D3E14BB81A5DCF7B0097A6E9 /* JSWebGLRenderingContextBase.h */; };
</ins><span class="cx">                 D619A307144E00BE004BC302 /* ChildListMutationScope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D619A305144E00BE004BC302 /* ChildListMutationScope.cpp */; };
</span><span class="cx">                 D619A308144E00BE004BC302 /* ChildListMutationScope.h in Headers */ = {isa = PBXBuildFile; fileRef = D619A306144E00BE004BC302 /* ChildListMutationScope.h */; };
</span><span class="cx">                 D6489D25166FFCF1007C031B /* JSHTMLTemplateElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D6489D23166FFCF1007C031B /* JSHTMLTemplateElement.cpp */; };
</span><span class="lines">@@ -8792,9 +8802,9 @@
</span><span class="cx">                 49C7B9BC1042D32F0009D447 /* CanvasRenderingContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CanvasRenderingContext.cpp; path = canvas/CanvasRenderingContext.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 49C7B9BD1042D32F0009D447 /* CanvasRenderingContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CanvasRenderingContext.h; path = canvas/CanvasRenderingContext.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 49C7B9BE1042D32F0009D447 /* CanvasRenderingContext.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = CanvasRenderingContext.idl; path = canvas/CanvasRenderingContext.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                49C7B9BF1042D32F0009D447 /* WebGLRenderingContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebGLRenderingContext.cpp; path = canvas/WebGLRenderingContext.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
-                49C7B9C01042D32F0009D447 /* WebGLRenderingContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebGLRenderingContext.h; path = canvas/WebGLRenderingContext.h; sourceTree = &quot;&lt;group&gt;&quot;; };
-                49C7B9C11042D32F0009D447 /* WebGLRenderingContext.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = WebGLRenderingContext.idl; path = canvas/WebGLRenderingContext.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><ins>+                49C7B9BF1042D32F0009D447 /* WebGL1RenderingContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebGL1RenderingContext.cpp; path = canvas/WebGL1RenderingContext.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                49C7B9C01042D32F0009D447 /* WebGL1RenderingContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebGL1RenderingContext.h; path = canvas/WebGL1RenderingContext.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                49C7B9C11042D32F0009D447 /* WebGL1RenderingContext.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = WebGL1RenderingContext.idl; path = canvas/WebGL1RenderingContext.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 49C7B9C21042D32F0009D447 /* WebGLShader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebGLShader.cpp; path = canvas/WebGLShader.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 49C7B9C31042D32F0009D447 /* WebGLShader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebGLShader.h; path = canvas/WebGLShader.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 49C7B9C41042D32F0009D447 /* WebGLShader.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = WebGLShader.idl; path = canvas/WebGLShader.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -8836,10 +8846,10 @@
</span><span class="cx">                 49EED13D1051969400099FAB /* JSCanvasRenderingContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCanvasRenderingContext.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 49EED13E1051969400099FAB /* JSCanvasRenderingContext2D.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSCanvasRenderingContext2D.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 49EED13F1051969400099FAB /* JSCanvasRenderingContext2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCanvasRenderingContext2D.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                49EED1401051969400099FAB /* JSWebGLRenderingContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWebGLRenderingContext.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
-                49EED1411051969400099FAB /* JSWebGLRenderingContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWebGLRenderingContext.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><ins>+                49EED1401051969400099FAB /* JSWebGL1RenderingContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWebGL1RenderingContext.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                49EED1411051969400099FAB /* JSWebGL1RenderingContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWebGL1RenderingContext.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 49EED14B1051971900099FAB /* JSCanvasRenderingContext2DCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSCanvasRenderingContext2DCustom.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                49EED14C1051971A00099FAB /* JSWebGLRenderingContextCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWebGLRenderingContextCustom.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><ins>+                49EED14C1051971A00099FAB /* JSWebGL1RenderingContextCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWebGL1RenderingContextCustom.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 49EED14D1051971A00099FAB /* JSCanvasRenderingContextCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSCanvasRenderingContextCustom.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 49FC7A4F1444AF5F00A5D864 /* DisplayRefreshMonitor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DisplayRefreshMonitor.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 49FFBF1C11C8550E006A7118 /* GraphicsContext3DMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GraphicsContext3DMac.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -13316,6 +13326,12 @@
</span><span class="cx">                 D359D790129CA3C00006E5D2 /* DOMHTMLDetailsElementInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMHTMLDetailsElementInternal.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 D359D8BC129CA55C0006E5D2 /* JSHTMLDetailsElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSHTMLDetailsElement.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 D359D8BD129CA55C0006E5D2 /* JSHTMLDetailsElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSHTMLDetailsElement.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                D39C72D51A5C8B0B00AED89C /* WebGLRenderingContextBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebGLRenderingContextBase.cpp; path = canvas/WebGLRenderingContextBase.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                D39C72D61A5C8B0B00AED89C /* WebGLRenderingContextBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebGLRenderingContextBase.h; path = canvas/WebGLRenderingContextBase.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                D39C72DB1A5C8C8E00AED89C /* WebGL2RenderingContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebGL2RenderingContext.cpp; path = canvas/WebGL2RenderingContext.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                D39C72DC1A5C8C8E00AED89C /* WebGL2RenderingContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebGL2RenderingContext.h; path = canvas/WebGL2RenderingContext.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                D39C72E31A5C93AF00AED89C /* JSWebGL2RenderingContextCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWebGL2RenderingContextCustom.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                D39C72E51A5C940B00AED89C /* JSWebGLRenderingContextBaseCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWebGLRenderingContextBaseCustom.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 D3A94A31122DABAC00A37BBC /* MediaQueryList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaQueryList.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 D3A94A32122DABAC00A37BBC /* MediaQueryList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaQueryList.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 D3A94A33122DABAC00A37BBC /* MediaQueryList.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = MediaQueryList.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -13327,6 +13343,12 @@
</span><span class="cx">                 D3AA10F2123A98AA0092152B /* MediaQueryMatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaQueryMatcher.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 D3D4E970130C7CFE007BA540 /* HTMLSummaryElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTMLSummaryElement.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 D3D4E971130C7CFE007BA540 /* HTMLSummaryElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLSummaryElement.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                D3E14BB31A5DCF4B0097A6E9 /* JSWebGL2RenderingContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWebGL2RenderingContext.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                D3E14BB41A5DCF4B0097A6E9 /* JSWebGL2RenderingContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWebGL2RenderingContext.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                D3E14BB71A5DCF7B0097A6E9 /* JSWebGLRenderingContextBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWebGLRenderingContextBase.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                D3E14BB81A5DCF7B0097A6E9 /* JSWebGLRenderingContextBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWebGLRenderingContextBase.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                D3E14BBB1A5DE8F50097A6E9 /* WebGL2RenderingContext.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = WebGL2RenderingContext.idl; path = canvas/WebGL2RenderingContext.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
+                D3E14BBC1A5DE8F50097A6E9 /* WebGLRenderingContextBase.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = WebGLRenderingContextBase.idl; path = canvas/WebGLRenderingContextBase.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 D619A305144E00BE004BC302 /* ChildListMutationScope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ChildListMutationScope.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 D619A306144E00BE004BC302 /* ChildListMutationScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChildListMutationScope.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 D6489D23166FFCF1007C031B /* JSHTMLTemplateElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSHTMLTemplateElement.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -15832,9 +15854,15 @@
</span><span class="cx">                                 49C7B9B91042D32F0009D447 /* WebGLRenderbuffer.cpp */,
</span><span class="cx">                                 49C7B9BA1042D32F0009D447 /* WebGLRenderbuffer.h */,
</span><span class="cx">                                 49C7B9BB1042D32F0009D447 /* WebGLRenderbuffer.idl */,
</span><del>-                                49C7B9BF1042D32F0009D447 /* WebGLRenderingContext.cpp */,
-                                49C7B9C01042D32F0009D447 /* WebGLRenderingContext.h */,
-                                49C7B9C11042D32F0009D447 /* WebGLRenderingContext.idl */,
</del><ins>+                                49C7B9BF1042D32F0009D447 /* WebGL1RenderingContext.cpp */,
+                                49C7B9C01042D32F0009D447 /* WebGL1RenderingContext.h */,
+                                49C7B9C11042D32F0009D447 /* WebGL1RenderingContext.idl */,
+                                D39C72DB1A5C8C8E00AED89C /* WebGL2RenderingContext.cpp */,
+                                D39C72DC1A5C8C8E00AED89C /* WebGL2RenderingContext.h */,
+                                D3E14BBB1A5DE8F50097A6E9 /* WebGL2RenderingContext.idl */,
+                                D39C72D51A5C8B0B00AED89C /* WebGLRenderingContextBase.cpp */,
+                                D39C72D61A5C8B0B00AED89C /* WebGLRenderingContextBase.h */,
+                                D3E14BBC1A5DE8F50097A6E9 /* WebGLRenderingContextBase.idl */,
</ins><span class="cx">                                 49C7B9C21042D32F0009D447 /* WebGLShader.cpp */,
</span><span class="cx">                                 49C7B9C31042D32F0009D447 /* WebGLShader.h */,
</span><span class="cx">                                 49C7B9C41042D32F0009D447 /* WebGLShader.idl */,
</span><span class="lines">@@ -18903,8 +18931,12 @@
</span><span class="cx">                                 49C7B9891042D2D30009D447 /* JSWebGLProgram.h */,
</span><span class="cx">                                 49C7B98A1042D2D30009D447 /* JSWebGLRenderbuffer.cpp */,
</span><span class="cx">                                 49C7B98B1042D2D30009D447 /* JSWebGLRenderbuffer.h */,
</span><del>-                                49EED1401051969400099FAB /* JSWebGLRenderingContext.cpp */,
-                                49EED1411051969400099FAB /* JSWebGLRenderingContext.h */,
</del><ins>+                                D3E14BB71A5DCF7B0097A6E9 /* JSWebGLRenderingContextBase.cpp */,
+                                D3E14BB81A5DCF7B0097A6E9 /* JSWebGLRenderingContextBase.h */,
+                                49EED1401051969400099FAB /* JSWebGL1RenderingContext.cpp */,
+                                49EED1411051969400099FAB /* JSWebGL1RenderingContext.h */,
+                                D3E14BB31A5DCF4B0097A6E9 /* JSWebGL2RenderingContext.cpp */,
+                                D3E14BB41A5DCF4B0097A6E9 /* JSWebGL2RenderingContext.h */,
</ins><span class="cx">                                 49C7B98F1042D2D30009D447 /* JSWebGLShader.cpp */,
</span><span class="cx">                                 49C7B9901042D2D30009D447 /* JSWebGLShader.h */,
</span><span class="cx">                                 A07D3353152B630E001B6393 /* JSWebGLShaderPrecisionFormat.cpp */,
</span><span class="lines">@@ -20999,7 +21031,9 @@
</span><span class="cx">                                 7C73FB17191EF808007DE061 /* JSUserMessageHandlersNamespaceCustom.cpp */,
</span><span class="cx">                                 BE6DF708171CA2C500DD52B8 /* JSVideoTrackCustom.cpp */,
</span><span class="cx">                                 BE6DF70A171CA2C500DD52B8 /* JSVideoTrackListCustom.cpp */,
</span><del>-                                49EED14C1051971A00099FAB /* JSWebGLRenderingContextCustom.cpp */,
</del><ins>+                                D39C72E51A5C940B00AED89C /* JSWebGLRenderingContextBaseCustom.cpp */,
+                                49EED14C1051971A00099FAB /* JSWebGL1RenderingContextCustom.cpp */,
+                                D39C72E31A5C93AF00AED89C /* JSWebGL2RenderingContextCustom.cpp */,
</ins><span class="cx">                                 BC275B7811C5D1C300C9206C /* JSWebKitPointCustom.cpp */,
</span><span class="cx">                                 E1CA5CBB0E8CDCAF00E8EF90 /* JSWorkerCustom.cpp */,
</span><span class="cx">                                 E18258AB0EF3CD7000933242 /* JSWorkerGlobalScopeCustom.cpp */,
</span><span class="lines">@@ -25211,7 +25245,7 @@
</span><span class="cx">                                 93F1D5C112D5335600832BEC /* JSWebGLLoseContext.h in Headers */,
</span><span class="cx">                                 49C7B99C1042D2D30009D447 /* JSWebGLProgram.h in Headers */,
</span><span class="cx">                                 49C7B99E1042D2D30009D447 /* JSWebGLRenderbuffer.h in Headers */,
</span><del>-                                49EED1471051969400099FAB /* JSWebGLRenderingContext.h in Headers */,
</del><ins>+                                49EED1471051969400099FAB /* JSWebGL1RenderingContext.h in Headers */,
</ins><span class="cx">                                 49C7B9A31042D2D30009D447 /* JSWebGLShader.h in Headers */,
</span><span class="cx">                                 A07D3356152B630E001B6393 /* JSWebGLShaderPrecisionFormat.h in Headers */,
</span><span class="cx">                                 49C7B9A51042D2D30009D447 /* JSWebGLTexture.h in Headers */,
</span><span class="lines">@@ -25449,6 +25483,7 @@
</span><span class="cx">                                 14115B5209F84B7100CA4FC1 /* Node.h in Headers */,
</span><span class="cx">                                 854FE7310A2297BE0058D7AD /* NodeFilter.h in Headers */,
</span><span class="cx">                                 854FE7330A2297BE0058D7AD /* NodeFilterCondition.h in Headers */,
</span><ins>+                                D3E14BB61A5DCF4B0097A6E9 /* JSWebGL2RenderingContext.h in Headers */,
</ins><span class="cx">                                 854FE7350A2297BE0058D7AD /* NodeIterator.h in Headers */,
</span><span class="cx">                                 A818721B0977D3C0005826D9 /* NodeList.h in Headers */,
</span><span class="cx">                                 63189AE30E83A33300012E41 /* NodeRareData.h in Headers */,
</span><span class="lines">@@ -25679,6 +25714,7 @@
</span><span class="cx">                                 E43A023B17EB370A004CDD25 /* RenderElement.h in Headers */,
</span><span class="cx">                                 0F5B7A5510F65D7A00376302 /* RenderEmbeddedObject.h in Headers */,
</span><span class="cx">                                 A8EA73C40A1900E300A8EF5F /* RenderFieldset.h in Headers */,
</span><ins>+                                D3E14BBA1A5DCF7B0097A6E9 /* JSWebGLRenderingContextBase.h in Headers */,
</ins><span class="cx">                                 066C77310AB603FD00238CC4 /* RenderFileUploadControl.h in Headers */,
</span><span class="cx">                                 53C8298E13D8D92700DE2DEB /* RenderFlexibleBox.h in Headers */,
</span><span class="cx">                                 508CCA4F13CF106B003151F3 /* RenderFlowThread.h in Headers */,
</span><span class="lines">@@ -25949,6 +25985,7 @@
</span><span class="cx">                                 AB7170890B3118080017123E /* SearchPopupMenu.h in Headers */,
</span><span class="cx">                                 93F1E1EC1A40FDDC00348D13 /* NSPopoverSPI.h in Headers */,
</span><span class="cx">                                 976F36EB14686225005E93B4 /* SecurityContext.h in Headers */,
</span><ins>+                                D39C72D81A5C8B0B00AED89C /* WebGLRenderingContextBase.h in Headers */,
</ins><span class="cx">                                 BCD0E0FB0E972C3500265DEA /* SecurityOrigin.h in Headers */,
</span><span class="cx">                                 BCD0E0FC0E972C3500265DEA /* SecurityOriginHash.h in Headers */,
</span><span class="cx">                                 974D2DA5146A535D00D51F8B /* SecurityPolicy.h in Headers */,
</span><span class="lines">@@ -26624,7 +26661,7 @@
</span><span class="cx">                                 49C7B9D51042D32F0009D447 /* WebGLObject.h in Headers */,
</span><span class="cx">                                 49C7B9D71042D32F0009D447 /* WebGLProgram.h in Headers */,
</span><span class="cx">                                 49C7B9DA1042D32F0009D447 /* WebGLRenderbuffer.h in Headers */,
</span><del>-                                49C7B9E01042D32F0009D447 /* WebGLRenderingContext.h in Headers */,
</del><ins>+                                49C7B9E01042D32F0009D447 /* WebGL1RenderingContext.h in Headers */,
</ins><span class="cx">                                 49C7B9E31042D32F0009D447 /* WebGLShader.h in Headers */,
</span><span class="cx">                                 A07D3358152B632D001B6393 /* WebGLShaderPrecisionFormat.h in Headers */,
</span><span class="cx">                                 01D3CF8714BD0A3000FE9970 /* WebGLSharedObject.h in Headers */,
</span><span class="lines">@@ -26693,6 +26730,7 @@
</span><span class="cx">                                 A14832C1187F657A00DA63A6 /* WKTypes.h in Headers */,
</span><span class="cx">                                 A14832C3187F65DF00DA63A6 /* WKUtilities.h in Headers */,
</span><span class="cx">                                 A14832C4187F663C00DA63A6 /* WKView.h in Headers */,
</span><ins>+                                D39C72DE1A5C8C8E00AED89C /* WebGL2RenderingContext.h in Headers */,
</ins><span class="cx">                                 A14832C6187F668F00DA63A6 /* WKViewPrivate.h in Headers */,
</span><span class="cx">                                 379919971200DDF400EA041C /* WOFFFileFormat.h in Headers */,
</span><span class="cx">                                 2E4346460F546A8200B0F1BA /* Worker.h in Headers */,
</span><span class="lines">@@ -27686,6 +27724,7 @@
</span><span class="cx">                                 BC53DA481143134D000D817E /* DOMWrapperWorld.cpp in Sources */,
</span><span class="cx">                                 1A1D13810A5325520064BF5F /* DOMXPath.mm in Sources */,
</span><span class="cx">                                 85E9E0A20AB3A0C700069CD0 /* DOMXPathExpression.mm in Sources */,
</span><ins>+                                D39C72D71A5C8B0B00AED89C /* WebGLRenderingContextBase.cpp in Sources */,
</ins><span class="cx">                                 85E9E0A60AB3A0C700069CD0 /* DOMXPathResult.mm in Sources */,
</span><span class="cx">                                 FD1762E3176686EA00D836A8 /* DownSampler.cpp in Sources */,
</span><span class="cx">                                 A7CA595E0B27BD9E00FA021D /* DragController.cpp in Sources */,
</span><span class="lines">@@ -28735,6 +28774,7 @@
</span><span class="cx">                                 267726041A5DF6F2003C24DD /* URLFilterParser.cpp in Sources */,
</span><span class="cx">                                 0FDA7C16188322EB00C954B5 /* JSTouch.cpp in Sources */,
</span><span class="cx">                                 0FDA7C18188322EB00C954B5 /* JSTouchEvent.cpp in Sources */,
</span><ins>+                                D39C72E61A5C940B00AED89C /* JSWebGLRenderingContextBaseCustom.cpp in Sources */,
</ins><span class="cx">                                 0FDA7C1A188322EB00C954B5 /* JSTouchList.cpp in Sources */,
</span><span class="cx">                                 070334E9145A1F36008D8D45 /* JSTrackCustom.cpp in Sources */,
</span><span class="cx">                                 07846342145B151A00A58DF1 /* JSTrackEvent.cpp in Sources */,
</span><span class="lines">@@ -28774,8 +28814,8 @@
</span><span class="cx">                                 93F1D5C012D5335600832BEC /* JSWebGLLoseContext.cpp in Sources */,
</span><span class="cx">                                 49C7B99B1042D2D30009D447 /* JSWebGLProgram.cpp in Sources */,
</span><span class="cx">                                 49C7B99D1042D2D30009D447 /* JSWebGLRenderbuffer.cpp in Sources */,
</span><del>-                                49EED1461051969400099FAB /* JSWebGLRenderingContext.cpp in Sources */,
-                                49EED14F1051971A00099FAB /* JSWebGLRenderingContextCustom.cpp in Sources */,
</del><ins>+                                49EED1461051969400099FAB /* JSWebGL1RenderingContext.cpp in Sources */,
+                                49EED14F1051971A00099FAB /* JSWebGL1RenderingContextCustom.cpp in Sources */,
</ins><span class="cx">                                 49C7B9A21042D2D30009D447 /* JSWebGLShader.cpp in Sources */,
</span><span class="cx">                                 A07D3355152B630E001B6393 /* JSWebGLShaderPrecisionFormat.cpp in Sources */,
</span><span class="cx">                                 49C7B9A41042D2D30009D447 /* JSWebGLTexture.cpp in Sources */,
</span><span class="lines">@@ -28937,6 +28977,7 @@
</span><span class="cx">                                 078E090317D14CEE00420AA1 /* MediaStreamTrackEvent.cpp in Sources */,
</span><span class="cx">                                 07FFDE68181AED420072D409 /* MediaStreamTrackPrivate.cpp in Sources */,
</span><span class="cx">                                 076306D217E1478D005A7C4E /* MediaStreamTrackSourcesRequest.cpp in Sources */,
</span><ins>+                                D3E14BB51A5DCF4B0097A6E9 /* JSWebGL2RenderingContext.cpp in Sources */,
</ins><span class="cx">                                 CD641EBF1819B36000EE4C41 /* MediaTimeAVFoundation.cpp in Sources */,
</span><span class="cx">                                 CD60C0C6193E87C7003C656B /* MediaTimeQTKit.mm in Sources */,
</span><span class="cx">                                 0705853A17FE0770005F2BCB /* MediaTrackConstraint.cpp in Sources */,
</span><span class="lines">@@ -29431,6 +29472,7 @@
</span><span class="cx">                                 4B6FA6F70C39E4A100087011 /* SmartReplaceCF.cpp in Sources */,
</span><span class="cx">                                 E4AFD00B0DAF335400F5F55C /* SMILTime.cpp in Sources */,
</span><span class="cx">                                 E4AFD00D0DAF335500F5F55C /* SMILTimeContainer.cpp in Sources */,
</span><ins>+                                D39C72E41A5C93AF00AED89C /* JSWebGL2RenderingContextCustom.cpp in Sources */,
</ins><span class="cx">                                 510D4A33103165EE0049EA54 /* SocketStreamErrorBase.cpp in Sources */,
</span><span class="cx">                                 510D4A36103165EE0049EA54 /* SocketStreamHandleBase.cpp in Sources */,
</span><span class="cx">                                 51ABAE1F103C1913008C5260 /* SocketStreamHandleCFNet.cpp in Sources */,
</span><span class="lines">@@ -29719,6 +29761,7 @@
</span><span class="cx">                                 6550B6A5099DF0270090D781 /* Text.cpp in Sources */,
</span><span class="cx">                                 CE7B2DB61586ABAD0098B3FA /* TextAlternativeWithRange.mm in Sources */,
</span><span class="cx">                                 0F54DCE51881051D003EEDBB /* TextAutoSizing.cpp in Sources */,
</span><ins>+                                D3E14BB91A5DCF7B0097A6E9 /* JSWebGLRenderingContextBase.cpp in Sources */,
</ins><span class="cx">                                 372C00C4129611F1005C9575 /* TextBoundaries.cpp in Sources */,
</span><span class="cx">                                 B2AFFC970D00A5DF0030074D /* TextBoundaries.mm in Sources */,
</span><span class="cx">                                 BCD8A5F015F56F2C0098D071 /* TextBreakIterator.cpp in Sources */,
</span><span class="lines">@@ -29912,7 +29955,7 @@
</span><span class="cx">                                 49C7B9D41042D32F0009D447 /* WebGLObject.cpp in Sources */,
</span><span class="cx">                                 49C7B9D61042D32F0009D447 /* WebGLProgram.cpp in Sources */,
</span><span class="cx">                                 49C7B9D91042D32F0009D447 /* WebGLRenderbuffer.cpp in Sources */,
</span><del>-                                49C7B9DF1042D32F0009D447 /* WebGLRenderingContext.cpp in Sources */,
</del><ins>+                                49C7B9DF1042D32F0009D447 /* WebGL1RenderingContext.cpp in Sources */,
</ins><span class="cx">                                 49C7B9E21042D32F0009D447 /* WebGLShader.cpp in Sources */,
</span><span class="cx">                                 A08CF154152B77B3009C5775 /* WebGLShaderPrecisionFormat.cpp in Sources */,
</span><span class="cx">                                 01D3CF8614BD0A3000FE9970 /* WebGLSharedObject.cpp in Sources */,
</span><span class="lines">@@ -29962,6 +30005,7 @@
</span><span class="cx">                                 93EC44A1188F4BB800661DF1 /* WheelEventDeltaTracker.cpp in Sources */,
</span><span class="cx">                                 9380F47309A11AB4001FDB34 /* Widget.cpp in Sources */,
</span><span class="cx">                                 E453904D0EAFD637003695C8 /* WidgetIOS.mm in Sources */,
</span><ins>+                                D39C72DD1A5C8C8E00AED89C /* WebGL2RenderingContext.cpp in Sources */,
</ins><span class="cx">                                 9380F47809A11ACC001FDB34 /* WidgetMac.mm in Sources */,
</span><span class="cx">                                 939B02EE0EA2DBC400C54570 /* WidthIterator.cpp in Sources */,
</span><span class="cx">                                 BC8243E80D0CFD7500460C8F /* WindowFeatures.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSCanvasRenderingContextCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSCanvasRenderingContextCustom.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSCanvasRenderingContextCustom.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/bindings/js/JSCanvasRenderingContextCustom.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2009 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -32,8 +32,10 @@
</span><span class="cx"> #include &quot;JSNode.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEBGL)
</span><del>-#include &quot;JSWebGLRenderingContext.h&quot;
-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;JSWebGL1RenderingContext.h&quot;
+#include &quot;JSWebGL2RenderingContext.h&quot;
+#include &quot;WebGL1RenderingContext.h&quot;
+#include &quot;WebGL2RenderingContext.h&quot;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> using namespace JSC;
</span><span class="lines">@@ -51,8 +53,10 @@
</span><span class="cx">         return jsNull();
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEBGL)
</span><del>-    if (object-&gt;is3d())
-        return wrap&lt;JSWebGLRenderingContext&gt;(globalObject, static_cast&lt;WebGLRenderingContext*&gt;(object));
</del><ins>+    if (object-&gt;isWebGL1())
+        return wrap&lt;JSWebGL1RenderingContext&gt;(globalObject, static_cast&lt;WebGL1RenderingContext*&gt;(object));
+    if (object-&gt;isWebGL2())
+        return wrap&lt;JSWebGL2RenderingContext&gt;(globalObject, static_cast&lt;WebGL2RenderingContext*&gt;(object));
</ins><span class="cx"> #endif
</span><span class="cx">     ASSERT_WITH_SECURITY_IMPLICATION(object-&gt;is2d());
</span><span class="cx">     return wrap&lt;JSCanvasRenderingContext2D&gt;(globalObject, static_cast&lt;CanvasRenderingContext2D*&gt;(object));
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDocumentCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDocumentCustom.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDocumentCustom.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/bindings/js/JSDocumentCustom.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -37,7 +37,7 @@
</span><span class="cx"> #include &lt;wtf/GetPtr.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEBGL)
</span><del>-#include &quot;JSWebGLRenderingContext.h&quot;
</del><ins>+#include &quot;JSWebGLRenderingContextBase.h&quot;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(TOUCH_EVENTS)
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSHTMLCanvasElementCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSHTMLCanvasElementCustom.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSHTMLCanvasElementCustom.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/bindings/js/JSHTMLCanvasElementCustom.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -35,7 +35,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEBGL)
</span><span class="cx"> #include &quot;JSDictionary.h&quot;
</span><del>-#include &quot;JSWebGLRenderingContext.h&quot;
</del><ins>+#include &quot;JSWebGLRenderingContextBase.h&quot;
</ins><span class="cx"> #include &quot;WebGLContextAttributes.h&quot;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSWebGL1RenderingContextCustomcppfromrev176994trunkSourceWebCorebindingsjsJSWebGLRenderingContextCustomcpp"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/bindings/js/JSWebGL1RenderingContextCustom.cpp (from rev 176994, trunk/Source/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp) (0 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSWebGL1RenderingContextCustom.cpp                                (rev 0)
+++ trunk/Source/WebCore/bindings/js/JSWebGL1RenderingContextCustom.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include &quot;config.h&quot;
+
+#if ENABLE(WEBGL)
+#include &quot;JSWebGL1RenderingContext.h&quot;
+
+using namespace JSC;
+
+namespace WebCore {
+
+void JSWebGL1RenderingContext::visitAdditionalChildren(SlotVisitor&amp; visitor)
+{
+    visitor.addOpaqueRoot(&amp;impl());
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(WEBGL)
</ins></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSWebGL2RenderingContextCustomcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/bindings/js/JSWebGL2RenderingContextCustom.cpp (0 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSWebGL2RenderingContextCustom.cpp                                (rev 0)
+++ trunk/Source/WebCore/bindings/js/JSWebGL2RenderingContextCustom.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+
+#if ENABLE(WEBGL)
+#include &quot;JSWebGL2RenderingContext.h&quot;
+
+using namespace JSC;
+
+namespace WebCore {
+    
+void JSWebGL2RenderingContext::visitAdditionalChildren(SlotVisitor&amp; visitor)
+{
+    visitor.addOpaqueRoot(&amp;impl());
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(WEBGL)
</ins></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSWebGLRenderingContextBaseCustomcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/bindings/js/JSWebGLRenderingContextBaseCustom.cpp (0 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSWebGLRenderingContextBaseCustom.cpp                                (rev 0)
+++ trunk/Source/WebCore/bindings/js/JSWebGLRenderingContextBaseCustom.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -0,0 +1,763 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include &quot;config.h&quot;
+
+#if ENABLE(WEBGL)
+#include &quot;JSWebGLRenderingContextBase.h&quot;
+
+#include &quot;ANGLEInstancedArrays.h&quot;
+#include &quot;EXTBlendMinMax.h&quot;
+#include &quot;EXTFragDepth.h&quot;
+#include &quot;EXTShaderTextureLOD.h&quot;
+#include &quot;EXTTextureFilterAnisotropic.h&quot;
+#include &quot;EXTsRGB.h&quot;
+#include &quot;ExceptionCode.h&quot;
+#include &quot;HTMLCanvasElement.h&quot;
+#include &quot;HTMLImageElement.h&quot;
+#include &quot;JSANGLEInstancedArrays.h&quot;
+#include &quot;JSEXTBlendMinMax.h&quot;
+#include &quot;JSEXTFragDepth.h&quot;
+#include &quot;JSEXTShaderTextureLOD.h&quot;
+#include &quot;JSEXTTextureFilterAnisotropic.h&quot;
+#include &quot;JSEXTsRGB.h&quot;
+#include &quot;JSHTMLCanvasElement.h&quot;
+#include &quot;JSHTMLImageElement.h&quot;
+#include &quot;JSImageData.h&quot;
+#include &quot;JSOESElementIndexUint.h&quot;
+#include &quot;JSOESStandardDerivatives.h&quot;
+#include &quot;JSOESTextureFloat.h&quot;
+#include &quot;JSOESTextureFloatLinear.h&quot;
+#include &quot;JSOESTextureHalfFloat.h&quot;
+#include &quot;JSOESTextureHalfFloatLinear.h&quot;
+#include &quot;JSOESVertexArrayObject.h&quot;
+#include &quot;JSWebGLBuffer.h&quot;
+#include &quot;JSWebGLCompressedTextureATC.h&quot;
+#include &quot;JSWebGLCompressedTexturePVRTC.h&quot;
+#include &quot;JSWebGLCompressedTextureS3TC.h&quot;
+#include &quot;JSWebGLDebugRendererInfo.h&quot;
+#include &quot;JSWebGLDebugShaders.h&quot;
+#include &quot;JSWebGLDepthTexture.h&quot;
+#include &quot;JSWebGLDrawBuffers.h&quot;
+#include &quot;JSWebGLFramebuffer.h&quot;
+#include &quot;JSWebGLLoseContext.h&quot;
+#include &quot;JSWebGLProgram.h&quot;
+#include &quot;JSWebGLRenderbuffer.h&quot;
+#include &quot;JSWebGLShader.h&quot;
+#include &quot;JSWebGLTexture.h&quot;
+#include &quot;JSWebGLUniformLocation.h&quot;
+#include &quot;JSWebGLVertexArrayObjectOES.h&quot;
+#include &quot;JSWebKitCSSMatrix.h&quot;
+#include &quot;NotImplemented.h&quot;
+#include &quot;OESElementIndexUint.h&quot;
+#include &quot;OESStandardDerivatives.h&quot;
+#include &quot;OESTextureFloat.h&quot;
+#include &quot;OESTextureFloatLinear.h&quot;
+#include &quot;OESTextureHalfFloat.h&quot;
+#include &quot;OESTextureHalfFloatLinear.h&quot;
+#include &quot;OESVertexArrayObject.h&quot;
+#include &quot;WebGLBuffer.h&quot;
+#include &quot;WebGLCompressedTextureATC.h&quot;
+#include &quot;WebGLCompressedTexturePVRTC.h&quot;
+#include &quot;WebGLCompressedTextureS3TC.h&quot;
+#include &quot;WebGLDebugRendererInfo.h&quot;
+#include &quot;WebGLDebugShaders.h&quot;
+#include &quot;WebGLDepthTexture.h&quot;
+#include &quot;WebGLDrawBuffers.h&quot;
+#include &quot;WebGLExtension.h&quot;
+#include &quot;WebGLFramebuffer.h&quot;
+#include &quot;WebGLGetInfo.h&quot;
+#include &quot;WebGLLoseContext.h&quot;
+#include &quot;WebGLProgram.h&quot;
+#include &quot;WebGLRenderingContextBase.h&quot;
+#include &quot;WebGLVertexArrayObjectOES.h&quot;
+#include &lt;runtime/Error.h&gt;
+#include &lt;runtime/JSTypedArrays.h&gt;
+#include &lt;runtime/TypedArrayInlines.h&gt;
+#include &lt;runtime/TypedArrays.h&gt;
+#include &lt;wtf/FastMalloc.h&gt;
+
+#if ENABLE(VIDEO)
+#include &quot;HTMLVideoElement.h&quot;
+#include &quot;JSHTMLVideoElement.h&quot;
+#endif
+
+using namespace JSC;
+
+namespace WebCore {
+    
+static JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, const WebGLGetInfo&amp; info)
+{
+    switch (info.getType()) {
+    case WebGLGetInfo::kTypeBool:
+        return jsBoolean(info.getBool());
+    case WebGLGetInfo::kTypeBoolArray: {
+        MarkedArgumentBuffer list;
+        const Vector&lt;bool&gt;&amp; value = info.getBoolArray();
+        for (size_t ii = 0; ii &lt; value.size(); ++ii)
+            list.append(jsBoolean(value[ii]));
+        return constructArray(exec, 0, globalObject, list);
+    }
+    case WebGLGetInfo::kTypeFloat:
+        return jsNumber(info.getFloat());
+    case WebGLGetInfo::kTypeInt:
+        return jsNumber(info.getInt());
+    case WebGLGetInfo::kTypeNull:
+        return jsNull();
+    case WebGLGetInfo::kTypeString:
+        return jsStringWithCache(exec, info.getString());
+    case WebGLGetInfo::kTypeUnsignedInt:
+        return jsNumber(info.getUnsignedInt());
+    case WebGLGetInfo::kTypeWebGLBuffer:
+        return toJS(exec, globalObject, info.getWebGLBuffer());
+    case WebGLGetInfo::kTypeWebGLFloatArray:
+        return toJS(exec, globalObject, info.getWebGLFloatArray());
+    case WebGLGetInfo::kTypeWebGLFramebuffer:
+        return toJS(exec, globalObject, info.getWebGLFramebuffer());
+    case WebGLGetInfo::kTypeWebGLIntArray:
+        return toJS(exec, globalObject, info.getWebGLIntArray());
+        // FIXME: implement WebGLObjectArray
+        // case WebGLGetInfo::kTypeWebGLObjectArray:
+    case WebGLGetInfo::kTypeWebGLProgram:
+        return toJS(exec, globalObject, info.getWebGLProgram());
+    case WebGLGetInfo::kTypeWebGLRenderbuffer:
+        return toJS(exec, globalObject, info.getWebGLRenderbuffer());
+    case WebGLGetInfo::kTypeWebGLTexture:
+        return toJS(exec, globalObject, info.getWebGLTexture());
+    case WebGLGetInfo::kTypeWebGLUnsignedByteArray:
+        return toJS(exec, globalObject, info.getWebGLUnsignedByteArray());
+    case WebGLGetInfo::kTypeWebGLUnsignedIntArray:
+        return toJS(exec, globalObject, info.getWebGLUnsignedIntArray());
+    case WebGLGetInfo::kTypeWebGLVertexArrayObjectOES:
+        return toJS(exec, globalObject, info.getWebGLVertexArrayObjectOES());
+    default:
+        notImplemented();
+        return jsUndefined();
+    }
+}
+
+enum ObjectType {
+    kBuffer, kRenderbuffer, kTexture, kVertexAttrib
+};
+
+static JSValue getObjectParameter(JSWebGLRenderingContextBase* obj, ExecState* exec, ObjectType objectType)
+{
+    if (exec-&gt;argumentCount() != 2)
+        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
+    
+    ExceptionCode ec = 0;
+    WebGLRenderingContextBase&amp; context = obj-&gt;impl();
+    unsigned target = exec-&gt;uncheckedArgument(0).toInt32(exec);
+    if (exec-&gt;hadException())
+        return jsUndefined();
+    unsigned pname = exec-&gt;uncheckedArgument(1).toInt32(exec);
+    if (exec-&gt;hadException())
+        return jsUndefined();
+    WebGLGetInfo info;
+    switch (objectType) {
+    case kBuffer:
+        info = context.getBufferParameter(target, pname, ec);
+        break;
+    case kRenderbuffer:
+        info = context.getRenderbufferParameter(target, pname, ec);
+        break;
+    case kTexture:
+        info = context.getTexParameter(target, pname, ec);
+        break;
+    case kVertexAttrib:
+        // target =&gt; index
+        info = context.getVertexAttrib(target, pname, ec);
+        break;
+    default:
+        notImplemented();
+        break;
+    }
+    if (ec) {
+        setDOMException(exec, ec);
+        return jsUndefined();
+    }
+    return toJS(exec, obj-&gt;globalObject(), info);
+}
+
+enum WhichProgramCall {
+    kProgramParameter, kUniform
+};
+
+static JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, WebGLExtension* extension)
+{
+    if (!extension)
+        return jsNull();
+    switch (extension-&gt;getName()) {
+    case WebGLExtension::WebGLLoseContextName:
+        return toJS(exec, globalObject, static_cast&lt;WebGLLoseContext*&gt;(extension));
+    case WebGLExtension::EXTShaderTextureLODName:
+        return toJS(exec, globalObject, static_cast&lt;EXTShaderTextureLOD*&gt;(extension));
+    case WebGLExtension::EXTTextureFilterAnisotropicName:
+        return toJS(exec, globalObject, static_cast&lt;EXTTextureFilterAnisotropic*&gt;(extension));
+    case WebGLExtension::EXTsRGBName:
+        return toJS(exec, globalObject, static_cast&lt;EXTsRGB*&gt;(extension));
+    case WebGLExtension::EXTFragDepthName:
+        return toJS(exec, globalObject, static_cast&lt;EXTFragDepth*&gt;(extension));
+    case WebGLExtension::EXTBlendMinMaxName:
+        return toJS(exec, globalObject, static_cast&lt;EXTBlendMinMax*&gt;(extension));
+    case WebGLExtension::OESStandardDerivativesName:
+        return toJS(exec, globalObject, static_cast&lt;OESStandardDerivatives*&gt;(extension));
+    case WebGLExtension::OESTextureFloatName:
+        return toJS(exec, globalObject, static_cast&lt;OESTextureFloat*&gt;(extension));
+    case WebGLExtension::OESTextureFloatLinearName:
+        return toJS(exec, globalObject, static_cast&lt;OESTextureFloatLinear*&gt;(extension));
+    case WebGLExtension::OESTextureHalfFloatName:
+        return toJS(exec, globalObject, static_cast&lt;OESTextureHalfFloat*&gt;(extension));
+    case WebGLExtension::OESTextureHalfFloatLinearName:
+        return toJS(exec, globalObject, static_cast&lt;OESTextureHalfFloatLinear*&gt;(extension));
+    case WebGLExtension::OESVertexArrayObjectName:
+        return toJS(exec, globalObject, static_cast&lt;OESVertexArrayObject*&gt;(extension));
+    case WebGLExtension::OESElementIndexUintName:
+        return toJS(exec, globalObject, static_cast&lt;OESElementIndexUint*&gt;(extension));
+    case WebGLExtension::WebGLDebugRendererInfoName:
+        return toJS(exec, globalObject, static_cast&lt;WebGLDebugRendererInfo*&gt;(extension));
+    case WebGLExtension::WebGLDebugShadersName:
+        return toJS(exec, globalObject, static_cast&lt;WebGLDebugShaders*&gt;(extension));
+    case WebGLExtension::WebGLCompressedTextureATCName:
+        return toJS(exec, globalObject, static_cast&lt;WebGLCompressedTextureATC*&gt;(extension));
+    case WebGLExtension::WebGLCompressedTexturePVRTCName:
+        return toJS(exec, globalObject, static_cast&lt;WebGLCompressedTexturePVRTC*&gt;(extension));
+    case WebGLExtension::WebGLCompressedTextureS3TCName:
+        return toJS(exec, globalObject, static_cast&lt;WebGLCompressedTextureS3TC*&gt;(extension));
+    case WebGLExtension::WebGLDepthTextureName:
+        return toJS(exec, globalObject, static_cast&lt;WebGLDepthTexture*&gt;(extension));
+    case WebGLExtension::WebGLDrawBuffersName:
+        return toJS(exec, globalObject, static_cast&lt;WebGLDrawBuffers*&gt;(extension));
+    case WebGLExtension::ANGLEInstancedArraysName:
+        return toJS(exec, globalObject, static_cast&lt;ANGLEInstancedArrays*&gt;(extension));
+    }
+    ASSERT_NOT_REACHED();
+    return jsNull();
+}
+
+void JSWebGLRenderingContextBase::visitAdditionalChildren(SlotVisitor&amp; visitor)
+{
+    visitor.addOpaqueRoot(&amp;impl());
+}
+
+JSValue JSWebGLRenderingContextBase::getAttachedShaders(ExecState* exec)
+{
+    if (exec-&gt;argumentCount() &lt; 1)
+        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
+    ExceptionCode ec = 0;
+    WebGLRenderingContextBase&amp; context = impl();
+    WebGLProgram* program = JSWebGLProgram::toWrapped(exec-&gt;uncheckedArgument(0));
+    if (!program &amp;&amp; !exec-&gt;uncheckedArgument(0).isUndefinedOrNull())
+        return throwTypeError(exec);
+    Vector&lt;RefPtr&lt;WebGLShader&gt;&gt; shaders;
+    bool succeed = context.getAttachedShaders(program, shaders, ec);
+    if (ec) {
+        setDOMException(exec, ec);
+        return jsNull();
+    }
+    if (!succeed)
+        return jsNull();
+    JSC::MarkedArgumentBuffer list;
+    for (size_t ii = 0; ii &lt; shaders.size(); ++ii)
+        list.append(toJS(exec, globalObject(), shaders[ii].get()));
+    return constructArray(exec, 0, globalObject(), list);
+}
+
+JSValue JSWebGLRenderingContextBase::getExtension(ExecState* exec)
+{
+    if (exec-&gt;argumentCount() &lt; 1)
+        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
+    
+    WebGLRenderingContextBase&amp; context = impl();
+    const String name = exec-&gt;uncheckedArgument(0).toString(exec)-&gt;value(exec);
+    if (exec-&gt;hadException())
+        return jsUndefined();
+    WebGLExtension* extension = context.getExtension(name);
+    return toJS(exec, globalObject(), extension);
+}
+
+JSValue JSWebGLRenderingContextBase::getBufferParameter(ExecState* exec)
+{
+    return getObjectParameter(this, exec, kBuffer);
+}
+
+JSValue JSWebGLRenderingContextBase::getFramebufferAttachmentParameter(ExecState* exec)
+{
+    if (exec-&gt;argumentCount() != 3)
+        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
+    
+    ExceptionCode ec = 0;
+    WebGLRenderingContextBase&amp; context = impl();
+    unsigned target = exec-&gt;uncheckedArgument(0).toInt32(exec);
+    if (exec-&gt;hadException())
+        return jsUndefined();
+    unsigned attachment = exec-&gt;uncheckedArgument(1).toInt32(exec);
+    if (exec-&gt;hadException())
+        return jsUndefined();
+    unsigned pname = exec-&gt;uncheckedArgument(2).toInt32(exec);
+    if (exec-&gt;hadException())
+        return jsUndefined();
+    WebGLGetInfo info = context.getFramebufferAttachmentParameter(target, attachment, pname, ec);
+    if (ec) {
+        setDOMException(exec, ec);
+        return jsUndefined();
+    }
+    return toJS(exec, globalObject(), info);
+}
+
+JSValue JSWebGLRenderingContextBase::getParameter(ExecState* exec)
+{
+    if (exec-&gt;argumentCount() != 1)
+        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
+    
+    ExceptionCode ec = 0;
+    WebGLRenderingContextBase&amp; context = impl();
+    unsigned pname = exec-&gt;uncheckedArgument(0).toInt32(exec);
+    if (exec-&gt;hadException())
+        return jsUndefined();
+    WebGLGetInfo info = context.getParameter(pname, ec);
+    if (ec) {
+        setDOMException(exec, ec);
+        return jsUndefined();
+    }
+    return toJS(exec, globalObject(), info);
+}
+
+JSValue JSWebGLRenderingContextBase::getProgramParameter(ExecState* exec)
+{
+    if (exec-&gt;argumentCount() != 2)
+        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
+    
+    ExceptionCode ec = 0;
+    WebGLRenderingContextBase&amp; context = impl();
+    WebGLProgram* program = JSWebGLProgram::toWrapped(exec-&gt;uncheckedArgument(0));
+    if (!program &amp;&amp; !exec-&gt;uncheckedArgument(0).isUndefinedOrNull())
+        return throwTypeError(exec);
+    unsigned pname = exec-&gt;uncheckedArgument(1).toInt32(exec);
+    if (exec-&gt;hadException())
+        return jsUndefined();
+    WebGLGetInfo info = context.getProgramParameter(program, pname, ec);
+    if (ec) {
+        setDOMException(exec, ec);
+        return jsUndefined();
+    }
+    return toJS(exec, globalObject(), info);
+}
+
+JSValue JSWebGLRenderingContextBase::getRenderbufferParameter(ExecState* exec)
+{
+    return getObjectParameter(this, exec, kRenderbuffer);
+}
+
+JSValue JSWebGLRenderingContextBase::getShaderParameter(ExecState* exec)
+{
+    if (exec-&gt;argumentCount() != 2)
+        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
+    
+    ExceptionCode ec = 0;
+    WebGLRenderingContextBase&amp; context = impl();
+    if (!exec-&gt;uncheckedArgument(0).isUndefinedOrNull() &amp;&amp; !exec-&gt;uncheckedArgument(0).inherits(JSWebGLShader::info()))
+        return throwTypeError(exec);
+    WebGLShader* shader = JSWebGLShader::toWrapped(exec-&gt;uncheckedArgument(0));
+    unsigned pname = exec-&gt;uncheckedArgument(1).toInt32(exec);
+    if (exec-&gt;hadException())
+        return jsUndefined();
+    WebGLGetInfo info = context.getShaderParameter(shader, pname, ec);
+    if (ec) {
+        setDOMException(exec, ec);
+        return jsUndefined();
+    }
+    return toJS(exec, globalObject(), info);
+}
+
+JSValue JSWebGLRenderingContextBase::getSupportedExtensions(ExecState* exec)
+{
+    WebGLRenderingContextBase&amp; context = impl();
+    if (context.isContextLost())
+        return jsNull();
+    Vector&lt;String&gt; value = context.getSupportedExtensions();
+    MarkedArgumentBuffer list;
+    for (size_t ii = 0; ii &lt; value.size(); ++ii)
+        list.append(jsStringWithCache(exec, value[ii]));
+    return constructArray(exec, 0, globalObject(), list);
+}
+
+JSValue JSWebGLRenderingContextBase::getTexParameter(ExecState* exec)
+{
+    return getObjectParameter(this, exec, kTexture);
+}
+
+JSValue JSWebGLRenderingContextBase::getUniform(ExecState* exec)
+{
+    if (exec-&gt;argumentCount() != 2)
+        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
+    
+    ExceptionCode ec = 0;
+    WebGLRenderingContextBase&amp; context = impl();
+    WebGLProgram* program = JSWebGLProgram::toWrapped(exec-&gt;uncheckedArgument(0));
+    if (!program &amp;&amp; !exec-&gt;uncheckedArgument(0).isUndefinedOrNull())
+        return throwTypeError(exec);
+    WebGLUniformLocation* location = JSWebGLUniformLocation::toWrapped(exec-&gt;uncheckedArgument(1));
+    if (!location &amp;&amp; !exec-&gt;uncheckedArgument(1).isUndefinedOrNull())
+        return throwTypeError(exec);
+    WebGLGetInfo info = context.getUniform(program, location, ec);
+    if (ec) {
+        setDOMException(exec, ec);
+        return jsUndefined();
+    }
+    return toJS(exec, globalObject(), info);
+}
+
+JSValue JSWebGLRenderingContextBase::getVertexAttrib(ExecState* exec)
+{
+    return getObjectParameter(this, exec, kVertexAttrib);
+}
+
+template&lt;typename T, size_t inlineCapacity&gt;
+bool toVector(JSC::ExecState* exec, JSC::JSValue value, Vector&lt;T, inlineCapacity&gt;&amp; vector)
+{
+    if (!value.isObject())
+        return false;
+    
+    JSC::JSObject* object = asObject(value);
+    int32_t length = object-&gt;get(exec, exec-&gt;vm().propertyNames-&gt;length).toInt32(exec);
+    
+    if (!vector.tryReserveCapacity(length))
+        return false;
+    vector.resize(length);
+    
+    for (int32_t i = 0; i &lt; length; ++i) {
+        JSC::JSValue v = object-&gt;get(exec, i);
+        if (exec-&gt;hadException())
+            return false;
+        vector[i] = static_cast&lt;T&gt;(v.toNumber(exec));
+    }
+    
+    return true;
+}
+
+enum DataFunctionToCall {
+    f_uniform1v, f_uniform2v, f_uniform3v, f_uniform4v,
+    f_vertexAttrib1v, f_vertexAttrib2v, f_vertexAttrib3v, f_vertexAttrib4v
+};
+
+enum DataFunctionMatrixToCall {
+    f_uniformMatrix2fv, f_uniformMatrix3fv, f_uniformMatrix4fv
+};
+
+static bool functionForUniform(DataFunctionToCall f)
+{
+    switch (f) {
+    case f_uniform1v:
+    case f_uniform2v:
+    case f_uniform3v:
+    case f_uniform4v:
+        return true;
+    default: break;
+    }
+    return false;
+}
+
+static JSC::JSValue dataFunctionf(DataFunctionToCall f, JSC::ExecState* exec, WebGLRenderingContextBase&amp; context)
+{
+    if (exec-&gt;argumentCount() != 2)
+        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
+    
+    WebGLUniformLocation* location = 0;
+    long index = -1;
+    
+    if (functionForUniform(f)) {
+        location = JSWebGLUniformLocation::toWrapped(exec-&gt;uncheckedArgument(0));
+        if (!location &amp;&amp; !exec-&gt;uncheckedArgument(0).isUndefinedOrNull())
+            return throwTypeError(exec);
+    } else
+        index = exec-&gt;uncheckedArgument(0).toInt32(exec);
+    
+    if (exec-&gt;hadException())
+        return jsUndefined();
+    
+    RefPtr&lt;Float32Array&gt; webGLArray = toFloat32Array(exec-&gt;uncheckedArgument(1));
+    if (exec-&gt;hadException())    
+        return jsUndefined();
+    
+    ExceptionCode ec = 0;
+    if (webGLArray) {
+        switch (f) {
+        case f_uniform1v:
+            context.uniform1fv(location, webGLArray.get(), ec);
+            break;
+        case f_uniform2v:
+            context.uniform2fv(location, webGLArray.get(), ec);
+            break;
+        case f_uniform3v:
+            context.uniform3fv(location, webGLArray.get(), ec);
+            break;
+        case f_uniform4v:
+            context.uniform4fv(location, webGLArray.get(), ec);
+            break;
+        case f_vertexAttrib1v:
+            context.vertexAttrib1fv(index, webGLArray.get());
+            break;
+        case f_vertexAttrib2v:
+            context.vertexAttrib2fv(index, webGLArray.get());
+            break;
+        case f_vertexAttrib3v:
+            context.vertexAttrib3fv(index, webGLArray.get());
+            break;
+        case f_vertexAttrib4v:
+            context.vertexAttrib4fv(index, webGLArray.get());
+            break;
+        }
+        
+        setDOMException(exec, ec);
+        return jsUndefined();
+    }
+    
+    Vector&lt;float, 64&gt; array;
+    if (!toVector(exec, exec-&gt;uncheckedArgument(1), array))
+        return throwTypeError(exec);
+    
+    switch (f) {
+    case f_uniform1v:
+        context.uniform1fv(location, array.data(), array.size(), ec);
+        break;
+    case f_uniform2v:
+        context.uniform2fv(location, array.data(), array.size(), ec);
+        break;
+    case f_uniform3v:
+        context.uniform3fv(location, array.data(), array.size(), ec);
+        break;
+    case f_uniform4v:
+        context.uniform4fv(location, array.data(), array.size(), ec);
+        break;
+    case f_vertexAttrib1v:
+        context.vertexAttrib1fv(index, array.data(), array.size());
+        break;
+    case f_vertexAttrib2v:
+        context.vertexAttrib2fv(index, array.data(), array.size());
+        break;
+    case f_vertexAttrib3v:
+        context.vertexAttrib3fv(index, array.data(), array.size());
+        break;
+    case f_vertexAttrib4v:
+        context.vertexAttrib4fv(index, array.data(), array.size());
+        break;
+    }
+    
+    setDOMException(exec, ec);
+    return jsUndefined();
+}
+
+static JSC::JSValue dataFunctioni(DataFunctionToCall f, JSC::ExecState* exec, WebGLRenderingContextBase&amp; context)
+{
+    if (exec-&gt;argumentCount() != 2)
+        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
+    
+    WebGLUniformLocation* location = JSWebGLUniformLocation::toWrapped(exec-&gt;uncheckedArgument(0));
+    if (!location &amp;&amp; !exec-&gt;uncheckedArgument(0).isUndefinedOrNull())
+        return throwTypeError(exec);
+    
+    RefPtr&lt;Int32Array&gt; webGLArray = toInt32Array(exec-&gt;uncheckedArgument(1));
+    
+    ExceptionCode ec = 0;
+    if (webGLArray) {
+        switch (f) {
+        case f_uniform1v:
+            context.uniform1iv(location, webGLArray.get(), ec);
+            break;
+        case f_uniform2v:
+            context.uniform2iv(location, webGLArray.get(), ec);
+            break;
+        case f_uniform3v:
+            context.uniform3iv(location, webGLArray.get(), ec);
+            break;
+        case f_uniform4v:
+            context.uniform4iv(location, webGLArray.get(), ec);
+            break;
+        default:
+            break;
+        }
+        
+        setDOMException(exec, ec);
+        return jsUndefined();
+    }
+    
+    
+    Vector&lt;int, 64&gt; array;
+    if (!toVector(exec, exec-&gt;uncheckedArgument(1), array))
+        return throwTypeError(exec);
+    
+    switch (f) {
+    case f_uniform1v:
+        context.uniform1iv(location, array.data(), array.size(), ec);
+        break;
+    case f_uniform2v:
+        context.uniform2iv(location, array.data(), array.size(), ec);
+        break;
+    case f_uniform3v:
+        context.uniform3iv(location, array.data(), array.size(), ec);
+        break;
+    case f_uniform4v:
+        context.uniform4iv(location, array.data(), array.size(), ec);
+        break;
+    default:
+        break;
+    }
+    
+    setDOMException(exec, ec);
+    return jsUndefined();
+}
+
+static JSC::JSValue dataFunctionMatrix(DataFunctionMatrixToCall f, JSC::ExecState* exec, WebGLRenderingContextBase&amp; context)
+{
+    if (exec-&gt;argumentCount() != 3)
+        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
+    
+    WebGLUniformLocation* location = JSWebGLUniformLocation::toWrapped(exec-&gt;uncheckedArgument(0));
+    if (!location &amp;&amp; !exec-&gt;uncheckedArgument(0).isUndefinedOrNull())
+        return throwTypeError(exec);
+    
+    bool transpose = exec-&gt;uncheckedArgument(1).toBoolean(exec);
+    if (exec-&gt;hadException())    
+        return jsUndefined();
+    
+    RefPtr&lt;Float32Array&gt; webGLArray = toFloat32Array(exec-&gt;uncheckedArgument(2));
+    
+    ExceptionCode ec = 0;
+    if (webGLArray) {
+        switch (f) {
+        case f_uniformMatrix2fv:
+            context.uniformMatrix2fv(location, transpose, webGLArray.get(), ec);
+            break;
+        case f_uniformMatrix3fv:
+            context.uniformMatrix3fv(location, transpose, webGLArray.get(), ec);
+            break;
+        case f_uniformMatrix4fv:
+            context.uniformMatrix4fv(location, transpose, webGLArray.get(), ec);
+            break;
+        }
+        
+        setDOMException(exec, ec);
+        return jsUndefined();
+    }
+    
+    Vector&lt;float, 64&gt; array;
+    if (!toVector(exec, exec-&gt;uncheckedArgument(2), array))
+        return throwTypeError(exec);
+    
+    switch (f) {
+    case f_uniformMatrix2fv:
+        context.uniformMatrix2fv(location, transpose, array.data(), array.size(), ec);
+        break;
+    case f_uniformMatrix3fv:
+        context.uniformMatrix3fv(location, transpose, array.data(), array.size(), ec);
+        break;
+    case f_uniformMatrix4fv:
+        context.uniformMatrix4fv(location, transpose, array.data(), array.size(), ec);
+        break;
+    }
+    
+    setDOMException(exec, ec);
+    return jsUndefined();
+}
+
+JSC::JSValue JSWebGLRenderingContextBase::uniform1fv(JSC::ExecState* exec)
+{
+    return dataFunctionf(f_uniform1v, exec, impl());
+}
+
+JSC::JSValue JSWebGLRenderingContextBase::uniform1iv(JSC::ExecState* exec)
+{
+    return dataFunctioni(f_uniform1v, exec, impl());
+}
+
+JSC::JSValue JSWebGLRenderingContextBase::uniform2fv(JSC::ExecState* exec)
+{
+    return dataFunctionf(f_uniform2v, exec, impl());
+}
+
+JSC::JSValue JSWebGLRenderingContextBase::uniform2iv(JSC::ExecState* exec)
+{
+    return dataFunctioni(f_uniform2v, exec, impl());
+}
+
+JSC::JSValue JSWebGLRenderingContextBase::uniform3fv(JSC::ExecState* exec)
+{
+    return dataFunctionf(f_uniform3v, exec, impl());
+}
+
+JSC::JSValue JSWebGLRenderingContextBase::uniform3iv(JSC::ExecState* exec)
+{
+    return dataFunctioni(f_uniform3v, exec, impl());
+}
+
+JSC::JSValue JSWebGLRenderingContextBase::uniform4fv(JSC::ExecState* exec)
+{
+    return dataFunctionf(f_uniform4v, exec, impl());
+}
+
+JSC::JSValue JSWebGLRenderingContextBase::uniform4iv(JSC::ExecState* exec)
+{
+    return dataFunctioni(f_uniform4v, exec, impl());
+}
+
+JSC::JSValue JSWebGLRenderingContextBase::uniformMatrix2fv(JSC::ExecState* exec)
+{
+    return dataFunctionMatrix(f_uniformMatrix2fv, exec, impl());
+}
+
+JSC::JSValue JSWebGLRenderingContextBase::uniformMatrix3fv(JSC::ExecState* exec)
+{
+    return dataFunctionMatrix(f_uniformMatrix3fv, exec, impl());
+}
+
+JSC::JSValue JSWebGLRenderingContextBase::uniformMatrix4fv(JSC::ExecState* exec)
+{
+    return dataFunctionMatrix(f_uniformMatrix4fv, exec, impl());
+}
+
+JSC::JSValue JSWebGLRenderingContextBase::vertexAttrib1fv(JSC::ExecState* exec)
+{
+    return dataFunctionf(f_vertexAttrib1v, exec, impl());
+}
+
+JSC::JSValue JSWebGLRenderingContextBase::vertexAttrib2fv(JSC::ExecState* exec)
+{
+    return dataFunctionf(f_vertexAttrib2v, exec, impl());
+}
+
+JSC::JSValue JSWebGLRenderingContextBase::vertexAttrib3fv(JSC::ExecState* exec)
+{
+    return dataFunctionf(f_vertexAttrib3v, exec, impl());
+}
+
+JSC::JSValue JSWebGLRenderingContextBase::vertexAttrib4fv(JSC::ExecState* exec)
+{
+    return dataFunctionf(f_vertexAttrib4v, exec, impl());
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(WEBGL)
</ins></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSWebGLRenderingContextCustomcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -1,764 +0,0 @@
</span><del>-/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-
-#include &quot;config.h&quot;
-
-#if ENABLE(WEBGL)
-
-#include &quot;JSWebGLRenderingContext.h&quot;
-
-#include &quot;ANGLEInstancedArrays.h&quot;
-#include &quot;EXTBlendMinMax.h&quot;
-#include &quot;EXTFragDepth.h&quot;
-#include &quot;EXTShaderTextureLOD.h&quot;
-#include &quot;EXTTextureFilterAnisotropic.h&quot;
-#include &quot;EXTsRGB.h&quot;
-#include &quot;ExceptionCode.h&quot;
-#include &quot;HTMLCanvasElement.h&quot;
-#include &quot;HTMLImageElement.h&quot;
-#include &quot;JSANGLEInstancedArrays.h&quot;
-#include &quot;JSEXTBlendMinMax.h&quot;
-#include &quot;JSEXTFragDepth.h&quot;
-#include &quot;JSEXTShaderTextureLOD.h&quot;
-#include &quot;JSEXTTextureFilterAnisotropic.h&quot;
-#include &quot;JSEXTsRGB.h&quot;
-#include &quot;JSHTMLCanvasElement.h&quot;
-#include &quot;JSHTMLImageElement.h&quot;
-#include &quot;JSImageData.h&quot;
-#include &quot;JSOESElementIndexUint.h&quot;
-#include &quot;JSOESStandardDerivatives.h&quot;
-#include &quot;JSOESTextureFloat.h&quot;
-#include &quot;JSOESTextureFloatLinear.h&quot;
-#include &quot;JSOESTextureHalfFloat.h&quot;
-#include &quot;JSOESTextureHalfFloatLinear.h&quot;
-#include &quot;JSOESVertexArrayObject.h&quot;
-#include &quot;JSWebGLBuffer.h&quot;
-#include &quot;JSWebGLCompressedTextureATC.h&quot;
-#include &quot;JSWebGLCompressedTexturePVRTC.h&quot;
-#include &quot;JSWebGLCompressedTextureS3TC.h&quot;
-#include &quot;JSWebGLDebugRendererInfo.h&quot;
-#include &quot;JSWebGLDebugShaders.h&quot;
-#include &quot;JSWebGLDepthTexture.h&quot;
-#include &quot;JSWebGLDrawBuffers.h&quot;
-#include &quot;JSWebGLFramebuffer.h&quot;
-#include &quot;JSWebGLLoseContext.h&quot;
-#include &quot;JSWebGLProgram.h&quot;
-#include &quot;JSWebGLRenderbuffer.h&quot;
-#include &quot;JSWebGLShader.h&quot;
-#include &quot;JSWebGLTexture.h&quot;
-#include &quot;JSWebGLUniformLocation.h&quot;
-#include &quot;JSWebGLVertexArrayObjectOES.h&quot;
-#include &quot;JSWebKitCSSMatrix.h&quot;
-#include &quot;NotImplemented.h&quot;
-#include &quot;OESElementIndexUint.h&quot;
-#include &quot;OESStandardDerivatives.h&quot;
-#include &quot;OESTextureFloat.h&quot;
-#include &quot;OESTextureFloatLinear.h&quot;
-#include &quot;OESTextureHalfFloat.h&quot;
-#include &quot;OESTextureHalfFloatLinear.h&quot;
-#include &quot;OESVertexArrayObject.h&quot;
-#include &quot;WebGLBuffer.h&quot;
-#include &quot;WebGLCompressedTextureATC.h&quot;
-#include &quot;WebGLCompressedTexturePVRTC.h&quot;
-#include &quot;WebGLCompressedTextureS3TC.h&quot;
-#include &quot;WebGLDebugRendererInfo.h&quot;
-#include &quot;WebGLDebugShaders.h&quot;
-#include &quot;WebGLDepthTexture.h&quot;
-#include &quot;WebGLDrawBuffers.h&quot;
-#include &quot;WebGLExtension.h&quot;
-#include &quot;WebGLFramebuffer.h&quot;
-#include &quot;WebGLGetInfo.h&quot;
-#include &quot;WebGLLoseContext.h&quot;
-#include &quot;WebGLProgram.h&quot;
-#include &quot;WebGLRenderingContext.h&quot;
-#include &quot;WebGLVertexArrayObjectOES.h&quot;
-#include &lt;runtime/Error.h&gt;
-#include &lt;runtime/JSTypedArrays.h&gt;
-#include &lt;runtime/TypedArrayInlines.h&gt;
-#include &lt;runtime/TypedArrays.h&gt;
-#include &lt;wtf/FastMalloc.h&gt;
-
-#if ENABLE(VIDEO)
-#include &quot;HTMLVideoElement.h&quot;
-#include &quot;JSHTMLVideoElement.h&quot;
-#endif
-
-using namespace JSC;
-
-namespace WebCore {
-
-static JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, const WebGLGetInfo&amp; info)
-{
-    switch (info.getType()) {
-    case WebGLGetInfo::kTypeBool:
-        return jsBoolean(info.getBool());
-    case WebGLGetInfo::kTypeBoolArray: {
-        MarkedArgumentBuffer list;
-        const Vector&lt;bool&gt;&amp; value = info.getBoolArray();
-        for (size_t ii = 0; ii &lt; value.size(); ++ii)
-            list.append(jsBoolean(value[ii]));
-        return constructArray(exec, 0, globalObject, list);
-    }
-    case WebGLGetInfo::kTypeFloat:
-        return jsNumber(info.getFloat());
-    case WebGLGetInfo::kTypeInt:
-        return jsNumber(info.getInt());
-    case WebGLGetInfo::kTypeNull:
-        return jsNull();
-    case WebGLGetInfo::kTypeString:
-        return jsStringWithCache(exec, info.getString());
-    case WebGLGetInfo::kTypeUnsignedInt:
-        return jsNumber(info.getUnsignedInt());
-    case WebGLGetInfo::kTypeWebGLBuffer:
-        return toJS(exec, globalObject, info.getWebGLBuffer());
-    case WebGLGetInfo::kTypeWebGLFloatArray:
-        return toJS(exec, globalObject, info.getWebGLFloatArray());
-    case WebGLGetInfo::kTypeWebGLFramebuffer:
-        return toJS(exec, globalObject, info.getWebGLFramebuffer());
-    case WebGLGetInfo::kTypeWebGLIntArray:
-        return toJS(exec, globalObject, info.getWebGLIntArray());
-    // FIXME: implement WebGLObjectArray
-    // case WebGLGetInfo::kTypeWebGLObjectArray:
-    case WebGLGetInfo::kTypeWebGLProgram:
-        return toJS(exec, globalObject, info.getWebGLProgram());
-    case WebGLGetInfo::kTypeWebGLRenderbuffer:
-        return toJS(exec, globalObject, info.getWebGLRenderbuffer());
-    case WebGLGetInfo::kTypeWebGLTexture:
-        return toJS(exec, globalObject, info.getWebGLTexture());
-    case WebGLGetInfo::kTypeWebGLUnsignedByteArray:
-        return toJS(exec, globalObject, info.getWebGLUnsignedByteArray());
-    case WebGLGetInfo::kTypeWebGLUnsignedIntArray:
-        return toJS(exec, globalObject, info.getWebGLUnsignedIntArray());
-    case WebGLGetInfo::kTypeWebGLVertexArrayObjectOES:
-        return toJS(exec, globalObject, info.getWebGLVertexArrayObjectOES());
-    default:
-        notImplemented();
-        return jsUndefined();
-    }
-}
-
-enum ObjectType {
-    kBuffer, kRenderbuffer, kTexture, kVertexAttrib
-};
-
-static JSValue getObjectParameter(JSWebGLRenderingContext* obj, ExecState* exec, ObjectType objectType)
-{
-    if (exec-&gt;argumentCount() != 2)
-        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
-
-    ExceptionCode ec = 0;
-    WebGLRenderingContext&amp; context = obj-&gt;impl();
-    unsigned target = exec-&gt;uncheckedArgument(0).toInt32(exec);
-    if (exec-&gt;hadException())
-        return jsUndefined();
-    unsigned pname = exec-&gt;uncheckedArgument(1).toInt32(exec);
-    if (exec-&gt;hadException())
-        return jsUndefined();
-    WebGLGetInfo info;
-    switch (objectType) {
-    case kBuffer:
-        info = context.getBufferParameter(target, pname, ec);
-        break;
-    case kRenderbuffer:
-        info = context.getRenderbufferParameter(target, pname, ec);
-        break;
-    case kTexture:
-        info = context.getTexParameter(target, pname, ec);
-        break;
-    case kVertexAttrib:
-        // target =&gt; index
-        info = context.getVertexAttrib(target, pname, ec);
-        break;
-    default:
-        notImplemented();
-        break;
-    }
-    if (ec) {
-        setDOMException(exec, ec);
-        return jsUndefined();
-    }
-    return toJS(exec, obj-&gt;globalObject(), info);
-}
-
-enum WhichProgramCall {
-    kProgramParameter, kUniform
-};
-
-static JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, WebGLExtension* extension)
-{
-    if (!extension)
-        return jsNull();
-    switch (extension-&gt;getName()) {
-    case WebGLExtension::WebGLLoseContextName:
-        return toJS(exec, globalObject, static_cast&lt;WebGLLoseContext*&gt;(extension));
-    case WebGLExtension::EXTShaderTextureLODName:
-        return toJS(exec, globalObject, static_cast&lt;EXTShaderTextureLOD*&gt;(extension));
-    case WebGLExtension::EXTTextureFilterAnisotropicName:
-        return toJS(exec, globalObject, static_cast&lt;EXTTextureFilterAnisotropic*&gt;(extension));
-    case WebGLExtension::EXTsRGBName:
-        return toJS(exec, globalObject, static_cast&lt;EXTsRGB*&gt;(extension));
-    case WebGLExtension::EXTFragDepthName:
-        return toJS(exec, globalObject, static_cast&lt;EXTFragDepth*&gt;(extension));
-    case WebGLExtension::EXTBlendMinMaxName:
-        return toJS(exec, globalObject, static_cast&lt;EXTBlendMinMax*&gt;(extension));
-    case WebGLExtension::OESStandardDerivativesName:
-        return toJS(exec, globalObject, static_cast&lt;OESStandardDerivatives*&gt;(extension));
-    case WebGLExtension::OESTextureFloatName:
-        return toJS(exec, globalObject, static_cast&lt;OESTextureFloat*&gt;(extension));
-    case WebGLExtension::OESTextureFloatLinearName:
-        return toJS(exec, globalObject, static_cast&lt;OESTextureFloatLinear*&gt;(extension));
-    case WebGLExtension::OESTextureHalfFloatName:
-        return toJS(exec, globalObject, static_cast&lt;OESTextureHalfFloat*&gt;(extension));
-    case WebGLExtension::OESTextureHalfFloatLinearName:
-        return toJS(exec, globalObject, static_cast&lt;OESTextureHalfFloatLinear*&gt;(extension));
-    case WebGLExtension::OESVertexArrayObjectName:
-        return toJS(exec, globalObject, static_cast&lt;OESVertexArrayObject*&gt;(extension));
-    case WebGLExtension::OESElementIndexUintName:
-        return toJS(exec, globalObject, static_cast&lt;OESElementIndexUint*&gt;(extension));
-    case WebGLExtension::WebGLDebugRendererInfoName:
-        return toJS(exec, globalObject, static_cast&lt;WebGLDebugRendererInfo*&gt;(extension));
-    case WebGLExtension::WebGLDebugShadersName:
-        return toJS(exec, globalObject, static_cast&lt;WebGLDebugShaders*&gt;(extension));
-    case WebGLExtension::WebGLCompressedTextureATCName:
-        return toJS(exec, globalObject, static_cast&lt;WebGLCompressedTextureATC*&gt;(extension));
-    case WebGLExtension::WebGLCompressedTexturePVRTCName:
-        return toJS(exec, globalObject, static_cast&lt;WebGLCompressedTexturePVRTC*&gt;(extension));
-    case WebGLExtension::WebGLCompressedTextureS3TCName:
-        return toJS(exec, globalObject, static_cast&lt;WebGLCompressedTextureS3TC*&gt;(extension));
-    case WebGLExtension::WebGLDepthTextureName:
-        return toJS(exec, globalObject, static_cast&lt;WebGLDepthTexture*&gt;(extension));
-    case WebGLExtension::WebGLDrawBuffersName:
-        return toJS(exec, globalObject, static_cast&lt;WebGLDrawBuffers*&gt;(extension));
-    case WebGLExtension::ANGLEInstancedArraysName:
-        return toJS(exec, globalObject, static_cast&lt;ANGLEInstancedArrays*&gt;(extension));
-    }
-    ASSERT_NOT_REACHED();
-    return jsNull();
-}
-
-void JSWebGLRenderingContext::visitAdditionalChildren(SlotVisitor&amp; visitor)
-{
-    visitor.addOpaqueRoot(&amp;impl());
-}
-
-JSValue JSWebGLRenderingContext::getAttachedShaders(ExecState* exec)
-{
-    if (exec-&gt;argumentCount() &lt; 1)
-        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
-    ExceptionCode ec = 0;
-    WebGLRenderingContext&amp; context = impl();
-    WebGLProgram* program = JSWebGLProgram::toWrapped(exec-&gt;uncheckedArgument(0));
-    if (!program &amp;&amp; !exec-&gt;uncheckedArgument(0).isUndefinedOrNull())
-        return throwTypeError(exec);
-    Vector&lt;RefPtr&lt;WebGLShader&gt;&gt; shaders;
-    bool succeed = context.getAttachedShaders(program, shaders, ec);
-    if (ec) {
-        setDOMException(exec, ec);
-        return jsNull();
-    }
-    if (!succeed)
-        return jsNull();
-    JSC::MarkedArgumentBuffer list;
-    for (size_t ii = 0; ii &lt; shaders.size(); ++ii)
-        list.append(toJS(exec, globalObject(), shaders[ii].get()));
-    return constructArray(exec, 0, globalObject(), list);
-}
-
-JSValue JSWebGLRenderingContext::getExtension(ExecState* exec)
-{
-    if (exec-&gt;argumentCount() &lt; 1)
-        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
-
-    WebGLRenderingContext&amp; context = impl();
-    const String name = exec-&gt;uncheckedArgument(0).toString(exec)-&gt;value(exec);
-    if (exec-&gt;hadException())
-        return jsUndefined();
-    WebGLExtension* extension = context.getExtension(name);
-    return toJS(exec, globalObject(), extension);
-}
-
-JSValue JSWebGLRenderingContext::getBufferParameter(ExecState* exec)
-{
-    return getObjectParameter(this, exec, kBuffer);
-}
-
-JSValue JSWebGLRenderingContext::getFramebufferAttachmentParameter(ExecState* exec)
-{
-    if (exec-&gt;argumentCount() != 3)
-        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
-
-    ExceptionCode ec = 0;
-    WebGLRenderingContext&amp; context = impl();
-    unsigned target = exec-&gt;uncheckedArgument(0).toInt32(exec);
-    if (exec-&gt;hadException())
-        return jsUndefined();
-    unsigned attachment = exec-&gt;uncheckedArgument(1).toInt32(exec);
-    if (exec-&gt;hadException())
-        return jsUndefined();
-    unsigned pname = exec-&gt;uncheckedArgument(2).toInt32(exec);
-    if (exec-&gt;hadException())
-        return jsUndefined();
-    WebGLGetInfo info = context.getFramebufferAttachmentParameter(target, attachment, pname, ec);
-    if (ec) {
-        setDOMException(exec, ec);
-        return jsUndefined();
-    }
-    return toJS(exec, globalObject(), info);
-}
-
-JSValue JSWebGLRenderingContext::getParameter(ExecState* exec)
-{
-    if (exec-&gt;argumentCount() != 1)
-        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
-
-    ExceptionCode ec = 0;
-    WebGLRenderingContext&amp; context = impl();
-    unsigned pname = exec-&gt;uncheckedArgument(0).toInt32(exec);
-    if (exec-&gt;hadException())
-        return jsUndefined();
-    WebGLGetInfo info = context.getParameter(pname, ec);
-    if (ec) {
-        setDOMException(exec, ec);
-        return jsUndefined();
-    }
-    return toJS(exec, globalObject(), info);
-}
-
-JSValue JSWebGLRenderingContext::getProgramParameter(ExecState* exec)
-{
-    if (exec-&gt;argumentCount() != 2)
-        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
-
-    ExceptionCode ec = 0;
-    WebGLRenderingContext&amp; context = impl();
-    WebGLProgram* program = JSWebGLProgram::toWrapped(exec-&gt;uncheckedArgument(0));
-    if (!program &amp;&amp; !exec-&gt;uncheckedArgument(0).isUndefinedOrNull())
-        return throwTypeError(exec);
-    unsigned pname = exec-&gt;uncheckedArgument(1).toInt32(exec);
-    if (exec-&gt;hadException())
-        return jsUndefined();
-    WebGLGetInfo info = context.getProgramParameter(program, pname, ec);
-    if (ec) {
-        setDOMException(exec, ec);
-        return jsUndefined();
-    }
-    return toJS(exec, globalObject(), info);
-}
-
-JSValue JSWebGLRenderingContext::getRenderbufferParameter(ExecState* exec)
-{
-    return getObjectParameter(this, exec, kRenderbuffer);
-}
-
-JSValue JSWebGLRenderingContext::getShaderParameter(ExecState* exec)
-{
-    if (exec-&gt;argumentCount() != 2)
-        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
-
-    ExceptionCode ec = 0;
-    WebGLRenderingContext&amp; context = impl();
-    if (!exec-&gt;uncheckedArgument(0).isUndefinedOrNull() &amp;&amp; !exec-&gt;uncheckedArgument(0).inherits(JSWebGLShader::info()))
-        return throwTypeError(exec);
-    WebGLShader* shader = JSWebGLShader::toWrapped(exec-&gt;uncheckedArgument(0));
-    unsigned pname = exec-&gt;uncheckedArgument(1).toInt32(exec);
-    if (exec-&gt;hadException())
-        return jsUndefined();
-    WebGLGetInfo info = context.getShaderParameter(shader, pname, ec);
-    if (ec) {
-        setDOMException(exec, ec);
-        return jsUndefined();
-    }
-    return toJS(exec, globalObject(), info);
-}
-
-JSValue JSWebGLRenderingContext::getSupportedExtensions(ExecState* exec)
-{
-    WebGLRenderingContext&amp; context = impl();
-    if (context.isContextLost())
-        return jsNull();
-    Vector&lt;String&gt; value = context.getSupportedExtensions();
-    MarkedArgumentBuffer list;
-    for (size_t ii = 0; ii &lt; value.size(); ++ii)
-        list.append(jsStringWithCache(exec, value[ii]));
-    return constructArray(exec, 0, globalObject(), list);
-}
-
-JSValue JSWebGLRenderingContext::getTexParameter(ExecState* exec)
-{
-    return getObjectParameter(this, exec, kTexture);
-}
-
-JSValue JSWebGLRenderingContext::getUniform(ExecState* exec)
-{
-    if (exec-&gt;argumentCount() != 2)
-        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
-
-    ExceptionCode ec = 0;
-    WebGLRenderingContext&amp; context = impl();
-    WebGLProgram* program = JSWebGLProgram::toWrapped(exec-&gt;uncheckedArgument(0));
-    if (!program &amp;&amp; !exec-&gt;uncheckedArgument(0).isUndefinedOrNull())
-        return throwTypeError(exec);
-    WebGLUniformLocation* location = JSWebGLUniformLocation::toWrapped(exec-&gt;uncheckedArgument(1));
-    if (!location &amp;&amp; !exec-&gt;uncheckedArgument(1).isUndefinedOrNull())
-        return throwTypeError(exec);
-    WebGLGetInfo info = context.getUniform(program, location, ec);
-    if (ec) {
-        setDOMException(exec, ec);
-        return jsUndefined();
-    }
-    return toJS(exec, globalObject(), info);
-}
-
-JSValue JSWebGLRenderingContext::getVertexAttrib(ExecState* exec)
-{
-    return getObjectParameter(this, exec, kVertexAttrib);
-}
-
-template&lt;typename T, size_t inlineCapacity&gt;
-bool toVector(JSC::ExecState* exec, JSC::JSValue value, Vector&lt;T, inlineCapacity&gt;&amp; vector)
-{
-    if (!value.isObject())
-        return false;
-
-    JSC::JSObject* object = asObject(value);
-    int32_t length = object-&gt;get(exec, exec-&gt;vm().propertyNames-&gt;length).toInt32(exec);
-
-    if (!vector.tryReserveCapacity(length))
-        return false;
-    vector.resize(length);
-
-    for (int32_t i = 0; i &lt; length; ++i) {
-        JSC::JSValue v = object-&gt;get(exec, i);
-        if (exec-&gt;hadException())
-            return false;
-        vector[i] = static_cast&lt;T&gt;(v.toNumber(exec));
-    }
-
-    return true;
-}
-
-enum DataFunctionToCall {
-    f_uniform1v, f_uniform2v, f_uniform3v, f_uniform4v,
-    f_vertexAttrib1v, f_vertexAttrib2v, f_vertexAttrib3v, f_vertexAttrib4v
-};
-
-enum DataFunctionMatrixToCall {
-    f_uniformMatrix2fv, f_uniformMatrix3fv, f_uniformMatrix4fv
-};
-
-static bool functionForUniform(DataFunctionToCall f)
-{
-    switch (f) {
-    case f_uniform1v:
-    case f_uniform2v:
-    case f_uniform3v:
-    case f_uniform4v:
-        return true;
-    default: break;
-    }
-    return false;
-}
-
-static JSC::JSValue dataFunctionf(DataFunctionToCall f, JSC::ExecState* exec, WebGLRenderingContext&amp; context)
-{
-    if (exec-&gt;argumentCount() != 2)
-        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
-    
-    WebGLUniformLocation* location = 0;
-    long index = -1;
-    
-    if (functionForUniform(f)) {
-        location = JSWebGLUniformLocation::toWrapped(exec-&gt;uncheckedArgument(0));
-        if (!location &amp;&amp; !exec-&gt;uncheckedArgument(0).isUndefinedOrNull())
-            return throwTypeError(exec);
-    } else
-        index = exec-&gt;uncheckedArgument(0).toInt32(exec);
-
-    if (exec-&gt;hadException())
-        return jsUndefined();
-        
-    RefPtr&lt;Float32Array&gt; webGLArray = toFloat32Array(exec-&gt;uncheckedArgument(1));
-    if (exec-&gt;hadException())    
-        return jsUndefined();
-        
-    ExceptionCode ec = 0;
-    if (webGLArray) {
-        switch (f) {
-        case f_uniform1v:
-            context.uniform1fv(location, webGLArray.get(), ec);
-            break;
-        case f_uniform2v:
-            context.uniform2fv(location, webGLArray.get(), ec);
-            break;
-        case f_uniform3v:
-            context.uniform3fv(location, webGLArray.get(), ec);
-            break;
-        case f_uniform4v:
-            context.uniform4fv(location, webGLArray.get(), ec);
-            break;
-        case f_vertexAttrib1v:
-            context.vertexAttrib1fv(index, webGLArray.get());
-            break;
-        case f_vertexAttrib2v:
-            context.vertexAttrib2fv(index, webGLArray.get());
-            break;
-        case f_vertexAttrib3v:
-            context.vertexAttrib3fv(index, webGLArray.get());
-            break;
-        case f_vertexAttrib4v:
-            context.vertexAttrib4fv(index, webGLArray.get());
-            break;
-        }
-        
-        setDOMException(exec, ec);
-        return jsUndefined();
-    }
-
-    Vector&lt;float, 64&gt; array;
-    if (!toVector(exec, exec-&gt;uncheckedArgument(1), array))
-        return throwTypeError(exec);
-
-    switch (f) {
-    case f_uniform1v:
-        context.uniform1fv(location, array.data(), array.size(), ec);
-        break;
-    case f_uniform2v:
-        context.uniform2fv(location, array.data(), array.size(), ec);
-        break;
-    case f_uniform3v:
-        context.uniform3fv(location, array.data(), array.size(), ec);
-        break;
-    case f_uniform4v:
-        context.uniform4fv(location, array.data(), array.size(), ec);
-        break;
-    case f_vertexAttrib1v:
-        context.vertexAttrib1fv(index, array.data(), array.size());
-        break;
-    case f_vertexAttrib2v:
-        context.vertexAttrib2fv(index, array.data(), array.size());
-        break;
-    case f_vertexAttrib3v:
-        context.vertexAttrib3fv(index, array.data(), array.size());
-        break;
-    case f_vertexAttrib4v:
-        context.vertexAttrib4fv(index, array.data(), array.size());
-        break;
-    }
-    
-    setDOMException(exec, ec);
-    return jsUndefined();
-}
-
-static JSC::JSValue dataFunctioni(DataFunctionToCall f, JSC::ExecState* exec, WebGLRenderingContext&amp; context)
-{
-    if (exec-&gt;argumentCount() != 2)
-        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
-
-    WebGLUniformLocation* location = JSWebGLUniformLocation::toWrapped(exec-&gt;uncheckedArgument(0));
-    if (!location &amp;&amp; !exec-&gt;uncheckedArgument(0).isUndefinedOrNull())
-        return throwTypeError(exec);
-  
-    RefPtr&lt;Int32Array&gt; webGLArray = toInt32Array(exec-&gt;uncheckedArgument(1));
-
-    ExceptionCode ec = 0;
-    if (webGLArray) {
-        switch (f) {
-        case f_uniform1v:
-            context.uniform1iv(location, webGLArray.get(), ec);
-            break;
-        case f_uniform2v:
-            context.uniform2iv(location, webGLArray.get(), ec);
-            break;
-        case f_uniform3v:
-            context.uniform3iv(location, webGLArray.get(), ec);
-            break;
-        case f_uniform4v:
-            context.uniform4iv(location, webGLArray.get(), ec);
-            break;
-        default:
-            break;
-        }
-        
-        setDOMException(exec, ec);
-        return jsUndefined();
-    }
-
-
-    Vector&lt;int, 64&gt; array;
-    if (!toVector(exec, exec-&gt;uncheckedArgument(1), array))
-        return throwTypeError(exec);
-
-    switch (f) {
-    case f_uniform1v:
-        context.uniform1iv(location, array.data(), array.size(), ec);
-        break;
-    case f_uniform2v:
-        context.uniform2iv(location, array.data(), array.size(), ec);
-        break;
-    case f_uniform3v:
-        context.uniform3iv(location, array.data(), array.size(), ec);
-        break;
-    case f_uniform4v:
-        context.uniform4iv(location, array.data(), array.size(), ec);
-        break;
-    default:
-        break;
-    }
-    
-    setDOMException(exec, ec);
-    return jsUndefined();
-}
-
-static JSC::JSValue dataFunctionMatrix(DataFunctionMatrixToCall f, JSC::ExecState* exec, WebGLRenderingContext&amp; context)
-{
-    if (exec-&gt;argumentCount() != 3)
-        return exec-&gt;vm().throwException(exec, createNotEnoughArgumentsError(exec));
-
-    WebGLUniformLocation* location = JSWebGLUniformLocation::toWrapped(exec-&gt;uncheckedArgument(0));
-    if (!location &amp;&amp; !exec-&gt;uncheckedArgument(0).isUndefinedOrNull())
-        return throwTypeError(exec);
-
-    bool transpose = exec-&gt;uncheckedArgument(1).toBoolean(exec);
-    if (exec-&gt;hadException())    
-        return jsUndefined();
-        
-    RefPtr&lt;Float32Array&gt; webGLArray = toFloat32Array(exec-&gt;uncheckedArgument(2));
-        
-    ExceptionCode ec = 0;
-    if (webGLArray) {
-        switch (f) {
-        case f_uniformMatrix2fv:
-            context.uniformMatrix2fv(location, transpose, webGLArray.get(), ec);
-            break;
-        case f_uniformMatrix3fv:
-            context.uniformMatrix3fv(location, transpose, webGLArray.get(), ec);
-            break;
-        case f_uniformMatrix4fv:
-            context.uniformMatrix4fv(location, transpose, webGLArray.get(), ec);
-            break;
-        }
-        
-        setDOMException(exec, ec);
-        return jsUndefined();
-    }
-
-    Vector&lt;float, 64&gt; array;
-    if (!toVector(exec, exec-&gt;uncheckedArgument(2), array))
-        return throwTypeError(exec);
-
-    switch (f) {
-    case f_uniformMatrix2fv:
-        context.uniformMatrix2fv(location, transpose, array.data(), array.size(), ec);
-        break;
-    case f_uniformMatrix3fv:
-        context.uniformMatrix3fv(location, transpose, array.data(), array.size(), ec);
-        break;
-    case f_uniformMatrix4fv:
-        context.uniformMatrix4fv(location, transpose, array.data(), array.size(), ec);
-        break;
-    }
-
-    setDOMException(exec, ec);
-    return jsUndefined();
-}
-
-JSC::JSValue JSWebGLRenderingContext::uniform1fv(JSC::ExecState* exec)
-{
-    return dataFunctionf(f_uniform1v, exec, impl());
-}
-
-JSC::JSValue JSWebGLRenderingContext::uniform1iv(JSC::ExecState* exec)
-{
-    return dataFunctioni(f_uniform1v, exec, impl());
-}
-
-JSC::JSValue JSWebGLRenderingContext::uniform2fv(JSC::ExecState* exec)
-{
-    return dataFunctionf(f_uniform2v, exec, impl());
-}
-
-JSC::JSValue JSWebGLRenderingContext::uniform2iv(JSC::ExecState* exec)
-{
-    return dataFunctioni(f_uniform2v, exec, impl());
-}
-
-JSC::JSValue JSWebGLRenderingContext::uniform3fv(JSC::ExecState* exec)
-{
-    return dataFunctionf(f_uniform3v, exec, impl());
-}
-
-JSC::JSValue JSWebGLRenderingContext::uniform3iv(JSC::ExecState* exec)
-{
-    return dataFunctioni(f_uniform3v, exec, impl());
-}
-
-JSC::JSValue JSWebGLRenderingContext::uniform4fv(JSC::ExecState* exec)
-{
-    return dataFunctionf(f_uniform4v, exec, impl());
-}
-
-JSC::JSValue JSWebGLRenderingContext::uniform4iv(JSC::ExecState* exec)
-{
-    return dataFunctioni(f_uniform4v, exec, impl());
-}
-
-JSC::JSValue JSWebGLRenderingContext::uniformMatrix2fv(JSC::ExecState* exec)
-{
-    return dataFunctionMatrix(f_uniformMatrix2fv, exec, impl());
-}
-
-JSC::JSValue JSWebGLRenderingContext::uniformMatrix3fv(JSC::ExecState* exec)
-{
-    return dataFunctionMatrix(f_uniformMatrix3fv, exec, impl());
-}
-
-JSC::JSValue JSWebGLRenderingContext::uniformMatrix4fv(JSC::ExecState* exec)
-{
-    return dataFunctionMatrix(f_uniformMatrix4fv, exec, impl());
-}
-
-JSC::JSValue JSWebGLRenderingContext::vertexAttrib1fv(JSC::ExecState* exec)
-{
-    return dataFunctionf(f_vertexAttrib1v, exec, impl());
-}
-
-JSC::JSValue JSWebGLRenderingContext::vertexAttrib2fv(JSC::ExecState* exec)
-{
-    return dataFunctionf(f_vertexAttrib2v, exec, impl());
-}
-
-JSC::JSValue JSWebGLRenderingContext::vertexAttrib3fv(JSC::ExecState* exec)
-{
-    return dataFunctionf(f_vertexAttrib3v, exec, impl());
-}
-
-JSC::JSValue JSWebGLRenderingContext::vertexAttrib4fv(JSC::ExecState* exec)
-{
-    return dataFunctionf(f_vertexAttrib4v, exec, impl());
-}
-
-} // namespace WebCore
-
-#endif // ENABLE(WEBGL)
</del></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -2983,7 +2983,7 @@
</span><span class="cx">             if (GetGenerateIsReachable($interface) eq &quot;Impl&quot;) {
</span><span class="cx">                 $rootString  = &quot;    ${implType}* root = &amp;js${interfaceName}-&gt;impl();\n&quot;;
</span><span class="cx">             } elsif (GetGenerateIsReachable($interface) eq &quot;ImplWebGLRenderingContext&quot;) {
</span><del>-                $rootString  = &quot;    WebGLRenderingContext* root = WTF::getPtr(js${interfaceName}-&gt;impl().context());\n&quot;;
</del><ins>+                $rootString  = &quot;    WebGLRenderingContextBase* root = WTF::getPtr(js${interfaceName}-&gt;impl().context());\n&quot;;
</ins><span class="cx">             } elsif (GetGenerateIsReachable($interface) eq &quot;ImplFrame&quot;) {
</span><span class="cx">                 $rootString  = &quot;    Frame* root = WTF::getPtr(js${interfaceName}-&gt;impl().frame());\n&quot;;
</span><span class="cx">                 $rootString .= &quot;    if (!root)\n&quot;;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLCanvasElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLCanvasElement.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLCanvasElement.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/HTMLCanvasElement.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -52,9 +52,10 @@
</span><span class="cx"> #include &lt;runtime/JSCInlines.h&gt;
</span><span class="cx"> #include &lt;runtime/JSLock.h&gt;
</span><span class="cx"> 
</span><del>-#if ENABLE(WEBGL)    
</del><ins>+#if ENABLE(WEBGL)
+#include &quot;WebGL1RenderingContext.h&quot;
+#include &quot;WebGL2RenderingContext.h&quot;
</ins><span class="cx"> #include &quot;WebGLContextAttributes.h&quot;
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -212,7 +213,8 @@
</span><span class="cx">             if (m_context &amp;&amp; !m_context-&gt;is3d())
</span><span class="cx">                 return nullptr;
</span><span class="cx">             if (!m_context) {
</span><del>-                m_context = WebGLRenderingContext::create(this, static_cast&lt;WebGLContextAttributes*&gt;(attrs));
</del><ins>+                m_context = WebGLRenderingContextBase::create(this, static_cast&lt;WebGLContextAttributes*&gt;(attrs), type);
+                
</ins><span class="cx">                 if (m_context) {
</span><span class="cx">                     // Need to make sure a RenderLayer and compositing layer get created for the Canvas
</span><span class="cx">                     setNeedsStyleRecalc(SyntheticStyleChange);
</span><span class="lines">@@ -255,7 +257,7 @@
</span><span class="cx"> bool HTMLCanvasElement::is3dType(const String&amp; type)
</span><span class="cx"> {
</span><span class="cx">     // Retain support for the legacy &quot;webkit-3d&quot; name.
</span><del>-    return type == &quot;webgl&quot; || type == &quot;experimental-webgl&quot; || type == &quot;webkit-3d&quot;;
</del><ins>+    return type == &quot;webgl&quot; || type == &quot;experimental-webgl&quot; || type == &quot;webkit-3d&quot; || type == &quot;experimental-webgl2&quot;;
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -327,7 +329,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEBGL)
</span><span class="cx">     if (is3D() &amp;&amp; oldSize != size())
</span><del>-        static_cast&lt;WebGLRenderingContext*&gt;(m_context.get())-&gt;reshape(width(), height());
</del><ins>+        static_cast&lt;WebGLRenderingContextBase*&gt;(m_context.get())-&gt;reshape(width(), height());
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     if (auto renderer = this-&gt;renderer()) {
</span><span class="lines">@@ -394,7 +396,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEBGL)    
</span><span class="cx">     if (is3D())
</span><del>-        static_cast&lt;WebGLRenderingContext*&gt;(m_context.get())-&gt;markLayerComposited();
</del><ins>+        static_cast&lt;WebGLRenderingContextBase*&gt;(m_context.get())-&gt;markLayerComposited();
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -475,7 +477,7 @@
</span><span class="cx">     if (!is3D())
</span><span class="cx">         return nullptr;
</span><span class="cx"> 
</span><del>-    WebGLRenderingContext* ctx = static_cast&lt;WebGLRenderingContext*&gt;(m_context.get());
</del><ins>+    WebGLRenderingContextBase* ctx = static_cast&lt;WebGLRenderingContextBase*&gt;(m_context.get());
</ins><span class="cx"> 
</span><span class="cx">     return ctx-&gt;paintRenderingResultsToImageData();
</span><span class="cx"> #else
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasANGLEInstancedArrayscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/ANGLEInstancedArrays.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/ANGLEInstancedArrays.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/ANGLEInstancedArrays.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -34,7 +34,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-ANGLEInstancedArrays::ANGLEInstancedArrays(WebGLRenderingContext* context)
</del><ins>+ANGLEInstancedArrays::ANGLEInstancedArrays(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -48,7 +48,7 @@
</span><span class="cx">     return ANGLEInstancedArraysName;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ANGLEInstancedArrays::supported(WebGLRenderingContext* context)
</del><ins>+bool ANGLEInstancedArrays::supported(WebGLRenderingContextBase* context)
</ins><span class="cx"> {
</span><span class="cx"> #if PLATFORM(IOS) || PLATFORM(MAC) &amp;&amp; __MAC_OS_X_VERSION_MIN_REQUIRED &gt;= 1090
</span><span class="cx">     UNUSED_PARAM(context);
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasANGLEInstancedArraysh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/ANGLEInstancedArrays.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/ANGLEInstancedArrays.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/ANGLEInstancedArrays.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,16 +30,16 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class WebGLRenderingContext;
</del><ins>+class WebGLRenderingContextBase;
</ins><span class="cx"> 
</span><span class="cx"> class ANGLEInstancedArrays final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    explicit ANGLEInstancedArrays(WebGLRenderingContext*);
</del><ins>+    explicit ANGLEInstancedArrays(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~ANGLEInstancedArrays();
</span><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const;
</span><span class="cx"> 
</span><del>-    static bool supported(WebGLRenderingContext*);
</del><ins>+    static bool supported(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     void drawArraysInstancedANGLE(GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei primcount);
</span><span class="cx">     void drawElementsInstancedANGLE(GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, GC3Dsizei primcount);
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasCanvasRenderingContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/CanvasRenderingContext.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/CanvasRenderingContext.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/CanvasRenderingContext.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -52,7 +52,9 @@
</span><span class="cx">     HTMLCanvasElement* canvas() const { return m_canvas; }
</span><span class="cx"> 
</span><span class="cx">     virtual bool is2d() const { return false; }
</span><del>-    virtual bool is3d() const { return false; }
</del><ins>+    virtual bool isWebGL1() const { return false; }
+    virtual bool isWebGL2() const { return false; }
+    bool is3d() const { return isWebGL1() || isWebGL1(); }
</ins><span class="cx">     virtual bool isAccelerated() const { return false; }
</span><span class="cx"> 
</span><span class="cx">     virtual void paintRenderingResultsToCanvas() {}
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasCanvasRenderingContext2Dcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -115,6 +115,7 @@
</span><span class="cx"> #if !ENABLE(DASHBOARD_SUPPORT)
</span><span class="cx">     ASSERT_UNUSED(usesDashboardCompatibilityMode, !usesDashboardCompatibilityMode);
</span><span class="cx"> #endif
</span><ins>+    m_type = &quot;2d&quot;;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void CanvasRenderingContext2D::unwindStateStack()
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasEXTBlendMinMaxcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/EXTBlendMinMax.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/EXTBlendMinMax.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/EXTBlendMinMax.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,7 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-EXTBlendMinMax::EXTBlendMinMax(WebGLRenderingContext* context)
</del><ins>+EXTBlendMinMax::EXTBlendMinMax(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasEXTBlendMinMaxh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/EXTBlendMinMax.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/EXTBlendMinMax.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/EXTBlendMinMax.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> class EXTBlendMinMax final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    explicit EXTBlendMinMax(WebGLRenderingContext*);
</del><ins>+    explicit EXTBlendMinMax(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~EXTBlendMinMax();
</span><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasEXTFragDepthcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/EXTFragDepth.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/EXTFragDepth.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/EXTFragDepth.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,7 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-EXTFragDepth::EXTFragDepth(WebGLRenderingContext* context)
</del><ins>+EXTFragDepth::EXTFragDepth(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasEXTFragDepthh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/EXTFragDepth.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/EXTFragDepth.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/EXTFragDepth.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> class EXTFragDepth final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    explicit EXTFragDepth(WebGLRenderingContext*);
</del><ins>+    explicit EXTFragDepth(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~EXTFragDepth();
</span><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasEXTShaderTextureLODcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/EXTShaderTextureLOD.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/EXTShaderTextureLOD.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/EXTShaderTextureLOD.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,7 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-EXTShaderTextureLOD::EXTShaderTextureLOD(WebGLRenderingContext* context)
</del><ins>+EXTShaderTextureLOD::EXTShaderTextureLOD(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasEXTShaderTextureLODh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/EXTShaderTextureLOD.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/EXTShaderTextureLOD.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/EXTShaderTextureLOD.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> class EXTShaderTextureLOD final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    explicit EXTShaderTextureLOD(WebGLRenderingContext*);
</del><ins>+    explicit EXTShaderTextureLOD(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~EXTShaderTextureLOD();
</span><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasEXTTextureFilterAnisotropiccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/EXTTextureFilterAnisotropic.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/EXTTextureFilterAnisotropic.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/EXTTextureFilterAnisotropic.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-EXTTextureFilterAnisotropic::EXTTextureFilterAnisotropic(WebGLRenderingContext* context)
</del><ins>+EXTTextureFilterAnisotropic::EXTTextureFilterAnisotropic(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasEXTTextureFilterAnisotropich"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/EXTTextureFilterAnisotropic.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/EXTTextureFilterAnisotropic.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/EXTTextureFilterAnisotropic.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> class EXTTextureFilterAnisotropic final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    explicit EXTTextureFilterAnisotropic(WebGLRenderingContext*);
</del><ins>+    explicit EXTTextureFilterAnisotropic(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~EXTTextureFilterAnisotropic();
</span><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasEXTsRGBcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/EXTsRGB.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/EXTsRGB.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/EXTsRGB.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,7 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-EXTsRGB::EXTsRGB(WebGLRenderingContext* context)
</del><ins>+EXTsRGB::EXTsRGB(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasEXTsRGBh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/EXTsRGB.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/EXTsRGB.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/EXTsRGB.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> class EXTsRGB final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    explicit EXTsRGB(WebGLRenderingContext*);
</del><ins>+    explicit EXTsRGB(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~EXTsRGB();
</span><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasOESElementIndexUintcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/OESElementIndexUint.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/OESElementIndexUint.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/OESElementIndexUint.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-OESElementIndexUint::OESElementIndexUint(WebGLRenderingContext* context)
</del><ins>+OESElementIndexUint::OESElementIndexUint(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasOESElementIndexUinth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/OESElementIndexUint.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/OESElementIndexUint.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/OESElementIndexUint.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> class OESElementIndexUint final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    explicit OESElementIndexUint(WebGLRenderingContext*);
</del><ins>+    explicit OESElementIndexUint(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~OESElementIndexUint();
</span><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasOESStandardDerivativescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/OESStandardDerivatives.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/OESStandardDerivatives.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/OESStandardDerivatives.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-OESStandardDerivatives::OESStandardDerivatives(WebGLRenderingContext* context)
</del><ins>+OESStandardDerivatives::OESStandardDerivatives(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasOESStandardDerivativesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/OESStandardDerivatives.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/OESStandardDerivatives.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/OESStandardDerivatives.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> class OESStandardDerivatives final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    explicit OESStandardDerivatives(WebGLRenderingContext*);
</del><ins>+    explicit OESStandardDerivatives(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~OESStandardDerivatives();
</span><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasOESTextureFloatcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/OESTextureFloat.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/OESTextureFloat.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/OESTextureFloat.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-OESTextureFloat::OESTextureFloat(WebGLRenderingContext* context)
</del><ins>+OESTextureFloat::OESTextureFloat(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasOESTextureFloath"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/OESTextureFloat.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/OESTextureFloat.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/OESTextureFloat.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> class OESTextureFloat final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    OESTextureFloat(WebGLRenderingContext*);
</del><ins>+    OESTextureFloat(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~OESTextureFloat();
</span><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasOESTextureFloatLinearcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/OESTextureFloatLinear.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/OESTextureFloatLinear.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/OESTextureFloatLinear.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,7 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-OESTextureFloatLinear::OESTextureFloatLinear(WebGLRenderingContext* context)
</del><ins>+OESTextureFloatLinear::OESTextureFloatLinear(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasOESTextureFloatLinearh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/OESTextureFloatLinear.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/OESTextureFloatLinear.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/OESTextureFloatLinear.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> class OESTextureFloatLinear final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    explicit OESTextureFloatLinear(WebGLRenderingContext*);
</del><ins>+    explicit OESTextureFloatLinear(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~OESTextureFloatLinear();
</span><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasOESTextureHalfFloatcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/OESTextureHalfFloat.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/OESTextureHalfFloat.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/OESTextureHalfFloat.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-OESTextureHalfFloat::OESTextureHalfFloat(WebGLRenderingContext* context)
</del><ins>+OESTextureHalfFloat::OESTextureHalfFloat(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasOESTextureHalfFloath"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/OESTextureHalfFloat.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/OESTextureHalfFloat.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/OESTextureHalfFloat.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> class OESTextureHalfFloat final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    OESTextureHalfFloat(WebGLRenderingContext*);
</del><ins>+    OESTextureHalfFloat(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~OESTextureHalfFloat();
</span><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasOESTextureHalfFloatLinearcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/OESTextureHalfFloatLinear.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/OESTextureHalfFloatLinear.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/OESTextureHalfFloatLinear.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,7 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-OESTextureHalfFloatLinear::OESTextureHalfFloatLinear(WebGLRenderingContext* context)
</del><ins>+OESTextureHalfFloatLinear::OESTextureHalfFloatLinear(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasOESTextureHalfFloatLinearh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/OESTextureHalfFloatLinear.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/OESTextureHalfFloatLinear.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/OESTextureHalfFloatLinear.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> class OESTextureHalfFloatLinear final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    OESTextureHalfFloatLinear(WebGLRenderingContext*);
</del><ins>+    OESTextureHalfFloatLinear(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~OESTextureHalfFloatLinear();
</span><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasOESVertexArrayObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/OESVertexArrayObject.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/OESVertexArrayObject.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/OESVertexArrayObject.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -33,7 +33,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-OESVertexArrayObject::OESVertexArrayObject(WebGLRenderingContext* context)
</del><ins>+OESVertexArrayObject::OESVertexArrayObject(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasOESVertexArrayObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/OESVertexArrayObject.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/OESVertexArrayObject.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/OESVertexArrayObject.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -31,14 +31,14 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class WebGLRenderingContext;
</del><ins>+class WebGLRenderingContextBase;
</ins><span class="cx"> class WebGLVertexArrayObjectOES;
</span><span class="cx"> 
</span><span class="cx"> typedef int ExceptionCode;
</span><span class="cx"> 
</span><span class="cx"> class OESVertexArrayObject final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    OESVertexArrayObject(WebGLRenderingContext*);
</del><ins>+    OESVertexArrayObject(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~OESVertexArrayObject();
</span><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGL1RenderingContextcppfromrev176994trunkSourceWebCorehtmlcanvasWebGLRenderingContextcpp"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/html/canvas/WebGL1RenderingContext.cpp (from rev 176994, trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp) (0 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGL1RenderingContext.cpp                                (rev 0)
+++ trunk/Source/WebCore/html/canvas/WebGL1RenderingContext.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -0,0 +1,45 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include &quot;config.h&quot;
+
+#if ENABLE(WEBGL)
+#include &quot;WebGL1RenderingContext.h&quot;
+
+namespace WebCore {
+
+WebGL1RenderingContext::WebGL1RenderingContext(HTMLCanvasElement* passedCanvas, GraphicsContext3D::Attributes attributes)
+    : WebGLRenderingContextBase(passedCanvas, attributes)
+{
+}
+
+WebGL1RenderingContext::WebGL1RenderingContext(HTMLCanvasElement* passedCanvas, PassRefPtr&lt;GraphicsContext3D&gt; context,
+    GraphicsContext3D::Attributes attributes) : WebGLRenderingContextBase(passedCanvas, context, attributes)
+{
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(WEBGL)
</ins></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGL1RenderingContexthfromrev176994trunkSourceWebCorehtmlcanvasWebGLRenderingContexth"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/html/canvas/WebGL1RenderingContext.h (from rev 176994, trunk/Source/WebCore/html/canvas/WebGLRenderingContext.h) (0 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGL1RenderingContext.h                                (rev 0)
+++ trunk/Source/WebCore/html/canvas/WebGL1RenderingContext.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef WebGLRenderingContext_h
+#define WebGLRenderingContext_h
+
+#include &quot;WebGLRenderingContextBase.h&quot;
+
+namespace WebCore {
+
+class WebGL1RenderingContext final : public WebGLRenderingContextBase {
+public:
+    WebGL1RenderingContext(HTMLCanvasElement*, GraphicsContext3D::Attributes);
+    WebGL1RenderingContext(HTMLCanvasElement*, PassRefPtr&lt;GraphicsContext3D&gt;, GraphicsContext3D::Attributes);
+    virtual bool isWebGL1() const { return true; }
+};
+    
+} // namespace WebCore
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGL1RenderingContextidlfromrev176994trunkSourceWebCorehtmlcanvasWebGLRenderingContextidl"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/html/canvas/WebGL1RenderingContext.idl (from rev 176994, trunk/Source/WebCore/html/canvas/WebGLRenderingContext.idl) (0 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGL1RenderingContext.idl                                (rev 0)
+++ trunk/Source/WebCore/html/canvas/WebGL1RenderingContext.idl        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -0,0 +1,31 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+[
+    Conditional=WEBGL,
+    JSCustomMarkFunction,
+    DoNotCheckConstants,
+] interface WebGL1RenderingContext : WebGLRenderingContextBase {
+};
</ins></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGL2RenderingContextcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp (0 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp                                (rev 0)
+++ trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -0,0 +1,44 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+
+#if ENABLE(WEBGL)
+#include &quot;WebGL2RenderingContext.h&quot;
+
+namespace WebCore {
+
+WebGL2RenderingContext::WebGL2RenderingContext(HTMLCanvasElement* passedCanvas, GraphicsContext3D::Attributes attributes)
+    : WebGLRenderingContextBase(passedCanvas, attributes)
+{
+}
+
+WebGL2RenderingContext::WebGL2RenderingContext(HTMLCanvasElement* passedCanvas, PassRefPtr&lt;GraphicsContext3D&gt; context,
+    GraphicsContext3D::Attributes attributes) : WebGLRenderingContextBase(passedCanvas, context, attributes)
+{
+}
+} // namespace WebCore
+
+#endif // ENABLE(WEBGL)
</ins></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGL2RenderingContexth"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.h (0 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.h                                (rev 0)
+++ trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebGL2RenderingContext_h
+#define WebGL2RenderingContext_h
+
+#include &quot;WebGLRenderingContextBase.h&quot;
+
+namespace WebCore {
+
+class WebGL2RenderingContext final : public WebGLRenderingContextBase {
+public:
+    WebGL2RenderingContext(HTMLCanvasElement*, GraphicsContext3D::Attributes);
+    WebGL2RenderingContext(HTMLCanvasElement*, PassRefPtr&lt;GraphicsContext3D&gt;, GraphicsContext3D::Attributes);
+    virtual bool isWebGL2() const { return true; }
+};
+
+} // namespace WebCore
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGL2RenderingContextidl"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.idl (0 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.idl                                (rev 0)
+++ trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.idl        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -0,0 +1,31 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+[
+    Conditional=WEBGL,
+    JSCustomMarkFunction,
+    DoNotCheckConstants,
+] interface WebGL2RenderingContext : WebGLRenderingContextBase {
+};
</ins></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLBuffercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLBuffer.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLBuffer.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLBuffer.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,16 +30,16 @@
</span><span class="cx"> #include &quot;WebGLBuffer.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;WebGLContextGroup.h&quot;
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;WebGLRenderingContextBase.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;WebGLBuffer&gt; WebGLBuffer::create(WebGLRenderingContext* ctx)
</del><ins>+PassRefPtr&lt;WebGLBuffer&gt; WebGLBuffer::create(WebGLRenderingContextBase* ctx)
</ins><span class="cx"> {
</span><span class="cx">     return adoptRef(new WebGLBuffer(ctx));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WebGLBuffer::WebGLBuffer(WebGLRenderingContext* ctx)
</del><ins>+WebGLBuffer::WebGLBuffer(WebGLRenderingContextBase* ctx)
</ins><span class="cx">     : WebGLSharedObject(ctx)
</span><span class="cx">     , m_target(0)
</span><span class="cx">     , m_byteLength(0)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLBufferh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLBuffer.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLBuffer.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLBuffer.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx"> public:
</span><span class="cx">     virtual ~WebGLBuffer();
</span><span class="cx"> 
</span><del>-    static PassRefPtr&lt;WebGLBuffer&gt; create(WebGLRenderingContext*);
</del><ins>+    static PassRefPtr&lt;WebGLBuffer&gt; create(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     bool associateBufferData(GC3Dsizeiptr size);
</span><span class="cx">     bool associateBufferData(JSC::ArrayBuffer*);
</span><span class="lines">@@ -66,7 +66,7 @@
</span><span class="cx">     bool hasEverBeenBound() const { return object() &amp;&amp; m_target; }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    WebGLBuffer(WebGLRenderingContext*);
</del><ins>+    WebGLBuffer(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     virtual void deleteObjectImpl(GraphicsContext3D*, Platform3DObject) override;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLCompressedTextureATCcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLCompressedTextureATC.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLCompressedTextureATC.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLCompressedTextureATC.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -33,7 +33,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-WebGLCompressedTextureATC::WebGLCompressedTextureATC(WebGLRenderingContext* context)
</del><ins>+WebGLCompressedTextureATC::WebGLCompressedTextureATC(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx">     context-&gt;addCompressedTextureFormat(Extensions3D::COMPRESSED_ATC_RGB_AMD);
</span><span class="lines">@@ -50,7 +50,7 @@
</span><span class="cx">     return WebGLCompressedTextureATCName;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool WebGLCompressedTextureATC::supported(WebGLRenderingContext* context)
</del><ins>+bool WebGLCompressedTextureATC::supported(WebGLRenderingContextBase* context)
</ins><span class="cx"> {
</span><span class="cx">     Extensions3D* extensions = context-&gt;graphicsContext3D()-&gt;getExtensions();
</span><span class="cx">     return extensions-&gt;supports(&quot;GL_AMD_compressed_ATC_texture&quot;);
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLCompressedTextureATCh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLCompressedTextureATC.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLCompressedTextureATC.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLCompressedTextureATC.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -34,10 +34,10 @@
</span><span class="cx"> 
</span><span class="cx"> class WebGLCompressedTextureATC final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    explicit WebGLCompressedTextureATC(WebGLRenderingContext*);
</del><ins>+    explicit WebGLCompressedTextureATC(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~WebGLCompressedTextureATC();
</span><span class="cx"> 
</span><del>-    static bool supported(WebGLRenderingContext*);
</del><ins>+    static bool supported(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLCompressedTexturePVRTCcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLCompressedTexturePVRTC.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLCompressedTexturePVRTC.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLCompressedTexturePVRTC.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,11 +30,11 @@
</span><span class="cx"> #include &quot;WebGLCompressedTexturePVRTC.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Extensions3D.h&quot;
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;WebGLRenderingContextBase.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-WebGLCompressedTexturePVRTC::WebGLCompressedTexturePVRTC(WebGLRenderingContext* context)
</del><ins>+WebGLCompressedTexturePVRTC::WebGLCompressedTexturePVRTC(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx">     context-&gt;addCompressedTextureFormat(Extensions3D::COMPRESSED_RGB_PVRTC_4BPPV1_IMG);
</span><span class="lines">@@ -52,7 +52,7 @@
</span><span class="cx">     return WebGLCompressedTexturePVRTCName;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool WebGLCompressedTexturePVRTC::supported(WebGLRenderingContext* context)
</del><ins>+bool WebGLCompressedTexturePVRTC::supported(WebGLRenderingContextBase* context)
</ins><span class="cx"> {
</span><span class="cx">     Extensions3D* extensions = context-&gt;graphicsContext3D()-&gt;getExtensions();
</span><span class="cx">     return extensions-&gt;supports(&quot;GL_IMG_texture_compression_pvrtc&quot;);
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLCompressedTexturePVRTCh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLCompressedTexturePVRTC.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLCompressedTexturePVRTC.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLCompressedTexturePVRTC.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -32,10 +32,10 @@
</span><span class="cx"> 
</span><span class="cx"> class WebGLCompressedTexturePVRTC final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    explicit WebGLCompressedTexturePVRTC(WebGLRenderingContext*);
</del><ins>+    explicit WebGLCompressedTexturePVRTC(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~WebGLCompressedTexturePVRTC();
</span><span class="cx"> 
</span><del>-    static bool supported(WebGLRenderingContext*);
</del><ins>+    static bool supported(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ExtensionName getName() const override;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLCompressedTextureS3TCcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLCompressedTextureS3TC.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLCompressedTextureS3TC.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLCompressedTextureS3TC.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,11 +30,11 @@
</span><span class="cx"> #include &quot;WebGLCompressedTextureS3TC.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Extensions3D.h&quot;
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;WebGLRenderingContextBase.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-WebGLCompressedTextureS3TC::WebGLCompressedTextureS3TC(WebGLRenderingContext* context)
</del><ins>+WebGLCompressedTextureS3TC::WebGLCompressedTextureS3TC(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx">     context-&gt;addCompressedTextureFormat(Extensions3D::COMPRESSED_RGB_S3TC_DXT1_EXT);
</span><span class="lines">@@ -52,7 +52,7 @@
</span><span class="cx">     return WebGLCompressedTextureS3TCName;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool WebGLCompressedTextureS3TC::supported(WebGLRenderingContext* context)
</del><ins>+bool WebGLCompressedTextureS3TC::supported(WebGLRenderingContextBase* context)
</ins><span class="cx"> {
</span><span class="cx">     Extensions3D* extensions = context-&gt;graphicsContext3D()-&gt;getExtensions();
</span><span class="cx">     return extensions-&gt;supports(&quot;GL_EXT_texture_compression_s3tc&quot;)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLCompressedTextureS3TCh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLCompressedTextureS3TC.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLCompressedTextureS3TC.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLCompressedTextureS3TC.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -34,10 +34,10 @@
</span><span class="cx"> 
</span><span class="cx"> class WebGLCompressedTextureS3TC final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    explicit WebGLCompressedTextureS3TC(WebGLRenderingContext*);
</del><ins>+    explicit WebGLCompressedTextureS3TC(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~WebGLCompressedTextureS3TC();
</span><span class="cx"> 
</span><del>-    static bool supported(WebGLRenderingContext*);
</del><ins>+    static bool supported(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLContextGroupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLContextGroup.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLContextGroup.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLContextGroup.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,7 +30,7 @@
</span><span class="cx"> #include &quot;WebGLContextGroup.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;GraphicsContext3D.h&quot;
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;WebGLRenderingContextBase.h&quot;
</ins><span class="cx"> #include &quot;WebGLSharedObject.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -53,16 +53,16 @@
</span><span class="cx"> GraphicsContext3D* WebGLContextGroup::getAGraphicsContext3D()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!m_contexts.isEmpty());
</span><del>-    HashSet&lt;WebGLRenderingContext*&gt;::iterator it = m_contexts.begin();
</del><ins>+    HashSet&lt;WebGLRenderingContextBase*&gt;::iterator it = m_contexts.begin();
</ins><span class="cx">     return (*it)-&gt;graphicsContext3D();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebGLContextGroup::addContext(WebGLRenderingContext* context)
</del><ins>+void WebGLContextGroup::addContext(WebGLRenderingContextBase* context)
</ins><span class="cx"> {
</span><span class="cx">     m_contexts.add(context);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebGLContextGroup::removeContext(WebGLRenderingContext* context)
</del><ins>+void WebGLContextGroup::removeContext(WebGLRenderingContextBase* context)
</ins><span class="cx"> {
</span><span class="cx">     // We must call detachAndRemoveAllObjects before removing the last context.
</span><span class="cx">     if (m_contexts.size() == 1 &amp;&amp; m_contexts.contains(context))
</span><span class="lines">@@ -89,9 +89,9 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebGLContextGroup::loseContextGroup(WebGLRenderingContext::LostContextMode mode)
</del><ins>+void WebGLContextGroup::loseContextGroup(WebGLRenderingContextBase::LostContextMode mode)
</ins><span class="cx"> {
</span><del>-    for (HashSet&lt;WebGLRenderingContext*&gt;::iterator it = m_contexts.begin(); it != m_contexts.end(); ++it)
</del><ins>+    for (HashSet&lt;WebGLRenderingContextBase*&gt;::iterator it = m_contexts.begin(); it != m_contexts.end(); ++it)
</ins><span class="cx">         (*it)-&gt;loseContextImpl(mode);
</span><span class="cx"> 
</span><span class="cx">     detachAndRemoveAllObjects();
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLContextGrouph"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLContextGroup.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLContextGroup.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLContextGroup.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx"> #ifndef WebGLContextGroup_h
</span><span class="cx"> #define WebGLContextGroup_h
</span><span class="cx"> 
</span><del>-#include &lt;WebGLRenderingContext.h&gt;
</del><ins>+#include &lt;WebGLRenderingContextBase.h&gt;
</ins><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</span><span class="cx"> #include &lt;wtf/PassRefPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><span class="lines">@@ -36,7 +36,7 @@
</span><span class="cx"> class GraphicsContext3D;
</span><span class="cx"> class WebGLExtension;
</span><span class="cx"> class WebGLSharedObject;
</span><del>-class WebGLRenderingContext;
</del><ins>+class WebGLRenderingContextBase;
</ins><span class="cx"> 
</span><span class="cx"> typedef int ExceptionCode;
</span><span class="cx"> 
</span><span class="lines">@@ -45,15 +45,15 @@
</span><span class="cx">     static PassRefPtr&lt;WebGLContextGroup&gt; create();
</span><span class="cx">     ~WebGLContextGroup();
</span><span class="cx"> 
</span><del>-    void addContext(WebGLRenderingContext*);
-    void removeContext(WebGLRenderingContext*);
</del><ins>+    void addContext(WebGLRenderingContextBase*);
+    void removeContext(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     void addObject(WebGLSharedObject*);
</span><span class="cx">     void removeObject(WebGLSharedObject*);
</span><span class="cx"> 
</span><span class="cx">     GraphicsContext3D* getAGraphicsContext3D();
</span><span class="cx"> 
</span><del>-    void loseContextGroup(WebGLRenderingContext::LostContextMode);
</del><ins>+    void loseContextGroup(WebGLRenderingContextBase::LostContextMode);
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     friend class WebGLObject;
</span><span class="lines">@@ -62,7 +62,7 @@
</span><span class="cx"> 
</span><span class="cx">     void detachAndRemoveAllObjects();
</span><span class="cx"> 
</span><del>-    HashSet&lt;WebGLRenderingContext*&gt; m_contexts;
</del><ins>+    HashSet&lt;WebGLRenderingContextBase*&gt; m_contexts;
</ins><span class="cx">     HashSet&lt;WebGLSharedObject*&gt; m_groupObjects;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLContextObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLContextObject.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLContextObject.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLContextObject.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -29,11 +29,11 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;WebGLContextObject.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;WebGLRenderingContextBase.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-WebGLContextObject::WebGLContextObject(WebGLRenderingContext* context)
</del><ins>+WebGLContextObject::WebGLContextObject(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLObject(context)
</span><span class="cx">     , m_context(context)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLContextObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLContextObject.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLContextObject.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLContextObject.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> class GraphicsContext3D;
</span><del>-class WebGLRenderingContext;
</del><ins>+class WebGLRenderingContextBase;
</ins><span class="cx"> 
</span><span class="cx"> // WebGLContextObject the base class for objects that are owned by a specific
</span><span class="cx"> // WebGLRenderingContext.
</span><span class="lines">@@ -39,9 +39,9 @@
</span><span class="cx"> public:
</span><span class="cx">     virtual ~WebGLContextObject();
</span><span class="cx"> 
</span><del>-    WebGLRenderingContext* context() const { return m_context; }
</del><ins>+    WebGLRenderingContextBase* context() const { return m_context; }
</ins><span class="cx"> 
</span><del>-    virtual bool validate(const WebGLContextGroup*, const WebGLRenderingContext* context) const override
</del><ins>+    virtual bool validate(const WebGLContextGroup*, const WebGLRenderingContextBase* context) const override
</ins><span class="cx">     {
</span><span class="cx">         return context == m_context;
</span><span class="cx">     }
</span><span class="lines">@@ -49,7 +49,7 @@
</span><span class="cx">     void detachContext();
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    WebGLContextObject(WebGLRenderingContext*);
</del><ins>+    WebGLContextObject(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     virtual bool hasGroupOrContext() const override
</span><span class="cx">     {
</span><span class="lines">@@ -59,7 +59,7 @@
</span><span class="cx">     virtual GraphicsContext3D* getAGraphicsContext3D() const override;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    WebGLRenderingContext* m_context;
</del><ins>+    WebGLRenderingContextBase* m_context;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLDebugRendererInfocpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLDebugRendererInfo.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLDebugRendererInfo.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLDebugRendererInfo.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -29,11 +29,11 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;WebGLDebugRendererInfo.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;WebGLRenderingContextBase.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-WebGLDebugRendererInfo::WebGLDebugRendererInfo(WebGLRenderingContext* context)
</del><ins>+WebGLDebugRendererInfo::WebGLDebugRendererInfo(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLDebugRendererInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLDebugRendererInfo.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLDebugRendererInfo.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLDebugRendererInfo.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -37,7 +37,7 @@
</span><span class="cx">         UNMASKED_RENDERER_WEBGL = 0x9246
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    explicit WebGLDebugRendererInfo(WebGLRenderingContext*);
</del><ins>+    explicit WebGLDebugRendererInfo(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~WebGLDebugRendererInfo();
</span><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLDebugShaderscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLDebugShaders.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLDebugShaders.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLDebugShaders.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,12 +30,12 @@
</span><span class="cx"> #include &quot;WebGLDebugShaders.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Extensions3D.h&quot;
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;WebGLRenderingContextBase.h&quot;
</ins><span class="cx"> #include &quot;WebGLShader.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-WebGLDebugShaders::WebGLDebugShaders(WebGLRenderingContext* context)
</del><ins>+WebGLDebugShaders::WebGLDebugShaders(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLDebugShadersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLDebugShaders.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLDebugShaders.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLDebugShaders.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -36,7 +36,7 @@
</span><span class="cx"> 
</span><span class="cx"> class WebGLDebugShaders final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    explicit WebGLDebugShaders(WebGLRenderingContext*);
</del><ins>+    explicit WebGLDebugShaders(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~WebGLDebugShaders();
</span><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLDepthTexturecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLDepthTexture.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLDepthTexture.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLDepthTexture.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -33,7 +33,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-WebGLDepthTexture::WebGLDepthTexture(WebGLRenderingContext* context)
</del><ins>+WebGLDepthTexture::WebGLDepthTexture(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLDepthTextureh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLDepthTexture.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLDepthTexture.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLDepthTexture.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> class WebGLDepthTexture final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    explicit WebGLDepthTexture(WebGLRenderingContext*);
</del><ins>+    explicit WebGLDepthTexture(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~WebGLDepthTexture();
</span><span class="cx"> 
</span><span class="cx">     static bool supported(GraphicsContext3D*);
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLDrawBufferscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLDrawBuffers.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLDrawBuffers.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLDrawBuffers.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-WebGLDrawBuffers::WebGLDrawBuffers(WebGLRenderingContext* context)
</del><ins>+WebGLDrawBuffers::WebGLDrawBuffers(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -48,14 +48,14 @@
</span><span class="cx"> 
</span><span class="cx"> #if (PLATFORM(MAC) &amp;&amp; __MAC_OS_X_VERSION_MIN_REQUIRED &lt; 101000)
</span><span class="cx"> 
</span><del>-bool WebGLDrawBuffers::supported(WebGLRenderingContext*)
</del><ins>+bool WebGLDrawBuffers::supported(WebGLRenderingContextBase*)
</ins><span class="cx"> {
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #else
</span><span class="cx"> 
</span><del>-bool WebGLDrawBuffers::supported(WebGLRenderingContext* context)
</del><ins>+bool WebGLDrawBuffers::supported(WebGLRenderingContextBase* context)
</ins><span class="cx"> {
</span><span class="cx">     Extensions3D* extensions = context-&gt;graphicsContext3D()-&gt;getExtensions();
</span><span class="cx">     return extensions-&gt;supports(&quot;GL_EXT_draw_buffers&quot;)
</span><span class="lines">@@ -99,7 +99,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // static
</span><del>-bool WebGLDrawBuffers::satisfiesWebGLRequirements(WebGLRenderingContext* webglContext)
</del><ins>+bool WebGLDrawBuffers::satisfiesWebGLRequirements(WebGLRenderingContextBase* webglContext)
</ins><span class="cx"> {
</span><span class="cx">     GraphicsContext3D* context = webglContext-&gt;graphicsContext3D();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLDrawBuffersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLDrawBuffers.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLDrawBuffers.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLDrawBuffers.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -32,17 +32,17 @@
</span><span class="cx"> 
</span><span class="cx"> class WebGLDrawBuffers final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    explicit WebGLDrawBuffers(WebGLRenderingContext*);
</del><ins>+    explicit WebGLDrawBuffers(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~WebGLDrawBuffers();
</span><span class="cx"> 
</span><del>-    static bool supported(WebGLRenderingContext*);
</del><ins>+    static bool supported(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span><span class="cx"> 
</span><span class="cx">     void drawBuffersWEBGL(const Vector&lt;GC3Denum&gt;&amp; buffers);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    static bool satisfiesWebGLRequirements(WebGLRenderingContext*);
</del><ins>+    static bool satisfiesWebGLRequirements(WebGLRenderingContextBase*);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLExtensioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLExtension.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLExtension.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLExtension.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-WebGLExtension::WebGLExtension(WebGLRenderingContext* context)
</del><ins>+WebGLExtension::WebGLExtension(WebGLRenderingContextBase* context)
</ins><span class="cx">     : m_context(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLExtensionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLExtension.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLExtension.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLExtension.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx"> #ifndef WebGLExtension_h
</span><span class="cx"> #define WebGLExtension_h
</span><span class="cx"> 
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;WebGLRenderingContextBase.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -60,14 +60,14 @@
</span><span class="cx"> 
</span><span class="cx">     void ref() { m_context-&gt;ref(); }
</span><span class="cx">     void deref() { m_context-&gt;deref(); }
</span><del>-    WebGLRenderingContext* context() { return m_context; }
</del><ins>+    WebGLRenderingContextBase* context() { return m_context; }
</ins><span class="cx"> 
</span><span class="cx">     virtual ~WebGLExtension();
</span><span class="cx">     virtual ExtensionName getName() const = 0;
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    WebGLExtension(WebGLRenderingContext*);
-    WebGLRenderingContext* m_context;
</del><ins>+    WebGLExtension(WebGLRenderingContextBase*);
+    WebGLRenderingContextBase* m_context;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLFramebuffercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLFramebuffer.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLFramebuffer.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLFramebuffer.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> #include &quot;Extensions3D.h&quot;
</span><span class="cx"> #include &quot;WebGLContextGroup.h&quot;
</span><span class="cx"> #include &quot;WebGLDrawBuffers.h&quot;
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;WebGLRenderingContextBase.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -269,12 +269,12 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;WebGLFramebuffer&gt; WebGLFramebuffer::create(WebGLRenderingContext* ctx)
</del><ins>+PassRefPtr&lt;WebGLFramebuffer&gt; WebGLFramebuffer::create(WebGLRenderingContextBase* ctx)
</ins><span class="cx"> {
</span><span class="cx">     return adoptRef(new WebGLFramebuffer(ctx));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WebGLFramebuffer::WebGLFramebuffer(WebGLRenderingContext* ctx)
</del><ins>+WebGLFramebuffer::WebGLFramebuffer(WebGLRenderingContextBase* ctx)
</ins><span class="cx">     : WebGLContextObject(ctx)
</span><span class="cx">     , m_hasEverBeenBound(false)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLFramebufferh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLFramebuffer.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLFramebuffer.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLFramebuffer.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -61,7 +61,7 @@
</span><span class="cx"> 
</span><span class="cx">     virtual ~WebGLFramebuffer();
</span><span class="cx"> 
</span><del>-    static PassRefPtr&lt;WebGLFramebuffer&gt; create(WebGLRenderingContext*);
</del><ins>+    static PassRefPtr&lt;WebGLFramebuffer&gt; create(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     void setAttachmentForBoundFramebuffer(GC3Denum attachment, GC3Denum texTarget, WebGLTexture*, GC3Dint level);
</span><span class="cx">     void setAttachmentForBoundFramebuffer(GC3Denum attachment, WebGLRenderbuffer*);
</span><span class="lines">@@ -101,7 +101,7 @@
</span><span class="cx">     GC3Denum getDrawBuffer(GC3Denum);
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    WebGLFramebuffer(WebGLRenderingContext*);
</del><ins>+    WebGLFramebuffer(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     virtual void deleteObjectImpl(GraphicsContext3D*, Platform3DObject) override;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLLoseContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLLoseContext.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLLoseContext.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLLoseContext.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -29,11 +29,11 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;WebGLLoseContext.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;WebGLRenderingContextBase.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-WebGLLoseContext::WebGLLoseContext(WebGLRenderingContext* context)
</del><ins>+WebGLLoseContext::WebGLLoseContext(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLExtension(context)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -49,7 +49,7 @@
</span><span class="cx"> 
</span><span class="cx"> void WebGLLoseContext::loseContext()
</span><span class="cx"> {
</span><del>-    m_context-&gt;forceLostContext(WebGLRenderingContext::SyntheticLostContext);
</del><ins>+    m_context-&gt;forceLostContext(WebGLRenderingContextBase::SyntheticLostContext);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebGLLoseContext::restoreContext()
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLLoseContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLLoseContext.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLLoseContext.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLLoseContext.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,11 +30,11 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class WebGLRenderingContext;
</del><ins>+class WebGLRenderingContextBase;
</ins><span class="cx"> 
</span><span class="cx"> class WebGLLoseContext final : public WebGLExtension {
</span><span class="cx"> public:
</span><del>-    explicit WebGLLoseContext(WebGLRenderingContext*);
</del><ins>+    explicit WebGLLoseContext(WebGLRenderingContextBase*);
</ins><span class="cx">     virtual ~WebGLLoseContext();
</span><span class="cx"> 
</span><span class="cx">     virtual ExtensionName getName() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLObject.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLObject.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLObject.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -34,11 +34,11 @@
</span><span class="cx"> #include &quot;WebGLDebugRendererInfo.h&quot;
</span><span class="cx"> #include &quot;WebGLDebugShaders.h&quot;
</span><span class="cx"> #include &quot;WebGLLoseContext.h&quot;
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;WebGLRenderingContextBase.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-WebGLObject::WebGLObject(WebGLRenderingContext*)
</del><ins>+WebGLObject::WebGLObject(WebGLRenderingContextBase*)
</ins><span class="cx">     : m_object(0)
</span><span class="cx">     , m_attachmentCount(0)
</span><span class="cx">     , m_deleted(false)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLObject.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLObject.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLObject.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -34,7 +34,7 @@
</span><span class="cx"> 
</span><span class="cx"> class GraphicsContext3D;
</span><span class="cx"> class WebGLContextGroup;
</span><del>-class WebGLRenderingContext;
</del><ins>+class WebGLRenderingContextBase;
</ins><span class="cx"> 
</span><span class="cx"> class WebGLObject : public RefCounted&lt;WebGLObject&gt; {
</span><span class="cx"> public:
</span><span class="lines">@@ -56,10 +56,10 @@
</span><span class="cx">     bool isDeleted() { return m_deleted; }
</span><span class="cx"> 
</span><span class="cx">     // True if this object belongs to the group or context.
</span><del>-    virtual bool validate(const WebGLContextGroup*, const WebGLRenderingContext*) const = 0;
</del><ins>+    virtual bool validate(const WebGLContextGroup*, const WebGLRenderingContextBase*) const = 0;
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    WebGLObject(WebGLRenderingContext*);
</del><ins>+    WebGLObject(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     // setObject should be only called once right after creating a WebGLObject.
</span><span class="cx">     void setObject(Platform3DObject);
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLProgramcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLProgram.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLProgram.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLProgram.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,16 +30,16 @@
</span><span class="cx"> #include &quot;WebGLProgram.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;WebGLContextGroup.h&quot;
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;WebGLRenderingContextBase.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;WebGLProgram&gt; WebGLProgram::create(WebGLRenderingContext* ctx)
</del><ins>+PassRefPtr&lt;WebGLProgram&gt; WebGLProgram::create(WebGLRenderingContextBase* ctx)
</ins><span class="cx"> {
</span><span class="cx">     return adoptRef(new WebGLProgram(ctx));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WebGLProgram::WebGLProgram(WebGLRenderingContext* ctx)
</del><ins>+WebGLProgram::WebGLProgram(WebGLRenderingContextBase* ctx)
</ins><span class="cx">     : WebGLSharedObject(ctx)
</span><span class="cx">     , m_linkStatus(false)
</span><span class="cx">     , m_linkCount(0)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLProgramh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLProgram.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLProgram.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLProgram.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -39,7 +39,7 @@
</span><span class="cx"> public:
</span><span class="cx">     virtual ~WebGLProgram();
</span><span class="cx"> 
</span><del>-    static PassRefPtr&lt;WebGLProgram&gt; create(WebGLRenderingContext*);
</del><ins>+    static PassRefPtr&lt;WebGLProgram&gt; create(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     unsigned numActiveAttribLocations();
</span><span class="cx">     GC3Dint getActiveAttribLocation(GC3Duint index);
</span><span class="lines">@@ -62,7 +62,7 @@
</span><span class="cx">     bool detachShader(WebGLShader*);
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    WebGLProgram(WebGLRenderingContext*);
</del><ins>+    WebGLProgram(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     virtual void deleteObjectImpl(GraphicsContext3D*, Platform3DObject) override;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLRenderbuffercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLRenderbuffer.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLRenderbuffer.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderbuffer.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,11 +30,11 @@
</span><span class="cx"> #include &quot;WebGLRenderbuffer.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;WebGLContextGroup.h&quot;
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;WebGLRenderingContextBase.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;WebGLRenderbuffer&gt; WebGLRenderbuffer::create(WebGLRenderingContext* ctx)
</del><ins>+PassRefPtr&lt;WebGLRenderbuffer&gt; WebGLRenderbuffer::create(WebGLRenderingContextBase* ctx)
</ins><span class="cx"> {
</span><span class="cx">     return adoptRef(new WebGLRenderbuffer(ctx));
</span><span class="cx"> }
</span><span class="lines">@@ -44,7 +44,7 @@
</span><span class="cx">     deleteObject(0);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WebGLRenderbuffer::WebGLRenderbuffer(WebGLRenderingContext* ctx)
</del><ins>+WebGLRenderbuffer::WebGLRenderbuffer(WebGLRenderingContextBase* ctx)
</ins><span class="cx">     : WebGLSharedObject(ctx)
</span><span class="cx">     , m_internalFormat(GraphicsContext3D::RGBA4)
</span><span class="cx">     , m_initialized(false)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLRenderbufferh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLRenderbuffer.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLRenderbuffer.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderbuffer.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -37,7 +37,7 @@
</span><span class="cx"> public:
</span><span class="cx">     virtual ~WebGLRenderbuffer();
</span><span class="cx"> 
</span><del>-    static PassRefPtr&lt;WebGLRenderbuffer&gt; create(WebGLRenderingContext*);
</del><ins>+    static PassRefPtr&lt;WebGLRenderbuffer&gt; create(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     void setInternalFormat(GC3Denum internalformat)
</span><span class="cx">     {
</span><span class="lines">@@ -65,7 +65,7 @@
</span><span class="cx">     void setHasEverBeenBound() { m_hasEverBeenBound = true; }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    WebGLRenderbuffer(WebGLRenderingContext*);
</del><ins>+    WebGLRenderbuffer(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     virtual void deleteObjectImpl(GraphicsContext3D*, Platform3DObject) override;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLRenderingContextcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -1,6338 +0,0 @@
</span><del>-/*
- * Copyright (C) 2009, 2013, 2014 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-
-#include &quot;config.h&quot;
-
-#if ENABLE(WEBGL)
-
-#include &quot;WebGLRenderingContext.h&quot;
-
-#include &quot;ANGLEInstancedArrays.h&quot;
-#include &quot;CachedImage.h&quot;
-#include &quot;DOMWindow.h&quot;
-#include &quot;Document.h&quot;
-#include &quot;EXTBlendMinMax.h&quot;
-#include &quot;EXTFragDepth.h&quot;
-#include &quot;EXTShaderTextureLOD.h&quot;
-#include &quot;EXTTextureFilterAnisotropic.h&quot;
-#include &quot;EXTsRGB.h&quot;
-#include &quot;ExceptionCode.h&quot;
-#include &quot;Extensions3D.h&quot;
-#include &quot;Frame.h&quot;
-#include &quot;FrameLoader.h&quot;
-#include &quot;FrameLoaderClient.h&quot;
-#include &quot;FrameView.h&quot;
-#include &quot;GraphicsContext.h&quot;
-#include &quot;HTMLCanvasElement.h&quot;
-#include &quot;HTMLImageElement.h&quot;
-#include &quot;HTMLVideoElement.h&quot;
-#include &quot;ImageBuffer.h&quot;
-#include &quot;ImageData.h&quot;
-#include &quot;IntSize.h&quot;
-#include &quot;Logging.h&quot;
-#include &quot;MainFrame.h&quot;
-#include &quot;NotImplemented.h&quot;
-#include &quot;OESElementIndexUint.h&quot;
-#include &quot;OESStandardDerivatives.h&quot;
-#include &quot;OESTextureFloat.h&quot;
-#include &quot;OESTextureFloatLinear.h&quot;
-#include &quot;OESTextureHalfFloat.h&quot;
-#include &quot;OESTextureHalfFloatLinear.h&quot;
-#include &quot;OESVertexArrayObject.h&quot;
-#include &quot;Page.h&quot;
-#include &quot;RenderBox.h&quot;
-#include &quot;Settings.h&quot;
-#include &quot;WebGLActiveInfo.h&quot;
-#include &quot;WebGLBuffer.h&quot;
-#include &quot;WebGLCompressedTextureATC.h&quot;
-#include &quot;WebGLCompressedTexturePVRTC.h&quot;
-#include &quot;WebGLCompressedTextureS3TC.h&quot;
-#include &quot;WebGLContextAttributes.h&quot;
-#include &quot;WebGLContextEvent.h&quot;
-#include &quot;WebGLContextGroup.h&quot;
-#include &quot;WebGLDebugRendererInfo.h&quot;
-#include &quot;WebGLDebugShaders.h&quot;
-#include &quot;WebGLDepthTexture.h&quot;
-#include &quot;WebGLDrawBuffers.h&quot;
-#include &quot;WebGLFramebuffer.h&quot;
-#include &quot;WebGLLoseContext.h&quot;
-#include &quot;WebGLProgram.h&quot;
-#include &quot;WebGLRenderbuffer.h&quot;
-#include &quot;WebGLShader.h&quot;
-#include &quot;WebGLShaderPrecisionFormat.h&quot;
-#include &quot;WebGLTexture.h&quot;
-#include &quot;WebGLUniformLocation.h&quot;
-
-#include &lt;runtime/JSCInlines.h&gt;
-#include &lt;runtime/TypedArrayInlines.h&gt;
-#include &lt;runtime/Uint32Array.h&gt;
-#include &lt;wtf/StdLibExtras.h&gt;
-#include &lt;wtf/text/CString.h&gt;
-#include &lt;wtf/text/StringBuilder.h&gt;
-
-namespace WebCore {
-
-const double secondsBetweenRestoreAttempts = 1.0;
-const int maxGLErrorsAllowedToConsole = 256;
-
-namespace {
-
-    class ScopedDrawingBufferBinder {
-    public:
-        ScopedDrawingBufferBinder(DrawingBuffer* drawingBuffer, WebGLFramebuffer* framebufferBinding)
-            : m_drawingBuffer(drawingBuffer)
-            , m_framebufferBinding(framebufferBinding)
-        {
-            // Commit DrawingBuffer if needed (e.g., for multisampling)
-            if (!m_framebufferBinding &amp;&amp; m_drawingBuffer)
-                m_drawingBuffer-&gt;commit();
-        }
-
-        ~ScopedDrawingBufferBinder()
-        {
-            // Restore DrawingBuffer if needed
-            if (!m_framebufferBinding &amp;&amp; m_drawingBuffer)
-                m_drawingBuffer-&gt;bind();
-        }
-
-    private:
-        DrawingBuffer* m_drawingBuffer;
-        WebGLFramebuffer* m_framebufferBinding;
-    };
-
-    Platform3DObject objectOrZero(WebGLObject* object)
-    {
-        return object ? object-&gt;object() : 0;
-    }
-
-    void clip1D(GC3Dint start, GC3Dsizei range, GC3Dsizei sourceRange, GC3Dint* clippedStart, GC3Dsizei* clippedRange)
-    {
-        ASSERT(clippedStart &amp;&amp; clippedRange);
-        if (start &lt; 0) {
-            range += start;
-            start = 0;
-        }
-        GC3Dint end = start + range;
-        if (end &gt; sourceRange)
-            range -= end - sourceRange;
-        *clippedStart = start;
-        *clippedRange = range;
-    }
-
-    // Returns false if no clipping is necessary, i.e., x, y, width, height stay the same.
-    bool clip2D(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height,
-                GC3Dsizei sourceWidth, GC3Dsizei sourceHeight,
-                GC3Dint* clippedX, GC3Dint* clippedY, GC3Dsizei* clippedWidth, GC3Dsizei*clippedHeight)
-    {
-        ASSERT(clippedX &amp;&amp; clippedY &amp;&amp; clippedWidth &amp;&amp; clippedHeight);
-        clip1D(x, width, sourceWidth, clippedX, clippedWidth);
-        clip1D(y, height, sourceHeight, clippedY, clippedHeight);
-        return (*clippedX != x || *clippedY != y || *clippedWidth != width || *clippedHeight != height);
-    }
-
-    GC3Dint clamp(GC3Dint value, GC3Dint min, GC3Dint max)
-    {
-        if (value &lt; min)
-            value = min;
-        if (value &gt; max)
-            value = max;
-        return value;
-    }
-
-    // Return true if a character belongs to the ASCII subset as defined in
-    // GLSL ES 1.0 spec section 3.1.
-    bool validateCharacter(unsigned char c)
-    {
-        // Printing characters are valid except &quot; $ ` @ \ ' DEL.
-        if (c &gt;= 32 &amp;&amp; c &lt;= 126
-            &amp;&amp; c != '&quot;' &amp;&amp; c != '$' &amp;&amp; c != '`' &amp;&amp; c != '@' &amp;&amp; c != '\\' &amp;&amp; c != '\'')
-            return true;
-        // Horizontal tab, line feed, vertical tab, form feed, carriage return
-        // are also valid.
-        if (c &gt;= 9 &amp;&amp; c &lt;= 13)
-            return true;
-        return false;
-    }
-
-    bool isPrefixReserved(const String&amp; name)
-    {
-        if (name.startsWith(&quot;gl_&quot;) || name.startsWith(&quot;webgl_&quot;) || name.startsWith(&quot;_webgl_&quot;))
-            return true;
-        return false;
-    }
-
-    // Strips comments from shader text. This allows non-ASCII characters
-    // to be used in comments without potentially breaking OpenGL
-    // implementations not expecting characters outside the GLSL ES set.
-    class StripComments {
-    public:
-        StripComments(const String&amp; str)
-            : m_parseState(BeginningOfLine)
-            , m_sourceString(str)
-            , m_length(str.length())
-            , m_position(0)
-        {
-            parse();
-        }
-
-        String result()
-        {
-            return m_builder.toString();
-        }
-
-    private:
-        bool hasMoreCharacters() const
-        {
-            return (m_position &lt; m_length);
-        }
-
-        void parse()
-        {
-            while (hasMoreCharacters()) {
-                process(current());
-                // process() might advance the position.
-                if (hasMoreCharacters())
-                    advance();
-            }
-        }
-
-        void process(UChar);
-
-        bool peek(UChar&amp; character) const
-        {
-            if (m_position + 1 &gt;= m_length)
-                return false;
-            character = m_sourceString[m_position + 1];
-            return true;
-        }
-
-        UChar current() const
-        {
-            ASSERT_WITH_SECURITY_IMPLICATION(m_position &lt; m_length);
-            return m_sourceString[m_position];
-        }
-
-        void advance()
-        {
-            ++m_position;
-        }
-
-        bool isNewline(UChar character) const
-        {
-            // Don't attempt to canonicalize newline related characters.
-            return (character == '\n' || character == '\r');
-        }
-
-        void emit(UChar character)
-        {
-            m_builder.append(character);
-        }
-
-        enum ParseState {
-            // Have not seen an ASCII non-whitespace character yet on
-            // this line. Possible that we might see a preprocessor
-            // directive.
-            BeginningOfLine,
-
-            // Have seen at least one ASCII non-whitespace character
-            // on this line.
-            MiddleOfLine,
-
-            // Handling a preprocessor directive. Passes through all
-            // characters up to the end of the line. Disables comment
-            // processing.
-            InPreprocessorDirective,
-
-            // Handling a single-line comment. The comment text is
-            // replaced with a single space.
-            InSingleLineComment,
-
-            // Handling a multi-line comment. Newlines are passed
-            // through to preserve line numbers.
-            InMultiLineComment
-        };
-
-        ParseState m_parseState;
-        String m_sourceString;
-        unsigned m_length;
-        unsigned m_position;
-        StringBuilder m_builder;
-    };
-
-    void StripComments::process(UChar c)
-    {
-        if (isNewline(c)) {
-            // No matter what state we are in, pass through newlines
-            // so we preserve line numbers.
-            emit(c);
-
-            if (m_parseState != InMultiLineComment)
-                m_parseState = BeginningOfLine;
-
-            return;
-        }
-
-        UChar temp = 0;
-        switch (m_parseState) {
-        case BeginningOfLine:
-            if (WTF::isASCIISpace(c)) {
-                emit(c);
-                break;
-            }
-
-            if (c == '#') {
-                m_parseState = InPreprocessorDirective;
-                emit(c);
-                break;
-            }
-
-            // Transition to normal state and re-handle character.
-            m_parseState = MiddleOfLine;
-            process(c);
-            break;
-
-        case MiddleOfLine:
-            if (c == '/' &amp;&amp; peek(temp)) {
-                if (temp == '/') {
-                    m_parseState = InSingleLineComment;
-                    emit(' ');
-                    advance();
-                    break;
-                }
-
-                if (temp == '*') {
-                    m_parseState = InMultiLineComment;
-                    // Emit the comment start in case the user has
-                    // an unclosed comment and we want to later
-                    // signal an error.
-                    emit('/');
-                    emit('*');
-                    advance();
-                    break;
-                }
-            }
-
-            emit(c);
-            break;
-
-        case InPreprocessorDirective:
-            // No matter what the character is, just pass it
-            // through. Do not parse comments in this state. This
-            // might not be the right thing to do long term, but it
-            // should handle the #error preprocessor directive.
-            emit(c);
-            break;
-
-        case InSingleLineComment:
-            // The newline code at the top of this function takes care
-            // of resetting our state when we get out of the
-            // single-line comment. Swallow all other characters.
-            break;
-
-        case InMultiLineComment:
-            if (c == '*' &amp;&amp; peek(temp) &amp;&amp; temp == '/') {
-                emit('*');
-                emit('/');
-                m_parseState = MiddleOfLine;
-                advance();
-                break;
-            }
-
-            // Swallow all other characters. Unclear whether we may
-            // want or need to just emit a space per character to try
-            // to preserve column numbers for debugging purposes.
-            break;
-        }
-    }
-} // namespace anonymous
-
-class WebGLRenderingContextLostCallback : public GraphicsContext3D::ContextLostCallback {
-    WTF_MAKE_FAST_ALLOCATED;
-public:
-    explicit WebGLRenderingContextLostCallback(WebGLRenderingContext* cb) : m_context(cb) { }
-    virtual void onContextLost() override { m_context-&gt;forceLostContext(WebGLRenderingContext::RealLostContext); }
-    virtual ~WebGLRenderingContextLostCallback() {}
-private:
-    WebGLRenderingContext* m_context;
-};
-
-class WebGLRenderingContextErrorMessageCallback : public GraphicsContext3D::ErrorMessageCallback {
-    WTF_MAKE_FAST_ALLOCATED;
-public:
-    explicit WebGLRenderingContextErrorMessageCallback(WebGLRenderingContext* cb) : m_context(cb) { }
-    virtual void onErrorMessage(const String&amp; message, GC3Dint) override
-    {
-        if (m_context-&gt;m_synthesizedErrorsToConsole)
-            m_context-&gt;printGLErrorToConsole(message);
-    }
-    virtual ~WebGLRenderingContextErrorMessageCallback() { }
-private:
-    WebGLRenderingContext* m_context;
-};
-
-std::unique_ptr&lt;WebGLRenderingContext&gt; WebGLRenderingContext::create(HTMLCanvasElement* canvas, WebGLContextAttributes* attrs)
-{
-    Document&amp; document = canvas-&gt;document();
-    Frame* frame = document.frame();
-    if (!frame)
-        return nullptr;
-
-    // The FrameLoaderClient might block creation of a new WebGL context despite the page settings; in
-    // particular, if WebGL contexts were lost one or more times via the GL_ARB_robustness extension.
-    if (!frame-&gt;loader().client().allowWebGL(frame-&gt;settings().webGLEnabled())) {
-        canvas-&gt;dispatchEvent(WebGLContextEvent::create(eventNames().webglcontextcreationerrorEvent, false, true, &quot;Web page was not allowed to create a WebGL context.&quot;));
-        return nullptr;
-    }
-
-    bool isPendingPolicyResolution = false;
-    Document&amp; topDocument = document.topDocument();
-    Page* page = topDocument.page();
-    if (page &amp;&amp; !topDocument.url().isLocalFile()) {
-        WebGLLoadPolicy policy = page-&gt;mainFrame().loader().client().webGLPolicyForURL(topDocument.url());
-
-        if (policy == WebGLBlockCreation) {
-            LOG(WebGL, &quot;The policy for this URL (%s) is to block WebGL.&quot;, topDocument.url().host().utf8().data());
-            return nullptr;
-        }
-
-        if (policy == WebGLPendingCreation) {
-            LOG(WebGL, &quot;WebGL policy is pending. May need to be resolved later.&quot;);
-            isPendingPolicyResolution = true;
-        }
-    }
-
-    GraphicsContext3D::Attributes attributes = attrs ? attrs-&gt;attributes() : GraphicsContext3D::Attributes();
-
-    if (attributes.antialias) {
-        if (!frame-&gt;settings().openGLMultisamplingEnabled())
-            attributes.antialias = false;
-    }
-
-    attributes.noExtensions = true;
-    attributes.shareResources = false;
-    attributes.preferDiscreteGPU = true;
-
-    if (frame-&gt;settings().forceSoftwareWebGLRendering())
-        attributes.forceSoftwareRenderer = true;
-
-    if (page)
-        attributes.devicePixelRatio = page-&gt;deviceScaleFactor();
-
-    if (isPendingPolicyResolution) {
-        LOG(WebGL, &quot;Create a WebGL context that looks real, but will require a policy resolution if used.&quot;);
-        std::unique_ptr&lt;WebGLRenderingContext&gt; renderingContext(new WebGLRenderingContext(canvas, attributes));
-        renderingContext-&gt;suspendIfNeeded();
-        return renderingContext;
-    }
-
-    HostWindow* hostWindow = document.view()-&gt;root()-&gt;hostWindow();
-    RefPtr&lt;GraphicsContext3D&gt; context(GraphicsContext3D::create(attributes, hostWindow));
-
-    if (!context || !context-&gt;makeContextCurrent()) {
-        canvas-&gt;dispatchEvent(WebGLContextEvent::create(eventNames().webglcontextcreationerrorEvent, false, true, &quot;Could not create a WebGL context.&quot;));
-        return nullptr;
-    }
-
-    Extensions3D* extensions = context-&gt;getExtensions();
-    if (extensions-&gt;supports(&quot;GL_EXT_debug_marker&quot;))
-        extensions-&gt;pushGroupMarkerEXT(&quot;WebGLRenderingContext&quot;);
-
-    std::unique_ptr&lt;WebGLRenderingContext&gt; renderingContext(new WebGLRenderingContext(canvas, context, attributes));
-    renderingContext-&gt;suspendIfNeeded();
-
-    return renderingContext;
-}
-
-WebGLRenderingContext::WebGLRenderingContext(HTMLCanvasElement* passedCanvas, GraphicsContext3D::Attributes attributes)
-    : CanvasRenderingContext(passedCanvas)
-    , ActiveDOMObject(&amp;passedCanvas-&gt;document())
-    , m_context(0)
-    , m_drawingBuffer(0)
-    , m_dispatchContextLostEventTimer(*this, &amp;WebGLRenderingContext::dispatchContextLostEvent)
-    , m_restoreAllowed(false)
-    , m_restoreTimer(*this, &amp;WebGLRenderingContext::maybeRestoreContext)
-    , m_generatedImageCache(0)
-    , m_contextLost(false)
-    , m_contextLostMode(SyntheticLostContext)
-    , m_attributes(attributes)
-    , m_synthesizedErrorsToConsole(true)
-    , m_numGLErrorsToConsoleAllowed(maxGLErrorsAllowedToConsole)
-    , m_isPendingPolicyResolution(true)
-    , m_hasRequestedPolicyResolution(false)
-{
-}
-
-WebGLRenderingContext::WebGLRenderingContext(HTMLCanvasElement* passedCanvas, PassRefPtr&lt;GraphicsContext3D&gt; context,
-    GraphicsContext3D::Attributes attributes)
-    : CanvasRenderingContext(passedCanvas)
-    , ActiveDOMObject(&amp;passedCanvas-&gt;document())
-    , m_context(context)
-    , m_drawingBuffer(0)
-    , m_dispatchContextLostEventTimer(*this, &amp;WebGLRenderingContext::dispatchContextLostEvent)
-    , m_restoreAllowed(false)
-    , m_restoreTimer(*this, &amp;WebGLRenderingContext::maybeRestoreContext)
-    , m_generatedImageCache(4)
-    , m_contextLost(false)
-    , m_contextLostMode(SyntheticLostContext)
-    , m_attributes(attributes)
-    , m_synthesizedErrorsToConsole(true)
-    , m_numGLErrorsToConsoleAllowed(maxGLErrorsAllowedToConsole)
-    , m_isPendingPolicyResolution(false)
-    , m_hasRequestedPolicyResolution(false)
-{
-    ASSERT(m_context);
-    m_contextGroup = WebGLContextGroup::create();
-    m_contextGroup-&gt;addContext(this);
-
-    m_maxViewportDims[0] = m_maxViewportDims[1] = 0;
-    m_context-&gt;getIntegerv(GraphicsContext3D::MAX_VIEWPORT_DIMS, m_maxViewportDims);
-
-    if (m_drawingBuffer)
-        m_drawingBuffer-&gt;bind();
-
-    setupFlags();
-    initializeNewContext();
-}
-
-void WebGLRenderingContext::initializeNewContext()
-{
-    ASSERT(!m_contextLost);
-    m_needsUpdate = true;
-    m_markedCanvasDirty = false;
-    m_activeTextureUnit = 0;
-    m_packAlignment = 4;
-    m_unpackAlignment = 4;
-    m_unpackFlipY = false;
-    m_unpackPremultiplyAlpha = false;
-    m_unpackColorspaceConversion = GraphicsContext3D::BROWSER_DEFAULT_WEBGL;
-    m_boundArrayBuffer = 0;
-    m_currentProgram = 0;
-    m_framebufferBinding = 0;
-    m_renderbufferBinding = 0;
-    m_depthMask = true;
-    m_stencilEnabled = false;
-    m_stencilMask = 0xFFFFFFFF;
-    m_stencilMaskBack = 0xFFFFFFFF;
-    m_stencilFuncRef = 0;
-    m_stencilFuncRefBack = 0;
-    m_stencilFuncMask = 0xFFFFFFFF;
-    m_stencilFuncMaskBack = 0xFFFFFFFF;
-    m_layerCleared = false;
-    m_numGLErrorsToConsoleAllowed = maxGLErrorsAllowedToConsole;
-    
-    m_clearColor[0] = m_clearColor[1] = m_clearColor[2] = m_clearColor[3] = 0;
-    m_scissorEnabled = false;
-    m_clearDepth = 1;
-    m_clearStencil = 0;
-    m_colorMask[0] = m_colorMask[1] = m_colorMask[2] = m_colorMask[3] = true;
-
-    GC3Dint numCombinedTextureImageUnits = 0;
-    m_context-&gt;getIntegerv(GraphicsContext3D::MAX_COMBINED_TEXTURE_IMAGE_UNITS, &amp;numCombinedTextureImageUnits);
-    m_textureUnits.clear();
-    m_textureUnits.resize(numCombinedTextureImageUnits);
-
-    GC3Dint numVertexAttribs = 0;
-    m_context-&gt;getIntegerv(GraphicsContext3D::MAX_VERTEX_ATTRIBS, &amp;numVertexAttribs);
-    m_maxVertexAttribs = numVertexAttribs;
-    
-    m_maxTextureSize = 0;
-    m_context-&gt;getIntegerv(GraphicsContext3D::MAX_TEXTURE_SIZE, &amp;m_maxTextureSize);
-    m_maxTextureLevel = WebGLTexture::computeLevelCount(m_maxTextureSize, m_maxTextureSize);
-    m_maxCubeMapTextureSize = 0;
-    m_context-&gt;getIntegerv(GraphicsContext3D::MAX_CUBE_MAP_TEXTURE_SIZE, &amp;m_maxCubeMapTextureSize);
-    m_maxCubeMapTextureLevel = WebGLTexture::computeLevelCount(m_maxCubeMapTextureSize, m_maxCubeMapTextureSize);
-    m_maxRenderbufferSize = 0;
-    m_context-&gt;getIntegerv(GraphicsContext3D::MAX_RENDERBUFFER_SIZE, &amp;m_maxRenderbufferSize);
-
-    // These two values from EXT_draw_buffers are lazily queried.
-    m_maxDrawBuffers = 0;
-    m_maxColorAttachments = 0;
-
-    m_backDrawBuffer = GraphicsContext3D::BACK;
-    m_drawBuffersWebGLRequirementsChecked = false;
-    m_drawBuffersSupported = false;
-
-    m_defaultVertexArrayObject = WebGLVertexArrayObjectOES::create(this, WebGLVertexArrayObjectOES::VaoTypeDefault);
-    addContextObject(m_defaultVertexArrayObject.get());
-    m_boundVertexArrayObject = m_defaultVertexArrayObject;
-    
-    m_vertexAttribValue.resize(m_maxVertexAttribs);
-
-    if (!isGLES2NPOTStrict())
-        createFallbackBlackTextures1x1();
-    if (!isGLES2Compliant())
-        initVertexAttrib0();
-
-    IntSize canvasSize = clampedCanvasSize();
-    if (m_drawingBuffer)
-        m_drawingBuffer-&gt;reset(canvasSize);
-
-    m_context-&gt;reshape(canvasSize.width(), canvasSize.height());
-    m_context-&gt;viewport(0, 0, canvasSize.width(), canvasSize.height());
-    m_context-&gt;scissor(0, 0, canvasSize.width(), canvasSize.height());
-
-    m_context-&gt;setContextLostCallback(std::make_unique&lt;WebGLRenderingContextLostCallback&gt;(this));
-    m_context-&gt;setErrorMessageCallback(std::make_unique&lt;WebGLRenderingContextErrorMessageCallback&gt;(this));
-}
-
-void WebGLRenderingContext::setupFlags()
-{
-    ASSERT(m_context);
-
-    if (Page* page = canvas()-&gt;document().page())
-        m_synthesizedErrorsToConsole = page-&gt;settings().webGLErrorsToConsoleEnabled();
-
-    m_isGLES2Compliant = m_context-&gt;isGLES2Compliant();
-    m_isErrorGeneratedOnOutOfBoundsAccesses = m_context-&gt;getExtensions()-&gt;isEnabled(&quot;GL_CHROMIUM_strict_attribs&quot;);
-    m_isResourceSafe = m_context-&gt;getExtensions()-&gt;isEnabled(&quot;GL_CHROMIUM_resource_safe&quot;);
-    if (m_isGLES2Compliant) {
-        m_isGLES2NPOTStrict = !m_context-&gt;getExtensions()-&gt;isEnabled(&quot;GL_OES_texture_npot&quot;);
-        m_isDepthStencilSupported = m_context-&gt;getExtensions()-&gt;isEnabled(&quot;GL_OES_packed_depth_stencil&quot;);
-    } else {
-        m_isGLES2NPOTStrict = !m_context-&gt;getExtensions()-&gt;isEnabled(&quot;GL_ARB_texture_non_power_of_two&quot;);
-        m_isDepthStencilSupported = m_context-&gt;getExtensions()-&gt;isEnabled(&quot;GL_EXT_packed_depth_stencil&quot;);
-    }
-    m_isRobustnessEXTSupported = m_context-&gt;getExtensions()-&gt;isEnabled(&quot;GL_EXT_robustness&quot;);
-}
-
-bool WebGLRenderingContext::allowPrivilegedExtensions() const
-{
-    if (Page* page = canvas()-&gt;document().page())
-        return page-&gt;settings().privilegedWebGLExtensionsEnabled();
-    return false;
-}
-
-void WebGLRenderingContext::addCompressedTextureFormat(GC3Denum format)
-{
-    if (!m_compressedTextureFormats.contains(format))
-        m_compressedTextureFormats.append(format);
-}
-
-WebGLRenderingContext::~WebGLRenderingContext()
-{
-    // Remove all references to WebGLObjects so if they are the last reference
-    // they will be freed before the last context is removed from the context group.
-    m_boundArrayBuffer = nullptr;
-    m_defaultVertexArrayObject = nullptr;
-    m_boundVertexArrayObject = nullptr;
-    m_vertexAttrib0Buffer = nullptr;
-    m_currentProgram = nullptr;
-    m_framebufferBinding = nullptr;
-    m_renderbufferBinding = nullptr;
-
-    for (size_t i = 0; i &lt; m_textureUnits.size(); ++i) {
-        m_textureUnits[i].texture2DBinding = nullptr;
-        m_textureUnits[i].textureCubeMapBinding = nullptr;
-    }
-
-    m_blackTexture2D = nullptr;
-    m_blackTextureCubeMap = nullptr;
-
-    if (!m_isPendingPolicyResolution) {
-        detachAndRemoveAllObjects();
-        destroyGraphicsContext3D();
-        m_contextGroup-&gt;removeContext(this);
-    }
-}
-
-void WebGLRenderingContext::destroyGraphicsContext3D()
-{
-    if (m_isPendingPolicyResolution)
-        return;
-
-    // The drawing buffer holds a context reference. It must also be destroyed
-    // in order for the context to be released.
-    if (m_drawingBuffer)
-        m_drawingBuffer.clear();
-
-    if (m_context) {
-        m_context-&gt;setContextLostCallback(nullptr);
-        m_context-&gt;setErrorMessageCallback(nullptr);
-        m_context.clear();
-    }
-}
-
-void WebGLRenderingContext::markContextChanged()
-{
-    if (m_framebufferBinding)
-        return;
-
-    m_context-&gt;markContextChanged();
-
-    if (m_drawingBuffer)
-        m_drawingBuffer-&gt;markContentsChanged();
-
-    m_layerCleared = false;
-    RenderBox* renderBox = canvas()-&gt;renderBox();
-    if (isAccelerated() &amp;&amp; renderBox &amp;&amp; renderBox-&gt;hasAcceleratedCompositing()) {
-        m_markedCanvasDirty = true;
-        canvas()-&gt;clearCopiedImage();
-        renderBox-&gt;contentChanged(CanvasChanged);
-    } else {
-        if (!m_markedCanvasDirty) {
-            m_markedCanvasDirty = true;
-            canvas()-&gt;didDraw(FloatRect(FloatPoint(0, 0), clampedCanvasSize()));
-        }
-    }
-}
-
-bool WebGLRenderingContext::clearIfComposited(GC3Dbitfield mask)
-{
-    if (isContextLostOrPending())
-        return false;
-
-    if (!m_context-&gt;layerComposited() || m_layerCleared
-        || m_attributes.preserveDrawingBuffer || (mask &amp;&amp; m_framebufferBinding))
-        return false;
-
-    RefPtr&lt;WebGLContextAttributes&gt; contextAttributes = getContextAttributes();
-
-    // Determine if it's possible to combine the clear the user asked for and this clear.
-    bool combinedClear = mask &amp;&amp; !m_scissorEnabled;
-
-    m_context-&gt;disable(GraphicsContext3D::SCISSOR_TEST);
-    if (combinedClear &amp;&amp; (mask &amp; GraphicsContext3D::COLOR_BUFFER_BIT))
-        m_context-&gt;clearColor(m_colorMask[0] ? m_clearColor[0] : 0,
-                              m_colorMask[1] ? m_clearColor[1] : 0,
-                              m_colorMask[2] ? m_clearColor[2] : 0,
-                              m_colorMask[3] ? m_clearColor[3] : 0);
-    else
-        m_context-&gt;clearColor(0, 0, 0, 0);
-    m_context-&gt;colorMask(true, true, true, true);
-    GC3Dbitfield clearMask = GraphicsContext3D::COLOR_BUFFER_BIT;
-    if (contextAttributes-&gt;depth()) {
-        if (!combinedClear || !m_depthMask || !(mask &amp; GraphicsContext3D::DEPTH_BUFFER_BIT))
-            m_context-&gt;clearDepth(1.0f);
-        clearMask |= GraphicsContext3D::DEPTH_BUFFER_BIT;
-        m_context-&gt;depthMask(true);
-    }
-    if (contextAttributes-&gt;stencil()) {
-        if (combinedClear &amp;&amp; (mask &amp; GraphicsContext3D::STENCIL_BUFFER_BIT))
-            m_context-&gt;clearStencil(m_clearStencil &amp; m_stencilMask);
-        else
-            m_context-&gt;clearStencil(0);
-        clearMask |= GraphicsContext3D::STENCIL_BUFFER_BIT;
-        m_context-&gt;stencilMaskSeparate(GraphicsContext3D::FRONT, 0xFFFFFFFF);
-    }
-    if (m_drawingBuffer)
-        m_drawingBuffer-&gt;clearFramebuffers(clearMask);
-    else {
-        if (m_framebufferBinding)
-            m_context-&gt;bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, 0);
-        m_context-&gt;clear(clearMask);
-    }
-
-    restoreStateAfterClear();
-    if (m_framebufferBinding)
-        m_context-&gt;bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, objectOrZero(m_framebufferBinding.get()));
-    m_layerCleared = true;
-
-    return combinedClear;
-}
-
-void WebGLRenderingContext::restoreStateAfterClear()
-{
-    // Restore the state that the context set.
-    if (m_scissorEnabled)
-        m_context-&gt;enable(GraphicsContext3D::SCISSOR_TEST);
-    m_context-&gt;clearColor(m_clearColor[0], m_clearColor[1],
-                          m_clearColor[2], m_clearColor[3]);
-    m_context-&gt;colorMask(m_colorMask[0], m_colorMask[1],
-                         m_colorMask[2], m_colorMask[3]);
-    m_context-&gt;clearDepth(m_clearDepth);
-    m_context-&gt;clearStencil(m_clearStencil);
-    m_context-&gt;stencilMaskSeparate(GraphicsContext3D::FRONT, m_stencilMask);
-    m_context-&gt;depthMask(m_depthMask);
-}
-
-void WebGLRenderingContext::markLayerComposited()
-{
-    if (isContextLostOrPending())
-        return;
-    m_context-&gt;markLayerComposited();
-}
-
-void WebGLRenderingContext::paintRenderingResultsToCanvas()
-{
-    if (isContextLostOrPending())
-        return;
-
-    if (canvas()-&gt;document().printing())
-        canvas()-&gt;clearPresentationCopy();
-
-    // Until the canvas is written to by the application, the clear that
-    // happened after it was composited should be ignored by the compositor.
-    if (m_context-&gt;layerComposited() &amp;&amp; !m_attributes.preserveDrawingBuffer) {
-        m_context-&gt;paintCompositedResultsToCanvas(canvas()-&gt;buffer());
-
-        canvas()-&gt;makePresentationCopy();
-    } else
-        canvas()-&gt;clearPresentationCopy();
-    clearIfComposited();
-
-    if (!m_markedCanvasDirty &amp;&amp; !m_layerCleared)
-        return;
-
-    canvas()-&gt;clearCopiedImage();
-    m_markedCanvasDirty = false;
-
-    if (m_drawingBuffer)
-        m_drawingBuffer-&gt;commit();
-    m_context-&gt;paintRenderingResultsToCanvas(canvas()-&gt;buffer(), m_drawingBuffer.get());
-
-    if (m_drawingBuffer) {
-        if (m_framebufferBinding)
-            m_context-&gt;bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, objectOrZero(m_framebufferBinding.get()));
-        else
-            m_drawingBuffer-&gt;bind();
-    }
-}
-
-PassRefPtr&lt;ImageData&gt; WebGLRenderingContext::paintRenderingResultsToImageData()
-{
-    if (isContextLostOrPending())
-        return nullptr;
-    clearIfComposited();
-    if (m_drawingBuffer)
-        m_drawingBuffer-&gt;commit();
-    RefPtr&lt;ImageData&gt; imageData = m_context-&gt;paintRenderingResultsToImageData(m_drawingBuffer.get());
-
-    if (m_drawingBuffer) {
-        if (m_framebufferBinding)
-            m_context-&gt;bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, objectOrZero(m_framebufferBinding.get()));
-        else
-            m_drawingBuffer-&gt;bind();
-    }
-
-    return imageData;
-}
-
-void WebGLRenderingContext::reshape(int width, int height)
-{
-    if (isContextLostOrPending())
-        return;
-
-    // This is an approximation because at WebGLRenderingContext level we don't
-    // know if the underlying FBO uses textures or renderbuffers.
-    GC3Dint maxSize = std::min(m_maxTextureSize, m_maxRenderbufferSize);
-    // Limit drawing buffer size to 4k to avoid memory exhaustion.
-    const int sizeUpperLimit = 4096;
-    maxSize = std::min(maxSize, sizeUpperLimit);
-    GC3Dint maxWidth = std::min(maxSize, m_maxViewportDims[0]);
-    GC3Dint maxHeight = std::min(maxSize, m_maxViewportDims[1]);
-    width = clamp(width, 1, maxWidth);
-    height = clamp(height, 1, maxHeight);
-
-    if (m_needsUpdate) {
-        RenderBox* renderBox = canvas()-&gt;renderBox();
-        if (renderBox &amp;&amp; renderBox-&gt;hasAcceleratedCompositing())
-            renderBox-&gt;contentChanged(CanvasChanged);
-        m_needsUpdate = false;
-    }
-
-    // We don't have to mark the canvas as dirty, since the newly created image buffer will also start off
-    // clear (and this matches what reshape will do).
-    if (m_drawingBuffer) {
-        m_drawingBuffer-&gt;reset(IntSize(width, height));
-        restoreStateAfterClear();
-    } else
-        m_context-&gt;reshape(width, height);
-
-    m_context-&gt;bindTexture(GraphicsContext3D::TEXTURE_2D, objectOrZero(m_textureUnits[m_activeTextureUnit].texture2DBinding.get()));
-    m_context-&gt;bindRenderbuffer(GraphicsContext3D::RENDERBUFFER, objectOrZero(m_renderbufferBinding.get()));
-    if (m_framebufferBinding)
-      m_context-&gt;bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, objectOrZero(m_framebufferBinding.get()));
-}
-
-int WebGLRenderingContext::drawingBufferWidth() const
-{
-    if (m_drawingBuffer)
-        return m_drawingBuffer-&gt;size().width();
-
-    return m_context-&gt;getInternalFramebufferSize().width();
-}
-
-int WebGLRenderingContext::drawingBufferHeight() const
-{
-    if (m_drawingBuffer)
-        return m_drawingBuffer-&gt;size().height();
-
-    return m_context-&gt;getInternalFramebufferSize().height();
-}
-
-unsigned int WebGLRenderingContext::sizeInBytes(GC3Denum type)
-{
-    switch (type) {
-    case GraphicsContext3D::BYTE:
-        return sizeof(GC3Dbyte);
-    case GraphicsContext3D::UNSIGNED_BYTE:
-        return sizeof(GC3Dubyte);
-    case GraphicsContext3D::SHORT:
-        return sizeof(GC3Dshort);
-    case GraphicsContext3D::UNSIGNED_SHORT:
-        return sizeof(GC3Dushort);
-    case GraphicsContext3D::INT:
-        return sizeof(GC3Dint);
-    case GraphicsContext3D::UNSIGNED_INT:
-        return sizeof(GC3Duint);
-    case GraphicsContext3D::FLOAT:
-        return sizeof(GC3Dfloat);
-    }
-    ASSERT_NOT_REACHED();
-    return 0;
-}
-
-void WebGLRenderingContext::activeTexture(GC3Denum texture, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return;
-    if (texture - GraphicsContext3D::TEXTURE0 &gt;= m_textureUnits.size()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;activeTexture&quot;, &quot;texture unit out of range&quot;);
-        return;
-    }
-    m_activeTextureUnit = texture - GraphicsContext3D::TEXTURE0;
-    m_context-&gt;activeTexture(texture);
-
-    if (m_drawingBuffer)
-        m_drawingBuffer-&gt;setActiveTextureUnit(texture);
-}
-
-void WebGLRenderingContext::attachShader(WebGLProgram* program, WebGLShader* shader, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateWebGLObject(&quot;attachShader&quot;, program) || !validateWebGLObject(&quot;attachShader&quot;, shader))
-        return;
-    if (!program-&gt;attachShader(shader)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;attachShader&quot;, &quot;shader attachment already has shader&quot;);
-        return;
-    }
-    m_context-&gt;attachShader(objectOrZero(program), objectOrZero(shader));
-    shader-&gt;onAttached();
-}
-
-void WebGLRenderingContext::bindAttribLocation(WebGLProgram* program, GC3Duint index, const String&amp; name, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateWebGLObject(&quot;bindAttribLocation&quot;, program))
-        return;
-    if (!validateLocationLength(&quot;bindAttribLocation&quot;, name))
-        return;
-    if (!validateString(&quot;bindAttribLocation&quot;, name))
-        return;
-    if (isPrefixReserved(name)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;bindAttribLocation&quot;, &quot;reserved prefix&quot;);
-        return;
-    }
-    if (index &gt;= m_maxVertexAttribs) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bindAttribLocation&quot;, &quot;index out of range&quot;);
-        return;
-    }
-    m_context-&gt;bindAttribLocation(objectOrZero(program), index, name);
-}
-
-bool WebGLRenderingContext::checkObjectToBeBound(const char* functionName, WebGLObject* object, bool&amp; deleted)
-{
-    deleted = false;
-    if (isContextLostOrPending())
-        return false;
-    if (object) {
-        if (!object-&gt;validate(contextGroup(), this)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;object not from this context&quot;);
-            return false;
-        }
-        deleted = !object-&gt;object();
-    }
-    return true;
-}
-
-void WebGLRenderingContext::bindBuffer(GC3Denum target, WebGLBuffer* buffer, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    bool deleted;
-    if (!checkObjectToBeBound(&quot;bindBuffer&quot;, buffer, deleted))
-        return;
-    if (deleted)
-        buffer = 0;
-    if (buffer &amp;&amp; buffer-&gt;getTarget() &amp;&amp; buffer-&gt;getTarget() != target) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;bindBuffer&quot;, &quot;buffers can not be used with multiple targets&quot;);
-        return;
-    }
-    if (target == GraphicsContext3D::ARRAY_BUFFER)
-        m_boundArrayBuffer = buffer;
-    else if (target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER)
-        m_boundVertexArrayObject-&gt;setElementArrayBuffer(buffer);
-    else {
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;bindBuffer&quot;, &quot;invalid target&quot;);
-        return;
-    }
-
-    m_context-&gt;bindBuffer(target, objectOrZero(buffer));
-    if (buffer)
-        buffer-&gt;setTarget(target);
-}
-
-void WebGLRenderingContext::bindFramebuffer(GC3Denum target, WebGLFramebuffer* buffer, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    bool deleted;
-    if (!checkObjectToBeBound(&quot;bindFramebuffer&quot;, buffer, deleted))
-        return;
-    if (deleted)
-        buffer = 0;
-    if (target != GraphicsContext3D::FRAMEBUFFER) {
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;bindFramebuffer&quot;, &quot;invalid target&quot;);
-        return;
-    }
-    m_framebufferBinding = buffer;
-    if (m_drawingBuffer)
-        m_drawingBuffer-&gt;setFramebufferBinding(objectOrZero(m_framebufferBinding.get()));
-    if (!m_framebufferBinding &amp;&amp; m_drawingBuffer) {
-        // Instead of binding fb 0, bind the drawing buffer.
-        m_drawingBuffer-&gt;bind();
-    } else
-        m_context-&gt;bindFramebuffer(target, objectOrZero(buffer));
-    if (buffer)
-        buffer-&gt;setHasEverBeenBound();
-    applyStencilTest();
-}
-
-void WebGLRenderingContext::bindRenderbuffer(GC3Denum target, WebGLRenderbuffer* renderBuffer, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    bool deleted;
-    if (!checkObjectToBeBound(&quot;bindRenderbuffer&quot;, renderBuffer, deleted))
-        return;
-    if (deleted)
-        renderBuffer = 0;
-    if (target != GraphicsContext3D::RENDERBUFFER) {
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;bindRenderbuffer&quot;, &quot;invalid target&quot;);
-        return;
-    }
-    m_renderbufferBinding = renderBuffer;
-    m_context-&gt;bindRenderbuffer(target, objectOrZero(renderBuffer));
-    if (renderBuffer)
-        renderBuffer-&gt;setHasEverBeenBound();
-}
-
-void WebGLRenderingContext::bindTexture(GC3Denum target, WebGLTexture* texture, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    bool deleted;
-    if (!checkObjectToBeBound(&quot;bindTexture&quot;, texture, deleted))
-        return;
-    if (deleted)
-        texture = 0;
-    if (texture &amp;&amp; texture-&gt;getTarget() &amp;&amp; texture-&gt;getTarget() != target) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;bindTexture&quot;, &quot;textures can not be used with multiple targets&quot;);
-        return;
-    }
-    GC3Dint maxLevel = 0;
-    if (target == GraphicsContext3D::TEXTURE_2D) {
-        m_textureUnits[m_activeTextureUnit].texture2DBinding = texture;
-        maxLevel = m_maxTextureLevel;
-
-        if (m_drawingBuffer &amp;&amp; !m_activeTextureUnit)
-            m_drawingBuffer-&gt;setTexture2DBinding(objectOrZero(texture));
-
-    } else if (target == GraphicsContext3D::TEXTURE_CUBE_MAP) {
-        m_textureUnits[m_activeTextureUnit].textureCubeMapBinding = texture;
-        maxLevel = m_maxCubeMapTextureLevel;
-    } else {
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;bindTexture&quot;, &quot;invalid target&quot;);
-        return;
-    }
-    m_context-&gt;bindTexture(target, objectOrZero(texture));
-    if (texture)
-        texture-&gt;setTarget(target, maxLevel);
-
-    // Note: previously we used to automatically set the TEXTURE_WRAP_R
-    // repeat mode to CLAMP_TO_EDGE for cube map textures, because OpenGL
-    // ES 2.0 doesn't expose this flag (a bug in the specification) and
-    // otherwise the application has no control over the seams in this
-    // dimension. However, it appears that supporting this properly on all
-    // platforms is fairly involved (will require a HashMap from texture ID
-    // in all ports), and we have not had any complaints, so the logic has
-    // been removed.
-}
-
-void WebGLRenderingContext::blendColor(GC3Dfloat red, GC3Dfloat green, GC3Dfloat blue, GC3Dfloat alpha)
-{
-    if (isContextLostOrPending())
-        return;
-    m_context-&gt;blendColor(red, green, blue, alpha);
-}
-
-void WebGLRenderingContext::blendEquation(GC3Denum mode)
-{
-    if (isContextLostOrPending() || !validateBlendEquation(&quot;blendEquation&quot;, mode))
-        return;
-    m_context-&gt;blendEquation(mode);
-}
-
-void WebGLRenderingContext::blendEquationSeparate(GC3Denum modeRGB, GC3Denum modeAlpha)
-{
-    if (isContextLostOrPending() || !validateBlendEquation(&quot;blendEquation&quot;, modeRGB) || !validateBlendEquation(&quot;blendEquation&quot;, modeAlpha))
-        return;
-    m_context-&gt;blendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-void WebGLRenderingContext::blendFunc(GC3Denum sfactor, GC3Denum dfactor)
-{
-    if (isContextLostOrPending() || !validateBlendFuncFactors(&quot;blendFunc&quot;, sfactor, dfactor))
-        return;
-    m_context-&gt;blendFunc(sfactor, dfactor);
-}
-
-void WebGLRenderingContext::blendFuncSeparate(GC3Denum srcRGB, GC3Denum dstRGB, GC3Denum srcAlpha, GC3Denum dstAlpha)
-{
-    // Note: Alpha does not have the same restrictions as RGB.
-    if (isContextLostOrPending() || !validateBlendFuncFactors(&quot;blendFunc&quot;, srcRGB, dstRGB))
-        return;
-    m_context-&gt;blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
-}
-
-void WebGLRenderingContext::bufferData(GC3Denum target, long long size, GC3Denum usage, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return;
-    WebGLBuffer* buffer = validateBufferDataParameters(&quot;bufferData&quot;, target, usage);
-    if (!buffer)
-        return;
-    if (size &lt; 0) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferData&quot;, &quot;size &lt; 0&quot;);
-        return;
-    }
-    if (!size) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferData&quot;, &quot;size == 0&quot;);
-        return;
-    }
-    if (!isErrorGeneratedOnOutOfBoundsAccesses()) {
-        if (!buffer-&gt;associateBufferData(static_cast&lt;GC3Dsizeiptr&gt;(size))) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferData&quot;, &quot;invalid buffer&quot;);
-            return;
-        }
-    }
-
-    m_context-&gt;moveErrorsToSyntheticErrorList();
-    m_context-&gt;bufferData(target, static_cast&lt;GC3Dsizeiptr&gt;(size), usage);
-    if (m_context-&gt;moveErrorsToSyntheticErrorList()) {
-        // The bufferData function failed. Tell the buffer it doesn't have the data it thinks it does.
-        buffer-&gt;disassociateBufferData();
-    }
-}
-
-void WebGLRenderingContext::bufferData(GC3Denum target, ArrayBuffer* data, GC3Denum usage, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return;
-    WebGLBuffer* buffer = validateBufferDataParameters(&quot;bufferData&quot;, target, usage);
-    if (!buffer)
-        return;
-    if (!data) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferData&quot;, &quot;no data&quot;);
-        return;
-    }
-    if (!isErrorGeneratedOnOutOfBoundsAccesses()) {
-        if (!buffer-&gt;associateBufferData(data)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferData&quot;, &quot;invalid buffer&quot;);
-            return;
-        }
-    }
-
-    m_context-&gt;moveErrorsToSyntheticErrorList();
-    m_context-&gt;bufferData(target, data-&gt;byteLength(), data-&gt;data(), usage);
-    if (m_context-&gt;moveErrorsToSyntheticErrorList()) {
-        // The bufferData function failed. Tell the buffer it doesn't have the data it thinks it does.
-        buffer-&gt;disassociateBufferData();
-    }
-}
-
-void WebGLRenderingContext::bufferData(GC3Denum target, ArrayBufferView* data, GC3Denum usage, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return;
-    WebGLBuffer* buffer = validateBufferDataParameters(&quot;bufferData&quot;, target, usage);
-    if (!buffer)
-        return;
-    if (!data) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferData&quot;, &quot;no data&quot;);
-        return;
-    }
-    if (!isErrorGeneratedOnOutOfBoundsAccesses()) {
-        if (!buffer-&gt;associateBufferData(data)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferData&quot;, &quot;invalid buffer&quot;);
-            return;
-        }
-    }
-
-    m_context-&gt;moveErrorsToSyntheticErrorList();
-    m_context-&gt;bufferData(target, data-&gt;byteLength(), data-&gt;baseAddress(), usage);
-    if (m_context-&gt;moveErrorsToSyntheticErrorList()) {
-        // The bufferData function failed. Tell the buffer it doesn't have the data it thinks it does.
-        buffer-&gt;disassociateBufferData();
-    }
-}
-
-void WebGLRenderingContext::bufferSubData(GC3Denum target, long long offset, ArrayBuffer* data, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return;
-    WebGLBuffer* buffer = validateBufferDataParameters(&quot;bufferSubData&quot;, target, GraphicsContext3D::STATIC_DRAW);
-    if (!buffer)
-        return;
-    if (offset &lt; 0) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferSubData&quot;, &quot;offset &lt; 0&quot;);
-        return;
-    }
-    if (!data)
-        return;
-    if (!isErrorGeneratedOnOutOfBoundsAccesses()) {
-        if (!buffer-&gt;associateBufferSubData(static_cast&lt;GC3Dintptr&gt;(offset), data)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferSubData&quot;, &quot;offset out of range&quot;);
-            return;
-        }
-    }
-
-    m_context-&gt;moveErrorsToSyntheticErrorList();
-    m_context-&gt;bufferSubData(target, static_cast&lt;GC3Dintptr&gt;(offset), data-&gt;byteLength(), data-&gt;data());
-    if (m_context-&gt;moveErrorsToSyntheticErrorList()) {
-        // The bufferSubData function failed. Tell the buffer it doesn't have the data it thinks it does.
-        buffer-&gt;disassociateBufferData();
-    }
-}
-
-void WebGLRenderingContext::bufferSubData(GC3Denum target, long long offset, ArrayBufferView* data, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return;
-    WebGLBuffer* buffer = validateBufferDataParameters(&quot;bufferSubData&quot;, target, GraphicsContext3D::STATIC_DRAW);
-    if (!buffer)
-        return;
-    if (offset &lt; 0) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferSubData&quot;, &quot;offset &lt; 0&quot;);
-        return;
-    }
-    if (!data)
-        return;
-    if (!isErrorGeneratedOnOutOfBoundsAccesses()) {
-        if (!buffer-&gt;associateBufferSubData(static_cast&lt;GC3Dintptr&gt;(offset), data)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferSubData&quot;, &quot;offset out of range&quot;);
-            return;
-        }
-    }
-
-    m_context-&gt;moveErrorsToSyntheticErrorList();
-    m_context-&gt;bufferSubData(target, static_cast&lt;GC3Dintptr&gt;(offset), data-&gt;byteLength(), data-&gt;baseAddress());
-    if (m_context-&gt;moveErrorsToSyntheticErrorList()) {
-        // The bufferSubData function failed. Tell the buffer it doesn't have the data it thinks it does.
-        buffer-&gt;disassociateBufferData();
-    }
-}
-
-GC3Denum WebGLRenderingContext::checkFramebufferStatus(GC3Denum target)
-{
-    if (isContextLostOrPending())
-        return GraphicsContext3D::FRAMEBUFFER_UNSUPPORTED;
-    if (target != GraphicsContext3D::FRAMEBUFFER) {
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;checkFramebufferStatus&quot;, &quot;invalid target&quot;);
-        return 0;
-    }
-    if (!m_framebufferBinding || !m_framebufferBinding-&gt;object())
-        return GraphicsContext3D::FRAMEBUFFER_COMPLETE;
-    const char* reason = &quot;framebuffer incomplete&quot;;
-    GC3Denum result = m_framebufferBinding-&gt;checkStatus(&amp;reason);
-    if (result != GraphicsContext3D::FRAMEBUFFER_COMPLETE) {
-        printGLWarningToConsole(&quot;checkFramebufferStatus&quot;, reason);
-        return result;
-    }
-    result = m_context-&gt;checkFramebufferStatus(target);
-    return result;
-}
-
-void WebGLRenderingContext::clear(GC3Dbitfield mask)
-{
-    if (isContextLostOrPending())
-        return;
-    if (mask &amp; ~(GraphicsContext3D::COLOR_BUFFER_BIT | GraphicsContext3D::DEPTH_BUFFER_BIT | GraphicsContext3D::STENCIL_BUFFER_BIT)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;clear&quot;, &quot;invalid mask&quot;);
-        return;
-    }
-    const char* reason = &quot;framebuffer incomplete&quot;;
-    if (m_framebufferBinding &amp;&amp; !m_framebufferBinding-&gt;onAccess(graphicsContext3D(), !isResourceSafe(), &amp;reason)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, &quot;clear&quot;, reason);
-        return;
-    }
-    if (!clearIfComposited(mask))
-        m_context-&gt;clear(mask);
-    markContextChanged();
-}
-
-void WebGLRenderingContext::clearColor(GC3Dfloat r, GC3Dfloat g, GC3Dfloat b, GC3Dfloat a)
-{
-    if (isContextLostOrPending())
-        return;
-    if (std::isnan(r))
-        r = 0;
-    if (std::isnan(g))
-        g = 0;
-    if (std::isnan(b))
-        b = 0;
-    if (std::isnan(a))
-        a = 1;
-    m_clearColor[0] = r;
-    m_clearColor[1] = g;
-    m_clearColor[2] = b;
-    m_clearColor[3] = a;
-    m_context-&gt;clearColor(r, g, b, a);
-}
-
-void WebGLRenderingContext::clearDepth(GC3Dfloat depth)
-{
-    if (isContextLostOrPending())
-        return;
-    m_clearDepth = depth;
-    m_context-&gt;clearDepth(depth);
-}
-
-void WebGLRenderingContext::clearStencil(GC3Dint s)
-{
-    if (isContextLostOrPending())
-        return;
-    m_clearStencil = s;
-    m_context-&gt;clearStencil(s);
-}
-
-void WebGLRenderingContext::colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboolean alpha)
-{
-    if (isContextLostOrPending())
-        return;
-    m_colorMask[0] = red;
-    m_colorMask[1] = green;
-    m_colorMask[2] = blue;
-    m_colorMask[3] = alpha;
-    m_context-&gt;colorMask(red, green, blue, alpha);
-}
-
-void WebGLRenderingContext::compileShader(WebGLShader* shader, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateWebGLObject(&quot;compileShader&quot;, shader))
-        return;
-    m_context-&gt;compileShader(objectOrZero(shader));
-    GC3Dint value;
-    m_context-&gt;getShaderiv(objectOrZero(shader), GraphicsContext3D::COMPILE_STATUS, &amp;value);
-    shader-&gt;setValid(value);
-}
-
-void WebGLRenderingContext::compressedTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width,
-                                                 GC3Dsizei height, GC3Dint border, ArrayBufferView* data)
-{
-    if (isContextLostOrPending())
-        return;
-    if (!validateTexFuncLevel(&quot;compressedTexImage2D&quot;, target, level))
-        return;
-
-    if (!validateCompressedTexFormat(internalformat)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;compressedTexImage2D&quot;, &quot;invalid internalformat&quot;);
-        return;
-    }
-    if (border) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;compressedTexImage2D&quot;, &quot;border not 0&quot;);
-        return;
-    }
-    if (!validateCompressedTexDimensions(&quot;compressedTexImage2D&quot;, target, level, width, height, internalformat))
-        return;
-    if (!validateCompressedTexFuncData(&quot;compressedTexImage2D&quot;, width, height, internalformat, data))
-        return;
-
-    WebGLTexture* tex = validateTextureBinding(&quot;compressedTexImage2D&quot;, target, true);
-    if (!tex)
-        return;
-    if (!isGLES2NPOTStrict()) {
-        if (level &amp;&amp; WebGLTexture::isNPOT(width, height)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;compressedTexImage2D&quot;, &quot;level &gt; 0 not power of 2&quot;);
-            return;
-        }
-    }
-    m_context-&gt;moveErrorsToSyntheticErrorList();
-    m_context-&gt;compressedTexImage2D(target, level, internalformat, width, height,
-        border, data-&gt;byteLength(), data-&gt;baseAddress());
-    if (m_context-&gt;moveErrorsToSyntheticErrorList()) {
-        // The compressedTexImage2D function failed. Tell the WebGLTexture it doesn't have the data for this level.
-        tex-&gt;markInvalid(target, level);
-        return;
-    }
-
-    tex-&gt;setLevelInfo(target, level, internalformat, width, height, GraphicsContext3D::UNSIGNED_BYTE);
-    tex-&gt;setCompressed();
-}
-
-void WebGLRenderingContext::compressedTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
-                                                    GC3Dsizei width, GC3Dsizei height, GC3Denum format, ArrayBufferView* data)
-{
-    if (isContextLostOrPending())
-        return;
-    if (!validateTexFuncLevel(&quot;compressedTexSubImage2D&quot;, target, level))
-        return;
-    if (!validateCompressedTexFormat(format)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;compressedTexSubImage2D&quot;, &quot;invalid format&quot;);
-        return;
-    }
-    if (!validateCompressedTexFuncData(&quot;compressedTexSubImage2D&quot;, width, height, format, data))
-        return;
-
-    WebGLTexture* tex = validateTextureBinding(&quot;compressedTexSubImage2D&quot;, target, true);
-    if (!tex)
-        return;
-
-    if (format != tex-&gt;getInternalFormat(target, level)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;compressedTexSubImage2D&quot;, &quot;format does not match texture format&quot;);
-        return;
-    }
-
-    if (!validateCompressedTexSubDimensions(&quot;compressedTexSubImage2D&quot;, target, level, xoffset, yoffset, width, height, format, tex))
-        return;
-
-    graphicsContext3D()-&gt;compressedTexSubImage2D(target, level, xoffset, yoffset,
-                                                 width, height, format, data-&gt;byteLength(), data-&gt;baseAddress());
-    tex-&gt;setCompressed();
-}
-
-bool WebGLRenderingContext::validateSettableTexFormat(const char* functionName, GC3Denum format)
-{
-    if (GraphicsContext3D::getClearBitsByFormat(format) &amp; (GraphicsContext3D::DEPTH_BUFFER_BIT | GraphicsContext3D::STENCIL_BUFFER_BIT)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;format can not be set, only rendered to&quot;);
-        return false;
-    }
-    return true;
-}
-
-void WebGLRenderingContext::copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border)
-{
-    if (isContextLostOrPending())
-        return;
-    if (!validateTexFuncParameters(&quot;copyTexImage2D&quot;, NotTexSubImage2D, target, level, internalformat, width, height, border, internalformat, GraphicsContext3D::UNSIGNED_BYTE))
-        return;
-    if (!validateSettableTexFormat(&quot;copyTexImage2D&quot;, internalformat))
-        return;
-    WebGLTexture* tex = validateTextureBinding(&quot;copyTexImage2D&quot;, target, true);
-    if (!tex)
-        return;
-    if (!isTexInternalFormatColorBufferCombinationValid(internalformat, getBoundFramebufferColorFormat())) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;copyTexImage2D&quot;, &quot;framebuffer is incompatible format&quot;);
-        return;
-    }
-    if (!isGLES2NPOTStrict() &amp;&amp; level &amp;&amp; WebGLTexture::isNPOT(width, height)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;copyTexImage2D&quot;, &quot;level &gt; 0 not power of 2&quot;);
-        return;
-    }
-    const char* reason = &quot;framebuffer incomplete&quot;;
-    if (m_framebufferBinding &amp;&amp; !m_framebufferBinding-&gt;onAccess(graphicsContext3D(), !isResourceSafe(), &amp;reason)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, &quot;copyTexImage2D&quot;, reason);
-        return;
-    }
-    clearIfComposited();
-    if (isResourceSafe()) {
-        ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding.get());
-        m_context-&gt;copyTexImage2D(target, level, internalformat, x, y, width, height, border);
-    } else {
-        ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding.get());
-        GC3Dint clippedX, clippedY;
-        GC3Dsizei clippedWidth, clippedHeight;
-        if (clip2D(x, y, width, height, getBoundFramebufferWidth(), getBoundFramebufferHeight(), &amp;clippedX, &amp;clippedY, &amp;clippedWidth, &amp;clippedHeight)) {
-            m_context-&gt;texImage2DResourceSafe(target, level, internalformat, width, height, border,
-                                              internalformat, GraphicsContext3D::UNSIGNED_BYTE, m_unpackAlignment);
-            if (clippedWidth &gt; 0 &amp;&amp; clippedHeight &gt; 0) {
-                m_context-&gt;copyTexSubImage2D(target, level, clippedX - x, clippedY - y,
-                                             clippedX, clippedY, clippedWidth, clippedHeight);
-            }
-        } else
-            m_context-&gt;copyTexImage2D(target, level, internalformat, x, y, width, height, border);
-    }
-    // FIXME: if the framebuffer is not complete, none of the below should be executed.
-    tex-&gt;setLevelInfo(target, level, internalformat, width, height, GraphicsContext3D::UNSIGNED_BYTE);
-}
-
-void WebGLRenderingContext::copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
-{
-    if (isContextLostOrPending())
-        return;
-    if (!validateTexFuncLevel(&quot;copyTexSubImage2D&quot;, target, level))
-        return;
-    WebGLTexture* tex = validateTextureBinding(&quot;copyTexSubImage2D&quot;, target, true);
-    if (!tex)
-        return;
-    if (!validateSize(&quot;copyTexSubImage2D&quot;, xoffset, yoffset) || !validateSize(&quot;copyTexSubImage2D&quot;, width, height))
-        return;
-    // Before checking if it is in the range, check if overflow happens first.
-    if (xoffset + width &lt; 0 || yoffset + height &lt; 0) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;copyTexSubImage2D&quot;, &quot;bad dimensions&quot;);
-        return;
-    }
-    if (xoffset + width &gt; tex-&gt;getWidth(target, level) || yoffset + height &gt; tex-&gt;getHeight(target, level)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;copyTexSubImage2D&quot;, &quot;rectangle out of range&quot;);
-        return;
-    }
-    GC3Denum internalformat = tex-&gt;getInternalFormat(target, level);
-    if (!validateSettableTexFormat(&quot;copyTexSubImage2D&quot;, internalformat))
-        return;
-    if (!isTexInternalFormatColorBufferCombinationValid(internalformat, getBoundFramebufferColorFormat())) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;copyTexSubImage2D&quot;, &quot;framebuffer is incompatible format&quot;);
-        return;
-    }
-    const char* reason = &quot;framebuffer incomplete&quot;;
-    if (m_framebufferBinding &amp;&amp; !m_framebufferBinding-&gt;onAccess(graphicsContext3D(), !isResourceSafe(), &amp;reason)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, &quot;copyTexSubImage2D&quot;, reason);
-        return;
-    }
-    clearIfComposited();
-    if (isResourceSafe()) {
-        ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding.get());
-        m_context-&gt;copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-    } else {
-        GC3Dint clippedX, clippedY;
-        GC3Dsizei clippedWidth, clippedHeight;
-        if (clip2D(x, y, width, height, getBoundFramebufferWidth(), getBoundFramebufferHeight(), &amp;clippedX, &amp;clippedY, &amp;clippedWidth, &amp;clippedHeight)) {
-            GC3Denum format = tex-&gt;getInternalFormat(target, level);
-            GC3Denum type = tex-&gt;getType(target, level);
-            std::unique_ptr&lt;unsigned char[]&gt; zero;
-            if (width &amp;&amp; height) {
-                unsigned int size;
-                GC3Denum error = m_context-&gt;computeImageSizeInBytes(format, type, width, height, m_unpackAlignment, &amp;size, 0);
-                if (error != GraphicsContext3D::NO_ERROR) {
-                    synthesizeGLError(error, &quot;copyTexSubImage2D&quot;, &quot;bad dimensions&quot;);
-                    return;
-                }
-                zero = std::make_unique&lt;unsigned char[]&gt;(size);
-                if (!zero) {
-                    synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;copyTexSubImage2D&quot;, &quot;out of memory&quot;);
-                    return;
-                }
-                memset(zero.get(), 0, size);
-            }
-            m_context-&gt;texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, zero.get());
-            if (clippedWidth &gt; 0 &amp;&amp; clippedHeight &gt; 0) {
-                ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding.get());
-                m_context-&gt;copyTexSubImage2D(target, level, xoffset + clippedX - x, yoffset + clippedY - y,
-                                             clippedX, clippedY, clippedWidth, clippedHeight);
-            }
-        } else {
-            ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding.get());
-            m_context-&gt;copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-        }
-    }
-}
-
-PassRefPtr&lt;WebGLBuffer&gt; WebGLRenderingContext::createBuffer()
-{
-    if (isContextLostOrPending())
-        return nullptr;
-    RefPtr&lt;WebGLBuffer&gt; o = WebGLBuffer::create(this);
-    addSharedObject(o.get());
-    return o;
-}
-
-PassRefPtr&lt;WebGLFramebuffer&gt; WebGLRenderingContext::createFramebuffer()
-{
-    if (isContextLostOrPending())
-        return nullptr;
-    RefPtr&lt;WebGLFramebuffer&gt; o = WebGLFramebuffer::create(this);
-    addContextObject(o.get());
-    return o;
-}
-
-PassRefPtr&lt;WebGLTexture&gt; WebGLRenderingContext::createTexture()
-{
-    if (isContextLostOrPending())
-        return nullptr;
-    RefPtr&lt;WebGLTexture&gt; o = WebGLTexture::create(this);
-    addSharedObject(o.get());
-    return o;
-}
-
-PassRefPtr&lt;WebGLProgram&gt; WebGLRenderingContext::createProgram()
-{
-    if (isContextLostOrPending())
-        return nullptr;
-    RefPtr&lt;WebGLProgram&gt; o = WebGLProgram::create(this);
-    addSharedObject(o.get());
-    return o;
-}
-
-PassRefPtr&lt;WebGLRenderbuffer&gt; WebGLRenderingContext::createRenderbuffer()
-{
-    if (isContextLostOrPending())
-        return nullptr;
-    RefPtr&lt;WebGLRenderbuffer&gt; o = WebGLRenderbuffer::create(this);
-    addSharedObject(o.get());
-    return o;
-}
-
-PassRefPtr&lt;WebGLShader&gt; WebGLRenderingContext::createShader(GC3Denum type, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return nullptr;
-    if (type != GraphicsContext3D::VERTEX_SHADER &amp;&amp; type != GraphicsContext3D::FRAGMENT_SHADER) {
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;createShader&quot;, &quot;invalid shader type&quot;);
-        return nullptr;
-    }
-
-    RefPtr&lt;WebGLShader&gt; o = WebGLShader::create(this, type);
-    addSharedObject(o.get());
-    return o;
-}
-
-void WebGLRenderingContext::cullFace(GC3Denum mode)
-{
-    if (isContextLostOrPending())
-        return;
-    m_context-&gt;cullFace(mode);
-}
-
-bool WebGLRenderingContext::deleteObject(WebGLObject* object)
-{
-    if (isContextLostOrPending() || !object)
-        return false;
-    if (!object-&gt;validate(contextGroup(), this)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;delete&quot;, &quot;object does not belong to this context&quot;);
-        return false;
-    }
-    if (object-&gt;object())
-        // We need to pass in context here because we want
-        // things in this context unbound.
-        object-&gt;deleteObject(graphicsContext3D());
-    return true;
-}
-
-void WebGLRenderingContext::deleteBuffer(WebGLBuffer* buffer)
-{
-    if (!deleteObject(buffer))
-        return;
-    if (m_boundArrayBuffer == buffer)
-        m_boundArrayBuffer = 0;
-
-    m_boundVertexArrayObject-&gt;unbindBuffer(buffer);
-}
-
-void WebGLRenderingContext::deleteFramebuffer(WebGLFramebuffer* framebuffer)
-{
-    if (!deleteObject(framebuffer))
-        return;
-    if (framebuffer == m_framebufferBinding) {
-        m_framebufferBinding = 0;
-        if (m_drawingBuffer) {
-            m_drawingBuffer-&gt;setFramebufferBinding(0);
-            // Have to call bindFramebuffer here to bind back to internal fbo.
-            m_drawingBuffer-&gt;bind();
-        } else
-            m_context-&gt;bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, 0);
-    }
-}
-
-void WebGLRenderingContext::deleteProgram(WebGLProgram* program)
-{
-    deleteObject(program);
-    // We don't reset m_currentProgram to 0 here because the deletion of the
-    // current program is delayed.
-}
-
-void WebGLRenderingContext::deleteRenderbuffer(WebGLRenderbuffer* renderbuffer)
-{
-    if (!deleteObject(renderbuffer))
-        return;
-    if (renderbuffer == m_renderbufferBinding)
-        m_renderbufferBinding = 0;
-    if (m_framebufferBinding)
-        m_framebufferBinding-&gt;removeAttachmentFromBoundFramebuffer(renderbuffer);
-}
-
-void WebGLRenderingContext::deleteShader(WebGLShader* shader)
-{
-    deleteObject(shader);
-}
-
-void WebGLRenderingContext::deleteTexture(WebGLTexture* texture)
-{
-    if (!deleteObject(texture))
-        return;
-    for (size_t i = 0; i &lt; m_textureUnits.size(); ++i) {
-        if (texture == m_textureUnits[i].texture2DBinding)
-            m_textureUnits[i].texture2DBinding = nullptr;
-        if (texture == m_textureUnits[i].textureCubeMapBinding)
-            m_textureUnits[i].textureCubeMapBinding = nullptr;
-    }
-    if (m_framebufferBinding)
-        m_framebufferBinding-&gt;removeAttachmentFromBoundFramebuffer(texture);
-}
-
-void WebGLRenderingContext::depthFunc(GC3Denum func)
-{
-    if (isContextLostOrPending())
-        return;
-    m_context-&gt;depthFunc(func);
-}
-
-void WebGLRenderingContext::depthMask(GC3Dboolean flag)
-{
-    if (isContextLostOrPending())
-        return;
-    m_depthMask = flag;
-    m_context-&gt;depthMask(flag);
-}
-
-void WebGLRenderingContext::depthRange(GC3Dfloat zNear, GC3Dfloat zFar)
-{
-    if (isContextLostOrPending())
-        return;
-    if (zNear &gt; zFar) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;depthRange&quot;, &quot;zNear &gt; zFar&quot;);
-        return;
-    }
-    m_context-&gt;depthRange(zNear, zFar);
-}
-
-void WebGLRenderingContext::detachShader(WebGLProgram* program, WebGLShader* shader, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateWebGLObject(&quot;detachShader&quot;, program) || !validateWebGLObject(&quot;detachShader&quot;, shader))
-        return;
-    if (!program-&gt;detachShader(shader)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;detachShader&quot;, &quot;shader not attached&quot;);
-        return;
-    }
-    m_context-&gt;detachShader(objectOrZero(program), objectOrZero(shader));
-    shader-&gt;onDetached(graphicsContext3D());
-}
-
-void WebGLRenderingContext::disable(GC3Denum cap)
-{
-    if (isContextLostOrPending() || !validateCapability(&quot;disable&quot;, cap))
-        return;
-    if (cap == GraphicsContext3D::STENCIL_TEST) {
-        m_stencilEnabled = false;
-        applyStencilTest();
-        return;
-    }
-    if (cap == GraphicsContext3D::SCISSOR_TEST) {
-        m_scissorEnabled = false;
-        if (m_drawingBuffer)
-            m_drawingBuffer-&gt;setScissorEnabled(m_scissorEnabled);
-    }
-    m_context-&gt;disable(cap);
-}
-
-void WebGLRenderingContext::disableVertexAttribArray(GC3Duint index, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return;
-    if (index &gt;= m_maxVertexAttribs) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;disableVertexAttribArray&quot;, &quot;index out of range&quot;);
-        return;
-    }
-
-    WebGLVertexArrayObjectOES::VertexAttribState&amp; state = m_boundVertexArrayObject-&gt;getVertexAttribState(index);
-    state.enabled = false;
-
-    if (index &gt; 0 || isGLES2Compliant())
-        m_context-&gt;disableVertexAttribArray(index);
-}
-
-bool WebGLRenderingContext::validateElementArraySize(GC3Dsizei count, GC3Denum type, GC3Dintptr offset)
-{
-    RefPtr&lt;WebGLBuffer&gt; elementArrayBuffer = m_boundVertexArrayObject-&gt;getElementArrayBuffer();
-    
-    if (!elementArrayBuffer)
-        return false;
-
-    if (offset &lt; 0)
-        return false;
-
-    if (type == GraphicsContext3D::UNSIGNED_INT) {
-        // For an unsigned int array, offset must be divisible by 4 for alignment reasons.
-        if (offset % 4)
-            return false;
-
-        // Make uoffset an element offset.
-        offset /= 4;
-
-        GC3Dsizeiptr n = elementArrayBuffer-&gt;byteLength() / 4;
-        if (offset &gt; n || count &gt; n - offset)
-            return false;
-    } else if (type == GraphicsContext3D::UNSIGNED_SHORT) {
-        // For an unsigned short array, offset must be divisible by 2 for alignment reasons.
-        if (offset % 2)
-            return false;
-
-        // Make uoffset an element offset.
-        offset /= 2;
-
-        GC3Dsizeiptr n = elementArrayBuffer-&gt;byteLength() / 2;
-        if (offset &gt; n || count &gt; n - offset)
-            return false;
-    } else if (type == GraphicsContext3D::UNSIGNED_BYTE) {
-        GC3Dsizeiptr n = elementArrayBuffer-&gt;byteLength();
-        if (offset &gt; n || count &gt; n - offset)
-            return false;
-    }
-    return true;
-}
-
-bool WebGLRenderingContext::validateIndexArrayConservative(GC3Denum type, unsigned&amp; numElementsRequired)
-{
-    // Performs conservative validation by caching a maximum index of
-    // the given type per element array buffer. If all of the bound
-    // array buffers have enough elements to satisfy that maximum
-    // index, skips the expensive per-draw-call iteration in
-    // validateIndexArrayPrecise.
-    
-    RefPtr&lt;WebGLBuffer&gt; elementArrayBuffer = m_boundVertexArrayObject-&gt;getElementArrayBuffer();
-
-    if (!elementArrayBuffer)
-        return false;
-
-    GC3Dsizeiptr numElements = elementArrayBuffer-&gt;byteLength();
-    // The case count==0 is already dealt with in drawElements before validateIndexArrayConservative.
-    if (!numElements)
-        return false;
-    const ArrayBuffer* buffer = elementArrayBuffer-&gt;elementArrayBuffer();
-    ASSERT(buffer);
-
-    int maxIndex = elementArrayBuffer-&gt;getCachedMaxIndex(type);
-    if (maxIndex &lt; 0) {
-        // Compute the maximum index in the entire buffer for the given type of index.
-        switch (type) {
-        case GraphicsContext3D::UNSIGNED_BYTE: {
-            const GC3Dubyte* p = static_cast&lt;const GC3Dubyte*&gt;(buffer-&gt;data());
-            for (GC3Dsizeiptr i = 0; i &lt; numElements; i++)
-                maxIndex = std::max(maxIndex, static_cast&lt;int&gt;(p[i]));
-            break;
-        }
-        case GraphicsContext3D::UNSIGNED_SHORT: {
-            numElements /= sizeof(GC3Dushort);
-            const GC3Dushort* p = static_cast&lt;const GC3Dushort*&gt;(buffer-&gt;data());
-            for (GC3Dsizeiptr i = 0; i &lt; numElements; i++)
-                maxIndex = std::max(maxIndex, static_cast&lt;int&gt;(p[i]));
-            break;
-        }
-        case GraphicsContext3D::UNSIGNED_INT: {
-            if (!m_oesElementIndexUint)
-                return false;
-            numElements /= sizeof(GC3Duint);
-            const GC3Duint* p = static_cast&lt;const GC3Duint*&gt;(buffer-&gt;data());
-            for (GC3Dsizeiptr i = 0; i &lt; numElements; i++)
-                maxIndex = std::max(maxIndex, static_cast&lt;int&gt;(p[i]));
-            break;
-        }
-        default:
-            return false;
-        }
-        elementArrayBuffer-&gt;setCachedMaxIndex(type, maxIndex);
-    }
-
-    if (maxIndex &gt;= 0) {
-        // The number of required elements is one more than the maximum
-        // index that will be accessed.
-        numElementsRequired = maxIndex + 1;
-        return true;
-    }
-
-    return false;
-}
-
-bool WebGLRenderingContext::validateIndexArrayPrecise(GC3Dsizei count, GC3Denum type, GC3Dintptr offset, unsigned&amp; numElementsRequired)
-{
-    ASSERT(count &gt;= 0 &amp;&amp; offset &gt;= 0);
-    unsigned lastIndex = 0;
-    
-    RefPtr&lt;WebGLBuffer&gt; elementArrayBuffer = m_boundVertexArrayObject-&gt;getElementArrayBuffer();
-
-    if (!elementArrayBuffer)
-        return false;
-
-    if (!count) {
-        numElementsRequired = 0;
-        return true;
-    }
-
-    if (!elementArrayBuffer-&gt;elementArrayBuffer())
-        return false;
-
-    unsigned long uoffset = offset;
-    unsigned long n = count;
-
-    if (type == GraphicsContext3D::UNSIGNED_INT) {
-        // Make uoffset an element offset.
-        uoffset /= sizeof(GC3Duint);
-        const GC3Duint* p = static_cast&lt;const GC3Duint*&gt;(elementArrayBuffer-&gt;elementArrayBuffer()-&gt;data()) + uoffset;
-        while (n-- &gt; 0) {
-            if (*p &gt; lastIndex)
-                lastIndex = *p;
-            ++p;
-        }
-    } else if (type == GraphicsContext3D::UNSIGNED_SHORT) {
-        // Make uoffset an element offset.
-        uoffset /= sizeof(GC3Dushort);
-        const GC3Dushort* p = static_cast&lt;const GC3Dushort*&gt;(elementArrayBuffer-&gt;elementArrayBuffer()-&gt;data()) + uoffset;
-        while (n-- &gt; 0) {
-            if (*p &gt; lastIndex)
-                lastIndex = *p;
-            ++p;
-        }
-    } else if (type == GraphicsContext3D::UNSIGNED_BYTE) {
-        const GC3Dubyte* p = static_cast&lt;const GC3Dubyte*&gt;(elementArrayBuffer-&gt;elementArrayBuffer()-&gt;data()) + uoffset;
-        while (n-- &gt; 0) {
-            if (*p &gt; lastIndex)
-                lastIndex = *p;
-            ++p;
-        }
-    }
-
-    // Then set the last index in the index array and make sure it is valid.
-    numElementsRequired = lastIndex + 1;
-    return numElementsRequired &gt; 0;
-}
-
-bool WebGLRenderingContext::validateVertexAttributes(unsigned elementCount, unsigned primitiveCount)
-{
-    if (!m_currentProgram)
-        return false;
-
-    // Look in each enabled vertex attrib and check if they've been bound to a buffer.
-    for (unsigned i = 0; i &lt; m_maxVertexAttribs; ++i) {
-        if (!m_boundVertexArrayObject-&gt;getVertexAttribState(i).validateBinding())
-            return false;
-    }
-
-    if (elementCount &lt;= 0)
-        return true;
-
-
-    // Look in each consumed vertex attrib (by the current program).
-    bool sawNonInstancedAttrib = false;
-    bool sawEnabledAttrib = false;
-    int numActiveAttribLocations = m_currentProgram-&gt;numActiveAttribLocations();
-    for (int i = 0; i &lt; numActiveAttribLocations; ++i) {
-        int loc = m_currentProgram-&gt;getActiveAttribLocation(i);
-        if (loc &gt;= 0 &amp;&amp; loc &lt; static_cast&lt;int&gt;(m_maxVertexAttribs)) {
-            const WebGLVertexArrayObjectOES::VertexAttribState&amp; state = m_boundVertexArrayObject-&gt;getVertexAttribState(loc);
-            if (state.enabled) {
-                sawEnabledAttrib = true;
-                // Avoid off-by-one errors in numElements computation.
-                // For the last element, we will only touch the data for the
-                // element and nothing beyond it.
-                int bytesRemaining = static_cast&lt;int&gt;(state.bufferBinding-&gt;byteLength() - state.offset);
-                unsigned numElements = 0;
-                ASSERT(state.stride &gt; 0);
-                if (bytesRemaining &gt;= state.bytesPerElement)
-                    numElements = 1 + (bytesRemaining - state.bytesPerElement) / state.stride;
-                unsigned instancesRequired = 0;
-                if (state.divisor) {
-                    instancesRequired = ceil(static_cast&lt;float&gt;(primitiveCount) / state.divisor);
-                    if (instancesRequired &gt; numElements)
-                        return false;
-                } else {
-                    sawNonInstancedAttrib = true;
-                    if (elementCount &gt; numElements)
-                        return false;
-                }
-            }
-        }
-    }
-
-    if (!sawNonInstancedAttrib &amp;&amp; sawEnabledAttrib)
-        return false;
-
-    return true;
-}
-
-bool WebGLRenderingContext::validateWebGLObject(const char* functionName, WebGLObject* object)
-{
-    if (!object || !object-&gt;object()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no object or object deleted&quot;);
-        return false;
-    }
-    if (!object-&gt;validate(contextGroup(), this)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;object does not belong to this context&quot;);
-        return false;
-    }
-    return true;
-}
-
-bool WebGLRenderingContext::validateDrawArrays(const char* functionName, GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei primitiveCount)
-{
-    if (isContextLostOrPending() || !validateDrawMode(functionName, mode))
-        return false;
-
-    if (!validateStencilSettings(functionName))
-        return false;
-
-    if (first &lt; 0 || count &lt; 0) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;first or count &lt; 0&quot;);
-        return false;
-    }
-
-    if (!count) {
-        markContextChanged();
-        return false;
-    }
-
-    if (primitiveCount &lt; 0) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;primcount &lt; 0&quot;);
-        return false;
-    }
-
-    if (!isErrorGeneratedOnOutOfBoundsAccesses()) {
-        // Ensure we have a valid rendering state
-        Checked&lt;GC3Dint, RecordOverflow&gt; checkedFirst(first);
-        Checked&lt;GC3Dint, RecordOverflow&gt; checkedCount(count);
-        Checked&lt;GC3Dint, RecordOverflow&gt; checkedSum = checkedFirst + checkedCount;
-        Checked&lt;GC3Dint, RecordOverflow&gt; checkedPrimitiveCount(primitiveCount);
-        if (checkedSum.hasOverflowed() || checkedPrimitiveCount.hasOverflowed() || !validateVertexAttributes(checkedSum.unsafeGet(), checkedPrimitiveCount.unsafeGet())) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;attempt to access out of bounds arrays&quot;);
-            return false;
-        }
-    } else {
-        if (!validateVertexAttributes(0)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;attribs not setup correctly&quot;);
-            return false;
-        }
-    }
-
-    const char* reason = &quot;framebuffer incomplete&quot;;
-    if (m_framebufferBinding &amp;&amp; !m_framebufferBinding-&gt;onAccess(graphicsContext3D(), !isResourceSafe(), &amp;reason)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, functionName, reason);
-        return false;
-    }
-
-    return true;
-}
-
-void WebGLRenderingContext::drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei count, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-
-    if (!validateDrawArrays(&quot;drawArrays&quot;, mode, first, count, 0))
-        return;
-
-    clearIfComposited();
-
-    bool vertexAttrib0Simulated = false;
-    if (!isGLES2Compliant())
-        vertexAttrib0Simulated = simulateVertexAttrib0(first + count - 1);
-    if (!isGLES2NPOTStrict())
-        checkTextureCompleteness(&quot;drawArrays&quot;, true);
-
-    m_context-&gt;drawArrays(mode, first, count);
-
-    if (!isGLES2Compliant() &amp;&amp; vertexAttrib0Simulated)
-        restoreStatesAfterVertexAttrib0Simulation();
-    if (!isGLES2NPOTStrict())
-        checkTextureCompleteness(&quot;drawArrays&quot;, false);
-    markContextChanged();
-}
-
-bool WebGLRenderingContext::validateDrawElements(const char* functionName, GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, unsigned&amp; numElements, GC3Dsizei primitiveCount)
-{
-    if (isContextLostOrPending() || !validateDrawMode(functionName, mode))
-        return false;
-
-    if (!validateStencilSettings(functionName))
-        return false;
-
-    switch (type) {
-    case GraphicsContext3D::UNSIGNED_BYTE:
-    case GraphicsContext3D::UNSIGNED_SHORT:
-        break;
-    case GraphicsContext3D::UNSIGNED_INT:
-        if (m_oesElementIndexUint)
-            break;
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid type&quot;);
-        return false;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid type&quot;);
-        return false;
-    }
-
-    if (count &lt; 0 || offset &lt; 0) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;count or offset &lt; 0&quot;);
-        return false;
-    }
-
-    if (!count) {
-        markContextChanged();
-        return false;
-    }
-
-    if (primitiveCount &lt; 0) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;primcount &lt; 0&quot;);
-        return false;
-    }
-
-    if (!m_boundVertexArrayObject-&gt;getElementArrayBuffer()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;no ELEMENT_ARRAY_BUFFER bound&quot;);
-        return false;
-    }
-
-    if (!isErrorGeneratedOnOutOfBoundsAccesses()) {
-        // Ensure we have a valid rendering state
-        if (!validateElementArraySize(count, type, static_cast&lt;GC3Dintptr&gt;(offset))) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;request out of bounds for current ELEMENT_ARRAY_BUFFER&quot;);
-            return false;
-        }
-        if (!count)
-            return false;
-
-        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())) {
-                synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;attempt to access out of bounds arrays&quot;);
-                return false;
-            }
-        }
-    } else {
-        if (!validateVertexAttributes(0)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;attribs not setup correctly&quot;);
-            return false;
-        }
-    }
-
-    const char* reason = &quot;framebuffer incomplete&quot;;
-    if (m_framebufferBinding &amp;&amp; !m_framebufferBinding-&gt;onAccess(graphicsContext3D(), !isResourceSafe(), &amp;reason)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, functionName, reason);
-        return false;
-    }
-
-    return true;
-}
-
-void WebGLRenderingContext::drawElements(GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-
-    unsigned numElements = 0;
-    if (!validateDrawElements(&quot;drawElements&quot;, mode, count, type, offset, numElements, 0))
-        return;
-
-    clearIfComposited();
-
-    bool vertexAttrib0Simulated = false;
-    if (!isGLES2Compliant()) {
-        if (!numElements)
-            validateIndexArrayPrecise(count, type, static_cast&lt;GC3Dintptr&gt;(offset), numElements);
-        vertexAttrib0Simulated = simulateVertexAttrib0(numElements);
-    }
-    if (!isGLES2NPOTStrict())
-        checkTextureCompleteness(&quot;drawElements&quot;, true);
-
-    m_context-&gt;drawElements(mode, count, type, static_cast&lt;GC3Dintptr&gt;(offset));
-
-    if (!isGLES2Compliant() &amp;&amp; vertexAttrib0Simulated)
-        restoreStatesAfterVertexAttrib0Simulation();
-    if (!isGLES2NPOTStrict())
-        checkTextureCompleteness(&quot;drawElements&quot;, false);
-    markContextChanged();
-}
-
-void WebGLRenderingContext::enable(GC3Denum cap)
-{
-    if (isContextLostOrPending() || !validateCapability(&quot;enable&quot;, cap))
-        return;
-    if (cap == GraphicsContext3D::STENCIL_TEST) {
-        m_stencilEnabled = true;
-        applyStencilTest();
-        return;
-    }
-    if (cap == GraphicsContext3D::SCISSOR_TEST) {
-        m_scissorEnabled = true;
-        if (m_drawingBuffer)
-            m_drawingBuffer-&gt;setScissorEnabled(m_scissorEnabled);
-    }
-    m_context-&gt;enable(cap);
-}
-
-void WebGLRenderingContext::enableVertexAttribArray(GC3Duint index, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return;
-    if (index &gt;= m_maxVertexAttribs) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;enableVertexAttribArray&quot;, &quot;index out of range&quot;);
-        return;
-    }
-
-    WebGLVertexArrayObjectOES::VertexAttribState&amp; state = m_boundVertexArrayObject-&gt;getVertexAttribState(index);
-    state.enabled = true;
-
-    m_context-&gt;enableVertexAttribArray(index);
-}
-
-void WebGLRenderingContext::finish()
-{
-    if (isContextLostOrPending())
-        return;
-    m_context-&gt;finish();
-}
-
-void WebGLRenderingContext::flush()
-{
-    if (isContextLostOrPending())
-        return;
-    m_context-&gt;flush();
-}
-
-void WebGLRenderingContext::framebufferRenderbuffer(GC3Denum target, GC3Denum attachment, GC3Denum renderbuffertarget, WebGLRenderbuffer* buffer, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateFramebufferFuncParameters(&quot;framebufferRenderbuffer&quot;, target, attachment))
-        return;
-    if (renderbuffertarget != GraphicsContext3D::RENDERBUFFER) {
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;framebufferRenderbuffer&quot;, &quot;invalid target&quot;);
-        return;
-    }
-    if (buffer &amp;&amp; !buffer-&gt;validate(contextGroup(), this)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;framebufferRenderbuffer&quot;, &quot;no buffer or buffer not from this context&quot;);
-        return;
-    }
-    // Don't allow the default framebuffer to be mutated; all current
-    // implementations use an FBO internally in place of the default
-    // FBO.
-    if (!m_framebufferBinding || !m_framebufferBinding-&gt;object()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;framebufferRenderbuffer&quot;, &quot;no framebuffer bound&quot;);
-        return;
-    }
-    Platform3DObject bufferObject = objectOrZero(buffer);
-    switch (attachment) {
-    case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT:
-        m_context-&gt;framebufferRenderbuffer(target, GraphicsContext3D::DEPTH_ATTACHMENT, renderbuffertarget, bufferObject);
-        m_context-&gt;framebufferRenderbuffer(target, GraphicsContext3D::STENCIL_ATTACHMENT, renderbuffertarget, bufferObject);
-        break;
-    default:
-        m_context-&gt;framebufferRenderbuffer(target, attachment, renderbuffertarget, bufferObject);
-    }
-    m_framebufferBinding-&gt;setAttachmentForBoundFramebuffer(attachment, buffer);
-    applyStencilTest();
-}
-
-void WebGLRenderingContext::framebufferTexture2D(GC3Denum target, GC3Denum attachment, GC3Denum textarget, WebGLTexture* texture, GC3Dint level, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateFramebufferFuncParameters(&quot;framebufferTexture2D&quot;, target, attachment))
-        return;
-    if (level) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;framebufferTexture2D&quot;, &quot;level not 0&quot;);
-        return;
-    }
-    if (texture &amp;&amp; !texture-&gt;validate(contextGroup(), this)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;framebufferTexture2D&quot;, &quot;no texture or texture not from this context&quot;);
-        return;
-    }
-    // Don't allow the default framebuffer to be mutated; all current
-    // implementations use an FBO internally in place of the default
-    // FBO.
-    if (!m_framebufferBinding || !m_framebufferBinding-&gt;object()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;framebufferTexture2D&quot;, &quot;no framebuffer bound&quot;);
-        return;
-    }
-    Platform3DObject textureObject = objectOrZero(texture);
-    switch (attachment) {
-    case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT:
-        m_context-&gt;framebufferTexture2D(target, GraphicsContext3D::DEPTH_ATTACHMENT, textarget, textureObject, level);
-        m_context-&gt;framebufferTexture2D(target, GraphicsContext3D::STENCIL_ATTACHMENT, textarget, textureObject, level);
-        break;
-    case GraphicsContext3D::DEPTH_ATTACHMENT:
-        m_context-&gt;framebufferTexture2D(target, attachment, textarget, textureObject, level);
-        break;
-    case GraphicsContext3D::STENCIL_ATTACHMENT:
-        m_context-&gt;framebufferTexture2D(target, attachment, textarget, textureObject, level);
-        break;
-    default:
-        m_context-&gt;framebufferTexture2D(target, attachment, textarget, textureObject, level);
-    }
-    m_framebufferBinding-&gt;setAttachmentForBoundFramebuffer(attachment, textarget, texture, level);
-    applyStencilTest();
-}
-
-void WebGLRenderingContext::frontFace(GC3Denum mode)
-{
-    if (isContextLostOrPending())
-        return;
-    m_context-&gt;frontFace(mode);
-}
-
-void WebGLRenderingContext::generateMipmap(GC3Denum target)
-{
-    if (isContextLostOrPending())
-        return;
-    WebGLTexture* tex = validateTextureBinding(&quot;generateMipmap&quot;, target, false);
-    if (!tex)
-        return;
-    if (!tex-&gt;canGenerateMipmaps()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;generateMipmap&quot;, &quot;level 0 not power of 2 or not all the same size&quot;);
-        return;
-    }
-    // FIXME: https://bugs.webkit.org/show_bug.cgi?id=123916. Compressed textures should be allowed in WebGL 2:
-    if (tex-&gt;isCompressed()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;generateMipmap&quot;, &quot;trying to generate mipmaps from compressed texture&quot;);
-        return;
-    }
-    if (!validateSettableTexFormat(&quot;generateMipmap&quot;, tex-&gt;getInternalFormat(target, 0)))
-        return;
-
-    // generateMipmap won't work properly if minFilter is not NEAREST_MIPMAP_LINEAR
-    // on Mac.  Remove the hack once this driver bug is fixed.
-#if OS(DARWIN)
-    bool needToResetMinFilter = false;
-    if (tex-&gt;getMinFilter() != GraphicsContext3D::NEAREST_MIPMAP_LINEAR) {
-        m_context-&gt;texParameteri(target, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::NEAREST_MIPMAP_LINEAR);
-        needToResetMinFilter = true;
-    }
-#endif
-    m_context-&gt;generateMipmap(target);
-#if OS(DARWIN)
-    if (needToResetMinFilter)
-        m_context-&gt;texParameteri(target, GraphicsContext3D::TEXTURE_MIN_FILTER, tex-&gt;getMinFilter());
-#endif
-    tex-&gt;generateMipmapLevelInfo();
-}
-
-PassRefPtr&lt;WebGLActiveInfo&gt; WebGLRenderingContext::getActiveAttrib(WebGLProgram* program, GC3Duint index, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateWebGLObject(&quot;getActiveAttrib&quot;, program))
-        return nullptr;
-    ActiveInfo info;
-    if (!m_context-&gt;getActiveAttrib(objectOrZero(program), index, info))
-        return nullptr;
-
-    LOG(WebGL, &quot;Returning active attribute %d: %s&quot;, index, info.name.utf8().data());
-
-    return WebGLActiveInfo::create(info.name, info.type, info.size);
-}
-
-PassRefPtr&lt;WebGLActiveInfo&gt; WebGLRenderingContext::getActiveUniform(WebGLProgram* program, GC3Duint index, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateWebGLObject(&quot;getActiveUniform&quot;, program))
-        return 0;
-    ActiveInfo info;
-    if (!m_context-&gt;getActiveUniform(objectOrZero(program), index, info))
-        return nullptr;
-    if (!isGLES2Compliant())
-        if (info.size &gt; 1 &amp;&amp; !info.name.endsWith(&quot;[0]&quot;))
-            info.name.append(&quot;[0]&quot;);
-
-    LOG(WebGL, &quot;Returning active uniform %d: %s&quot;, index, info.name.utf8().data());
-
-    return WebGLActiveInfo::create(info.name, info.type, info.size);
-}
-
-bool WebGLRenderingContext::getAttachedShaders(WebGLProgram* program, Vector&lt;RefPtr&lt;WebGLShader&gt;&gt;&amp; shaderObjects, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    shaderObjects.clear();
-    if (isContextLostOrPending() || !validateWebGLObject(&quot;getAttachedShaders&quot;, program))
-        return false;
-
-    const GC3Denum shaderType[] = {
-        GraphicsContext3D::VERTEX_SHADER,
-        GraphicsContext3D::FRAGMENT_SHADER
-    };
-    for (unsigned i = 0; i &lt; sizeof(shaderType) / sizeof(GC3Denum); ++i) {
-        WebGLShader* shader = program-&gt;getAttachedShader(shaderType[i]);
-        if (shader)
-            shaderObjects.append(shader);
-    }
-    return true;
-}
-
-GC3Dint WebGLRenderingContext::getAttribLocation(WebGLProgram* program, const String&amp; name)
-{
-    if (isContextLostOrPending() || !validateWebGLObject(&quot;getAttribLocation&quot;, program))
-        return -1;
-    if (!validateLocationLength(&quot;getAttribLocation&quot;, name))
-        return -1;
-    if (!validateString(&quot;getAttribLocation&quot;, name))
-        return -1;
-    if (isPrefixReserved(name))
-        return -1;
-    if (!program-&gt;getLinkStatus()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;getAttribLocation&quot;, &quot;program not linked&quot;);
-        return -1;
-    }
-    return m_context-&gt;getAttribLocation(objectOrZero(program), name);
-}
-
-WebGLGetInfo WebGLRenderingContext::getBufferParameter(GC3Denum target, GC3Denum pname, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return WebGLGetInfo();
-    if (target != GraphicsContext3D::ARRAY_BUFFER &amp;&amp; target != GraphicsContext3D::ELEMENT_ARRAY_BUFFER) {
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getBufferParameter&quot;, &quot;invalid target&quot;);
-        return WebGLGetInfo();
-    }
-
-    if (pname != GraphicsContext3D::BUFFER_SIZE &amp;&amp; pname != GraphicsContext3D::BUFFER_USAGE) {
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getBufferParameter&quot;, &quot;invalid parameter name&quot;);
-        return WebGLGetInfo();
-    }
-
-    GC3Dint value = 0;
-    m_context-&gt;getBufferParameteriv(target, pname, &amp;value);
-    if (pname == GraphicsContext3D::BUFFER_SIZE)
-        return WebGLGetInfo(value);
-    return WebGLGetInfo(static_cast&lt;unsigned int&gt;(value));
-}
-
-PassRefPtr&lt;WebGLContextAttributes&gt; WebGLRenderingContext::getContextAttributes()
-{
-    if (isContextLostOrPending())
-        return nullptr;
-    // We always need to return a new WebGLContextAttributes object to
-    // prevent the user from mutating any cached version.
-
-    // Also, we need to enforce requested values of &quot;false&quot; for depth
-    // and stencil, regardless of the properties of the underlying
-    // GraphicsContext3D or DrawingBuffer.
-    RefPtr&lt;WebGLContextAttributes&gt; attributes = WebGLContextAttributes::create(m_context-&gt;getContextAttributes());
-    if (!m_attributes.depth)
-        attributes-&gt;setDepth(false);
-    if (!m_attributes.stencil)
-        attributes-&gt;setStencil(false);
-    if (m_drawingBuffer) {
-        // The DrawingBuffer obtains its parameters from GraphicsContext3D::getContextAttributes(),
-        // but it makes its own determination of whether multisampling is supported.
-        attributes-&gt;setAntialias(m_drawingBuffer-&gt;multisample());
-    }
-    return attributes.release();
-}
-
-GC3Denum WebGLRenderingContext::getError()
-{
-    if (m_isPendingPolicyResolution)
-        return GraphicsContext3D::NO_ERROR;
-    return m_context-&gt;getError();
-}
-
-WebGLExtension* WebGLRenderingContext::getExtension(const String&amp; name)
-{
-    if (isContextLostOrPending())
-        return nullptr;
-
-    if (equalIgnoringCase(name, &quot;EXT_blend_minmax&quot;)
-        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_blend_minmax&quot;)) {
-        if (!m_extBlendMinMax) {
-            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_EXT_blend_minmax&quot;);
-            m_extBlendMinMax = std::make_unique&lt;EXTBlendMinMax&gt;(this);
-        }
-        return m_extBlendMinMax.get();
-    }
-    if (equalIgnoringCase(name, &quot;EXT_sRGB&quot;)
-        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_sRGB&quot;)) {
-        if (!m_extsRGB) {
-            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_EXT_sRGB&quot;);
-            m_extsRGB = std::make_unique&lt;EXTsRGB&gt;(this);
-        }
-        return m_extsRGB.get();
-    }
-    if (equalIgnoringCase(name, &quot;EXT_frag_depth&quot;)
-        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_frag_depth&quot;)) {
-        if (!m_extFragDepth) {
-            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_EXT_frag_depth&quot;);
-            m_extFragDepth = std::make_unique&lt;EXTFragDepth&gt;(this);
-        }
-        return m_extFragDepth.get();
-    }
-    if (equalIgnoringCase(name, &quot;EXT_shader_texture_lod&quot;)
-        &amp;&amp; (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_shader_texture_lod&quot;) || m_context-&gt;getExtensions()-&gt;supports(&quot;GL_ARB_shader_texture_lod&quot;))) {
-        if (!m_extShaderTextureLOD) {
-            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_EXT_shader_texture_lod&quot;);
-            m_extShaderTextureLOD = std::make_unique&lt;EXTShaderTextureLOD&gt;(this);
-        }
-        return m_extShaderTextureLOD.get();
-    }
-    if (equalIgnoringCase(name, &quot;WEBKIT_EXT_texture_filter_anisotropic&quot;)
-        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_texture_filter_anisotropic&quot;)) {
-        if (!m_extTextureFilterAnisotropic) {
-            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_EXT_texture_filter_anisotropic&quot;);
-            m_extTextureFilterAnisotropic = std::make_unique&lt;EXTTextureFilterAnisotropic&gt;(this);
-        }
-        return m_extTextureFilterAnisotropic.get();
-    }
-    if (equalIgnoringCase(name, &quot;OES_standard_derivatives&quot;)
-        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_standard_derivatives&quot;)) {
-        if (!m_oesStandardDerivatives) {
-            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_OES_standard_derivatives&quot;);
-            m_oesStandardDerivatives = std::make_unique&lt;OESStandardDerivatives&gt;(this);
-        }
-        return m_oesStandardDerivatives.get();
-    }
-    if (equalIgnoringCase(name, &quot;OES_texture_float&quot;)
-        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_texture_float&quot;)) {
-        if (!m_oesTextureFloat) {
-            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_OES_texture_float&quot;);
-            m_oesTextureFloat = std::make_unique&lt;OESTextureFloat&gt;(this);
-        }
-        return m_oesTextureFloat.get();
-    }
-    if (equalIgnoringCase(name, &quot;OES_texture_float_linear&quot;)
-        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_texture_float_linear&quot;)) {
-        if (!m_oesTextureFloatLinear) {
-            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_OES_texture_float_linear&quot;);
-            m_oesTextureFloatLinear = std::make_unique&lt;OESTextureFloatLinear&gt;(this);
-        }
-        return m_oesTextureFloatLinear.get();
-    }
-    if (equalIgnoringCase(name, &quot;OES_texture_half_float&quot;)
-        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_texture_half_float&quot;)) {
-        if (!m_oesTextureHalfFloat) {
-            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_OES_texture_half_float&quot;);
-            m_oesTextureHalfFloat = std::make_unique&lt;OESTextureHalfFloat&gt;(this);
-        }
-        return m_oesTextureHalfFloat.get();
-    }
-    if (equalIgnoringCase(name, &quot;OES_texture_half_float_linear&quot;)
-        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_texture_half_float_linear&quot;)) {
-        if (!m_oesTextureHalfFloatLinear) {
-            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_OES_texture_half_float_linear&quot;);
-            m_oesTextureHalfFloatLinear = std::make_unique&lt;OESTextureHalfFloatLinear&gt;(this);
-        }
-        return m_oesTextureHalfFloatLinear.get();
-    }
-    if (equalIgnoringCase(name, &quot;OES_vertex_array_object&quot;)
-        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_vertex_array_object&quot;)) {
-        if (!m_oesVertexArrayObject) {
-            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_OES_vertex_array_object&quot;);
-            m_oesVertexArrayObject = std::make_unique&lt;OESVertexArrayObject&gt;(this);
-        }
-        return m_oesVertexArrayObject.get();
-    }
-    if (equalIgnoringCase(name, &quot;OES_element_index_uint&quot;)
-        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_element_index_uint&quot;)) {
-        if (!m_oesElementIndexUint) {
-            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_OES_element_index_uint&quot;);
-            m_oesElementIndexUint = std::make_unique&lt;OESElementIndexUint&gt;(this);
-        }
-        return m_oesElementIndexUint.get();
-    }
-    if (equalIgnoringCase(name, &quot;WEBGL_lose_context&quot;)) {
-        if (!m_webglLoseContext)
-            m_webglLoseContext = std::make_unique&lt;WebGLLoseContext&gt;(this);
-        return m_webglLoseContext.get();
-    }
-    if ((equalIgnoringCase(name, &quot;WEBKIT_WEBGL_compressed_texture_atc&quot;))
-        &amp;&amp; WebGLCompressedTextureATC::supported(this)) {
-        if (!m_webglCompressedTextureATC)
-            m_webglCompressedTextureATC = std::make_unique&lt;WebGLCompressedTextureATC&gt;(this);
-        return m_webglCompressedTextureATC.get();
-    }
-    if ((equalIgnoringCase(name, &quot;WEBKIT_WEBGL_compressed_texture_pvrtc&quot;))
-        &amp;&amp; WebGLCompressedTexturePVRTC::supported(this)) {
-        if (!m_webglCompressedTexturePVRTC)
-            m_webglCompressedTexturePVRTC = std::make_unique&lt;WebGLCompressedTexturePVRTC&gt;(this);
-        return m_webglCompressedTexturePVRTC.get();
-    }
-    if (equalIgnoringCase(name, &quot;WEBGL_compressed_texture_s3tc&quot;)
-        &amp;&amp; WebGLCompressedTextureS3TC::supported(this)) {
-        if (!m_webglCompressedTextureS3TC)
-            m_webglCompressedTextureS3TC = std::make_unique&lt;WebGLCompressedTextureS3TC&gt;(this);
-        return m_webglCompressedTextureS3TC.get();
-    }
-    if (equalIgnoringCase(name, &quot;WEBGL_depth_texture&quot;)
-        &amp;&amp; WebGLDepthTexture::supported(graphicsContext3D())) {
-        if (!m_webglDepthTexture) {
-            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_CHROMIUM_depth_texture&quot;);
-            m_webglDepthTexture = std::make_unique&lt;WebGLDepthTexture&gt;(this);
-        }
-        return m_webglDepthTexture.get();
-    }
-    if (equalIgnoringCase(name, &quot;WEBGL_draw_buffers&quot;) &amp;&amp; supportsDrawBuffers()) {
-        if (!m_webglDrawBuffers) {
-            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_EXT_draw_buffers&quot;);
-            m_webglDrawBuffers = std::make_unique&lt;WebGLDrawBuffers&gt;(this);
-        }
-        return m_webglDrawBuffers.get();
-    }
-    if (equalIgnoringCase(name, &quot;ANGLE_instanced_arrays&quot;) &amp;&amp; ANGLEInstancedArrays::supported(this)) {
-        if (!m_angleInstancedArrays) {
-            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_ANGLE_instanced_arrays&quot;);
-            m_angleInstancedArrays = std::make_unique&lt;ANGLEInstancedArrays&gt;(this);
-        }
-        return m_angleInstancedArrays.get();
-    }
-    if (allowPrivilegedExtensions()) {
-        if (equalIgnoringCase(name, &quot;WEBGL_debug_renderer_info&quot;)) {
-            if (!m_webglDebugRendererInfo)
-                m_webglDebugRendererInfo = std::make_unique&lt;WebGLDebugRendererInfo&gt;(this);
-            return m_webglDebugRendererInfo.get();
-        }
-        if (equalIgnoringCase(name, &quot;WEBGL_debug_shaders&quot;)
-            &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_ANGLE_translated_shader_source&quot;)) {
-            if (!m_webglDebugShaders)
-                m_webglDebugShaders = std::make_unique&lt;WebGLDebugShaders&gt;(this);
-            return m_webglDebugShaders.get();
-        }
-    }
-
-    return nullptr;
-}
-
-WebGLGetInfo WebGLRenderingContext::getFramebufferAttachmentParameter(GC3Denum target, GC3Denum attachment, GC3Denum pname, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateFramebufferFuncParameters(&quot;getFramebufferAttachmentParameter&quot;, target, attachment))
-        return WebGLGetInfo();
-
-    if (!m_framebufferBinding || !m_framebufferBinding-&gt;object()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;getFramebufferAttachmentParameter&quot;, &quot;no framebuffer bound&quot;);
-        return WebGLGetInfo();
-    }
-
-    WebGLSharedObject* object = m_framebufferBinding-&gt;getAttachmentObject(attachment);
-    if (!object) {
-        if (pname == GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)
-            return WebGLGetInfo(GraphicsContext3D::NONE);
-        // OpenGL ES 2.0 specifies INVALID_ENUM in this case, while desktop GL
-        // specifies INVALID_OPERATION.
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getFramebufferAttachmentParameter&quot;, &quot;invalid parameter name&quot;);
-        return WebGLGetInfo();
-    }
-
-    ASSERT(object-&gt;isTexture() || object-&gt;isRenderbuffer());
-    if (object-&gt;isTexture()) {
-        switch (pname) {
-        case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
-            return WebGLGetInfo(GraphicsContext3D::TEXTURE);
-        case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
-            return WebGLGetInfo(PassRefPtr&lt;WebGLTexture&gt;(reinterpret_cast&lt;WebGLTexture*&gt;(object)));
-        case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
-        case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
-        case Extensions3D::FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT: {
-            GC3Dint value = 0;
-            m_context-&gt;getFramebufferAttachmentParameteriv(target, attachment, pname, &amp;value);
-            return WebGLGetInfo(value);
-        }
-        default:
-            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getFramebufferAttachmentParameter&quot;, &quot;invalid parameter name for texture attachment&quot;);
-            return WebGLGetInfo();
-        }
-    } else {
-        switch (pname) {
-        case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
-            return WebGLGetInfo(GraphicsContext3D::RENDERBUFFER);
-        case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
-            return WebGLGetInfo(PassRefPtr&lt;WebGLRenderbuffer&gt;(reinterpret_cast&lt;WebGLRenderbuffer*&gt;(object)));
-        case Extensions3D::FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT: {
-            WebGLRenderbuffer* renderBuffer = reinterpret_cast&lt;WebGLRenderbuffer*&gt;(object);
-            GC3Denum renderBufferFormat = renderBuffer-&gt;getInternalFormat();
-            ASSERT(renderBufferFormat != Extensions3D::SRGB_EXT &amp;&amp; renderBufferFormat != Extensions3D::SRGB_ALPHA_EXT);
-            if (renderBufferFormat == Extensions3D::SRGB8_ALPHA8_EXT)
-                return WebGLGetInfo(Extensions3D::SRGB_EXT);
-            return WebGLGetInfo(GraphicsContext3D::LINEAR);
-        }
-        default:
-            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getFramebufferAttachmentParameter&quot;, &quot;invalid parameter name for renderbuffer attachment&quot;);
-            return WebGLGetInfo();
-        }
-    }
-}
-
-WebGLGetInfo WebGLRenderingContext::getParameter(GC3Denum pname, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return WebGLGetInfo();
-    const int intZero = 0;
-    switch (pname) {
-    case GraphicsContext3D::ACTIVE_TEXTURE:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::ALIASED_LINE_WIDTH_RANGE:
-        return getWebGLFloatArrayParameter(pname);
-    case GraphicsContext3D::ALIASED_POINT_SIZE_RANGE:
-        return getWebGLFloatArrayParameter(pname);
-    case GraphicsContext3D::ALPHA_BITS:
-        return getIntParameter(pname);
-    case GraphicsContext3D::ARRAY_BUFFER_BINDING:
-        return WebGLGetInfo(PassRefPtr&lt;WebGLBuffer&gt;(m_boundArrayBuffer));
-    case GraphicsContext3D::BLEND:
-        return getBooleanParameter(pname);
-    case GraphicsContext3D::BLEND_COLOR:
-        return getWebGLFloatArrayParameter(pname);
-    case GraphicsContext3D::BLEND_DST_ALPHA:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::BLEND_DST_RGB:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::BLEND_EQUATION_ALPHA:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::BLEND_EQUATION_RGB:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::BLEND_SRC_ALPHA:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::BLEND_SRC_RGB:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::BLUE_BITS:
-        return getIntParameter(pname);
-    case GraphicsContext3D::COLOR_CLEAR_VALUE:
-        return getWebGLFloatArrayParameter(pname);
-    case GraphicsContext3D::COLOR_WRITEMASK:
-        return getBooleanArrayParameter(pname);
-    case GraphicsContext3D::COMPRESSED_TEXTURE_FORMATS:
-        return WebGLGetInfo(Uint32Array::create(m_compressedTextureFormats.data(), m_compressedTextureFormats.size()));
-    case GraphicsContext3D::CULL_FACE:
-        return getBooleanParameter(pname);
-    case GraphicsContext3D::CULL_FACE_MODE:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::CURRENT_PROGRAM:
-        return WebGLGetInfo(PassRefPtr&lt;WebGLProgram&gt;(m_currentProgram));
-    case GraphicsContext3D::DEPTH_BITS:
-        if (!m_framebufferBinding &amp;&amp; !m_attributes.depth)
-            return WebGLGetInfo(intZero);
-        return getIntParameter(pname);
-    case GraphicsContext3D::DEPTH_CLEAR_VALUE:
-        return getFloatParameter(pname);
-    case GraphicsContext3D::DEPTH_FUNC:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::DEPTH_RANGE:
-        return getWebGLFloatArrayParameter(pname);
-    case GraphicsContext3D::DEPTH_TEST:
-        return getBooleanParameter(pname);
-    case GraphicsContext3D::DEPTH_WRITEMASK:
-        return getBooleanParameter(pname);
-    case GraphicsContext3D::DITHER:
-        return getBooleanParameter(pname);
-    case GraphicsContext3D::ELEMENT_ARRAY_BUFFER_BINDING:
-        return WebGLGetInfo(PassRefPtr&lt;WebGLBuffer&gt;(m_boundVertexArrayObject-&gt;getElementArrayBuffer()));
-    case GraphicsContext3D::FRAMEBUFFER_BINDING:
-        return WebGLGetInfo(PassRefPtr&lt;WebGLFramebuffer&gt;(m_framebufferBinding));
-    case GraphicsContext3D::FRONT_FACE:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::GENERATE_MIPMAP_HINT:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::GREEN_BITS:
-        return getIntParameter(pname);
-    case GraphicsContext3D::LINE_WIDTH:
-        return getFloatParameter(pname);
-    case GraphicsContext3D::MAX_COMBINED_TEXTURE_IMAGE_UNITS:
-        return getIntParameter(pname);
-    case GraphicsContext3D::MAX_CUBE_MAP_TEXTURE_SIZE:
-        return getIntParameter(pname);
-    case GraphicsContext3D::MAX_FRAGMENT_UNIFORM_VECTORS:
-        return getIntParameter(pname);
-    case GraphicsContext3D::MAX_RENDERBUFFER_SIZE:
-        return getIntParameter(pname);
-    case GraphicsContext3D::MAX_TEXTURE_IMAGE_UNITS:
-        return getIntParameter(pname);
-    case GraphicsContext3D::MAX_TEXTURE_SIZE:
-        return getIntParameter(pname);
-    case GraphicsContext3D::MAX_VARYING_VECTORS:
-        return getIntParameter(pname);
-    case GraphicsContext3D::MAX_VERTEX_ATTRIBS:
-        return getIntParameter(pname);
-    case GraphicsContext3D::MAX_VERTEX_TEXTURE_IMAGE_UNITS:
-        return getIntParameter(pname);
-    case GraphicsContext3D::MAX_VERTEX_UNIFORM_VECTORS:
-        return getIntParameter(pname);
-    case GraphicsContext3D::MAX_VIEWPORT_DIMS:
-        return getWebGLIntArrayParameter(pname);
-    case GraphicsContext3D::NUM_SHADER_BINARY_FORMATS:
-        // FIXME: should we always return 0 for this?
-        return getIntParameter(pname);
-    case GraphicsContext3D::PACK_ALIGNMENT:
-        return getIntParameter(pname);
-    case GraphicsContext3D::POLYGON_OFFSET_FACTOR:
-        return getFloatParameter(pname);
-    case GraphicsContext3D::POLYGON_OFFSET_FILL:
-        return getBooleanParameter(pname);
-    case GraphicsContext3D::POLYGON_OFFSET_UNITS:
-        return getFloatParameter(pname);
-    case GraphicsContext3D::RED_BITS:
-        return getIntParameter(pname);
-    case GraphicsContext3D::RENDERBUFFER_BINDING:
-        return WebGLGetInfo(PassRefPtr&lt;WebGLRenderbuffer&gt;(m_renderbufferBinding));
-    case GraphicsContext3D::RENDERER:
-        return WebGLGetInfo(String(&quot;WebKit WebGL&quot;));
-    case GraphicsContext3D::SAMPLE_BUFFERS:
-        return getIntParameter(pname);
-    case GraphicsContext3D::SAMPLE_COVERAGE_INVERT:
-        return getBooleanParameter(pname);
-    case GraphicsContext3D::SAMPLE_COVERAGE_VALUE:
-        return getFloatParameter(pname);
-    case GraphicsContext3D::SAMPLES:
-        return getIntParameter(pname);
-    case GraphicsContext3D::SCISSOR_BOX:
-        return getWebGLIntArrayParameter(pname);
-    case GraphicsContext3D::SCISSOR_TEST:
-        return getBooleanParameter(pname);
-    case GraphicsContext3D::SHADING_LANGUAGE_VERSION:
-        return WebGLGetInfo(&quot;WebGL GLSL ES 1.0 (&quot; + m_context-&gt;getString(GraphicsContext3D::SHADING_LANGUAGE_VERSION) + &quot;)&quot;);
-    case GraphicsContext3D::STENCIL_BACK_FAIL:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::STENCIL_BACK_FUNC:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::STENCIL_BACK_PASS_DEPTH_FAIL:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::STENCIL_BACK_PASS_DEPTH_PASS:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::STENCIL_BACK_REF:
-        return getIntParameter(pname);
-    case GraphicsContext3D::STENCIL_BACK_VALUE_MASK:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::STENCIL_BACK_WRITEMASK:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::STENCIL_BITS:
-        if (!m_framebufferBinding &amp;&amp; !m_attributes.stencil)
-            return WebGLGetInfo(intZero);
-        return getIntParameter(pname);
-    case GraphicsContext3D::STENCIL_CLEAR_VALUE:
-        return getIntParameter(pname);
-    case GraphicsContext3D::STENCIL_FAIL:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::STENCIL_FUNC:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::STENCIL_PASS_DEPTH_FAIL:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::STENCIL_PASS_DEPTH_PASS:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::STENCIL_REF:
-        return getIntParameter(pname);
-    case GraphicsContext3D::STENCIL_TEST:
-        return getBooleanParameter(pname);
-    case GraphicsContext3D::STENCIL_VALUE_MASK:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::STENCIL_WRITEMASK:
-        return getUnsignedIntParameter(pname);
-    case GraphicsContext3D::SUBPIXEL_BITS:
-        return getIntParameter(pname);
-    case GraphicsContext3D::TEXTURE_BINDING_2D:
-        return WebGLGetInfo(PassRefPtr&lt;WebGLTexture&gt;(m_textureUnits[m_activeTextureUnit].texture2DBinding));
-    case GraphicsContext3D::TEXTURE_BINDING_CUBE_MAP:
-        return WebGLGetInfo(PassRefPtr&lt;WebGLTexture&gt;(m_textureUnits[m_activeTextureUnit].textureCubeMapBinding));
-    case GraphicsContext3D::UNPACK_ALIGNMENT:
-        return getIntParameter(pname);
-    case GraphicsContext3D::UNPACK_FLIP_Y_WEBGL:
-        return WebGLGetInfo(m_unpackFlipY);
-    case GraphicsContext3D::UNPACK_PREMULTIPLY_ALPHA_WEBGL:
-        return WebGLGetInfo(m_unpackPremultiplyAlpha);
-    case GraphicsContext3D::UNPACK_COLORSPACE_CONVERSION_WEBGL:
-        return WebGLGetInfo(m_unpackColorspaceConversion);
-    case GraphicsContext3D::VENDOR:
-        return WebGLGetInfo(String(&quot;WebKit&quot;));
-    case GraphicsContext3D::VERSION:
-        return WebGLGetInfo(&quot;WebGL 1.0 (&quot; + m_context-&gt;getString(GraphicsContext3D::VERSION) + &quot;)&quot;);
-    case GraphicsContext3D::VIEWPORT:
-        return getWebGLIntArrayParameter(pname);
-    case Extensions3D::FRAGMENT_SHADER_DERIVATIVE_HINT_OES: // OES_standard_derivatives
-        if (m_oesStandardDerivatives)
-            return getUnsignedIntParameter(Extensions3D::FRAGMENT_SHADER_DERIVATIVE_HINT_OES);
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getParameter&quot;, &quot;invalid parameter name, OES_standard_derivatives not enabled&quot;);
-        return WebGLGetInfo();
-    case WebGLDebugRendererInfo::UNMASKED_RENDERER_WEBGL:
-        if (m_webglDebugRendererInfo)
-            return WebGLGetInfo(m_context-&gt;getString(GraphicsContext3D::RENDERER));
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getParameter&quot;, &quot;invalid parameter name, WEBGL_debug_renderer_info not enabled&quot;);
-        return WebGLGetInfo();
-    case WebGLDebugRendererInfo::UNMASKED_VENDOR_WEBGL:
-        if (m_webglDebugRendererInfo)
-            return WebGLGetInfo(m_context-&gt;getString(GraphicsContext3D::VENDOR));
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getParameter&quot;, &quot;invalid parameter name, WEBGL_debug_renderer_info not enabled&quot;);
-        return WebGLGetInfo();
-    case Extensions3D::VERTEX_ARRAY_BINDING_OES: // OES_vertex_array_object
-        if (m_oesVertexArrayObject) {
-            if (!m_boundVertexArrayObject-&gt;isDefaultObject())
-                return WebGLGetInfo(PassRefPtr&lt;WebGLVertexArrayObjectOES&gt;(m_boundVertexArrayObject));
-            return WebGLGetInfo();
-        }
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getParameter&quot;, &quot;invalid parameter name, OES_vertex_array_object not enabled&quot;);
-        return WebGLGetInfo();
-    case Extensions3D::MAX_TEXTURE_MAX_ANISOTROPY_EXT: // EXT_texture_filter_anisotropic
-        if (m_extTextureFilterAnisotropic)
-            return getUnsignedIntParameter(Extensions3D::MAX_TEXTURE_MAX_ANISOTROPY_EXT);
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getParameter&quot;, &quot;invalid parameter name, EXT_texture_filter_anisotropic not enabled&quot;);
-        return WebGLGetInfo();
-    case Extensions3D::MAX_COLOR_ATTACHMENTS_EXT: // EXT_draw_buffers BEGIN
-        if (m_webglDrawBuffers)
-            return WebGLGetInfo(getMaxColorAttachments());
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getParameter&quot;, &quot;invalid parameter name, WEBGL_draw_buffers not enabled&quot;);
-        return WebGLGetInfo();
-    case Extensions3D::MAX_DRAW_BUFFERS_EXT:
-        if (m_webglDrawBuffers)
-            return WebGLGetInfo(getMaxDrawBuffers());
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getParameter&quot;, &quot;invalid parameter name, WEBGL_draw_buffers not enabled&quot;);
-        return WebGLGetInfo();
-    default:
-        if (m_webglDrawBuffers
-            &amp;&amp; pname &gt;= Extensions3D::DRAW_BUFFER0_EXT
-            &amp;&amp; pname &lt; static_cast&lt;GC3Denum&gt;(Extensions3D::DRAW_BUFFER0_EXT + getMaxDrawBuffers())) {
-            GC3Dint value = GraphicsContext3D::NONE;
-            if (m_framebufferBinding)
-                value = m_framebufferBinding-&gt;getDrawBuffer(pname);
-            else // emulated backbuffer
-                value = m_backDrawBuffer;
-            return WebGLGetInfo(value);
-        }
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getParameter&quot;, &quot;invalid parameter name&quot;);
-        return WebGLGetInfo();
-    }
-}
-
-WebGLGetInfo WebGLRenderingContext::getProgramParameter(WebGLProgram* program, GC3Denum pname, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateWebGLObject(&quot;getProgramParameter&quot;, program))
-        return WebGLGetInfo();
-
-    GC3Dint value = 0;
-    switch (pname) {
-    case GraphicsContext3D::DELETE_STATUS:
-        return WebGLGetInfo(program-&gt;isDeleted());
-    case GraphicsContext3D::VALIDATE_STATUS:
-        m_context-&gt;getProgramiv(objectOrZero(program), pname, &amp;value);
-        return WebGLGetInfo(static_cast&lt;bool&gt;(value));
-    case GraphicsContext3D::LINK_STATUS:
-        return WebGLGetInfo(program-&gt;getLinkStatus());
-    case GraphicsContext3D::ATTACHED_SHADERS:
-        m_context-&gt;getProgramiv(objectOrZero(program), pname, &amp;value);
-        return WebGLGetInfo(value);
-    case GraphicsContext3D::ACTIVE_ATTRIBUTES:
-    case GraphicsContext3D::ACTIVE_UNIFORMS:
-        m_context-&gt;getNonBuiltInActiveSymbolCount(objectOrZero(program), pname, &amp;value);
-        return WebGLGetInfo(value);
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getProgramParameter&quot;, &quot;invalid parameter name&quot;);
-        return WebGLGetInfo();
-    }
-}
-
-String WebGLRenderingContext::getProgramInfoLog(WebGLProgram* program, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return String();
-    if (!validateWebGLObject(&quot;getProgramInfoLog&quot;, program))
-        return &quot;&quot;;
-    return ensureNotNull(m_context-&gt;getProgramInfoLog(objectOrZero(program)));
-}
-
-WebGLGetInfo WebGLRenderingContext::getRenderbufferParameter(GC3Denum target, GC3Denum pname, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return WebGLGetInfo();
-    if (target != GraphicsContext3D::RENDERBUFFER) {
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getRenderbufferParameter&quot;, &quot;invalid target&quot;);
-        return WebGLGetInfo();
-    }
-    if (!m_renderbufferBinding || !m_renderbufferBinding-&gt;object()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;getRenderbufferParameter&quot;, &quot;no renderbuffer bound&quot;);
-        return WebGLGetInfo();
-    }
-
-    if (m_renderbufferBinding-&gt;getInternalFormat() == GraphicsContext3D::DEPTH_STENCIL
-        &amp;&amp; !m_renderbufferBinding-&gt;isValid()) {
-        ASSERT(!isDepthStencilSupported());
-        int value = 0;
-        switch (pname) {
-        case GraphicsContext3D::RENDERBUFFER_WIDTH:
-            value = m_renderbufferBinding-&gt;getWidth();
-            break;
-        case GraphicsContext3D::RENDERBUFFER_HEIGHT:
-            value = m_renderbufferBinding-&gt;getHeight();
-            break;
-        case GraphicsContext3D::RENDERBUFFER_RED_SIZE:
-        case GraphicsContext3D::RENDERBUFFER_GREEN_SIZE:
-        case GraphicsContext3D::RENDERBUFFER_BLUE_SIZE:
-        case GraphicsContext3D::RENDERBUFFER_ALPHA_SIZE:
-            value = 0;
-            break;
-        case GraphicsContext3D::RENDERBUFFER_DEPTH_SIZE:
-            value = 24;
-            break;
-        case GraphicsContext3D::RENDERBUFFER_STENCIL_SIZE:
-            value = 8;
-            break;
-        case GraphicsContext3D::RENDERBUFFER_INTERNAL_FORMAT:
-            return WebGLGetInfo(m_renderbufferBinding-&gt;getInternalFormat());
-        default:
-            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getRenderbufferParameter&quot;, &quot;invalid parameter name&quot;);
-            return WebGLGetInfo();
-        }
-        return WebGLGetInfo(value);
-    }
-
-    GC3Dint value = 0;
-    switch (pname) {
-    case GraphicsContext3D::RENDERBUFFER_WIDTH:
-    case GraphicsContext3D::RENDERBUFFER_HEIGHT:
-    case GraphicsContext3D::RENDERBUFFER_RED_SIZE:
-    case GraphicsContext3D::RENDERBUFFER_GREEN_SIZE:
-    case GraphicsContext3D::RENDERBUFFER_BLUE_SIZE:
-    case GraphicsContext3D::RENDERBUFFER_ALPHA_SIZE:
-    case GraphicsContext3D::RENDERBUFFER_DEPTH_SIZE:
-    case GraphicsContext3D::RENDERBUFFER_STENCIL_SIZE:
-        m_context-&gt;getRenderbufferParameteriv(target, pname, &amp;value);
-        return WebGLGetInfo(value);
-    case GraphicsContext3D::RENDERBUFFER_INTERNAL_FORMAT:
-        return WebGLGetInfo(m_renderbufferBinding-&gt;getInternalFormat());
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getRenderbufferParameter&quot;, &quot;invalid parameter name&quot;);
-        return WebGLGetInfo();
-    }
-}
-
-WebGLGetInfo WebGLRenderingContext::getShaderParameter(WebGLShader* shader, GC3Denum pname, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateWebGLObject(&quot;getShaderParameter&quot;, shader))
-        return WebGLGetInfo();
-    GC3Dint value = 0;
-    switch (pname) {
-    case GraphicsContext3D::DELETE_STATUS:
-        return WebGLGetInfo(shader-&gt;isDeleted());
-    case GraphicsContext3D::COMPILE_STATUS:
-        m_context-&gt;getShaderiv(objectOrZero(shader), pname, &amp;value);
-        return WebGLGetInfo(static_cast&lt;bool&gt;(value));
-    case GraphicsContext3D::SHADER_TYPE:
-        m_context-&gt;getShaderiv(objectOrZero(shader), pname, &amp;value);
-        return WebGLGetInfo(static_cast&lt;unsigned int&gt;(value));
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getShaderParameter&quot;, &quot;invalid parameter name&quot;);
-        return WebGLGetInfo();
-    }
-}
-
-String WebGLRenderingContext::getShaderInfoLog(WebGLShader* shader, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return String();
-    if (!validateWebGLObject(&quot;getShaderInfoLog&quot;, shader))
-        return &quot;&quot;;
-    return ensureNotNull(m_context-&gt;getShaderInfoLog(objectOrZero(shader)));
-}
-
-PassRefPtr&lt;WebGLShaderPrecisionFormat&gt; WebGLRenderingContext::getShaderPrecisionFormat(GC3Denum shaderType, GC3Denum precisionType, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return nullptr;
-    switch (shaderType) {
-    case GraphicsContext3D::VERTEX_SHADER:
-    case GraphicsContext3D::FRAGMENT_SHADER:
-        break;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getShaderPrecisionFormat&quot;, &quot;invalid shader type&quot;);
-        return nullptr;
-    }
-    switch (precisionType) {
-    case GraphicsContext3D::LOW_FLOAT:
-    case GraphicsContext3D::MEDIUM_FLOAT:
-    case GraphicsContext3D::HIGH_FLOAT:
-    case GraphicsContext3D::LOW_INT:
-    case GraphicsContext3D::MEDIUM_INT:
-    case GraphicsContext3D::HIGH_INT:
-        break;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getShaderPrecisionFormat&quot;, &quot;invalid precision type&quot;);
-        return nullptr;
-    }
-
-    GC3Dint range[2] = {0, 0};
-    GC3Dint precision = 0;
-    m_context-&gt;getShaderPrecisionFormat(shaderType, precisionType, range, &amp;precision);
-    return WebGLShaderPrecisionFormat::create(range[0], range[1], precision);
-}
-
-String WebGLRenderingContext::getShaderSource(WebGLShader* shader, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return String();
-    if (!validateWebGLObject(&quot;getShaderSource&quot;, shader))
-        return &quot;&quot;;
-    return ensureNotNull(shader-&gt;getSource());
-}
-
-Vector&lt;String&gt; WebGLRenderingContext::getSupportedExtensions()
-{
-    Vector&lt;String&gt; result;
-
-    if (m_isPendingPolicyResolution)
-        return result;
-
-    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_blend_minmax&quot;))
-        result.append(&quot;EXT_blend_minmax&quot;);
-    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_sRGB&quot;))
-        result.append(&quot;EXT_sRGB&quot;);
-    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_frag_depth&quot;))
-        result.append(&quot;EXT_frag_depth&quot;);
-    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_texture_float&quot;))
-        result.append(&quot;OES_texture_float&quot;);
-    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_texture_float_linear&quot;))
-        result.append(&quot;OES_texture_float_linear&quot;);
-    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_texture_half_float&quot;))
-        result.append(&quot;OES_texture_half_float&quot;);
-    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_texture_half_float_linear&quot;))
-        result.append(&quot;OES_texture_half_float_linear&quot;);
-    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_standard_derivatives&quot;))
-        result.append(&quot;OES_standard_derivatives&quot;);
-    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_shader_texture_lod&quot;) || m_context-&gt;getExtensions()-&gt;supports(&quot;GL_ARB_shader_texture_lod&quot;))
-        result.append(&quot;EXT_shader_texture_lod&quot;);
-    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_texture_filter_anisotropic&quot;))
-        result.append(&quot;WEBKIT_EXT_texture_filter_anisotropic&quot;);
-    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_vertex_array_object&quot;))
-        result.append(&quot;OES_vertex_array_object&quot;);
-    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_element_index_uint&quot;))
-        result.append(&quot;OES_element_index_uint&quot;);
-    result.append(&quot;WEBGL_lose_context&quot;);
-    if (WebGLCompressedTextureATC::supported(this))
-        result.append(&quot;WEBKIT_WEBGL_compressed_texture_atc&quot;);
-    if (WebGLCompressedTexturePVRTC::supported(this))
-        result.append(&quot;WEBKIT_WEBGL_compressed_texture_pvrtc&quot;);
-    if (WebGLCompressedTextureS3TC::supported(this))
-        result.append(&quot;WEBGL_compressed_texture_s3tc&quot;);
-    if (WebGLDepthTexture::supported(graphicsContext3D()))
-        result.append(&quot;WEBGL_depth_texture&quot;);
-    if (supportsDrawBuffers())
-        result.append(&quot;WEBGL_draw_buffers&quot;);
-    if (ANGLEInstancedArrays::supported(this))
-        result.append(&quot;ANGLE_instanced_arrays&quot;);
-
-    if (allowPrivilegedExtensions()) {
-        if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_ANGLE_translated_shader_source&quot;))
-            result.append(&quot;WEBGL_debug_shaders&quot;);
-        result.append(&quot;WEBGL_debug_renderer_info&quot;);
-    }
-
-    return result;
-}
-
-WebGLGetInfo WebGLRenderingContext::getTexParameter(GC3Denum target, GC3Denum pname, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return WebGLGetInfo();
-    WebGLTexture* tex = validateTextureBinding(&quot;getTexParameter&quot;, target, false);
-    if (!tex)
-        return WebGLGetInfo();
-    GC3Dint value = 0;
-    switch (pname) {
-    case GraphicsContext3D::TEXTURE_MAG_FILTER:
-    case GraphicsContext3D::TEXTURE_MIN_FILTER:
-    case GraphicsContext3D::TEXTURE_WRAP_S:
-    case GraphicsContext3D::TEXTURE_WRAP_T:
-        m_context-&gt;getTexParameteriv(target, pname, &amp;value);
-        return WebGLGetInfo(static_cast&lt;unsigned int&gt;(value));
-    case Extensions3D::TEXTURE_MAX_ANISOTROPY_EXT: // EXT_texture_filter_anisotropic
-        if (m_extTextureFilterAnisotropic) {
-            m_context-&gt;getTexParameteriv(target, pname, &amp;value);
-            return WebGLGetInfo(static_cast&lt;unsigned int&gt;(value));
-        }
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getTexParameter&quot;, &quot;invalid parameter name, EXT_texture_filter_anisotropic not enabled&quot;);
-        return WebGLGetInfo();
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getTexParameter&quot;, &quot;invalid parameter name&quot;);
-        return WebGLGetInfo();
-    }
-}
-
-WebGLGetInfo WebGLRenderingContext::getUniform(WebGLProgram* program, const WebGLUniformLocation* uniformLocation, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateWebGLObject(&quot;getUniform&quot;, program))
-        return WebGLGetInfo();
-    if (!uniformLocation || uniformLocation-&gt;program() != program) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;getUniform&quot;, &quot;no uniformlocation or not valid for this program&quot;);
-        return WebGLGetInfo();
-    }
-    GC3Dint location = uniformLocation-&gt;location();
-
-    GC3Denum baseType;
-    unsigned length;
-    switch (uniformLocation-&gt;type()) {
-    case GraphicsContext3D::BOOL:
-        baseType = GraphicsContext3D::BOOL;
-        length = 1;
-        break;
-    case GraphicsContext3D::BOOL_VEC2:
-        baseType = GraphicsContext3D::BOOL;
-        length = 2;
-        break;
-    case GraphicsContext3D::BOOL_VEC3:
-        baseType = GraphicsContext3D::BOOL;
-        length = 3;
-        break;
-    case GraphicsContext3D::BOOL_VEC4:
-        baseType = GraphicsContext3D::BOOL;
-        length = 4;
-        break;
-    case GraphicsContext3D::INT:
-        baseType = GraphicsContext3D::INT;
-        length = 1;
-        break;
-    case GraphicsContext3D::INT_VEC2:
-        baseType = GraphicsContext3D::INT;
-        length = 2;
-        break;
-    case GraphicsContext3D::INT_VEC3:
-        baseType = GraphicsContext3D::INT;
-        length = 3;
-        break;
-    case GraphicsContext3D::INT_VEC4:
-        baseType = GraphicsContext3D::INT;
-        length = 4;
-        break;
-    case GraphicsContext3D::FLOAT:
-        baseType = GraphicsContext3D::FLOAT;
-        length = 1;
-        break;
-    case GraphicsContext3D::FLOAT_VEC2:
-        baseType = GraphicsContext3D::FLOAT;
-        length = 2;
-        break;
-    case GraphicsContext3D::FLOAT_VEC3:
-        baseType = GraphicsContext3D::FLOAT;
-        length = 3;
-        break;
-    case GraphicsContext3D::FLOAT_VEC4:
-        baseType = GraphicsContext3D::FLOAT;
-        length = 4;
-        break;
-    case GraphicsContext3D::FLOAT_MAT2:
-        baseType = GraphicsContext3D::FLOAT;
-        length = 4;
-        break;
-    case GraphicsContext3D::FLOAT_MAT3:
-        baseType = GraphicsContext3D::FLOAT;
-        length = 9;
-        break;
-    case GraphicsContext3D::FLOAT_MAT4:
-        baseType = GraphicsContext3D::FLOAT;
-        length = 16;
-        break;
-    case GraphicsContext3D::SAMPLER_2D:
-    case GraphicsContext3D::SAMPLER_CUBE:
-        baseType = GraphicsContext3D::INT;
-        length = 1;
-        break;
-    default:
-        // Can't handle this type
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;getUniform&quot;, &quot;unhandled type&quot;);
-        return WebGLGetInfo();
-    }
-    switch (baseType) {
-    case GraphicsContext3D::FLOAT: {
-        GC3Dfloat value[16] = {0};
-        if (m_isRobustnessEXTSupported)
-            m_context-&gt;getExtensions()-&gt;getnUniformfvEXT(objectOrZero(program), location, 16 * sizeof(GC3Dfloat), value);
-        else
-            m_context-&gt;getUniformfv(objectOrZero(program), location, value);
-        if (length == 1)
-            return WebGLGetInfo(value[0]);
-        return WebGLGetInfo(Float32Array::create(value, length));
-    }
-    case GraphicsContext3D::INT: {
-        GC3Dint value[4] = {0};
-        if (m_isRobustnessEXTSupported)
-            m_context-&gt;getExtensions()-&gt;getnUniformivEXT(objectOrZero(program), location, 4 * sizeof(GC3Dint), value);
-        else
-            m_context-&gt;getUniformiv(objectOrZero(program), location, value);
-        if (length == 1)
-            return WebGLGetInfo(value[0]);
-        return WebGLGetInfo(Int32Array::create(value, length));
-    }
-    case GraphicsContext3D::BOOL: {
-        GC3Dint value[4] = {0};
-        if (m_isRobustnessEXTSupported)
-            m_context-&gt;getExtensions()-&gt;getnUniformivEXT(objectOrZero(program), location, 4 * sizeof(GC3Dint), value);
-        else
-            m_context-&gt;getUniformiv(objectOrZero(program), location, value);
-        if (length &gt; 1) {
-            bool boolValue[16] = {0};
-            for (unsigned j = 0; j &lt; length; j++)
-                boolValue[j] = static_cast&lt;bool&gt;(value[j]);
-            return WebGLGetInfo(boolValue, length);
-        }
-        return WebGLGetInfo(static_cast&lt;bool&gt;(value[0]));
-    }
-    default:
-        notImplemented();
-    }
-
-    // If we get here, something went wrong in our unfortunately complex logic above
-    synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;getUniform&quot;, &quot;unknown error&quot;);
-    return WebGLGetInfo();
-}
-
-PassRefPtr&lt;WebGLUniformLocation&gt; WebGLRenderingContext::getUniformLocation(WebGLProgram* program, const String&amp; name, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateWebGLObject(&quot;getUniformLocation&quot;, program))
-        return nullptr;
-    if (!validateLocationLength(&quot;getUniformLocation&quot;, name))
-        return nullptr;
-    if (!validateString(&quot;getUniformLocation&quot;, name))
-        return nullptr;
-    if (isPrefixReserved(name))
-        return nullptr;
-    if (!program-&gt;getLinkStatus()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;getUniformLocation&quot;, &quot;program not linked&quot;);
-        return nullptr;
-    }
-    GC3Dint uniformLocation = m_context-&gt;getUniformLocation(objectOrZero(program), name);
-    if (uniformLocation == -1)
-        return nullptr;
-
-    GC3Dint activeUniforms = 0;
-    m_context-&gt;getNonBuiltInActiveSymbolCount(objectOrZero(program), GraphicsContext3D::ACTIVE_UNIFORMS, &amp;activeUniforms);
-    for (GC3Dint i = 0; i &lt; activeUniforms; i++) {
-        ActiveInfo info;
-        if (!m_context-&gt;getActiveUniform(objectOrZero(program), i, info))
-            return nullptr;
-        // Strip &quot;[0]&quot; from the name if it's an array.
-        if (info.name.endsWith(&quot;[0]&quot;))
-            info.name = info.name.left(info.name.length() - 3);
-        // If it's an array, we need to iterate through each element, appending &quot;[index]&quot; to the name.
-        for (GC3Dint index = 0; index &lt; info.size; ++index) {
-            String uniformName = info.name + &quot;[&quot; + String::number(index) + &quot;]&quot;;
-
-            if (name == uniformName || name == info.name)
-                return WebGLUniformLocation::create(program, uniformLocation, info.type);
-        }
-    }
-    return nullptr;
-}
-
-WebGLGetInfo WebGLRenderingContext::getVertexAttrib(GC3Duint index, GC3Denum pname, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-
-    if (isContextLostOrPending())
-        return WebGLGetInfo();
-
-    if (index &gt;= m_maxVertexAttribs) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;getVertexAttrib&quot;, &quot;index out of range&quot;);
-        return WebGLGetInfo();
-    }
-
-    const WebGLVertexArrayObjectOES::VertexAttribState&amp; state = m_boundVertexArrayObject-&gt;getVertexAttribState(index);
-
-    if (m_angleInstancedArrays &amp;&amp; pname == GraphicsContext3D::VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE)
-        return WebGLGetInfo(state.divisor);
-
-    switch (pname) {
-    case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
-        if ((!isGLES2Compliant() &amp;&amp; !index &amp;&amp; m_boundVertexArrayObject-&gt;getVertexAttribState(0).bufferBinding == m_vertexAttrib0Buffer)
-            || !state.bufferBinding
-            || !state.bufferBinding-&gt;object())
-            return WebGLGetInfo();
-        return WebGLGetInfo(PassRefPtr&lt;WebGLBuffer&gt;(state.bufferBinding));
-    case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_ENABLED:
-        return WebGLGetInfo(state.enabled);
-    case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_NORMALIZED:
-        return WebGLGetInfo(state.normalized);
-    case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_SIZE:
-        return WebGLGetInfo(state.size);
-    case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_STRIDE:
-        return WebGLGetInfo(state.originalStride);
-    case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_TYPE:
-        return WebGLGetInfo(state.type);
-    case GraphicsContext3D::CURRENT_VERTEX_ATTRIB:
-        return WebGLGetInfo(Float32Array::create(m_vertexAttribValue[index].value, 4));
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getVertexAttrib&quot;, &quot;invalid parameter name&quot;);
-        return WebGLGetInfo();
-    }
-}
-
-long long WebGLRenderingContext::getVertexAttribOffset(GC3Duint index, GC3Denum pname)
-{
-    if (isContextLostOrPending())
-        return 0;
-    GC3Dsizeiptr result = m_context-&gt;getVertexAttribOffset(index, pname);
-    return static_cast&lt;long long&gt;(result);
-}
-
-void WebGLRenderingContext::hint(GC3Denum target, GC3Denum mode)
-{
-    if (isContextLostOrPending())
-        return;
-    bool isValid = false;
-    switch (target) {
-    case GraphicsContext3D::GENERATE_MIPMAP_HINT:
-        isValid = true;
-        break;
-    case Extensions3D::FRAGMENT_SHADER_DERIVATIVE_HINT_OES: // OES_standard_derivatives
-        if (m_oesStandardDerivatives)
-            isValid = true;
-        break;
-    }
-    if (!isValid) {
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;hint&quot;, &quot;invalid target&quot;);
-        return;
-    }
-    m_context-&gt;hint(target, mode);
-}
-
-GC3Dboolean WebGLRenderingContext::isBuffer(WebGLBuffer* buffer)
-{
-    if (!buffer || isContextLostOrPending())
-        return 0;
-
-    if (!buffer-&gt;hasEverBeenBound())
-        return 0;
-
-    return m_context-&gt;isBuffer(buffer-&gt;object());
-}
-
-bool WebGLRenderingContext::isContextLost() const
-{
-    return m_contextLost;
-}
-
-bool WebGLRenderingContext::isContextLostOrPending()
-{
-    if (m_isPendingPolicyResolution &amp;&amp; !m_hasRequestedPolicyResolution) {
-        LOG(WebGL, &quot;Context is being used. Attempt to resolve the policy.&quot;);
-        Document&amp; document = canvas()-&gt;document().topDocument();
-        Page* page = document.page();
-        if (page &amp;&amp; !document.url().isLocalFile())
-            page-&gt;mainFrame().loader().client().resolveWebGLPolicyForURL(document.url());
-        // FIXME: We don't currently do anything with the result from resolution. A more
-        // complete implementation might try to construct a real context, etc and proceed
-        // with normal operation.
-        // https://bugs.webkit.org/show_bug.cgi?id=129122
-        m_hasRequestedPolicyResolution = true;
-    }
-
-    return m_contextLost || m_isPendingPolicyResolution;
-}
-
-GC3Dboolean WebGLRenderingContext::isEnabled(GC3Denum cap)
-{
-    if (isContextLostOrPending() || !validateCapability(&quot;isEnabled&quot;, cap))
-        return 0;
-    if (cap == GraphicsContext3D::STENCIL_TEST)
-        return m_stencilEnabled;
-    return m_context-&gt;isEnabled(cap);
-}
-
-GC3Dboolean WebGLRenderingContext::isFramebuffer(WebGLFramebuffer* framebuffer)
-{
-    if (!framebuffer || isContextLostOrPending())
-        return 0;
-
-    if (!framebuffer-&gt;hasEverBeenBound())
-        return 0;
-
-    return m_context-&gt;isFramebuffer(framebuffer-&gt;object());
-}
-
-GC3Dboolean WebGLRenderingContext::isProgram(WebGLProgram* program)
-{
-    if (!program || isContextLostOrPending())
-        return 0;
-
-    return m_context-&gt;isProgram(program-&gt;object());
-}
-
-GC3Dboolean WebGLRenderingContext::isRenderbuffer(WebGLRenderbuffer* renderbuffer)
-{
-    if (!renderbuffer || isContextLostOrPending())
-        return 0;
-
-    if (!renderbuffer-&gt;hasEverBeenBound())
-        return 0;
-
-    return m_context-&gt;isRenderbuffer(renderbuffer-&gt;object());
-}
-
-GC3Dboolean WebGLRenderingContext::isShader(WebGLShader* shader)
-{
-    if (!shader || isContextLostOrPending())
-        return 0;
-
-    return m_context-&gt;isShader(shader-&gt;object());
-}
-
-GC3Dboolean WebGLRenderingContext::isTexture(WebGLTexture* texture)
-{
-    if (!texture || isContextLostOrPending())
-        return 0;
-
-    if (!texture-&gt;hasEverBeenBound())
-        return 0;
-
-    return m_context-&gt;isTexture(texture-&gt;object());
-}
-
-void WebGLRenderingContext::lineWidth(GC3Dfloat width)
-{
-    if (isContextLostOrPending())
-        return;
-    m_context-&gt;lineWidth(width);
-}
-
-void WebGLRenderingContext::linkProgram(WebGLProgram* program, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateWebGLObject(&quot;linkProgram&quot;, program))
-        return;
-    if (!isGLES2Compliant()) {
-        WebGLShader* vertexShader = program-&gt;getAttachedShader(GraphicsContext3D::VERTEX_SHADER);
-        WebGLShader* fragmentShader = program-&gt;getAttachedShader(GraphicsContext3D::FRAGMENT_SHADER);
-        if (!vertexShader || !vertexShader-&gt;isValid() || !fragmentShader || !fragmentShader-&gt;isValid() || !m_context-&gt;precisionsMatch(objectOrZero(vertexShader), objectOrZero(fragmentShader)) || !m_context-&gt;checkVaryingsPacking(objectOrZero(vertexShader), objectOrZero(fragmentShader))) {
-            program-&gt;setLinkStatus(false);
-            return;
-        }
-    }
-
-    m_context-&gt;linkProgram(objectOrZero(program));
-    program-&gt;increaseLinkCount();
-}
-
-void WebGLRenderingContext::pixelStorei(GC3Denum pname, GC3Dint param)
-{
-    if (isContextLostOrPending())
-        return;
-    switch (pname) {
-    case GraphicsContext3D::UNPACK_FLIP_Y_WEBGL:
-        m_unpackFlipY = param;
-        break;
-    case GraphicsContext3D::UNPACK_PREMULTIPLY_ALPHA_WEBGL:
-        m_unpackPremultiplyAlpha = param;
-        break;
-    case GraphicsContext3D::UNPACK_COLORSPACE_CONVERSION_WEBGL:
-        if (param == GraphicsContext3D::BROWSER_DEFAULT_WEBGL || param == GraphicsContext3D::NONE)
-            m_unpackColorspaceConversion = static_cast&lt;GC3Denum&gt;(param);
-        else {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;pixelStorei&quot;, &quot;invalid parameter for UNPACK_COLORSPACE_CONVERSION_WEBGL&quot;);
-            return;
-        }
-        break;
-    case GraphicsContext3D::PACK_ALIGNMENT:
-    case GraphicsContext3D::UNPACK_ALIGNMENT:
-        if (param == 1 || param == 2 || param == 4 || param == 8) {
-            if (pname == GraphicsContext3D::PACK_ALIGNMENT)
-                m_packAlignment = param;
-            else // GraphicsContext3D::UNPACK_ALIGNMENT:
-                m_unpackAlignment = param;
-            m_context-&gt;pixelStorei(pname, param);
-        } else {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;pixelStorei&quot;, &quot;invalid parameter for alignment&quot;);
-            return;
-        }
-        break;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;pixelStorei&quot;, &quot;invalid parameter name&quot;);
-        return;
-    }
-}
-
-void WebGLRenderingContext::polygonOffset(GC3Dfloat factor, GC3Dfloat units)
-{
-    if (isContextLostOrPending())
-        return;
-    m_context-&gt;polygonOffset(factor, units);
-}
-
-void WebGLRenderingContext::readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, ArrayBufferView* pixels, ExceptionCode&amp;)
-{
-    if (isContextLostOrPending())
-        return;
-    // Due to WebGL's same-origin restrictions, it is not possible to
-    // taint the origin using the WebGL API.
-    ASSERT(canvas()-&gt;originClean());
-    // Validate input parameters.
-    if (!pixels) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;readPixels&quot;, &quot;no destination ArrayBufferView&quot;);
-        return;
-    }
-    switch (format) {
-    case GraphicsContext3D::ALPHA:
-    case GraphicsContext3D::RGB:
-    case GraphicsContext3D::RGBA:
-        break;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;readPixels&quot;, &quot;invalid format&quot;);
-        return;
-    }
-    switch (type) {
-    case GraphicsContext3D::UNSIGNED_BYTE:
-    case GraphicsContext3D::UNSIGNED_SHORT_5_6_5:
-    case GraphicsContext3D::UNSIGNED_SHORT_4_4_4_4:
-    case GraphicsContext3D::UNSIGNED_SHORT_5_5_5_1:
-        break;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;readPixels&quot;, &quot;invalid type&quot;);
-        return;
-    }
-    if (format != GraphicsContext3D::RGBA || type != GraphicsContext3D::UNSIGNED_BYTE) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;readPixels&quot;, &quot;format not RGBA or type not UNSIGNED_BYTE&quot;);
-        return;
-    }
-    // Validate array type against pixel type.
-    if (pixels-&gt;getType() != JSC::TypeUint8) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;readPixels&quot;, &quot;ArrayBufferView not Uint8Array&quot;);
-        return;
-    }
-    const char* reason = &quot;framebuffer incomplete&quot;;
-    if (m_framebufferBinding &amp;&amp; !m_framebufferBinding-&gt;onAccess(graphicsContext3D(), !isResourceSafe(), &amp;reason)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, &quot;readPixels&quot;, reason);
-        return;
-    }
-    // Calculate array size, taking into consideration of PACK_ALIGNMENT.
-    unsigned int totalBytesRequired = 0;
-    unsigned int padding = 0;
-    if (!m_isRobustnessEXTSupported) {
-        GC3Denum error = m_context-&gt;computeImageSizeInBytes(format, type, width, height, m_packAlignment, &amp;totalBytesRequired, &amp;padding);
-        if (error != GraphicsContext3D::NO_ERROR) {
-            synthesizeGLError(error, &quot;readPixels&quot;, &quot;invalid dimensions&quot;);
-            return;
-        }
-        if (pixels-&gt;byteLength() &lt; totalBytesRequired) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;readPixels&quot;, &quot;ArrayBufferView not large enough for dimensions&quot;);
-            return;
-        }
-    }
-
-    clearIfComposited();
-    void* data = pixels-&gt;baseAddress();
-
-    {
-        ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding.get());
-        if (m_isRobustnessEXTSupported)
-            m_context-&gt;getExtensions()-&gt;readnPixelsEXT(x, y, width, height, format, type, pixels-&gt;byteLength(), data);
-        else
-            m_context-&gt;readPixels(x, y, width, height, format, type, data);
-    }
-
-#if OS(DARWIN)
-    if (m_isRobustnessEXTSupported) // we haven't computed padding
-        m_context-&gt;computeImageSizeInBytes(format, type, width, height, m_packAlignment, &amp;totalBytesRequired, &amp;padding);
-    // FIXME: remove this section when GL driver bug on Mac AND the GLES driver bug
-    // on QC is fixed, i.e., when alpha is off, readPixels should
-    // set alpha to 255 instead of 0.
-    if (!m_framebufferBinding &amp;&amp; !m_context-&gt;getContextAttributes().alpha) {
-        unsigned char* pixels = reinterpret_cast&lt;unsigned char*&gt;(data);
-        for (GC3Dsizei iy = 0; iy &lt; height; ++iy) {
-            for (GC3Dsizei ix = 0; ix &lt; width; ++ix) {
-                pixels[3] = 255;
-                pixels += 4;
-            }
-            pixels += padding;
-        }
-    }
-#endif
-}
-
-void WebGLRenderingContext::releaseShaderCompiler()
-{
-    if (isContextLostOrPending())
-        return;
-    m_context-&gt;releaseShaderCompiler();
-}
-
-void WebGLRenderingContext::renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height)
-{
-    if (isContextLostOrPending())
-        return;
-    if (target != GraphicsContext3D::RENDERBUFFER) {
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;renderbufferStorage&quot;, &quot;invalid target&quot;);
-        return;
-    }
-    if (!m_renderbufferBinding || !m_renderbufferBinding-&gt;object()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;renderbufferStorage&quot;, &quot;no bound renderbuffer&quot;);
-        return;
-    }
-    if (!validateSize(&quot;renderbufferStorage&quot;, width, height))
-        return;
-    switch (internalformat) {
-    case GraphicsContext3D::DEPTH_COMPONENT16:
-    case GraphicsContext3D::RGBA4:
-    case GraphicsContext3D::RGB5_A1:
-    case GraphicsContext3D::RGB565:
-    case GraphicsContext3D::STENCIL_INDEX8:
-    case Extensions3D::SRGB8_ALPHA8_EXT:
-        if (internalformat == Extensions3D::SRGB8_ALPHA8_EXT &amp;&amp; !m_extsRGB) {
-            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;renderbufferStorage&quot;, &quot;invalid internalformat&quot;);
-            return;
-        }
-        m_context-&gt;renderbufferStorage(target, internalformat, width, height);
-        m_renderbufferBinding-&gt;setInternalFormat(internalformat);
-        m_renderbufferBinding-&gt;setIsValid(true);
-        m_renderbufferBinding-&gt;setSize(width, height);
-        break;
-    case GraphicsContext3D::DEPTH_STENCIL:
-        if (isDepthStencilSupported()) {
-            m_context-&gt;renderbufferStorage(target, Extensions3D::DEPTH24_STENCIL8, width, height);
-        }
-        m_renderbufferBinding-&gt;setSize(width, height);
-        m_renderbufferBinding-&gt;setIsValid(isDepthStencilSupported());
-        m_renderbufferBinding-&gt;setInternalFormat(internalformat);
-        break;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;renderbufferStorage&quot;, &quot;invalid internalformat&quot;);
-        return;
-    }
-    applyStencilTest();
-}
-
-void WebGLRenderingContext::sampleCoverage(GC3Dfloat value, GC3Dboolean invert)
-{
-    if (isContextLostOrPending())
-        return;
-    m_context-&gt;sampleCoverage(value, invert);
-}
-
-void WebGLRenderingContext::scissor(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
-{
-    if (isContextLostOrPending())
-        return;
-    if (!validateSize(&quot;scissor&quot;, width, height))
-        return;
-    m_context-&gt;scissor(x, y, width, height);
-}
-
-void WebGLRenderingContext::shaderSource(WebGLShader* shader, const String&amp; string, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateWebGLObject(&quot;shaderSource&quot;, shader))
-        return;
-    String stringWithoutComments = StripComments(string).result();
-    if (!validateString(&quot;shaderSource&quot;, stringWithoutComments))
-        return;
-    shader-&gt;setSource(string);
-    m_context-&gt;shaderSource(objectOrZero(shader), stringWithoutComments);
-}
-
-void WebGLRenderingContext::stencilFunc(GC3Denum func, GC3Dint ref, GC3Duint mask)
-{
-    if (isContextLostOrPending())
-        return;
-    if (!validateStencilFunc(&quot;stencilFunc&quot;, func))
-        return;
-    m_stencilFuncRef = ref;
-    m_stencilFuncRefBack = ref;
-    m_stencilFuncMask = mask;
-    m_stencilFuncMaskBack = mask;
-    m_context-&gt;stencilFunc(func, ref, mask);
-}
-
-void WebGLRenderingContext::stencilFuncSeparate(GC3Denum face, GC3Denum func, GC3Dint ref, GC3Duint mask)
-{
-    if (isContextLostOrPending())
-        return;
-    if (!validateStencilFunc(&quot;stencilFuncSeparate&quot;, func))
-        return;
-    switch (face) {
-    case GraphicsContext3D::FRONT_AND_BACK:
-        m_stencilFuncRef = ref;
-        m_stencilFuncRefBack = ref;
-        m_stencilFuncMask = mask;
-        m_stencilFuncMaskBack = mask;
-        break;
-    case GraphicsContext3D::FRONT:
-        m_stencilFuncRef = ref;
-        m_stencilFuncMask = mask;
-        break;
-    case GraphicsContext3D::BACK:
-        m_stencilFuncRefBack = ref;
-        m_stencilFuncMaskBack = mask;
-        break;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;stencilFuncSeparate&quot;, &quot;invalid face&quot;);
-        return;
-    }
-    m_context-&gt;stencilFuncSeparate(face, func, ref, mask);
-}
-
-void WebGLRenderingContext::stencilMask(GC3Duint mask)
-{
-    if (isContextLostOrPending())
-        return;
-    m_stencilMask = mask;
-    m_stencilMaskBack = mask;
-    m_context-&gt;stencilMask(mask);
-}
-
-void WebGLRenderingContext::stencilMaskSeparate(GC3Denum face, GC3Duint mask)
-{
-    if (isContextLostOrPending())
-        return;
-    switch (face) {
-    case GraphicsContext3D::FRONT_AND_BACK:
-        m_stencilMask = mask;
-        m_stencilMaskBack = mask;
-        break;
-    case GraphicsContext3D::FRONT:
-        m_stencilMask = mask;
-        break;
-    case GraphicsContext3D::BACK:
-        m_stencilMaskBack = mask;
-        break;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;stencilMaskSeparate&quot;, &quot;invalid face&quot;);
-        return;
-    }
-    m_context-&gt;stencilMaskSeparate(face, mask);
-}
-
-void WebGLRenderingContext::stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zpass)
-{
-    if (isContextLostOrPending())
-        return;
-    m_context-&gt;stencilOp(fail, zfail, zpass);
-}
-
-void WebGLRenderingContext::stencilOpSeparate(GC3Denum face, GC3Denum fail, GC3Denum zfail, GC3Denum zpass)
-{
-    if (isContextLostOrPending())
-        return;
-    m_context-&gt;stencilOpSeparate(face, fail, zfail, zpass);
-}
-
-void WebGLRenderingContext::texImage2DBase(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels, ExceptionCode&amp; ec)
-{
-    // FIXME: For now we ignore any errors returned.
-    ec = 0;
-    WebGLTexture* tex = validateTextureBinding(&quot;texImage2D&quot;, target, true);
-    ASSERT(validateTexFuncParameters(&quot;texImage2D&quot;, NotTexSubImage2D, target, level, internalformat, width, height, border, format, type));
-    ASSERT(tex);
-    ASSERT(!level || !WebGLTexture::isNPOT(width, height));
-    if (!pixels) {
-        // Note: Chromium's OpenGL implementation clears textures and isResourceSafe() is therefore true.
-        // For other implementations, if they are using ANGLE_depth_texture, ANGLE depth textures
-        // can not be cleared with texImage2D and must be cleared by binding to an fbo and calling
-        // clear.
-        if (isResourceSafe())
-            m_context-&gt;texImage2D(target, level, internalformat, width, height, border, format, type, nullptr);
-        else {
-            bool succeed = m_context-&gt;texImage2DResourceSafe(target, level, internalformat, width, height,
-                                                             border, format, type, m_unpackAlignment);
-            if (!succeed)
-                return;
-        }
-    } else {
-        ASSERT(validateSettableTexFormat(&quot;texImage2D&quot;, internalformat));
-        m_context-&gt;moveErrorsToSyntheticErrorList();
-        m_context-&gt;texImage2D(target, level, internalformat, width, height,
-                              border, format, type, pixels);
-        if (m_context-&gt;moveErrorsToSyntheticErrorList()) {
-            // The texImage2D function failed. Tell the WebGLTexture it doesn't have the data for this level.
-            tex-&gt;markInvalid(target, level);
-            return;
-        }
-    }
-    tex-&gt;setLevelInfo(target, level, internalformat, width, height, type);
-}
-
-void WebGLRenderingContext::texImage2DImpl(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Denum format, GC3Denum type, Image* image, GraphicsContext3D::ImageHtmlDomSource domSource, bool flipY, bool premultiplyAlpha, ExceptionCode&amp; ec)
-{
-    ec = 0;
-    Vector&lt;uint8_t&gt; data;
-    GraphicsContext3D::ImageExtractor imageExtractor(image, domSource, premultiplyAlpha, m_unpackColorspaceConversion == GraphicsContext3D::NONE);
-    if (!imageExtractor.extractSucceeded()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;texImage2D&quot;, &quot;bad image data&quot;);
-        return;
-    }
-    GraphicsContext3D::DataFormat sourceDataFormat = imageExtractor.imageSourceFormat();
-    GraphicsContext3D::AlphaOp alphaOp = imageExtractor.imageAlphaOp();
-    const void* imagePixelData = imageExtractor.imagePixelData();
-
-    bool needConversion = true;
-    if (type == GraphicsContext3D::UNSIGNED_BYTE &amp;&amp; sourceDataFormat == GraphicsContext3D::DataFormatRGBA8 &amp;&amp; format == GraphicsContext3D::RGBA &amp;&amp; alphaOp == GraphicsContext3D::AlphaDoNothing &amp;&amp; !flipY)
-        needConversion = false;
-    else {
-        if (!m_context-&gt;packImageData(image, imagePixelData, format, type, flipY, alphaOp, sourceDataFormat, imageExtractor.imageWidth(), imageExtractor.imageHeight(), imageExtractor.imageSourceUnpackAlignment(), data)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;texImage2D&quot;, &quot;packImage error&quot;);
-            return;
-        }
-    }
-
-    if (m_unpackAlignment != 1)
-        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1);
-    texImage2DBase(target, level, internalformat, image-&gt;width(), image-&gt;height(), 0, format, type, needConversion ? data.data() : imagePixelData, ec);
-    if (m_unpackAlignment != 1)
-        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlignment);
-}
-
-bool WebGLRenderingContext::validateTexFunc(const char* functionName, TexFuncValidationFunctionType functionType, TexFuncValidationSourceType sourceType, GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, GC3Dint xoffset, GC3Dint yoffset)
-{
-    if (!validateTexFuncParameters(functionName, functionType, target, level, internalformat, width, height, border, format, type))
-        return false;
-
-    WebGLTexture* texture = validateTextureBinding(functionName, target, true);
-    if (!texture)
-        return false;
-
-    if (functionType == NotTexSubImage2D) {
-        if (level &amp;&amp; WebGLTexture::isNPOT(width, height)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;level &gt; 0 not power of 2&quot;);
-            return false;
-        }
-        // For SourceArrayBufferView, function validateTexFuncData() would handle whether to validate the SettableTexFormat
-        // by checking if the ArrayBufferView is null or not.
-        if (sourceType != SourceArrayBufferView) {
-            if (!validateSettableTexFormat(functionName, format))
-                return false;
-        }
-    } else {
-        if (!validateSettableTexFormat(functionName, format))
-            return false;
-        if (!validateSize(functionName, xoffset, yoffset))
-            return false;
-        // Before checking if it is in the range, check if overflow happens first.
-        if (xoffset + width &lt; 0 || yoffset + height &lt; 0) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;bad dimensions&quot;);
-            return false;
-        }
-        if (xoffset + width &gt; texture-&gt;getWidth(target, level) || yoffset + height &gt; texture-&gt;getHeight(target, level)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;dimensions out of range&quot;);
-            return false;
-        }
-        if (texture-&gt;getInternalFormat(target, level) != format || texture-&gt;getType(target, level) != type) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;type and format do not match texture&quot;);
-            return false;
-        }
-    }
-
-    return true;
-}
-
-void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
-                                       GC3Dsizei width, GC3Dsizei height, GC3Dint border,
-                                       GC3Denum format, GC3Denum type, ArrayBufferView* pixels, ExceptionCode&amp; ec)
-{
-    if (isContextLostOrPending() || !validateTexFuncData(&quot;texImage2D&quot;, level, width, height, format, type, pixels, NullAllowed)
-        || !validateTexFunc(&quot;texImage2D&quot;, NotTexSubImage2D, SourceArrayBufferView, target, level, internalformat, width, height, border, format, type, 0, 0))
-        return;
-    void* data = pixels ? pixels-&gt;baseAddress() : 0;
-    Vector&lt;uint8_t&gt; tempData;
-    bool changeUnpackAlignment = false;
-    if (data &amp;&amp; (m_unpackFlipY || m_unpackPremultiplyAlpha)) {
-        if (!m_context-&gt;extractTextureData(width, height, format, type,
-                                           m_unpackAlignment,
-                                           m_unpackFlipY, m_unpackPremultiplyAlpha,
-                                           data,
-                                           tempData))
-            return;
-        data = tempData.data();
-        changeUnpackAlignment = true;
-    }
-    if (changeUnpackAlignment)
-        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1);
-    texImage2DBase(target, level, internalformat, width, height, border,
-                   format, type, data, ec);
-    if (changeUnpackAlignment)
-        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlignment);
-}
-
-void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
-                                       GC3Denum format, GC3Denum type, ImageData* pixels, ExceptionCode&amp; ec)
-{
-    ec = 0;
-    if (isContextLostOrPending() || !pixels || !validateTexFunc(&quot;texImage2D&quot;, NotTexSubImage2D, SourceImageData, target, level, internalformat, pixels-&gt;width(), pixels-&gt;height(), 0, format, type, 0, 0))
-        return;
-    Vector&lt;uint8_t&gt; data;
-    bool needConversion = true;
-    // The data from ImageData is always of format RGBA8.
-    // No conversion is needed if destination format is RGBA and type is USIGNED_BYTE and no Flip or Premultiply operation is required.
-    if (!m_unpackFlipY &amp;&amp; !m_unpackPremultiplyAlpha &amp;&amp; format == GraphicsContext3D::RGBA &amp;&amp; type == GraphicsContext3D::UNSIGNED_BYTE)
-        needConversion = false;
-    else {
-        if (!m_context-&gt;extractImageData(pixels, format, type, m_unpackFlipY, m_unpackPremultiplyAlpha, data)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;texImage2D&quot;, &quot;bad image data&quot;);
-            return;
-        }
-    }
-    if (m_unpackAlignment != 1)
-        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1);
-    texImage2DBase(target, level, internalformat, pixels-&gt;width(), pixels-&gt;height(), 0, format, type, needConversion ? data.data() : pixels-&gt;data()-&gt;data(), ec);
-    if (m_unpackAlignment != 1)
-        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlignment);
-}
-
-PassRefPtr&lt;Image&gt; WebGLRenderingContext::drawImageIntoBuffer(Image* image, int width, int height, int deviceScaleFactor)
-{
-    IntSize size(width, height);
-    size.scale(deviceScaleFactor);
-    ImageBuffer* buf = m_generatedImageCache.imageBuffer(size);
-    if (!buf) {
-        synthesizeGLError(GraphicsContext3D::OUT_OF_MEMORY, &quot;texImage2D&quot;, &quot;out of memory&quot;);
-        return nullptr;
-    }
-
-    FloatRect srcRect(FloatPoint(), image-&gt;size());
-    FloatRect destRect(FloatPoint(), size);
-    buf-&gt;context()-&gt;drawImage(image, ColorSpaceDeviceRGB, destRect, srcRect);
-    return buf-&gt;copyImage(ImageBuffer::fastCopyImageMode());
-}
-
-void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
-                                       GC3Denum format, GC3Denum type, HTMLImageElement* image, ExceptionCode&amp; ec)
-{
-    ec = 0;
-    if (isContextLostOrPending() || !validateHTMLImageElement(&quot;texImage2D&quot;, image, ec))
-        return;
-
-    RefPtr&lt;Image&gt; imageForRender = image-&gt;cachedImage()-&gt;imageForRenderer(image-&gt;renderer());
-    if (imageForRender-&gt;isSVGImage())
-        imageForRender = drawImageIntoBuffer(imageForRender.get(), image-&gt;width(), image-&gt;height(), 1);
-
-    if (!imageForRender || !validateTexFunc(&quot;texImage2D&quot;, NotTexSubImage2D, SourceHTMLImageElement, target, level, internalformat, imageForRender-&gt;width(), imageForRender-&gt;height(), 0, format, type, 0, 0))
-        return;
-
-    texImage2DImpl(target, level, internalformat, format, type, imageForRender.get(), GraphicsContext3D::HtmlDomImage, m_unpackFlipY, m_unpackPremultiplyAlpha, ec);
-}
-
-void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
-                                       GC3Denum format, GC3Denum type, HTMLCanvasElement* canvas, ExceptionCode&amp; ec)
-{
-    ec = 0;
-    if (isContextLostOrPending() || !validateHTMLCanvasElement(&quot;texImage2D&quot;, canvas, ec) || !validateTexFunc(&quot;texImage2D&quot;, NotTexSubImage2D, SourceHTMLCanvasElement, target, level, internalformat, canvas-&gt;width(), canvas-&gt;height(), 0, format, type, 0, 0))
-        return;
-
-    WebGLTexture* texture = validateTextureBinding(&quot;texImage2D&quot;, target, true);
-    // If possible, copy from the canvas element directly to the texture
-    // via the GPU, without a read-back to system memory.
-    //
-    // FIXME: restriction of (RGB || RGBA)/UNSIGNED_BYTE should be lifted when
-    // ImageBuffer::copyToPlatformTexture implementations are fully functional.
-    if (GraphicsContext3D::TEXTURE_2D == target &amp;&amp; texture &amp;&amp; type == texture-&gt;getType(target, level)
-        &amp;&amp; (format == GraphicsContext3D::RGB || format == GraphicsContext3D::RGBA) &amp;&amp; type == GraphicsContext3D::UNSIGNED_BYTE) {
-        ImageBuffer* buffer = canvas-&gt;buffer();
-        if (buffer &amp;&amp; buffer-&gt;copyToPlatformTexture(*m_context.get(), texture-&gt;object(), internalformat, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
-            texture-&gt;setLevelInfo(target, level, internalformat, canvas-&gt;width(), canvas-&gt;height(), type);
-            return;
-        }
-    }
-
-    RefPtr&lt;ImageData&gt; imageData = canvas-&gt;getImageData();
-    if (imageData)
-        texImage2D(target, level, internalformat, format, type, imageData.get(), ec);
-    else
-        texImage2DImpl(target, level, internalformat, format, type, canvas-&gt;copiedImage(), GraphicsContext3D::HtmlDomCanvas, m_unpackFlipY, m_unpackPremultiplyAlpha, ec);
-}
-
-#if ENABLE(VIDEO)
-PassRefPtr&lt;Image&gt; WebGLRenderingContext::videoFrameToImage(HTMLVideoElement* video, BackingStoreCopy backingStoreCopy, ExceptionCode&amp;)
-{
-    IntSize size(video-&gt;videoWidth(), video-&gt;videoHeight());
-    ImageBuffer* buf = m_generatedImageCache.imageBuffer(size);
-    if (!buf) {
-        synthesizeGLError(GraphicsContext3D::OUT_OF_MEMORY, &quot;texImage2D&quot;, &quot;out of memory&quot;);
-        return nullptr;
-    }
-    IntRect destRect(0, 0, size.width(), size.height());
-    // FIXME: Turn this into a GPU-GPU texture copy instead of CPU readback.
-    video-&gt;paintCurrentFrameInContext(buf-&gt;context(), destRect);
-    return buf-&gt;copyImage(backingStoreCopy);
-}
-
-void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
-                                       GC3Denum format, GC3Denum type, HTMLVideoElement* video, ExceptionCode&amp; ec)
-{
-    ec = 0;
-    if (isContextLostOrPending() || !validateHTMLVideoElement(&quot;texImage2D&quot;, video, ec)
-        || !validateTexFunc(&quot;texImage2D&quot;, NotTexSubImage2D, SourceHTMLVideoElement, target, level, internalformat, video-&gt;videoWidth(), video-&gt;videoHeight(), 0, format, type, 0, 0))
-        return;
-
-    // Go through the fast path doing a GPU-GPU textures copy without a readback to system memory if possible.
-    // Otherwise, it will fall back to the normal SW path.
-    // FIXME: The current restrictions require that format shoud be RGB or RGBA,
-    // type should be UNSIGNED_BYTE and level should be 0. It may be lifted in the future.
-    WebGLTexture* texture = validateTextureBinding(&quot;texImage2D&quot;, target, true);
-    if (GraphicsContext3D::TEXTURE_2D == target &amp;&amp; texture
-        &amp;&amp; (format == GraphicsContext3D::RGB || format == GraphicsContext3D::RGBA)
-        &amp;&amp; type == GraphicsContext3D::UNSIGNED_BYTE
-        &amp;&amp; (texture-&gt;getType(target, level) == GraphicsContext3D::UNSIGNED_BYTE || !texture-&gt;isValid(target, level))
-        &amp;&amp; !level) {
-        if (video-&gt;copyVideoTextureToPlatformTexture(m_context.get(), texture-&gt;object(), level, type, internalformat, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
-            texture-&gt;setLevelInfo(target, level, internalformat, video-&gt;videoWidth(), video-&gt;videoHeight(), type);
-            return;
-        }
-    }
-
-    // Normal pure SW path.
-    RefPtr&lt;Image&gt; image = videoFrameToImage(video, ImageBuffer::fastCopyImageMode(), ec);
-    if (!image)
-        return;
-    texImage2DImpl(target, level, internalformat, format, type, image.get(), GraphicsContext3D::HtmlDomVideo, m_unpackFlipY, m_unpackPremultiplyAlpha, ec);
-}
-#endif
-
-void WebGLRenderingContext::texParameter(GC3Denum target, GC3Denum pname, GC3Dfloat paramf, GC3Dint parami, bool isFloat)
-{
-    if (isContextLostOrPending())
-        return;
-    WebGLTexture* tex = validateTextureBinding(&quot;texParameter&quot;, target, false);
-    if (!tex)
-        return;
-    switch (pname) {
-    case GraphicsContext3D::TEXTURE_MIN_FILTER:
-    case GraphicsContext3D::TEXTURE_MAG_FILTER:
-        break;
-    case GraphicsContext3D::TEXTURE_WRAP_S:
-    case GraphicsContext3D::TEXTURE_WRAP_T:
-        if ((isFloat &amp;&amp; paramf != GraphicsContext3D::CLAMP_TO_EDGE &amp;&amp; paramf != GraphicsContext3D::MIRRORED_REPEAT &amp;&amp; paramf != GraphicsContext3D::REPEAT)
-            || (!isFloat &amp;&amp; parami != GraphicsContext3D::CLAMP_TO_EDGE &amp;&amp; parami != GraphicsContext3D::MIRRORED_REPEAT &amp;&amp; parami != GraphicsContext3D::REPEAT)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;texParameter&quot;, &quot;invalid parameter&quot;);
-            return;
-        }
-        break;
-    case Extensions3D::TEXTURE_MAX_ANISOTROPY_EXT: // EXT_texture_filter_anisotropic
-        if (!m_extTextureFilterAnisotropic) {
-            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;texParameter&quot;, &quot;invalid parameter, EXT_texture_filter_anisotropic not enabled&quot;);
-            return;
-        }
-        break;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;texParameter&quot;, &quot;invalid parameter name&quot;);
-        return;
-    }
-    if (isFloat) {
-        tex-&gt;setParameterf(pname, paramf);
-        m_context-&gt;texParameterf(target, pname, paramf);
-    } else {
-        tex-&gt;setParameteri(pname, parami);
-        m_context-&gt;texParameteri(target, pname, parami);
-    }
-}
-
-void WebGLRenderingContext::texParameterf(GC3Denum target, GC3Denum pname, GC3Dfloat param)
-{
-    texParameter(target, pname, param, 0, true);
-}
-
-void WebGLRenderingContext::texParameteri(GC3Denum target, GC3Denum pname, GC3Dint param)
-{
-    texParameter(target, pname, 0, param, false);
-}
-
-void WebGLRenderingContext::texSubImage2DBase(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels, ExceptionCode&amp; ec)
-{
-    // FIXME: For now we ignore any errors returned
-    ec = 0;
-    ASSERT(!isContextLost());
-    ASSERT(validateTexFuncParameters(&quot;texSubImage2D&quot;, TexSubImage2D, target, level, format, width, height, 0, format, type));
-    ASSERT(validateSize(&quot;texSubImage2D&quot;, xoffset, yoffset));
-    ASSERT(validateSettableTexFormat(&quot;texSubImage2D&quot;, format));
-    WebGLTexture* tex = validateTextureBinding(&quot;texSubImage2D&quot;, target, true);
-    if (!tex) {
-        ASSERT_NOT_REACHED();
-        return;
-    }
-    ASSERT((xoffset + width) &gt;= 0);
-    ASSERT((yoffset + height) &gt;= 0);
-    ASSERT(tex-&gt;getWidth(target, level) &gt;= (xoffset + width));
-    ASSERT(tex-&gt;getHeight(target, level) &gt;= (yoffset + height));
-    ASSERT(tex-&gt;getInternalFormat(target, level) == format);
-    ASSERT(tex-&gt;getType(target, level) == type);
-    m_context-&gt;texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-void WebGLRenderingContext::texSubImage2DImpl(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Denum format, GC3Denum type, Image* image, GraphicsContext3D::ImageHtmlDomSource domSource, bool flipY, bool premultiplyAlpha, ExceptionCode&amp; ec)
-{
-    ec = 0;
-    Vector&lt;uint8_t&gt; data;
-    GraphicsContext3D::ImageExtractor imageExtractor(image, domSource, premultiplyAlpha, m_unpackColorspaceConversion == GraphicsContext3D::NONE);  
-    if (!imageExtractor.extractSucceeded()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;texSubImage2D&quot;, &quot;bad image&quot;);
-        return;
-    }
-    GraphicsContext3D::DataFormat sourceDataFormat = imageExtractor.imageSourceFormat();
-    GraphicsContext3D::AlphaOp alphaOp = imageExtractor.imageAlphaOp();
-    const void* imagePixelData = imageExtractor.imagePixelData();
-
-    bool needConversion = true;
-    if (type == GraphicsContext3D::UNSIGNED_BYTE &amp;&amp; sourceDataFormat == GraphicsContext3D::DataFormatRGBA8 &amp;&amp; format == GraphicsContext3D::RGBA &amp;&amp; alphaOp == GraphicsContext3D::AlphaDoNothing &amp;&amp; !flipY)
-        needConversion = false;
-    else {
-        if (!m_context-&gt;packImageData(image, imagePixelData, format, type, flipY, alphaOp, sourceDataFormat, imageExtractor.imageWidth(), imageExtractor.imageHeight(), imageExtractor.imageSourceUnpackAlignment(), data)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;texImage2D&quot;, &quot;bad image data&quot;);
-            return;
-        }
-    }
-
-    if (m_unpackAlignment != 1)
-        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1);
-    texSubImage2DBase(target, level, xoffset, yoffset, image-&gt;width(), image-&gt;height(), format, type,  needConversion ? data.data() : imagePixelData, ec);
-    if (m_unpackAlignment != 1)
-        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlignment);
-}
-
-void WebGLRenderingContext::texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
-                                          GC3Dsizei width, GC3Dsizei height,
-                                          GC3Denum format, GC3Denum type, ArrayBufferView* pixels, ExceptionCode&amp; ec)
-{
-    if (isContextLostOrPending() || !validateTexFuncData(&quot;texSubImage2D&quot;, level, width, height, format, type, pixels, NullNotAllowed)
-        || !validateTexFunc(&quot;texSubImage2D&quot;, TexSubImage2D, SourceArrayBufferView, target, level, format, width, height, 0, format, type, xoffset, yoffset))
-        return;
-    void* data = pixels-&gt;baseAddress();
-    Vector&lt;uint8_t&gt; tempData;
-    bool changeUnpackAlignment = false;
-    if (data &amp;&amp; (m_unpackFlipY || m_unpackPremultiplyAlpha)) {
-        if (!m_context-&gt;extractTextureData(width, height, format, type,
-                                           m_unpackAlignment,
-                                           m_unpackFlipY, m_unpackPremultiplyAlpha,
-                                           data,
-                                           tempData))
-            return;
-        data = tempData.data();
-        changeUnpackAlignment = true;
-    }
-    if (changeUnpackAlignment)
-        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1);
-    texSubImage2DBase(target, level, xoffset, yoffset, width, height, format, type, data, ec);
-    if (changeUnpackAlignment)
-        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlignment);
-}
-
-void WebGLRenderingContext::texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
-                                          GC3Denum format, GC3Denum type, ImageData* pixels, ExceptionCode&amp; ec)
-{
-    ec = 0;
-    if (isContextLostOrPending() || !pixels || !validateTexFunc(&quot;texSubImage2D&quot;, TexSubImage2D, SourceImageData, target, level, format,  pixels-&gt;width(), pixels-&gt;height(), 0, format, type, xoffset, yoffset))
-        return;
-
-    Vector&lt;uint8_t&gt; data;
-    bool needConversion = true;
-    // The data from ImageData is always of format RGBA8.
-    // No conversion is needed if destination format is RGBA and type is USIGNED_BYTE and no Flip or Premultiply operation is required.
-    if (format == GraphicsContext3D::RGBA &amp;&amp; type == GraphicsContext3D::UNSIGNED_BYTE &amp;&amp; !m_unpackFlipY &amp;&amp; !m_unpackPremultiplyAlpha)
-        needConversion = false;
-    else {
-        if (!m_context-&gt;extractImageData(pixels, format, type, m_unpackFlipY, m_unpackPremultiplyAlpha, data)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;texSubImage2D&quot;, &quot;bad image data&quot;);
-            return;
-        }
-    }
-    if (m_unpackAlignment != 1)
-        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1);
-    texSubImage2DBase(target, level, xoffset, yoffset, pixels-&gt;width(), pixels-&gt;height(), format, type, needConversion ? data.data() : pixels-&gt;data()-&gt;data(), ec);
-    if (m_unpackAlignment != 1)
-        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlignment);
-}
-
-void WebGLRenderingContext::texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
-                                          GC3Denum format, GC3Denum type, HTMLImageElement* image, ExceptionCode&amp; ec)
-{
-    ec = 0;
-    if (isContextLostOrPending() || !validateHTMLImageElement(&quot;texSubImage2D&quot;, image, ec))
-        return;
-
-    RefPtr&lt;Image&gt; imageForRender = image-&gt;cachedImage()-&gt;imageForRenderer(image-&gt;renderer());
-    if (imageForRender-&gt;isSVGImage())
-        imageForRender = drawImageIntoBuffer(imageForRender.get(), image-&gt;width(), image-&gt;height(), 1);
-
-    if (!imageForRender || !validateTexFunc(&quot;texSubImage2D&quot;, TexSubImage2D, SourceHTMLImageElement, target, level, format, imageForRender-&gt;width(), imageForRender-&gt;height(), 0, format, type, xoffset, yoffset))
-        return;
-
-    texSubImage2DImpl(target, level, xoffset, yoffset, format, type, imageForRender.get(), GraphicsContext3D::HtmlDomImage, m_unpackFlipY, m_unpackPremultiplyAlpha, ec);
-}
-
-void WebGLRenderingContext::texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
-                                          GC3Denum format, GC3Denum type, HTMLCanvasElement* canvas, ExceptionCode&amp; ec)
-{
-    ec = 0;
-    if (isContextLostOrPending() || !validateHTMLCanvasElement(&quot;texSubImage2D&quot;, canvas, ec)
-        || !validateTexFunc(&quot;texSubImage2D&quot;, TexSubImage2D, SourceHTMLCanvasElement, target, level, format, canvas-&gt;width(), canvas-&gt;height(), 0, format, type, xoffset, yoffset))
-        return;
-
-    RefPtr&lt;ImageData&gt; imageData = canvas-&gt;getImageData();
-    if (imageData)
-        texSubImage2D(target, level, xoffset, yoffset, format, type, imageData.get(), ec);
-    else
-        texSubImage2DImpl(target, level, xoffset, yoffset, format, type, canvas-&gt;copiedImage(), GraphicsContext3D::HtmlDomCanvas, m_unpackFlipY, m_unpackPremultiplyAlpha, ec);
-}
-
-#if ENABLE(VIDEO)
-void WebGLRenderingContext::texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
-                                          GC3Denum format, GC3Denum type, HTMLVideoElement* video, ExceptionCode&amp; ec)
-{
-    ec = 0;
-    if (isContextLostOrPending() || !validateHTMLVideoElement(&quot;texSubImage2D&quot;, video, ec)
-        || !validateTexFunc(&quot;texSubImage2D&quot;, TexSubImage2D, SourceHTMLVideoElement, target, level, format, video-&gt;videoWidth(), video-&gt;videoHeight(), 0, format, type, xoffset, yoffset))
-        return;
-
-    RefPtr&lt;Image&gt; image = videoFrameToImage(video, ImageBuffer::fastCopyImageMode(), ec);
-    if (!image)
-        return;
-    texSubImage2DImpl(target, level, xoffset, yoffset, format, type, image.get(), GraphicsContext3D::HtmlDomVideo, m_unpackFlipY, m_unpackPremultiplyAlpha, ec);
-}
-#endif
-
-void WebGLRenderingContext::uniform1f(const WebGLUniformLocation* location, GC3Dfloat x, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !location)
-        return;
-
-    if (location-&gt;program() != m_currentProgram) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;uniform1f&quot;, &quot;location not for current program&quot;);
-        return;
-    }
-
-    m_context-&gt;uniform1f(location-&gt;location(), x);
-}
-
-void WebGLRenderingContext::uniform1fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform1fv&quot;, location, v, 1))
-        return;
-
-    m_context-&gt;uniform1fv(location-&gt;location(), v-&gt;length(), v-&gt;data());
-}
-
-void WebGLRenderingContext::uniform1fv(const WebGLUniformLocation* location, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform1fv&quot;, location, v, size, 1))
-        return;
-
-    m_context-&gt;uniform1fv(location-&gt;location(), size, v);
-}
-
-void WebGLRenderingContext::uniform1i(const WebGLUniformLocation* location, GC3Dint x, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !location)
-        return;
-
-    if (location-&gt;program() != m_currentProgram) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;uniform1i&quot;, &quot;location not for current program&quot;);
-        return;
-    }
-
-    if ((location-&gt;type() == GraphicsContext3D::SAMPLER_2D || location-&gt;type() == GraphicsContext3D::SAMPLER_CUBE) &amp;&amp; x &gt;= (int)m_textureUnits.size()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;uniform1i&quot;, &quot;invalid texture unit&quot;);
-        return;
-    }
-
-    m_context-&gt;uniform1i(location-&gt;location(), x);
-}
-
-void WebGLRenderingContext::uniform1iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform1iv&quot;, location, v, 1))
-        return;
-
-    if (location-&gt;type() == GraphicsContext3D::SAMPLER_2D || location-&gt;type() == GraphicsContext3D::SAMPLER_CUBE)
-        for (unsigned i = 0; i &lt; v-&gt;length(); ++i) {
-            if (v-&gt;data()[i] &gt;= static_cast&lt;int&gt;(m_textureUnits.size())) {
-                LOG(WebGL, &quot;Texture unit size=%zu, v[%d]=%d. Location type = %04X.&quot;, m_textureUnits.size(), i, v-&gt;data()[i], location-&gt;type());
-                synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;uniform1iv&quot;, &quot;invalid texture unit&quot;);
-                return;
-            }
-        }
-
-    m_context-&gt;uniform1iv(location-&gt;location(), v-&gt;length(), v-&gt;data());
-}
-
-void WebGLRenderingContext::uniform1iv(const WebGLUniformLocation* location, GC3Dint* v, GC3Dsizei size, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform1iv&quot;, location, v, size, 1))
-        return;
-
-    if (location-&gt;type() == GraphicsContext3D::SAMPLER_2D || location-&gt;type() == GraphicsContext3D::SAMPLER_CUBE)
-        for (unsigned i = 0; i &lt; static_cast&lt;unsigned&gt;(size); ++i) {
-            if (((GC3Dint*)v)[i] &gt;= static_cast&lt;int&gt;(m_textureUnits.size())) {
-                synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;uniform1iv&quot;, &quot;invalid texture unit&quot;);
-                return;
-            }
-        }
-
-    m_context-&gt;uniform1iv(location-&gt;location(), size, v);
-}
-
-void WebGLRenderingContext::uniform2f(const WebGLUniformLocation* location, GC3Dfloat x, GC3Dfloat y, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !location)
-        return;
-
-    if (location-&gt;program() != m_currentProgram) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;uniform2f&quot;, &quot;location not for current program&quot;);
-        return;
-    }
-
-    m_context-&gt;uniform2f(location-&gt;location(), x, y);
-}
-
-void WebGLRenderingContext::uniform2fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform2fv&quot;, location, v, 2))
-        return;
-
-    m_context-&gt;uniform2fv(location-&gt;location(), v-&gt;length() / 2, v-&gt;data());
-}
-
-void WebGLRenderingContext::uniform2fv(const WebGLUniformLocation* location, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform2fv&quot;, location, v, size, 2))
-        return;
-
-    m_context-&gt;uniform2fv(location-&gt;location(), size / 2, v);
-}
-
-void WebGLRenderingContext::uniform2i(const WebGLUniformLocation* location, GC3Dint x, GC3Dint y, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !location)
-        return;
-
-    if (location-&gt;program() != m_currentProgram) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;uniform2i&quot;, &quot;location not for current program&quot;);
-        return;
-    }
-
-    m_context-&gt;uniform2i(location-&gt;location(), x, y);
-}
-
-void WebGLRenderingContext::uniform2iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform2iv&quot;, location, v, 2))
-        return;
-
-    m_context-&gt;uniform2iv(location-&gt;location(), v-&gt;length() / 2, v-&gt;data());
-}
-
-void WebGLRenderingContext::uniform2iv(const WebGLUniformLocation* location, GC3Dint* v, GC3Dsizei size, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform2iv&quot;, location, v, size, 2))
-        return;
-
-    m_context-&gt;uniform2iv(location-&gt;location(), size / 2, v);
-}
-
-void WebGLRenderingContext::uniform3f(const WebGLUniformLocation* location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !location)
-        return;
-
-    if (location-&gt;program() != m_currentProgram) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;uniform3f&quot;, &quot;location not for current program&quot;);
-        return;
-    }
-
-    m_context-&gt;uniform3f(location-&gt;location(), x, y, z);
-}
-
-void WebGLRenderingContext::uniform3fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform3fv&quot;, location, v, 3))
-        return;
-
-    m_context-&gt;uniform3fv(location-&gt;location(), v-&gt;length() / 3, v-&gt;data());
-}
-
-void WebGLRenderingContext::uniform3fv(const WebGLUniformLocation* location, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform3fv&quot;, location, v, size, 3))
-        return;
-
-    m_context-&gt;uniform3fv(location-&gt;location(), size / 3, v);
-}
-
-void WebGLRenderingContext::uniform3i(const WebGLUniformLocation* location, GC3Dint x, GC3Dint y, GC3Dint z, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !location)
-        return;
-
-    if (location-&gt;program() != m_currentProgram) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;uniform3i&quot;, &quot;location not for current program&quot;);
-        return;
-    }
-
-    m_context-&gt;uniform3i(location-&gt;location(), x, y, z);
-}
-
-void WebGLRenderingContext::uniform3iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform3iv&quot;, location, v, 3))
-        return;
-
-    m_context-&gt;uniform3iv(location-&gt;location(), v-&gt;length() / 3, v-&gt;data());
-}
-
-void WebGLRenderingContext::uniform3iv(const WebGLUniformLocation* location, GC3Dint* v, GC3Dsizei size, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform3iv&quot;, location, v, size, 3))
-        return;
-
-    m_context-&gt;uniform3iv(location-&gt;location(), size / 3, v);
-}
-
-void WebGLRenderingContext::uniform4f(const WebGLUniformLocation* location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !location)
-        return;
-
-    if (location-&gt;program() != m_currentProgram) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;uniform4f&quot;, &quot;location not for current program&quot;);
-        return;
-    }
-
-    m_context-&gt;uniform4f(location-&gt;location(), x, y, z, w);
-}
-
-void WebGLRenderingContext::uniform4fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform4fv&quot;, location, v, 4))
-        return;
-
-    m_context-&gt;uniform4fv(location-&gt;location(), v-&gt;length() / 4, v-&gt;data());
-}
-
-void WebGLRenderingContext::uniform4fv(const WebGLUniformLocation* location, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform4fv&quot;, location, v, size, 4))
-        return;
-
-    m_context-&gt;uniform4fv(location-&gt;location(), size / 4, v);
-}
-
-void WebGLRenderingContext::uniform4i(const WebGLUniformLocation* location, GC3Dint x, GC3Dint y, GC3Dint z, GC3Dint w, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !location)
-        return;
-
-    if (location-&gt;program() != m_currentProgram) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;uniform4i&quot;, &quot;location not for current program&quot;);
-        return;
-    }
-
-    m_context-&gt;uniform4i(location-&gt;location(), x, y, z, w);
-}
-
-void WebGLRenderingContext::uniform4iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform4iv&quot;, location, v, 4))
-        return;
-
-    m_context-&gt;uniform4iv(location-&gt;location(), v-&gt;length() / 4, v-&gt;data());
-}
-
-void WebGLRenderingContext::uniform4iv(const WebGLUniformLocation* location, GC3Dint* v, GC3Dsizei size, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform4iv&quot;, location, v, size, 4))
-        return;
-
-    m_context-&gt;uniform4iv(location-&gt;location(), size / 4, v);
-}
-
-void WebGLRenderingContext::uniformMatrix2fv(const WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* v, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformMatrixParameters(&quot;uniformMatrix2fv&quot;, location, transpose, v, 4))
-        return;
-    m_context-&gt;uniformMatrix2fv(location-&gt;location(), v-&gt;length() / 4, transpose, v-&gt;data());
-}
-
-void WebGLRenderingContext::uniformMatrix2fv(const WebGLUniformLocation* location, GC3Dboolean transpose, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformMatrixParameters(&quot;uniformMatrix2fv&quot;, location, transpose, v, size, 4))
-        return;
-    m_context-&gt;uniformMatrix2fv(location-&gt;location(), size / 4, transpose, v);
-}
-
-void WebGLRenderingContext::uniformMatrix3fv(const WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* v, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformMatrixParameters(&quot;uniformMatrix3fv&quot;, location, transpose, v, 9))
-        return;
-    m_context-&gt;uniformMatrix3fv(location-&gt;location(), v-&gt;length() / 9, transpose, v-&gt;data());
-}
-
-void WebGLRenderingContext::uniformMatrix3fv(const WebGLUniformLocation* location, GC3Dboolean transpose, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformMatrixParameters(&quot;uniformMatrix3fv&quot;, location, transpose, v, size, 9))
-        return;
-    m_context-&gt;uniformMatrix3fv(location-&gt;location(), size / 9, transpose, v);
-}
-
-void WebGLRenderingContext::uniformMatrix4fv(const WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* v, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformMatrixParameters(&quot;uniformMatrix4fv&quot;, location, transpose, v, 16))
-        return;
-    m_context-&gt;uniformMatrix4fv(location-&gt;location(), v-&gt;length() / 16, transpose, v-&gt;data());
-}
-
-void WebGLRenderingContext::uniformMatrix4fv(const WebGLUniformLocation* location, GC3Dboolean transpose, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateUniformMatrixParameters(&quot;uniformMatrix4fv&quot;, location, transpose, v, size, 16))
-        return;
-    m_context-&gt;uniformMatrix4fv(location-&gt;location(), size / 16, transpose, v);
-}
-
-void WebGLRenderingContext::useProgram(WebGLProgram* program, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    bool deleted;
-    if (!checkObjectToBeBound(&quot;useProgram&quot;, program, deleted))
-        return;
-    if (deleted)
-        program = 0;
-    if (program &amp;&amp; !program-&gt;getLinkStatus()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;useProgram&quot;, &quot;program not valid&quot;);
-        return;
-    }
-    if (m_currentProgram != program) {
-        if (m_currentProgram)
-            m_currentProgram-&gt;onDetached(graphicsContext3D());
-        m_currentProgram = program;
-        m_context-&gt;useProgram(objectOrZero(program));
-        if (program)
-            program-&gt;onAttached();
-    }
-}
-
-void WebGLRenderingContext::validateProgram(WebGLProgram* program, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending() || !validateWebGLObject(&quot;validateProgram&quot;, program))
-        return;
-    m_context-&gt;validateProgram(objectOrZero(program));
-}
-
-void WebGLRenderingContext::vertexAttrib1f(GC3Duint index, GC3Dfloat v0)
-{
-    vertexAttribfImpl(&quot;vertexAttrib1f&quot;, index, 1, v0, 0.0f, 0.0f, 1.0f);
-}
-
-void WebGLRenderingContext::vertexAttrib1fv(GC3Duint index, Float32Array* v)
-{
-    vertexAttribfvImpl(&quot;vertexAttrib1fv&quot;, index, v, 1);
-}
-
-void WebGLRenderingContext::vertexAttrib1fv(GC3Duint index, GC3Dfloat* v, GC3Dsizei size)
-{
-    vertexAttribfvImpl(&quot;vertexAttrib1fv&quot;, index, v, size, 1);
-}
-
-void WebGLRenderingContext::vertexAttrib2f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1)
-{
-    vertexAttribfImpl(&quot;vertexAttrib2f&quot;, index, 2, v0, v1, 0.0f, 1.0f);
-}
-
-void WebGLRenderingContext::vertexAttrib2fv(GC3Duint index, Float32Array* v)
-{
-    vertexAttribfvImpl(&quot;vertexAttrib2fv&quot;, index, v, 2);
-}
-
-void WebGLRenderingContext::vertexAttrib2fv(GC3Duint index, GC3Dfloat* v, GC3Dsizei size)
-{
-    vertexAttribfvImpl(&quot;vertexAttrib2fv&quot;, index, v, size, 2);
-}
-
-void WebGLRenderingContext::vertexAttrib3f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2)
-{
-    vertexAttribfImpl(&quot;vertexAttrib3f&quot;, index, 3, v0, v1, v2, 1.0f);
-}
-
-void WebGLRenderingContext::vertexAttrib3fv(GC3Duint index, Float32Array* v)
-{
-    vertexAttribfvImpl(&quot;vertexAttrib3fv&quot;, index, v, 3);
-}
-
-void WebGLRenderingContext::vertexAttrib3fv(GC3Duint index, GC3Dfloat* v, GC3Dsizei size)
-{
-    vertexAttribfvImpl(&quot;vertexAttrib3fv&quot;, index, v, size, 3);
-}
-
-void WebGLRenderingContext::vertexAttrib4f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2, GC3Dfloat v3)
-{
-    vertexAttribfImpl(&quot;vertexAttrib4f&quot;, index, 4, v0, v1, v2, v3);
-}
-
-void WebGLRenderingContext::vertexAttrib4fv(GC3Duint index, Float32Array* v)
-{
-    vertexAttribfvImpl(&quot;vertexAttrib4fv&quot;, index, v, 4);
-}
-
-void WebGLRenderingContext::vertexAttrib4fv(GC3Duint index, GC3Dfloat* v, GC3Dsizei size)
-{
-    vertexAttribfvImpl(&quot;vertexAttrib4fv&quot;, index, v, size, 4);
-}
-
-void WebGLRenderingContext::vertexAttribPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dboolean normalized, GC3Dsizei stride, long long offset, ExceptionCode&amp; ec)
-{
-    UNUSED_PARAM(ec);
-    if (isContextLostOrPending())
-        return;
-    switch (type) {
-    case GraphicsContext3D::BYTE:
-    case GraphicsContext3D::UNSIGNED_BYTE:
-    case GraphicsContext3D::SHORT:
-    case GraphicsContext3D::UNSIGNED_SHORT:
-    case GraphicsContext3D::FLOAT:
-        break;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;vertexAttribPointer&quot;, &quot;invalid type&quot;);
-        return;
-    }
-    if (index &gt;= m_maxVertexAttribs) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;vertexAttribPointer&quot;, &quot;index out of range&quot;);
-        return;
-    }
-    if (size &lt; 1 || size &gt; 4 || stride &lt; 0 || stride &gt; 255 || offset &lt; 0) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;vertexAttribPointer&quot;, &quot;bad size, stride or offset&quot;);
-        return;
-    }
-    if (!m_boundArrayBuffer) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;vertexAttribPointer&quot;, &quot;no bound ARRAY_BUFFER&quot;);
-        return;
-    }
-    // Determine the number of elements the bound buffer can hold, given the offset, size, type and stride
-    unsigned int typeSize = sizeInBytes(type);
-    if (!typeSize) {
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;vertexAttribPointer&quot;, &quot;invalid type&quot;);
-        return;
-    }
-    if ((stride % typeSize) || (static_cast&lt;GC3Dintptr&gt;(offset) % typeSize)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;vertexAttribPointer&quot;, &quot;stride or offset not valid for type&quot;);
-        return;
-    }
-    GC3Dsizei bytesPerElement = size * typeSize;
-
-    m_boundVertexArrayObject-&gt;setVertexAttribState(index, bytesPerElement, size, type, normalized, stride, static_cast&lt;GC3Dintptr&gt;(offset), m_boundArrayBuffer);
-    m_context-&gt;vertexAttribPointer(index, size, type, normalized, stride, static_cast&lt;GC3Dintptr&gt;(offset));
-}
-
-void WebGLRenderingContext::viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
-{
-    if (isContextLostOrPending())
-        return;
-    if (!validateSize(&quot;viewport&quot;, width, height))
-        return;
-    m_context-&gt;viewport(x, y, width, height);
-}
-
-void WebGLRenderingContext::forceLostContext(WebGLRenderingContext::LostContextMode mode)
-{
-    if (isContextLostOrPending()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;loseContext&quot;, &quot;context already lost&quot;);
-        return;
-    }
-
-    m_contextGroup-&gt;loseContextGroup(mode);
-}
-
-void WebGLRenderingContext::loseContextImpl(WebGLRenderingContext::LostContextMode mode)
-{
-    if (isContextLost())
-        return;
-
-    m_contextLost = true;
-    m_contextLostMode = mode;
-
-    if (mode == RealLostContext) {
-        // Inform the embedder that a lost context was received. In response, the embedder might
-        // decide to take action such as asking the user for permission to use WebGL again.
-        if (Frame* frame = canvas()-&gt;document().frame())
-            frame-&gt;loader().client().didLoseWebGLContext(m_context-&gt;getExtensions()-&gt;getGraphicsResetStatusARB());
-    }
-
-    detachAndRemoveAllObjects();
-
-    if (m_drawingBuffer) {
-        // Make absolutely sure we do not refer to an already-deleted texture or framebuffer.
-        m_drawingBuffer-&gt;setTexture2DBinding(0);
-        m_drawingBuffer-&gt;setFramebufferBinding(0);
-    }
-
-    // There is no direct way to clear errors from a GL implementation and
-    // looping until getError() becomes NO_ERROR might cause an infinite loop if
-    // the driver or context implementation had a bug. So, loop a reasonably
-    // large number of times to clear any existing errors.
-    for (int i = 0; i &lt; 100; ++i) {
-        if (m_context-&gt;getError() == GraphicsContext3D::NO_ERROR)
-            break;
-    }
-    ConsoleDisplayPreference display = (mode == RealLostContext) ? DisplayInConsole: DontDisplayInConsole;
-    synthesizeGLError(GraphicsContext3D::CONTEXT_LOST_WEBGL, &quot;loseContext&quot;, &quot;context lost&quot;, display);
-
-    // Don't allow restoration unless the context lost event has both been
-    // dispatched and its default behavior prevented.
-    m_restoreAllowed = false;
-
-    // Always defer the dispatch of the context lost event, to implement
-    // the spec behavior of queueing a task.
-    m_dispatchContextLostEventTimer.startOneShot(0);
-}
-
-void WebGLRenderingContext::forceRestoreContext()
-{
-    if (!isContextLostOrPending()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;restoreContext&quot;, &quot;context not lost&quot;);
-        return;
-    }
-
-    if (!m_restoreAllowed) {
-        if (m_contextLostMode == SyntheticLostContext)
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;restoreContext&quot;, &quot;context restoration not allowed&quot;);
-        return;
-    }
-
-    if (!m_restoreTimer.isActive())
-        m_restoreTimer.startOneShot(0);
-}
-
-PlatformLayer* WebGLRenderingContext::platformLayer() const
-{
-    return (!isContextLost() &amp;&amp; !m_isPendingPolicyResolution) ? m_context-&gt;platformLayer() : 0;
-}
-
-void WebGLRenderingContext::removeSharedObject(WebGLSharedObject* object)
-{
-    if (m_isPendingPolicyResolution)
-        return;
-
-    m_contextGroup-&gt;removeObject(object);
-}
-
-void WebGLRenderingContext::addSharedObject(WebGLSharedObject* object)
-{
-    if (m_isPendingPolicyResolution)
-        return;
-
-    ASSERT(!isContextLost());
-    m_contextGroup-&gt;addObject(object);
-}
-
-void WebGLRenderingContext::removeContextObject(WebGLContextObject* object)
-{
-    if (m_isPendingPolicyResolution)
-        return;
-
-    m_contextObjects.remove(object);
-}
-
-void WebGLRenderingContext::addContextObject(WebGLContextObject* object)
-{
-    if (m_isPendingPolicyResolution)
-        return;
-
-    ASSERT(!isContextLost());
-    m_contextObjects.add(object);
-}
-
-void WebGLRenderingContext::detachAndRemoveAllObjects()
-{
-    if (m_isPendingPolicyResolution)
-        return;
-
-    while (m_contextObjects.size() &gt; 0) {
-        HashSet&lt;WebGLContextObject*&gt;::iterator it = m_contextObjects.begin();
-        (*it)-&gt;detachContext();
-    }
-}
-
-bool WebGLRenderingContext::hasPendingActivity() const
-{
-    return false;
-}
-
-void WebGLRenderingContext::stop()
-{
-    if (!isContextLost() &amp;&amp; !m_isPendingPolicyResolution) {
-        forceLostContext(SyntheticLostContext);
-        destroyGraphicsContext3D();
-    }
-}
-
-WebGLGetInfo WebGLRenderingContext::getBooleanParameter(GC3Denum pname)
-{
-    GC3Dboolean value = 0;
-    m_context-&gt;getBooleanv(pname, &amp;value);
-    return WebGLGetInfo(static_cast&lt;bool&gt;(value));
-}
-
-WebGLGetInfo WebGLRenderingContext::getBooleanArrayParameter(GC3Denum pname)
-{
-    if (pname != GraphicsContext3D::COLOR_WRITEMASK) {
-        notImplemented();
-        return WebGLGetInfo(0, 0);
-    }
-    GC3Dboolean value[4] = {0};
-    m_context-&gt;getBooleanv(pname, value);
-    bool boolValue[4];
-    for (int ii = 0; ii &lt; 4; ++ii)
-        boolValue[ii] = static_cast&lt;bool&gt;(value[ii]);
-    return WebGLGetInfo(boolValue, 4);
-}
-
-WebGLGetInfo WebGLRenderingContext::getFloatParameter(GC3Denum pname)
-{
-    GC3Dfloat value = 0;
-    m_context-&gt;getFloatv(pname, &amp;value);
-    return WebGLGetInfo(value);
-}
-
-WebGLGetInfo WebGLRenderingContext::getIntParameter(GC3Denum pname)
-{
-    GC3Dint value = 0;
-    m_context-&gt;getIntegerv(pname, &amp;value);
-    return WebGLGetInfo(value);
-}
-
-WebGLGetInfo WebGLRenderingContext::getUnsignedIntParameter(GC3Denum pname)
-{
-    GC3Dint value = 0;
-    m_context-&gt;getIntegerv(pname, &amp;value);
-    return WebGLGetInfo(static_cast&lt;unsigned int&gt;(value));
-}
-
-WebGLGetInfo WebGLRenderingContext::getWebGLFloatArrayParameter(GC3Denum pname)
-{
-    GC3Dfloat value[4] = {0};
-    m_context-&gt;getFloatv(pname, value);
-    unsigned length = 0;
-    switch (pname) {
-    case GraphicsContext3D::ALIASED_POINT_SIZE_RANGE:
-    case GraphicsContext3D::ALIASED_LINE_WIDTH_RANGE:
-    case GraphicsContext3D::DEPTH_RANGE:
-        length = 2;
-        break;
-    case GraphicsContext3D::BLEND_COLOR:
-    case GraphicsContext3D::COLOR_CLEAR_VALUE:
-        length = 4;
-        break;
-    default:
-        notImplemented();
-    }
-    return WebGLGetInfo(Float32Array::create(value, length));
-}
-
-WebGLGetInfo WebGLRenderingContext::getWebGLIntArrayParameter(GC3Denum pname)
-{
-    GC3Dint value[4] = {0};
-    m_context-&gt;getIntegerv(pname, value);
-    unsigned length = 0;
-    switch (pname) {
-    case GraphicsContext3D::MAX_VIEWPORT_DIMS:
-        length = 2;
-        break;
-    case GraphicsContext3D::SCISSOR_BOX:
-    case GraphicsContext3D::VIEWPORT:
-        length = 4;
-        break;
-    default:
-        notImplemented();
-    }
-    return WebGLGetInfo(Int32Array::create(value, length));
-}
-
-void WebGLRenderingContext::checkTextureCompleteness(const char* functionName, bool prepareToDraw)
-{
-    bool resetActiveUnit = false;
-    WebGLTexture::TextureExtensionFlag extensions = static_cast&lt;WebGLTexture::TextureExtensionFlag&gt;((m_oesTextureFloatLinear ? WebGLTexture::TextureExtensionFloatLinearEnabled : 0) | (m_oesTextureHalfFloatLinear ? WebGLTexture::TextureExtensionHalfFloatLinearEnabled : 0));
-
-    for (unsigned ii = 0; ii &lt; m_textureUnits.size(); ++ii) {
-        if ((m_textureUnits[ii].texture2DBinding &amp;&amp; m_textureUnits[ii].texture2DBinding-&gt;needToUseBlackTexture(extensions))
-            || (m_textureUnits[ii].textureCubeMapBinding &amp;&amp; m_textureUnits[ii].textureCubeMapBinding-&gt;needToUseBlackTexture(extensions))) {
-            if (ii != m_activeTextureUnit) {
-                m_context-&gt;activeTexture(ii);
-                resetActiveUnit = true;
-            } else if (resetActiveUnit) {
-                m_context-&gt;activeTexture(ii);
-                resetActiveUnit = false;
-            }
-            WebGLTexture* tex2D;
-            WebGLTexture* texCubeMap;
-            if (prepareToDraw) {
-                String msg(String(&quot;texture bound to texture unit &quot;) + String::number(ii)
-                    + &quot; is not renderable. It maybe non-power-of-2 and have incompatible texture filtering or is not 'texture complete',&quot;
-                    + &quot; or it is a float/half-float type with linear filtering and without the relevant float/half-float linear extension enabled.&quot;);
-                printGLWarningToConsole(functionName, msg.utf8().data());
-                tex2D = m_blackTexture2D.get();
-                texCubeMap = m_blackTextureCubeMap.get();
-            } else {
-                tex2D = m_textureUnits[ii].texture2DBinding.get();
-                texCubeMap = m_textureUnits[ii].textureCubeMapBinding.get();
-            }
-            if (m_textureUnits[ii].texture2DBinding &amp;&amp; m_textureUnits[ii].texture2DBinding-&gt;needToUseBlackTexture(extensions))
-                m_context-&gt;bindTexture(GraphicsContext3D::TEXTURE_2D, objectOrZero(tex2D));
-            if (m_textureUnits[ii].textureCubeMapBinding &amp;&amp; m_textureUnits[ii].textureCubeMapBinding-&gt;needToUseBlackTexture(extensions))
-                m_context-&gt;bindTexture(GraphicsContext3D::TEXTURE_CUBE_MAP, objectOrZero(texCubeMap));
-        }
-    }
-    if (resetActiveUnit)
-        m_context-&gt;activeTexture(m_activeTextureUnit);
-}
-
-void WebGLRenderingContext::createFallbackBlackTextures1x1()
-{
-    unsigned char black[] = {0, 0, 0, 255};
-    m_blackTexture2D = createTexture();
-    m_context-&gt;bindTexture(GraphicsContext3D::TEXTURE_2D, m_blackTexture2D-&gt;object());
-    m_context-&gt;texImage2D(GraphicsContext3D::TEXTURE_2D, 0, GraphicsContext3D::RGBA, 1, 1,
-                          0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, black);
-    m_context-&gt;bindTexture(GraphicsContext3D::TEXTURE_2D, 0);
-    m_blackTextureCubeMap = createTexture();
-    m_context-&gt;bindTexture(GraphicsContext3D::TEXTURE_CUBE_MAP, m_blackTextureCubeMap-&gt;object());
-    m_context-&gt;texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_X, 0, GraphicsContext3D::RGBA, 1, 1,
-                          0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, black);
-    m_context-&gt;texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GraphicsContext3D::RGBA, 1, 1,
-                          0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, black);
-    m_context-&gt;texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GraphicsContext3D::RGBA, 1, 1,
-                          0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, black);
-    m_context-&gt;texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GraphicsContext3D::RGBA, 1, 1,
-                          0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, black);
-    m_context-&gt;texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GraphicsContext3D::RGBA, 1, 1,
-                          0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, black);
-    m_context-&gt;texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GraphicsContext3D::RGBA, 1, 1,
-                          0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, black);
-    m_context-&gt;bindTexture(GraphicsContext3D::TEXTURE_CUBE_MAP, 0);
-}
-
-bool WebGLRenderingContext::isTexInternalFormatColorBufferCombinationValid(GC3Denum texInternalFormat,
-                                                                           GC3Denum colorBufferFormat)
-{
-    unsigned need = GraphicsContext3D::getChannelBitsByFormat(texInternalFormat);
-    unsigned have = GraphicsContext3D::getChannelBitsByFormat(colorBufferFormat);
-    return (need &amp; have) == need;
-}
-
-GC3Denum WebGLRenderingContext::getBoundFramebufferColorFormat()
-{
-    if (m_framebufferBinding &amp;&amp; m_framebufferBinding-&gt;object())
-        return m_framebufferBinding-&gt;getColorBufferFormat();
-    if (m_attributes.alpha)
-        return GraphicsContext3D::RGBA;
-    return GraphicsContext3D::RGB;
-}
-
-int WebGLRenderingContext::getBoundFramebufferWidth()
-{
-    if (m_framebufferBinding &amp;&amp; m_framebufferBinding-&gt;object())
-        return m_framebufferBinding-&gt;getColorBufferWidth();
-    return m_drawingBuffer ? m_drawingBuffer-&gt;size().width() : m_context-&gt;getInternalFramebufferSize().width();
-}
-
-int WebGLRenderingContext::getBoundFramebufferHeight()
-{
-    if (m_framebufferBinding &amp;&amp; m_framebufferBinding-&gt;object())
-        return m_framebufferBinding-&gt;getColorBufferHeight();
-    return m_drawingBuffer ? m_drawingBuffer-&gt;size().height() : m_context-&gt;getInternalFramebufferSize().height();
-}
-
-WebGLTexture* WebGLRenderingContext::validateTextureBinding(const char* functionName, GC3Denum target, bool useSixEnumsForCubeMap)
-{
-    WebGLTexture* texture = nullptr;
-    switch (target) {
-    case GraphicsContext3D::TEXTURE_2D:
-        texture = m_textureUnits[m_activeTextureUnit].texture2DBinding.get();
-        break;
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_X:
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_X:
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Y:
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Y:
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Z:
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Z:
-        if (!useSixEnumsForCubeMap) {
-            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid texture target&quot;);
-            return nullptr;
-        }
-        texture = m_textureUnits[m_activeTextureUnit].textureCubeMapBinding.get();
-        break;
-    case GraphicsContext3D::TEXTURE_CUBE_MAP:
-        if (useSixEnumsForCubeMap) {
-            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid texture target&quot;);
-            return nullptr;
-        }
-        texture = m_textureUnits[m_activeTextureUnit].textureCubeMapBinding.get();
-        break;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid texture target&quot;);
-        return nullptr;
-    }
-    if (!texture)
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;no texture&quot;);
-    return texture;
-}
-
-bool WebGLRenderingContext::validateLocationLength(const char* functionName, const String&amp; string)
-{
-    const unsigned maxWebGLLocationLength = 256;
-    if (string.length() &gt; maxWebGLLocationLength) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;location length &gt; 256&quot;);
-        return false;
-    }
-    return true;
-}
-
-bool WebGLRenderingContext::validateSize(const char* functionName, GC3Dint x, GC3Dint y)
-{
-    if (x &lt; 0 || y &lt; 0) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;size &lt; 0&quot;);
-        return false;
-    }
-    return true;
-}
-
-bool WebGLRenderingContext::validateString(const char* functionName, const String&amp; string)
-{
-    for (size_t i = 0; i &lt; string.length(); ++i) {
-        if (!validateCharacter(string[i])) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;string not ASCII&quot;);
-            return false;
-        }
-    }
-    return true;
-}
-
-bool WebGLRenderingContext::validateTexFuncFormatAndType(const char* functionName, GC3Denum format, GC3Denum type, GC3Dint level)
-{
-    switch (format) {
-    case GraphicsContext3D::ALPHA:
-    case GraphicsContext3D::LUMINANCE:
-    case GraphicsContext3D::LUMINANCE_ALPHA:
-    case GraphicsContext3D::RGB:
-    case GraphicsContext3D::RGBA:
-        break;
-    case GraphicsContext3D::DEPTH_STENCIL:
-    case GraphicsContext3D::DEPTH_COMPONENT:
-        if (m_webglDepthTexture)
-            break;
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;depth texture formats not enabled&quot;);
-        return false;
-    case Extensions3D::SRGB_EXT:
-    case Extensions3D::SRGB_ALPHA_EXT:
-    default:
-        if ((format == Extensions3D::SRGB_EXT || format == Extensions3D::SRGB_ALPHA_EXT)
-            &amp;&amp; m_extsRGB)
-            break;
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid texture format&quot;);
-        return false;
-    }
-
-    switch (type) {
-    case GraphicsContext3D::UNSIGNED_BYTE:
-    case GraphicsContext3D::UNSIGNED_SHORT_5_6_5:
-    case GraphicsContext3D::UNSIGNED_SHORT_4_4_4_4:
-    case GraphicsContext3D::UNSIGNED_SHORT_5_5_5_1:
-        break;
-    case GraphicsContext3D::FLOAT:
-        if (m_oesTextureFloat)
-            break;
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid texture type&quot;);
-        return false;
-    case GraphicsContext3D::HALF_FLOAT_OES:
-        if (m_oesTextureHalfFloat)
-            break;
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid texture type&quot;);
-        return false;
-    case GraphicsContext3D::UNSIGNED_INT:
-    case GraphicsContext3D::UNSIGNED_INT_24_8:
-    case GraphicsContext3D::UNSIGNED_SHORT:
-        if (m_webglDepthTexture)
-            break;
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid texture type&quot;);
-        return false;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid texture type&quot;);
-        return false;
-    }
-
-    // Verify that the combination of format and type is supported.
-    switch (format) {
-    case GraphicsContext3D::ALPHA:
-    case GraphicsContext3D::LUMINANCE:
-    case GraphicsContext3D::LUMINANCE_ALPHA:
-        if (type != GraphicsContext3D::UNSIGNED_BYTE
-            &amp;&amp; type != GraphicsContext3D::FLOAT
-            &amp;&amp; type != GraphicsContext3D::HALF_FLOAT_OES) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;invalid type for format&quot;);
-            return false;
-        }
-        break;
-    case GraphicsContext3D::RGB:
-    case Extensions3D::SRGB_EXT:
-        if (type != GraphicsContext3D::UNSIGNED_BYTE
-            &amp;&amp; type != GraphicsContext3D::UNSIGNED_SHORT_5_6_5
-            &amp;&amp; type != GraphicsContext3D::FLOAT
-            &amp;&amp; type != GraphicsContext3D::HALF_FLOAT_OES) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;invalid type for RGB format&quot;);
-            return false;
-        }
-        break;
-    case GraphicsContext3D::RGBA:
-    case Extensions3D::SRGB_ALPHA_EXT:
-        if (type != GraphicsContext3D::UNSIGNED_BYTE
-            &amp;&amp; type != GraphicsContext3D::UNSIGNED_SHORT_4_4_4_4
-            &amp;&amp; type != GraphicsContext3D::UNSIGNED_SHORT_5_5_5_1
-            &amp;&amp; type != GraphicsContext3D::FLOAT
-            &amp;&amp; type != GraphicsContext3D::HALF_FLOAT_OES) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;invalid type for RGBA format&quot;);
-            return false;
-        }
-        break;
-    case GraphicsContext3D::DEPTH_COMPONENT:
-        if (!m_webglDepthTexture) {
-            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid format. DEPTH_COMPONENT not enabled&quot;);
-            return false;
-        }
-        if (type != GraphicsContext3D::UNSIGNED_SHORT
-            &amp;&amp; type != GraphicsContext3D::UNSIGNED_INT) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;invalid type for DEPTH_COMPONENT format&quot;);
-            return false;
-        }
-        if (level &gt; 0) {
-          synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;level must be 0 for DEPTH_COMPONENT format&quot;);
-          return false;
-        }
-        break;
-    case GraphicsContext3D::DEPTH_STENCIL:
-        if (!m_webglDepthTexture) {
-            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid format. DEPTH_STENCIL not enabled&quot;);
-            return false;
-        }
-        if (type != GraphicsContext3D::UNSIGNED_INT_24_8) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;invalid type for DEPTH_STENCIL format&quot;);
-            return false;
-        }
-        if (level &gt; 0) {
-          synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;level must be 0 for DEPTH_STENCIL format&quot;);
-          return false;
-        }
-        break;
-    default:
-        ASSERT_NOT_REACHED();
-    }
-
-    return true;
-}
-
-bool WebGLRenderingContext::validateTexFuncLevel(const char* functionName, GC3Denum target, GC3Dint level)
-{
-    if (level &lt; 0) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;level &lt; 0&quot;);
-        return false;
-    }
-    switch (target) {
-    case GraphicsContext3D::TEXTURE_2D:
-        if (level &gt;= m_maxTextureLevel) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;level out of range&quot;);
-            return false;
-        }
-        break;
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_X:
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_X:
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Y:
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Y:
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Z:
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Z:
-        if (level &gt;= m_maxCubeMapTextureLevel) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;level out of range&quot;);
-            return false;
-        }
-        break;
-    }
-    // This function only checks if level is legal, so we return true and don't
-    // generate INVALID_ENUM if target is illegal.
-    return true;
-}
-
-bool WebGLRenderingContext::validateTexFuncParameters(const char* functionName,
-                                                      TexFuncValidationFunctionType functionType,
-                                                      GC3Denum target, GC3Dint level,
-                                                      GC3Denum internalformat,
-                                                      GC3Dsizei width, GC3Dsizei height, GC3Dint border,
-                                                      GC3Denum format, GC3Denum type)
-{
-    // We absolutely have to validate the format and type combination.
-    // The texImage2D entry points taking HTMLImage, etc. will produce
-    // temporary data based on this combination, so it must be legal.
-    if (!validateTexFuncFormatAndType(functionName, format, type, level) || !validateTexFuncLevel(functionName, target, level))
-        return false;
-
-    if (width &lt; 0 || height &lt; 0) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;width or height &lt; 0&quot;);
-        return false;
-    }
-
-    GC3Dint maxTextureSizeForLevel = pow(2.0, m_maxTextureLevel - 1 - level);
-    switch (target) {
-    case GraphicsContext3D::TEXTURE_2D:
-        if (width &gt; maxTextureSizeForLevel || height &gt; maxTextureSizeForLevel) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;width or height out of range&quot;);
-            return false;
-        }
-        break;
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_X:
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_X:
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Y:
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Y:
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Z:
-    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Z:
-        if (functionType != TexSubImage2D &amp;&amp; width != height) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;width != height for cube map&quot;);
-            return false;
-        }
-        // No need to check height here. For texImage width == height.
-        // For texSubImage that will be checked when checking yoffset + height is in range.
-        if (width &gt; maxTextureSizeForLevel) {
-            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;width or height out of range for cube map&quot;);
-            return false;
-        }
-        break;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid target&quot;);
-        return false;
-    }
-
-    if (format != internalformat) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;format != internalformat&quot;);
-        return false;
-    }
-
-    if (border) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;border != 0&quot;);
-        return false;
-    }
-
-    return true;
-}
-
-bool WebGLRenderingContext::validateTexFuncData(const char* functionName, GC3Dint level,
-                                                GC3Dsizei width, GC3Dsizei height,
-                                                GC3Denum format, GC3Denum type,
-                                                ArrayBufferView* pixels,
-                                                NullDisposition disposition)
-{
-    if (!pixels) {
-        if (disposition == NullAllowed)
-            return true;
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no pixels&quot;);
-        return false;
-    }
-
-    if (!validateTexFuncFormatAndType(functionName, format, type, level))
-        return false;
-    if (!validateSettableTexFormat(functionName, format))
-        return false;
-
-    switch (type) {
-    case GraphicsContext3D::UNSIGNED_BYTE:
-        if (pixels-&gt;getType() != JSC::TypeUint8) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;type UNSIGNED_BYTE but ArrayBufferView not Uint8Array&quot;);
-            return false;
-        }
-        break;
-    case GraphicsContext3D::UNSIGNED_SHORT_5_6_5:
-    case GraphicsContext3D::UNSIGNED_SHORT_4_4_4_4:
-    case GraphicsContext3D::UNSIGNED_SHORT_5_5_5_1:
-        if (pixels-&gt;getType() != JSC::TypeUint16) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;type UNSIGNED_SHORT but ArrayBufferView not Uint16Array&quot;);
-            return false;
-        }
-        break;
-    case GraphicsContext3D::FLOAT: // OES_texture_float
-        if (pixels-&gt;getType() != JSC::TypeFloat32) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;type FLOAT but ArrayBufferView not Float32Array&quot;);
-            return false;
-        }
-        break;
-    case GraphicsContext3D::HALF_FLOAT_OES: // OES_texture_half_float
-        // As per the specification, ArrayBufferView should be null when
-        // OES_texture_half_float is enabled.
-        if (pixels) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;type HALF_FLOAT_OES but ArrayBufferView is not NULL&quot;);
-            return false;
-        }
-        break;
-    default:
-        ASSERT_NOT_REACHED();
-    }
-
-    unsigned int totalBytesRequired;
-    GC3Denum error = m_context-&gt;computeImageSizeInBytes(format, type, width, height, m_unpackAlignment, &amp;totalBytesRequired, 0);
-    if (error != GraphicsContext3D::NO_ERROR) {
-        synthesizeGLError(error, functionName, &quot;invalid texture dimensions&quot;);
-        return false;
-    }
-    if (pixels-&gt;byteLength() &lt; totalBytesRequired) {
-        if (m_unpackAlignment != 1) {
-          error = m_context-&gt;computeImageSizeInBytes(format, type, width, height, 1, &amp;totalBytesRequired, 0);
-          if (pixels-&gt;byteLength() == totalBytesRequired) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;ArrayBufferView not big enough for request with UNPACK_ALIGNMENT &gt; 1&quot;);
-            return false;
-          }
-        }
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;ArrayBufferView not big enough for request&quot;);
-        return false;
-    }
-    return true;
-}
-
-bool WebGLRenderingContext::validateCompressedTexFormat(GC3Denum format)
-{
-    return m_compressedTextureFormats.contains(format);
-}
-
-bool WebGLRenderingContext::validateCompressedTexFuncData(const char* functionName,
-                                                          GC3Dsizei width, GC3Dsizei height,
-                                                          GC3Denum format, ArrayBufferView* pixels)
-{
-    if (!pixels) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no pixels&quot;);
-        return false;
-    }
-    if (width &lt; 0 || height &lt; 0) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;width or height &lt; 0&quot;);
-        return false;
-    }
-
-    unsigned int bytesRequired = 0;
-
-    switch (format) {
-    case Extensions3D::COMPRESSED_RGB_S3TC_DXT1_EXT:
-    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT1_EXT:
-    case Extensions3D::COMPRESSED_ATC_RGB_AMD:
-        {
-            const int kBlockSize = 8;
-            const int kBlockWidth = 4;
-            const int kBlockHeight = 4;
-            int numBlocksAcross = (width + kBlockWidth - 1) / kBlockWidth;
-            int numBlocksDown = (height + kBlockHeight - 1) / kBlockHeight;
-            bytesRequired = numBlocksAcross * numBlocksDown * kBlockSize;
-        }
-        break;
-    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT3_EXT:
-    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT5_EXT:
-    case Extensions3D::COMPRESSED_ATC_RGBA_EXPLICIT_ALPHA_AMD:
-    case Extensions3D::COMPRESSED_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
-        {
-            const int kBlockSize = 16;
-            const int kBlockWidth = 4;
-            const int kBlockHeight = 4;
-            int numBlocksAcross = (width + kBlockWidth - 1) / kBlockWidth;
-            int numBlocksDown = (height + kBlockHeight - 1) / kBlockHeight;
-            bytesRequired = numBlocksAcross * numBlocksDown * kBlockSize;
-        }
-        break;
-    case Extensions3D::COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
-    case Extensions3D::COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:
-        {
-            const int kBlockSize = 8;
-            const int kBlockWidth = 8;
-            const int kBlockHeight = 8;
-            bytesRequired = (std::max(width, kBlockWidth) * std::max(height, kBlockHeight) * 4 + 7) / kBlockSize;
-        }
-        break;
-    case Extensions3D::COMPRESSED_RGB_PVRTC_2BPPV1_IMG:
-    case Extensions3D::COMPRESSED_RGBA_PVRTC_2BPPV1_IMG:
-        {
-            const int kBlockSize = 8;
-            const int kBlockWidth = 16;
-            const int kBlockHeight = 8;
-            bytesRequired = (std::max(width, kBlockWidth) * std::max(height, kBlockHeight) * 2 + 7) / kBlockSize;
-        }
-        break;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid format&quot;);
-        return false;
-    }
-
-    if (pixels-&gt;byteLength() != bytesRequired) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;length of ArrayBufferView is not correct for dimensions&quot;);
-        return false;
-    }
-
-    return true;
-}
-
-bool WebGLRenderingContext::validateCompressedTexDimensions(const char* functionName, GC3Denum target, GC3Dint level, GC3Dsizei width, GC3Dsizei height, GC3Denum format)
-{
-    switch (format) {
-    case Extensions3D::COMPRESSED_RGB_S3TC_DXT1_EXT:
-    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT1_EXT:
-    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT3_EXT:
-    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT5_EXT: {
-        const GC3Dsizei kBlockWidth = 4;
-        const GC3Dsizei kBlockHeight = 4;
-        const GC3Dint maxTextureSize = target ? m_maxTextureSize : m_maxCubeMapTextureSize;
-        const GC3Dsizei maxCompressedDimension = maxTextureSize &gt;&gt; level;
-        bool widthValid = (level &amp;&amp; width == 1) || (level &amp;&amp; width == 2) || (!(width % kBlockWidth) &amp;&amp; width &lt;= maxCompressedDimension);
-        bool heightValid = (level &amp;&amp; height == 1) || (level &amp;&amp; height == 2) || (!(height % kBlockHeight) &amp;&amp; height &lt;= maxCompressedDimension);
-        if (!widthValid || !heightValid) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;width or height invalid for level&quot;);
-            return false;
-        }
-        return true;
-    }
-    case Extensions3D::COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
-    case Extensions3D::COMPRESSED_RGB_PVRTC_2BPPV1_IMG:
-    case Extensions3D::COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:
-    case Extensions3D::COMPRESSED_RGBA_PVRTC_2BPPV1_IMG:
-        // Height and width must be powers of 2.
-        if ((width &amp; (width - 1)) || (height &amp; (height - 1))) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;width or height invalid for level&quot;);
-            return false;
-        }
-        return true;
-    default:
-        return false;
-    }
-}
-
-bool WebGLRenderingContext::validateCompressedTexSubDimensions(const char* functionName, GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
-                                                               GC3Dsizei width, GC3Dsizei height, GC3Denum format, WebGLTexture* tex)
-{
-    if (xoffset &lt; 0 || yoffset &lt; 0) {
-      synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;xoffset or yoffset &lt; 0&quot;);
-      return false;
-    }
-
-    switch (format) {
-    case Extensions3D::COMPRESSED_RGB_S3TC_DXT1_EXT:
-    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT1_EXT:
-    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT3_EXT:
-    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT5_EXT: {
-        const int kBlockWidth = 4;
-        const int kBlockHeight = 4;
-        if ((xoffset % kBlockWidth) || (yoffset % kBlockHeight)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;xoffset or yoffset not multiple of 4&quot;);
-            return false;
-        }
-        if (width - xoffset &gt; tex-&gt;getWidth(target, level)
-            || height - yoffset &gt; tex-&gt;getHeight(target, level)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;dimensions out of range&quot;);
-            return false;
-        }
-        return validateCompressedTexDimensions(functionName, target, level, width, height, format);
-    }
-    case Extensions3D::COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
-    case Extensions3D::COMPRESSED_RGB_PVRTC_2BPPV1_IMG:
-    case Extensions3D::COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:
-    case Extensions3D::COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: {
-        if (xoffset || yoffset) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;xoffset and yoffset must be zero&quot;);
-            return false;
-        }
-        if (width != tex-&gt;getWidth(target, level)
-            || height != tex-&gt;getHeight(target, level)) {
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;dimensions must match existing level&quot;);
-            return false;
-        }
-        return validateCompressedTexDimensions(functionName, target, level, width, height, format);
-    }
-    default:
-        return false;
-    }
-}
-
-bool WebGLRenderingContext::validateDrawMode(const char* functionName, GC3Denum mode)
-{
-    switch (mode) {
-    case GraphicsContext3D::POINTS:
-    case GraphicsContext3D::LINE_STRIP:
-    case GraphicsContext3D::LINE_LOOP:
-    case GraphicsContext3D::LINES:
-    case GraphicsContext3D::TRIANGLE_STRIP:
-    case GraphicsContext3D::TRIANGLE_FAN:
-    case GraphicsContext3D::TRIANGLES:
-        return true;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid draw mode&quot;);
-        return false;
-    }
-}
-
-bool WebGLRenderingContext::validateStencilSettings(const char* functionName)
-{
-    if (m_stencilMask != m_stencilMaskBack || m_stencilFuncRef != m_stencilFuncRefBack || m_stencilFuncMask != m_stencilFuncMaskBack) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;front and back stencils settings do not match&quot;);
-        return false;
-    }
-    return true;
-}
-
-bool WebGLRenderingContext::validateStencilFunc(const char* functionName, GC3Denum func)
-{
-    switch (func) {
-    case GraphicsContext3D::NEVER:
-    case GraphicsContext3D::LESS:
-    case GraphicsContext3D::LEQUAL:
-    case GraphicsContext3D::GREATER:
-    case GraphicsContext3D::GEQUAL:
-    case GraphicsContext3D::EQUAL:
-    case GraphicsContext3D::NOTEQUAL:
-    case GraphicsContext3D::ALWAYS:
-        return true;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid function&quot;);
-        return false;
-    }
-}
-
-void WebGLRenderingContext::printGLErrorToConsole(const String&amp; message)
-{
-    if (!m_numGLErrorsToConsoleAllowed)
-        return;
-
-    --m_numGLErrorsToConsoleAllowed;
-    printWarningToConsole(message);
-
-    if (!m_numGLErrorsToConsoleAllowed)
-        printWarningToConsole(&quot;WebGL: too many errors, no more errors will be reported to the console for this context.&quot;);
-}
-
-void WebGLRenderingContext::printWarningToConsole(const String&amp; message)
-{
-    if (!canvas())
-        return;
-    canvas()-&gt;document().addConsoleMessage(MessageSource::Rendering, MessageLevel::Warning, message);
-}
-
-bool WebGLRenderingContext::validateFramebufferFuncParameters(const char* functionName, GC3Denum target, GC3Denum attachment)
-{
-    if (target != GraphicsContext3D::FRAMEBUFFER) {
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid target&quot;);
-        return false;
-    }
-    switch (attachment) {
-    case GraphicsContext3D::COLOR_ATTACHMENT0:
-    case GraphicsContext3D::DEPTH_ATTACHMENT:
-    case GraphicsContext3D::STENCIL_ATTACHMENT:
-    case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT:
-        break;
-    default:
-        if (m_webglDrawBuffers
-            &amp;&amp; attachment &gt; GraphicsContext3D::COLOR_ATTACHMENT0
-            &amp;&amp; attachment &lt; static_cast&lt;GC3Denum&gt;(GraphicsContext3D::COLOR_ATTACHMENT0 + getMaxColorAttachments()))
-            break;
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid attachment&quot;);
-        return false;
-    }
-    return true;
-}
-
-bool WebGLRenderingContext::validateBlendEquation(const char* functionName, GC3Denum mode)
-{
-    switch (mode) {
-    case GraphicsContext3D::FUNC_ADD:
-    case GraphicsContext3D::FUNC_SUBTRACT:
-    case GraphicsContext3D::FUNC_REVERSE_SUBTRACT:
-    case Extensions3D::MIN_EXT:
-    case Extensions3D::MAX_EXT:
-        if ((mode == Extensions3D::MIN_EXT || mode == Extensions3D::MAX_EXT) &amp;&amp; !m_extBlendMinMax) {
-            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid mode&quot;);
-            return false;
-        }
-        return true;
-        break;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid mode&quot;);
-        return false;
-    }
-}
-
-bool WebGLRenderingContext::validateBlendFuncFactors(const char* functionName, GC3Denum src, GC3Denum dst)
-{
-    if (((src == GraphicsContext3D::CONSTANT_COLOR || src == GraphicsContext3D::ONE_MINUS_CONSTANT_COLOR)
-         &amp;&amp; (dst == GraphicsContext3D::CONSTANT_ALPHA || dst == GraphicsContext3D::ONE_MINUS_CONSTANT_ALPHA))
-        || ((dst == GraphicsContext3D::CONSTANT_COLOR || dst == GraphicsContext3D::ONE_MINUS_CONSTANT_COLOR)
-            &amp;&amp; (src == GraphicsContext3D::CONSTANT_ALPHA || src == GraphicsContext3D::ONE_MINUS_CONSTANT_ALPHA))) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;incompatible src and dst&quot;);
-        return false;
-    }
-    return true;
-}
-
-bool WebGLRenderingContext::validateCapability(const char* functionName, GC3Denum cap)
-{
-    switch (cap) {
-    case GraphicsContext3D::BLEND:
-    case GraphicsContext3D::CULL_FACE:
-    case GraphicsContext3D::DEPTH_TEST:
-    case GraphicsContext3D::DITHER:
-    case GraphicsContext3D::POLYGON_OFFSET_FILL:
-    case GraphicsContext3D::SAMPLE_ALPHA_TO_COVERAGE:
-    case GraphicsContext3D::SAMPLE_COVERAGE:
-    case GraphicsContext3D::SCISSOR_TEST:
-    case GraphicsContext3D::STENCIL_TEST:
-        return true;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid capability&quot;);
-        return false;
-    }
-}
-
-bool WebGLRenderingContext::validateUniformParameters(const char* functionName, const WebGLUniformLocation* location, Float32Array* v, GC3Dsizei requiredMinSize)
-{
-    if (!v) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no array&quot;);
-        return false;
-    }
-    return validateUniformMatrixParameters(functionName, location, false, v-&gt;data(), v-&gt;length(), requiredMinSize);
-}
-
-bool WebGLRenderingContext::validateUniformParameters(const char* functionName, const WebGLUniformLocation* location, Int32Array* v, GC3Dsizei requiredMinSize)
-{
-    if (!v) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no array&quot;);
-        return false;
-    }
-    return validateUniformMatrixParameters(functionName, location, false, v-&gt;data(), v-&gt;length(), requiredMinSize);
-}
-
-bool WebGLRenderingContext::validateUniformParameters(const char* functionName, const WebGLUniformLocation* location, void* v, GC3Dsizei size, GC3Dsizei requiredMinSize)
-{
-    return validateUniformMatrixParameters(functionName, location, false, v, size, requiredMinSize);
-}
-
-bool WebGLRenderingContext::validateUniformMatrixParameters(const char* functionName, const WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* v, GC3Dsizei requiredMinSize)
-{
-    if (!v) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no array&quot;);
-        return false;
-    }
-    return validateUniformMatrixParameters(functionName, location, transpose, v-&gt;data(), v-&gt;length(), requiredMinSize);
-}
-
-bool WebGLRenderingContext::validateUniformMatrixParameters(const char* functionName, const WebGLUniformLocation* location, GC3Dboolean transpose, void* v, GC3Dsizei size, GC3Dsizei requiredMinSize)
-{
-    if (!location)
-        return false;
-    if (location-&gt;program() != m_currentProgram) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;location is not from current program&quot;);
-        return false;
-    }
-    if (!v) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no array&quot;);
-        return false;
-    }
-    if (transpose) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;transpose not FALSE&quot;);
-        return false;
-    }
-    if (size &lt; requiredMinSize || (size % requiredMinSize)) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;invalid size&quot;);
-        return false;
-    }
-    return true;
-}
-
-WebGLBuffer* WebGLRenderingContext::validateBufferDataParameters(const char* functionName, GC3Denum target, GC3Denum usage)
-{
-    WebGLBuffer* buffer = 0;
-    switch (target) {
-    case GraphicsContext3D::ELEMENT_ARRAY_BUFFER:
-        buffer = m_boundVertexArrayObject-&gt;getElementArrayBuffer().get();
-        break;
-    case GraphicsContext3D::ARRAY_BUFFER:
-        buffer = m_boundArrayBuffer.get();
-        break;
-    default:
-        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid target&quot;);
-        return nullptr;
-    }
-    if (!buffer) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;no buffer&quot;);
-        return nullptr;
-    }
-    switch (usage) {
-    case GraphicsContext3D::STREAM_DRAW:
-    case GraphicsContext3D::STATIC_DRAW:
-    case GraphicsContext3D::DYNAMIC_DRAW:
-        return buffer;
-    }
-    synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid usage&quot;);
-    return nullptr;
-}
-
-bool WebGLRenderingContext::validateHTMLImageElement(const char* functionName, HTMLImageElement* image, ExceptionCode&amp; ec)
-{
-    if (!image || !image-&gt;cachedImage()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no image&quot;);
-        return false;
-    }
-    const URL&amp; url = image-&gt;cachedImage()-&gt;response().url();
-    if (url.isNull() || url.isEmpty() || !url.isValid()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;invalid image&quot;);
-        return false;
-    }
-    if (wouldTaintOrigin(image)) {
-        ec = SECURITY_ERR;
-        return false;
-    }
-    return true;
-}
-
-bool WebGLRenderingContext::validateHTMLCanvasElement(const char* functionName, HTMLCanvasElement* canvas, ExceptionCode&amp; ec)
-{
-    if (!canvas || !canvas-&gt;buffer()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no canvas&quot;);
-        return false;
-    }
-    if (wouldTaintOrigin(canvas)) {
-        ec = SECURITY_ERR;
-        return false;
-    }
-    return true;
-}
-
-#if ENABLE(VIDEO)
-bool WebGLRenderingContext::validateHTMLVideoElement(const char* functionName, HTMLVideoElement* video, ExceptionCode&amp; ec)
-{
-    if (!video || !video-&gt;videoWidth() || !video-&gt;videoHeight()) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no video&quot;);
-        return false;
-    }
-    if (wouldTaintOrigin(video)) {
-        ec = SECURITY_ERR;
-        return false;
-    }
-    return true;
-}
-#endif
-
-void WebGLRenderingContext::vertexAttribfImpl(const char* functionName, GC3Duint index, GC3Dsizei expectedSize, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2, GC3Dfloat v3)
-{
-    if (isContextLostOrPending())
-        return;
-    if (index &gt;= m_maxVertexAttribs) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;index out of range&quot;);
-        return;
-    }
-    // In GL, we skip setting vertexAttrib0 values.
-    if (index || isGLES2Compliant()) {
-        switch (expectedSize) {
-        case 1:
-            m_context-&gt;vertexAttrib1f(index, v0);
-            break;
-        case 2:
-            m_context-&gt;vertexAttrib2f(index, v0, v1);
-            break;
-        case 3:
-            m_context-&gt;vertexAttrib3f(index, v0, v1, v2);
-            break;
-        case 4:
-            m_context-&gt;vertexAttrib4f(index, v0, v1, v2, v3);
-            break;
-        }
-    }
-    VertexAttribValue&amp; attribValue = m_vertexAttribValue[index];
-    attribValue.value[0] = v0;
-    attribValue.value[1] = v1;
-    attribValue.value[2] = v2;
-    attribValue.value[3] = v3;
-}
-
-void WebGLRenderingContext::vertexAttribfvImpl(const char* functionName, GC3Duint index, Float32Array* v, GC3Dsizei expectedSize)
-{
-    if (isContextLostOrPending())
-        return;
-    if (!v) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no array&quot;);
-        return;
-    }
-    vertexAttribfvImpl(functionName, index, v-&gt;data(), v-&gt;length(), expectedSize);
-}
-
-void WebGLRenderingContext::vertexAttribfvImpl(const char* functionName, GC3Duint index, GC3Dfloat* v, GC3Dsizei size, GC3Dsizei expectedSize)
-{
-    if (isContextLostOrPending())
-        return;
-    if (!v) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no array&quot;);
-        return;
-    }
-    if (size &lt; expectedSize) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;invalid size&quot;);
-        return;
-    }
-    if (index &gt;= m_maxVertexAttribs) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;index out of range&quot;);
-        return;
-    }
-    // In GL, we skip setting vertexAttrib0 values.
-    if (index || isGLES2Compliant()) {
-        switch (expectedSize) {
-        case 1:
-            m_context-&gt;vertexAttrib1fv(index, v);
-            break;
-        case 2:
-            m_context-&gt;vertexAttrib2fv(index, v);
-            break;
-        case 3:
-            m_context-&gt;vertexAttrib3fv(index, v);
-            break;
-        case 4:
-            m_context-&gt;vertexAttrib4fv(index, v);
-            break;
-        }
-    }
-    VertexAttribValue&amp; attribValue = m_vertexAttribValue[index];
-    attribValue.initValue();
-    for (int ii = 0; ii &lt; expectedSize; ++ii)
-        attribValue.value[ii] = v[ii];
-}
-
-void WebGLRenderingContext::initVertexAttrib0()
-{
-    WebGLVertexArrayObjectOES::VertexAttribState&amp; state = m_boundVertexArrayObject-&gt;getVertexAttribState(0);
-    
-    m_vertexAttrib0Buffer = createBuffer();
-    m_context-&gt;bindBuffer(GraphicsContext3D::ARRAY_BUFFER, m_vertexAttrib0Buffer-&gt;object());
-    m_context-&gt;bufferData(GraphicsContext3D::ARRAY_BUFFER, 0, GraphicsContext3D::DYNAMIC_DRAW);
-    m_context-&gt;vertexAttribPointer(0, 4, GraphicsContext3D::FLOAT, false, 0, 0);
-    state.bufferBinding = m_vertexAttrib0Buffer;
-    m_context-&gt;bindBuffer(GraphicsContext3D::ARRAY_BUFFER, 0);
-    m_context-&gt;enableVertexAttribArray(0);
-    m_vertexAttrib0BufferSize = 0;
-    m_vertexAttrib0BufferValue[0] = 0.0f;
-    m_vertexAttrib0BufferValue[1] = 0.0f;
-    m_vertexAttrib0BufferValue[2] = 0.0f;
-    m_vertexAttrib0BufferValue[3] = 1.0f;
-    m_forceAttrib0BufferRefill = false;
-    m_vertexAttrib0UsedBefore = false;
-}
-
-bool WebGLRenderingContext::simulateVertexAttrib0(GC3Dsizei numVertex)
-{
-    const WebGLVertexArrayObjectOES::VertexAttribState&amp; state = m_boundVertexArrayObject-&gt;getVertexAttribState(0);
-    const VertexAttribValue&amp; attribValue = m_vertexAttribValue[0];
-    if (!m_currentProgram)
-        return false;
-    bool usingVertexAttrib0 = m_currentProgram-&gt;isUsingVertexAttrib0();
-    if (usingVertexAttrib0)
-        m_vertexAttrib0UsedBefore = true;
-    if (state.enabled &amp;&amp; usingVertexAttrib0)
-        return false;
-    if (!usingVertexAttrib0 &amp;&amp; !m_vertexAttrib0UsedBefore)
-        return false;
-    m_vertexAttrib0UsedBefore = true;
-    m_context-&gt;bindBuffer(GraphicsContext3D::ARRAY_BUFFER, m_vertexAttrib0Buffer-&gt;object());
-    GC3Dsizeiptr bufferDataSize = (numVertex + 1) * 4 * sizeof(GC3Dfloat);
-    if (bufferDataSize &gt; m_vertexAttrib0BufferSize) {
-        m_context-&gt;bufferData(GraphicsContext3D::ARRAY_BUFFER, bufferDataSize, 0, GraphicsContext3D::DYNAMIC_DRAW);
-        m_vertexAttrib0BufferSize = bufferDataSize;
-        m_forceAttrib0BufferRefill = true;
-    }
-    if (usingVertexAttrib0
-        &amp;&amp; (m_forceAttrib0BufferRefill
-            || attribValue.value[0] != m_vertexAttrib0BufferValue[0]
-            || attribValue.value[1] != m_vertexAttrib0BufferValue[1]
-            || attribValue.value[2] != m_vertexAttrib0BufferValue[2]
-            || attribValue.value[3] != m_vertexAttrib0BufferValue[3])) {
-        auto bufferData = std::make_unique&lt;GC3Dfloat[]&gt;((numVertex + 1) * 4);
-        for (GC3Dsizei ii = 0; ii &lt; numVertex + 1; ++ii) {
-            bufferData[ii * 4] = attribValue.value[0];
-            bufferData[ii * 4 + 1] = attribValue.value[1];
-            bufferData[ii * 4 + 2] = attribValue.value[2];
-            bufferData[ii * 4 + 3] = attribValue.value[3];
-        }
-        m_vertexAttrib0BufferValue[0] = attribValue.value[0];
-        m_vertexAttrib0BufferValue[1] = attribValue.value[1];
-        m_vertexAttrib0BufferValue[2] = attribValue.value[2];
-        m_vertexAttrib0BufferValue[3] = attribValue.value[3];
-        m_forceAttrib0BufferRefill = false;
-        m_context-&gt;bufferSubData(GraphicsContext3D::ARRAY_BUFFER, 0, bufferDataSize, bufferData.get());
-    }
-    m_context-&gt;vertexAttribPointer(0, 4, GraphicsContext3D::FLOAT, 0, 0, 0);
-    return true;
-}
-
-void WebGLRenderingContext::restoreStatesAfterVertexAttrib0Simulation()
-{
-    const WebGLVertexArrayObjectOES::VertexAttribState&amp; state = m_boundVertexArrayObject-&gt;getVertexAttribState(0);
-    if (state.bufferBinding != m_vertexAttrib0Buffer) {
-        m_context-&gt;bindBuffer(GraphicsContext3D::ARRAY_BUFFER, objectOrZero(state.bufferBinding.get()));
-        m_context-&gt;vertexAttribPointer(0, state.size, state.type, state.normalized, state.originalStride, state.offset);
-    }
-    m_context-&gt;bindBuffer(GraphicsContext3D::ARRAY_BUFFER, objectOrZero(m_boundArrayBuffer.get()));
-}
-
-void WebGLRenderingContext::dispatchContextLostEvent()
-{
-    RefPtr&lt;WebGLContextEvent&gt; event = WebGLContextEvent::create(eventNames().webglcontextlostEvent, false, true, &quot;&quot;);
-    canvas()-&gt;dispatchEvent(event);
-    m_restoreAllowed = event-&gt;defaultPrevented();
-    if (m_contextLostMode == RealLostContext &amp;&amp; m_restoreAllowed)
-        m_restoreTimer.startOneShot(0);
-}
-
-void WebGLRenderingContext::maybeRestoreContext()
-{
-    ASSERT(m_contextLost);
-    if (!m_contextLost)
-        return;
-
-    // The rendering context is not restored unless the default behavior of the
-    // webglcontextlost event was prevented earlier.
-    //
-    // Because of the way m_restoreTimer is set up for real vs. synthetic lost
-    // context events, we don't have to worry about this test short-circuiting
-    // the retry loop for real context lost events.
-    if (!m_restoreAllowed)
-        return;
-
-    int contextLostReason = m_context-&gt;getExtensions()-&gt;getGraphicsResetStatusARB();
-
-    switch (contextLostReason) {
-    case GraphicsContext3D::NO_ERROR:
-        // The GraphicsContext3D implementation might not fully
-        // support GL_ARB_robustness semantics yet. Alternatively, the
-        // WEBGL_lose_context extension might have been used to force
-        // a lost context.
-        break;
-    case Extensions3D::GUILTY_CONTEXT_RESET_ARB:
-        // The rendering context is not restored if this context was
-        // guilty of causing the graphics reset.
-        printWarningToConsole(&quot;WARNING: WebGL content on the page caused the graphics card to reset; not restoring the context&quot;);
-        return;
-    case Extensions3D::INNOCENT_CONTEXT_RESET_ARB:
-        // Always allow the context to be restored.
-        break;
-    case Extensions3D::UNKNOWN_CONTEXT_RESET_ARB:
-        // Warn. Ideally, prompt the user telling them that WebGL
-        // content on the page might have caused the graphics card to
-        // reset and ask them whether they want to continue running
-        // the content. Only if they say &quot;yes&quot; should we start
-        // attempting to restore the context.
-        printWarningToConsole(&quot;WARNING: WebGL content on the page might have caused the graphics card to reset&quot;);
-        break;
-    }
-
-    Frame* frame = canvas()-&gt;document().frame();
-    if (!frame)
-        return;
-
-    if (!frame-&gt;loader().client().allowWebGL(frame-&gt;settings().webGLEnabled()))
-        return;
-
-    FrameView* view = frame-&gt;view();
-    if (!view)
-        return;
-    ScrollView* root = view-&gt;root();
-    if (!root)
-        return;
-    HostWindow* hostWindow = root-&gt;hostWindow();
-    if (!hostWindow)
-        return;
-
-    RefPtr&lt;GraphicsContext3D&gt; context(GraphicsContext3D::create(m_attributes, hostWindow));
-    if (!context) {
-        if (m_contextLostMode == RealLostContext)
-            m_restoreTimer.startOneShot(secondsBetweenRestoreAttempts);
-        else
-            // This likely shouldn't happen but is the best way to report it to the WebGL app.
-            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;&quot;, &quot;error restoring context&quot;);
-        return;
-    }
-
-    // Construct a new drawing buffer with the new GraphicsContext3D.
-    if (m_drawingBuffer) {
-        m_drawingBuffer-&gt;discardResources();
-        DrawingBuffer::PreserveDrawingBuffer preserve = m_attributes.preserveDrawingBuffer ? DrawingBuffer::Preserve : DrawingBuffer::Discard;
-        DrawingBuffer::AlphaRequirement alpha = m_attributes.alpha ? DrawingBuffer::Alpha : DrawingBuffer::Opaque;
-        m_drawingBuffer = DrawingBuffer::create(context.get(), m_drawingBuffer-&gt;size(), preserve, alpha);
-        m_drawingBuffer-&gt;bind();
-    }
-
-    m_context = context;
-    m_contextLost = false;
-    setupFlags();
-    initializeNewContext();
-    canvas()-&gt;dispatchEvent(WebGLContextEvent::create(eventNames().webglcontextrestoredEvent, false, true, &quot;&quot;));
-}
-
-String WebGLRenderingContext::ensureNotNull(const String&amp; text) const
-{
-    if (text.isNull())
-        return WTF::emptyString();
-    return text;
-}
-
-WebGLRenderingContext::LRUImageBufferCache::LRUImageBufferCache(int capacity)
-    : m_buffers(std::make_unique&lt;std::unique_ptr&lt;ImageBuffer&gt;[]&gt;(capacity))
-    , m_capacity(capacity)
-{
-}
-
-ImageBuffer* WebGLRenderingContext::LRUImageBufferCache::imageBuffer(const IntSize&amp; size)
-{
-    int i;
-    for (i = 0; i &lt; m_capacity; ++i) {
-        ImageBuffer* buf = m_buffers[i].get();
-        if (!buf)
-            break;
-        if (buf-&gt;logicalSize() != size)
-            continue;
-        bubbleToFront(i);
-        return buf;
-    }
-
-    std::unique_ptr&lt;ImageBuffer&gt; temp = ImageBuffer::create(size, 1);
-    if (!temp)
-        return nullptr;
-    i = std::min(m_capacity - 1, i);
-    m_buffers[i] = WTF::move(temp);
-
-    ImageBuffer* buf = m_buffers[i].get();
-    bubbleToFront(i);
-    return buf;
-}
-
-void WebGLRenderingContext::LRUImageBufferCache::bubbleToFront(int idx)
-{
-    for (int i = idx; i &gt; 0; --i)
-        m_buffers[i].swap(m_buffers[i-1]);
-}
-
-namespace {
-
-    String GetErrorString(GC3Denum error)
-    {
-        switch (error) {
-        case GraphicsContext3D::INVALID_ENUM:
-            return &quot;INVALID_ENUM&quot;;
-        case GraphicsContext3D::INVALID_VALUE:
-            return &quot;INVALID_VALUE&quot;;
-        case GraphicsContext3D::INVALID_OPERATION:
-            return &quot;INVALID_OPERATION&quot;;
-        case GraphicsContext3D::OUT_OF_MEMORY:
-            return &quot;OUT_OF_MEMORY&quot;;
-        case GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION:
-            return &quot;INVALID_FRAMEBUFFER_OPERATION&quot;;
-        case GraphicsContext3D::CONTEXT_LOST_WEBGL:
-            return &quot;CONTEXT_LOST_WEBGL&quot;;
-        default:
-            return String::format(&quot;WebGL ERROR(%04x)&quot;, error);
-        }
-    }
-
-} // namespace anonymous
-
-void WebGLRenderingContext::synthesizeGLError(GC3Denum error, const char* functionName, const char* description, ConsoleDisplayPreference display)
-{
-    if (m_synthesizedErrorsToConsole &amp;&amp; display == DisplayInConsole) {
-      String str = String(&quot;WebGL: &quot;) + GetErrorString(error) +  &quot;: &quot; + String(functionName) + &quot;: &quot; + String(description);
-      printGLErrorToConsole(str);
-    }
-    m_context-&gt;synthesizeGLError(error);
-}
-
-
-void WebGLRenderingContext::printGLWarningToConsole(const char* functionName, const char* description)
-{
-    if (m_synthesizedErrorsToConsole) {
-        String str = String(&quot;WebGL: &quot;) + String(functionName) + &quot;: &quot; + String(description);
-        printGLErrorToConsole(str);
-    }
-}
-
-void WebGLRenderingContext::applyStencilTest()
-{
-    bool haveStencilBuffer = false;
-
-    if (m_framebufferBinding)
-        haveStencilBuffer = m_framebufferBinding-&gt;hasStencilBuffer();
-    else {
-        RefPtr&lt;WebGLContextAttributes&gt; attributes = getContextAttributes();
-        haveStencilBuffer = attributes-&gt;stencil();
-    }
-    enableOrDisable(GraphicsContext3D::STENCIL_TEST,
-                    m_stencilEnabled &amp;&amp; haveStencilBuffer);
-}
-
-void WebGLRenderingContext::enableOrDisable(GC3Denum capability, bool enable)
-{
-    if (enable)
-        m_context-&gt;enable(capability);
-    else
-        m_context-&gt;disable(capability);
-}
-
-IntSize WebGLRenderingContext::clampedCanvasSize()
-{
-    return IntSize(clamp(canvas()-&gt;width(), 1, m_maxViewportDims[0]),
-                   clamp(canvas()-&gt;height(), 1, m_maxViewportDims[1]));
-}
-
-GC3Dint WebGLRenderingContext::getMaxDrawBuffers()
-{
-    if (!supportsDrawBuffers())
-        return 0;
-    if (!m_maxDrawBuffers)
-        m_context-&gt;getIntegerv(Extensions3D::MAX_DRAW_BUFFERS_EXT, &amp;m_maxDrawBuffers);
-    if (!m_maxColorAttachments)
-        m_context-&gt;getIntegerv(Extensions3D::MAX_COLOR_ATTACHMENTS_EXT, &amp;m_maxColorAttachments);
-    // WEBGL_draw_buffers requires MAX_COLOR_ATTACHMENTS &gt;= MAX_DRAW_BUFFERS.
-    return std::min(m_maxDrawBuffers, m_maxColorAttachments);
-}
-
-GC3Dint WebGLRenderingContext::getMaxColorAttachments()
-{
-    if (!supportsDrawBuffers())
-        return 0;
-    if (!m_maxColorAttachments)
-        m_context-&gt;getIntegerv(Extensions3D::MAX_COLOR_ATTACHMENTS_EXT, &amp;m_maxColorAttachments);
-    return m_maxColorAttachments;
-}
-
-void WebGLRenderingContext::setBackDrawBuffer(GC3Denum buf)
-{
-    m_backDrawBuffer = buf;
-}
-
-void WebGLRenderingContext::restoreCurrentFramebuffer()
-{
-    ExceptionCode ec;
-    bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_framebufferBinding.get(), ec);
-}
-
-void WebGLRenderingContext::restoreCurrentTexture2D()
-{
-    ExceptionCode ec;
-    bindTexture(GraphicsContext3D::TEXTURE_2D, m_textureUnits[m_activeTextureUnit].texture2DBinding.get(), ec);
-}
-
-bool WebGLRenderingContext::supportsDrawBuffers()
-{
-    if (!m_drawBuffersWebGLRequirementsChecked) {
-        m_drawBuffersWebGLRequirementsChecked = true;
-        m_drawBuffersSupported = WebGLDrawBuffers::supported(this);
-    }
-    return m_drawBuffersSupported;
-}
-
-void WebGLRenderingContext::drawArraysInstanced(GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei primcount)
-{
-    if (!primcount) {
-        markContextChanged();
-        return;
-    }
-
-    if (!validateDrawArrays(&quot;drawArraysInstanced&quot;, mode, first, count, primcount))
-        return;
-
-    clearIfComposited();
-
-    bool vertexAttrib0Simulated = false;
-    if (!isGLES2Compliant())
-        vertexAttrib0Simulated = simulateVertexAttrib0(first + count - 1);
-    if (!isGLES2NPOTStrict())
-        checkTextureCompleteness(&quot;drawArraysInstanced&quot;, true);
-
-    m_context-&gt;drawArraysInstanced(mode, first, count, primcount);
-
-    if (!isGLES2Compliant() &amp;&amp; vertexAttrib0Simulated)
-        restoreStatesAfterVertexAttrib0Simulation();
-    if (!isGLES2NPOTStrict())
-        checkTextureCompleteness(&quot;drawArraysInstanced&quot;, false);
-    markContextChanged();
-}
-
-void WebGLRenderingContext::drawElementsInstanced(GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, GC3Dsizei primcount)
-{
-    if (!primcount) {
-        markContextChanged();
-        return;
-    }
-
-    unsigned numElements = 0;
-    if (!validateDrawElements(&quot;drawElementsInstanced&quot;, mode, count, type, offset, numElements, primcount))
-        return;
-
-    clearIfComposited();
-
-    bool vertexAttrib0Simulated = false;
-    if (!isGLES2Compliant()) {
-        if (!numElements)
-            validateIndexArrayPrecise(count, type, static_cast&lt;GC3Dintptr&gt;(offset), numElements);
-        vertexAttrib0Simulated = simulateVertexAttrib0(numElements);
-    }
-    if (!isGLES2NPOTStrict())
-        checkTextureCompleteness(&quot;drawElementsInstanced&quot;, true);
-
-    m_context-&gt;drawElementsInstanced(mode, count, type, static_cast&lt;GC3Dintptr&gt;(offset), primcount);
-
-    if (!isGLES2Compliant() &amp;&amp; vertexAttrib0Simulated)
-        restoreStatesAfterVertexAttrib0Simulation();
-    if (!isGLES2NPOTStrict())
-        checkTextureCompleteness(&quot;drawElementsInstanced&quot;, false);
-    markContextChanged();
-}
-
-void WebGLRenderingContext::vertexAttribDivisor(GC3Duint index, GC3Duint divisor)
-{
-    if (isContextLostOrPending())
-        return;
-
-    if (index &gt;= m_maxVertexAttribs) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;vertexAttribDivisor&quot;, &quot;index out of range&quot;);
-        return;
-    }
-
-    m_boundVertexArrayObject-&gt;setVertexAttribDivisor(index, divisor);
-    m_context-&gt;vertexAttribDivisor(index, divisor);
-}
-
-
-} // namespace WebCore
-
-#endif // ENABLE(WEBGL)
</del></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLRenderingContexth"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/html/canvas/WebGLRenderingContext.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLRenderingContext.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderingContext.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -1,816 +0,0 @@
</span><del>-/*
- * Copyright (C) 2009, 2014 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-
-#ifndef WebGLRenderingContext_h
-#define WebGLRenderingContext_h
-
-#include &quot;ActiveDOMObject.h&quot;
-#include &quot;CanvasRenderingContext.h&quot;
-#include &quot;DrawingBuffer.h&quot;
-#include &quot;GraphicsContext3D.h&quot;
-#include &quot;ImageBuffer.h&quot;
-#include &quot;Timer.h&quot;
-#include &quot;WebGLGetInfo.h&quot;
-#include &lt;memory&gt;
-#include &lt;runtime/Float32Array.h&gt;
-#include &lt;runtime/Int32Array.h&gt;
-#include &lt;wtf/text/WTFString.h&gt;
-
-namespace WebCore {
-
-class ANGLEInstancedArrays;
-class EXTBlendMinMax;
-class EXTTextureFilterAnisotropic;
-class EXTShaderTextureLOD;
-class EXTsRGB;
-class EXTFragDepth;
-class HTMLImageElement;
-class HTMLVideoElement;
-class ImageBuffer;
-class ImageData;
-class IntSize;
-class OESStandardDerivatives;
-class OESTextureFloat;
-class OESTextureFloatLinear;
-class OESTextureHalfFloat;
-class OESTextureHalfFloatLinear;
-class OESVertexArrayObject;
-class OESElementIndexUint;
-class WebGLActiveInfo;
-class WebGLBuffer;
-class WebGLContextGroup;
-class WebGLContextObject;
-class WebGLCompressedTextureATC;
-class WebGLCompressedTexturePVRTC;
-class WebGLCompressedTextureS3TC;
-class WebGLContextAttributes;
-class WebGLDebugRendererInfo;
-class WebGLDebugShaders;
-class WebGLDepthTexture;
-class WebGLDrawBuffers;
-class WebGLExtension;
-class WebGLFramebuffer;
-class WebGLLoseContext;
-class WebGLObject;
-class WebGLProgram;
-class WebGLRenderbuffer;
-class WebGLShader;
-class WebGLSharedObject;
-class WebGLShaderPrecisionFormat;
-class WebGLTexture;
-class WebGLUniformLocation;
-class WebGLVertexArrayObjectOES;
-
-typedef int ExceptionCode;
-
-class WebGLRenderingContext final : public CanvasRenderingContext, public ActiveDOMObject {
-public:
-    static std::unique_ptr&lt;WebGLRenderingContext&gt; create(HTMLCanvasElement*, WebGLContextAttributes*);
-    virtual ~WebGLRenderingContext();
-
-    virtual bool is3d() const override { return true; }
-#if PLATFORM(WIN)
-    // FIXME: Implement accelerated 3d canvas on Windows.
-    virtual bool isAccelerated() const override { return false; }
-#else
-    virtual bool isAccelerated() const override { return true; }
-#endif
-
-    int drawingBufferWidth() const;
-    int drawingBufferHeight() const;
-
-    void activeTexture(GC3Denum texture, ExceptionCode&amp;);
-    void attachShader(WebGLProgram*, WebGLShader*, ExceptionCode&amp;);
-    void bindAttribLocation(WebGLProgram*, GC3Duint index, const String&amp; name, ExceptionCode&amp;);
-    void bindBuffer(GC3Denum target, WebGLBuffer*, ExceptionCode&amp;);
-    void bindFramebuffer(GC3Denum target, WebGLFramebuffer*, ExceptionCode&amp;);
-    void bindRenderbuffer(GC3Denum target, WebGLRenderbuffer*, ExceptionCode&amp;);
-    void bindTexture(GC3Denum target, WebGLTexture*, ExceptionCode&amp;);
-    void blendColor(GC3Dfloat red, GC3Dfloat green, GC3Dfloat blue, GC3Dfloat alpha);
-    void blendEquation(GC3Denum mode);
-    void blendEquationSeparate(GC3Denum modeRGB, GC3Denum modeAlpha);
-    void blendFunc(GC3Denum sfactor, GC3Denum dfactor);
-    void blendFuncSeparate(GC3Denum srcRGB, GC3Denum dstRGB, GC3Denum srcAlpha, GC3Denum dstAlpha);
-
-    void bufferData(GC3Denum target, long long size, GC3Denum usage, ExceptionCode&amp;);
-    void bufferData(GC3Denum target, ArrayBuffer* data, GC3Denum usage, ExceptionCode&amp;);
-    void bufferData(GC3Denum target, ArrayBufferView* data, GC3Denum usage, ExceptionCode&amp;);
-    void bufferSubData(GC3Denum target, long long offset, ArrayBuffer* data, ExceptionCode&amp;);
-    void bufferSubData(GC3Denum target, long long offset, ArrayBufferView* data, ExceptionCode&amp;);
-
-    GC3Denum checkFramebufferStatus(GC3Denum target);
-    void clear(GC3Dbitfield mask);
-    void clearColor(GC3Dfloat red, GC3Dfloat green, GC3Dfloat blue, GC3Dfloat alpha);
-    void clearDepth(GC3Dfloat);
-    void clearStencil(GC3Dint);
-    void colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboolean alpha);
-    void compileShader(WebGLShader*, ExceptionCode&amp;);
-
-    void compressedTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width,
-                              GC3Dsizei height, GC3Dint border, ArrayBufferView* data);
-    void compressedTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
-                                 GC3Dsizei width, GC3Dsizei height, GC3Denum format, ArrayBufferView* data);
-
-    void copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border);
-    void copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
-
-    PassRefPtr&lt;WebGLBuffer&gt; createBuffer();
-    PassRefPtr&lt;WebGLFramebuffer&gt; createFramebuffer();
-    PassRefPtr&lt;WebGLProgram&gt; createProgram();
-    PassRefPtr&lt;WebGLRenderbuffer&gt; createRenderbuffer();
-    PassRefPtr&lt;WebGLShader&gt; createShader(GC3Denum type, ExceptionCode&amp;);
-    PassRefPtr&lt;WebGLTexture&gt; createTexture();
-
-    void cullFace(GC3Denum mode);
-
-    void deleteBuffer(WebGLBuffer*);
-    void deleteFramebuffer(WebGLFramebuffer*);
-    void deleteProgram(WebGLProgram*);
-    void deleteRenderbuffer(WebGLRenderbuffer*);
-    void deleteShader(WebGLShader*);
-    void deleteTexture(WebGLTexture*);
-
-    void depthFunc(GC3Denum);
-    void depthMask(GC3Dboolean);
-    void depthRange(GC3Dfloat zNear, GC3Dfloat zFar);
-    void detachShader(WebGLProgram*, WebGLShader*, ExceptionCode&amp;);
-    void disable(GC3Denum cap);
-    void disableVertexAttribArray(GC3Duint index, ExceptionCode&amp;);
-    void drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei count, ExceptionCode&amp;);
-    void drawElements(GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, ExceptionCode&amp;);
-
-    void enable(GC3Denum cap);
-    void enableVertexAttribArray(GC3Duint index, ExceptionCode&amp;);
-    void finish();
-    void flush();
-    void framebufferRenderbuffer(GC3Denum target, GC3Denum attachment, GC3Denum renderbuffertarget, WebGLRenderbuffer*, ExceptionCode&amp;);
-    void framebufferTexture2D(GC3Denum target, GC3Denum attachment, GC3Denum textarget, WebGLTexture*, GC3Dint level, ExceptionCode&amp;);
-    void frontFace(GC3Denum mode);
-    void generateMipmap(GC3Denum target);
-
-    PassRefPtr&lt;WebGLActiveInfo&gt; getActiveAttrib(WebGLProgram*, GC3Duint index, ExceptionCode&amp;);
-    PassRefPtr&lt;WebGLActiveInfo&gt; getActiveUniform(WebGLProgram*, GC3Duint index, ExceptionCode&amp;);
-    bool getAttachedShaders(WebGLProgram*, Vector&lt;RefPtr&lt;WebGLShader&gt;&gt;&amp;, ExceptionCode&amp;);
-    GC3Dint getAttribLocation(WebGLProgram*, const String&amp; name);
-    WebGLGetInfo getBufferParameter(GC3Denum target, GC3Denum pname, ExceptionCode&amp;);
-    PassRefPtr&lt;WebGLContextAttributes&gt; getContextAttributes();
-    GC3Denum getError();
-    WebGLExtension* getExtension(const String&amp; name);
-    WebGLGetInfo getFramebufferAttachmentParameter(GC3Denum target, GC3Denum attachment, GC3Denum pname, ExceptionCode&amp;);
-    WebGLGetInfo getParameter(GC3Denum pname, ExceptionCode&amp;);
-    WebGLGetInfo getProgramParameter(WebGLProgram*, GC3Denum pname, ExceptionCode&amp;);
-    String getProgramInfoLog(WebGLProgram*, ExceptionCode&amp;);
-    WebGLGetInfo getRenderbufferParameter(GC3Denum target, GC3Denum pname, ExceptionCode&amp;);
-    WebGLGetInfo getShaderParameter(WebGLShader*, GC3Denum pname, ExceptionCode&amp;);
-    String getShaderInfoLog(WebGLShader*, ExceptionCode&amp;);
-    PassRefPtr&lt;WebGLShaderPrecisionFormat&gt; getShaderPrecisionFormat(GC3Denum shaderType, GC3Denum precisionType, ExceptionCode&amp;);
-    String getShaderSource(WebGLShader*, ExceptionCode&amp;);
-    Vector&lt;String&gt; getSupportedExtensions();
-    WebGLGetInfo getTexParameter(GC3Denum target, GC3Denum pname, ExceptionCode&amp;);
-    WebGLGetInfo getUniform(WebGLProgram*, const WebGLUniformLocation*, ExceptionCode&amp;);
-    PassRefPtr&lt;WebGLUniformLocation&gt; getUniformLocation(WebGLProgram*, const String&amp;, ExceptionCode&amp;);
-    WebGLGetInfo getVertexAttrib(GC3Duint index, GC3Denum pname, ExceptionCode&amp;);
-    long long getVertexAttribOffset(GC3Duint index, GC3Denum pname);
-
-    void hint(GC3Denum target, GC3Denum mode);
-    GC3Dboolean isBuffer(WebGLBuffer*);
-    bool isContextLost() const;
-    GC3Dboolean isEnabled(GC3Denum cap);
-    GC3Dboolean isFramebuffer(WebGLFramebuffer*);
-    GC3Dboolean isProgram(WebGLProgram*);
-    GC3Dboolean isRenderbuffer(WebGLRenderbuffer*);
-    GC3Dboolean isShader(WebGLShader*);
-    GC3Dboolean isTexture(WebGLTexture*);
-
-    void lineWidth(GC3Dfloat);
-    void linkProgram(WebGLProgram*, ExceptionCode&amp;);
-    void pixelStorei(GC3Denum pname, GC3Dint param);
-    void polygonOffset(GC3Dfloat factor, GC3Dfloat units);
-    void readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, ArrayBufferView* pixels, ExceptionCode&amp;);
-    void releaseShaderCompiler();
-    void renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height);
-    void sampleCoverage(GC3Dfloat value, GC3Dboolean invert);
-    void scissor(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
-    void shaderSource(WebGLShader*, const String&amp;, ExceptionCode&amp;);
-    void stencilFunc(GC3Denum func, GC3Dint ref, GC3Duint mask);
-    void stencilFuncSeparate(GC3Denum face, GC3Denum func, GC3Dint ref, GC3Duint mask);
-    void stencilMask(GC3Duint);
-    void stencilMaskSeparate(GC3Denum face, GC3Duint mask);
-    void stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zpass);
-    void stencilOpSeparate(GC3Denum face, GC3Denum fail, GC3Denum zfail, GC3Denum zpass);
-
-    void texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
-                    GC3Dsizei width, GC3Dsizei height, GC3Dint border,
-                    GC3Denum format, GC3Denum type, ArrayBufferView*, ExceptionCode&amp;);
-    void texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
-                    GC3Denum format, GC3Denum type, ImageData*, ExceptionCode&amp;);
-    void texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
-                    GC3Denum format, GC3Denum type, HTMLImageElement*, ExceptionCode&amp;);
-    void texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
-                    GC3Denum format, GC3Denum type, HTMLCanvasElement*, ExceptionCode&amp;);
-#if ENABLE(VIDEO)
-    void texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
-                    GC3Denum format, GC3Denum type, HTMLVideoElement*, ExceptionCode&amp;);
-#endif
-
-    void texParameterf(GC3Denum target, GC3Denum pname, GC3Dfloat param);
-    void texParameteri(GC3Denum target, GC3Denum pname, GC3Dint param);
-
-    void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
-                       GC3Dsizei width, GC3Dsizei height,
-                       GC3Denum format, GC3Denum type, ArrayBufferView*, ExceptionCode&amp;);
-    void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
-                       GC3Denum format, GC3Denum type, ImageData*, ExceptionCode&amp;);
-    void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
-                       GC3Denum format, GC3Denum type, HTMLImageElement*, ExceptionCode&amp;);
-    void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
-                       GC3Denum format, GC3Denum type, HTMLCanvasElement*, ExceptionCode&amp;);
-#if ENABLE(VIDEO)
-    void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
-                       GC3Denum format, GC3Denum type, HTMLVideoElement*, ExceptionCode&amp;);
-#endif
-
-    void uniform1f(const WebGLUniformLocation* location, GC3Dfloat x, ExceptionCode&amp;);
-    void uniform1fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&amp;);
-    void uniform1fv(const WebGLUniformLocation* location, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp;);
-    void uniform1i(const WebGLUniformLocation* location, GC3Dint x, ExceptionCode&amp;);
-    void uniform1iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&amp;);
-    void uniform1iv(const WebGLUniformLocation* location, GC3Dint* v, GC3Dsizei size, ExceptionCode&amp;);
-    void uniform2f(const WebGLUniformLocation* location, GC3Dfloat x, GC3Dfloat y, ExceptionCode&amp;);
-    void uniform2fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&amp;);
-    void uniform2fv(const WebGLUniformLocation* location, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp;);
-    void uniform2i(const WebGLUniformLocation* location, GC3Dint x, GC3Dint y, ExceptionCode&amp;);
-    void uniform2iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&amp;);
-    void uniform2iv(const WebGLUniformLocation* location, GC3Dint* v, GC3Dsizei size, ExceptionCode&amp;);
-    void uniform3f(const WebGLUniformLocation* location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, ExceptionCode&amp;);
-    void uniform3fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&amp;);
-    void uniform3fv(const WebGLUniformLocation* location, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp;);
-    void uniform3i(const WebGLUniformLocation* location, GC3Dint x, GC3Dint y, GC3Dint z, ExceptionCode&amp;);
-    void uniform3iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&amp;);
-    void uniform3iv(const WebGLUniformLocation* location, GC3Dint* v, GC3Dsizei size, ExceptionCode&amp;);
-    void uniform4f(const WebGLUniformLocation* location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w, ExceptionCode&amp;);
-    void uniform4fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&amp;);
-    void uniform4fv(const WebGLUniformLocation* location, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp;);
-    void uniform4i(const WebGLUniformLocation* location, GC3Dint x, GC3Dint y, GC3Dint z, GC3Dint w, ExceptionCode&amp;);
-    void uniform4iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&amp;);
-    void uniform4iv(const WebGLUniformLocation* location, GC3Dint* v, GC3Dsizei size, ExceptionCode&amp;);
-    void uniformMatrix2fv(const WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* value, ExceptionCode&amp;);
-    void uniformMatrix2fv(const WebGLUniformLocation* location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size, ExceptionCode&amp;);
-    void uniformMatrix3fv(const WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* value, ExceptionCode&amp;);
-    void uniformMatrix3fv(const WebGLUniformLocation* location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size, ExceptionCode&amp;);
-    void uniformMatrix4fv(const WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* value, ExceptionCode&amp;);
-    void uniformMatrix4fv(const WebGLUniformLocation* location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size, ExceptionCode&amp;);
-
-    void useProgram(WebGLProgram*, ExceptionCode&amp;);
-    void validateProgram(WebGLProgram*, ExceptionCode&amp;);
-
-    void vertexAttrib1f(GC3Duint index, GC3Dfloat x);
-    void vertexAttrib1fv(GC3Duint index, Float32Array* values);
-    void vertexAttrib1fv(GC3Duint index, GC3Dfloat* values, GC3Dsizei size);
-    void vertexAttrib2f(GC3Duint index, GC3Dfloat x, GC3Dfloat y);
-    void vertexAttrib2fv(GC3Duint index, Float32Array* values);
-    void vertexAttrib2fv(GC3Duint index, GC3Dfloat* values, GC3Dsizei size);
-    void vertexAttrib3f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z);
-    void vertexAttrib3fv(GC3Duint index, Float32Array* values);
-    void vertexAttrib3fv(GC3Duint index, GC3Dfloat* values, GC3Dsizei size);
-    void vertexAttrib4f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w);
-    void vertexAttrib4fv(GC3Duint index, Float32Array* values);
-    void vertexAttrib4fv(GC3Duint index, GC3Dfloat* values, GC3Dsizei size);
-    void vertexAttribPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dboolean normalized,
-                             GC3Dsizei stride, long long offset, ExceptionCode&amp;);
-
-    void viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
-
-    // WEBKIT_lose_context support
-    enum LostContextMode {
-        // Lost context occurred at the graphics system level.
-        RealLostContext,
-
-        // Lost context provoked by WEBKIT_lose_context.
-        SyntheticLostContext
-    };
-    void forceLostContext(LostContextMode);
-    void forceRestoreContext();
-    void loseContextImpl(LostContextMode);
-
-    GraphicsContext3D* graphicsContext3D() const { return m_context.get(); }
-    WebGLContextGroup* contextGroup() const { return m_contextGroup.get(); }
-    virtual PlatformLayer* platformLayer() const override;
-
-    void reshape(int width, int height);
-
-    void markLayerComposited();
-    virtual void paintRenderingResultsToCanvas() override;
-    PassRefPtr&lt;ImageData&gt; paintRenderingResultsToImageData();
-
-    void removeSharedObject(WebGLSharedObject*);
-    void removeContextObject(WebGLContextObject*);
-    
-    unsigned getMaxVertexAttribs() const { return m_maxVertexAttribs; }
-
-    // ANGLE_instanced_arrays extension functions.
-    void drawArraysInstanced(GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei primcount);
-    void drawElementsInstanced(GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, GC3Dsizei primcount);
-    void vertexAttribDivisor(GC3Duint index, GC3Duint divisor);
-
-private:
-    friend class WebGLDrawBuffers;
-    friend class WebGLFramebuffer;
-    friend class WebGLObject;
-    friend class OESVertexArrayObject;
-    friend class WebGLDebugShaders;
-    friend class WebGLCompressedTextureATC;
-    friend class WebGLCompressedTexturePVRTC;
-    friend class WebGLCompressedTextureS3TC;
-    friend class WebGLRenderingContextErrorMessageCallback;
-    friend class WebGLVertexArrayObjectOES;
-
-    WebGLRenderingContext(HTMLCanvasElement*, GraphicsContext3D::Attributes);
-    WebGLRenderingContext(HTMLCanvasElement*, PassRefPtr&lt;GraphicsContext3D&gt;, GraphicsContext3D::Attributes);
-    void initializeNewContext();
-    void setupFlags();
-
-    // ActiveDOMObject
-    virtual bool hasPendingActivity() const override;
-    virtual void stop() override;
-    virtual const char* activeDOMObjectName() const override { return &quot;WebGLRenderingContext&quot;; }
-
-    void addSharedObject(WebGLSharedObject*);
-    void addContextObject(WebGLContextObject*);
-    void detachAndRemoveAllObjects();
-
-    void destroyGraphicsContext3D();
-    void markContextChanged();
-
-    // Query whether it is built on top of compliant GLES2 implementation.
-    bool isGLES2Compliant() { return m_isGLES2Compliant; }
-    // Query if the GL implementation is NPOT strict.
-    bool isGLES2NPOTStrict() { return m_isGLES2NPOTStrict; }
-    // Query if the GL implementation generates errors on out-of-bounds buffer accesses.
-    bool isErrorGeneratedOnOutOfBoundsAccesses() { return m_isErrorGeneratedOnOutOfBoundsAccesses; }
-    // Query if the GL implementation initializes textures/renderbuffers to 0.
-    bool isResourceSafe() { return m_isResourceSafe; }
-    // Query if depth_stencil buffer is supported.
-    bool isDepthStencilSupported() { return m_isDepthStencilSupported; }
-
-    // Helper to return the size in bytes of OpenGL data types
-    // like GL_FLOAT, GL_INT, etc.
-    unsigned int sizeInBytes(GC3Denum type);
-
-    // Basic validation of count and offset against number of elements in element array buffer
-    bool validateElementArraySize(GC3Dsizei count, GC3Denum type, GC3Dintptr offset);
-
-    // Conservative but quick index validation
-    bool validateIndexArrayConservative(GC3Denum type, unsigned&amp; numElementsRequired);
-
-    // Precise but slow index validation -- only done if conservative checks fail
-    bool validateIndexArrayPrecise(GC3Dsizei count, GC3Denum type, GC3Dintptr offset, unsigned&amp; numElementsRequired);
-    bool validateVertexAttributes(unsigned elementCount, unsigned primitiveCount = 0);
-
-    bool validateWebGLObject(const char*, WebGLObject*);
-
-    bool validateDrawArrays(const char* functionName, GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei primcount);
-    bool validateDrawElements(const char* functionName, GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, unsigned&amp; numElements, GC3Dsizei primcount);
-
-    // Adds a compressed texture format.
-    void addCompressedTextureFormat(GC3Denum);
-
-    PassRefPtr&lt;Image&gt; drawImageIntoBuffer(Image*, int width, int height, int deviceScaleFactor);
-
-#if ENABLE(VIDEO)
-    PassRefPtr&lt;Image&gt; videoFrameToImage(HTMLVideoElement*, BackingStoreCopy, ExceptionCode&amp;);
-#endif
-
-    RefPtr&lt;GraphicsContext3D&gt; m_context;
-    RefPtr&lt;WebGLContextGroup&gt; m_contextGroup;
-
-    // Optional structure for rendering to a DrawingBuffer, instead of directly
-    // to the back-buffer of m_context.
-    RefPtr&lt;DrawingBuffer&gt; m_drawingBuffer;
-
-    // Dispatches a context lost event once it is determined that one is needed.
-    // This is used both for synthetic and real context losses. For real ones, it's
-    // likely that there's no JavaScript on the stack, but that might be dependent
-    // on how exactly the platform discovers that the context was lost. For better
-    // portability we always defer the dispatch of the event.
-    Timer m_dispatchContextLostEventTimer;
-    bool m_restoreAllowed;
-    Timer m_restoreTimer;
-
-    bool m_needsUpdate;
-    bool m_markedCanvasDirty;
-    HashSet&lt;WebGLContextObject*&gt; m_contextObjects;
-
-    // List of bound VBO's. Used to maintain info about sizes for ARRAY_BUFFER and stored values for ELEMENT_ARRAY_BUFFER
-    RefPtr&lt;WebGLBuffer&gt; m_boundArrayBuffer;
-    
-    RefPtr&lt;WebGLVertexArrayObjectOES&gt; m_defaultVertexArrayObject;
-    RefPtr&lt;WebGLVertexArrayObjectOES&gt; m_boundVertexArrayObject;
-    void setBoundVertexArrayObject(PassRefPtr&lt;WebGLVertexArrayObjectOES&gt; arrayObject)
-    {
-        if (arrayObject)
-            m_boundVertexArrayObject = arrayObject;
-        else
-            m_boundVertexArrayObject = m_defaultVertexArrayObject;
-    }
-    
-    class VertexAttribValue {
-    public:
-        VertexAttribValue()
-        {
-            initValue();
-        }
-        
-        void initValue()
-        {
-            value[0] = 0.0f;
-            value[1] = 0.0f;
-            value[2] = 0.0f;
-            value[3] = 1.0f;
-        }
-        
-        GC3Dfloat value[4];
-    };
-    Vector&lt;VertexAttribValue&gt; m_vertexAttribValue;
-    unsigned m_maxVertexAttribs;
-    RefPtr&lt;WebGLBuffer&gt; m_vertexAttrib0Buffer;
-    long m_vertexAttrib0BufferSize;
-    GC3Dfloat m_vertexAttrib0BufferValue[4];
-    bool m_forceAttrib0BufferRefill;
-    bool m_vertexAttrib0UsedBefore;
-
-    RefPtr&lt;WebGLProgram&gt; m_currentProgram;
-    RefPtr&lt;WebGLFramebuffer&gt; m_framebufferBinding;
-    RefPtr&lt;WebGLRenderbuffer&gt; m_renderbufferBinding;
-    struct TextureUnitState {
-        RefPtr&lt;WebGLTexture&gt; texture2DBinding;
-        RefPtr&lt;WebGLTexture&gt; textureCubeMapBinding;
-    };
-    Vector&lt;TextureUnitState&gt; m_textureUnits;
-    unsigned long m_activeTextureUnit;
-
-    RefPtr&lt;WebGLTexture&gt; m_blackTexture2D;
-    RefPtr&lt;WebGLTexture&gt; m_blackTextureCubeMap;
-
-    Vector&lt;GC3Denum&gt; m_compressedTextureFormats;
-
-    // Fixed-size cache of reusable image buffers for video texImage2D calls.
-    class LRUImageBufferCache {
-    public:
-        LRUImageBufferCache(int capacity);
-        // The pointer returned is owned by the image buffer map.
-        ImageBuffer* imageBuffer(const IntSize&amp; size);
-    private:
-        void bubbleToFront(int idx);
-        std::unique_ptr&lt;std::unique_ptr&lt;ImageBuffer&gt;[]&gt; m_buffers;
-        int m_capacity;
-    };
-    LRUImageBufferCache m_generatedImageCache;
-
-    GC3Dint m_maxTextureSize;
-    GC3Dint m_maxCubeMapTextureSize;
-    GC3Dint m_maxRenderbufferSize;
-    GC3Dint m_maxViewportDims[2];
-    GC3Dint m_maxTextureLevel;
-    GC3Dint m_maxCubeMapTextureLevel;
-
-    GC3Dint m_maxDrawBuffers;
-    GC3Dint m_maxColorAttachments;
-    GC3Denum m_backDrawBuffer;
-    bool m_drawBuffersWebGLRequirementsChecked;
-    bool m_drawBuffersSupported;
-
-    GC3Dint m_packAlignment;
-    GC3Dint m_unpackAlignment;
-    bool m_unpackFlipY;
-    bool m_unpackPremultiplyAlpha;
-    GC3Denum m_unpackColorspaceConversion;
-    bool m_contextLost;
-    LostContextMode m_contextLostMode;
-    GraphicsContext3D::Attributes m_attributes;
-
-    bool m_layerCleared;
-    GC3Dfloat m_clearColor[4];
-    bool m_scissorEnabled;
-    GC3Dfloat m_clearDepth;
-    GC3Dint m_clearStencil;
-    GC3Dboolean m_colorMask[4];
-    GC3Dboolean m_depthMask;
-
-    bool m_stencilEnabled;
-    GC3Duint m_stencilMask, m_stencilMaskBack;
-    GC3Dint m_stencilFuncRef, m_stencilFuncRefBack; // Note that these are the user specified values, not the internal clamped value.
-    GC3Duint m_stencilFuncMask, m_stencilFuncMaskBack;
-
-    bool m_isGLES2Compliant;
-    bool m_isGLES2NPOTStrict;
-    bool m_isErrorGeneratedOnOutOfBoundsAccesses;
-    bool m_isResourceSafe;
-    bool m_isDepthStencilSupported;
-    bool m_isRobustnessEXTSupported;
-
-    bool m_synthesizedErrorsToConsole;
-    int m_numGLErrorsToConsoleAllowed;
-
-    // A WebGLRenderingContext can be created in a state where it appears as
-    // a valid and active context, but will not execute any important operations
-    // until its load policy is completely resolved.
-    bool m_isPendingPolicyResolution;
-    bool m_hasRequestedPolicyResolution;
-    bool isContextLostOrPending();
-
-    // Enabled extension objects.
-    std::unique_ptr&lt;EXTFragDepth&gt; m_extFragDepth;
-    std::unique_ptr&lt;EXTBlendMinMax&gt; m_extBlendMinMax;
-    std::unique_ptr&lt;EXTsRGB&gt; m_extsRGB;
-    std::unique_ptr&lt;EXTTextureFilterAnisotropic&gt; m_extTextureFilterAnisotropic;
-    std::unique_ptr&lt;EXTShaderTextureLOD&gt; m_extShaderTextureLOD;
-    std::unique_ptr&lt;OESTextureFloat&gt; m_oesTextureFloat;
-    std::unique_ptr&lt;OESTextureFloatLinear&gt; m_oesTextureFloatLinear;
-    std::unique_ptr&lt;OESTextureHalfFloat&gt; m_oesTextureHalfFloat;
-    std::unique_ptr&lt;OESTextureHalfFloatLinear&gt; m_oesTextureHalfFloatLinear;
-    std::unique_ptr&lt;OESStandardDerivatives&gt; m_oesStandardDerivatives;
-    std::unique_ptr&lt;OESVertexArrayObject&gt; m_oesVertexArrayObject;
-    std::unique_ptr&lt;OESElementIndexUint&gt; m_oesElementIndexUint;
-    std::unique_ptr&lt;WebGLLoseContext&gt; m_webglLoseContext;
-    std::unique_ptr&lt;WebGLDebugRendererInfo&gt; m_webglDebugRendererInfo;
-    std::unique_ptr&lt;WebGLDebugShaders&gt; m_webglDebugShaders;
-    std::unique_ptr&lt;WebGLCompressedTextureATC&gt; m_webglCompressedTextureATC;
-    std::unique_ptr&lt;WebGLCompressedTexturePVRTC&gt; m_webglCompressedTexturePVRTC;
-    std::unique_ptr&lt;WebGLCompressedTextureS3TC&gt; m_webglCompressedTextureS3TC;
-    std::unique_ptr&lt;WebGLDepthTexture&gt; m_webglDepthTexture;
-    std::unique_ptr&lt;WebGLDrawBuffers&gt; m_webglDrawBuffers;
-    std::unique_ptr&lt;ANGLEInstancedArrays&gt; m_angleInstancedArrays;
-
-    // Helpers for getParameter and others
-    WebGLGetInfo getBooleanParameter(GC3Denum);
-    WebGLGetInfo getBooleanArrayParameter(GC3Denum);
-    WebGLGetInfo getFloatParameter(GC3Denum);
-    WebGLGetInfo getIntParameter(GC3Denum);
-    WebGLGetInfo getUnsignedIntParameter(GC3Denum);
-    WebGLGetInfo getWebGLFloatArrayParameter(GC3Denum);
-    WebGLGetInfo getWebGLIntArrayParameter(GC3Denum);
-
-    // Clear the backbuffer if it was composited since the last operation.
-    // clearMask is set to the bitfield of any clear that would happen anyway at this time
-    // and the function returns true if that clear is now unnecessary.
-    bool clearIfComposited(GC3Dbitfield clearMask = 0);
-
-    // Helper to restore state that clearing the framebuffer may destroy.
-    void restoreStateAfterClear();
-
-    void texImage2DBase(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels, ExceptionCode&amp;);
-    void texImage2DImpl(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Denum format, GC3Denum type, Image*, GraphicsContext3D::ImageHtmlDomSource, bool flipY, bool premultiplyAlpha, ExceptionCode&amp;);
-    void texSubImage2DBase(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels, ExceptionCode&amp;);
-    void texSubImage2DImpl(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Denum format, GC3Denum type, Image*, GraphicsContext3D::ImageHtmlDomSource, bool flipY, bool premultiplyAlpha, ExceptionCode&amp;);
-
-    void checkTextureCompleteness(const char*, bool);
-
-    void createFallbackBlackTextures1x1();
-
-    // Helper function for copyTex{Sub}Image, check whether the internalformat
-    // and the color buffer format of the current bound framebuffer combination
-    // is valid.
-    bool isTexInternalFormatColorBufferCombinationValid(GC3Denum texInternalFormat,
-                                                        GC3Denum colorBufferFormat);
-
-    // Helper function to get the bound framebuffer's color buffer format.
-    GC3Denum getBoundFramebufferColorFormat();
-
-    // Helper function to get the bound framebuffer's width.
-    int getBoundFramebufferWidth();
-
-    // Helper function to get the bound framebuffer's height.
-    int getBoundFramebufferHeight();
-
-    // Helper function to verify limits on the length of uniform and attribute locations.
-    bool validateLocationLength(const char* functionName, const String&amp;);
-
-    // Helper function to check if size is non-negative.
-    // Generate GL error and return false for negative inputs; otherwise, return true.
-    bool validateSize(const char* functionName, GC3Dint x, GC3Dint y);
-
-    // Helper function to check if all characters in the string belong to the
-    // ASCII subset as defined in GLSL ES 1.0 spec section 3.1.
-    bool validateString(const char* functionName, const String&amp;);
-
-    // Helper function to check target and texture bound to the target.
-    // Generate GL errors and return 0 if target is invalid or texture bound is
-    // null.  Otherwise, return the texture bound to the target.
-    WebGLTexture* validateTextureBinding(const char* functionName, GC3Denum target, bool useSixEnumsForCubeMap);
-
-    // Helper function to check input format/type for functions {copy}Tex{Sub}Image.
-    // Generates GL error and returns false if parameters are invalid.
-    bool validateTexFuncFormatAndType(const char* functionName, GC3Denum format, GC3Denum type, GC3Dint level);
-
-    // Helper function to check input level for functions {copy}Tex{Sub}Image.
-    // Generates GL error and returns false if level is invalid.
-    bool validateTexFuncLevel(const char* functionName, GC3Denum target, GC3Dint level);
-
-    enum TexFuncValidationFunctionType {
-        NotTexSubImage2D,
-        TexSubImage2D,
-    };
-
-    enum TexFuncValidationSourceType {
-        SourceArrayBufferView,
-        SourceImageData,
-        SourceHTMLImageElement,
-        SourceHTMLCanvasElement,
-        SourceHTMLVideoElement,
-    };
-
-    // Helper function for tex{Sub}Image2D to check if the input format/type/level/target/width/height/border/xoffset/yoffset are valid.
-    // Otherwise, it would return quickly without doing other work.
-    bool validateTexFunc(const char* functionName, TexFuncValidationFunctionType, TexFuncValidationSourceType, GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width,
-        GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, GC3Dint xoffset, GC3Dint yoffset);
-
-    // Helper function to check input parameters for functions {copy}Tex{Sub}Image.
-    // Generates GL error and returns false if parameters are invalid.
-    bool validateTexFuncParameters(const char* functionName,
-                                   TexFuncValidationFunctionType,
-                                   GC3Denum target, GC3Dint level,
-                                   GC3Denum internalformat,
-                                   GC3Dsizei width, GC3Dsizei height, GC3Dint border,
-                                   GC3Denum format, GC3Denum type);
-
-    enum NullDisposition {
-        NullAllowed,
-        NullNotAllowed
-    };
-
-    // Helper function to validate that the given ArrayBufferView
-    // is of the correct type and contains enough data for the texImage call.
-    // Generates GL error and returns false if parameters are invalid.
-    bool validateTexFuncData(const char* functionName, GC3Dint level,
-                             GC3Dsizei width, GC3Dsizei height,
-                             GC3Denum format, GC3Denum type,
-                             ArrayBufferView* pixels,
-                             NullDisposition);
-
-    // Helper function to validate a given texture format is settable as in
-    // you can supply data to texImage2D, or call texImage2D, copyTexImage2D and
-    // copyTexSubImage2D.
-    // Generates GL error and returns false if the format is not settable.
-    bool validateSettableTexFormat(const char* functionName, GC3Denum format);
-
-    // Helper function to validate compressed texture data is correct size
-    // for the given format and dimensions.
-    bool validateCompressedTexFuncData(const char* functionName,
-                                       GC3Dsizei width, GC3Dsizei height,
-                                       GC3Denum format, ArrayBufferView* pixels);
-
-    // Helper function for validating compressed texture formats.
-    bool validateCompressedTexFormat(GC3Denum format);
-
-    // Helper function to validate compressed texture dimensions are valid for
-    // the given format.
-    bool validateCompressedTexDimensions(const char* functionName, GC3Denum target, GC3Dint level, GC3Dsizei width, GC3Dsizei height, GC3Denum format);
-
-    // Helper function to validate compressed texture dimensions are valid for
-    // the given format.
-    bool validateCompressedTexSubDimensions(const char* functionName, GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
-                                            GC3Dsizei width, GC3Dsizei height, GC3Denum format, WebGLTexture*);
-
-    // Helper function to validate mode for draw{Arrays/Elements}.
-    bool validateDrawMode(const char* functionName, GC3Denum);
-
-    // Helper function to validate if front/back stencilMask and stencilFunc settings are the same.
-    bool validateStencilSettings(const char* functionName);
-
-    // Helper function to validate stencil func.
-    bool validateStencilFunc(const char* functionName, GC3Denum);
-
-    // Helper function for texParameterf and texParameteri.
-    void texParameter(GC3Denum target, GC3Denum pname, GC3Dfloat parami, GC3Dint paramf, bool isFloat);
-
-    // Helper function to print GL errors to console.
-    void printGLErrorToConsole(const String&amp;);
-    void printGLWarningToConsole(const char* function, const char* reason);
-
-    // Helper function to print warnings to console. Currently
-    // used only to warn about use of obsolete functions.
-    void printWarningToConsole(const String&amp;);
-
-    // Helper function to validate input parameters for framebuffer functions.
-    // Generate GL error if parameters are illegal.
-    bool validateFramebufferFuncParameters(const char* functionName, GC3Denum target, GC3Denum attachment);
-
-    // Helper function to validate blend equation mode.
-    bool validateBlendEquation(const char* functionName, GC3Denum);
-
-    // Helper function to validate blend func factors.
-    bool validateBlendFuncFactors(const char* functionName, GC3Denum src, GC3Denum dst);
-
-    // Helper function to validate a GL capability.
-    bool validateCapability(const char* functionName, GC3Denum);
-
-    // Helper function to validate input parameters for uniform functions.
-    bool validateUniformParameters(const char* functionName, const WebGLUniformLocation*, Float32Array*, GC3Dsizei mod);
-    bool validateUniformParameters(const char* functionName, const WebGLUniformLocation*, Int32Array*, GC3Dsizei mod);
-    bool validateUniformParameters(const char* functionName, const WebGLUniformLocation*, void*, GC3Dsizei, GC3Dsizei mod);
-    bool validateUniformMatrixParameters(const char* functionName, const WebGLUniformLocation*, GC3Dboolean transpose, Float32Array*, GC3Dsizei mod);
-    bool validateUniformMatrixParameters(const char* functionName, const WebGLUniformLocation*, GC3Dboolean transpose, void*, GC3Dsizei, GC3Dsizei mod);
-
-    // Helper function to validate parameters for bufferData.
-    // Return the current bound buffer to target, or 0 if parameters are invalid.
-    WebGLBuffer* validateBufferDataParameters(const char* functionName, GC3Denum target, GC3Denum usage);
-
-    // Helper function for tex{Sub}Image2D to make sure image is ready and wouldn't taint Origin.
-    bool validateHTMLImageElement(const char* functionName, HTMLImageElement*, ExceptionCode&amp;);
-
-    // Helper function for tex{Sub}Image2D to make sure canvas is ready and wouldn't taint Origin.
-    bool validateHTMLCanvasElement(const char* functionName, HTMLCanvasElement*, ExceptionCode&amp;);
-
-#if ENABLE(VIDEO)
-    // Helper function for tex{Sub}Image2D to make sure video is ready wouldn't taint Origin.
-    bool validateHTMLVideoElement(const char* functionName, HTMLVideoElement*, ExceptionCode&amp;);
-#endif
-
-    // Helper functions for vertexAttribNf{v}.
-    void vertexAttribfImpl(const char* functionName, GC3Duint index, GC3Dsizei expectedSize, GC3Dfloat, GC3Dfloat, GC3Dfloat, GC3Dfloat);
-    void vertexAttribfvImpl(const char* functionName, GC3Duint index, Float32Array*, GC3Dsizei expectedSize);
-    void vertexAttribfvImpl(const char* functionName, GC3Duint index, GC3Dfloat*, GC3Dsizei, GC3Dsizei expectedSize);
-
-    // Helper function for delete* (deleteBuffer, deleteProgram, etc) functions.
-    // Return false if caller should return without further processing.
-    bool deleteObject(WebGLObject*);
-
-    // Helper function for bind* (bindBuffer, bindTexture, etc) and useProgram.
-    // If the object has already been deleted, set deleted to true upon return.
-    // Return false if caller should return without further processing.
-    bool checkObjectToBeBound(const char* functionName, WebGLObject*, bool&amp; deleted);
-
-    // Helpers for simulating vertexAttrib0
-    void initVertexAttrib0();
-    bool simulateVertexAttrib0(GC3Dsizei numVertex);
-    void restoreStatesAfterVertexAttrib0Simulation();
-
-    void dispatchContextLostEvent();
-    // Helper for restoration after context lost.
-    void maybeRestoreContext();
-
-    // Determine if we are running privileged code in the browser, for example,
-    // a Safari or Chrome extension.
-    bool allowPrivilegedExtensions() const;
-
-    enum ConsoleDisplayPreference {
-        DisplayInConsole,
-        DontDisplayInConsole
-    };
-
-    // Wrapper for GraphicsContext3D::synthesizeGLError that sends a message
-    // to the JavaScript console.
-    void synthesizeGLError(GC3Denum, const char* functionName, const char* description, ConsoleDisplayPreference = DisplayInConsole);
-
-    String ensureNotNull(const String&amp;) const;
-
-    // Enable or disable stencil test based on user setting and
-    // whether the current FBO has a stencil buffer.
-    void applyStencilTest();
-
-    // Helper for enabling or disabling a capability.
-    void enableOrDisable(GC3Denum capability, bool enable);
-
-    // Clamp the width and height to GL_MAX_VIEWPORT_DIMS.
-    IntSize clampedCanvasSize();
-
-    // First time called, if EXT_draw_buffers is supported, query the value; otherwise return 0.
-    // Later, return the cached value.
-    GC3Dint getMaxDrawBuffers();
-    GC3Dint getMaxColorAttachments();
-
-    void setBackDrawBuffer(GC3Denum);
-
-    void restoreCurrentFramebuffer();
-    void restoreCurrentTexture2D();
-
-    // Check if EXT_draw_buffers extension is supported and if it satisfies the WebGL requirements.
-    bool supportsDrawBuffers();
-};
-
-} // namespace WebCore
-
-#endif
</del></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLRenderingContextidl"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/html/canvas/WebGLRenderingContext.idl (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLRenderingContext.idl        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderingContext.idl        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -1,677 +0,0 @@
</span><del>-/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-
-typedef unsigned long  GLenum;
-typedef boolean        GLboolean;
-typedef unsigned long  GLbitfield;
-typedef byte           GLbyte;         /* 'byte' should be a signed 8 bit type. */
-typedef short          GLshort;
-typedef long           GLint;
-typedef long           GLsizei;
-typedef long long      GLintptr;
-typedef long long      GLsizeiptr;
-typedef octet          GLubyte;        /* 'octet' should be an unsigned 8 bit type. */
-typedef unsigned short GLushort;
-typedef unsigned long  GLuint;
-typedef unrestricted float GLfloat;
-typedef unrestricted float GLclampf;
-
-[
-    Conditional=WEBGL,
-    JSCustomMarkFunction,
-    DoNotCheckConstants,
-] interface WebGLRenderingContext : CanvasRenderingContext {
-
-    /* ClearBufferMask */
-    const GLenum DEPTH_BUFFER_BIT               = 0x00000100;
-    const GLenum STENCIL_BUFFER_BIT             = 0x00000400;
-    const GLenum COLOR_BUFFER_BIT               = 0x00004000;
-
-    /* BeginMode */
-    const GLenum POINTS                         = 0x0000;
-    const GLenum LINES                          = 0x0001;
-    const GLenum LINE_LOOP                      = 0x0002;
-    const GLenum LINE_STRIP                     = 0x0003;
-    const GLenum TRIANGLES                      = 0x0004;
-    const GLenum TRIANGLE_STRIP                 = 0x0005;
-    const GLenum TRIANGLE_FAN                   = 0x0006;
-
-    /* AlphaFunction (not supported in ES20) */
-    /*      NEVER */
-    /*      LESS */
-    /*      EQUAL */
-    /*      LEQUAL */
-    /*      GREATER */
-    /*      NOTEQUAL */
-    /*      GEQUAL */
-    /*      ALWAYS */
-
-    /* BlendingFactorDest */
-    const GLenum ZERO                           = 0;
-    const GLenum ONE                            = 1;
-    const GLenum SRC_COLOR                      = 0x0300;
-    const GLenum ONE_MINUS_SRC_COLOR            = 0x0301;
-    const GLenum SRC_ALPHA                      = 0x0302;
-    const GLenum ONE_MINUS_SRC_ALPHA            = 0x0303;
-    const GLenum DST_ALPHA                      = 0x0304;
-    const GLenum ONE_MINUS_DST_ALPHA            = 0x0305;
-
-    /* BlendingFactorSrc */
-    /*      ZERO */
-    /*      ONE */
-    const GLenum DST_COLOR                      = 0x0306;
-    const GLenum ONE_MINUS_DST_COLOR            = 0x0307;
-    const GLenum SRC_ALPHA_SATURATE             = 0x0308;
-    /*      SRC_ALPHA */
-    /*      ONE_MINUS_SRC_ALPHA */
-    /*      DST_ALPHA */
-    /*      ONE_MINUS_DST_ALPHA */
-
-    /* BlendEquationSeparate */
-    const GLenum FUNC_ADD                       = 0x8006;
-    const GLenum BLEND_EQUATION                 = 0x8009;
-    const GLenum BLEND_EQUATION_RGB             = 0x8009;   /* same as BLEND_EQUATION */
-    const GLenum BLEND_EQUATION_ALPHA           = 0x883D;
-
-    /* BlendSubtract */
-    const GLenum FUNC_SUBTRACT                  = 0x800A;
-    const GLenum FUNC_REVERSE_SUBTRACT          = 0x800B;
-
-    /* Separate Blend Functions */
-    const GLenum BLEND_DST_RGB                  = 0x80C8;
-    const GLenum BLEND_SRC_RGB                  = 0x80C9;
-    const GLenum BLEND_DST_ALPHA                = 0x80CA;
-    const GLenum BLEND_SRC_ALPHA                = 0x80CB;
-    const GLenum CONSTANT_COLOR                 = 0x8001;
-    const GLenum ONE_MINUS_CONSTANT_COLOR       = 0x8002;
-    const GLenum CONSTANT_ALPHA                 = 0x8003;
-    const GLenum ONE_MINUS_CONSTANT_ALPHA       = 0x8004;
-    const GLenum BLEND_COLOR                    = 0x8005;
-
-    /* Buffer Objects */
-    const GLenum ARRAY_BUFFER                   = 0x8892;
-    const GLenum ELEMENT_ARRAY_BUFFER           = 0x8893;
-    const GLenum ARRAY_BUFFER_BINDING           = 0x8894;
-    const GLenum ELEMENT_ARRAY_BUFFER_BINDING   = 0x8895;
-
-    const GLenum STREAM_DRAW                    = 0x88E0;
-    const GLenum STATIC_DRAW                    = 0x88E4;
-    const GLenum DYNAMIC_DRAW                   = 0x88E8;
-
-    const GLenum BUFFER_SIZE                    = 0x8764;
-    const GLenum BUFFER_USAGE                   = 0x8765;
-
-    const GLenum CURRENT_VERTEX_ATTRIB          = 0x8626;
-
-    /* CullFaceMode */
-    const GLenum FRONT                          = 0x0404;
-    const GLenum BACK                           = 0x0405;
-    const GLenum FRONT_AND_BACK                 = 0x0408;
-
-    /* DepthFunction */
-    /*      NEVER */
-    /*      LESS */
-    /*      EQUAL */
-    /*      LEQUAL */
-    /*      GREATER */
-    /*      NOTEQUAL */
-    /*      GEQUAL */
-    /*      ALWAYS */
-
-    /* EnableCap */
-    const GLenum TEXTURE_2D                     = 0x0DE1;
-    const GLenum CULL_FACE                      = 0x0B44;
-    const GLenum BLEND                          = 0x0BE2;
-    const GLenum DITHER                         = 0x0BD0;
-    const GLenum STENCIL_TEST                   = 0x0B90;
-    const GLenum DEPTH_TEST                     = 0x0B71;
-    const GLenum SCISSOR_TEST                   = 0x0C11;
-    const GLenum POLYGON_OFFSET_FILL            = 0x8037;
-    const GLenum SAMPLE_ALPHA_TO_COVERAGE       = 0x809E;
-    const GLenum SAMPLE_COVERAGE                = 0x80A0;
-
-    /* ErrorCode */
-    const GLenum NO_ERROR                       = 0;
-    const GLenum INVALID_ENUM                   = 0x0500;
-    const GLenum INVALID_VALUE                  = 0x0501;
-    const GLenum INVALID_OPERATION              = 0x0502;
-    const GLenum OUT_OF_MEMORY                  = 0x0505;
-
-    /* FrontFaceDirection */
-    const GLenum CW                             = 0x0900;
-    const GLenum CCW                            = 0x0901;
-
-    /* GetPName */
-    const GLenum LINE_WIDTH                     = 0x0B21;
-    const GLenum ALIASED_POINT_SIZE_RANGE       = 0x846D;
-    const GLenum ALIASED_LINE_WIDTH_RANGE       = 0x846E;
-    const GLenum CULL_FACE_MODE                 = 0x0B45;
-    const GLenum FRONT_FACE                     = 0x0B46;
-    const GLenum DEPTH_RANGE                    = 0x0B70;
-    const GLenum DEPTH_WRITEMASK                = 0x0B72;
-    const GLenum DEPTH_CLEAR_VALUE              = 0x0B73;
-    const GLenum DEPTH_FUNC                     = 0x0B74;
-    const GLenum STENCIL_CLEAR_VALUE            = 0x0B91;
-    const GLenum STENCIL_FUNC                   = 0x0B92;
-    const GLenum STENCIL_FAIL                   = 0x0B94;
-    const GLenum STENCIL_PASS_DEPTH_FAIL        = 0x0B95;
-    const GLenum STENCIL_PASS_DEPTH_PASS        = 0x0B96;
-    const GLenum STENCIL_REF                    = 0x0B97;
-    const GLenum STENCIL_VALUE_MASK             = 0x0B93;
-    const GLenum STENCIL_WRITEMASK              = 0x0B98;
-    const GLenum STENCIL_BACK_FUNC              = 0x8800;
-    const GLenum STENCIL_BACK_FAIL              = 0x8801;
-    const GLenum STENCIL_BACK_PASS_DEPTH_FAIL   = 0x8802;
-    const GLenum STENCIL_BACK_PASS_DEPTH_PASS   = 0x8803;
-    const GLenum STENCIL_BACK_REF               = 0x8CA3;
-    const GLenum STENCIL_BACK_VALUE_MASK        = 0x8CA4;
-    const GLenum STENCIL_BACK_WRITEMASK         = 0x8CA5;
-    const GLenum VIEWPORT                       = 0x0BA2;
-    const GLenum SCISSOR_BOX                    = 0x0C10;
-    /*      SCISSOR_TEST */
-    const GLenum COLOR_CLEAR_VALUE              = 0x0C22;
-    const GLenum COLOR_WRITEMASK                = 0x0C23;
-    const GLenum UNPACK_ALIGNMENT               = 0x0CF5;
-    const GLenum PACK_ALIGNMENT                 = 0x0D05;
-    const GLenum MAX_TEXTURE_SIZE               = 0x0D33;
-    const GLenum MAX_VIEWPORT_DIMS              = 0x0D3A;
-    const GLenum SUBPIXEL_BITS                  = 0x0D50;
-    const GLenum RED_BITS                       = 0x0D52;
-    const GLenum GREEN_BITS                     = 0x0D53;
-    const GLenum BLUE_BITS                      = 0x0D54;
-    const GLenum ALPHA_BITS                     = 0x0D55;
-    const GLenum DEPTH_BITS                     = 0x0D56;
-    const GLenum STENCIL_BITS                   = 0x0D57;
-    const GLenum POLYGON_OFFSET_UNITS           = 0x2A00;
-    /*      POLYGON_OFFSET_FILL */
-    const GLenum POLYGON_OFFSET_FACTOR          = 0x8038;
-    const GLenum TEXTURE_BINDING_2D             = 0x8069;
-    const GLenum SAMPLE_BUFFERS                 = 0x80A8;
-    const GLenum SAMPLES                        = 0x80A9;
-    const GLenum SAMPLE_COVERAGE_VALUE          = 0x80AA;
-    const GLenum SAMPLE_COVERAGE_INVERT         = 0x80AB;
-
-    /* GetTextureParameter */
-    /*      TEXTURE_MAG_FILTER */
-    /*      TEXTURE_MIN_FILTER */
-    /*      TEXTURE_WRAP_S */
-    /*      TEXTURE_WRAP_T */
-
-    const GLenum COMPRESSED_TEXTURE_FORMATS     = 0x86A3;
-
-    /* HintMode */
-    const GLenum DONT_CARE                      = 0x1100;
-    const GLenum FASTEST                        = 0x1101;
-    const GLenum NICEST                         = 0x1102;
-
-    /* HintTarget */
-    const GLenum GENERATE_MIPMAP_HINT            = 0x8192;
-
-    /* DataType */
-    const GLenum BYTE                           = 0x1400;
-    const GLenum UNSIGNED_BYTE                  = 0x1401;
-    const GLenum SHORT                          = 0x1402;
-    const GLenum UNSIGNED_SHORT                 = 0x1403;
-    const GLenum INT                            = 0x1404;
-    const GLenum UNSIGNED_INT                   = 0x1405;
-    const GLenum FLOAT                          = 0x1406;
-
-    /* PixelFormat */
-    const GLenum DEPTH_COMPONENT                = 0x1902;
-    const GLenum ALPHA                          = 0x1906;
-    const GLenum RGB                            = 0x1907;
-    const GLenum RGBA                           = 0x1908;
-    const GLenum LUMINANCE                      = 0x1909;
-    const GLenum LUMINANCE_ALPHA                = 0x190A;
-
-    /* PixelType */
-    /*      UNSIGNED_BYTE */
-    const GLenum UNSIGNED_SHORT_4_4_4_4         = 0x8033;
-    const GLenum UNSIGNED_SHORT_5_5_5_1         = 0x8034;
-    const GLenum UNSIGNED_SHORT_5_6_5           = 0x8363;
-
-    /* Shaders */
-    const GLenum FRAGMENT_SHADER                  = 0x8B30;
-    const GLenum VERTEX_SHADER                    = 0x8B31;
-    const GLenum MAX_VERTEX_ATTRIBS               = 0x8869;
-    const GLenum MAX_VERTEX_UNIFORM_VECTORS       = 0x8DFB;
-    const GLenum MAX_VARYING_VECTORS              = 0x8DFC;
-    const GLenum MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
-    const GLenum MAX_VERTEX_TEXTURE_IMAGE_UNITS   = 0x8B4C;
-    const GLenum MAX_TEXTURE_IMAGE_UNITS          = 0x8872;
-    const GLenum MAX_FRAGMENT_UNIFORM_VECTORS     = 0x8DFD;
-    const GLenum SHADER_TYPE                      = 0x8B4F;
-    const GLenum DELETE_STATUS                    = 0x8B80;
-    const GLenum LINK_STATUS                      = 0x8B82;
-    const GLenum VALIDATE_STATUS                  = 0x8B83;
-    const GLenum ATTACHED_SHADERS                 = 0x8B85;
-    const GLenum ACTIVE_UNIFORMS                  = 0x8B86;
-    const GLenum ACTIVE_ATTRIBUTES                = 0x8B89;
-    const GLenum SHADING_LANGUAGE_VERSION         = 0x8B8C;
-    const GLenum CURRENT_PROGRAM                  = 0x8B8D;
-
-    /* StencilFunction */
-    const GLenum NEVER                          = 0x0200;
-    const GLenum LESS                           = 0x0201;
-    const GLenum EQUAL                          = 0x0202;
-    const GLenum LEQUAL                         = 0x0203;
-    const GLenum GREATER                        = 0x0204;
-    const GLenum NOTEQUAL                       = 0x0205;
-    const GLenum GEQUAL                         = 0x0206;
-    const GLenum ALWAYS                         = 0x0207;
-
-    /* StencilOp */
-    /*      ZERO */
-    const GLenum KEEP                           = 0x1E00;
-    const GLenum REPLACE                        = 0x1E01;
-    const GLenum INCR                           = 0x1E02;
-    const GLenum DECR                           = 0x1E03;
-    const GLenum INVERT                         = 0x150A;
-    const GLenum INCR_WRAP                      = 0x8507;
-    const GLenum DECR_WRAP                      = 0x8508;
-
-    /* StringName */
-    const GLenum VENDOR                         = 0x1F00;
-    const GLenum RENDERER                       = 0x1F01;
-    const GLenum VERSION                        = 0x1F02;
-
-    /* TextureMagFilter */
-    const GLenum NEAREST                        = 0x2600;
-    const GLenum LINEAR                         = 0x2601;
-
-    /* TextureMinFilter */
-    /*      NEAREST */
-    /*      LINEAR */
-    const GLenum NEAREST_MIPMAP_NEAREST         = 0x2700;
-    const GLenum LINEAR_MIPMAP_NEAREST          = 0x2701;
-    const GLenum NEAREST_MIPMAP_LINEAR          = 0x2702;
-    const GLenum LINEAR_MIPMAP_LINEAR           = 0x2703;
-
-    /* TextureParameterName */
-    const GLenum TEXTURE_MAG_FILTER             = 0x2800;
-    const GLenum TEXTURE_MIN_FILTER             = 0x2801;
-    const GLenum TEXTURE_WRAP_S                 = 0x2802;
-    const GLenum TEXTURE_WRAP_T                 = 0x2803;
-
-    /* TextureTarget */
-    /*      TEXTURE_2D */
-    const GLenum TEXTURE                        = 0x1702;
-
-    const GLenum TEXTURE_CUBE_MAP               = 0x8513;
-    const GLenum TEXTURE_BINDING_CUBE_MAP       = 0x8514;
-    const GLenum TEXTURE_CUBE_MAP_POSITIVE_X    = 0x8515;
-    const GLenum TEXTURE_CUBE_MAP_NEGATIVE_X    = 0x8516;
-    const GLenum TEXTURE_CUBE_MAP_POSITIVE_Y    = 0x8517;
-    const GLenum TEXTURE_CUBE_MAP_NEGATIVE_Y    = 0x8518;
-    const GLenum TEXTURE_CUBE_MAP_POSITIVE_Z    = 0x8519;
-    const GLenum TEXTURE_CUBE_MAP_NEGATIVE_Z    = 0x851A;
-    const GLenum MAX_CUBE_MAP_TEXTURE_SIZE      = 0x851C;
-
-    /* TextureUnit */
-    const GLenum TEXTURE0                       = 0x84C0;
-    const GLenum TEXTURE1                       = 0x84C1;
-    const GLenum TEXTURE2                       = 0x84C2;
-    const GLenum TEXTURE3                       = 0x84C3;
-    const GLenum TEXTURE4                       = 0x84C4;
-    const GLenum TEXTURE5                       = 0x84C5;
-    const GLenum TEXTURE6                       = 0x84C6;
-    const GLenum TEXTURE7                       = 0x84C7;
-    const GLenum TEXTURE8                       = 0x84C8;
-    const GLenum TEXTURE9                       = 0x84C9;
-    const GLenum TEXTURE10                      = 0x84CA;
-    const GLenum TEXTURE11                      = 0x84CB;
-    const GLenum TEXTURE12                      = 0x84CC;
-    const GLenum TEXTURE13                      = 0x84CD;
-    const GLenum TEXTURE14                      = 0x84CE;
-    const GLenum TEXTURE15                      = 0x84CF;
-    const GLenum TEXTURE16                      = 0x84D0;
-    const GLenum TEXTURE17                      = 0x84D1;
-    const GLenum TEXTURE18                      = 0x84D2;
-    const GLenum TEXTURE19                      = 0x84D3;
-    const GLenum TEXTURE20                      = 0x84D4;
-    const GLenum TEXTURE21                      = 0x84D5;
-    const GLenum TEXTURE22                      = 0x84D6;
-    const GLenum TEXTURE23                      = 0x84D7;
-    const GLenum TEXTURE24                      = 0x84D8;
-    const GLenum TEXTURE25                      = 0x84D9;
-    const GLenum TEXTURE26                      = 0x84DA;
-    const GLenum TEXTURE27                      = 0x84DB;
-    const GLenum TEXTURE28                      = 0x84DC;
-    const GLenum TEXTURE29                      = 0x84DD;
-    const GLenum TEXTURE30                      = 0x84DE;
-    const GLenum TEXTURE31                      = 0x84DF;
-    const GLenum ACTIVE_TEXTURE                 = 0x84E0;
-
-    /* TextureWrapMode */
-    const GLenum REPEAT                         = 0x2901;
-    const GLenum CLAMP_TO_EDGE                  = 0x812F;
-    const GLenum MIRRORED_REPEAT                = 0x8370;
-
-    /* Uniform Types */
-    const GLenum FLOAT_VEC2                     = 0x8B50;
-    const GLenum FLOAT_VEC3                     = 0x8B51;
-    const GLenum FLOAT_VEC4                     = 0x8B52;
-    const GLenum INT_VEC2                       = 0x8B53;
-    const GLenum INT_VEC3                       = 0x8B54;
-    const GLenum INT_VEC4                       = 0x8B55;
-    const GLenum BOOL                           = 0x8B56;
-    const GLenum BOOL_VEC2                      = 0x8B57;
-    const GLenum BOOL_VEC3                      = 0x8B58;
-    const GLenum BOOL_VEC4                      = 0x8B59;
-    const GLenum FLOAT_MAT2                     = 0x8B5A;
-    const GLenum FLOAT_MAT3                     = 0x8B5B;
-    const GLenum FLOAT_MAT4                     = 0x8B5C;
-    const GLenum SAMPLER_2D                     = 0x8B5E;
-    const GLenum SAMPLER_CUBE                   = 0x8B60;
-
-    /* Vertex Arrays */
-    const GLenum VERTEX_ATTRIB_ARRAY_ENABLED        = 0x8622;
-    const GLenum VERTEX_ATTRIB_ARRAY_SIZE           = 0x8623;
-    const GLenum VERTEX_ATTRIB_ARRAY_STRIDE         = 0x8624;
-    const GLenum VERTEX_ATTRIB_ARRAY_TYPE           = 0x8625;
-    const GLenum VERTEX_ATTRIB_ARRAY_NORMALIZED     = 0x886A;
-    const GLenum VERTEX_ATTRIB_ARRAY_POINTER        = 0x8645;
-    const GLenum VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;
-
-    /* Shader Source */
-    const GLenum COMPILE_STATUS                 = 0x8B81;
-
-    /* Shader Precision-Specified Types */
-    const GLenum LOW_FLOAT                      = 0x8DF0;
-    const GLenum MEDIUM_FLOAT                   = 0x8DF1;
-    const GLenum HIGH_FLOAT                     = 0x8DF2;
-    const GLenum LOW_INT                        = 0x8DF3;
-    const GLenum MEDIUM_INT                     = 0x8DF4;
-    const GLenum HIGH_INT                       = 0x8DF5;
-
-    /* Framebuffer Object. */
-    const GLenum FRAMEBUFFER                    = 0x8D40;
-    const GLenum RENDERBUFFER                   = 0x8D41;
-
-    const GLenum RGBA4                          = 0x8056;
-    const GLenum RGB5_A1                        = 0x8057;
-    const GLenum RGB565                         = 0x8D62;
-    const GLenum DEPTH_COMPONENT16              = 0x81A5;
-    const GLenum STENCIL_INDEX                  = 0x1901;
-    const GLenum STENCIL_INDEX8                 = 0x8D48;
-    const GLenum DEPTH_STENCIL                  = 0x84F9;
-
-    const GLenum SRGB_EXT                                     = 0x8C40;
-    const GLenum SRGB_ALPHA_EXT                               = 0x8C42;
-    const GLenum SRGB8_ALPHA8_EXT                             = 0x8C43;
-    const GLenum FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT    = 0x8210;
-
-    const GLenum MIN_EXT                        = 0x8007;
-    const GLenum MAX_EXT                        = 0x8008;
-
-    const GLenum RENDERBUFFER_WIDTH             = 0x8D42;
-    const GLenum RENDERBUFFER_HEIGHT            = 0x8D43;
-    const GLenum RENDERBUFFER_INTERNAL_FORMAT   = 0x8D44;
-    const GLenum RENDERBUFFER_RED_SIZE          = 0x8D50;
-    const GLenum RENDERBUFFER_GREEN_SIZE        = 0x8D51;
-    const GLenum RENDERBUFFER_BLUE_SIZE         = 0x8D52;
-    const GLenum RENDERBUFFER_ALPHA_SIZE        = 0x8D53;
-    const GLenum RENDERBUFFER_DEPTH_SIZE        = 0x8D54;
-    const GLenum RENDERBUFFER_STENCIL_SIZE      = 0x8D55;
-
-    const GLenum FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE           = 0x8CD0;
-    const GLenum FRAMEBUFFER_ATTACHMENT_OBJECT_NAME           = 0x8CD1;
-    const GLenum FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL         = 0x8CD2;
-    const GLenum FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;
-
-    const GLenum COLOR_ATTACHMENT0              = 0x8CE0;
-    const GLenum DEPTH_ATTACHMENT               = 0x8D00;
-    const GLenum STENCIL_ATTACHMENT             = 0x8D20;
-    const GLenum DEPTH_STENCIL_ATTACHMENT       = 0x821A;
-
-    const GLenum NONE                           = 0;
-
-    const GLenum FRAMEBUFFER_COMPLETE                      = 0x8CD5;
-    const GLenum FRAMEBUFFER_INCOMPLETE_ATTACHMENT         = 0x8CD6;
-    const GLenum FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
-    const GLenum FRAMEBUFFER_INCOMPLETE_DIMENSIONS         = 0x8CD9;
-    const GLenum FRAMEBUFFER_UNSUPPORTED                   = 0x8CDD;
-
-    const GLenum FRAMEBUFFER_BINDING            = 0x8CA6;
-    const GLenum RENDERBUFFER_BINDING           = 0x8CA7;
-    const GLenum MAX_RENDERBUFFER_SIZE          = 0x84E8;
-
-    const GLenum INVALID_FRAMEBUFFER_OPERATION  = 0x0506;
-
-    /* WebGL-specific enums */
-    const GLenum UNPACK_FLIP_Y_WEBGL                = 0x9240;
-    const GLenum UNPACK_PREMULTIPLY_ALPHA_WEBGL     = 0x9241;
-    const GLenum CONTEXT_LOST_WEBGL                 = 0x9242;
-    const GLenum UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;
-    const GLenum BROWSER_DEFAULT_WEBGL              = 0x9244;
-
-    readonly attribute GLsizei drawingBufferWidth;
-    readonly attribute GLsizei drawingBufferHeight;
-
-    [StrictTypeChecking, RaisesException] void         activeTexture(GLenum texture);
-    [StrictTypeChecking, RaisesException] void         attachShader(WebGLProgram program, WebGLShader shader);
-    [StrictTypeChecking, RaisesException] void         bindAttribLocation(WebGLProgram program, GLuint index, DOMString name);
-    [StrictTypeChecking, RaisesException] void         bindBuffer(GLenum target, WebGLBuffer buffer);
-    [StrictTypeChecking, RaisesException] void         bindFramebuffer(GLenum target, WebGLFramebuffer framebuffer);
-    [StrictTypeChecking, RaisesException] void         bindRenderbuffer(GLenum target, WebGLRenderbuffer renderbuffer);
-    [StrictTypeChecking, RaisesException] void         bindTexture(GLenum target, WebGLTexture texture);
-    [StrictTypeChecking] void         blendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
-    [StrictTypeChecking] void         blendEquation(GLenum mode);
-    [StrictTypeChecking] void         blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-    [StrictTypeChecking] void         blendFunc(GLenum sfactor, GLenum dfactor);
-    [StrictTypeChecking] void         blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
-    [StrictTypeChecking, RaisesException] void         bufferData(GLenum target, ArrayBuffer? data, GLenum usage);
-    [StrictTypeChecking, RaisesException] void         bufferData(GLenum target, ArrayBufferView? data, GLenum usage);
-    [StrictTypeChecking, RaisesException] void         bufferData(GLenum target, GLsizeiptr size, GLenum usage);
-    [StrictTypeChecking, RaisesException] void         bufferSubData(GLenum target, GLintptr offset, ArrayBuffer? data);
-    [StrictTypeChecking, RaisesException] void         bufferSubData(GLenum target, GLintptr offset, ArrayBufferView? data);
-
-    [StrictTypeChecking] GLenum       checkFramebufferStatus(GLenum target);
-    [StrictTypeChecking] void         clear(GLbitfield mask);
-    [StrictTypeChecking] void         clearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
-    [StrictTypeChecking] void         clearDepth(GLclampf depth);
-    [StrictTypeChecking] void         clearStencil(GLint s);
-    [StrictTypeChecking] void         colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
-    [StrictTypeChecking, RaisesException] void         compileShader(WebGLShader shader);
-
-    [StrictTypeChecking] void         compressedTexImage2D(GLenum target, GLint level, GLenum internalformat,
-                                                           GLsizei width, GLsizei height, GLint border, ArrayBufferView data);
-    [StrictTypeChecking] void         compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
-                                                              GLsizei width, GLsizei height, GLenum format, ArrayBufferView data);
-    
-    [StrictTypeChecking] void         copyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
-    [StrictTypeChecking] void         copyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-
-    [StrictTypeChecking] WebGLBuffer createBuffer();
-    [StrictTypeChecking] WebGLFramebuffer createFramebuffer();
-    [StrictTypeChecking] WebGLProgram createProgram();
-    [StrictTypeChecking] WebGLRenderbuffer createRenderbuffer();
-    [StrictTypeChecking, RaisesException] WebGLShader createShader(GLenum type);
-    [StrictTypeChecking] WebGLTexture createTexture();
-
-    [StrictTypeChecking] void         cullFace(GLenum mode);
-
-    [StrictTypeChecking] void         deleteBuffer(WebGLBuffer buffer);
-    [StrictTypeChecking] void         deleteFramebuffer(WebGLFramebuffer framebuffer);
-    [StrictTypeChecking] void         deleteProgram(WebGLProgram program);
-    [StrictTypeChecking] void         deleteRenderbuffer(WebGLRenderbuffer renderbuffer);
-    [StrictTypeChecking] void         deleteShader(WebGLShader shader);
-    [StrictTypeChecking] void         deleteTexture(WebGLTexture texture);
-
-    [StrictTypeChecking] void         depthFunc(GLenum func);
-    [StrictTypeChecking] void         depthMask(GLboolean flag);
-    [StrictTypeChecking] void         depthRange(GLclampf zNear, GLclampf zFar);
-    [StrictTypeChecking, RaisesException] void         detachShader(WebGLProgram program, WebGLShader shader);
-    [StrictTypeChecking] void         disable(GLenum cap);
-    [StrictTypeChecking, RaisesException] void         disableVertexAttribArray(GLuint index);
-    [StrictTypeChecking, RaisesException] void         drawArrays(GLenum mode, GLint first, GLsizei count);
-    [StrictTypeChecking, RaisesException] void         drawElements(GLenum mode, GLsizei count, GLenum type, GLintptr offset);
-
-    [StrictTypeChecking] void         enable(GLenum cap);
-    [StrictTypeChecking, RaisesException] void         enableVertexAttribArray(GLuint index);
-    [StrictTypeChecking] void         finish();
-    [StrictTypeChecking] void         flush();
-    [StrictTypeChecking, RaisesException] void         framebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, WebGLRenderbuffer renderbuffer);
-    [StrictTypeChecking, RaisesException] void         framebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, WebGLTexture texture, GLint level);
-    [StrictTypeChecking] void         frontFace(GLenum mode);
-    [StrictTypeChecking] void         generateMipmap(GLenum target);
-    
-    [StrictTypeChecking, RaisesException] WebGLActiveInfo getActiveAttrib(WebGLProgram program, GLuint index);
-    [StrictTypeChecking, RaisesException] WebGLActiveInfo getActiveUniform(WebGLProgram program, GLuint index);
-
-    [StrictTypeChecking, Custom, RaisesException] void getAttachedShaders(WebGLProgram program);
-
-    [StrictTypeChecking] GLint        getAttribLocation(WebGLProgram program, DOMString name);
-
-    [StrictTypeChecking, Custom] any getBufferParameter(GLenum target, GLenum pname);
-
-    [StrictTypeChecking] WebGLContextAttributes getContextAttributes();
-
-    [StrictTypeChecking] GLenum getError();
-
-    // object getExtension(DOMString name);
-    [StrictTypeChecking, Custom] any getExtension(DOMString name);
-
-    [StrictTypeChecking, Custom, RaisesException] any getFramebufferAttachmentParameter(GLenum target, GLenum attachment, GLenum pname);
-    [StrictTypeChecking, Custom, RaisesException] any getParameter(GLenum pname);
-    [StrictTypeChecking, Custom, RaisesException] any getProgramParameter(WebGLProgram program, GLenum pname);
-    [StrictTypeChecking, TreatReturnedNullStringAs=Null, RaisesException] DOMString getProgramInfoLog(WebGLProgram program);
-    [StrictTypeChecking, Custom, RaisesException] any getRenderbufferParameter(GLenum target, GLenum pname);
-    [StrictTypeChecking, Custom, RaisesException] any getShaderParameter(WebGLShader shader, GLenum pname);
-
-    [StrictTypeChecking, TreatReturnedNullStringAs=Null, RaisesException] DOMString    getShaderInfoLog(WebGLShader shader);
-
-    [StrictTypeChecking, RaisesException] WebGLShaderPrecisionFormat getShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype);
-
-    [StrictTypeChecking, TreatReturnedNullStringAs=Null, RaisesException] DOMString    getShaderSource(WebGLShader shader);
-
-    [StrictTypeChecking, Custom] sequence&lt;DOMString&gt; getSupportedExtensions();
-
-    [StrictTypeChecking, Custom, RaisesException] any getTexParameter(GLenum target, GLenum pname);
-
-    [StrictTypeChecking, Custom, RaisesException] any getUniform(WebGLProgram program, WebGLUniformLocation location);
-
-    [StrictTypeChecking, RaisesException] WebGLUniformLocation getUniformLocation(WebGLProgram program, DOMString name);
-
-    [StrictTypeChecking, Custom, RaisesException] any getVertexAttrib(GLuint index, GLenum pname);
-
-    [StrictTypeChecking] GLsizeiptr getVertexAttribOffset(GLuint index, GLenum pname);
-
-    [StrictTypeChecking] void         hint(GLenum target, GLenum mode);
-    [StrictTypeChecking] GLboolean    isBuffer(WebGLBuffer buffer);
-    [StrictTypeChecking] GLboolean    isContextLost();
-    [StrictTypeChecking] GLboolean    isEnabled(GLenum cap);
-    [StrictTypeChecking] GLboolean    isFramebuffer(WebGLFramebuffer framebuffer);
-    [StrictTypeChecking] GLboolean    isProgram(WebGLProgram program);
-    [StrictTypeChecking] GLboolean    isRenderbuffer(WebGLRenderbuffer renderbuffer);
-    [StrictTypeChecking] GLboolean    isShader(WebGLShader shader);
-    [StrictTypeChecking] GLboolean    isTexture(WebGLTexture texture);
-    [StrictTypeChecking] void         lineWidth(GLfloat width);
-    [StrictTypeChecking, RaisesException] void         linkProgram(WebGLProgram program);
-    [StrictTypeChecking] void         pixelStorei(GLenum pname, GLint param);
-    [StrictTypeChecking] void         polygonOffset(GLfloat factor, GLfloat units);
-
-    [StrictTypeChecking, RaisesException] void         readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, ArrayBufferView pixels);
-    
-    [StrictTypeChecking] void         releaseShaderCompiler();
-    [StrictTypeChecking] void         renderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-    [StrictTypeChecking] void         sampleCoverage(GLclampf value, GLboolean invert);
-    [StrictTypeChecking] void         scissor(GLint x, GLint y, GLsizei width, GLsizei height);
-    [StrictTypeChecking, RaisesException] void         shaderSource(WebGLShader shader, DOMString string);
-    [StrictTypeChecking] void         stencilFunc(GLenum func, GLint ref, GLuint mask);
-    [StrictTypeChecking] void         stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
-    [StrictTypeChecking] void         stencilMask(GLuint mask);
-    [StrictTypeChecking] void         stencilMaskSeparate(GLenum face, GLuint mask);
-    [StrictTypeChecking] void         stencilOp(GLenum fail, GLenum zfail, GLenum zpass);
-    [StrictTypeChecking] void         stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
-
-    [StrictTypeChecking] void         texParameterf(GLenum target, GLenum pname, GLfloat param);
-    [StrictTypeChecking] void         texParameteri(GLenum target, GLenum pname, GLint param);
-
-    // Supported forms:
-    [StrictTypeChecking, RaisesException] void         texImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, 
-                                                 GLint border, GLenum format, GLenum type, ArrayBufferView? pixels);
-    [StrictTypeChecking, RaisesException] void         texImage2D(GLenum target, GLint level, GLenum internalformat,
-                                                 GLenum format, GLenum type, ImageData? pixels);
-    [StrictTypeChecking, RaisesException] void         texImage2D(GLenum target, GLint level, GLenum internalformat,
-                                                 GLenum format, GLenum type, HTMLImageElement? image);
-    [StrictTypeChecking, RaisesException] void         texImage2D(GLenum target, GLint level, GLenum internalformat,
-                                                 GLenum format, GLenum type, HTMLCanvasElement? canvas);
-#if defined(ENABLE_VIDEO) &amp;&amp; ENABLE_VIDEO
-    [StrictTypeChecking, RaisesException] void         texImage2D(GLenum target, GLint level, GLenum internalformat,
-                                                 GLenum format, GLenum type, HTMLVideoElement? video);
-#endif
-
-    [StrictTypeChecking, RaisesException] void         texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, 
-                                                    GLsizei width, GLsizei height, 
-                                                    GLenum format, GLenum type, ArrayBufferView? pixels);
-    [StrictTypeChecking, RaisesException] void         texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
-                                                    GLenum format, GLenum type, ImageData? pixels);
-    [StrictTypeChecking, RaisesException] void         texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
-                                                    GLenum format, GLenum type, HTMLImageElement? image);
-    [StrictTypeChecking, RaisesException] void         texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
-                                                    GLenum format, GLenum type, HTMLCanvasElement? canvas);
-#if defined(ENABLE_VIDEO) &amp;&amp; ENABLE_VIDEO
-    [StrictTypeChecking, RaisesException] void         texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
-                                                    GLenum format, GLenum type, HTMLVideoElement? video);
-#endif
-
-    [StrictTypeChecking, RaisesException] void uniform1f(WebGLUniformLocation location, GLfloat x);
-    [StrictTypeChecking, Custom, RaisesException] void uniform1fv(WebGLUniformLocation location, Float32Array v);
-    [StrictTypeChecking, RaisesException] void uniform1i(WebGLUniformLocation location, GLint x);
-    [StrictTypeChecking, Custom, RaisesException] void uniform1iv(WebGLUniformLocation location, Int32Array v);
-    [StrictTypeChecking, RaisesException] void uniform2f(WebGLUniformLocation location, GLfloat x, GLfloat y);
-    [StrictTypeChecking, Custom, RaisesException] void uniform2fv(WebGLUniformLocation location, Float32Array v);
-    [StrictTypeChecking, RaisesException] void uniform2i(WebGLUniformLocation location, GLint x, GLint y);
-    [StrictTypeChecking, Custom, RaisesException] void uniform2iv(WebGLUniformLocation location, Int32Array v);
-    [StrictTypeChecking, RaisesException] void uniform3f(WebGLUniformLocation location, GLfloat x, GLfloat y, GLfloat z);
-    [StrictTypeChecking, Custom, RaisesException] void uniform3fv(WebGLUniformLocation location, Float32Array v);
-    [StrictTypeChecking, RaisesException] void uniform3i(WebGLUniformLocation location, GLint x, GLint y, GLint z);
-    [StrictTypeChecking, Custom, RaisesException] void uniform3iv(WebGLUniformLocation location, Int32Array v);
-    [StrictTypeChecking, RaisesException] void uniform4f(WebGLUniformLocation location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-    [StrictTypeChecking, Custom, RaisesException] void uniform4fv(WebGLUniformLocation location, Float32Array v);
-    [StrictTypeChecking, RaisesException] void uniform4i(WebGLUniformLocation location, GLint x, GLint y, GLint z, GLint w);
-    [StrictTypeChecking, Custom, RaisesException] void uniform4iv(WebGLUniformLocation location, Int32Array v);
-
-    [StrictTypeChecking, Custom, RaisesException] void uniformMatrix2fv(WebGLUniformLocation location, GLboolean transpose, Float32Array array);
-    [StrictTypeChecking, Custom, RaisesException] void uniformMatrix3fv(WebGLUniformLocation location, GLboolean transpose, Float32Array array);
-    [StrictTypeChecking, Custom, RaisesException] void uniformMatrix4fv(WebGLUniformLocation location, GLboolean transpose, Float32Array array);
-
-    [StrictTypeChecking, RaisesException] void         useProgram(WebGLProgram program);
-    [StrictTypeChecking, RaisesException] void         validateProgram(WebGLProgram program);
-
-    [StrictTypeChecking] void         vertexAttrib1f(GLuint indx, GLfloat x);
-    [StrictTypeChecking, Custom] void vertexAttrib1fv(GLuint indx, Float32Array values);
-    [StrictTypeChecking] void         vertexAttrib2f(GLuint indx, GLfloat x, GLfloat y);
-    [StrictTypeChecking, Custom] void vertexAttrib2fv(GLuint indx, Float32Array values);
-    [StrictTypeChecking] void         vertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
-    [StrictTypeChecking, Custom] void vertexAttrib3fv(GLuint indx, Float32Array values);
-    [StrictTypeChecking] void         vertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-    [StrictTypeChecking, Custom] void vertexAttrib4fv(GLuint indx, Float32Array values);
-    [StrictTypeChecking, RaisesException] void         vertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, 
-                                                          GLsizei stride, GLintptr offset);
-
-    [StrictTypeChecking] void         viewport(GLint x, GLint y, GLsizei width, GLsizei height);
-};
</del></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLRenderingContextBasecpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp (0 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp                                (rev 0)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -0,0 +1,6353 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include &quot;config.h&quot;
+
+#if ENABLE(WEBGL)
+#include &quot;WebGLRenderingContextBase.h&quot;
+
+#include &quot;ANGLEInstancedArrays.h&quot;
+#include &quot;CachedImage.h&quot;
+#include &quot;DOMWindow.h&quot;
+#include &quot;Document.h&quot;
+#include &quot;EXTBlendMinMax.h&quot;
+#include &quot;EXTFragDepth.h&quot;
+#include &quot;EXTShaderTextureLOD.h&quot;
+#include &quot;EXTTextureFilterAnisotropic.h&quot;
+#include &quot;EXTsRGB.h&quot;
+#include &quot;ExceptionCode.h&quot;
+#include &quot;Extensions3D.h&quot;
+#include &quot;Frame.h&quot;
+#include &quot;FrameLoader.h&quot;
+#include &quot;FrameLoaderClient.h&quot;
+#include &quot;FrameView.h&quot;
+#include &quot;GraphicsContext.h&quot;
+#include &quot;HTMLCanvasElement.h&quot;
+#include &quot;HTMLImageElement.h&quot;
+#include &quot;HTMLVideoElement.h&quot;
+#include &quot;ImageBuffer.h&quot;
+#include &quot;ImageData.h&quot;
+#include &quot;IntSize.h&quot;
+#include &quot;Logging.h&quot;
+#include &quot;MainFrame.h&quot;
+#include &quot;NotImplemented.h&quot;
+#include &quot;OESElementIndexUint.h&quot;
+#include &quot;OESStandardDerivatives.h&quot;
+#include &quot;OESTextureFloat.h&quot;
+#include &quot;OESTextureFloatLinear.h&quot;
+#include &quot;OESTextureHalfFloat.h&quot;
+#include &quot;OESTextureHalfFloatLinear.h&quot;
+#include &quot;OESVertexArrayObject.h&quot;
+#include &quot;Page.h&quot;
+#include &quot;RenderBox.h&quot;
+#include &quot;Settings.h&quot;
+#include &quot;WebGL1RenderingContext.h&quot;
+#include &quot;WebGL2RenderingContext.h&quot;
+#include &quot;WebGLActiveInfo.h&quot;
+#include &quot;WebGLBuffer.h&quot;
+#include &quot;WebGLCompressedTextureATC.h&quot;
+#include &quot;WebGLCompressedTexturePVRTC.h&quot;
+#include &quot;WebGLCompressedTextureS3TC.h&quot;
+#include &quot;WebGLContextAttributes.h&quot;
+#include &quot;WebGLContextEvent.h&quot;
+#include &quot;WebGLContextGroup.h&quot;
+#include &quot;WebGLDebugRendererInfo.h&quot;
+#include &quot;WebGLDebugShaders.h&quot;
+#include &quot;WebGLDepthTexture.h&quot;
+#include &quot;WebGLDrawBuffers.h&quot;
+#include &quot;WebGLFramebuffer.h&quot;
+#include &quot;WebGLLoseContext.h&quot;
+#include &quot;WebGLProgram.h&quot;
+#include &quot;WebGLRenderbuffer.h&quot;
+#include &quot;WebGLShader.h&quot;
+#include &quot;WebGLShaderPrecisionFormat.h&quot;
+#include &quot;WebGLTexture.h&quot;
+#include &quot;WebGLUniformLocation.h&quot;
+
+#include &lt;runtime/JSCInlines.h&gt;
+#include &lt;runtime/TypedArrayInlines.h&gt;
+#include &lt;runtime/Uint32Array.h&gt;
+#include &lt;wtf/StdLibExtras.h&gt;
+#include &lt;wtf/text/CString.h&gt;
+#include &lt;wtf/text/StringBuilder.h&gt;
+
+namespace WebCore {
+
+const double secondsBetweenRestoreAttempts = 1.0;
+const int maxGLErrorsAllowedToConsole = 256;
+
+namespace {
+    
+class ScopedDrawingBufferBinder {
+public:
+    ScopedDrawingBufferBinder(DrawingBuffer* drawingBuffer, WebGLFramebuffer* framebufferBinding)
+        : m_drawingBuffer(drawingBuffer)
+        , m_framebufferBinding(framebufferBinding)
+    {
+        // Commit DrawingBuffer if needed (e.g., for multisampling)
+        if (!m_framebufferBinding &amp;&amp; m_drawingBuffer)
+            m_drawingBuffer-&gt;commit();
+    }
+    
+    ~ScopedDrawingBufferBinder()
+    {
+        // Restore DrawingBuffer if needed
+        if (!m_framebufferBinding &amp;&amp; m_drawingBuffer)
+            m_drawingBuffer-&gt;bind();
+    }
+    
+private:
+    DrawingBuffer* m_drawingBuffer;
+    WebGLFramebuffer* m_framebufferBinding;
+};
+
+Platform3DObject objectOrZero(WebGLObject* object)
+{
+    return object ? object-&gt;object() : 0;
+}
+
+void clip1D(GC3Dint start, GC3Dsizei range, GC3Dsizei sourceRange, GC3Dint* clippedStart, GC3Dsizei* clippedRange)
+{
+    ASSERT(clippedStart &amp;&amp; clippedRange);
+    if (start &lt; 0) {
+        range += start;
+        start = 0;
+    }
+    GC3Dint end = start + range;
+    if (end &gt; sourceRange)
+        range -= end - sourceRange;
+    *clippedStart = start;
+    *clippedRange = range;
+}
+
+// Returns false if no clipping is necessary, i.e., x, y, width, height stay the same.
+bool clip2D(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height,
+            GC3Dsizei sourceWidth, GC3Dsizei sourceHeight,
+            GC3Dint* clippedX, GC3Dint* clippedY, GC3Dsizei* clippedWidth, GC3Dsizei*clippedHeight)
+{
+    ASSERT(clippedX &amp;&amp; clippedY &amp;&amp; clippedWidth &amp;&amp; clippedHeight);
+    clip1D(x, width, sourceWidth, clippedX, clippedWidth);
+    clip1D(y, height, sourceHeight, clippedY, clippedHeight);
+    return (*clippedX != x || *clippedY != y || *clippedWidth != width || *clippedHeight != height);
+}
+
+GC3Dint clamp(GC3Dint value, GC3Dint min, GC3Dint max)
+{
+    if (value &lt; min)
+        value = min;
+    if (value &gt; max)
+        value = max;
+    return value;
+}
+
+// Return true if a character belongs to the ASCII subset as defined in
+// GLSL ES 1.0 spec section 3.1.
+bool validateCharacter(unsigned char c)
+{
+    // Printing characters are valid except &quot; $ ` @ \ ' DEL.
+    if (c &gt;= 32 &amp;&amp; c &lt;= 126
+        &amp;&amp; c != '&quot;' &amp;&amp; c != '$' &amp;&amp; c != '`' &amp;&amp; c != '@' &amp;&amp; c != '\\' &amp;&amp; c != '\'')
+        return true;
+    // Horizontal tab, line feed, vertical tab, form feed, carriage return
+    // are also valid.
+    if (c &gt;= 9 &amp;&amp; c &lt;= 13)
+        return true;
+    return false;
+}
+
+bool isPrefixReserved(const String&amp; name)
+{
+    if (name.startsWith(&quot;gl_&quot;) || name.startsWith(&quot;webgl_&quot;) || name.startsWith(&quot;_webgl_&quot;))
+        return true;
+    return false;
+}
+
+// Strips comments from shader text. This allows non-ASCII characters
+// to be used in comments without potentially breaking OpenGL
+// implementations not expecting characters outside the GLSL ES set.
+class StripComments {
+public:
+    StripComments(const String&amp; str)
+        : m_parseState(BeginningOfLine)
+        , m_sourceString(str)
+        , m_length(str.length())
+        , m_position(0)
+    {
+        parse();
+    }
+    
+    String result()
+    {
+        return m_builder.toString();
+    }
+    
+private:
+    bool hasMoreCharacters() const
+    {
+        return (m_position &lt; m_length);
+    }
+    
+    void parse()
+    {
+        while (hasMoreCharacters()) {
+            process(current());
+            // process() might advance the position.
+            if (hasMoreCharacters())
+                advance();
+        }
+    }
+    
+    void process(UChar);
+    
+    bool peek(UChar&amp; character) const
+    {
+        if (m_position + 1 &gt;= m_length)
+            return false;
+        character = m_sourceString[m_position + 1];
+        return true;
+    }
+    
+    UChar current() const
+    {
+        ASSERT_WITH_SECURITY_IMPLICATION(m_position &lt; m_length);
+        return m_sourceString[m_position];
+    }
+    
+    void advance()
+    {
+        ++m_position;
+    }
+    
+    bool isNewline(UChar character) const
+    {
+        // Don't attempt to canonicalize newline related characters.
+        return (character == '\n' || character == '\r');
+    }
+    
+    void emit(UChar character)
+    {
+        m_builder.append(character);
+    }
+    
+    enum ParseState {
+        // Have not seen an ASCII non-whitespace character yet on
+        // this line. Possible that we might see a preprocessor
+        // directive.
+        BeginningOfLine,
+        
+        // Have seen at least one ASCII non-whitespace character
+        // on this line.
+        MiddleOfLine,
+        
+        // Handling a preprocessor directive. Passes through all
+        // characters up to the end of the line. Disables comment
+        // processing.
+        InPreprocessorDirective,
+        
+        // Handling a single-line comment. The comment text is
+        // replaced with a single space.
+        InSingleLineComment,
+        
+        // Handling a multi-line comment. Newlines are passed
+        // through to preserve line numbers.
+        InMultiLineComment
+    };
+    
+    ParseState m_parseState;
+    String m_sourceString;
+    unsigned m_length;
+    unsigned m_position;
+    StringBuilder m_builder;
+};
+
+void StripComments::process(UChar c)
+{
+    if (isNewline(c)) {
+        // No matter what state we are in, pass through newlines
+        // so we preserve line numbers.
+        emit(c);
+        
+        if (m_parseState != InMultiLineComment)
+            m_parseState = BeginningOfLine;
+        
+        return;
+    }
+    
+    UChar temp = 0;
+    switch (m_parseState) {
+    case BeginningOfLine:
+        if (WTF::isASCIISpace(c)) {
+            emit(c);
+            break;
+        }
+        
+        if (c == '#') {
+            m_parseState = InPreprocessorDirective;
+            emit(c);
+            break;
+        }
+        
+        // Transition to normal state and re-handle character.
+        m_parseState = MiddleOfLine;
+        process(c);
+        break;
+        
+    case MiddleOfLine:
+        if (c == '/' &amp;&amp; peek(temp)) {
+            if (temp == '/') {
+                m_parseState = InSingleLineComment;
+                emit(' ');
+                advance();
+                break;
+            }
+            
+            if (temp == '*') {
+                m_parseState = InMultiLineComment;
+                // Emit the comment start in case the user has
+                // an unclosed comment and we want to later
+                // signal an error.
+                emit('/');
+                emit('*');
+                advance();
+                break;
+            }
+        }
+        
+        emit(c);
+        break;
+        
+    case InPreprocessorDirective:
+        // No matter what the character is, just pass it
+        // through. Do not parse comments in this state. This
+        // might not be the right thing to do long term, but it
+        // should handle the #error preprocessor directive.
+        emit(c);
+        break;
+        
+    case InSingleLineComment:
+        // The newline code at the top of this function takes care
+        // of resetting our state when we get out of the
+        // single-line comment. Swallow all other characters.
+        break;
+        
+    case InMultiLineComment:
+        if (c == '*' &amp;&amp; peek(temp) &amp;&amp; temp == '/') {
+            emit('*');
+            emit('/');
+            m_parseState = MiddleOfLine;
+            advance();
+            break;
+        }
+        
+        // Swallow all other characters. Unclear whether we may
+        // want or need to just emit a space per character to try
+        // to preserve column numbers for debugging purposes.
+        break;
+    }
+}
+} // namespace anonymous
+
+class WebGLRenderingContextLostCallback : public GraphicsContext3D::ContextLostCallback {
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    explicit WebGLRenderingContextLostCallback(WebGLRenderingContextBase* cb) 
+    : m_context(cb) { }
+
+    virtual void onContextLost() override 
+    { 
+        m_context-&gt;forceLostContext(WebGLRenderingContextBase::RealLostContext); 
+    }
+    virtual ~WebGLRenderingContextLostCallback() { }
+private:
+    WebGLRenderingContextBase* m_context;
+};
+
+class WebGLRenderingContextErrorMessageCallback : public GraphicsContext3D::ErrorMessageCallback {
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    explicit WebGLRenderingContextErrorMessageCallback(WebGLRenderingContextBase* cb) 
+    : m_context(cb) { }
+    
+    virtual void onErrorMessage(const String&amp; message, GC3Dint) override
+    {
+        if (m_context-&gt;m_synthesizedErrorsToConsole)
+            m_context-&gt;printGLErrorToConsole(message);
+    }
+    virtual ~WebGLRenderingContextErrorMessageCallback() { }
+private:
+    WebGLRenderingContextBase* m_context;
+};
+
+std::unique_ptr&lt;WebGLRenderingContextBase&gt; WebGLRenderingContextBase::create(HTMLCanvasElement* canvas, WebGLContextAttributes* attrs, const String&amp; type)
+{
+    Document&amp; document = canvas-&gt;document();
+    Frame* frame = document.frame();
+    if (!frame)
+        return nullptr;
+    
+    // The FrameLoaderClient might block creation of a new WebGL context despite the page settings; in
+    // particular, if WebGL contexts were lost one or more times via the GL_ARB_robustness extension.
+    if (!frame-&gt;loader().client().allowWebGL(frame-&gt;settings().webGLEnabled())) {
+        canvas-&gt;dispatchEvent(WebGLContextEvent::create(eventNames().webglcontextcreationerrorEvent, false, true, &quot;Web page was not allowed to create a WebGL context.&quot;));
+        return nullptr;
+    }
+    
+    bool isPendingPolicyResolution = false;
+    Document&amp; topDocument = document.topDocument();
+    Page* page = topDocument.page();
+    if (page &amp;&amp; !topDocument.url().isLocalFile()) {
+        WebGLLoadPolicy policy = page-&gt;mainFrame().loader().client().webGLPolicyForURL(topDocument.url());
+        
+        if (policy == WebGLBlockCreation) {
+            LOG(WebGL, &quot;The policy for this URL (%s) is to block WebGL.&quot;, topDocument.url().host().utf8().data());
+            return nullptr;
+        }
+        
+        if (policy == WebGLPendingCreation) {
+            LOG(WebGL, &quot;WebGL policy is pending. May need to be resolved later.&quot;);
+            isPendingPolicyResolution = true;
+        }
+    }
+    
+    GraphicsContext3D::Attributes attributes = attrs ? attrs-&gt;attributes() : GraphicsContext3D::Attributes();
+    
+    if (attributes.antialias) {
+        if (!frame-&gt;settings().openGLMultisamplingEnabled())
+            attributes.antialias = false;
+    }
+    
+    attributes.noExtensions = true;
+    attributes.shareResources = false;
+    attributes.preferDiscreteGPU = true;
+    
+    if (frame-&gt;settings().forceSoftwareWebGLRendering())
+        attributes.forceSoftwareRenderer = true;
+    
+    if (page)
+        attributes.devicePixelRatio = page-&gt;deviceScaleFactor();
+    
+    if (isPendingPolicyResolution) {
+        LOG(WebGL, &quot;Create a WebGL context that looks real, but will require a policy resolution if used.&quot;);
+        std::unique_ptr&lt;WebGLRenderingContextBase&gt; renderingContext = nil;
+        if (type == &quot;experimental-webgl2&quot;)
+            renderingContext = std::unique_ptr&lt;WebGL2RenderingContext&gt;(new WebGL2RenderingContext(canvas, attributes));
+        else
+            renderingContext = std::unique_ptr&lt;WebGL1RenderingContext&gt;(new WebGL1RenderingContext(canvas, attributes));
+    }
+    
+    HostWindow* hostWindow = document.view()-&gt;root()-&gt;hostWindow();
+    RefPtr&lt;GraphicsContext3D&gt; context(GraphicsContext3D::create(attributes, hostWindow));
+    
+    if (!context || !context-&gt;makeContextCurrent()) {
+        canvas-&gt;dispatchEvent(WebGLContextEvent::create(eventNames().webglcontextcreationerrorEvent, false, true, &quot;Could not create a WebGL context.&quot;));
+        return nullptr;
+    }
+    
+    Extensions3D* extensions = context-&gt;getExtensions();
+    if (extensions-&gt;supports(&quot;GL_EXT_debug_marker&quot;))
+        extensions-&gt;pushGroupMarkerEXT(&quot;WebGLRenderingContext&quot;);
+    
+    std::unique_ptr&lt;WebGLRenderingContextBase&gt; renderingContext = nil;
+    if (type == &quot;experimental-webgl2&quot;)
+        renderingContext = std::unique_ptr&lt;WebGL2RenderingContext&gt;(new WebGL2RenderingContext(canvas, context, attributes));
+    else
+        renderingContext = std::unique_ptr&lt;WebGL1RenderingContext&gt;(new WebGL1RenderingContext(canvas, context, attributes));
+    renderingContext-&gt;suspendIfNeeded();
+    
+    return renderingContext;
+}
+
+WebGLRenderingContextBase::WebGLRenderingContextBase(HTMLCanvasElement* passedCanvas, GraphicsContext3D::Attributes attributes)
+    : CanvasRenderingContext(passedCanvas)
+    , ActiveDOMObject(&amp;passedCanvas-&gt;document())
+    , m_context(0)
+    , m_drawingBuffer(0)
+    , m_dispatchContextLostEventTimer(*this, &amp;WebGLRenderingContextBase::dispatchContextLostEvent)
+    , m_restoreAllowed(false)
+    , m_restoreTimer(*this, &amp;WebGLRenderingContextBase::maybeRestoreContext)
+    , m_generatedImageCache(0)
+    , m_contextLost(false)
+    , m_contextLostMode(SyntheticLostContext)
+    , m_attributes(attributes)
+    , m_synthesizedErrorsToConsole(true)
+    , m_numGLErrorsToConsoleAllowed(maxGLErrorsAllowedToConsole)
+    , m_isPendingPolicyResolution(true)
+    , m_hasRequestedPolicyResolution(false)
+{
+}
+
+WebGLRenderingContextBase::WebGLRenderingContextBase(HTMLCanvasElement* passedCanvas, PassRefPtr&lt;GraphicsContext3D&gt; context,GraphicsContext3D::Attributes attributes)
+    : CanvasRenderingContext(passedCanvas)
+    , ActiveDOMObject(&amp;passedCanvas-&gt;document())
+    , m_context(context)
+    , m_drawingBuffer(0)
+    , m_dispatchContextLostEventTimer(*this, &amp;WebGLRenderingContextBase::dispatchContextLostEvent)
+    , m_restoreAllowed(false)
+    , m_restoreTimer(*this, &amp;WebGLRenderingContextBase::maybeRestoreContext)
+    , m_generatedImageCache(4)
+    , m_contextLost(false)
+    , m_contextLostMode(SyntheticLostContext)
+    , m_attributes(attributes)
+    , m_synthesizedErrorsToConsole(true)
+    , m_numGLErrorsToConsoleAllowed(maxGLErrorsAllowedToConsole)
+    , m_isPendingPolicyResolution(false)
+    , m_hasRequestedPolicyResolution(false)
+{
+    ASSERT(m_context);
+    m_contextGroup = WebGLContextGroup::create();
+    m_contextGroup-&gt;addContext(this);
+    
+    m_maxViewportDims[0] = m_maxViewportDims[1] = 0;
+    m_context-&gt;getIntegerv(GraphicsContext3D::MAX_VIEWPORT_DIMS, m_maxViewportDims);
+    
+    if (m_drawingBuffer)
+        m_drawingBuffer-&gt;bind();
+    
+    setupFlags();
+    initializeNewContext();
+}
+
+void WebGLRenderingContextBase::initializeNewContext()
+{
+    ASSERT(!m_contextLost);
+    m_needsUpdate = true;
+    m_markedCanvasDirty = false;
+    m_activeTextureUnit = 0;
+    m_packAlignment = 4;
+    m_unpackAlignment = 4;
+    m_unpackFlipY = false;
+    m_unpackPremultiplyAlpha = false;
+    m_unpackColorspaceConversion = GraphicsContext3D::BROWSER_DEFAULT_WEBGL;
+    m_boundArrayBuffer = 0;
+    m_currentProgram = 0;
+    m_framebufferBinding = 0;
+    m_renderbufferBinding = 0;
+    m_depthMask = true;
+    m_stencilEnabled = false;
+    m_stencilMask = 0xFFFFFFFF;
+    m_stencilMaskBack = 0xFFFFFFFF;
+    m_stencilFuncRef = 0;
+    m_stencilFuncRefBack = 0;
+    m_stencilFuncMask = 0xFFFFFFFF;
+    m_stencilFuncMaskBack = 0xFFFFFFFF;
+    m_layerCleared = false;
+    m_numGLErrorsToConsoleAllowed = maxGLErrorsAllowedToConsole;
+    
+    m_clearColor[0] = m_clearColor[1] = m_clearColor[2] = m_clearColor[3] = 0;
+    m_scissorEnabled = false;
+    m_clearDepth = 1;
+    m_clearStencil = 0;
+    m_colorMask[0] = m_colorMask[1] = m_colorMask[2] = m_colorMask[3] = true;
+    
+    GC3Dint numCombinedTextureImageUnits = 0;
+    m_context-&gt;getIntegerv(GraphicsContext3D::MAX_COMBINED_TEXTURE_IMAGE_UNITS, &amp;numCombinedTextureImageUnits);
+    m_textureUnits.clear();
+    m_textureUnits.resize(numCombinedTextureImageUnits);
+    
+    GC3Dint numVertexAttribs = 0;
+    m_context-&gt;getIntegerv(GraphicsContext3D::MAX_VERTEX_ATTRIBS, &amp;numVertexAttribs);
+    m_maxVertexAttribs = numVertexAttribs;
+    
+    m_maxTextureSize = 0;
+    m_context-&gt;getIntegerv(GraphicsContext3D::MAX_TEXTURE_SIZE, &amp;m_maxTextureSize);
+    m_maxTextureLevel = WebGLTexture::computeLevelCount(m_maxTextureSize, m_maxTextureSize);
+    m_maxCubeMapTextureSize = 0;
+    m_context-&gt;getIntegerv(GraphicsContext3D::MAX_CUBE_MAP_TEXTURE_SIZE, &amp;m_maxCubeMapTextureSize);
+    m_maxCubeMapTextureLevel = WebGLTexture::computeLevelCount(m_maxCubeMapTextureSize, m_maxCubeMapTextureSize);
+    m_maxRenderbufferSize = 0;
+    m_context-&gt;getIntegerv(GraphicsContext3D::MAX_RENDERBUFFER_SIZE, &amp;m_maxRenderbufferSize);
+    
+    // These two values from EXT_draw_buffers are lazily queried.
+    m_maxDrawBuffers = 0;
+    m_maxColorAttachments = 0;
+    
+    m_backDrawBuffer = GraphicsContext3D::BACK;
+    m_drawBuffersWebGLRequirementsChecked = false;
+    m_drawBuffersSupported = false;
+    
+    m_defaultVertexArrayObject = WebGLVertexArrayObjectOES::create(this, WebGLVertexArrayObjectOES::VaoTypeDefault);
+    addContextObject(m_defaultVertexArrayObject.get());
+    m_boundVertexArrayObject = m_defaultVertexArrayObject;
+    
+    m_vertexAttribValue.resize(m_maxVertexAttribs);
+    
+    if (!isGLES2NPOTStrict())
+        createFallbackBlackTextures1x1();
+    if (!isGLES2Compliant())
+        initVertexAttrib0();
+    
+    IntSize canvasSize = clampedCanvasSize();
+    if (m_drawingBuffer)
+        m_drawingBuffer-&gt;reset(canvasSize);
+    
+    m_context-&gt;reshape(canvasSize.width(), canvasSize.height());
+    m_context-&gt;viewport(0, 0, canvasSize.width(), canvasSize.height());
+    m_context-&gt;scissor(0, 0, canvasSize.width(), canvasSize.height());
+    
+    m_context-&gt;setContextLostCallback(std::make_unique&lt;WebGLRenderingContextLostCallback&gt;(this));
+    m_context-&gt;setErrorMessageCallback(std::make_unique&lt;WebGLRenderingContextErrorMessageCallback&gt;(this));
+}
+
+void WebGLRenderingContextBase::setupFlags()
+{
+    ASSERT(m_context);
+    
+    if (Page* page = canvas()-&gt;document().page())
+        m_synthesizedErrorsToConsole = page-&gt;settings().webGLErrorsToConsoleEnabled();
+    
+    m_isGLES2Compliant = m_context-&gt;isGLES2Compliant();
+    m_isErrorGeneratedOnOutOfBoundsAccesses = m_context-&gt;getExtensions()-&gt;isEnabled(&quot;GL_CHROMIUM_strict_attribs&quot;);
+    m_isResourceSafe = m_context-&gt;getExtensions()-&gt;isEnabled(&quot;GL_CHROMIUM_resource_safe&quot;);
+    if (m_isGLES2Compliant) {
+        m_isGLES2NPOTStrict = !m_context-&gt;getExtensions()-&gt;isEnabled(&quot;GL_OES_texture_npot&quot;);
+        m_isDepthStencilSupported = m_context-&gt;getExtensions()-&gt;isEnabled(&quot;GL_OES_packed_depth_stencil&quot;);
+    } else {
+        m_isGLES2NPOTStrict = !m_context-&gt;getExtensions()-&gt;isEnabled(&quot;GL_ARB_texture_non_power_of_two&quot;);
+        m_isDepthStencilSupported = m_context-&gt;getExtensions()-&gt;isEnabled(&quot;GL_EXT_packed_depth_stencil&quot;);
+    }
+    m_isRobustnessEXTSupported = m_context-&gt;getExtensions()-&gt;isEnabled(&quot;GL_EXT_robustness&quot;);
+}
+
+bool WebGLRenderingContextBase::allowPrivilegedExtensions() const
+{
+    if (Page* page = canvas()-&gt;document().page())
+        return page-&gt;settings().privilegedWebGLExtensionsEnabled();
+    return false;
+}
+
+void WebGLRenderingContextBase::addCompressedTextureFormat(GC3Denum format)
+{
+    if (!m_compressedTextureFormats.contains(format))
+        m_compressedTextureFormats.append(format);
+}
+
+WebGLRenderingContextBase::~WebGLRenderingContextBase()
+{
+    // Remove all references to WebGLObjects so if they are the last reference
+    // they will be freed before the last context is removed from the context group.
+    m_boundArrayBuffer = nullptr;
+    m_defaultVertexArrayObject = nullptr;
+    m_boundVertexArrayObject = nullptr;
+    m_vertexAttrib0Buffer = nullptr;
+    m_currentProgram = nullptr;
+    m_framebufferBinding = nullptr;
+    m_renderbufferBinding = nullptr;
+    
+    for (size_t i = 0; i &lt; m_textureUnits.size(); ++i) {
+        m_textureUnits[i].texture2DBinding = nullptr;
+        m_textureUnits[i].textureCubeMapBinding = nullptr;
+    }
+    
+    m_blackTexture2D = nullptr;
+    m_blackTextureCubeMap = nullptr;
+    
+    if (!m_isPendingPolicyResolution) {
+        detachAndRemoveAllObjects();
+        destroyGraphicsContext3D();
+        m_contextGroup-&gt;removeContext(this);
+    }
+}
+
+void WebGLRenderingContextBase::destroyGraphicsContext3D()
+{
+    if (m_isPendingPolicyResolution)
+        return;
+    
+    // The drawing buffer holds a context reference. It must also be destroyed
+    // in order for the context to be released.
+    if (m_drawingBuffer)
+        m_drawingBuffer.clear();
+    
+    if (m_context) {
+        m_context-&gt;setContextLostCallback(nullptr);
+        m_context-&gt;setErrorMessageCallback(nullptr);
+        m_context.clear();
+    }
+}
+
+void WebGLRenderingContextBase::markContextChanged()
+{
+    if (m_framebufferBinding)
+        return;
+    
+    m_context-&gt;markContextChanged();
+    
+    if (m_drawingBuffer)
+        m_drawingBuffer-&gt;markContentsChanged();
+    
+    m_layerCleared = false;
+    RenderBox* renderBox = canvas()-&gt;renderBox();
+    if (isAccelerated() &amp;&amp; renderBox &amp;&amp; renderBox-&gt;hasAcceleratedCompositing()) {
+        m_markedCanvasDirty = true;
+        canvas()-&gt;clearCopiedImage();
+        renderBox-&gt;contentChanged(CanvasChanged);
+    } else {
+        if (!m_markedCanvasDirty) {
+            m_markedCanvasDirty = true;
+            canvas()-&gt;didDraw(FloatRect(FloatPoint(0, 0), clampedCanvasSize()));
+        }
+    }
+}
+
+bool WebGLRenderingContextBase::clearIfComposited(GC3Dbitfield mask)
+{
+    if (isContextLostOrPending())
+        return false;
+    
+    if (!m_context-&gt;layerComposited() || m_layerCleared
+        || m_attributes.preserveDrawingBuffer || (mask &amp;&amp; m_framebufferBinding))
+        return false;
+    
+    RefPtr&lt;WebGLContextAttributes&gt; contextAttributes = getContextAttributes();
+    
+    // Determine if it's possible to combine the clear the user asked for and this clear.
+    bool combinedClear = mask &amp;&amp; !m_scissorEnabled;
+    
+    m_context-&gt;disable(GraphicsContext3D::SCISSOR_TEST);
+    if (combinedClear &amp;&amp; (mask &amp; GraphicsContext3D::COLOR_BUFFER_BIT)) {
+        m_context-&gt;clearColor(m_colorMask[0] ? m_clearColor[0] : 0,
+                              m_colorMask[1] ? m_clearColor[1] : 0,
+                              m_colorMask[2] ? m_clearColor[2] : 0,
+                              m_colorMask[3] ? m_clearColor[3] : 0);
+    } else
+        m_context-&gt;clearColor(0, 0, 0, 0);
+    m_context-&gt;colorMask(true, true, true, true);
+    GC3Dbitfield clearMask = GraphicsContext3D::COLOR_BUFFER_BIT;
+    if (contextAttributes-&gt;depth()) {
+        if (!combinedClear || !m_depthMask || !(mask &amp; GraphicsContext3D::DEPTH_BUFFER_BIT))
+            m_context-&gt;clearDepth(1.0f);
+        clearMask |= GraphicsContext3D::DEPTH_BUFFER_BIT;
+        m_context-&gt;depthMask(true);
+    }
+    if (contextAttributes-&gt;stencil()) {
+        if (combinedClear &amp;&amp; (mask &amp; GraphicsContext3D::STENCIL_BUFFER_BIT))
+            m_context-&gt;clearStencil(m_clearStencil &amp; m_stencilMask);
+        else
+            m_context-&gt;clearStencil(0);
+        clearMask |= GraphicsContext3D::STENCIL_BUFFER_BIT;
+        m_context-&gt;stencilMaskSeparate(GraphicsContext3D::FRONT, 0xFFFFFFFF);
+    }
+    if (m_drawingBuffer)
+        m_drawingBuffer-&gt;clearFramebuffers(clearMask);
+    else {
+        if (m_framebufferBinding)
+            m_context-&gt;bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, 0);
+        m_context-&gt;clear(clearMask);
+    }
+    
+    restoreStateAfterClear();
+    if (m_framebufferBinding)
+        m_context-&gt;bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, objectOrZero(m_framebufferBinding.get()));
+    m_layerCleared = true;
+    
+    return combinedClear;
+}
+
+void WebGLRenderingContextBase::restoreStateAfterClear()
+{
+    // Restore the state that the context set.
+    if (m_scissorEnabled)
+        m_context-&gt;enable(GraphicsContext3D::SCISSOR_TEST);
+    m_context-&gt;clearColor(m_clearColor[0], m_clearColor[1],
+                          m_clearColor[2], m_clearColor[3]);
+    m_context-&gt;colorMask(m_colorMask[0], m_colorMask[1],
+                         m_colorMask[2], m_colorMask[3]);
+    m_context-&gt;clearDepth(m_clearDepth);
+    m_context-&gt;clearStencil(m_clearStencil);
+    m_context-&gt;stencilMaskSeparate(GraphicsContext3D::FRONT, m_stencilMask);
+    m_context-&gt;depthMask(m_depthMask);
+}
+
+void WebGLRenderingContextBase::markLayerComposited()
+{
+    if (isContextLostOrPending())
+        return;
+    m_context-&gt;markLayerComposited();
+}
+
+void WebGLRenderingContextBase::paintRenderingResultsToCanvas()
+{
+    if (isContextLostOrPending())
+        return;
+    
+    if (canvas()-&gt;document().printing())
+        canvas()-&gt;clearPresentationCopy();
+    
+    // Until the canvas is written to by the application, the clear that
+    // happened after it was composited should be ignored by the compositor.
+    if (m_context-&gt;layerComposited() &amp;&amp; !m_attributes.preserveDrawingBuffer) {
+        m_context-&gt;paintCompositedResultsToCanvas(canvas()-&gt;buffer());
+        
+        canvas()-&gt;makePresentationCopy();
+    } else
+        canvas()-&gt;clearPresentationCopy();
+    clearIfComposited();
+    
+    if (!m_markedCanvasDirty &amp;&amp; !m_layerCleared)
+        return;
+    
+    canvas()-&gt;clearCopiedImage();
+    m_markedCanvasDirty = false;
+    
+    if (m_drawingBuffer)
+        m_drawingBuffer-&gt;commit();
+    m_context-&gt;paintRenderingResultsToCanvas(canvas()-&gt;buffer(), m_drawingBuffer.get());
+    
+    if (m_drawingBuffer) {
+        if (m_framebufferBinding)
+            m_context-&gt;bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, objectOrZero(m_framebufferBinding.get()));
+        else
+            m_drawingBuffer-&gt;bind();
+    }
+}
+
+PassRefPtr&lt;ImageData&gt; WebGLRenderingContextBase::paintRenderingResultsToImageData()
+{
+    if (isContextLostOrPending())
+        return nullptr;
+    clearIfComposited();
+    if (m_drawingBuffer)
+        m_drawingBuffer-&gt;commit();
+    RefPtr&lt;ImageData&gt; imageData = m_context-&gt;paintRenderingResultsToImageData(m_drawingBuffer.get());
+    
+    if (m_drawingBuffer) {
+        if (m_framebufferBinding)
+            m_context-&gt;bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, objectOrZero(m_framebufferBinding.get()));
+        else
+            m_drawingBuffer-&gt;bind();
+    }
+    
+    return imageData;
+}
+
+void WebGLRenderingContextBase::reshape(int width, int height)
+{
+    if (isContextLostOrPending())
+        return;
+    
+    // This is an approximation because at WebGLRenderingContext level we don't
+    // know if the underlying FBO uses textures or renderbuffers.
+    GC3Dint maxSize = std::min(m_maxTextureSize, m_maxRenderbufferSize);
+    // Limit drawing buffer size to 4k to avoid memory exhaustion.
+    const int sizeUpperLimit = 4096;
+    maxSize = std::min(maxSize, sizeUpperLimit);
+    GC3Dint maxWidth = std::min(maxSize, m_maxViewportDims[0]);
+    GC3Dint maxHeight = std::min(maxSize, m_maxViewportDims[1]);
+    width = clamp(width, 1, maxWidth);
+    height = clamp(height, 1, maxHeight);
+    
+    if (m_needsUpdate) {
+        RenderBox* renderBox = canvas()-&gt;renderBox();
+        if (renderBox &amp;&amp; renderBox-&gt;hasAcceleratedCompositing())
+            renderBox-&gt;contentChanged(CanvasChanged);
+        m_needsUpdate = false;
+    }
+    
+    // We don't have to mark the canvas as dirty, since the newly created image buffer will also start off
+    // clear (and this matches what reshape will do).
+    if (m_drawingBuffer) {
+        m_drawingBuffer-&gt;reset(IntSize(width, height));
+        restoreStateAfterClear();
+    } else
+        m_context-&gt;reshape(width, height);
+    
+    m_context-&gt;bindTexture(GraphicsContext3D::TEXTURE_2D, objectOrZero(m_textureUnits[m_activeTextureUnit].texture2DBinding.get()));
+    m_context-&gt;bindRenderbuffer(GraphicsContext3D::RENDERBUFFER, objectOrZero(m_renderbufferBinding.get()));
+    if (m_framebufferBinding)
+        m_context-&gt;bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, objectOrZero(m_framebufferBinding.get()));
+}
+
+int WebGLRenderingContextBase::drawingBufferWidth() const
+{
+    if (m_drawingBuffer)
+        return m_drawingBuffer-&gt;size().width();
+    
+    return m_context-&gt;getInternalFramebufferSize().width();
+}
+
+int WebGLRenderingContextBase::drawingBufferHeight() const
+{
+    if (m_drawingBuffer)
+        return m_drawingBuffer-&gt;size().height();
+    
+    return m_context-&gt;getInternalFramebufferSize().height();
+}
+
+unsigned WebGLRenderingContextBase::sizeInBytes(GC3Denum type)
+{
+    switch (type) {
+    case GraphicsContext3D::BYTE:
+        return sizeof(GC3Dbyte);
+    case GraphicsContext3D::UNSIGNED_BYTE:
+        return sizeof(GC3Dubyte);
+    case GraphicsContext3D::SHORT:
+        return sizeof(GC3Dshort);
+    case GraphicsContext3D::UNSIGNED_SHORT:
+        return sizeof(GC3Dushort);
+    case GraphicsContext3D::INT:
+        return sizeof(GC3Dint);
+    case GraphicsContext3D::UNSIGNED_INT:
+        return sizeof(GC3Duint);
+    case GraphicsContext3D::FLOAT:
+        return sizeof(GC3Dfloat);
+    }
+    ASSERT_NOT_REACHED();
+    return 0;
+}
+
+void WebGLRenderingContextBase::activeTexture(GC3Denum texture, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return;
+    if (texture - GraphicsContext3D::TEXTURE0 &gt;= m_textureUnits.size()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;activeTexture&quot;, &quot;texture unit out of range&quot;);
+        return;
+    }
+    m_activeTextureUnit = texture - GraphicsContext3D::TEXTURE0;
+    m_context-&gt;activeTexture(texture);
+    
+    if (m_drawingBuffer)
+        m_drawingBuffer-&gt;setActiveTextureUnit(texture);
+}
+
+void WebGLRenderingContextBase::attachShader(WebGLProgram* program, WebGLShader* shader, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateWebGLObject(&quot;attachShader&quot;, program) || !validateWebGLObject(&quot;attachShader&quot;, shader))
+        return;
+    if (!program-&gt;attachShader(shader)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;attachShader&quot;, &quot;shader attachment already has shader&quot;);
+        return;
+    }
+    m_context-&gt;attachShader(objectOrZero(program), objectOrZero(shader));
+    shader-&gt;onAttached();
+}
+
+void WebGLRenderingContextBase::bindAttribLocation(WebGLProgram* program, GC3Duint index, const String&amp; name, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateWebGLObject(&quot;bindAttribLocation&quot;, program))
+        return;
+    if (!validateLocationLength(&quot;bindAttribLocation&quot;, name))
+        return;
+    if (!validateString(&quot;bindAttribLocation&quot;, name))
+        return;
+    if (isPrefixReserved(name)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;bindAttribLocation&quot;, &quot;reserved prefix&quot;);
+        return;
+    }
+    if (index &gt;= m_maxVertexAttribs) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bindAttribLocation&quot;, &quot;index out of range&quot;);
+        return;
+    }
+    m_context-&gt;bindAttribLocation(objectOrZero(program), index, name);
+}
+
+bool WebGLRenderingContextBase::checkObjectToBeBound(const char* functionName, WebGLObject* object, bool&amp; deleted)
+{
+    deleted = false;
+    if (isContextLostOrPending())
+        return false;
+    if (object) {
+        if (!object-&gt;validate(contextGroup(), this)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;object not from this context&quot;);
+            return false;
+        }
+        deleted = !object-&gt;object();
+    }
+    return true;
+}
+
+void WebGLRenderingContextBase::bindBuffer(GC3Denum target, WebGLBuffer* buffer, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    bool deleted;
+    if (!checkObjectToBeBound(&quot;bindBuffer&quot;, buffer, deleted))
+        return;
+    if (deleted)
+        buffer = 0;
+    if (buffer &amp;&amp; buffer-&gt;getTarget() &amp;&amp; buffer-&gt;getTarget() != target) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;bindBuffer&quot;, &quot;buffers can not be used with multiple targets&quot;);
+        return;
+    }
+    if (target == GraphicsContext3D::ARRAY_BUFFER)
+        m_boundArrayBuffer = buffer;
+    else if (target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER)
+        m_boundVertexArrayObject-&gt;setElementArrayBuffer(buffer);
+    else {
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;bindBuffer&quot;, &quot;invalid target&quot;);
+        return;
+    }
+    
+    m_context-&gt;bindBuffer(target, objectOrZero(buffer));
+    if (buffer)
+        buffer-&gt;setTarget(target);
+}
+
+void WebGLRenderingContextBase::bindFramebuffer(GC3Denum target, WebGLFramebuffer* buffer, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    bool deleted;
+    if (!checkObjectToBeBound(&quot;bindFramebuffer&quot;, buffer, deleted))
+        return;
+    if (deleted)
+        buffer = 0;
+    if (target != GraphicsContext3D::FRAMEBUFFER) {
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;bindFramebuffer&quot;, &quot;invalid target&quot;);
+        return;
+    }
+    m_framebufferBinding = buffer;
+    if (m_drawingBuffer)
+        m_drawingBuffer-&gt;setFramebufferBinding(objectOrZero(m_framebufferBinding.get()));
+    if (!m_framebufferBinding &amp;&amp; m_drawingBuffer) {
+        // Instead of binding fb 0, bind the drawing buffer.
+        m_drawingBuffer-&gt;bind();
+    } else
+        m_context-&gt;bindFramebuffer(target, objectOrZero(buffer));
+    if (buffer)
+        buffer-&gt;setHasEverBeenBound();
+    applyStencilTest();
+}
+
+void WebGLRenderingContextBase::bindRenderbuffer(GC3Denum target, WebGLRenderbuffer* renderBuffer, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    bool deleted;
+    if (!checkObjectToBeBound(&quot;bindRenderbuffer&quot;, renderBuffer, deleted))
+        return;
+    if (deleted)
+        renderBuffer = 0;
+    if (target != GraphicsContext3D::RENDERBUFFER) {
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;bindRenderbuffer&quot;, &quot;invalid target&quot;);
+        return;
+    }
+    m_renderbufferBinding = renderBuffer;
+    m_context-&gt;bindRenderbuffer(target, objectOrZero(renderBuffer));
+    if (renderBuffer)
+        renderBuffer-&gt;setHasEverBeenBound();
+}
+
+void WebGLRenderingContextBase::bindTexture(GC3Denum target, WebGLTexture* texture, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    bool deleted;
+    if (!checkObjectToBeBound(&quot;bindTexture&quot;, texture, deleted))
+        return;
+    if (deleted)
+        texture = 0;
+    if (texture &amp;&amp; texture-&gt;getTarget() &amp;&amp; texture-&gt;getTarget() != target) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;bindTexture&quot;, &quot;textures can not be used with multiple targets&quot;);
+        return;
+    }
+    GC3Dint maxLevel = 0;
+    if (target == GraphicsContext3D::TEXTURE_2D) {
+        m_textureUnits[m_activeTextureUnit].texture2DBinding = texture;
+        maxLevel = m_maxTextureLevel;
+        
+        if (m_drawingBuffer &amp;&amp; !m_activeTextureUnit)
+            m_drawingBuffer-&gt;setTexture2DBinding(objectOrZero(texture));
+        
+    } else if (target == GraphicsContext3D::TEXTURE_CUBE_MAP) {
+        m_textureUnits[m_activeTextureUnit].textureCubeMapBinding = texture;
+        maxLevel = m_maxCubeMapTextureLevel;
+    } else {
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;bindTexture&quot;, &quot;invalid target&quot;);
+        return;
+    }
+    m_context-&gt;bindTexture(target, objectOrZero(texture));
+    if (texture)
+        texture-&gt;setTarget(target, maxLevel);
+    
+    // Note: previously we used to automatically set the TEXTURE_WRAP_R
+    // repeat mode to CLAMP_TO_EDGE for cube map textures, because OpenGL
+    // ES 2.0 doesn't expose this flag (a bug in the specification) and
+    // otherwise the application has no control over the seams in this
+    // dimension. However, it appears that supporting this properly on all
+    // platforms is fairly involved (will require a HashMap from texture ID
+    // in all ports), and we have not had any complaints, so the logic has
+    // been removed.
+}
+
+void WebGLRenderingContextBase::blendColor(GC3Dfloat red, GC3Dfloat green, GC3Dfloat blue, GC3Dfloat alpha)
+{
+    if (isContextLostOrPending())
+        return;
+    m_context-&gt;blendColor(red, green, blue, alpha);
+}
+
+void WebGLRenderingContextBase::blendEquation(GC3Denum mode)
+{
+    if (isContextLostOrPending() || !validateBlendEquation(&quot;blendEquation&quot;, mode))
+        return;
+    m_context-&gt;blendEquation(mode);
+}
+
+void WebGLRenderingContextBase::blendEquationSeparate(GC3Denum modeRGB, GC3Denum modeAlpha)
+{
+    if (isContextLostOrPending() || !validateBlendEquation(&quot;blendEquation&quot;, modeRGB) || !validateBlendEquation(&quot;blendEquation&quot;, modeAlpha))
+        return;
+    m_context-&gt;blendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+void WebGLRenderingContextBase::blendFunc(GC3Denum sfactor, GC3Denum dfactor)
+{
+    if (isContextLostOrPending() || !validateBlendFuncFactors(&quot;blendFunc&quot;, sfactor, dfactor))
+        return;
+    m_context-&gt;blendFunc(sfactor, dfactor);
+}
+
+void WebGLRenderingContextBase::blendFuncSeparate(GC3Denum srcRGB, GC3Denum dstRGB, GC3Denum srcAlpha, GC3Denum dstAlpha)
+{
+    // Note: Alpha does not have the same restrictions as RGB.
+    if (isContextLostOrPending() || !validateBlendFuncFactors(&quot;blendFunc&quot;, srcRGB, dstRGB))
+        return;
+    m_context-&gt;blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+void WebGLRenderingContextBase::bufferData(GC3Denum target, long long size, GC3Denum usage, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return;
+    WebGLBuffer* buffer = validateBufferDataParameters(&quot;bufferData&quot;, target, usage);
+    if (!buffer)
+        return;
+    if (size &lt; 0) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferData&quot;, &quot;size &lt; 0&quot;);
+        return;
+    }
+    if (!size) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferData&quot;, &quot;size == 0&quot;);
+        return;
+    }
+    if (!isErrorGeneratedOnOutOfBoundsAccesses()) {
+        if (!buffer-&gt;associateBufferData(static_cast&lt;GC3Dsizeiptr&gt;(size))) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferData&quot;, &quot;invalid buffer&quot;);
+            return;
+        }
+    }
+    
+    m_context-&gt;moveErrorsToSyntheticErrorList();
+    m_context-&gt;bufferData(target, static_cast&lt;GC3Dsizeiptr&gt;(size), usage);
+    if (m_context-&gt;moveErrorsToSyntheticErrorList()) {
+        // The bufferData function failed. Tell the buffer it doesn't have the data it thinks it does.
+        buffer-&gt;disassociateBufferData();
+    }
+}
+
+void WebGLRenderingContextBase::bufferData(GC3Denum target, ArrayBuffer* data, GC3Denum usage, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return;
+    WebGLBuffer* buffer = validateBufferDataParameters(&quot;bufferData&quot;, target, usage);
+    if (!buffer)
+        return;
+    if (!data) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferData&quot;, &quot;no data&quot;);
+        return;
+    }
+    if (!isErrorGeneratedOnOutOfBoundsAccesses()) {
+        if (!buffer-&gt;associateBufferData(data)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferData&quot;, &quot;invalid buffer&quot;);
+            return;
+        }
+    }
+    
+    m_context-&gt;moveErrorsToSyntheticErrorList();
+    m_context-&gt;bufferData(target, data-&gt;byteLength(), data-&gt;data(), usage);
+    if (m_context-&gt;moveErrorsToSyntheticErrorList()) {
+        // The bufferData function failed. Tell the buffer it doesn't have the data it thinks it does.
+        buffer-&gt;disassociateBufferData();
+    }
+}
+
+void WebGLRenderingContextBase::bufferData(GC3Denum target, ArrayBufferView* data, GC3Denum usage, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return;
+    WebGLBuffer* buffer = validateBufferDataParameters(&quot;bufferData&quot;, target, usage);
+    if (!buffer)
+        return;
+    if (!data) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferData&quot;, &quot;no data&quot;);
+        return;
+    }
+    if (!isErrorGeneratedOnOutOfBoundsAccesses()) {
+        if (!buffer-&gt;associateBufferData(data)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferData&quot;, &quot;invalid buffer&quot;);
+            return;
+        }
+    }
+    
+    m_context-&gt;moveErrorsToSyntheticErrorList();
+    m_context-&gt;bufferData(target, data-&gt;byteLength(), data-&gt;baseAddress(), usage);
+    if (m_context-&gt;moveErrorsToSyntheticErrorList()) {
+        // The bufferData function failed. Tell the buffer it doesn't have the data it thinks it does.
+        buffer-&gt;disassociateBufferData();
+    }
+}
+
+void WebGLRenderingContextBase::bufferSubData(GC3Denum target, long long offset, ArrayBuffer* data, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return;
+    WebGLBuffer* buffer = validateBufferDataParameters(&quot;bufferSubData&quot;, target, GraphicsContext3D::STATIC_DRAW);
+    if (!buffer)
+        return;
+    if (offset &lt; 0) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferSubData&quot;, &quot;offset &lt; 0&quot;);
+        return;
+    }
+    if (!data)
+        return;
+    if (!isErrorGeneratedOnOutOfBoundsAccesses()) {
+        if (!buffer-&gt;associateBufferSubData(static_cast&lt;GC3Dintptr&gt;(offset), data)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferSubData&quot;, &quot;offset out of range&quot;);
+            return;
+        }
+    }
+    
+    m_context-&gt;moveErrorsToSyntheticErrorList();
+    m_context-&gt;bufferSubData(target, static_cast&lt;GC3Dintptr&gt;(offset), data-&gt;byteLength(), data-&gt;data());
+    if (m_context-&gt;moveErrorsToSyntheticErrorList()) {
+        // The bufferSubData function failed. Tell the buffer it doesn't have the data it thinks it does.
+        buffer-&gt;disassociateBufferData();
+    }
+}
+
+void WebGLRenderingContextBase::bufferSubData(GC3Denum target, long long offset, ArrayBufferView* data, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return;
+    WebGLBuffer* buffer = validateBufferDataParameters(&quot;bufferSubData&quot;, target, GraphicsContext3D::STATIC_DRAW);
+    if (!buffer)
+        return;
+    if (offset &lt; 0) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferSubData&quot;, &quot;offset &lt; 0&quot;);
+        return;
+    }
+    if (!data)
+        return;
+    if (!isErrorGeneratedOnOutOfBoundsAccesses()) {
+        if (!buffer-&gt;associateBufferSubData(static_cast&lt;GC3Dintptr&gt;(offset), data)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;bufferSubData&quot;, &quot;offset out of range&quot;);
+            return;
+        }
+    }
+    
+    m_context-&gt;moveErrorsToSyntheticErrorList();
+    m_context-&gt;bufferSubData(target, static_cast&lt;GC3Dintptr&gt;(offset), data-&gt;byteLength(), data-&gt;baseAddress());
+    if (m_context-&gt;moveErrorsToSyntheticErrorList()) {
+        // The bufferSubData function failed. Tell the buffer it doesn't have the data it thinks it does.
+        buffer-&gt;disassociateBufferData();
+    }
+}
+
+GC3Denum WebGLRenderingContextBase::checkFramebufferStatus(GC3Denum target)
+{
+    if (isContextLostOrPending())
+        return GraphicsContext3D::FRAMEBUFFER_UNSUPPORTED;
+    if (target != GraphicsContext3D::FRAMEBUFFER) {
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;checkFramebufferStatus&quot;, &quot;invalid target&quot;);
+        return 0;
+    }
+    if (!m_framebufferBinding || !m_framebufferBinding-&gt;object())
+        return GraphicsContext3D::FRAMEBUFFER_COMPLETE;
+    const char* reason = &quot;framebuffer incomplete&quot;;
+    GC3Denum result = m_framebufferBinding-&gt;checkStatus(&amp;reason);
+    if (result != GraphicsContext3D::FRAMEBUFFER_COMPLETE) {
+        printGLWarningToConsole(&quot;checkFramebufferStatus&quot;, reason);
+        return result;
+    }
+    result = m_context-&gt;checkFramebufferStatus(target);
+    return result;
+}
+
+void WebGLRenderingContextBase::clear(GC3Dbitfield mask)
+{
+    if (isContextLostOrPending())
+        return;
+    if (mask &amp; ~(GraphicsContext3D::COLOR_BUFFER_BIT | GraphicsContext3D::DEPTH_BUFFER_BIT | GraphicsContext3D::STENCIL_BUFFER_BIT)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;clear&quot;, &quot;invalid mask&quot;);
+        return;
+    }
+    const char* reason = &quot;framebuffer incomplete&quot;;
+    if (m_framebufferBinding &amp;&amp; !m_framebufferBinding-&gt;onAccess(graphicsContext3D(), !isResourceSafe(), &amp;reason)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, &quot;clear&quot;, reason);
+        return;
+    }
+    if (!clearIfComposited(mask))
+        m_context-&gt;clear(mask);
+    markContextChanged();
+}
+
+void WebGLRenderingContextBase::clearColor(GC3Dfloat r, GC3Dfloat g, GC3Dfloat b, GC3Dfloat a)
+{
+    if (isContextLostOrPending())
+        return;
+    if (std::isnan(r))
+        r = 0;
+    if (std::isnan(g))
+        g = 0;
+    if (std::isnan(b))
+        b = 0;
+    if (std::isnan(a))
+        a = 1;
+    m_clearColor[0] = r;
+    m_clearColor[1] = g;
+    m_clearColor[2] = b;
+    m_clearColor[3] = a;
+    m_context-&gt;clearColor(r, g, b, a);
+}
+
+void WebGLRenderingContextBase::clearDepth(GC3Dfloat depth)
+{
+    if (isContextLostOrPending())
+        return;
+    m_clearDepth = depth;
+    m_context-&gt;clearDepth(depth);
+}
+
+void WebGLRenderingContextBase::clearStencil(GC3Dint s)
+{
+    if (isContextLostOrPending())
+        return;
+    m_clearStencil = s;
+    m_context-&gt;clearStencil(s);
+}
+
+void WebGLRenderingContextBase::colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboolean alpha)
+{
+    if (isContextLostOrPending())
+        return;
+    m_colorMask[0] = red;
+    m_colorMask[1] = green;
+    m_colorMask[2] = blue;
+    m_colorMask[3] = alpha;
+    m_context-&gt;colorMask(red, green, blue, alpha);
+}
+
+void WebGLRenderingContextBase::compileShader(WebGLShader* shader, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateWebGLObject(&quot;compileShader&quot;, shader))
+        return;
+    m_context-&gt;compileShader(objectOrZero(shader));
+    GC3Dint value;
+    m_context-&gt;getShaderiv(objectOrZero(shader), GraphicsContext3D::COMPILE_STATUS, &amp;value);
+    shader-&gt;setValid(value);
+}
+
+void WebGLRenderingContextBase::compressedTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width,
+                                                     GC3Dsizei height, GC3Dint border, ArrayBufferView* data)
+{
+    if (isContextLostOrPending())
+        return;
+    if (!validateTexFuncLevel(&quot;compressedTexImage2D&quot;, target, level))
+        return;
+    
+    if (!validateCompressedTexFormat(internalformat)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;compressedTexImage2D&quot;, &quot;invalid internalformat&quot;);
+        return;
+    }
+    if (border) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;compressedTexImage2D&quot;, &quot;border not 0&quot;);
+        return;
+    }
+    if (!validateCompressedTexDimensions(&quot;compressedTexImage2D&quot;, target, level, width, height, internalformat))
+        return;
+    if (!validateCompressedTexFuncData(&quot;compressedTexImage2D&quot;, width, height, internalformat, data))
+        return;
+    
+    WebGLTexture* tex = validateTextureBinding(&quot;compressedTexImage2D&quot;, target, true);
+    if (!tex)
+        return;
+    if (!isGLES2NPOTStrict()) {
+        if (level &amp;&amp; WebGLTexture::isNPOT(width, height)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;compressedTexImage2D&quot;, &quot;level &gt; 0 not power of 2&quot;);
+            return;
+        }
+    }
+    m_context-&gt;moveErrorsToSyntheticErrorList();
+    m_context-&gt;compressedTexImage2D(target, level, internalformat, width, height,
+                                    border, data-&gt;byteLength(), data-&gt;baseAddress());
+    if (m_context-&gt;moveErrorsToSyntheticErrorList()) {
+        // The compressedTexImage2D function failed. Tell the WebGLTexture it doesn't have the data for this level.
+        tex-&gt;markInvalid(target, level);
+        return;
+    }
+    
+    tex-&gt;setLevelInfo(target, level, internalformat, width, height, GraphicsContext3D::UNSIGNED_BYTE);
+    tex-&gt;setCompressed();
+}
+
+void WebGLRenderingContextBase::compressedTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
+                                                        GC3Dsizei width, GC3Dsizei height, GC3Denum format, ArrayBufferView* data)
+{
+    if (isContextLostOrPending())
+        return;
+    if (!validateTexFuncLevel(&quot;compressedTexSubImage2D&quot;, target, level))
+        return;
+    if (!validateCompressedTexFormat(format)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;compressedTexSubImage2D&quot;, &quot;invalid format&quot;);
+        return;
+    }
+    if (!validateCompressedTexFuncData(&quot;compressedTexSubImage2D&quot;, width, height, format, data))
+        return;
+    
+    WebGLTexture* tex = validateTextureBinding(&quot;compressedTexSubImage2D&quot;, target, true);
+    if (!tex)
+        return;
+    
+    if (format != tex-&gt;getInternalFormat(target, level)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;compressedTexSubImage2D&quot;, &quot;format does not match texture format&quot;);
+        return;
+    }
+    
+    if (!validateCompressedTexSubDimensions(&quot;compressedTexSubImage2D&quot;, target, level, xoffset, yoffset, width, height, format, tex))
+        return;
+    
+    graphicsContext3D()-&gt;compressedTexSubImage2D(target, level, xoffset, yoffset,
+                                                 width, height, format, data-&gt;byteLength(), data-&gt;baseAddress());
+    tex-&gt;setCompressed();
+}
+
+bool WebGLRenderingContextBase::validateSettableTexFormat(const char* functionName, GC3Denum format)
+{
+    if (GraphicsContext3D::getClearBitsByFormat(format) &amp; (GraphicsContext3D::DEPTH_BUFFER_BIT | GraphicsContext3D::STENCIL_BUFFER_BIT)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;format can not be set, only rendered to&quot;);
+        return false;
+    }
+    return true;
+}
+
+void WebGLRenderingContextBase::copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border)
+{
+    if (isContextLostOrPending())
+        return;
+    if (!validateTexFuncParameters(&quot;copyTexImage2D&quot;, NotTexSubImage2D, target, level, internalformat, width, height, border, internalformat, GraphicsContext3D::UNSIGNED_BYTE))
+        return;
+    if (!validateSettableTexFormat(&quot;copyTexImage2D&quot;, internalformat))
+        return;
+    WebGLTexture* tex = validateTextureBinding(&quot;copyTexImage2D&quot;, target, true);
+    if (!tex)
+        return;
+    if (!isTexInternalFormatColorBufferCombinationValid(internalformat, getBoundFramebufferColorFormat())) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;copyTexImage2D&quot;, &quot;framebuffer is incompatible format&quot;);
+        return;
+    }
+    if (!isGLES2NPOTStrict() &amp;&amp; level &amp;&amp; WebGLTexture::isNPOT(width, height)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;copyTexImage2D&quot;, &quot;level &gt; 0 not power of 2&quot;);
+        return;
+    }
+    const char* reason = &quot;framebuffer incomplete&quot;;
+    if (m_framebufferBinding &amp;&amp; !m_framebufferBinding-&gt;onAccess(graphicsContext3D(), !isResourceSafe(), &amp;reason)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, &quot;copyTexImage2D&quot;, reason);
+        return;
+    }
+    clearIfComposited();
+    if (isResourceSafe()) {
+        ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding.get());
+        m_context-&gt;copyTexImage2D(target, level, internalformat, x, y, width, height, border);
+    } else {
+        ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding.get());
+        GC3Dint clippedX, clippedY;
+        GC3Dsizei clippedWidth, clippedHeight;
+        if (clip2D(x, y, width, height, getBoundFramebufferWidth(), getBoundFramebufferHeight(), &amp;clippedX, &amp;clippedY, &amp;clippedWidth, &amp;clippedHeight)) {
+            m_context-&gt;texImage2DResourceSafe(target, level, internalformat, width, height, border,
+                                              internalformat, GraphicsContext3D::UNSIGNED_BYTE, m_unpackAlignment);
+            if (clippedWidth &gt; 0 &amp;&amp; clippedHeight &gt; 0) {
+                m_context-&gt;copyTexSubImage2D(target, level, clippedX - x, clippedY - y,
+                                             clippedX, clippedY, clippedWidth, clippedHeight);
+            }
+        } else
+            m_context-&gt;copyTexImage2D(target, level, internalformat, x, y, width, height, border);
+    }
+    // FIXME: if the framebuffer is not complete, none of the below should be executed.
+    tex-&gt;setLevelInfo(target, level, internalformat, width, height, GraphicsContext3D::UNSIGNED_BYTE);
+}
+
+void WebGLRenderingContextBase::copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
+{
+    if (isContextLostOrPending())
+        return;
+    if (!validateTexFuncLevel(&quot;copyTexSubImage2D&quot;, target, level))
+        return;
+    WebGLTexture* tex = validateTextureBinding(&quot;copyTexSubImage2D&quot;, target, true);
+    if (!tex)
+        return;
+    if (!validateSize(&quot;copyTexSubImage2D&quot;, xoffset, yoffset) || !validateSize(&quot;copyTexSubImage2D&quot;, width, height))
+        return;
+    // Before checking if it is in the range, check if overflow happens first.
+    if (xoffset + width &lt; 0 || yoffset + height &lt; 0) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;copyTexSubImage2D&quot;, &quot;bad dimensions&quot;);
+        return;
+    }
+    if (xoffset + width &gt; tex-&gt;getWidth(target, level) || yoffset + height &gt; tex-&gt;getHeight(target, level)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;copyTexSubImage2D&quot;, &quot;rectangle out of range&quot;);
+        return;
+    }
+    GC3Denum internalformat = tex-&gt;getInternalFormat(target, level);
+    if (!validateSettableTexFormat(&quot;copyTexSubImage2D&quot;, internalformat))
+        return;
+    if (!isTexInternalFormatColorBufferCombinationValid(internalformat, getBoundFramebufferColorFormat())) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;copyTexSubImage2D&quot;, &quot;framebuffer is incompatible format&quot;);
+        return;
+    }
+    const char* reason = &quot;framebuffer incomplete&quot;;
+    if (m_framebufferBinding &amp;&amp; !m_framebufferBinding-&gt;onAccess(graphicsContext3D(), !isResourceSafe(), &amp;reason)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, &quot;copyTexSubImage2D&quot;, reason);
+        return;
+    }
+    clearIfComposited();
+    if (isResourceSafe()) {
+        ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding.get());
+        m_context-&gt;copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+    } else {
+        GC3Dint clippedX, clippedY;
+        GC3Dsizei clippedWidth, clippedHeight;
+        if (clip2D(x, y, width, height, getBoundFramebufferWidth(), getBoundFramebufferHeight(), &amp;clippedX, &amp;clippedY, &amp;clippedWidth, &amp;clippedHeight)) {
+            GC3Denum format = tex-&gt;getInternalFormat(target, level);
+            GC3Denum type = tex-&gt;getType(target, level);
+            std::unique_ptr&lt;unsigned char[]&gt; zero;
+            if (width &amp;&amp; height) {
+                unsigned size;
+                GC3Denum error = m_context-&gt;computeImageSizeInBytes(format, type, width, height, m_unpackAlignment, &amp;size, 0);
+                if (error != GraphicsContext3D::NO_ERROR) {
+                    synthesizeGLError(error, &quot;copyTexSubImage2D&quot;, &quot;bad dimensions&quot;);
+                    return;
+                }
+                zero = std::make_unique&lt;unsigned char[]&gt;(size);
+                if (!zero) {
+                    synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;copyTexSubImage2D&quot;, &quot;out of memory&quot;);
+                    return;
+                }
+                memset(zero.get(), 0, size);
+            }
+            m_context-&gt;texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, zero.get());
+            if (clippedWidth &gt; 0 &amp;&amp; clippedHeight &gt; 0) {
+                ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding.get());
+                m_context-&gt;copyTexSubImage2D(target, level, xoffset + clippedX - x, yoffset + clippedY - y,
+                                             clippedX, clippedY, clippedWidth, clippedHeight);
+            }
+        } else {
+            ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding.get());
+            m_context-&gt;copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+        }
+    }
+}
+
+PassRefPtr&lt;WebGLBuffer&gt; WebGLRenderingContextBase::createBuffer()
+{
+    if (isContextLostOrPending())
+        return nullptr;
+    RefPtr&lt;WebGLBuffer&gt; o = WebGLBuffer::create(this);
+    addSharedObject(o.get());
+    return o;
+}
+
+PassRefPtr&lt;WebGLFramebuffer&gt; WebGLRenderingContextBase::createFramebuffer()
+{
+    if (isContextLostOrPending())
+        return nullptr;
+    RefPtr&lt;WebGLFramebuffer&gt; o = WebGLFramebuffer::create(this);
+    addContextObject(o.get());
+    return o;
+}
+
+PassRefPtr&lt;WebGLTexture&gt; WebGLRenderingContextBase::createTexture()
+{
+    if (isContextLostOrPending())
+        return nullptr;
+    RefPtr&lt;WebGLTexture&gt; o = WebGLTexture::create(this);
+    addSharedObject(o.get());
+    return o;
+}
+
+PassRefPtr&lt;WebGLProgram&gt; WebGLRenderingContextBase::createProgram()
+{
+    if (isContextLostOrPending())
+        return nullptr;
+    RefPtr&lt;WebGLProgram&gt; o = WebGLProgram::create(this);
+    addSharedObject(o.get());
+    return o;
+}
+
+PassRefPtr&lt;WebGLRenderbuffer&gt; WebGLRenderingContextBase::createRenderbuffer()
+{
+    if (isContextLostOrPending())
+        return nullptr;
+    RefPtr&lt;WebGLRenderbuffer&gt; o = WebGLRenderbuffer::create(this);
+    addSharedObject(o.get());
+    return o;
+}
+
+PassRefPtr&lt;WebGLShader&gt; WebGLRenderingContextBase::createShader(GC3Denum type, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return nullptr;
+    if (type != GraphicsContext3D::VERTEX_SHADER &amp;&amp; type != GraphicsContext3D::FRAGMENT_SHADER) {
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;createShader&quot;, &quot;invalid shader type&quot;);
+        return nullptr;
+    }
+    
+    RefPtr&lt;WebGLShader&gt; o = WebGLShader::create(this, type);
+    addSharedObject(o.get());
+    return o;
+}
+
+void WebGLRenderingContextBase::cullFace(GC3Denum mode)
+{
+    if (isContextLostOrPending())
+        return;
+    m_context-&gt;cullFace(mode);
+}
+
+bool WebGLRenderingContextBase::deleteObject(WebGLObject* object)
+{
+    if (isContextLostOrPending() || !object)
+        return false;
+    if (!object-&gt;validate(contextGroup(), this)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;delete&quot;, &quot;object does not belong to this context&quot;);
+        return false;
+    }
+    if (object-&gt;object()) {
+        // We need to pass in context here because we want
+        // things in this context unbound.
+        object-&gt;deleteObject(graphicsContext3D());
+    }
+    return true;
+}
+
+void WebGLRenderingContextBase::deleteBuffer(WebGLBuffer* buffer)
+{
+    if (!deleteObject(buffer))
+        return;
+    if (m_boundArrayBuffer == buffer)
+        m_boundArrayBuffer = 0;
+    
+    m_boundVertexArrayObject-&gt;unbindBuffer(buffer);
+}
+
+void WebGLRenderingContextBase::deleteFramebuffer(WebGLFramebuffer* framebuffer)
+{
+    if (!deleteObject(framebuffer))
+        return;
+    if (framebuffer == m_framebufferBinding) {
+        m_framebufferBinding = 0;
+        if (m_drawingBuffer) {
+            m_drawingBuffer-&gt;setFramebufferBinding(0);
+            // Have to call bindFramebuffer here to bind back to internal fbo.
+            m_drawingBuffer-&gt;bind();
+        } else
+            m_context-&gt;bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, 0);
+    }
+}
+
+void WebGLRenderingContextBase::deleteProgram(WebGLProgram* program)
+{
+    deleteObject(program);
+    // We don't reset m_currentProgram to 0 here because the deletion of the
+    // current program is delayed.
+}
+
+void WebGLRenderingContextBase::deleteRenderbuffer(WebGLRenderbuffer* renderbuffer)
+{
+    if (!deleteObject(renderbuffer))
+        return;
+    if (renderbuffer == m_renderbufferBinding)
+        m_renderbufferBinding = 0;
+    if (m_framebufferBinding)
+        m_framebufferBinding-&gt;removeAttachmentFromBoundFramebuffer(renderbuffer);
+}
+
+void WebGLRenderingContextBase::deleteShader(WebGLShader* shader)
+{
+    deleteObject(shader);
+}
+
+void WebGLRenderingContextBase::deleteTexture(WebGLTexture* texture)
+{
+    if (!deleteObject(texture))
+        return;
+    for (size_t i = 0; i &lt; m_textureUnits.size(); ++i) {
+        if (texture == m_textureUnits[i].texture2DBinding)
+            m_textureUnits[i].texture2DBinding = nullptr;
+        if (texture == m_textureUnits[i].textureCubeMapBinding)
+            m_textureUnits[i].textureCubeMapBinding = nullptr;
+    }
+    if (m_framebufferBinding)
+        m_framebufferBinding-&gt;removeAttachmentFromBoundFramebuffer(texture);
+}
+
+void WebGLRenderingContextBase::depthFunc(GC3Denum func)
+{
+    if (isContextLostOrPending())
+        return;
+    m_context-&gt;depthFunc(func);
+}
+
+void WebGLRenderingContextBase::depthMask(GC3Dboolean flag)
+{
+    if (isContextLostOrPending())
+        return;
+    m_depthMask = flag;
+    m_context-&gt;depthMask(flag);
+}
+
+void WebGLRenderingContextBase::depthRange(GC3Dfloat zNear, GC3Dfloat zFar)
+{
+    if (isContextLostOrPending())
+        return;
+    if (zNear &gt; zFar) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;depthRange&quot;, &quot;zNear &gt; zFar&quot;);
+        return;
+    }
+    m_context-&gt;depthRange(zNear, zFar);
+}
+
+void WebGLRenderingContextBase::detachShader(WebGLProgram* program, WebGLShader* shader, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateWebGLObject(&quot;detachShader&quot;, program) || !validateWebGLObject(&quot;detachShader&quot;, shader))
+        return;
+    if (!program-&gt;detachShader(shader)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;detachShader&quot;, &quot;shader not attached&quot;);
+        return;
+    }
+    m_context-&gt;detachShader(objectOrZero(program), objectOrZero(shader));
+    shader-&gt;onDetached(graphicsContext3D());
+}
+
+void WebGLRenderingContextBase::disable(GC3Denum cap)
+{
+    if (isContextLostOrPending() || !validateCapability(&quot;disable&quot;, cap))
+        return;
+    if (cap == GraphicsContext3D::STENCIL_TEST) {
+        m_stencilEnabled = false;
+        applyStencilTest();
+        return;
+    }
+    if (cap == GraphicsContext3D::SCISSOR_TEST) {
+        m_scissorEnabled = false;
+        if (m_drawingBuffer)
+            m_drawingBuffer-&gt;setScissorEnabled(m_scissorEnabled);
+    }
+    m_context-&gt;disable(cap);
+}
+
+void WebGLRenderingContextBase::disableVertexAttribArray(GC3Duint index, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return;
+    if (index &gt;= m_maxVertexAttribs) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;disableVertexAttribArray&quot;, &quot;index out of range&quot;);
+        return;
+    }
+    
+    WebGLVertexArrayObjectOES::VertexAttribState&amp; state = m_boundVertexArrayObject-&gt;getVertexAttribState(index);
+    state.enabled = false;
+    
+    if (index &gt; 0 || isGLES2Compliant())
+        m_context-&gt;disableVertexAttribArray(index);
+}
+
+bool WebGLRenderingContextBase::validateElementArraySize(GC3Dsizei count, GC3Denum type, GC3Dintptr offset)
+{
+    RefPtr&lt;WebGLBuffer&gt; elementArrayBuffer = m_boundVertexArrayObject-&gt;getElementArrayBuffer();
+    
+    if (!elementArrayBuffer)
+        return false;
+    
+    if (offset &lt; 0)
+        return false;
+    
+    if (type == GraphicsContext3D::UNSIGNED_INT) {
+        // For an unsigned array, offset must be divisible by 4 for alignment reasons.
+        if (offset % 4)
+            return false;
+        
+        // Make uoffset an element offset.
+        offset /= 4;
+        
+        GC3Dsizeiptr n = elementArrayBuffer-&gt;byteLength() / 4;
+        if (offset &gt; n || count &gt; n - offset)
+            return false;
+    } else if (type == GraphicsContext3D::UNSIGNED_SHORT) {
+        // For an unsigned short array, offset must be divisible by 2 for alignment reasons.
+        if (offset % 2)
+            return false;
+        
+        // Make uoffset an element offset.
+        offset /= 2;
+        
+        GC3Dsizeiptr n = elementArrayBuffer-&gt;byteLength() / 2;
+        if (offset &gt; n || count &gt; n - offset)
+            return false;
+    } else if (type == GraphicsContext3D::UNSIGNED_BYTE) {
+        GC3Dsizeiptr n = elementArrayBuffer-&gt;byteLength();
+        if (offset &gt; n || count &gt; n - offset)
+            return false;
+    }
+    return true;
+}
+
+bool WebGLRenderingContextBase::validateIndexArrayConservative(GC3Denum type, unsigned&amp; numElementsRequired)
+{
+    // Performs conservative validation by caching a maximum index of
+    // the given type per element array buffer. If all of the bound
+    // array buffers have enough elements to satisfy that maximum
+    // index, skips the expensive per-draw-call iteration in
+    // validateIndexArrayPrecise.
+    
+    RefPtr&lt;WebGLBuffer&gt; elementArrayBuffer = m_boundVertexArrayObject-&gt;getElementArrayBuffer();
+    
+    if (!elementArrayBuffer)
+        return false;
+    
+    GC3Dsizeiptr numElements = elementArrayBuffer-&gt;byteLength();
+    // The case count==0 is already dealt with in drawElements before validateIndexArrayConservative.
+    if (!numElements)
+        return false;
+    const ArrayBuffer* buffer = elementArrayBuffer-&gt;elementArrayBuffer();
+    ASSERT(buffer);
+    
+    int maxIndex = elementArrayBuffer-&gt;getCachedMaxIndex(type);
+    if (maxIndex &lt; 0) {
+        // Compute the maximum index in the entire buffer for the given type of index.
+        switch (type) {
+        case GraphicsContext3D::UNSIGNED_BYTE: {
+            const GC3Dubyte* p = static_cast&lt;const GC3Dubyte*&gt;(buffer-&gt;data());
+            for (GC3Dsizeiptr i = 0; i &lt; numElements; i++)
+                maxIndex = std::max(maxIndex, static_cast&lt;int&gt;(p[i]));
+            break;
+        }
+        case GraphicsContext3D::UNSIGNED_SHORT: {
+            numElements /= sizeof(GC3Dushort);
+            const GC3Dushort* p = static_cast&lt;const GC3Dushort*&gt;(buffer-&gt;data());
+            for (GC3Dsizeiptr i = 0; i &lt; numElements; i++)
+                maxIndex = std::max(maxIndex, static_cast&lt;int&gt;(p[i]));
+            break;
+        }
+        case GraphicsContext3D::UNSIGNED_INT: {
+            if (!m_oesElementIndexUint)
+                return false;
+            numElements /= sizeof(GC3Duint);
+            const GC3Duint* p = static_cast&lt;const GC3Duint*&gt;(buffer-&gt;data());
+            for (GC3Dsizeiptr i = 0; i &lt; numElements; i++)
+                maxIndex = std::max(maxIndex, static_cast&lt;int&gt;(p[i]));
+            break;
+        }
+        default:
+            return false;
+        }
+        elementArrayBuffer-&gt;setCachedMaxIndex(type, maxIndex);
+    }
+    
+    if (maxIndex &gt;= 0) {
+        // The number of required elements is one more than the maximum
+        // index that will be accessed.
+        numElementsRequired = maxIndex + 1;
+        return true;
+    }
+    
+    return false;
+}
+
+bool WebGLRenderingContextBase::validateIndexArrayPrecise(GC3Dsizei count, GC3Denum type, GC3Dintptr offset, unsigned&amp; numElementsRequired)
+{
+    ASSERT(count &gt;= 0 &amp;&amp; offset &gt;= 0);
+    unsigned lastIndex = 0;
+    
+    RefPtr&lt;WebGLBuffer&gt; elementArrayBuffer = m_boundVertexArrayObject-&gt;getElementArrayBuffer();
+    
+    if (!elementArrayBuffer)
+        return false;
+    
+    if (!count) {
+        numElementsRequired = 0;
+        return true;
+    }
+    
+    if (!elementArrayBuffer-&gt;elementArrayBuffer())
+        return false;
+    
+    unsigned long uoffset = offset;
+    unsigned long n = count;
+    
+    if (type == GraphicsContext3D::UNSIGNED_INT) {
+        // Make uoffset an element offset.
+        uoffset /= sizeof(GC3Duint);
+        const GC3Duint* p = static_cast&lt;const GC3Duint*&gt;(elementArrayBuffer-&gt;elementArrayBuffer()-&gt;data()) + uoffset;
+        while (n-- &gt; 0) {
+            if (*p &gt; lastIndex)
+                lastIndex = *p;
+            ++p;
+        }
+    } else if (type == GraphicsContext3D::UNSIGNED_SHORT) {
+        // Make uoffset an element offset.
+        uoffset /= sizeof(GC3Dushort);
+        const GC3Dushort* p = static_cast&lt;const GC3Dushort*&gt;(elementArrayBuffer-&gt;elementArrayBuffer()-&gt;data()) + uoffset;
+        while (n-- &gt; 0) {
+            if (*p &gt; lastIndex)
+                lastIndex = *p;
+            ++p;
+        }
+    } else if (type == GraphicsContext3D::UNSIGNED_BYTE) {
+        const GC3Dubyte* p = static_cast&lt;const GC3Dubyte*&gt;(elementArrayBuffer-&gt;elementArrayBuffer()-&gt;data()) + uoffset;
+        while (n-- &gt; 0) {
+            if (*p &gt; lastIndex)
+                lastIndex = *p;
+            ++p;
+        }
+    }
+    
+    // Then set the last index in the index array and make sure it is valid.
+    numElementsRequired = lastIndex + 1;
+    return numElementsRequired &gt; 0;
+}
+
+bool WebGLRenderingContextBase::validateVertexAttributes(unsigned elementCount, unsigned primitiveCount)
+{
+    if (!m_currentProgram)
+        return false;
+    
+    // Look in each enabled vertex attrib and check if they've been bound to a buffer.
+    for (unsigned i = 0; i &lt; m_maxVertexAttribs; ++i) {
+        if (!m_boundVertexArrayObject-&gt;getVertexAttribState(i).validateBinding())
+            return false;
+    }
+    
+    if (elementCount &lt;= 0)
+        return true;
+    
+    
+    // Look in each consumed vertex attrib (by the current program).
+    bool sawNonInstancedAttrib = false;
+    bool sawEnabledAttrib = false;
+    int numActiveAttribLocations = m_currentProgram-&gt;numActiveAttribLocations();
+    for (int i = 0; i &lt; numActiveAttribLocations; ++i) {
+        int loc = m_currentProgram-&gt;getActiveAttribLocation(i);
+        if (loc &gt;= 0 &amp;&amp; loc &lt; static_cast&lt;int&gt;(m_maxVertexAttribs)) {
+            const WebGLVertexArrayObjectOES::VertexAttribState&amp; state = m_boundVertexArrayObject-&gt;getVertexAttribState(loc);
+            if (state.enabled) {
+                sawEnabledAttrib = true;
+                // Avoid off-by-one errors in numElements computation.
+                // For the last element, we will only touch the data for the
+                // element and nothing beyond it.
+                int bytesRemaining = static_cast&lt;int&gt;(state.bufferBinding-&gt;byteLength() - state.offset);
+                unsigned numElements = 0;
+                ASSERT(state.stride &gt; 0);
+                if (bytesRemaining &gt;= state.bytesPerElement)
+                    numElements = 1 + (bytesRemaining - state.bytesPerElement) / state.stride;
+                unsigned instancesRequired = 0;
+                if (state.divisor) {
+                    instancesRequired = ceil(static_cast&lt;float&gt;(primitiveCount) / state.divisor);
+                    if (instancesRequired &gt; numElements)
+                        return false;
+                } else {
+                    sawNonInstancedAttrib = true;
+                    if (elementCount &gt; numElements)
+                        return false;
+                }
+            }
+        }
+    }
+    
+    if (!sawNonInstancedAttrib &amp;&amp; sawEnabledAttrib)
+        return false;
+    
+    return true;
+}
+
+bool WebGLRenderingContextBase::validateWebGLObject(const char* functionName, WebGLObject* object)
+{
+    if (!object || !object-&gt;object()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no object or object deleted&quot;);
+        return false;
+    }
+    if (!object-&gt;validate(contextGroup(), this)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;object does not belong to this context&quot;);
+        return false;
+    }
+    return true;
+}
+
+bool WebGLRenderingContextBase::validateDrawArrays(const char* functionName, GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei primitiveCount)
+{
+    if (isContextLostOrPending() || !validateDrawMode(functionName, mode))
+        return false;
+    
+    if (!validateStencilSettings(functionName))
+        return false;
+    
+    if (first &lt; 0 || count &lt; 0) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;first or count &lt; 0&quot;);
+        return false;
+    }
+    
+    if (!count) {
+        markContextChanged();
+        return false;
+    }
+    
+    if (primitiveCount &lt; 0) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;primcount &lt; 0&quot;);
+        return false;
+    }
+    
+    if (!isErrorGeneratedOnOutOfBoundsAccesses()) {
+        // Ensure we have a valid rendering state
+        Checked&lt;GC3Dint, RecordOverflow&gt; checkedFirst(first);
+        Checked&lt;GC3Dint, RecordOverflow&gt; checkedCount(count);
+        Checked&lt;GC3Dint, RecordOverflow&gt; checkedSum = checkedFirst + checkedCount;
+        Checked&lt;GC3Dint, RecordOverflow&gt; checkedPrimitiveCount(primitiveCount);
+        if (checkedSum.hasOverflowed() || checkedPrimitiveCount.hasOverflowed() || !validateVertexAttributes(checkedSum.unsafeGet(), checkedPrimitiveCount.unsafeGet())) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;attempt to access out of bounds arrays&quot;);
+            return false;
+        }
+    } else {
+        if (!validateVertexAttributes(0)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;attribs not setup correctly&quot;);
+            return false;
+        }
+    }
+    
+    const char* reason = &quot;framebuffer incomplete&quot;;
+    if (m_framebufferBinding &amp;&amp; !m_framebufferBinding-&gt;onAccess(graphicsContext3D(), !isResourceSafe(), &amp;reason)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, functionName, reason);
+        return false;
+    }
+    
+    return true;
+}
+
+void WebGLRenderingContextBase::drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei count, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    
+    if (!validateDrawArrays(&quot;drawArrays&quot;, mode, first, count, 0))
+        return;
+    
+    clearIfComposited();
+    
+    bool vertexAttrib0Simulated = false;
+    if (!isGLES2Compliant())
+        vertexAttrib0Simulated = simulateVertexAttrib0(first + count - 1);
+    if (!isGLES2NPOTStrict())
+        checkTextureCompleteness(&quot;drawArrays&quot;, true);
+    
+    m_context-&gt;drawArrays(mode, first, count);
+    
+    if (!isGLES2Compliant() &amp;&amp; vertexAttrib0Simulated)
+        restoreStatesAfterVertexAttrib0Simulation();
+    if (!isGLES2NPOTStrict())
+        checkTextureCompleteness(&quot;drawArrays&quot;, false);
+    markContextChanged();
+}
+
+bool WebGLRenderingContextBase::validateDrawElements(const char* functionName, GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, unsigned&amp; numElements, GC3Dsizei primitiveCount)
+{
+    if (isContextLostOrPending() || !validateDrawMode(functionName, mode))
+        return false;
+    
+    if (!validateStencilSettings(functionName))
+        return false;
+    
+    switch (type) {
+    case GraphicsContext3D::UNSIGNED_BYTE:
+    case GraphicsContext3D::UNSIGNED_SHORT:
+        break;
+    case GraphicsContext3D::UNSIGNED_INT:
+        if (m_oesElementIndexUint)
+            break;
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid type&quot;);
+        return false;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid type&quot;);
+        return false;
+    }
+    
+    if (count &lt; 0 || offset &lt; 0) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;count or offset &lt; 0&quot;);
+        return false;
+    }
+    
+    if (!count) {
+        markContextChanged();
+        return false;
+    }
+    
+    if (primitiveCount &lt; 0) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;primcount &lt; 0&quot;);
+        return false;
+    }
+    
+    if (!m_boundVertexArrayObject-&gt;getElementArrayBuffer()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;no ELEMENT_ARRAY_BUFFER bound&quot;);
+        return false;
+    }
+    
+    if (!isErrorGeneratedOnOutOfBoundsAccesses()) {
+        // Ensure we have a valid rendering state
+        if (!validateElementArraySize(count, type, static_cast&lt;GC3Dintptr&gt;(offset))) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;request out of bounds for current ELEMENT_ARRAY_BUFFER&quot;);
+            return false;
+        }
+        if (!count)
+            return false;
+        
+        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())) {
+                synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;attempt to access out of bounds arrays&quot;);
+                return false;
+            }
+        }
+    } else {
+        if (!validateVertexAttributes(0)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;attribs not setup correctly&quot;);
+            return false;
+        }
+    }
+    
+    const char* reason = &quot;framebuffer incomplete&quot;;
+    if (m_framebufferBinding &amp;&amp; !m_framebufferBinding-&gt;onAccess(graphicsContext3D(), !isResourceSafe(), &amp;reason)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, functionName, reason);
+        return false;
+    }
+    
+    return true;
+}
+
+void WebGLRenderingContextBase::drawElements(GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    
+    unsigned numElements = 0;
+    if (!validateDrawElements(&quot;drawElements&quot;, mode, count, type, offset, numElements, 0))
+        return;
+    
+    clearIfComposited();
+    
+    bool vertexAttrib0Simulated = false;
+    if (!isGLES2Compliant()) {
+        if (!numElements)
+            validateIndexArrayPrecise(count, type, static_cast&lt;GC3Dintptr&gt;(offset), numElements);
+        vertexAttrib0Simulated = simulateVertexAttrib0(numElements);
+    }
+    if (!isGLES2NPOTStrict())
+        checkTextureCompleteness(&quot;drawElements&quot;, true);
+    
+    m_context-&gt;drawElements(mode, count, type, static_cast&lt;GC3Dintptr&gt;(offset));
+    
+    if (!isGLES2Compliant() &amp;&amp; vertexAttrib0Simulated)
+        restoreStatesAfterVertexAttrib0Simulation();
+    if (!isGLES2NPOTStrict())
+        checkTextureCompleteness(&quot;drawElements&quot;, false);
+    markContextChanged();
+}
+
+void WebGLRenderingContextBase::enable(GC3Denum cap)
+{
+    if (isContextLostOrPending() || !validateCapability(&quot;enable&quot;, cap))
+        return;
+    if (cap == GraphicsContext3D::STENCIL_TEST) {
+        m_stencilEnabled = true;
+        applyStencilTest();
+        return;
+    }
+    if (cap == GraphicsContext3D::SCISSOR_TEST) {
+        m_scissorEnabled = true;
+        if (m_drawingBuffer)
+            m_drawingBuffer-&gt;setScissorEnabled(m_scissorEnabled);
+    }
+    m_context-&gt;enable(cap);
+}
+
+void WebGLRenderingContextBase::enableVertexAttribArray(GC3Duint index, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return;
+    if (index &gt;= m_maxVertexAttribs) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;enableVertexAttribArray&quot;, &quot;index out of range&quot;);
+        return;
+    }
+    
+    WebGLVertexArrayObjectOES::VertexAttribState&amp; state = m_boundVertexArrayObject-&gt;getVertexAttribState(index);
+    state.enabled = true;
+    
+    m_context-&gt;enableVertexAttribArray(index);
+}
+
+void WebGLRenderingContextBase::finish()
+{
+    if (isContextLostOrPending())
+        return;
+    m_context-&gt;finish();
+}
+
+void WebGLRenderingContextBase::flush()
+{
+    if (isContextLostOrPending())
+        return;
+    m_context-&gt;flush();
+}
+
+void WebGLRenderingContextBase::framebufferRenderbuffer(GC3Denum target, GC3Denum attachment, GC3Denum renderbuffertarget, WebGLRenderbuffer* buffer, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateFramebufferFuncParameters(&quot;framebufferRenderbuffer&quot;, target, attachment))
+        return;
+    if (renderbuffertarget != GraphicsContext3D::RENDERBUFFER) {
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;framebufferRenderbuffer&quot;, &quot;invalid target&quot;);
+        return;
+    }
+    if (buffer &amp;&amp; !buffer-&gt;validate(contextGroup(), this)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;framebufferRenderbuffer&quot;, &quot;no buffer or buffer not from this context&quot;);
+        return;
+    }
+    // Don't allow the default framebuffer to be mutated; all current
+    // implementations use an FBO internally in place of the default
+    // FBO.
+    if (!m_framebufferBinding || !m_framebufferBinding-&gt;object()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;framebufferRenderbuffer&quot;, &quot;no framebuffer bound&quot;);
+        return;
+    }
+    Platform3DObject bufferObject = objectOrZero(buffer);
+    switch (attachment) {
+    case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT:
+        m_context-&gt;framebufferRenderbuffer(target, GraphicsContext3D::DEPTH_ATTACHMENT, renderbuffertarget, bufferObject);
+        m_context-&gt;framebufferRenderbuffer(target, GraphicsContext3D::STENCIL_ATTACHMENT, renderbuffertarget, bufferObject);
+        break;
+    default:
+        m_context-&gt;framebufferRenderbuffer(target, attachment, renderbuffertarget, bufferObject);
+    }
+    m_framebufferBinding-&gt;setAttachmentForBoundFramebuffer(attachment, buffer);
+    applyStencilTest();
+}
+
+void WebGLRenderingContextBase::framebufferTexture2D(GC3Denum target, GC3Denum attachment, GC3Denum textarget, WebGLTexture* texture, GC3Dint level, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateFramebufferFuncParameters(&quot;framebufferTexture2D&quot;, target, attachment))
+        return;
+    if (level) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;framebufferTexture2D&quot;, &quot;level not 0&quot;);
+        return;
+    }
+    if (texture &amp;&amp; !texture-&gt;validate(contextGroup(), this)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;framebufferTexture2D&quot;, &quot;no texture or texture not from this context&quot;);
+        return;
+    }
+    // Don't allow the default framebuffer to be mutated; all current
+    // implementations use an FBO internally in place of the default
+    // FBO.
+    if (!m_framebufferBinding || !m_framebufferBinding-&gt;object()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;framebufferTexture2D&quot;, &quot;no framebuffer bound&quot;);
+        return;
+    }
+    Platform3DObject textureObject = objectOrZero(texture);
+    switch (attachment) {
+    case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT:
+        m_context-&gt;framebufferTexture2D(target, GraphicsContext3D::DEPTH_ATTACHMENT, textarget, textureObject, level);
+        m_context-&gt;framebufferTexture2D(target, GraphicsContext3D::STENCIL_ATTACHMENT, textarget, textureObject, level);
+        break;
+    case GraphicsContext3D::DEPTH_ATTACHMENT:
+        m_context-&gt;framebufferTexture2D(target, attachment, textarget, textureObject, level);
+        break;
+    case GraphicsContext3D::STENCIL_ATTACHMENT:
+        m_context-&gt;framebufferTexture2D(target, attachment, textarget, textureObject, level);
+        break;
+    default:
+        m_context-&gt;framebufferTexture2D(target, attachment, textarget, textureObject, level);
+    }
+    m_framebufferBinding-&gt;setAttachmentForBoundFramebuffer(attachment, textarget, texture, level);
+    applyStencilTest();
+}
+
+void WebGLRenderingContextBase::frontFace(GC3Denum mode)
+{
+    if (isContextLostOrPending())
+        return;
+    m_context-&gt;frontFace(mode);
+}
+
+void WebGLRenderingContextBase::generateMipmap(GC3Denum target)
+{
+    if (isContextLostOrPending())
+        return;
+    WebGLTexture* tex = validateTextureBinding(&quot;generateMipmap&quot;, target, false);
+    if (!tex)
+        return;
+    if (!tex-&gt;canGenerateMipmaps()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;generateMipmap&quot;, &quot;level 0 not power of 2 or not all the same size&quot;);
+        return;
+    }
+    // FIXME: https://bugs.webkit.org/show_bug.cgi?id=123916. Compressed textures should be allowed in WebGL 2:
+    if (tex-&gt;isCompressed()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;generateMipmap&quot;, &quot;trying to generate mipmaps from compressed texture&quot;);
+        return;
+    }
+    if (!validateSettableTexFormat(&quot;generateMipmap&quot;, tex-&gt;getInternalFormat(target, 0)))
+        return;
+    
+    // generateMipmap won't work properly if minFilter is not NEAREST_MIPMAP_LINEAR
+    // on Mac. Remove the hack once this driver bug is fixed.
+#if OS(DARWIN)
+    bool needToResetMinFilter = false;
+    if (tex-&gt;getMinFilter() != GraphicsContext3D::NEAREST_MIPMAP_LINEAR) {
+        m_context-&gt;texParameteri(target, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::NEAREST_MIPMAP_LINEAR);
+        needToResetMinFilter = true;
+    }
+#endif
+    m_context-&gt;generateMipmap(target);
+#if OS(DARWIN)
+    if (needToResetMinFilter)
+        m_context-&gt;texParameteri(target, GraphicsContext3D::TEXTURE_MIN_FILTER, tex-&gt;getMinFilter());
+#endif
+    tex-&gt;generateMipmapLevelInfo();
+}
+
+PassRefPtr&lt;WebGLActiveInfo&gt; WebGLRenderingContextBase::getActiveAttrib(WebGLProgram* program, GC3Duint index, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateWebGLObject(&quot;getActiveAttrib&quot;, program))
+        return nullptr;
+    ActiveInfo info;
+    if (!m_context-&gt;getActiveAttrib(objectOrZero(program), index, info))
+        return nullptr;
+    
+    LOG(WebGL, &quot;Returning active attribute %d: %s&quot;, index, info.name.utf8().data());
+    
+    return WebGLActiveInfo::create(info.name, info.type, info.size);
+}
+
+PassRefPtr&lt;WebGLActiveInfo&gt; WebGLRenderingContextBase::getActiveUniform(WebGLProgram* program, GC3Duint index, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateWebGLObject(&quot;getActiveUniform&quot;, program))
+        return 0;
+    ActiveInfo info;
+    if (!m_context-&gt;getActiveUniform(objectOrZero(program), index, info))
+        return nullptr;
+    if (!isGLES2Compliant()) {
+        if (info.size &gt; 1 &amp;&amp; !info.name.endsWith(&quot;[0]&quot;))
+            info.name.append(&quot;[0]&quot;);
+    }
+    
+    LOG(WebGL, &quot;Returning active uniform %d: %s&quot;, index, info.name.utf8().data());
+    
+    return WebGLActiveInfo::create(info.name, info.type, info.size);
+}
+
+bool WebGLRenderingContextBase::getAttachedShaders(WebGLProgram* program, Vector&lt;RefPtr&lt;WebGLShader&gt;&gt;&amp; shaderObjects, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    shaderObjects.clear();
+    if (isContextLostOrPending() || !validateWebGLObject(&quot;getAttachedShaders&quot;, program))
+        return false;
+    
+    const GC3Denum shaderType[] = {
+        GraphicsContext3D::VERTEX_SHADER,
+        GraphicsContext3D::FRAGMENT_SHADER
+    };
+    for (unsigned i = 0; i &lt; sizeof(shaderType) / sizeof(GC3Denum); ++i) {
+        WebGLShader* shader = program-&gt;getAttachedShader(shaderType[i]);
+        if (shader)
+            shaderObjects.append(shader);
+    }
+    return true;
+}
+
+GC3Dint WebGLRenderingContextBase::getAttribLocation(WebGLProgram* program, const String&amp; name)
+{
+    if (isContextLostOrPending() || !validateWebGLObject(&quot;getAttribLocation&quot;, program))
+        return -1;
+    if (!validateLocationLength(&quot;getAttribLocation&quot;, name))
+        return -1;
+    if (!validateString(&quot;getAttribLocation&quot;, name))
+        return -1;
+    if (isPrefixReserved(name))
+        return -1;
+    if (!program-&gt;getLinkStatus()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;getAttribLocation&quot;, &quot;program not linked&quot;);
+        return -1;
+    }
+    return m_context-&gt;getAttribLocation(objectOrZero(program), name);
+}
+
+WebGLGetInfo WebGLRenderingContextBase::getBufferParameter(GC3Denum target, GC3Denum pname, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return WebGLGetInfo();
+    if (target != GraphicsContext3D::ARRAY_BUFFER &amp;&amp; target != GraphicsContext3D::ELEMENT_ARRAY_BUFFER) {
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getBufferParameter&quot;, &quot;invalid target&quot;);
+        return WebGLGetInfo();
+    }
+    
+    if (pname != GraphicsContext3D::BUFFER_SIZE &amp;&amp; pname != GraphicsContext3D::BUFFER_USAGE) {
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getBufferParameter&quot;, &quot;invalid parameter name&quot;);
+        return WebGLGetInfo();
+    }
+    
+    GC3Dint value = 0;
+    m_context-&gt;getBufferParameteriv(target, pname, &amp;value);
+    if (pname == GraphicsContext3D::BUFFER_SIZE)
+        return WebGLGetInfo(value);
+    return WebGLGetInfo(static_cast&lt;unsigned&gt;(value));
+}
+
+PassRefPtr&lt;WebGLContextAttributes&gt; WebGLRenderingContextBase::getContextAttributes()
+{
+    if (isContextLostOrPending())
+        return nullptr;
+    // We always need to return a new WebGLContextAttributes object to
+    // prevent the user from mutating any cached version.
+    
+    // Also, we need to enforce requested values of &quot;false&quot; for depth
+    // and stencil, regardless of the properties of the underlying
+    // GraphicsContext3D or DrawingBuffer.
+    RefPtr&lt;WebGLContextAttributes&gt; attributes = WebGLContextAttributes::create(m_context-&gt;getContextAttributes());
+    if (!m_attributes.depth)
+        attributes-&gt;setDepth(false);
+    if (!m_attributes.stencil)
+        attributes-&gt;setStencil(false);
+    if (m_drawingBuffer) {
+        // The DrawingBuffer obtains its parameters from GraphicsContext3D::getContextAttributes(),
+        // but it makes its own determination of whether multisampling is supported.
+        attributes-&gt;setAntialias(m_drawingBuffer-&gt;multisample());
+    }
+    return attributes.release();
+}
+
+GC3Denum WebGLRenderingContextBase::getError()
+{
+    if (m_isPendingPolicyResolution)
+        return GraphicsContext3D::NO_ERROR;
+    return m_context-&gt;getError();
+}
+
+WebGLExtension* WebGLRenderingContextBase::getExtension(const String&amp; name)
+{
+    if (isContextLostOrPending())
+        return nullptr;
+    
+    if (equalIgnoringCase(name, &quot;EXT_blend_minmax&quot;)
+        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_blend_minmax&quot;)) {
+        if (!m_extBlendMinMax) {
+            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_EXT_blend_minmax&quot;);
+            m_extBlendMinMax = std::make_unique&lt;EXTBlendMinMax&gt;(this);
+        }
+        return m_extBlendMinMax.get();
+    }
+    if (equalIgnoringCase(name, &quot;EXT_sRGB&quot;)
+        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_sRGB&quot;)) {
+        if (!m_extsRGB) {
+            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_EXT_sRGB&quot;);
+            m_extsRGB = std::make_unique&lt;EXTsRGB&gt;(this);
+        }
+        return m_extsRGB.get();
+    }
+    if (equalIgnoringCase(name, &quot;EXT_frag_depth&quot;)
+        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_frag_depth&quot;)) {
+        if (!m_extFragDepth) {
+            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_EXT_frag_depth&quot;);
+            m_extFragDepth = std::make_unique&lt;EXTFragDepth&gt;(this);
+        }
+        return m_extFragDepth.get();
+    }
+    if (equalIgnoringCase(name, &quot;EXT_shader_texture_lod&quot;)
+        &amp;&amp; (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_shader_texture_lod&quot;) || m_context-&gt;getExtensions()-&gt;supports(&quot;GL_ARB_shader_texture_lod&quot;))) {
+        if (!m_extShaderTextureLOD) {
+            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_EXT_shader_texture_lod&quot;);
+            m_extShaderTextureLOD = std::make_unique&lt;EXTShaderTextureLOD&gt;(this);
+        }
+        return m_extShaderTextureLOD.get();
+    }
+    if (equalIgnoringCase(name, &quot;WEBKIT_EXT_texture_filter_anisotropic&quot;)
+        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_texture_filter_anisotropic&quot;)) {
+        if (!m_extTextureFilterAnisotropic) {
+            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_EXT_texture_filter_anisotropic&quot;);
+            m_extTextureFilterAnisotropic = std::make_unique&lt;EXTTextureFilterAnisotropic&gt;(this);
+        }
+        return m_extTextureFilterAnisotropic.get();
+    }
+    if (equalIgnoringCase(name, &quot;OES_standard_derivatives&quot;)
+        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_standard_derivatives&quot;)) {
+        if (!m_oesStandardDerivatives) {
+            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_OES_standard_derivatives&quot;);
+            m_oesStandardDerivatives = std::make_unique&lt;OESStandardDerivatives&gt;(this);
+        }
+        return m_oesStandardDerivatives.get();
+    }
+    if (equalIgnoringCase(name, &quot;OES_texture_float&quot;)
+        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_texture_float&quot;)) {
+        if (!m_oesTextureFloat) {
+            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_OES_texture_float&quot;);
+            m_oesTextureFloat = std::make_unique&lt;OESTextureFloat&gt;(this);
+        }
+        return m_oesTextureFloat.get();
+    }
+    if (equalIgnoringCase(name, &quot;OES_texture_float_linear&quot;)
+        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_texture_float_linear&quot;)) {
+        if (!m_oesTextureFloatLinear) {
+            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_OES_texture_float_linear&quot;);
+            m_oesTextureFloatLinear = std::make_unique&lt;OESTextureFloatLinear&gt;(this);
+        }
+        return m_oesTextureFloatLinear.get();
+    }
+    if (equalIgnoringCase(name, &quot;OES_texture_half_float&quot;)
+        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_texture_half_float&quot;)) {
+        if (!m_oesTextureHalfFloat) {
+            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_OES_texture_half_float&quot;);
+            m_oesTextureHalfFloat = std::make_unique&lt;OESTextureHalfFloat&gt;(this);
+        }
+        return m_oesTextureHalfFloat.get();
+    }
+    if (equalIgnoringCase(name, &quot;OES_texture_half_float_linear&quot;)
+        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_texture_half_float_linear&quot;)) {
+        if (!m_oesTextureHalfFloatLinear) {
+            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_OES_texture_half_float_linear&quot;);
+            m_oesTextureHalfFloatLinear = std::make_unique&lt;OESTextureHalfFloatLinear&gt;(this);
+        }
+        return m_oesTextureHalfFloatLinear.get();
+    }
+    if (equalIgnoringCase(name, &quot;OES_vertex_array_object&quot;)
+        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_vertex_array_object&quot;)) {
+        if (!m_oesVertexArrayObject) {
+            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_OES_vertex_array_object&quot;);
+            m_oesVertexArrayObject = std::make_unique&lt;OESVertexArrayObject&gt;(this);
+        }
+        return m_oesVertexArrayObject.get();
+    }
+    if (equalIgnoringCase(name, &quot;OES_element_index_uint&quot;)
+        &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_element_index_uint&quot;)) {
+        if (!m_oesElementIndexUint) {
+            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_OES_element_index_uint&quot;);
+            m_oesElementIndexUint = std::make_unique&lt;OESElementIndexUint&gt;(this);
+        }
+        return m_oesElementIndexUint.get();
+    }
+    if (equalIgnoringCase(name, &quot;WEBGL_lose_context&quot;)) {
+        if (!m_webglLoseContext)
+            m_webglLoseContext = std::make_unique&lt;WebGLLoseContext&gt;(this);
+        return m_webglLoseContext.get();
+    }
+    if ((equalIgnoringCase(name, &quot;WEBKIT_WEBGL_compressed_texture_atc&quot;))
+        &amp;&amp; WebGLCompressedTextureATC::supported(this)) {
+        if (!m_webglCompressedTextureATC)
+            m_webglCompressedTextureATC = std::make_unique&lt;WebGLCompressedTextureATC&gt;(this);
+        return m_webglCompressedTextureATC.get();
+    }
+    if ((equalIgnoringCase(name, &quot;WEBKIT_WEBGL_compressed_texture_pvrtc&quot;))
+        &amp;&amp; WebGLCompressedTexturePVRTC::supported(this)) {
+        if (!m_webglCompressedTexturePVRTC)
+            m_webglCompressedTexturePVRTC = std::make_unique&lt;WebGLCompressedTexturePVRTC&gt;(this);
+        return m_webglCompressedTexturePVRTC.get();
+    }
+    if (equalIgnoringCase(name, &quot;WEBGL_compressed_texture_s3tc&quot;)
+        &amp;&amp; WebGLCompressedTextureS3TC::supported(this)) {
+        if (!m_webglCompressedTextureS3TC)
+            m_webglCompressedTextureS3TC = std::make_unique&lt;WebGLCompressedTextureS3TC&gt;(this);
+        return m_webglCompressedTextureS3TC.get();
+    }
+    if (equalIgnoringCase(name, &quot;WEBGL_depth_texture&quot;)
+        &amp;&amp; WebGLDepthTexture::supported(graphicsContext3D())) {
+        if (!m_webglDepthTexture) {
+            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_CHROMIUM_depth_texture&quot;);
+            m_webglDepthTexture = std::make_unique&lt;WebGLDepthTexture&gt;(this);
+        }
+        return m_webglDepthTexture.get();
+    }
+    if (equalIgnoringCase(name, &quot;WEBGL_draw_buffers&quot;) &amp;&amp; supportsDrawBuffers()) {
+        if (!m_webglDrawBuffers) {
+            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_EXT_draw_buffers&quot;);
+            m_webglDrawBuffers = std::make_unique&lt;WebGLDrawBuffers&gt;(this);
+        }
+        return m_webglDrawBuffers.get();
+    }
+    if (equalIgnoringCase(name, &quot;ANGLE_instanced_arrays&quot;) &amp;&amp; ANGLEInstancedArrays::supported(this)) {
+        if (!m_angleInstancedArrays) {
+            m_context-&gt;getExtensions()-&gt;ensureEnabled(&quot;GL_ANGLE_instanced_arrays&quot;);
+            m_angleInstancedArrays = std::make_unique&lt;ANGLEInstancedArrays&gt;(this);
+        }
+        return m_angleInstancedArrays.get();
+    }
+    if (allowPrivilegedExtensions()) {
+        if (equalIgnoringCase(name, &quot;WEBGL_debug_renderer_info&quot;)) {
+            if (!m_webglDebugRendererInfo)
+                m_webglDebugRendererInfo = std::make_unique&lt;WebGLDebugRendererInfo&gt;(this);
+            return m_webglDebugRendererInfo.get();
+        }
+        if (equalIgnoringCase(name, &quot;WEBGL_debug_shaders&quot;)
+            &amp;&amp; m_context-&gt;getExtensions()-&gt;supports(&quot;GL_ANGLE_translated_shader_source&quot;)) {
+            if (!m_webglDebugShaders)
+                m_webglDebugShaders = std::make_unique&lt;WebGLDebugShaders&gt;(this);
+            return m_webglDebugShaders.get();
+        }
+    }
+    
+    return nullptr;
+}
+
+WebGLGetInfo WebGLRenderingContextBase::getFramebufferAttachmentParameter(GC3Denum target, GC3Denum attachment, GC3Denum pname, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateFramebufferFuncParameters(&quot;getFramebufferAttachmentParameter&quot;, target, attachment))
+        return WebGLGetInfo();
+    
+    if (!m_framebufferBinding || !m_framebufferBinding-&gt;object()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;getFramebufferAttachmentParameter&quot;, &quot;no framebuffer bound&quot;);
+        return WebGLGetInfo();
+    }
+    
+    WebGLSharedObject* object = m_framebufferBinding-&gt;getAttachmentObject(attachment);
+    if (!object) {
+        if (pname == GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)
+            return WebGLGetInfo(GraphicsContext3D::NONE);
+        // OpenGL ES 2.0 specifies INVALID_ENUM in this case, while desktop GL
+        // specifies INVALID_OPERATION.
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getFramebufferAttachmentParameter&quot;, &quot;invalid parameter name&quot;);
+        return WebGLGetInfo();
+    }
+    
+    ASSERT(object-&gt;isTexture() || object-&gt;isRenderbuffer());
+    if (object-&gt;isTexture()) {
+        switch (pname) {
+        case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
+            return WebGLGetInfo(GraphicsContext3D::TEXTURE);
+        case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
+            return WebGLGetInfo(PassRefPtr&lt;WebGLTexture&gt;(reinterpret_cast&lt;WebGLTexture*&gt;(object)));
+        case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
+        case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
+        case Extensions3D::FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT: {
+            GC3Dint value = 0;
+            m_context-&gt;getFramebufferAttachmentParameteriv(target, attachment, pname, &amp;value);
+            return WebGLGetInfo(value);
+        }
+        default:
+            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getFramebufferAttachmentParameter&quot;, &quot;invalid parameter name for texture attachment&quot;);
+            return WebGLGetInfo();
+        }
+    } else {
+        switch (pname) {
+        case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
+            return WebGLGetInfo(GraphicsContext3D::RENDERBUFFER);
+        case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
+            return WebGLGetInfo(PassRefPtr&lt;WebGLRenderbuffer&gt;(reinterpret_cast&lt;WebGLRenderbuffer*&gt;(object)));
+        case Extensions3D::FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT: {
+            WebGLRenderbuffer* renderBuffer = reinterpret_cast&lt;WebGLRenderbuffer*&gt;(object);
+            GC3Denum renderBufferFormat = renderBuffer-&gt;getInternalFormat();
+            ASSERT(renderBufferFormat != Extensions3D::SRGB_EXT &amp;&amp; renderBufferFormat != Extensions3D::SRGB_ALPHA_EXT);
+            if (renderBufferFormat == Extensions3D::SRGB8_ALPHA8_EXT)
+                return WebGLGetInfo(Extensions3D::SRGB_EXT);
+            return WebGLGetInfo(GraphicsContext3D::LINEAR);
+        }
+        default:
+            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getFramebufferAttachmentParameter&quot;, &quot;invalid parameter name for renderbuffer attachment&quot;);
+            return WebGLGetInfo();
+        }
+    }
+}
+
+WebGLGetInfo WebGLRenderingContextBase::getParameter(GC3Denum pname, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return WebGLGetInfo();
+    const int intZero = 0;
+    switch (pname) {
+    case GraphicsContext3D::ACTIVE_TEXTURE:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::ALIASED_LINE_WIDTH_RANGE:
+        return getWebGLFloatArrayParameter(pname);
+    case GraphicsContext3D::ALIASED_POINT_SIZE_RANGE:
+        return getWebGLFloatArrayParameter(pname);
+    case GraphicsContext3D::ALPHA_BITS:
+        return getIntParameter(pname);
+    case GraphicsContext3D::ARRAY_BUFFER_BINDING:
+        return WebGLGetInfo(PassRefPtr&lt;WebGLBuffer&gt;(m_boundArrayBuffer));
+    case GraphicsContext3D::BLEND:
+        return getBooleanParameter(pname);
+    case GraphicsContext3D::BLEND_COLOR:
+        return getWebGLFloatArrayParameter(pname);
+    case GraphicsContext3D::BLEND_DST_ALPHA:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::BLEND_DST_RGB:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::BLEND_EQUATION_ALPHA:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::BLEND_EQUATION_RGB:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::BLEND_SRC_ALPHA:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::BLEND_SRC_RGB:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::BLUE_BITS:
+        return getIntParameter(pname);
+    case GraphicsContext3D::COLOR_CLEAR_VALUE:
+        return getWebGLFloatArrayParameter(pname);
+    case GraphicsContext3D::COLOR_WRITEMASK:
+        return getBooleanArrayParameter(pname);
+    case GraphicsContext3D::COMPRESSED_TEXTURE_FORMATS:
+        return WebGLGetInfo(Uint32Array::create(m_compressedTextureFormats.data(), m_compressedTextureFormats.size()));
+    case GraphicsContext3D::CULL_FACE:
+        return getBooleanParameter(pname);
+    case GraphicsContext3D::CULL_FACE_MODE:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::CURRENT_PROGRAM:
+        return WebGLGetInfo(PassRefPtr&lt;WebGLProgram&gt;(m_currentProgram));
+    case GraphicsContext3D::DEPTH_BITS:
+        if (!m_framebufferBinding &amp;&amp; !m_attributes.depth)
+            return WebGLGetInfo(intZero);
+        return getIntParameter(pname);
+    case GraphicsContext3D::DEPTH_CLEAR_VALUE:
+        return getFloatParameter(pname);
+    case GraphicsContext3D::DEPTH_FUNC:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::DEPTH_RANGE:
+        return getWebGLFloatArrayParameter(pname);
+    case GraphicsContext3D::DEPTH_TEST:
+        return getBooleanParameter(pname);
+    case GraphicsContext3D::DEPTH_WRITEMASK:
+        return getBooleanParameter(pname);
+    case GraphicsContext3D::DITHER:
+        return getBooleanParameter(pname);
+    case GraphicsContext3D::ELEMENT_ARRAY_BUFFER_BINDING:
+        return WebGLGetInfo(PassRefPtr&lt;WebGLBuffer&gt;(m_boundVertexArrayObject-&gt;getElementArrayBuffer()));
+    case GraphicsContext3D::FRAMEBUFFER_BINDING:
+        return WebGLGetInfo(PassRefPtr&lt;WebGLFramebuffer&gt;(m_framebufferBinding));
+    case GraphicsContext3D::FRONT_FACE:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::GENERATE_MIPMAP_HINT:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::GREEN_BITS:
+        return getIntParameter(pname);
+    case GraphicsContext3D::LINE_WIDTH:
+        return getFloatParameter(pname);
+    case GraphicsContext3D::MAX_COMBINED_TEXTURE_IMAGE_UNITS:
+        return getIntParameter(pname);
+    case GraphicsContext3D::MAX_CUBE_MAP_TEXTURE_SIZE:
+        return getIntParameter(pname);
+    case GraphicsContext3D::MAX_FRAGMENT_UNIFORM_VECTORS:
+        return getIntParameter(pname);
+    case GraphicsContext3D::MAX_RENDERBUFFER_SIZE:
+        return getIntParameter(pname);
+    case GraphicsContext3D::MAX_TEXTURE_IMAGE_UNITS:
+        return getIntParameter(pname);
+    case GraphicsContext3D::MAX_TEXTURE_SIZE:
+        return getIntParameter(pname);
+    case GraphicsContext3D::MAX_VARYING_VECTORS:
+        return getIntParameter(pname);
+    case GraphicsContext3D::MAX_VERTEX_ATTRIBS:
+        return getIntParameter(pname);
+    case GraphicsContext3D::MAX_VERTEX_TEXTURE_IMAGE_UNITS:
+        return getIntParameter(pname);
+    case GraphicsContext3D::MAX_VERTEX_UNIFORM_VECTORS:
+        return getIntParameter(pname);
+    case GraphicsContext3D::MAX_VIEWPORT_DIMS:
+        return getWebGLIntArrayParameter(pname);
+    case GraphicsContext3D::NUM_SHADER_BINARY_FORMATS:
+        // FIXME: should we always return 0 for this?
+        return getIntParameter(pname);
+    case GraphicsContext3D::PACK_ALIGNMENT:
+        return getIntParameter(pname);
+    case GraphicsContext3D::POLYGON_OFFSET_FACTOR:
+        return getFloatParameter(pname);
+    case GraphicsContext3D::POLYGON_OFFSET_FILL:
+        return getBooleanParameter(pname);
+    case GraphicsContext3D::POLYGON_OFFSET_UNITS:
+        return getFloatParameter(pname);
+    case GraphicsContext3D::RED_BITS:
+        return getIntParameter(pname);
+    case GraphicsContext3D::RENDERBUFFER_BINDING:
+        return WebGLGetInfo(PassRefPtr&lt;WebGLRenderbuffer&gt;(m_renderbufferBinding));
+    case GraphicsContext3D::RENDERER:
+        return WebGLGetInfo(String(&quot;WebKit WebGL&quot;));
+    case GraphicsContext3D::SAMPLE_BUFFERS:
+        return getIntParameter(pname);
+    case GraphicsContext3D::SAMPLE_COVERAGE_INVERT:
+        return getBooleanParameter(pname);
+    case GraphicsContext3D::SAMPLE_COVERAGE_VALUE:
+        return getFloatParameter(pname);
+    case GraphicsContext3D::SAMPLES:
+        return getIntParameter(pname);
+    case GraphicsContext3D::SCISSOR_BOX:
+        return getWebGLIntArrayParameter(pname);
+    case GraphicsContext3D::SCISSOR_TEST:
+        return getBooleanParameter(pname);
+    case GraphicsContext3D::SHADING_LANGUAGE_VERSION:
+        return WebGLGetInfo(&quot;WebGL GLSL ES 1.0 (&quot; + m_context-&gt;getString(GraphicsContext3D::SHADING_LANGUAGE_VERSION) + &quot;)&quot;);
+    case GraphicsContext3D::STENCIL_BACK_FAIL:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::STENCIL_BACK_FUNC:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::STENCIL_BACK_PASS_DEPTH_FAIL:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::STENCIL_BACK_PASS_DEPTH_PASS:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::STENCIL_BACK_REF:
+        return getIntParameter(pname);
+    case GraphicsContext3D::STENCIL_BACK_VALUE_MASK:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::STENCIL_BACK_WRITEMASK:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::STENCIL_BITS:
+        if (!m_framebufferBinding &amp;&amp; !m_attributes.stencil)
+            return WebGLGetInfo(intZero);
+        return getIntParameter(pname);
+    case GraphicsContext3D::STENCIL_CLEAR_VALUE:
+        return getIntParameter(pname);
+    case GraphicsContext3D::STENCIL_FAIL:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::STENCIL_FUNC:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::STENCIL_PASS_DEPTH_FAIL:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::STENCIL_PASS_DEPTH_PASS:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::STENCIL_REF:
+        return getIntParameter(pname);
+    case GraphicsContext3D::STENCIL_TEST:
+        return getBooleanParameter(pname);
+    case GraphicsContext3D::STENCIL_VALUE_MASK:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::STENCIL_WRITEMASK:
+        return getUnsignedIntParameter(pname);
+    case GraphicsContext3D::SUBPIXEL_BITS:
+        return getIntParameter(pname);
+    case GraphicsContext3D::TEXTURE_BINDING_2D:
+        return WebGLGetInfo(PassRefPtr&lt;WebGLTexture&gt;(m_textureUnits[m_activeTextureUnit].texture2DBinding));
+    case GraphicsContext3D::TEXTURE_BINDING_CUBE_MAP:
+        return WebGLGetInfo(PassRefPtr&lt;WebGLTexture&gt;(m_textureUnits[m_activeTextureUnit].textureCubeMapBinding));
+    case GraphicsContext3D::UNPACK_ALIGNMENT:
+        return getIntParameter(pname);
+    case GraphicsContext3D::UNPACK_FLIP_Y_WEBGL:
+        return WebGLGetInfo(m_unpackFlipY);
+    case GraphicsContext3D::UNPACK_PREMULTIPLY_ALPHA_WEBGL:
+        return WebGLGetInfo(m_unpackPremultiplyAlpha);
+    case GraphicsContext3D::UNPACK_COLORSPACE_CONVERSION_WEBGL:
+        return WebGLGetInfo(m_unpackColorspaceConversion);
+    case GraphicsContext3D::VENDOR:
+        return WebGLGetInfo(String(&quot;WebKit&quot;));
+    case GraphicsContext3D::VERSION:
+        return WebGLGetInfo(&quot;WebGL 1.0 (&quot; + m_context-&gt;getString(GraphicsContext3D::VERSION) + &quot;)&quot;);
+    case GraphicsContext3D::VIEWPORT:
+        return getWebGLIntArrayParameter(pname);
+    case Extensions3D::FRAGMENT_SHADER_DERIVATIVE_HINT_OES: // OES_standard_derivatives
+        if (m_oesStandardDerivatives)
+            return getUnsignedIntParameter(Extensions3D::FRAGMENT_SHADER_DERIVATIVE_HINT_OES);
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getParameter&quot;, &quot;invalid parameter name, OES_standard_derivatives not enabled&quot;);
+        return WebGLGetInfo();
+    case WebGLDebugRendererInfo::UNMASKED_RENDERER_WEBGL:
+        if (m_webglDebugRendererInfo)
+            return WebGLGetInfo(m_context-&gt;getString(GraphicsContext3D::RENDERER));
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getParameter&quot;, &quot;invalid parameter name, WEBGL_debug_renderer_info not enabled&quot;);
+        return WebGLGetInfo();
+    case WebGLDebugRendererInfo::UNMASKED_VENDOR_WEBGL:
+        if (m_webglDebugRendererInfo)
+            return WebGLGetInfo(m_context-&gt;getString(GraphicsContext3D::VENDOR));
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getParameter&quot;, &quot;invalid parameter name, WEBGL_debug_renderer_info not enabled&quot;);
+        return WebGLGetInfo();
+    case Extensions3D::VERTEX_ARRAY_BINDING_OES: // OES_vertex_array_object
+        if (m_oesVertexArrayObject) {
+            if (!m_boundVertexArrayObject-&gt;isDefaultObject())
+                return WebGLGetInfo(PassRefPtr&lt;WebGLVertexArrayObjectOES&gt;(m_boundVertexArrayObject));
+            return WebGLGetInfo();
+        }
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getParameter&quot;, &quot;invalid parameter name, OES_vertex_array_object not enabled&quot;);
+        return WebGLGetInfo();
+    case Extensions3D::MAX_TEXTURE_MAX_ANISOTROPY_EXT: // EXT_texture_filter_anisotropic
+        if (m_extTextureFilterAnisotropic)
+            return getUnsignedIntParameter(Extensions3D::MAX_TEXTURE_MAX_ANISOTROPY_EXT);
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getParameter&quot;, &quot;invalid parameter name, EXT_texture_filter_anisotropic not enabled&quot;);
+        return WebGLGetInfo();
+    case Extensions3D::MAX_COLOR_ATTACHMENTS_EXT: // EXT_draw_buffers BEGIN
+        if (m_webglDrawBuffers)
+            return WebGLGetInfo(getMaxColorAttachments());
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getParameter&quot;, &quot;invalid parameter name, WEBGL_draw_buffers not enabled&quot;);
+        return WebGLGetInfo();
+    case Extensions3D::MAX_DRAW_BUFFERS_EXT:
+        if (m_webglDrawBuffers)
+            return WebGLGetInfo(getMaxDrawBuffers());
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getParameter&quot;, &quot;invalid parameter name, WEBGL_draw_buffers not enabled&quot;);
+        return WebGLGetInfo();
+    default:
+        if (m_webglDrawBuffers
+            &amp;&amp; pname &gt;= Extensions3D::DRAW_BUFFER0_EXT
+            &amp;&amp; pname &lt; static_cast&lt;GC3Denum&gt;(Extensions3D::DRAW_BUFFER0_EXT + getMaxDrawBuffers())) {
+            GC3Dint value = GraphicsContext3D::NONE;
+            if (m_framebufferBinding)
+                value = m_framebufferBinding-&gt;getDrawBuffer(pname);
+            else // emulated backbuffer
+                value = m_backDrawBuffer;
+            return WebGLGetInfo(value);
+        }
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getParameter&quot;, &quot;invalid parameter name&quot;);
+        return WebGLGetInfo();
+    }
+}
+
+WebGLGetInfo WebGLRenderingContextBase::getProgramParameter(WebGLProgram* program, GC3Denum pname, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateWebGLObject(&quot;getProgramParameter&quot;, program))
+        return WebGLGetInfo();
+    
+    GC3Dint value = 0;
+    switch (pname) {
+    case GraphicsContext3D::DELETE_STATUS:
+        return WebGLGetInfo(program-&gt;isDeleted());
+    case GraphicsContext3D::VALIDATE_STATUS:
+        m_context-&gt;getProgramiv(objectOrZero(program), pname, &amp;value);
+        return WebGLGetInfo(static_cast&lt;bool&gt;(value));
+    case GraphicsContext3D::LINK_STATUS:
+        return WebGLGetInfo(program-&gt;getLinkStatus());
+    case GraphicsContext3D::ATTACHED_SHADERS:
+        m_context-&gt;getProgramiv(objectOrZero(program), pname, &amp;value);
+        return WebGLGetInfo(value);
+    case GraphicsContext3D::ACTIVE_ATTRIBUTES:
+    case GraphicsContext3D::ACTIVE_UNIFORMS:
+        m_context-&gt;getNonBuiltInActiveSymbolCount(objectOrZero(program), pname, &amp;value);
+        return WebGLGetInfo(value);
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getProgramParameter&quot;, &quot;invalid parameter name&quot;);
+        return WebGLGetInfo();
+    }
+}
+
+String WebGLRenderingContextBase::getProgramInfoLog(WebGLProgram* program, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return String();
+    if (!validateWebGLObject(&quot;getProgramInfoLog&quot;, program))
+        return &quot;&quot;;
+    return ensureNotNull(m_context-&gt;getProgramInfoLog(objectOrZero(program)));
+}
+
+WebGLGetInfo WebGLRenderingContextBase::getRenderbufferParameter(GC3Denum target, GC3Denum pname, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return WebGLGetInfo();
+    if (target != GraphicsContext3D::RENDERBUFFER) {
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getRenderbufferParameter&quot;, &quot;invalid target&quot;);
+        return WebGLGetInfo();
+    }
+    if (!m_renderbufferBinding || !m_renderbufferBinding-&gt;object()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;getRenderbufferParameter&quot;, &quot;no renderbuffer bound&quot;);
+        return WebGLGetInfo();
+    }
+    
+    if (m_renderbufferBinding-&gt;getInternalFormat() == GraphicsContext3D::DEPTH_STENCIL
+        &amp;&amp; !m_renderbufferBinding-&gt;isValid()) {
+        ASSERT(!isDepthStencilSupported());
+        int value = 0;
+        switch (pname) {
+        case GraphicsContext3D::RENDERBUFFER_WIDTH:
+            value = m_renderbufferBinding-&gt;getWidth();
+            break;
+        case GraphicsContext3D::RENDERBUFFER_HEIGHT:
+            value = m_renderbufferBinding-&gt;getHeight();
+            break;
+        case GraphicsContext3D::RENDERBUFFER_RED_SIZE:
+        case GraphicsContext3D::RENDERBUFFER_GREEN_SIZE:
+        case GraphicsContext3D::RENDERBUFFER_BLUE_SIZE:
+        case GraphicsContext3D::RENDERBUFFER_ALPHA_SIZE:
+            value = 0;
+            break;
+        case GraphicsContext3D::RENDERBUFFER_DEPTH_SIZE:
+            value = 24;
+            break;
+        case GraphicsContext3D::RENDERBUFFER_STENCIL_SIZE:
+            value = 8;
+            break;
+        case GraphicsContext3D::RENDERBUFFER_INTERNAL_FORMAT:
+            return WebGLGetInfo(m_renderbufferBinding-&gt;getInternalFormat());
+        default:
+            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getRenderbufferParameter&quot;, &quot;invalid parameter name&quot;);
+            return WebGLGetInfo();
+        }
+        return WebGLGetInfo(value);
+    }
+    
+    GC3Dint value = 0;
+    switch (pname) {
+    case GraphicsContext3D::RENDERBUFFER_WIDTH:
+    case GraphicsContext3D::RENDERBUFFER_HEIGHT:
+    case GraphicsContext3D::RENDERBUFFER_RED_SIZE:
+    case GraphicsContext3D::RENDERBUFFER_GREEN_SIZE:
+    case GraphicsContext3D::RENDERBUFFER_BLUE_SIZE:
+    case GraphicsContext3D::RENDERBUFFER_ALPHA_SIZE:
+    case GraphicsContext3D::RENDERBUFFER_DEPTH_SIZE:
+    case GraphicsContext3D::RENDERBUFFER_STENCIL_SIZE:
+        m_context-&gt;getRenderbufferParameteriv(target, pname, &amp;value);
+        return WebGLGetInfo(value);
+    case GraphicsContext3D::RENDERBUFFER_INTERNAL_FORMAT:
+        return WebGLGetInfo(m_renderbufferBinding-&gt;getInternalFormat());
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getRenderbufferParameter&quot;, &quot;invalid parameter name&quot;);
+        return WebGLGetInfo();
+    }
+}
+
+WebGLGetInfo WebGLRenderingContextBase::getShaderParameter(WebGLShader* shader, GC3Denum pname, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateWebGLObject(&quot;getShaderParameter&quot;, shader))
+        return WebGLGetInfo();
+    GC3Dint value = 0;
+    switch (pname) {
+    case GraphicsContext3D::DELETE_STATUS:
+        return WebGLGetInfo(shader-&gt;isDeleted());
+    case GraphicsContext3D::COMPILE_STATUS:
+        m_context-&gt;getShaderiv(objectOrZero(shader), pname, &amp;value);
+        return WebGLGetInfo(static_cast&lt;bool&gt;(value));
+    case GraphicsContext3D::SHADER_TYPE:
+        m_context-&gt;getShaderiv(objectOrZero(shader), pname, &amp;value);
+        return WebGLGetInfo(static_cast&lt;unsigned&gt;(value));
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getShaderParameter&quot;, &quot;invalid parameter name&quot;);
+        return WebGLGetInfo();
+    }
+}
+
+String WebGLRenderingContextBase::getShaderInfoLog(WebGLShader* shader, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return String();
+    if (!validateWebGLObject(&quot;getShaderInfoLog&quot;, shader))
+        return &quot;&quot;;
+    return ensureNotNull(m_context-&gt;getShaderInfoLog(objectOrZero(shader)));
+}
+
+PassRefPtr&lt;WebGLShaderPrecisionFormat&gt; WebGLRenderingContextBase::getShaderPrecisionFormat(GC3Denum shaderType, GC3Denum precisionType, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return nullptr;
+    switch (shaderType) {
+    case GraphicsContext3D::VERTEX_SHADER:
+    case GraphicsContext3D::FRAGMENT_SHADER:
+        break;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getShaderPrecisionFormat&quot;, &quot;invalid shader type&quot;);
+        return nullptr;
+    }
+    switch (precisionType) {
+    case GraphicsContext3D::LOW_FLOAT:
+    case GraphicsContext3D::MEDIUM_FLOAT:
+    case GraphicsContext3D::HIGH_FLOAT:
+    case GraphicsContext3D::LOW_INT:
+    case GraphicsContext3D::MEDIUM_INT:
+    case GraphicsContext3D::HIGH_INT:
+        break;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getShaderPrecisionFormat&quot;, &quot;invalid precision type&quot;);
+        return nullptr;
+    }
+    
+    GC3Dint range[2] = {0, 0};
+    GC3Dint precision = 0;
+    m_context-&gt;getShaderPrecisionFormat(shaderType, precisionType, range, &amp;precision);
+    return WebGLShaderPrecisionFormat::create(range[0], range[1], precision);
+}
+
+String WebGLRenderingContextBase::getShaderSource(WebGLShader* shader, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return String();
+    if (!validateWebGLObject(&quot;getShaderSource&quot;, shader))
+        return &quot;&quot;;
+    return ensureNotNull(shader-&gt;getSource());
+}
+
+Vector&lt;String&gt; WebGLRenderingContextBase::getSupportedExtensions()
+{
+    Vector&lt;String&gt; result;
+    
+    if (m_isPendingPolicyResolution)
+        return result;
+    
+    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_blend_minmax&quot;))
+        result.append(&quot;EXT_blend_minmax&quot;);
+    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_sRGB&quot;))
+        result.append(&quot;EXT_sRGB&quot;);
+    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_frag_depth&quot;))
+        result.append(&quot;EXT_frag_depth&quot;);
+    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_texture_float&quot;))
+        result.append(&quot;OES_texture_float&quot;);
+    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_texture_float_linear&quot;))
+        result.append(&quot;OES_texture_float_linear&quot;);
+    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_texture_half_float&quot;))
+        result.append(&quot;OES_texture_half_float&quot;);
+    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_texture_half_float_linear&quot;))
+        result.append(&quot;OES_texture_half_float_linear&quot;);
+    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_standard_derivatives&quot;))
+        result.append(&quot;OES_standard_derivatives&quot;);
+    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_shader_texture_lod&quot;) || m_context-&gt;getExtensions()-&gt;supports(&quot;GL_ARB_shader_texture_lod&quot;))
+        result.append(&quot;EXT_shader_texture_lod&quot;);
+    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_EXT_texture_filter_anisotropic&quot;))
+        result.append(&quot;WEBKIT_EXT_texture_filter_anisotropic&quot;);
+    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_vertex_array_object&quot;))
+        result.append(&quot;OES_vertex_array_object&quot;);
+    if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_OES_element_index_uint&quot;))
+        result.append(&quot;OES_element_index_uint&quot;);
+    result.append(&quot;WEBGL_lose_context&quot;);
+    if (WebGLCompressedTextureATC::supported(this))
+        result.append(&quot;WEBKIT_WEBGL_compressed_texture_atc&quot;);
+    if (WebGLCompressedTexturePVRTC::supported(this))
+        result.append(&quot;WEBKIT_WEBGL_compressed_texture_pvrtc&quot;);
+    if (WebGLCompressedTextureS3TC::supported(this))
+        result.append(&quot;WEBGL_compressed_texture_s3tc&quot;);
+    if (WebGLDepthTexture::supported(graphicsContext3D()))
+        result.append(&quot;WEBGL_depth_texture&quot;);
+    if (supportsDrawBuffers())
+        result.append(&quot;WEBGL_draw_buffers&quot;);
+    if (ANGLEInstancedArrays::supported(this))
+        result.append(&quot;ANGLE_instanced_arrays&quot;);
+    
+    if (allowPrivilegedExtensions()) {
+        if (m_context-&gt;getExtensions()-&gt;supports(&quot;GL_ANGLE_translated_shader_source&quot;))
+            result.append(&quot;WEBGL_debug_shaders&quot;);
+        result.append(&quot;WEBGL_debug_renderer_info&quot;);
+    }
+    
+    return result;
+}
+
+WebGLGetInfo WebGLRenderingContextBase::getTexParameter(GC3Denum target, GC3Denum pname, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return WebGLGetInfo();
+    WebGLTexture* tex = validateTextureBinding(&quot;getTexParameter&quot;, target, false);
+    if (!tex)
+        return WebGLGetInfo();
+    GC3Dint value = 0;
+    switch (pname) {
+    case GraphicsContext3D::TEXTURE_MAG_FILTER:
+    case GraphicsContext3D::TEXTURE_MIN_FILTER:
+    case GraphicsContext3D::TEXTURE_WRAP_S:
+    case GraphicsContext3D::TEXTURE_WRAP_T:
+        m_context-&gt;getTexParameteriv(target, pname, &amp;value);
+        return WebGLGetInfo(static_cast&lt;unsigned&gt;(value));
+    case Extensions3D::TEXTURE_MAX_ANISOTROPY_EXT: // EXT_texture_filter_anisotropic
+        if (m_extTextureFilterAnisotropic) {
+            m_context-&gt;getTexParameteriv(target, pname, &amp;value);
+            return WebGLGetInfo(static_cast&lt;unsigned&gt;(value));
+        }
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getTexParameter&quot;, &quot;invalid parameter name, EXT_texture_filter_anisotropic not enabled&quot;);
+        return WebGLGetInfo();
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getTexParameter&quot;, &quot;invalid parameter name&quot;);
+        return WebGLGetInfo();
+    }
+}
+
+WebGLGetInfo WebGLRenderingContextBase::getUniform(WebGLProgram* program, const WebGLUniformLocation* uniformLocation, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateWebGLObject(&quot;getUniform&quot;, program))
+        return WebGLGetInfo();
+    if (!uniformLocation || uniformLocation-&gt;program() != program) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;getUniform&quot;, &quot;no uniformlocation or not valid for this program&quot;);
+        return WebGLGetInfo();
+    }
+    GC3Dint location = uniformLocation-&gt;location();
+    
+    GC3Denum baseType;
+    unsigned length;
+    switch (uniformLocation-&gt;type()) {
+    case GraphicsContext3D::BOOL:
+        baseType = GraphicsContext3D::BOOL;
+        length = 1;
+        break;
+    case GraphicsContext3D::BOOL_VEC2:
+        baseType = GraphicsContext3D::BOOL;
+        length = 2;
+        break;
+    case GraphicsContext3D::BOOL_VEC3:
+        baseType = GraphicsContext3D::BOOL;
+        length = 3;
+        break;
+    case GraphicsContext3D::BOOL_VEC4:
+        baseType = GraphicsContext3D::BOOL;
+        length = 4;
+        break;
+    case GraphicsContext3D::INT:
+        baseType = GraphicsContext3D::INT;
+        length = 1;
+        break;
+    case GraphicsContext3D::INT_VEC2:
+        baseType = GraphicsContext3D::INT;
+        length = 2;
+        break;
+    case GraphicsContext3D::INT_VEC3:
+        baseType = GraphicsContext3D::INT;
+        length = 3;
+        break;
+    case GraphicsContext3D::INT_VEC4:
+        baseType = GraphicsContext3D::INT;
+        length = 4;
+        break;
+    case GraphicsContext3D::FLOAT:
+        baseType = GraphicsContext3D::FLOAT;
+        length = 1;
+        break;
+    case GraphicsContext3D::FLOAT_VEC2:
+        baseType = GraphicsContext3D::FLOAT;
+        length = 2;
+        break;
+    case GraphicsContext3D::FLOAT_VEC3:
+        baseType = GraphicsContext3D::FLOAT;
+        length = 3;
+        break;
+    case GraphicsContext3D::FLOAT_VEC4:
+        baseType = GraphicsContext3D::FLOAT;
+        length = 4;
+        break;
+    case GraphicsContext3D::FLOAT_MAT2:
+        baseType = GraphicsContext3D::FLOAT;
+        length = 4;
+        break;
+    case GraphicsContext3D::FLOAT_MAT3:
+        baseType = GraphicsContext3D::FLOAT;
+        length = 9;
+        break;
+    case GraphicsContext3D::FLOAT_MAT4:
+        baseType = GraphicsContext3D::FLOAT;
+        length = 16;
+        break;
+    case GraphicsContext3D::SAMPLER_2D:
+    case GraphicsContext3D::SAMPLER_CUBE:
+        baseType = GraphicsContext3D::INT;
+        length = 1;
+        break;
+    default:
+        // Can't handle this type
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;getUniform&quot;, &quot;unhandled type&quot;);
+        return WebGLGetInfo();
+    }
+    switch (baseType) {
+    case GraphicsContext3D::FLOAT: {
+        GC3Dfloat value[16] = {0};
+        if (m_isRobustnessEXTSupported)
+            m_context-&gt;getExtensions()-&gt;getnUniformfvEXT(objectOrZero(program), location, 16 * sizeof(GC3Dfloat), value);
+        else
+            m_context-&gt;getUniformfv(objectOrZero(program), location, value);
+        if (length == 1)
+            return WebGLGetInfo(value[0]);
+        return WebGLGetInfo(Float32Array::create(value, length));
+    }
+    case GraphicsContext3D::INT: {
+        GC3Dint value[4] = {0};
+        if (m_isRobustnessEXTSupported)
+            m_context-&gt;getExtensions()-&gt;getnUniformivEXT(objectOrZero(program), location, 4 * sizeof(GC3Dint), value);
+        else
+            m_context-&gt;getUniformiv(objectOrZero(program), location, value);
+        if (length == 1)
+            return WebGLGetInfo(value[0]);
+        return WebGLGetInfo(Int32Array::create(value, length));
+    }
+    case GraphicsContext3D::BOOL: {
+        GC3Dint value[4] = {0};
+        if (m_isRobustnessEXTSupported)
+            m_context-&gt;getExtensions()-&gt;getnUniformivEXT(objectOrZero(program), location, 4 * sizeof(GC3Dint), value);
+        else
+            m_context-&gt;getUniformiv(objectOrZero(program), location, value);
+        if (length &gt; 1) {
+            bool boolValue[16] = {0};
+            for (unsigned j = 0; j &lt; length; j++)
+                boolValue[j] = static_cast&lt;bool&gt;(value[j]);
+            return WebGLGetInfo(boolValue, length);
+        }
+        return WebGLGetInfo(static_cast&lt;bool&gt;(value[0]));
+    }
+    default:
+        notImplemented();
+    }
+    
+    // If we get here, something went wrong in our unfortunately complex logic above
+    synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;getUniform&quot;, &quot;unknown error&quot;);
+    return WebGLGetInfo();
+}
+
+PassRefPtr&lt;WebGLUniformLocation&gt; WebGLRenderingContextBase::getUniformLocation(WebGLProgram* program, const String&amp; name, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateWebGLObject(&quot;getUniformLocation&quot;, program))
+        return nullptr;
+    if (!validateLocationLength(&quot;getUniformLocation&quot;, name))
+        return nullptr;
+    if (!validateString(&quot;getUniformLocation&quot;, name))
+        return nullptr;
+    if (isPrefixReserved(name))
+        return nullptr;
+    if (!program-&gt;getLinkStatus()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;getUniformLocation&quot;, &quot;program not linked&quot;);
+        return nullptr;
+    }
+    GC3Dint uniformLocation = m_context-&gt;getUniformLocation(objectOrZero(program), name);
+    if (uniformLocation == -1)
+        return nullptr;
+    
+    GC3Dint activeUniforms = 0;
+    m_context-&gt;getNonBuiltInActiveSymbolCount(objectOrZero(program), GraphicsContext3D::ACTIVE_UNIFORMS, &amp;activeUniforms);
+    for (GC3Dint i = 0; i &lt; activeUniforms; i++) {
+        ActiveInfo info;
+        if (!m_context-&gt;getActiveUniform(objectOrZero(program), i, info))
+            return nullptr;
+        // Strip &quot;[0]&quot; from the name if it's an array.
+        if (info.name.endsWith(&quot;[0]&quot;))
+            info.name = info.name.left(info.name.length() - 3);
+        // If it's an array, we need to iterate through each element, appending &quot;[index]&quot; to the name.
+        for (GC3Dint index = 0; index &lt; info.size; ++index) {
+            String uniformName = info.name + &quot;[&quot; + String::number(index) + &quot;]&quot;;
+            
+            if (name == uniformName || name == info.name)
+                return WebGLUniformLocation::create(program, uniformLocation, info.type);
+        }
+    }
+    return nullptr;
+}
+
+WebGLGetInfo WebGLRenderingContextBase::getVertexAttrib(GC3Duint index, GC3Denum pname, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    
+    if (isContextLostOrPending())
+        return WebGLGetInfo();
+    
+    if (index &gt;= m_maxVertexAttribs) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;getVertexAttrib&quot;, &quot;index out of range&quot;);
+        return WebGLGetInfo();
+    }
+    
+    const WebGLVertexArrayObjectOES::VertexAttribState&amp; state = m_boundVertexArrayObject-&gt;getVertexAttribState(index);
+    
+    if (m_angleInstancedArrays &amp;&amp; pname == GraphicsContext3D::VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE)
+        return WebGLGetInfo(state.divisor);
+    
+    switch (pname) {
+    case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
+        if ((!isGLES2Compliant() &amp;&amp; !index &amp;&amp; m_boundVertexArrayObject-&gt;getVertexAttribState(0).bufferBinding == m_vertexAttrib0Buffer)
+            || !state.bufferBinding
+            || !state.bufferBinding-&gt;object())
+            return WebGLGetInfo();
+        return WebGLGetInfo(PassRefPtr&lt;WebGLBuffer&gt;(state.bufferBinding));
+    case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_ENABLED:
+        return WebGLGetInfo(state.enabled);
+    case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_NORMALIZED:
+        return WebGLGetInfo(state.normalized);
+    case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_SIZE:
+        return WebGLGetInfo(state.size);
+    case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_STRIDE:
+        return WebGLGetInfo(state.originalStride);
+    case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_TYPE:
+        return WebGLGetInfo(state.type);
+    case GraphicsContext3D::CURRENT_VERTEX_ATTRIB:
+        return WebGLGetInfo(Float32Array::create(m_vertexAttribValue[index].value, 4));
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;getVertexAttrib&quot;, &quot;invalid parameter name&quot;);
+        return WebGLGetInfo();
+    }
+}
+
+long long WebGLRenderingContextBase::getVertexAttribOffset(GC3Duint index, GC3Denum pname)
+{
+    if (isContextLostOrPending())
+        return 0;
+    GC3Dsizeiptr result = m_context-&gt;getVertexAttribOffset(index, pname);
+    return static_cast&lt;long long&gt;(result);
+}
+
+void WebGLRenderingContextBase::hint(GC3Denum target, GC3Denum mode)
+{
+    if (isContextLostOrPending())
+        return;
+    bool isValid = false;
+    switch (target) {
+    case GraphicsContext3D::GENERATE_MIPMAP_HINT:
+        isValid = true;
+        break;
+    case Extensions3D::FRAGMENT_SHADER_DERIVATIVE_HINT_OES: // OES_standard_derivatives
+        if (m_oesStandardDerivatives)
+            isValid = true;
+        break;
+    }
+    if (!isValid) {
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;hint&quot;, &quot;invalid target&quot;);
+        return;
+    }
+    m_context-&gt;hint(target, mode);
+}
+
+GC3Dboolean WebGLRenderingContextBase::isBuffer(WebGLBuffer* buffer)
+{
+    if (!buffer || isContextLostOrPending())
+        return 0;
+    
+    if (!buffer-&gt;hasEverBeenBound())
+        return 0;
+    
+    return m_context-&gt;isBuffer(buffer-&gt;object());
+}
+
+bool WebGLRenderingContextBase::isContextLost() const
+{
+    return m_contextLost;
+}
+
+bool WebGLRenderingContextBase::isContextLostOrPending()
+{
+    if (m_isPendingPolicyResolution &amp;&amp; !m_hasRequestedPolicyResolution) {
+        LOG(WebGL, &quot;Context is being used. Attempt to resolve the policy.&quot;);
+        Document&amp; document = canvas()-&gt;document().topDocument();
+        Page* page = document.page();
+        if (page &amp;&amp; !document.url().isLocalFile())
+            page-&gt;mainFrame().loader().client().resolveWebGLPolicyForURL(document.url());
+        // FIXME: We don't currently do anything with the result from resolution. A more
+        // complete implementation might try to construct a real context, etc and proceed
+        // with normal operation.
+        // https://bugs.webkit.org/show_bug.cgi?id=129122
+        m_hasRequestedPolicyResolution = true;
+    }
+    
+    return m_contextLost || m_isPendingPolicyResolution;
+}
+
+GC3Dboolean WebGLRenderingContextBase::isEnabled(GC3Denum cap)
+{
+    if (isContextLostOrPending() || !validateCapability(&quot;isEnabled&quot;, cap))
+        return 0;
+    if (cap == GraphicsContext3D::STENCIL_TEST)
+        return m_stencilEnabled;
+    return m_context-&gt;isEnabled(cap);
+}
+
+GC3Dboolean WebGLRenderingContextBase::isFramebuffer(WebGLFramebuffer* framebuffer)
+{
+    if (!framebuffer || isContextLostOrPending())
+        return 0;
+    
+    if (!framebuffer-&gt;hasEverBeenBound())
+        return 0;
+    
+    return m_context-&gt;isFramebuffer(framebuffer-&gt;object());
+}
+
+GC3Dboolean WebGLRenderingContextBase::isProgram(WebGLProgram* program)
+{
+    if (!program || isContextLostOrPending())
+        return 0;
+    
+    return m_context-&gt;isProgram(program-&gt;object());
+}
+
+GC3Dboolean WebGLRenderingContextBase::isRenderbuffer(WebGLRenderbuffer* renderbuffer)
+{
+    if (!renderbuffer || isContextLostOrPending())
+        return 0;
+    
+    if (!renderbuffer-&gt;hasEverBeenBound())
+        return 0;
+    
+    return m_context-&gt;isRenderbuffer(renderbuffer-&gt;object());
+}
+
+GC3Dboolean WebGLRenderingContextBase::isShader(WebGLShader* shader)
+{
+    if (!shader || isContextLostOrPending())
+        return 0;
+    
+    return m_context-&gt;isShader(shader-&gt;object());
+}
+
+GC3Dboolean WebGLRenderingContextBase::isTexture(WebGLTexture* texture)
+{
+    if (!texture || isContextLostOrPending())
+        return 0;
+    
+    if (!texture-&gt;hasEverBeenBound())
+        return 0;
+    
+    return m_context-&gt;isTexture(texture-&gt;object());
+}
+
+void WebGLRenderingContextBase::lineWidth(GC3Dfloat width)
+{
+    if (isContextLostOrPending())
+        return;
+    m_context-&gt;lineWidth(width);
+}
+
+void WebGLRenderingContextBase::linkProgram(WebGLProgram* program, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateWebGLObject(&quot;linkProgram&quot;, program))
+        return;
+    if (!isGLES2Compliant()) {
+        WebGLShader* vertexShader = program-&gt;getAttachedShader(GraphicsContext3D::VERTEX_SHADER);
+        WebGLShader* fragmentShader = program-&gt;getAttachedShader(GraphicsContext3D::FRAGMENT_SHADER);
+        if (!vertexShader || !vertexShader-&gt;isValid() || !fragmentShader || !fragmentShader-&gt;isValid() || !m_context-&gt;precisionsMatch(objectOrZero(vertexShader), objectOrZero(fragmentShader)) || !m_context-&gt;checkVaryingsPacking(objectOrZero(vertexShader), objectOrZero(fragmentShader))) {
+            program-&gt;setLinkStatus(false);
+            return;
+        }
+    }
+    
+    m_context-&gt;linkProgram(objectOrZero(program));
+    program-&gt;increaseLinkCount();
+}
+
+void WebGLRenderingContextBase::pixelStorei(GC3Denum pname, GC3Dint param)
+{
+    if (isContextLostOrPending())
+        return;
+    switch (pname) {
+    case GraphicsContext3D::UNPACK_FLIP_Y_WEBGL:
+        m_unpackFlipY = param;
+        break;
+    case GraphicsContext3D::UNPACK_PREMULTIPLY_ALPHA_WEBGL:
+        m_unpackPremultiplyAlpha = param;
+        break;
+    case GraphicsContext3D::UNPACK_COLORSPACE_CONVERSION_WEBGL:
+        if (param == GraphicsContext3D::BROWSER_DEFAULT_WEBGL || param == GraphicsContext3D::NONE)
+            m_unpackColorspaceConversion = static_cast&lt;GC3Denum&gt;(param);
+        else {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;pixelStorei&quot;, &quot;invalid parameter for UNPACK_COLORSPACE_CONVERSION_WEBGL&quot;);
+            return;
+        }
+        break;
+    case GraphicsContext3D::PACK_ALIGNMENT:
+    case GraphicsContext3D::UNPACK_ALIGNMENT:
+        if (param == 1 || param == 2 || param == 4 || param == 8) {
+            if (pname == GraphicsContext3D::PACK_ALIGNMENT)
+                m_packAlignment = param;
+            else // GraphicsContext3D::UNPACK_ALIGNMENT:
+                m_unpackAlignment = param;
+            m_context-&gt;pixelStorei(pname, param);
+        } else {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;pixelStorei&quot;, &quot;invalid parameter for alignment&quot;);
+            return;
+        }
+        break;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;pixelStorei&quot;, &quot;invalid parameter name&quot;);
+        return;
+    }
+}
+
+void WebGLRenderingContextBase::polygonOffset(GC3Dfloat factor, GC3Dfloat units)
+{
+    if (isContextLostOrPending())
+        return;
+    m_context-&gt;polygonOffset(factor, units);
+}
+
+void WebGLRenderingContextBase::readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, ArrayBufferView* pixels, ExceptionCode&amp;)
+{
+    if (isContextLostOrPending())
+        return;
+    // Due to WebGL's same-origin restrictions, it is not possible to
+    // taint the origin using the WebGL API.
+    ASSERT(canvas()-&gt;originClean());
+    // Validate input parameters.
+    if (!pixels) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;readPixels&quot;, &quot;no destination ArrayBufferView&quot;);
+        return;
+    }
+    switch (format) {
+    case GraphicsContext3D::ALPHA:
+    case GraphicsContext3D::RGB:
+    case GraphicsContext3D::RGBA:
+        break;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;readPixels&quot;, &quot;invalid format&quot;);
+        return;
+    }
+    switch (type) {
+    case GraphicsContext3D::UNSIGNED_BYTE:
+    case GraphicsContext3D::UNSIGNED_SHORT_5_6_5:
+    case GraphicsContext3D::UNSIGNED_SHORT_4_4_4_4:
+    case GraphicsContext3D::UNSIGNED_SHORT_5_5_5_1:
+        break;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;readPixels&quot;, &quot;invalid type&quot;);
+        return;
+    }
+    if (format != GraphicsContext3D::RGBA || type != GraphicsContext3D::UNSIGNED_BYTE) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;readPixels&quot;, &quot;format not RGBA or type not UNSIGNED_BYTE&quot;);
+        return;
+    }
+    // Validate array type against pixel type.
+    if (pixels-&gt;getType() != JSC::TypeUint8) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;readPixels&quot;, &quot;ArrayBufferView not Uint8Array&quot;);
+        return;
+    }
+    const char* reason = &quot;framebuffer incomplete&quot;;
+    if (m_framebufferBinding &amp;&amp; !m_framebufferBinding-&gt;onAccess(graphicsContext3D(), !isResourceSafe(), &amp;reason)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, &quot;readPixels&quot;, reason);
+        return;
+    }
+    // Calculate array size, taking into consideration of PACK_ALIGNMENT.
+    unsigned totalBytesRequired = 0;
+    unsigned padding = 0;
+    if (!m_isRobustnessEXTSupported) {
+        GC3Denum error = m_context-&gt;computeImageSizeInBytes(format, type, width, height, m_packAlignment, &amp;totalBytesRequired, &amp;padding);
+        if (error != GraphicsContext3D::NO_ERROR) {
+            synthesizeGLError(error, &quot;readPixels&quot;, &quot;invalid dimensions&quot;);
+            return;
+        }
+        if (pixels-&gt;byteLength() &lt; totalBytesRequired) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;readPixels&quot;, &quot;ArrayBufferView not large enough for dimensions&quot;);
+            return;
+        }
+    }
+    
+    clearIfComposited();
+    void* data = pixels-&gt;baseAddress();
+    
+    {
+        ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding.get());
+        if (m_isRobustnessEXTSupported)
+            m_context-&gt;getExtensions()-&gt;readnPixelsEXT(x, y, width, height, format, type, pixels-&gt;byteLength(), data);
+        else
+            m_context-&gt;readPixels(x, y, width, height, format, type, data);
+    }
+    
+#if OS(DARWIN)
+    if (m_isRobustnessEXTSupported) // we haven't computed padding
+        m_context-&gt;computeImageSizeInBytes(format, type, width, height, m_packAlignment, &amp;totalBytesRequired, &amp;padding);
+    // FIXME: remove this section when GL driver bug on Mac AND the GLES driver bug
+    // on QC is fixed, i.e., when alpha is off, readPixels should
+    // set alpha to 255 instead of 0.
+    if (!m_framebufferBinding &amp;&amp; !m_context-&gt;getContextAttributes().alpha) {
+        unsigned char* pixels = reinterpret_cast&lt;unsigned char*&gt;(data);
+        for (GC3Dsizei iy = 0; iy &lt; height; ++iy) {
+            for (GC3Dsizei ix = 0; ix &lt; width; ++ix) {
+                pixels[3] = 255;
+                pixels += 4;
+            }
+            pixels += padding;
+        }
+    }
+#endif
+}
+
+void WebGLRenderingContextBase::releaseShaderCompiler()
+{
+    if (isContextLostOrPending())
+        return;
+    m_context-&gt;releaseShaderCompiler();
+}
+
+void WebGLRenderingContextBase::renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height)
+{
+    if (isContextLostOrPending())
+        return;
+    if (target != GraphicsContext3D::RENDERBUFFER) {
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;renderbufferStorage&quot;, &quot;invalid target&quot;);
+        return;
+    }
+    if (!m_renderbufferBinding || !m_renderbufferBinding-&gt;object()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;renderbufferStorage&quot;, &quot;no bound renderbuffer&quot;);
+        return;
+    }
+    if (!validateSize(&quot;renderbufferStorage&quot;, width, height))
+        return;
+    switch (internalformat) {
+    case GraphicsContext3D::DEPTH_COMPONENT16:
+    case GraphicsContext3D::RGBA4:
+    case GraphicsContext3D::RGB5_A1:
+    case GraphicsContext3D::RGB565:
+    case GraphicsContext3D::STENCIL_INDEX8:
+    case Extensions3D::SRGB8_ALPHA8_EXT:
+        if (internalformat == Extensions3D::SRGB8_ALPHA8_EXT &amp;&amp; !m_extsRGB) {
+            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;renderbufferStorage&quot;, &quot;invalid internalformat&quot;);
+            return;
+        }
+        m_context-&gt;renderbufferStorage(target, internalformat, width, height);
+        m_renderbufferBinding-&gt;setInternalFormat(internalformat);
+        m_renderbufferBinding-&gt;setIsValid(true);
+        m_renderbufferBinding-&gt;setSize(width, height);
+        break;
+    case GraphicsContext3D::DEPTH_STENCIL:
+        if (isDepthStencilSupported())
+            m_context-&gt;renderbufferStorage(target, Extensions3D::DEPTH24_STENCIL8, width, height);
+        m_renderbufferBinding-&gt;setSize(width, height);
+        m_renderbufferBinding-&gt;setIsValid(isDepthStencilSupported());
+        m_renderbufferBinding-&gt;setInternalFormat(internalformat);
+        break;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;renderbufferStorage&quot;, &quot;invalid internalformat&quot;);
+        return;
+    }
+    applyStencilTest();
+}
+
+void WebGLRenderingContextBase::sampleCoverage(GC3Dfloat value, GC3Dboolean invert)
+{
+    if (isContextLostOrPending())
+        return;
+    m_context-&gt;sampleCoverage(value, invert);
+}
+
+void WebGLRenderingContextBase::scissor(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
+{
+    if (isContextLostOrPending())
+        return;
+    if (!validateSize(&quot;scissor&quot;, width, height))
+        return;
+    m_context-&gt;scissor(x, y, width, height);
+}
+
+void WebGLRenderingContextBase::shaderSource(WebGLShader* shader, const String&amp; string, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateWebGLObject(&quot;shaderSource&quot;, shader))
+        return;
+    String stringWithoutComments = StripComments(string).result();
+    if (!validateString(&quot;shaderSource&quot;, stringWithoutComments))
+        return;
+    shader-&gt;setSource(string);
+    m_context-&gt;shaderSource(objectOrZero(shader), stringWithoutComments);
+}
+
+void WebGLRenderingContextBase::stencilFunc(GC3Denum func, GC3Dint ref, GC3Duint mask)
+{
+    if (isContextLostOrPending())
+        return;
+    if (!validateStencilFunc(&quot;stencilFunc&quot;, func))
+        return;
+    m_stencilFuncRef = ref;
+    m_stencilFuncRefBack = ref;
+    m_stencilFuncMask = mask;
+    m_stencilFuncMaskBack = mask;
+    m_context-&gt;stencilFunc(func, ref, mask);
+}
+
+void WebGLRenderingContextBase::stencilFuncSeparate(GC3Denum face, GC3Denum func, GC3Dint ref, GC3Duint mask)
+{
+    if (isContextLostOrPending())
+        return;
+    if (!validateStencilFunc(&quot;stencilFuncSeparate&quot;, func))
+        return;
+    switch (face) {
+    case GraphicsContext3D::FRONT_AND_BACK:
+        m_stencilFuncRef = ref;
+        m_stencilFuncRefBack = ref;
+        m_stencilFuncMask = mask;
+        m_stencilFuncMaskBack = mask;
+        break;
+    case GraphicsContext3D::FRONT:
+        m_stencilFuncRef = ref;
+        m_stencilFuncMask = mask;
+        break;
+    case GraphicsContext3D::BACK:
+        m_stencilFuncRefBack = ref;
+        m_stencilFuncMaskBack = mask;
+        break;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;stencilFuncSeparate&quot;, &quot;invalid face&quot;);
+        return;
+    }
+    m_context-&gt;stencilFuncSeparate(face, func, ref, mask);
+}
+
+void WebGLRenderingContextBase::stencilMask(GC3Duint mask)
+{
+    if (isContextLostOrPending())
+        return;
+    m_stencilMask = mask;
+    m_stencilMaskBack = mask;
+    m_context-&gt;stencilMask(mask);
+}
+
+void WebGLRenderingContextBase::stencilMaskSeparate(GC3Denum face, GC3Duint mask)
+{
+    if (isContextLostOrPending())
+        return;
+    switch (face) {
+    case GraphicsContext3D::FRONT_AND_BACK:
+        m_stencilMask = mask;
+        m_stencilMaskBack = mask;
+        break;
+    case GraphicsContext3D::FRONT:
+        m_stencilMask = mask;
+        break;
+    case GraphicsContext3D::BACK:
+        m_stencilMaskBack = mask;
+        break;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;stencilMaskSeparate&quot;, &quot;invalid face&quot;);
+        return;
+    }
+    m_context-&gt;stencilMaskSeparate(face, mask);
+}
+
+void WebGLRenderingContextBase::stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zpass)
+{
+    if (isContextLostOrPending())
+        return;
+    m_context-&gt;stencilOp(fail, zfail, zpass);
+}
+
+void WebGLRenderingContextBase::stencilOpSeparate(GC3Denum face, GC3Denum fail, GC3Denum zfail, GC3Denum zpass)
+{
+    if (isContextLostOrPending())
+        return;
+    m_context-&gt;stencilOpSeparate(face, fail, zfail, zpass);
+}
+
+void WebGLRenderingContextBase::texImage2DBase(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels, ExceptionCode&amp; ec)
+{
+    // FIXME: For now we ignore any errors returned.
+    ec = 0;
+    WebGLTexture* tex = validateTextureBinding(&quot;texImage2D&quot;, target, true);
+    ASSERT(validateTexFuncParameters(&quot;texImage2D&quot;, NotTexSubImage2D, target, level, internalformat, width, height, border, format, type));
+    ASSERT(tex);
+    ASSERT(!level || !WebGLTexture::isNPOT(width, height));
+    if (!pixels) {
+        // Note: Chromium's OpenGL implementation clears textures and isResourceSafe() is therefore true.
+        // For other implementations, if they are using ANGLE_depth_texture, ANGLE depth textures
+        // can not be cleared with texImage2D and must be cleared by binding to an fbo and calling
+        // clear.
+        if (isResourceSafe())
+            m_context-&gt;texImage2D(target, level, internalformat, width, height, border, format, type, nullptr);
+        else {
+            bool succeed = m_context-&gt;texImage2DResourceSafe(target, level, internalformat, width, height,
+                                                             border, format, type, m_unpackAlignment);
+            if (!succeed)
+                return;
+        }
+    } else {
+        ASSERT(validateSettableTexFormat(&quot;texImage2D&quot;, internalformat));
+        m_context-&gt;moveErrorsToSyntheticErrorList();
+        m_context-&gt;texImage2D(target, level, internalformat, width, height,
+                              border, format, type, pixels);
+        if (m_context-&gt;moveErrorsToSyntheticErrorList()) {
+            // The texImage2D function failed. Tell the WebGLTexture it doesn't have the data for this level.
+            tex-&gt;markInvalid(target, level);
+            return;
+        }
+    }
+    tex-&gt;setLevelInfo(target, level, internalformat, width, height, type);
+}
+
+void WebGLRenderingContextBase::texImage2DImpl(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Denum format, GC3Denum type, Image* image, GraphicsContext3D::ImageHtmlDomSource domSource, bool flipY, bool premultiplyAlpha, ExceptionCode&amp; ec)
+{
+    ec = 0;
+    Vector&lt;uint8_t&gt; data;
+    GraphicsContext3D::ImageExtractor imageExtractor(image, domSource, premultiplyAlpha, m_unpackColorspaceConversion == GraphicsContext3D::NONE);
+    if (!imageExtractor.extractSucceeded()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;texImage2D&quot;, &quot;bad image data&quot;);
+        return;
+    }
+    GraphicsContext3D::DataFormat sourceDataFormat = imageExtractor.imageSourceFormat();
+    GraphicsContext3D::AlphaOp alphaOp = imageExtractor.imageAlphaOp();
+    const void* imagePixelData = imageExtractor.imagePixelData();
+    
+    bool needConversion = true;
+    if (type == GraphicsContext3D::UNSIGNED_BYTE &amp;&amp; sourceDataFormat == GraphicsContext3D::DataFormatRGBA8 &amp;&amp; format == GraphicsContext3D::RGBA &amp;&amp; alphaOp == GraphicsContext3D::AlphaDoNothing &amp;&amp; !flipY)
+        needConversion = false;
+    else {
+        if (!m_context-&gt;packImageData(image, imagePixelData, format, type, flipY, alphaOp, sourceDataFormat, imageExtractor.imageWidth(), imageExtractor.imageHeight(), imageExtractor.imageSourceUnpackAlignment(), data)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;texImage2D&quot;, &quot;packImage error&quot;);
+            return;
+        }
+    }
+    
+    if (m_unpackAlignment != 1)
+        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1);
+    texImage2DBase(target, level, internalformat, image-&gt;width(), image-&gt;height(), 0, format, type, needConversion ? data.data() : imagePixelData, ec);
+    if (m_unpackAlignment != 1)
+        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlignment);
+}
+
+bool WebGLRenderingContextBase::validateTexFunc(const char* functionName, TexFuncValidationFunctionType functionType, TexFuncValidationSourceType sourceType, GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, GC3Dint xoffset, GC3Dint yoffset)
+{
+    if (!validateTexFuncParameters(functionName, functionType, target, level, internalformat, width, height, border, format, type))
+        return false;
+    
+    WebGLTexture* texture = validateTextureBinding(functionName, target, true);
+    if (!texture)
+        return false;
+    
+    if (functionType == NotTexSubImage2D) {
+        if (level &amp;&amp; WebGLTexture::isNPOT(width, height)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;level &gt; 0 not power of 2&quot;);
+            return false;
+        }
+        // For SourceArrayBufferView, function validateTexFuncData() would handle whether to validate the SettableTexFormat
+        // by checking if the ArrayBufferView is null or not.
+        if (sourceType != SourceArrayBufferView) {
+            if (!validateSettableTexFormat(functionName, format))
+                return false;
+        }
+    } else {
+        if (!validateSettableTexFormat(functionName, format))
+            return false;
+        if (!validateSize(functionName, xoffset, yoffset))
+            return false;
+        // Before checking if it is in the range, check if overflow happens first.
+        if (xoffset + width &lt; 0 || yoffset + height &lt; 0) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;bad dimensions&quot;);
+            return false;
+        }
+        if (xoffset + width &gt; texture-&gt;getWidth(target, level) || yoffset + height &gt; texture-&gt;getHeight(target, level)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;dimensions out of range&quot;);
+            return false;
+        }
+        if (texture-&gt;getInternalFormat(target, level) != format || texture-&gt;getType(target, level) != type) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;type and format do not match texture&quot;);
+            return false;
+        }
+    }
+    
+    return true;
+}
+
+void WebGLRenderingContextBase::texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
+                                           GC3Dsizei width, GC3Dsizei height, GC3Dint border,
+                                           GC3Denum format, GC3Denum type, ArrayBufferView* pixels, ExceptionCode&amp; ec)
+{
+    if (isContextLostOrPending() || !validateTexFuncData(&quot;texImage2D&quot;, level, width, height, format, type, pixels, NullAllowed)
+        || !validateTexFunc(&quot;texImage2D&quot;, NotTexSubImage2D, SourceArrayBufferView, target, level, internalformat, width, height, border, format, type, 0, 0))
+        return;
+    void* data = pixels ? pixels-&gt;baseAddress() : 0;
+    Vector&lt;uint8_t&gt; tempData;
+    bool changeUnpackAlignment = false;
+    if (data &amp;&amp; (m_unpackFlipY || m_unpackPremultiplyAlpha)) {
+        if (!m_context-&gt;extractTextureData(width, height, format, type,
+                                           m_unpackAlignment,
+                                           m_unpackFlipY, m_unpackPremultiplyAlpha,
+                                           data,
+                                           tempData))
+            return;
+        data = tempData.data();
+        changeUnpackAlignment = true;
+    }
+    if (changeUnpackAlignment)
+        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1);
+    texImage2DBase(target, level, internalformat, width, height, border,
+                   format, type, data, ec);
+    if (changeUnpackAlignment)
+        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlignment);
+}
+
+void WebGLRenderingContextBase::texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
+                                           GC3Denum format, GC3Denum type, ImageData* pixels, ExceptionCode&amp; ec)
+{
+    ec = 0;
+    if (isContextLostOrPending() || !pixels || !validateTexFunc(&quot;texImage2D&quot;, NotTexSubImage2D, SourceImageData, target, level, internalformat, pixels-&gt;width(), pixels-&gt;height(), 0, format, type, 0, 0))
+        return;
+    Vector&lt;uint8_t&gt; data;
+    bool needConversion = true;
+    // The data from ImageData is always of format RGBA8.
+    // No conversion is needed if destination format is RGBA and type is USIGNED_BYTE and no Flip or Premultiply operation is required.
+    if (!m_unpackFlipY &amp;&amp; !m_unpackPremultiplyAlpha &amp;&amp; format == GraphicsContext3D::RGBA &amp;&amp; type == GraphicsContext3D::UNSIGNED_BYTE)
+        needConversion = false;
+    else {
+        if (!m_context-&gt;extractImageData(pixels, format, type, m_unpackFlipY, m_unpackPremultiplyAlpha, data)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;texImage2D&quot;, &quot;bad image data&quot;);
+            return;
+        }
+    }
+    if (m_unpackAlignment != 1)
+        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1);
+    texImage2DBase(target, level, internalformat, pixels-&gt;width(), pixels-&gt;height(), 0, format, type, needConversion ? data.data() : pixels-&gt;data()-&gt;data(), ec);
+    if (m_unpackAlignment != 1)
+        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlignment);
+}
+
+PassRefPtr&lt;Image&gt; WebGLRenderingContextBase::drawImageIntoBuffer(Image* image, int width, int height, int deviceScaleFactor)
+{
+    IntSize size(width, height);
+    size.scale(deviceScaleFactor);
+    ImageBuffer* buf = m_generatedImageCache.imageBuffer(size);
+    if (!buf) {
+        synthesizeGLError(GraphicsContext3D::OUT_OF_MEMORY, &quot;texImage2D&quot;, &quot;out of memory&quot;);
+        return nullptr;
+    }
+    
+    FloatRect srcRect(FloatPoint(), image-&gt;size());
+    FloatRect destRect(FloatPoint(), size);
+    buf-&gt;context()-&gt;drawImage(image, ColorSpaceDeviceRGB, destRect, srcRect);
+    return buf-&gt;copyImage(ImageBuffer::fastCopyImageMode());
+}
+
+void WebGLRenderingContextBase::texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
+                                           GC3Denum format, GC3Denum type, HTMLImageElement* image, ExceptionCode&amp; ec)
+{
+    ec = 0;
+    if (isContextLostOrPending() || !validateHTMLImageElement(&quot;texImage2D&quot;, image, ec))
+        return;
+    
+    RefPtr&lt;Image&gt; imageForRender = image-&gt;cachedImage()-&gt;imageForRenderer(image-&gt;renderer());
+    if (imageForRender-&gt;isSVGImage())
+        imageForRender = drawImageIntoBuffer(imageForRender.get(), image-&gt;width(), image-&gt;height(), 1);
+    
+    if (!imageForRender || !validateTexFunc(&quot;texImage2D&quot;, NotTexSubImage2D, SourceHTMLImageElement, target, level, internalformat, imageForRender-&gt;width(), imageForRender-&gt;height(), 0, format, type, 0, 0))
+        return;
+    
+    texImage2DImpl(target, level, internalformat, format, type, imageForRender.get(), GraphicsContext3D::HtmlDomImage, m_unpackFlipY, m_unpackPremultiplyAlpha, ec);
+}
+
+void WebGLRenderingContextBase::texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
+                                           GC3Denum format, GC3Denum type, HTMLCanvasElement* canvas, ExceptionCode&amp; ec)
+{
+    ec = 0;
+    if (isContextLostOrPending() || !validateHTMLCanvasElement(&quot;texImage2D&quot;, canvas, ec) || !validateTexFunc(&quot;texImage2D&quot;, NotTexSubImage2D, SourceHTMLCanvasElement, target, level, internalformat, canvas-&gt;width(), canvas-&gt;height(), 0, format, type, 0, 0))
+        return;
+    
+    WebGLTexture* texture = validateTextureBinding(&quot;texImage2D&quot;, target, true);
+    // If possible, copy from the canvas element directly to the texture
+    // via the GPU, without a read-back to system memory.
+    //
+    // FIXME: restriction of (RGB || RGBA)/UNSIGNED_BYTE should be lifted when
+    // ImageBuffer::copyToPlatformTexture implementations are fully functional.
+    if (GraphicsContext3D::TEXTURE_2D == target &amp;&amp; texture &amp;&amp; type == texture-&gt;getType(target, level)
+        &amp;&amp; (format == GraphicsContext3D::RGB || format == GraphicsContext3D::RGBA) &amp;&amp; type == GraphicsContext3D::UNSIGNED_BYTE) {
+        ImageBuffer* buffer = canvas-&gt;buffer();
+        if (buffer &amp;&amp; buffer-&gt;copyToPlatformTexture(*m_context.get(), texture-&gt;object(), internalformat, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
+            texture-&gt;setLevelInfo(target, level, internalformat, canvas-&gt;width(), canvas-&gt;height(), type);
+            return;
+        }
+    }
+    
+    RefPtr&lt;ImageData&gt; imageData = canvas-&gt;getImageData();
+    if (imageData)
+        texImage2D(target, level, internalformat, format, type, imageData.get(), ec);
+    else
+        texImage2DImpl(target, level, internalformat, format, type, canvas-&gt;copiedImage(), GraphicsContext3D::HtmlDomCanvas, m_unpackFlipY, m_unpackPremultiplyAlpha, ec);
+}
+
+#if ENABLE(VIDEO)
+PassRefPtr&lt;Image&gt; WebGLRenderingContextBase::videoFrameToImage(HTMLVideoElement* video, BackingStoreCopy backingStoreCopy, ExceptionCode&amp;)
+{
+    IntSize size(video-&gt;videoWidth(), video-&gt;videoHeight());
+    ImageBuffer* buf = m_generatedImageCache.imageBuffer(size);
+    if (!buf) {
+        synthesizeGLError(GraphicsContext3D::OUT_OF_MEMORY, &quot;texImage2D&quot;, &quot;out of memory&quot;);
+        return nullptr;
+    }
+    IntRect destRect(0, 0, size.width(), size.height());
+    // FIXME: Turn this into a GPU-GPU texture copy instead of CPU readback.
+    video-&gt;paintCurrentFrameInContext(buf-&gt;context(), destRect);
+    return buf-&gt;copyImage(backingStoreCopy);
+}
+
+void WebGLRenderingContextBase::texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
+                                           GC3Denum format, GC3Denum type, HTMLVideoElement* video, ExceptionCode&amp; ec)
+{
+    ec = 0;
+    if (isContextLostOrPending() || !validateHTMLVideoElement(&quot;texImage2D&quot;, video, ec)
+        || !validateTexFunc(&quot;texImage2D&quot;, NotTexSubImage2D, SourceHTMLVideoElement, target, level, internalformat, video-&gt;videoWidth(), video-&gt;videoHeight(), 0, format, type, 0, 0))
+        return;
+    
+    // Go through the fast path doing a GPU-GPU textures copy without a readback to system memory if possible.
+    // Otherwise, it will fall back to the normal SW path.
+    // FIXME: The current restrictions require that format shoud be RGB or RGBA,
+    // type should be UNSIGNED_BYTE and level should be 0. It may be lifted in the future.
+    WebGLTexture* texture = validateTextureBinding(&quot;texImage2D&quot;, target, true);
+    if (GraphicsContext3D::TEXTURE_2D == target &amp;&amp; texture
+        &amp;&amp; (format == GraphicsContext3D::RGB || format == GraphicsContext3D::RGBA)
+        &amp;&amp; type == GraphicsContext3D::UNSIGNED_BYTE
+        &amp;&amp; (texture-&gt;getType(target, level) == GraphicsContext3D::UNSIGNED_BYTE || !texture-&gt;isValid(target, level))
+        &amp;&amp; !level) {
+        if (video-&gt;copyVideoTextureToPlatformTexture(m_context.get(), texture-&gt;object(), level, type, internalformat, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
+            texture-&gt;setLevelInfo(target, level, internalformat, video-&gt;videoWidth(), video-&gt;videoHeight(), type);
+            return;
+        }
+    }
+    
+    // Normal pure SW path.
+    RefPtr&lt;Image&gt; image = videoFrameToImage(video, ImageBuffer::fastCopyImageMode(), ec);
+    if (!image)
+        return;
+    texImage2DImpl(target, level, internalformat, format, type, image.get(), GraphicsContext3D::HtmlDomVideo, m_unpackFlipY, m_unpackPremultiplyAlpha, ec);
+}
+#endif
+
+void WebGLRenderingContextBase::texParameter(GC3Denum target, GC3Denum pname, GC3Dfloat paramf, GC3Dint parami, bool isFloat)
+{
+    if (isContextLostOrPending())
+        return;
+    WebGLTexture* tex = validateTextureBinding(&quot;texParameter&quot;, target, false);
+    if (!tex)
+        return;
+    switch (pname) {
+    case GraphicsContext3D::TEXTURE_MIN_FILTER:
+    case GraphicsContext3D::TEXTURE_MAG_FILTER:
+        break;
+    case GraphicsContext3D::TEXTURE_WRAP_S:
+    case GraphicsContext3D::TEXTURE_WRAP_T:
+        if ((isFloat &amp;&amp; paramf != GraphicsContext3D::CLAMP_TO_EDGE &amp;&amp; paramf != GraphicsContext3D::MIRRORED_REPEAT &amp;&amp; paramf != GraphicsContext3D::REPEAT)
+            || (!isFloat &amp;&amp; parami != GraphicsContext3D::CLAMP_TO_EDGE &amp;&amp; parami != GraphicsContext3D::MIRRORED_REPEAT &amp;&amp; parami != GraphicsContext3D::REPEAT)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;texParameter&quot;, &quot;invalid parameter&quot;);
+            return;
+        }
+        break;
+    case Extensions3D::TEXTURE_MAX_ANISOTROPY_EXT: // EXT_texture_filter_anisotropic
+        if (!m_extTextureFilterAnisotropic) {
+            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;texParameter&quot;, &quot;invalid parameter, EXT_texture_filter_anisotropic not enabled&quot;);
+            return;
+        }
+        break;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;texParameter&quot;, &quot;invalid parameter name&quot;);
+        return;
+    }
+    if (isFloat) {
+        tex-&gt;setParameterf(pname, paramf);
+        m_context-&gt;texParameterf(target, pname, paramf);
+    } else {
+        tex-&gt;setParameteri(pname, parami);
+        m_context-&gt;texParameteri(target, pname, parami);
+    }
+}
+
+void WebGLRenderingContextBase::texParameterf(GC3Denum target, GC3Denum pname, GC3Dfloat param)
+{
+    texParameter(target, pname, param, 0, true);
+}
+
+void WebGLRenderingContextBase::texParameteri(GC3Denum target, GC3Denum pname, GC3Dint param)
+{
+    texParameter(target, pname, 0, param, false);
+}
+
+void WebGLRenderingContextBase::texSubImage2DBase(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels, ExceptionCode&amp; ec)
+{
+    // FIXME: For now we ignore any errors returned
+    ec = 0;
+    ASSERT(!isContextLost());
+    ASSERT(validateTexFuncParameters(&quot;texSubImage2D&quot;, TexSubImage2D, target, level, format, width, height, 0, format, type));
+    ASSERT(validateSize(&quot;texSubImage2D&quot;, xoffset, yoffset));
+    ASSERT(validateSettableTexFormat(&quot;texSubImage2D&quot;, format));
+    WebGLTexture* tex = validateTextureBinding(&quot;texSubImage2D&quot;, target, true);
+    if (!tex) {
+        ASSERT_NOT_REACHED();
+        return;
+    }
+    ASSERT((xoffset + width) &gt;= 0);
+    ASSERT((yoffset + height) &gt;= 0);
+    ASSERT(tex-&gt;getWidth(target, level) &gt;= (xoffset + width));
+    ASSERT(tex-&gt;getHeight(target, level) &gt;= (yoffset + height));
+    ASSERT(tex-&gt;getInternalFormat(target, level) == format);
+    ASSERT(tex-&gt;getType(target, level) == type);
+    m_context-&gt;texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+void WebGLRenderingContextBase::texSubImage2DImpl(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Denum format, GC3Denum type, Image* image, GraphicsContext3D::ImageHtmlDomSource domSource, bool flipY, bool premultiplyAlpha, ExceptionCode&amp; ec)
+{
+    ec = 0;
+    Vector&lt;uint8_t&gt; data;
+    GraphicsContext3D::ImageExtractor imageExtractor(image, domSource, premultiplyAlpha, m_unpackColorspaceConversion == GraphicsContext3D::NONE);  
+    if (!imageExtractor.extractSucceeded()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;texSubImage2D&quot;, &quot;bad image&quot;);
+        return;
+    }
+    GraphicsContext3D::DataFormat sourceDataFormat = imageExtractor.imageSourceFormat();
+    GraphicsContext3D::AlphaOp alphaOp = imageExtractor.imageAlphaOp();
+    const void* imagePixelData = imageExtractor.imagePixelData();
+    
+    bool needConversion = true;
+    if (type == GraphicsContext3D::UNSIGNED_BYTE &amp;&amp; sourceDataFormat == GraphicsContext3D::DataFormatRGBA8 &amp;&amp; format == GraphicsContext3D::RGBA &amp;&amp; alphaOp == GraphicsContext3D::AlphaDoNothing &amp;&amp; !flipY)
+        needConversion = false;
+    else {
+        if (!m_context-&gt;packImageData(image, imagePixelData, format, type, flipY, alphaOp, sourceDataFormat, imageExtractor.imageWidth(), imageExtractor.imageHeight(), imageExtractor.imageSourceUnpackAlignment(), data)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;texImage2D&quot;, &quot;bad image data&quot;);
+            return;
+        }
+    }
+    
+    if (m_unpackAlignment != 1)
+        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1);
+    texSubImage2DBase(target, level, xoffset, yoffset, image-&gt;width(), image-&gt;height(), format, type,  needConversion ? data.data() : imagePixelData, ec);
+    if (m_unpackAlignment != 1)
+        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlignment);
+}
+
+void WebGLRenderingContextBase::texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
+                                              GC3Dsizei width, GC3Dsizei height,
+                                              GC3Denum format, GC3Denum type, ArrayBufferView* pixels, ExceptionCode&amp; ec)
+{
+    if (isContextLostOrPending() || !validateTexFuncData(&quot;texSubImage2D&quot;, level, width, height, format, type, pixels, NullNotAllowed)
+        || !validateTexFunc(&quot;texSubImage2D&quot;, TexSubImage2D, SourceArrayBufferView, target, level, format, width, height, 0, format, type, xoffset, yoffset))
+        return;
+    void* data = pixels-&gt;baseAddress();
+    Vector&lt;uint8_t&gt; tempData;
+    bool changeUnpackAlignment = false;
+    if (data &amp;&amp; (m_unpackFlipY || m_unpackPremultiplyAlpha)) {
+        if (!m_context-&gt;extractTextureData(width, height, format, type,
+                                           m_unpackAlignment,
+                                           m_unpackFlipY, m_unpackPremultiplyAlpha,
+                                           data,
+                                           tempData))
+            return;
+        data = tempData.data();
+        changeUnpackAlignment = true;
+    }
+    if (changeUnpackAlignment)
+        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1);
+    texSubImage2DBase(target, level, xoffset, yoffset, width, height, format, type, data, ec);
+    if (changeUnpackAlignment)
+        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlignment);
+}
+
+void WebGLRenderingContextBase::texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
+                                              GC3Denum format, GC3Denum type, ImageData* pixels, ExceptionCode&amp; ec)
+{
+    ec = 0;
+    if (isContextLostOrPending() || !pixels || !validateTexFunc(&quot;texSubImage2D&quot;, TexSubImage2D, SourceImageData, target, level, format,  pixels-&gt;width(), pixels-&gt;height(), 0, format, type, xoffset, yoffset))
+        return;
+    
+    Vector&lt;uint8_t&gt; data;
+    bool needConversion = true;
+    // The data from ImageData is always of format RGBA8.
+    // No conversion is needed if destination format is RGBA and type is USIGNED_BYTE and no Flip or Premultiply operation is required.
+    if (format == GraphicsContext3D::RGBA &amp;&amp; type == GraphicsContext3D::UNSIGNED_BYTE &amp;&amp; !m_unpackFlipY &amp;&amp; !m_unpackPremultiplyAlpha)
+        needConversion = false;
+    else {
+        if (!m_context-&gt;extractImageData(pixels, format, type, m_unpackFlipY, m_unpackPremultiplyAlpha, data)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;texSubImage2D&quot;, &quot;bad image data&quot;);
+            return;
+        }
+    }
+    if (m_unpackAlignment != 1)
+        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1);
+    texSubImage2DBase(target, level, xoffset, yoffset, pixels-&gt;width(), pixels-&gt;height(), format, type, needConversion ? data.data() : pixels-&gt;data()-&gt;data(), ec);
+    if (m_unpackAlignment != 1)
+        m_context-&gt;pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlignment);
+}
+
+void WebGLRenderingContextBase::texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
+                                              GC3Denum format, GC3Denum type, HTMLImageElement* image, ExceptionCode&amp; ec)
+{
+    ec = 0;
+    if (isContextLostOrPending() || !validateHTMLImageElement(&quot;texSubImage2D&quot;, image, ec))
+        return;
+    
+    RefPtr&lt;Image&gt; imageForRender = image-&gt;cachedImage()-&gt;imageForRenderer(image-&gt;renderer());
+    if (imageForRender-&gt;isSVGImage())
+        imageForRender = drawImageIntoBuffer(imageForRender.get(), image-&gt;width(), image-&gt;height(), 1);
+    
+    if (!imageForRender || !validateTexFunc(&quot;texSubImage2D&quot;, TexSubImage2D, SourceHTMLImageElement, target, level, format, imageForRender-&gt;width(), imageForRender-&gt;height(), 0, format, type, xoffset, yoffset))
+        return;
+    
+    texSubImage2DImpl(target, level, xoffset, yoffset, format, type, imageForRender.get(), GraphicsContext3D::HtmlDomImage, m_unpackFlipY, m_unpackPremultiplyAlpha, ec);
+}
+
+void WebGLRenderingContextBase::texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
+                                              GC3Denum format, GC3Denum type, HTMLCanvasElement* canvas, ExceptionCode&amp; ec)
+{
+    ec = 0;
+    if (isContextLostOrPending() || !validateHTMLCanvasElement(&quot;texSubImage2D&quot;, canvas, ec)
+        || !validateTexFunc(&quot;texSubImage2D&quot;, TexSubImage2D, SourceHTMLCanvasElement, target, level, format, canvas-&gt;width(), canvas-&gt;height(), 0, format, type, xoffset, yoffset))
+        return;
+    
+    RefPtr&lt;ImageData&gt; imageData = canvas-&gt;getImageData();
+    if (imageData)
+        texSubImage2D(target, level, xoffset, yoffset, format, type, imageData.get(), ec);
+    else
+        texSubImage2DImpl(target, level, xoffset, yoffset, format, type, canvas-&gt;copiedImage(), GraphicsContext3D::HtmlDomCanvas, m_unpackFlipY, m_unpackPremultiplyAlpha, ec);
+}
+
+#if ENABLE(VIDEO)
+void WebGLRenderingContextBase::texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
+                                              GC3Denum format, GC3Denum type, HTMLVideoElement* video, ExceptionCode&amp; ec)
+{
+    ec = 0;
+    if (isContextLostOrPending() || !validateHTMLVideoElement(&quot;texSubImage2D&quot;, video, ec)
+        || !validateTexFunc(&quot;texSubImage2D&quot;, TexSubImage2D, SourceHTMLVideoElement, target, level, format, video-&gt;videoWidth(), video-&gt;videoHeight(), 0, format, type, xoffset, yoffset))
+        return;
+    
+    RefPtr&lt;Image&gt; image = videoFrameToImage(video, ImageBuffer::fastCopyImageMode(), ec);
+    if (!image)
+        return;
+    texSubImage2DImpl(target, level, xoffset, yoffset, format, type, image.get(), GraphicsContext3D::HtmlDomVideo, m_unpackFlipY, m_unpackPremultiplyAlpha, ec);
+}
+#endif
+
+void WebGLRenderingContextBase::uniform1f(const WebGLUniformLocation* location, GC3Dfloat x, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !location)
+        return;
+    
+    if (location-&gt;program() != m_currentProgram) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;uniform1f&quot;, &quot;location not for current program&quot;);
+        return;
+    }
+    
+    m_context-&gt;uniform1f(location-&gt;location(), x);
+}
+
+void WebGLRenderingContextBase::uniform1fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform1fv&quot;, location, v, 1))
+        return;
+    
+    m_context-&gt;uniform1fv(location-&gt;location(), v-&gt;length(), v-&gt;data());
+}
+
+void WebGLRenderingContextBase::uniform1fv(const WebGLUniformLocation* location, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform1fv&quot;, location, v, size, 1))
+        return;
+    
+    m_context-&gt;uniform1fv(location-&gt;location(), size, v);
+}
+
+void WebGLRenderingContextBase::uniform1i(const WebGLUniformLocation* location, GC3Dint x, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !location)
+        return;
+    
+    if (location-&gt;program() != m_currentProgram) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;uniform1i&quot;, &quot;location not for current program&quot;);
+        return;
+    }
+    
+    if ((location-&gt;type() == GraphicsContext3D::SAMPLER_2D || location-&gt;type() == GraphicsContext3D::SAMPLER_CUBE) &amp;&amp; x &gt;= (int)m_textureUnits.size()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;uniform1i&quot;, &quot;invalid texture unit&quot;);
+        return;
+    }
+    
+    m_context-&gt;uniform1i(location-&gt;location(), x);
+}
+
+void WebGLRenderingContextBase::uniform1iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform1iv&quot;, location, v, 1))
+        return;
+    
+    if (location-&gt;type() == GraphicsContext3D::SAMPLER_2D || location-&gt;type() == GraphicsContext3D::SAMPLER_CUBE) {
+        for (unsigned i = 0; i &lt; v-&gt;length(); ++i) {
+            if (v-&gt;data()[i] &gt;= static_cast&lt;int&gt;(m_textureUnits.size())) {
+                LOG(WebGL, &quot;Texture unit size=%zu, v[%d]=%d. Location type = %04X.&quot;, m_textureUnits.size(), i, v-&gt;data()[i], location-&gt;type());
+                synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;uniform1iv&quot;, &quot;invalid texture unit&quot;);
+                return;
+            }
+        }
+    }
+    
+    m_context-&gt;uniform1iv(location-&gt;location(), v-&gt;length(), v-&gt;data());
+}
+
+void WebGLRenderingContextBase::uniform1iv(const WebGLUniformLocation* location, GC3Dint* v, GC3Dsizei size, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform1iv&quot;, location, v, size, 1))
+        return;
+    
+    if (location-&gt;type() == GraphicsContext3D::SAMPLER_2D || location-&gt;type() == GraphicsContext3D::SAMPLER_CUBE) {
+        for (unsigned i = 0; i &lt; static_cast&lt;unsigned&gt;(size); ++i) {
+            if (((GC3Dint*)v)[i] &gt;= static_cast&lt;int&gt;(m_textureUnits.size())) {
+                synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;uniform1iv&quot;, &quot;invalid texture unit&quot;);
+                return;
+            }
+        }
+    }
+    
+    m_context-&gt;uniform1iv(location-&gt;location(), size, v);
+}
+
+void WebGLRenderingContextBase::uniform2f(const WebGLUniformLocation* location, GC3Dfloat x, GC3Dfloat y, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !location)
+        return;
+    
+    if (location-&gt;program() != m_currentProgram) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;uniform2f&quot;, &quot;location not for current program&quot;);
+        return;
+    }
+    
+    m_context-&gt;uniform2f(location-&gt;location(), x, y);
+}
+
+void WebGLRenderingContextBase::uniform2fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform2fv&quot;, location, v, 2))
+        return;
+    
+    m_context-&gt;uniform2fv(location-&gt;location(), v-&gt;length() / 2, v-&gt;data());
+}
+
+void WebGLRenderingContextBase::uniform2fv(const WebGLUniformLocation* location, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform2fv&quot;, location, v, size, 2))
+        return;
+    
+    m_context-&gt;uniform2fv(location-&gt;location(), size / 2, v);
+}
+
+void WebGLRenderingContextBase::uniform2i(const WebGLUniformLocation* location, GC3Dint x, GC3Dint y, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !location)
+        return;
+    
+    if (location-&gt;program() != m_currentProgram) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;uniform2i&quot;, &quot;location not for current program&quot;);
+        return;
+    }
+    
+    m_context-&gt;uniform2i(location-&gt;location(), x, y);
+}
+
+void WebGLRenderingContextBase::uniform2iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform2iv&quot;, location, v, 2))
+        return;
+    
+    m_context-&gt;uniform2iv(location-&gt;location(), v-&gt;length() / 2, v-&gt;data());
+}
+
+void WebGLRenderingContextBase::uniform2iv(const WebGLUniformLocation* location, GC3Dint* v, GC3Dsizei size, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform2iv&quot;, location, v, size, 2))
+        return;
+    
+    m_context-&gt;uniform2iv(location-&gt;location(), size / 2, v);
+}
+
+void WebGLRenderingContextBase::uniform3f(const WebGLUniformLocation* location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !location)
+        return;
+    
+    if (location-&gt;program() != m_currentProgram) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;uniform3f&quot;, &quot;location not for current program&quot;);
+        return;
+    }
+    
+    m_context-&gt;uniform3f(location-&gt;location(), x, y, z);
+}
+
+void WebGLRenderingContextBase::uniform3fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform3fv&quot;, location, v, 3))
+        return;
+    
+    m_context-&gt;uniform3fv(location-&gt;location(), v-&gt;length() / 3, v-&gt;data());
+}
+
+void WebGLRenderingContextBase::uniform3fv(const WebGLUniformLocation* location, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform3fv&quot;, location, v, size, 3))
+        return;
+    
+    m_context-&gt;uniform3fv(location-&gt;location(), size / 3, v);
+}
+
+void WebGLRenderingContextBase::uniform3i(const WebGLUniformLocation* location, GC3Dint x, GC3Dint y, GC3Dint z, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !location)
+        return;
+    
+    if (location-&gt;program() != m_currentProgram) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;uniform3i&quot;, &quot;location not for current program&quot;);
+        return;
+    }
+    
+    m_context-&gt;uniform3i(location-&gt;location(), x, y, z);
+}
+
+void WebGLRenderingContextBase::uniform3iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform3iv&quot;, location, v, 3))
+        return;
+    
+    m_context-&gt;uniform3iv(location-&gt;location(), v-&gt;length() / 3, v-&gt;data());
+}
+
+void WebGLRenderingContextBase::uniform3iv(const WebGLUniformLocation* location, GC3Dint* v, GC3Dsizei size, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform3iv&quot;, location, v, size, 3))
+        return;
+    
+    m_context-&gt;uniform3iv(location-&gt;location(), size / 3, v);
+}
+
+void WebGLRenderingContextBase::uniform4f(const WebGLUniformLocation* location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !location)
+        return;
+    
+    if (location-&gt;program() != m_currentProgram) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;uniform4f&quot;, &quot;location not for current program&quot;);
+        return;
+    }
+    
+    m_context-&gt;uniform4f(location-&gt;location(), x, y, z, w);
+}
+
+void WebGLRenderingContextBase::uniform4fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform4fv&quot;, location, v, 4))
+        return;
+    
+    m_context-&gt;uniform4fv(location-&gt;location(), v-&gt;length() / 4, v-&gt;data());
+}
+
+void WebGLRenderingContextBase::uniform4fv(const WebGLUniformLocation* location, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform4fv&quot;, location, v, size, 4))
+        return;
+    
+    m_context-&gt;uniform4fv(location-&gt;location(), size / 4, v);
+}
+
+void WebGLRenderingContextBase::uniform4i(const WebGLUniformLocation* location, GC3Dint x, GC3Dint y, GC3Dint z, GC3Dint w, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !location)
+        return;
+    
+    if (location-&gt;program() != m_currentProgram) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;uniform4i&quot;, &quot;location not for current program&quot;);
+        return;
+    }
+    
+    m_context-&gt;uniform4i(location-&gt;location(), x, y, z, w);
+}
+
+void WebGLRenderingContextBase::uniform4iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform4iv&quot;, location, v, 4))
+        return;
+    
+    m_context-&gt;uniform4iv(location-&gt;location(), v-&gt;length() / 4, v-&gt;data());
+}
+
+void WebGLRenderingContextBase::uniform4iv(const WebGLUniformLocation* location, GC3Dint* v, GC3Dsizei size, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformParameters(&quot;uniform4iv&quot;, location, v, size, 4))
+        return;
+    
+    m_context-&gt;uniform4iv(location-&gt;location(), size / 4, v);
+}
+
+void WebGLRenderingContextBase::uniformMatrix2fv(const WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* v, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformMatrixParameters(&quot;uniformMatrix2fv&quot;, location, transpose, v, 4))
+        return;
+    m_context-&gt;uniformMatrix2fv(location-&gt;location(), v-&gt;length() / 4, transpose, v-&gt;data());
+}
+
+void WebGLRenderingContextBase::uniformMatrix2fv(const WebGLUniformLocation* location, GC3Dboolean transpose, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformMatrixParameters(&quot;uniformMatrix2fv&quot;, location, transpose, v, size, 4))
+        return;
+    m_context-&gt;uniformMatrix2fv(location-&gt;location(), size / 4, transpose, v);
+}
+
+void WebGLRenderingContextBase::uniformMatrix3fv(const WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* v, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformMatrixParameters(&quot;uniformMatrix3fv&quot;, location, transpose, v, 9))
+        return;
+    m_context-&gt;uniformMatrix3fv(location-&gt;location(), v-&gt;length() / 9, transpose, v-&gt;data());
+}
+
+void WebGLRenderingContextBase::uniformMatrix3fv(const WebGLUniformLocation* location, GC3Dboolean transpose, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformMatrixParameters(&quot;uniformMatrix3fv&quot;, location, transpose, v, size, 9))
+        return;
+    m_context-&gt;uniformMatrix3fv(location-&gt;location(), size / 9, transpose, v);
+}
+
+void WebGLRenderingContextBase::uniformMatrix4fv(const WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* v, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformMatrixParameters(&quot;uniformMatrix4fv&quot;, location, transpose, v, 16))
+        return;
+    m_context-&gt;uniformMatrix4fv(location-&gt;location(), v-&gt;length() / 16, transpose, v-&gt;data());
+}
+
+void WebGLRenderingContextBase::uniformMatrix4fv(const WebGLUniformLocation* location, GC3Dboolean transpose, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateUniformMatrixParameters(&quot;uniformMatrix4fv&quot;, location, transpose, v, size, 16))
+        return;
+    m_context-&gt;uniformMatrix4fv(location-&gt;location(), size / 16, transpose, v);
+}
+
+void WebGLRenderingContextBase::useProgram(WebGLProgram* program, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    bool deleted;
+    if (!checkObjectToBeBound(&quot;useProgram&quot;, program, deleted))
+        return;
+    if (deleted)
+        program = 0;
+    if (program &amp;&amp; !program-&gt;getLinkStatus()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;useProgram&quot;, &quot;program not valid&quot;);
+        return;
+    }
+    if (m_currentProgram != program) {
+        if (m_currentProgram)
+            m_currentProgram-&gt;onDetached(graphicsContext3D());
+        m_currentProgram = program;
+        m_context-&gt;useProgram(objectOrZero(program));
+        if (program)
+            program-&gt;onAttached();
+    }
+}
+
+void WebGLRenderingContextBase::validateProgram(WebGLProgram* program, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending() || !validateWebGLObject(&quot;validateProgram&quot;, program))
+        return;
+    m_context-&gt;validateProgram(objectOrZero(program));
+}
+
+void WebGLRenderingContextBase::vertexAttrib1f(GC3Duint index, GC3Dfloat v0)
+{
+    vertexAttribfImpl(&quot;vertexAttrib1f&quot;, index, 1, v0, 0.0f, 0.0f, 1.0f);
+}
+
+void WebGLRenderingContextBase::vertexAttrib1fv(GC3Duint index, Float32Array* v)
+{
+    vertexAttribfvImpl(&quot;vertexAttrib1fv&quot;, index, v, 1);
+}
+
+void WebGLRenderingContextBase::vertexAttrib1fv(GC3Duint index, GC3Dfloat* v, GC3Dsizei size)
+{
+    vertexAttribfvImpl(&quot;vertexAttrib1fv&quot;, index, v, size, 1);
+}
+
+void WebGLRenderingContextBase::vertexAttrib2f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1)
+{
+    vertexAttribfImpl(&quot;vertexAttrib2f&quot;, index, 2, v0, v1, 0.0f, 1.0f);
+}
+
+void WebGLRenderingContextBase::vertexAttrib2fv(GC3Duint index, Float32Array* v)
+{
+    vertexAttribfvImpl(&quot;vertexAttrib2fv&quot;, index, v, 2);
+}
+
+void WebGLRenderingContextBase::vertexAttrib2fv(GC3Duint index, GC3Dfloat* v, GC3Dsizei size)
+{
+    vertexAttribfvImpl(&quot;vertexAttrib2fv&quot;, index, v, size, 2);
+}
+
+void WebGLRenderingContextBase::vertexAttrib3f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2)
+{
+    vertexAttribfImpl(&quot;vertexAttrib3f&quot;, index, 3, v0, v1, v2, 1.0f);
+}
+
+void WebGLRenderingContextBase::vertexAttrib3fv(GC3Duint index, Float32Array* v)
+{
+    vertexAttribfvImpl(&quot;vertexAttrib3fv&quot;, index, v, 3);
+}
+
+void WebGLRenderingContextBase::vertexAttrib3fv(GC3Duint index, GC3Dfloat* v, GC3Dsizei size)
+{
+    vertexAttribfvImpl(&quot;vertexAttrib3fv&quot;, index, v, size, 3);
+}
+
+void WebGLRenderingContextBase::vertexAttrib4f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2, GC3Dfloat v3)
+{
+    vertexAttribfImpl(&quot;vertexAttrib4f&quot;, index, 4, v0, v1, v2, v3);
+}
+
+void WebGLRenderingContextBase::vertexAttrib4fv(GC3Duint index, Float32Array* v)
+{
+    vertexAttribfvImpl(&quot;vertexAttrib4fv&quot;, index, v, 4);
+}
+
+void WebGLRenderingContextBase::vertexAttrib4fv(GC3Duint index, GC3Dfloat* v, GC3Dsizei size)
+{
+    vertexAttribfvImpl(&quot;vertexAttrib4fv&quot;, index, v, size, 4);
+}
+
+void WebGLRenderingContextBase::vertexAttribPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dboolean normalized, GC3Dsizei stride, long long offset, ExceptionCode&amp; ec)
+{
+    UNUSED_PARAM(ec);
+    if (isContextLostOrPending())
+        return;
+    switch (type) {
+    case GraphicsContext3D::BYTE:
+    case GraphicsContext3D::UNSIGNED_BYTE:
+    case GraphicsContext3D::SHORT:
+    case GraphicsContext3D::UNSIGNED_SHORT:
+    case GraphicsContext3D::FLOAT:
+        break;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;vertexAttribPointer&quot;, &quot;invalid type&quot;);
+        return;
+    }
+    if (index &gt;= m_maxVertexAttribs) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;vertexAttribPointer&quot;, &quot;index out of range&quot;);
+        return;
+    }
+    if (size &lt; 1 || size &gt; 4 || stride &lt; 0 || stride &gt; 255 || offset &lt; 0) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;vertexAttribPointer&quot;, &quot;bad size, stride or offset&quot;);
+        return;
+    }
+    if (!m_boundArrayBuffer) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;vertexAttribPointer&quot;, &quot;no bound ARRAY_BUFFER&quot;);
+        return;
+    }
+    // Determine the number of elements the bound buffer can hold, given the offset, size, type and stride
+    unsigned typeSize = sizeInBytes(type);
+    if (!typeSize) {
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, &quot;vertexAttribPointer&quot;, &quot;invalid type&quot;);
+        return;
+    }
+    if ((stride % typeSize) || (static_cast&lt;GC3Dintptr&gt;(offset) % typeSize)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;vertexAttribPointer&quot;, &quot;stride or offset not valid for type&quot;);
+        return;
+    }
+    GC3Dsizei bytesPerElement = size * typeSize;
+    
+    m_boundVertexArrayObject-&gt;setVertexAttribState(index, bytesPerElement, size, type, normalized, stride, static_cast&lt;GC3Dintptr&gt;(offset), m_boundArrayBuffer);
+    m_context-&gt;vertexAttribPointer(index, size, type, normalized, stride, static_cast&lt;GC3Dintptr&gt;(offset));
+}
+
+void WebGLRenderingContextBase::viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
+{
+    if (isContextLostOrPending())
+        return;
+    if (!validateSize(&quot;viewport&quot;, width, height))
+        return;
+    m_context-&gt;viewport(x, y, width, height);
+}
+
+void WebGLRenderingContextBase::forceLostContext(WebGLRenderingContextBase::LostContextMode mode)
+{
+    if (isContextLostOrPending()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;loseContext&quot;, &quot;context already lost&quot;);
+        return;
+    }
+    
+    m_contextGroup-&gt;loseContextGroup(mode);
+}
+
+void WebGLRenderingContextBase::loseContextImpl(WebGLRenderingContextBase::LostContextMode mode)
+{
+    if (isContextLost())
+        return;
+    
+    m_contextLost = true;
+    m_contextLostMode = mode;
+    
+    if (mode == RealLostContext) {
+        // Inform the embedder that a lost context was received. In response, the embedder might
+        // decide to take action such as asking the user for permission to use WebGL again.
+        if (Frame* frame = canvas()-&gt;document().frame())
+            frame-&gt;loader().client().didLoseWebGLContext(m_context-&gt;getExtensions()-&gt;getGraphicsResetStatusARB());
+    }
+    
+    detachAndRemoveAllObjects();
+    
+    if (m_drawingBuffer) {
+        // Make absolutely sure we do not refer to an already-deleted texture or framebuffer.
+        m_drawingBuffer-&gt;setTexture2DBinding(0);
+        m_drawingBuffer-&gt;setFramebufferBinding(0);
+    }
+    
+    // There is no direct way to clear errors from a GL implementation and
+    // looping until getError() becomes NO_ERROR might cause an infinite loop if
+    // the driver or context implementation had a bug. So, loop a reasonably
+    // large number of times to clear any existing errors.
+    for (int i = 0; i &lt; 100; ++i) {
+        if (m_context-&gt;getError() == GraphicsContext3D::NO_ERROR)
+            break;
+    }
+    ConsoleDisplayPreference display = (mode == RealLostContext) ? DisplayInConsole: DontDisplayInConsole;
+    synthesizeGLError(GraphicsContext3D::CONTEXT_LOST_WEBGL, &quot;loseContext&quot;, &quot;context lost&quot;, display);
+    
+    // Don't allow restoration unless the context lost event has both been
+    // dispatched and its default behavior prevented.
+    m_restoreAllowed = false;
+    
+    // Always defer the dispatch of the context lost event, to implement
+    // the spec behavior of queueing a task.
+    m_dispatchContextLostEventTimer.startOneShot(0);
+}
+
+void WebGLRenderingContextBase::forceRestoreContext()
+{
+    if (!isContextLostOrPending()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;restoreContext&quot;, &quot;context not lost&quot;);
+        return;
+    }
+    
+    if (!m_restoreAllowed) {
+        if (m_contextLostMode == SyntheticLostContext)
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;restoreContext&quot;, &quot;context restoration not allowed&quot;);
+        return;
+    }
+    
+    if (!m_restoreTimer.isActive())
+        m_restoreTimer.startOneShot(0);
+}
+
+PlatformLayer* WebGLRenderingContextBase::platformLayer() const
+{
+    return (!isContextLost() &amp;&amp; !m_isPendingPolicyResolution) ? m_context-&gt;platformLayer() : 0;
+}
+
+void WebGLRenderingContextBase::removeSharedObject(WebGLSharedObject* object)
+{
+    if (m_isPendingPolicyResolution)
+        return;
+    
+    m_contextGroup-&gt;removeObject(object);
+}
+
+void WebGLRenderingContextBase::addSharedObject(WebGLSharedObject* object)
+{
+    if (m_isPendingPolicyResolution)
+        return;
+    
+    ASSERT(!isContextLost());
+    m_contextGroup-&gt;addObject(object);
+}
+
+void WebGLRenderingContextBase::removeContextObject(WebGLContextObject* object)
+{
+    if (m_isPendingPolicyResolution)
+        return;
+    
+    m_contextObjects.remove(object);
+}
+
+void WebGLRenderingContextBase::addContextObject(WebGLContextObject* object)
+{
+    if (m_isPendingPolicyResolution)
+        return;
+    
+    ASSERT(!isContextLost());
+    m_contextObjects.add(object);
+}
+
+void WebGLRenderingContextBase::detachAndRemoveAllObjects()
+{
+    if (m_isPendingPolicyResolution)
+        return;
+    
+    while (m_contextObjects.size() &gt; 0) {
+        HashSet&lt;WebGLContextObject*&gt;::iterator it = m_contextObjects.begin();
+        (*it)-&gt;detachContext();
+    }
+}
+
+bool WebGLRenderingContextBase::hasPendingActivity() const
+{
+    return false;
+}
+
+void WebGLRenderingContextBase::stop()
+{
+    if (!isContextLost() &amp;&amp; !m_isPendingPolicyResolution) {
+        forceLostContext(SyntheticLostContext);
+        destroyGraphicsContext3D();
+    }
+}
+
+WebGLGetInfo WebGLRenderingContextBase::getBooleanParameter(GC3Denum pname)
+{
+    GC3Dboolean value = 0;
+    m_context-&gt;getBooleanv(pname, &amp;value);
+    return WebGLGetInfo(static_cast&lt;bool&gt;(value));
+}
+
+WebGLGetInfo WebGLRenderingContextBase::getBooleanArrayParameter(GC3Denum pname)
+{
+    if (pname != GraphicsContext3D::COLOR_WRITEMASK) {
+        notImplemented();
+        return WebGLGetInfo(0, 0);
+    }
+    GC3Dboolean value[4] = {0};
+    m_context-&gt;getBooleanv(pname, value);
+    bool boolValue[4];
+    for (int ii = 0; ii &lt; 4; ++ii)
+        boolValue[ii] = static_cast&lt;bool&gt;(value[ii]);
+    return WebGLGetInfo(boolValue, 4);
+}
+
+WebGLGetInfo WebGLRenderingContextBase::getFloatParameter(GC3Denum pname)
+{
+    GC3Dfloat value = 0;
+    m_context-&gt;getFloatv(pname, &amp;value);
+    return WebGLGetInfo(value);
+}
+
+WebGLGetInfo WebGLRenderingContextBase::getIntParameter(GC3Denum pname)
+{
+    GC3Dint value = 0;
+    m_context-&gt;getIntegerv(pname, &amp;value);
+    return WebGLGetInfo(value);
+}
+
+WebGLGetInfo WebGLRenderingContextBase::getUnsignedIntParameter(GC3Denum pname)
+{
+    GC3Dint value = 0;
+    m_context-&gt;getIntegerv(pname, &amp;value);
+    return WebGLGetInfo(static_cast&lt;unsigned&gt;(value));
+}
+
+WebGLGetInfo WebGLRenderingContextBase::getWebGLFloatArrayParameter(GC3Denum pname)
+{
+    GC3Dfloat value[4] = {0};
+    m_context-&gt;getFloatv(pname, value);
+    unsigned length = 0;
+    switch (pname) {
+    case GraphicsContext3D::ALIASED_POINT_SIZE_RANGE:
+    case GraphicsContext3D::ALIASED_LINE_WIDTH_RANGE:
+    case GraphicsContext3D::DEPTH_RANGE:
+        length = 2;
+        break;
+    case GraphicsContext3D::BLEND_COLOR:
+    case GraphicsContext3D::COLOR_CLEAR_VALUE:
+        length = 4;
+        break;
+    default:
+        notImplemented();
+    }
+    return WebGLGetInfo(Float32Array::create(value, length));
+}
+
+WebGLGetInfo WebGLRenderingContextBase::getWebGLIntArrayParameter(GC3Denum pname)
+{
+    GC3Dint value[4] = {0};
+    m_context-&gt;getIntegerv(pname, value);
+    unsigned length = 0;
+    switch (pname) {
+    case GraphicsContext3D::MAX_VIEWPORT_DIMS:
+        length = 2;
+        break;
+    case GraphicsContext3D::SCISSOR_BOX:
+    case GraphicsContext3D::VIEWPORT:
+        length = 4;
+        break;
+    default:
+        notImplemented();
+    }
+    return WebGLGetInfo(Int32Array::create(value, length));
+}
+
+void WebGLRenderingContextBase::checkTextureCompleteness(const char* functionName, bool prepareToDraw)
+{
+    bool resetActiveUnit = false;
+    WebGLTexture::TextureExtensionFlag extensions = static_cast&lt;WebGLTexture::TextureExtensionFlag&gt;((m_oesTextureFloatLinear ? WebGLTexture::TextureExtensionFloatLinearEnabled : 0) | (m_oesTextureHalfFloatLinear ? WebGLTexture::TextureExtensionHalfFloatLinearEnabled : 0));
+    
+    for (unsigned ii = 0; ii &lt; m_textureUnits.size(); ++ii) {
+        if ((m_textureUnits[ii].texture2DBinding &amp;&amp; m_textureUnits[ii].texture2DBinding-&gt;needToUseBlackTexture(extensions))
+            || (m_textureUnits[ii].textureCubeMapBinding &amp;&amp; m_textureUnits[ii].textureCubeMapBinding-&gt;needToUseBlackTexture(extensions))) {
+            if (ii != m_activeTextureUnit) {
+                m_context-&gt;activeTexture(ii);
+                resetActiveUnit = true;
+            } else if (resetActiveUnit) {
+                m_context-&gt;activeTexture(ii);
+                resetActiveUnit = false;
+            }
+            WebGLTexture* tex2D;
+            WebGLTexture* texCubeMap;
+            if (prepareToDraw) {
+                String msg(String(&quot;texture bound to texture unit &quot;) + String::number(ii)
+                    + &quot; is not renderable. It maybe non-power-of-2 and have incompatible texture filtering or is not 'texture complete',&quot;
+                    + &quot; or it is a float/half-float type with linear filtering and without the relevant float/half-float linear extension enabled.&quot;);
+                printGLWarningToConsole(functionName, msg.utf8().data());
+                tex2D = m_blackTexture2D.get();
+                texCubeMap = m_blackTextureCubeMap.get();
+            } else {
+                tex2D = m_textureUnits[ii].texture2DBinding.get();
+                texCubeMap = m_textureUnits[ii].textureCubeMapBinding.get();
+            }
+            if (m_textureUnits[ii].texture2DBinding &amp;&amp; m_textureUnits[ii].texture2DBinding-&gt;needToUseBlackTexture(extensions))
+                m_context-&gt;bindTexture(GraphicsContext3D::TEXTURE_2D, objectOrZero(tex2D));
+            if (m_textureUnits[ii].textureCubeMapBinding &amp;&amp; m_textureUnits[ii].textureCubeMapBinding-&gt;needToUseBlackTexture(extensions))
+                m_context-&gt;bindTexture(GraphicsContext3D::TEXTURE_CUBE_MAP, objectOrZero(texCubeMap));
+        }
+    }
+    if (resetActiveUnit)
+        m_context-&gt;activeTexture(m_activeTextureUnit);
+}
+
+void WebGLRenderingContextBase::createFallbackBlackTextures1x1()
+{
+    unsigned char black[] = {0, 0, 0, 255};
+    m_blackTexture2D = createTexture();
+    m_context-&gt;bindTexture(GraphicsContext3D::TEXTURE_2D, m_blackTexture2D-&gt;object());
+    m_context-&gt;texImage2D(GraphicsContext3D::TEXTURE_2D, 0, GraphicsContext3D::RGBA, 1, 1,
+                          0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, black);
+    m_context-&gt;bindTexture(GraphicsContext3D::TEXTURE_2D, 0);
+    m_blackTextureCubeMap = createTexture();
+    m_context-&gt;bindTexture(GraphicsContext3D::TEXTURE_CUBE_MAP, m_blackTextureCubeMap-&gt;object());
+    m_context-&gt;texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_X, 0, GraphicsContext3D::RGBA, 1, 1,
+                          0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, black);
+    m_context-&gt;texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GraphicsContext3D::RGBA, 1, 1,
+                          0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, black);
+    m_context-&gt;texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GraphicsContext3D::RGBA, 1, 1,
+                          0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, black);
+    m_context-&gt;texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GraphicsContext3D::RGBA, 1, 1,
+                          0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, black);
+    m_context-&gt;texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GraphicsContext3D::RGBA, 1, 1,
+                          0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, black);
+    m_context-&gt;texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GraphicsContext3D::RGBA, 1, 1,
+                          0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, black);
+    m_context-&gt;bindTexture(GraphicsContext3D::TEXTURE_CUBE_MAP, 0);
+}
+
+bool WebGLRenderingContextBase::isTexInternalFormatColorBufferCombinationValid(GC3Denum texInternalFormat, GC3Denum colorBufferFormat)
+{
+    unsigned need = GraphicsContext3D::getChannelBitsByFormat(texInternalFormat);
+    unsigned have = GraphicsContext3D::getChannelBitsByFormat(colorBufferFormat);
+    return (need &amp; have) == need;
+}
+
+GC3Denum WebGLRenderingContextBase::getBoundFramebufferColorFormat()
+{
+    if (m_framebufferBinding &amp;&amp; m_framebufferBinding-&gt;object())
+        return m_framebufferBinding-&gt;getColorBufferFormat();
+    if (m_attributes.alpha)
+        return GraphicsContext3D::RGBA;
+    return GraphicsContext3D::RGB;
+}
+
+int WebGLRenderingContextBase::getBoundFramebufferWidth()
+{
+    if (m_framebufferBinding &amp;&amp; m_framebufferBinding-&gt;object())
+        return m_framebufferBinding-&gt;getColorBufferWidth();
+    return m_drawingBuffer ? m_drawingBuffer-&gt;size().width() : m_context-&gt;getInternalFramebufferSize().width();
+}
+
+int WebGLRenderingContextBase::getBoundFramebufferHeight()
+{
+    if (m_framebufferBinding &amp;&amp; m_framebufferBinding-&gt;object())
+        return m_framebufferBinding-&gt;getColorBufferHeight();
+    return m_drawingBuffer ? m_drawingBuffer-&gt;size().height() : m_context-&gt;getInternalFramebufferSize().height();
+}
+
+WebGLTexture* WebGLRenderingContextBase::validateTextureBinding(const char* functionName, GC3Denum target, bool useSixEnumsForCubeMap)
+{
+    WebGLTexture* texture = nullptr;
+    switch (target) {
+    case GraphicsContext3D::TEXTURE_2D:
+        texture = m_textureUnits[m_activeTextureUnit].texture2DBinding.get();
+        break;
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_X:
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_X:
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Y:
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Y:
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Z:
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Z:
+        if (!useSixEnumsForCubeMap) {
+            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid texture target&quot;);
+            return nullptr;
+        }
+        texture = m_textureUnits[m_activeTextureUnit].textureCubeMapBinding.get();
+        break;
+    case GraphicsContext3D::TEXTURE_CUBE_MAP:
+        if (useSixEnumsForCubeMap) {
+            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid texture target&quot;);
+            return nullptr;
+        }
+        texture = m_textureUnits[m_activeTextureUnit].textureCubeMapBinding.get();
+        break;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid texture target&quot;);
+        return nullptr;
+    }
+    if (!texture)
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;no texture&quot;);
+    return texture;
+}
+
+bool WebGLRenderingContextBase::validateLocationLength(const char* functionName, const String&amp; string)
+{
+    const unsigned maxWebGLLocationLength = 256;
+    if (string.length() &gt; maxWebGLLocationLength) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;location length &gt; 256&quot;);
+        return false;
+    }
+    return true;
+}
+
+bool WebGLRenderingContextBase::validateSize(const char* functionName, GC3Dint x, GC3Dint y)
+{
+    if (x &lt; 0 || y &lt; 0) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;size &lt; 0&quot;);
+        return false;
+    }
+    return true;
+}
+
+bool WebGLRenderingContextBase::validateString(const char* functionName, const String&amp; string)
+{
+    for (size_t i = 0; i &lt; string.length(); ++i) {
+        if (!validateCharacter(string[i])) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;string not ASCII&quot;);
+            return false;
+        }
+    }
+    return true;
+}
+
+bool WebGLRenderingContextBase::validateTexFuncFormatAndType(const char* functionName, GC3Denum format, GC3Denum type, GC3Dint level)
+{
+    switch (format) {
+    case GraphicsContext3D::ALPHA:
+    case GraphicsContext3D::LUMINANCE:
+    case GraphicsContext3D::LUMINANCE_ALPHA:
+    case GraphicsContext3D::RGB:
+    case GraphicsContext3D::RGBA:
+        break;
+    case GraphicsContext3D::DEPTH_STENCIL:
+    case GraphicsContext3D::DEPTH_COMPONENT:
+        if (m_webglDepthTexture)
+            break;
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;depth texture formats not enabled&quot;);
+        return false;
+    case Extensions3D::SRGB_EXT:
+    case Extensions3D::SRGB_ALPHA_EXT:
+    default:
+        if ((format == Extensions3D::SRGB_EXT || format == Extensions3D::SRGB_ALPHA_EXT)
+            &amp;&amp; m_extsRGB)
+            break;
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid texture format&quot;);
+        return false;
+    }
+    
+    switch (type) {
+    case GraphicsContext3D::UNSIGNED_BYTE:
+    case GraphicsContext3D::UNSIGNED_SHORT_5_6_5:
+    case GraphicsContext3D::UNSIGNED_SHORT_4_4_4_4:
+    case GraphicsContext3D::UNSIGNED_SHORT_5_5_5_1:
+        break;
+    case GraphicsContext3D::FLOAT:
+        if (m_oesTextureFloat)
+            break;
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid texture type&quot;);
+        return false;
+    case GraphicsContext3D::HALF_FLOAT_OES:
+        if (m_oesTextureHalfFloat)
+            break;
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid texture type&quot;);
+        return false;
+    case GraphicsContext3D::UNSIGNED_INT:
+    case GraphicsContext3D::UNSIGNED_INT_24_8:
+    case GraphicsContext3D::UNSIGNED_SHORT:
+        if (m_webglDepthTexture)
+            break;
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid texture type&quot;);
+        return false;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid texture type&quot;);
+        return false;
+    }
+    
+    // Verify that the combination of format and type is supported.
+    switch (format) {
+    case GraphicsContext3D::ALPHA:
+    case GraphicsContext3D::LUMINANCE:
+    case GraphicsContext3D::LUMINANCE_ALPHA:
+        if (type != GraphicsContext3D::UNSIGNED_BYTE
+            &amp;&amp; type != GraphicsContext3D::FLOAT
+            &amp;&amp; type != GraphicsContext3D::HALF_FLOAT_OES) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;invalid type for format&quot;);
+            return false;
+        }
+        break;
+    case GraphicsContext3D::RGB:
+    case Extensions3D::SRGB_EXT:
+        if (type != GraphicsContext3D::UNSIGNED_BYTE
+            &amp;&amp; type != GraphicsContext3D::UNSIGNED_SHORT_5_6_5
+            &amp;&amp; type != GraphicsContext3D::FLOAT
+            &amp;&amp; type != GraphicsContext3D::HALF_FLOAT_OES) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;invalid type for RGB format&quot;);
+            return false;
+        }
+        break;
+    case GraphicsContext3D::RGBA:
+    case Extensions3D::SRGB_ALPHA_EXT:
+        if (type != GraphicsContext3D::UNSIGNED_BYTE
+            &amp;&amp; type != GraphicsContext3D::UNSIGNED_SHORT_4_4_4_4
+            &amp;&amp; type != GraphicsContext3D::UNSIGNED_SHORT_5_5_5_1
+            &amp;&amp; type != GraphicsContext3D::FLOAT
+            &amp;&amp; type != GraphicsContext3D::HALF_FLOAT_OES) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;invalid type for RGBA format&quot;);
+            return false;
+        }
+        break;
+    case GraphicsContext3D::DEPTH_COMPONENT:
+        if (!m_webglDepthTexture) {
+            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid format. DEPTH_COMPONENT not enabled&quot;);
+            return false;
+        }
+        if (type != GraphicsContext3D::UNSIGNED_SHORT
+            &amp;&amp; type != GraphicsContext3D::UNSIGNED_INT) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;invalid type for DEPTH_COMPONENT format&quot;);
+            return false;
+        }
+        if (level &gt; 0) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;level must be 0 for DEPTH_COMPONENT format&quot;);
+            return false;
+        }
+        break;
+    case GraphicsContext3D::DEPTH_STENCIL:
+        if (!m_webglDepthTexture) {
+            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid format. DEPTH_STENCIL not enabled&quot;);
+            return false;
+        }
+        if (type != GraphicsContext3D::UNSIGNED_INT_24_8) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;invalid type for DEPTH_STENCIL format&quot;);
+            return false;
+        }
+        if (level &gt; 0) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;level must be 0 for DEPTH_STENCIL format&quot;);
+            return false;
+        }
+        break;
+    default:
+        ASSERT_NOT_REACHED();
+    }
+    
+    return true;
+}
+
+bool WebGLRenderingContextBase::validateTexFuncLevel(const char* functionName, GC3Denum target, GC3Dint level)
+{
+    if (level &lt; 0) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;level &lt; 0&quot;);
+        return false;
+    }
+    switch (target) {
+    case GraphicsContext3D::TEXTURE_2D:
+        if (level &gt;= m_maxTextureLevel) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;level out of range&quot;);
+            return false;
+        }
+        break;
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_X:
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_X:
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Y:
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Y:
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Z:
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Z:
+        if (level &gt;= m_maxCubeMapTextureLevel) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;level out of range&quot;);
+            return false;
+        }
+        break;
+    }
+    // This function only checks if level is legal, so we return true and don't
+    // generate INVALID_ENUM if target is illegal.
+    return true;
+}
+
+bool WebGLRenderingContextBase::validateTexFuncParameters(const char* functionName,
+                                                          TexFuncValidationFunctionType functionType,
+                                                          GC3Denum target, GC3Dint level,
+                                                          GC3Denum internalformat,
+                                                          GC3Dsizei width, GC3Dsizei height, GC3Dint border,
+                                                          GC3Denum format, GC3Denum type)
+{
+    // We absolutely have to validate the format and type combination.
+    // The texImage2D entry points taking HTMLImage, etc. will produce
+    // temporary data based on this combination, so it must be legal.
+    if (!validateTexFuncFormatAndType(functionName, format, type, level) || !validateTexFuncLevel(functionName, target, level))
+        return false;
+    
+    if (width &lt; 0 || height &lt; 0) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;width or height &lt; 0&quot;);
+        return false;
+    }
+    
+    GC3Dint maxTextureSizeForLevel = pow(2.0, m_maxTextureLevel - 1 - level);
+    switch (target) {
+    case GraphicsContext3D::TEXTURE_2D:
+        if (width &gt; maxTextureSizeForLevel || height &gt; maxTextureSizeForLevel) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;width or height out of range&quot;);
+            return false;
+        }
+        break;
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_X:
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_X:
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Y:
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Y:
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Z:
+    case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Z:
+        if (functionType != TexSubImage2D &amp;&amp; width != height) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;width != height for cube map&quot;);
+            return false;
+        }
+        // No need to check height here. For texImage width == height.
+        // For texSubImage that will be checked when checking yoffset + height is in range.
+        if (width &gt; maxTextureSizeForLevel) {
+            synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;width or height out of range for cube map&quot;);
+            return false;
+        }
+        break;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid target&quot;);
+        return false;
+    }
+    
+    if (format != internalformat) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;format != internalformat&quot;);
+        return false;
+    }
+    
+    if (border) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;border != 0&quot;);
+        return false;
+    }
+    
+    return true;
+}
+
+bool WebGLRenderingContextBase::validateTexFuncData(const char* functionName, GC3Dint level,
+                                                    GC3Dsizei width, GC3Dsizei height,
+                                                    GC3Denum format, GC3Denum type,
+                                                    ArrayBufferView* pixels,
+                                                    NullDisposition disposition)
+{
+    if (!pixels) {
+        if (disposition == NullAllowed)
+            return true;
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no pixels&quot;);
+        return false;
+    }
+    
+    if (!validateTexFuncFormatAndType(functionName, format, type, level))
+        return false;
+    if (!validateSettableTexFormat(functionName, format))
+        return false;
+    
+    switch (type) {
+    case GraphicsContext3D::UNSIGNED_BYTE:
+        if (pixels-&gt;getType() != JSC::TypeUint8) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;type UNSIGNED_BYTE but ArrayBufferView not Uint8Array&quot;);
+            return false;
+        }
+        break;
+    case GraphicsContext3D::UNSIGNED_SHORT_5_6_5:
+    case GraphicsContext3D::UNSIGNED_SHORT_4_4_4_4:
+    case GraphicsContext3D::UNSIGNED_SHORT_5_5_5_1:
+        if (pixels-&gt;getType() != JSC::TypeUint16) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;type UNSIGNED_SHORT but ArrayBufferView not Uint16Array&quot;);
+            return false;
+        }
+        break;
+    case GraphicsContext3D::FLOAT: // OES_texture_float
+        if (pixels-&gt;getType() != JSC::TypeFloat32) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;type FLOAT but ArrayBufferView not Float32Array&quot;);
+            return false;
+        }
+        break;
+    case GraphicsContext3D::HALF_FLOAT_OES: // OES_texture_half_float
+        // As per the specification, ArrayBufferView should be null when
+        // OES_texture_half_float is enabled.
+        if (pixels) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;type HALF_FLOAT_OES but ArrayBufferView is not NULL&quot;);
+            return false;
+        }
+        break;
+    default:
+        ASSERT_NOT_REACHED();
+    }
+    
+    unsigned totalBytesRequired;
+    GC3Denum error = m_context-&gt;computeImageSizeInBytes(format, type, width, height, m_unpackAlignment, &amp;totalBytesRequired, 0);
+    if (error != GraphicsContext3D::NO_ERROR) {
+        synthesizeGLError(error, functionName, &quot;invalid texture dimensions&quot;);
+        return false;
+    }
+    if (pixels-&gt;byteLength() &lt; totalBytesRequired) {
+        if (m_unpackAlignment != 1) {
+            error = m_context-&gt;computeImageSizeInBytes(format, type, width, height, 1, &amp;totalBytesRequired, 0);
+            if (pixels-&gt;byteLength() == totalBytesRequired) {
+                synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;ArrayBufferView not big enough for request with UNPACK_ALIGNMENT &gt; 1&quot;);
+                return false;
+            }
+        }
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;ArrayBufferView not big enough for request&quot;);
+        return false;
+    }
+    return true;
+}
+
+bool WebGLRenderingContextBase::validateCompressedTexFormat(GC3Denum format)
+{
+    return m_compressedTextureFormats.contains(format);
+}
+
+bool WebGLRenderingContextBase::validateCompressedTexFuncData(const char* functionName,
+                                                              GC3Dsizei width, GC3Dsizei height,
+                                                              GC3Denum format, ArrayBufferView* pixels)
+{
+    if (!pixels) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no pixels&quot;);
+        return false;
+    }
+    if (width &lt; 0 || height &lt; 0) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;width or height &lt; 0&quot;);
+        return false;
+    }
+    
+    unsigned bytesRequired = 0;
+    
+    switch (format) {
+    case Extensions3D::COMPRESSED_RGB_S3TC_DXT1_EXT:
+    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT1_EXT:
+    case Extensions3D::COMPRESSED_ATC_RGB_AMD:
+        {
+        const int kBlockSize = 8;
+        const int kBlockWidth = 4;
+        const int kBlockHeight = 4;
+        int numBlocksAcross = (width + kBlockWidth - 1) / kBlockWidth;
+        int numBlocksDown = (height + kBlockHeight - 1) / kBlockHeight;
+        bytesRequired = numBlocksAcross * numBlocksDown * kBlockSize;
+        }
+        break;
+    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT3_EXT:
+    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT5_EXT:
+    case Extensions3D::COMPRESSED_ATC_RGBA_EXPLICIT_ALPHA_AMD:
+    case Extensions3D::COMPRESSED_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
+        {
+        const int kBlockSize = 16;
+        const int kBlockWidth = 4;
+        const int kBlockHeight = 4;
+        int numBlocksAcross = (width + kBlockWidth - 1) / kBlockWidth;
+        int numBlocksDown = (height + kBlockHeight - 1) / kBlockHeight;
+        bytesRequired = numBlocksAcross * numBlocksDown * kBlockSize;
+        }
+        break;
+    case Extensions3D::COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
+    case Extensions3D::COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:
+        {
+        const int kBlockSize = 8;
+        const int kBlockWidth = 8;
+        const int kBlockHeight = 8;
+        bytesRequired = (std::max(width, kBlockWidth) * std::max(height, kBlockHeight) * 4 + 7) / kBlockSize;
+        }
+        break;
+    case Extensions3D::COMPRESSED_RGB_PVRTC_2BPPV1_IMG:
+    case Extensions3D::COMPRESSED_RGBA_PVRTC_2BPPV1_IMG:
+        {
+        const int kBlockSize = 8;
+        const int kBlockWidth = 16;
+        const int kBlockHeight = 8;
+        bytesRequired = (std::max(width, kBlockWidth) * std::max(height, kBlockHeight) * 2 + 7) / kBlockSize;
+        }
+        break;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid format&quot;);
+        return false;
+    }
+    
+    if (pixels-&gt;byteLength() != bytesRequired) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;length of ArrayBufferView is not correct for dimensions&quot;);
+        return false;
+    }
+    
+    return true;
+}
+
+bool WebGLRenderingContextBase::validateCompressedTexDimensions(const char* functionName, GC3Denum target, GC3Dint level, GC3Dsizei width, GC3Dsizei height, GC3Denum format)
+{
+    switch (format) {
+    case Extensions3D::COMPRESSED_RGB_S3TC_DXT1_EXT:
+    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT1_EXT:
+    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT3_EXT:
+    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT5_EXT: {
+        const GC3Dsizei kBlockWidth = 4;
+        const GC3Dsizei kBlockHeight = 4;
+        const GC3Dint maxTextureSize = target ? m_maxTextureSize : m_maxCubeMapTextureSize;
+        const GC3Dsizei maxCompressedDimension = maxTextureSize &gt;&gt; level;
+        bool widthValid = (level &amp;&amp; width == 1) || (level &amp;&amp; width == 2) || (!(width % kBlockWidth) &amp;&amp; width &lt;= maxCompressedDimension);
+        bool heightValid = (level &amp;&amp; height == 1) || (level &amp;&amp; height == 2) || (!(height % kBlockHeight) &amp;&amp; height &lt;= maxCompressedDimension);
+        if (!widthValid || !heightValid) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;width or height invalid for level&quot;);
+            return false;
+        }
+        return true;
+    }
+    case Extensions3D::COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
+    case Extensions3D::COMPRESSED_RGB_PVRTC_2BPPV1_IMG:
+    case Extensions3D::COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:
+    case Extensions3D::COMPRESSED_RGBA_PVRTC_2BPPV1_IMG:
+        // Height and width must be powers of 2.
+        if ((width &amp; (width - 1)) || (height &amp; (height - 1))) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;width or height invalid for level&quot;);
+            return false;
+        }
+        return true;
+    default:
+        return false;
+    }
+}
+
+bool WebGLRenderingContextBase::validateCompressedTexSubDimensions(const char* functionName, GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
+                                                                   GC3Dsizei width, GC3Dsizei height, GC3Denum format, WebGLTexture* tex)
+{
+    if (xoffset &lt; 0 || yoffset &lt; 0) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;xoffset or yoffset &lt; 0&quot;);
+        return false;
+    }
+    
+    switch (format) {
+    case Extensions3D::COMPRESSED_RGB_S3TC_DXT1_EXT:
+    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT1_EXT:
+    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT3_EXT:
+    case Extensions3D::COMPRESSED_RGBA_S3TC_DXT5_EXT: {
+        const int kBlockWidth = 4;
+        const int kBlockHeight = 4;
+        if ((xoffset % kBlockWidth) || (yoffset % kBlockHeight)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;xoffset or yoffset not multiple of 4&quot;);
+            return false;
+        }
+        if (width - xoffset &gt; tex-&gt;getWidth(target, level)
+            || height - yoffset &gt; tex-&gt;getHeight(target, level)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;dimensions out of range&quot;);
+            return false;
+        }
+        return validateCompressedTexDimensions(functionName, target, level, width, height, format);
+    }
+    case Extensions3D::COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
+    case Extensions3D::COMPRESSED_RGB_PVRTC_2BPPV1_IMG:
+    case Extensions3D::COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:
+    case Extensions3D::COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: {
+        if (xoffset || yoffset) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;xoffset and yoffset must be zero&quot;);
+            return false;
+        }
+        if (width != tex-&gt;getWidth(target, level)
+            || height != tex-&gt;getHeight(target, level)) {
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;dimensions must match existing level&quot;);
+            return false;
+        }
+        return validateCompressedTexDimensions(functionName, target, level, width, height, format);
+    }
+    default:
+        return false;
+    }
+}
+
+bool WebGLRenderingContextBase::validateDrawMode(const char* functionName, GC3Denum mode)
+{
+    switch (mode) {
+    case GraphicsContext3D::POINTS:
+    case GraphicsContext3D::LINE_STRIP:
+    case GraphicsContext3D::LINE_LOOP:
+    case GraphicsContext3D::LINES:
+    case GraphicsContext3D::TRIANGLE_STRIP:
+    case GraphicsContext3D::TRIANGLE_FAN:
+    case GraphicsContext3D::TRIANGLES:
+        return true;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid draw mode&quot;);
+        return false;
+    }
+}
+
+bool WebGLRenderingContextBase::validateStencilSettings(const char* functionName)
+{
+    if (m_stencilMask != m_stencilMaskBack || m_stencilFuncRef != m_stencilFuncRefBack || m_stencilFuncMask != m_stencilFuncMaskBack) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;front and back stencils settings do not match&quot;);
+        return false;
+    }
+    return true;
+}
+
+bool WebGLRenderingContextBase::validateStencilFunc(const char* functionName, GC3Denum func)
+{
+    switch (func) {
+    case GraphicsContext3D::NEVER:
+    case GraphicsContext3D::LESS:
+    case GraphicsContext3D::LEQUAL:
+    case GraphicsContext3D::GREATER:
+    case GraphicsContext3D::GEQUAL:
+    case GraphicsContext3D::EQUAL:
+    case GraphicsContext3D::NOTEQUAL:
+    case GraphicsContext3D::ALWAYS:
+        return true;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid function&quot;);
+        return false;
+    }
+}
+
+void WebGLRenderingContextBase::printGLErrorToConsole(const String&amp; message)
+{
+    if (!m_numGLErrorsToConsoleAllowed)
+        return;
+    
+    --m_numGLErrorsToConsoleAllowed;
+    printWarningToConsole(message);
+    
+    if (!m_numGLErrorsToConsoleAllowed)
+        printWarningToConsole(&quot;WebGL: too many errors, no more errors will be reported to the console for this context.&quot;);
+}
+
+void WebGLRenderingContextBase::printWarningToConsole(const String&amp; message)
+{
+    if (!canvas())
+        return;
+    canvas()-&gt;document().addConsoleMessage(MessageSource::Rendering, MessageLevel::Warning, message);
+}
+
+bool WebGLRenderingContextBase::validateFramebufferFuncParameters(const char* functionName, GC3Denum target, GC3Denum attachment)
+{
+    if (target != GraphicsContext3D::FRAMEBUFFER) {
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid target&quot;);
+        return false;
+    }
+    switch (attachment) {
+    case GraphicsContext3D::COLOR_ATTACHMENT0:
+    case GraphicsContext3D::DEPTH_ATTACHMENT:
+    case GraphicsContext3D::STENCIL_ATTACHMENT:
+    case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT:
+        break;
+    default:
+        if (m_webglDrawBuffers
+            &amp;&amp; attachment &gt; GraphicsContext3D::COLOR_ATTACHMENT0
+            &amp;&amp; attachment &lt; static_cast&lt;GC3Denum&gt;(GraphicsContext3D::COLOR_ATTACHMENT0 + getMaxColorAttachments()))
+            break;
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid attachment&quot;);
+        return false;
+    }
+    return true;
+}
+
+bool WebGLRenderingContextBase::validateBlendEquation(const char* functionName, GC3Denum mode)
+{
+    switch (mode) {
+    case GraphicsContext3D::FUNC_ADD:
+    case GraphicsContext3D::FUNC_SUBTRACT:
+    case GraphicsContext3D::FUNC_REVERSE_SUBTRACT:
+    case Extensions3D::MIN_EXT:
+    case Extensions3D::MAX_EXT:
+        if ((mode == Extensions3D::MIN_EXT || mode == Extensions3D::MAX_EXT) &amp;&amp; !m_extBlendMinMax) {
+            synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid mode&quot;);
+            return false;
+        }
+        return true;
+        break;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid mode&quot;);
+        return false;
+    }
+}
+
+bool WebGLRenderingContextBase::validateBlendFuncFactors(const char* functionName, GC3Denum src, GC3Denum dst)
+{
+    if (((src == GraphicsContext3D::CONSTANT_COLOR || src == GraphicsContext3D::ONE_MINUS_CONSTANT_COLOR)
+        &amp;&amp; (dst == GraphicsContext3D::CONSTANT_ALPHA || dst == GraphicsContext3D::ONE_MINUS_CONSTANT_ALPHA))
+        || ((dst == GraphicsContext3D::CONSTANT_COLOR || dst == GraphicsContext3D::ONE_MINUS_CONSTANT_COLOR)
+        &amp;&amp; (src == GraphicsContext3D::CONSTANT_ALPHA || src == GraphicsContext3D::ONE_MINUS_CONSTANT_ALPHA))) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;incompatible src and dst&quot;);
+        return false;
+    }
+    return true;
+}
+
+bool WebGLRenderingContextBase::validateCapability(const char* functionName, GC3Denum cap)
+{
+    switch (cap) {
+    case GraphicsContext3D::BLEND:
+    case GraphicsContext3D::CULL_FACE:
+    case GraphicsContext3D::DEPTH_TEST:
+    case GraphicsContext3D::DITHER:
+    case GraphicsContext3D::POLYGON_OFFSET_FILL:
+    case GraphicsContext3D::SAMPLE_ALPHA_TO_COVERAGE:
+    case GraphicsContext3D::SAMPLE_COVERAGE:
+    case GraphicsContext3D::SCISSOR_TEST:
+    case GraphicsContext3D::STENCIL_TEST:
+        return true;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid capability&quot;);
+        return false;
+    }
+}
+
+bool WebGLRenderingContextBase::validateUniformParameters(const char* functionName, const WebGLUniformLocation* location, Float32Array* v, GC3Dsizei requiredMinSize)
+{
+    if (!v) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no array&quot;);
+        return false;
+    }
+    return validateUniformMatrixParameters(functionName, location, false, v-&gt;data(), v-&gt;length(), requiredMinSize);
+}
+
+bool WebGLRenderingContextBase::validateUniformParameters(const char* functionName, const WebGLUniformLocation* location, Int32Array* v, GC3Dsizei requiredMinSize)
+{
+    if (!v) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no array&quot;);
+        return false;
+    }
+    return validateUniformMatrixParameters(functionName, location, false, v-&gt;data(), v-&gt;length(), requiredMinSize);
+}
+
+bool WebGLRenderingContextBase::validateUniformParameters(const char* functionName, const WebGLUniformLocation* location, void* v, GC3Dsizei size, GC3Dsizei requiredMinSize)
+{
+    return validateUniformMatrixParameters(functionName, location, false, v, size, requiredMinSize);
+}
+
+bool WebGLRenderingContextBase::validateUniformMatrixParameters(const char* functionName, const WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* v, GC3Dsizei requiredMinSize)
+{
+    if (!v) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no array&quot;);
+        return false;
+    }
+    return validateUniformMatrixParameters(functionName, location, transpose, v-&gt;data(), v-&gt;length(), requiredMinSize);
+}
+
+bool WebGLRenderingContextBase::validateUniformMatrixParameters(const char* functionName, const WebGLUniformLocation* location, GC3Dboolean transpose, void* v, GC3Dsizei size, GC3Dsizei requiredMinSize)
+{
+    if (!location)
+        return false;
+    if (location-&gt;program() != m_currentProgram) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;location is not from current program&quot;);
+        return false;
+    }
+    if (!v) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no array&quot;);
+        return false;
+    }
+    if (transpose) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;transpose not FALSE&quot;);
+        return false;
+    }
+    if (size &lt; requiredMinSize || (size % requiredMinSize)) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;invalid size&quot;);
+        return false;
+    }
+    return true;
+}
+
+WebGLBuffer* WebGLRenderingContextBase::validateBufferDataParameters(const char* functionName, GC3Denum target, GC3Denum usage)
+{
+    WebGLBuffer* buffer = 0;
+    switch (target) {
+    case GraphicsContext3D::ELEMENT_ARRAY_BUFFER:
+        buffer = m_boundVertexArrayObject-&gt;getElementArrayBuffer().get();
+        break;
+    case GraphicsContext3D::ARRAY_BUFFER:
+        buffer = m_boundArrayBuffer.get();
+        break;
+    default:
+        synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid target&quot;);
+        return nullptr;
+    }
+    if (!buffer) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, &quot;no buffer&quot;);
+        return nullptr;
+    }
+    switch (usage) {
+    case GraphicsContext3D::STREAM_DRAW:
+    case GraphicsContext3D::STATIC_DRAW:
+    case GraphicsContext3D::DYNAMIC_DRAW:
+        return buffer;
+    }
+    synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, &quot;invalid usage&quot;);
+    return nullptr;
+}
+
+bool WebGLRenderingContextBase::validateHTMLImageElement(const char* functionName, HTMLImageElement* image, ExceptionCode&amp; ec)
+{
+    if (!image || !image-&gt;cachedImage()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no image&quot;);
+        return false;
+    }
+    const URL&amp; url = image-&gt;cachedImage()-&gt;response().url();
+    if (url.isNull() || url.isEmpty() || !url.isValid()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;invalid image&quot;);
+        return false;
+    }
+    if (wouldTaintOrigin(image)) {
+        ec = SECURITY_ERR;
+        return false;
+    }
+    return true;
+}
+
+bool WebGLRenderingContextBase::validateHTMLCanvasElement(const char* functionName, HTMLCanvasElement* canvas, ExceptionCode&amp; ec)
+{
+    if (!canvas || !canvas-&gt;buffer()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no canvas&quot;);
+        return false;
+    }
+    if (wouldTaintOrigin(canvas)) {
+        ec = SECURITY_ERR;
+        return false;
+    }
+    return true;
+}
+
+#if ENABLE(VIDEO)
+bool WebGLRenderingContextBase::validateHTMLVideoElement(const char* functionName, HTMLVideoElement* video, ExceptionCode&amp; ec)
+{
+    if (!video || !video-&gt;videoWidth() || !video-&gt;videoHeight()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no video&quot;);
+        return false;
+    }
+    if (wouldTaintOrigin(video)) {
+        ec = SECURITY_ERR;
+        return false;
+    }
+    return true;
+}
+#endif
+
+void WebGLRenderingContextBase::vertexAttribfImpl(const char* functionName, GC3Duint index, GC3Dsizei expectedSize, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2, GC3Dfloat v3)
+{
+    if (isContextLostOrPending())
+        return;
+    if (index &gt;= m_maxVertexAttribs) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;index out of range&quot;);
+        return;
+    }
+    // In GL, we skip setting vertexAttrib0 values.
+    if (index || isGLES2Compliant()) {
+        switch (expectedSize) {
+        case 1:
+            m_context-&gt;vertexAttrib1f(index, v0);
+            break;
+        case 2:
+            m_context-&gt;vertexAttrib2f(index, v0, v1);
+            break;
+        case 3:
+            m_context-&gt;vertexAttrib3f(index, v0, v1, v2);
+            break;
+        case 4:
+            m_context-&gt;vertexAttrib4f(index, v0, v1, v2, v3);
+            break;
+        }
+    }
+    VertexAttribValue&amp; attribValue = m_vertexAttribValue[index];
+    attribValue.value[0] = v0;
+    attribValue.value[1] = v1;
+    attribValue.value[2] = v2;
+    attribValue.value[3] = v3;
+}
+
+void WebGLRenderingContextBase::vertexAttribfvImpl(const char* functionName, GC3Duint index, Float32Array* v, GC3Dsizei expectedSize)
+{
+    if (isContextLostOrPending())
+        return;
+    if (!v) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no array&quot;);
+        return;
+    }
+    vertexAttribfvImpl(functionName, index, v-&gt;data(), v-&gt;length(), expectedSize);
+}
+
+void WebGLRenderingContextBase::vertexAttribfvImpl(const char* functionName, GC3Duint index, GC3Dfloat* v, GC3Dsizei size, GC3Dsizei expectedSize)
+{
+    if (isContextLostOrPending())
+        return;
+    if (!v) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;no array&quot;);
+        return;
+    }
+    if (size &lt; expectedSize) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;invalid size&quot;);
+        return;
+    }
+    if (index &gt;= m_maxVertexAttribs) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, &quot;index out of range&quot;);
+        return;
+    }
+    // In GL, we skip setting vertexAttrib0 values.
+    if (index || isGLES2Compliant()) {
+        switch (expectedSize) {
+        case 1:
+            m_context-&gt;vertexAttrib1fv(index, v);
+            break;
+        case 2:
+            m_context-&gt;vertexAttrib2fv(index, v);
+            break;
+        case 3:
+            m_context-&gt;vertexAttrib3fv(index, v);
+            break;
+        case 4:
+            m_context-&gt;vertexAttrib4fv(index, v);
+            break;
+        }
+    }
+    VertexAttribValue&amp; attribValue = m_vertexAttribValue[index];
+    attribValue.initValue();
+    for (int ii = 0; ii &lt; expectedSize; ++ii)
+        attribValue.value[ii] = v[ii];
+}
+
+void WebGLRenderingContextBase::initVertexAttrib0()
+{
+    WebGLVertexArrayObjectOES::VertexAttribState&amp; state = m_boundVertexArrayObject-&gt;getVertexAttribState(0);
+    
+    m_vertexAttrib0Buffer = createBuffer();
+    m_context-&gt;bindBuffer(GraphicsContext3D::ARRAY_BUFFER, m_vertexAttrib0Buffer-&gt;object());
+    m_context-&gt;bufferData(GraphicsContext3D::ARRAY_BUFFER, 0, GraphicsContext3D::DYNAMIC_DRAW);
+    m_context-&gt;vertexAttribPointer(0, 4, GraphicsContext3D::FLOAT, false, 0, 0);
+    state.bufferBinding = m_vertexAttrib0Buffer;
+    m_context-&gt;bindBuffer(GraphicsContext3D::ARRAY_BUFFER, 0);
+    m_context-&gt;enableVertexAttribArray(0);
+    m_vertexAttrib0BufferSize = 0;
+    m_vertexAttrib0BufferValue[0] = 0.0f;
+    m_vertexAttrib0BufferValue[1] = 0.0f;
+    m_vertexAttrib0BufferValue[2] = 0.0f;
+    m_vertexAttrib0BufferValue[3] = 1.0f;
+    m_forceAttrib0BufferRefill = false;
+    m_vertexAttrib0UsedBefore = false;
+}
+
+bool WebGLRenderingContextBase::simulateVertexAttrib0(GC3Dsizei numVertex)
+{
+    const WebGLVertexArrayObjectOES::VertexAttribState&amp; state = m_boundVertexArrayObject-&gt;getVertexAttribState(0);
+    const VertexAttribValue&amp; attribValue = m_vertexAttribValue[0];
+    if (!m_currentProgram)
+        return false;
+    bool usingVertexAttrib0 = m_currentProgram-&gt;isUsingVertexAttrib0();
+    if (usingVertexAttrib0)
+        m_vertexAttrib0UsedBefore = true;
+    if (state.enabled &amp;&amp; usingVertexAttrib0)
+        return false;
+    if (!usingVertexAttrib0 &amp;&amp; !m_vertexAttrib0UsedBefore)
+        return false;
+    m_vertexAttrib0UsedBefore = true;
+    m_context-&gt;bindBuffer(GraphicsContext3D::ARRAY_BUFFER, m_vertexAttrib0Buffer-&gt;object());
+    GC3Dsizeiptr bufferDataSize = (numVertex + 1) * 4 * sizeof(GC3Dfloat);
+    if (bufferDataSize &gt; m_vertexAttrib0BufferSize) {
+        m_context-&gt;bufferData(GraphicsContext3D::ARRAY_BUFFER, bufferDataSize, 0, GraphicsContext3D::DYNAMIC_DRAW);
+        m_vertexAttrib0BufferSize = bufferDataSize;
+        m_forceAttrib0BufferRefill = true;
+    }
+    if (usingVertexAttrib0
+        &amp;&amp; (m_forceAttrib0BufferRefill
+            || attribValue.value[0] != m_vertexAttrib0BufferValue[0]
+            || attribValue.value[1] != m_vertexAttrib0BufferValue[1]
+            || attribValue.value[2] != m_vertexAttrib0BufferValue[2]
+            || attribValue.value[3] != m_vertexAttrib0BufferValue[3])) {
+            auto bufferData = std::make_unique&lt;GC3Dfloat[]&gt;((numVertex + 1) * 4);
+            for (GC3Dsizei ii = 0; ii &lt; numVertex + 1; ++ii) {
+                bufferData[ii * 4] = attribValue.value[0];
+                bufferData[ii * 4 + 1] = attribValue.value[1];
+                bufferData[ii * 4 + 2] = attribValue.value[2];
+                bufferData[ii * 4 + 3] = attribValue.value[3];
+            }
+            m_vertexAttrib0BufferValue[0] = attribValue.value[0];
+            m_vertexAttrib0BufferValue[1] = attribValue.value[1];
+            m_vertexAttrib0BufferValue[2] = attribValue.value[2];
+            m_vertexAttrib0BufferValue[3] = attribValue.value[3];
+            m_forceAttrib0BufferRefill = false;
+            m_context-&gt;bufferSubData(GraphicsContext3D::ARRAY_BUFFER, 0, bufferDataSize, bufferData.get());
+        }
+    m_context-&gt;vertexAttribPointer(0, 4, GraphicsContext3D::FLOAT, 0, 0, 0);
+    return true;
+}
+
+void WebGLRenderingContextBase::restoreStatesAfterVertexAttrib0Simulation()
+{
+    const WebGLVertexArrayObjectOES::VertexAttribState&amp; state = m_boundVertexArrayObject-&gt;getVertexAttribState(0);
+    if (state.bufferBinding != m_vertexAttrib0Buffer) {
+        m_context-&gt;bindBuffer(GraphicsContext3D::ARRAY_BUFFER, objectOrZero(state.bufferBinding.get()));
+        m_context-&gt;vertexAttribPointer(0, state.size, state.type, state.normalized, state.originalStride, state.offset);
+    }
+    m_context-&gt;bindBuffer(GraphicsContext3D::ARRAY_BUFFER, objectOrZero(m_boundArrayBuffer.get()));
+}
+
+void WebGLRenderingContextBase::dispatchContextLostEvent()
+{
+    RefPtr&lt;WebGLContextEvent&gt; event = WebGLContextEvent::create(eventNames().webglcontextlostEvent, false, true, &quot;&quot;);
+    canvas()-&gt;dispatchEvent(event);
+    m_restoreAllowed = event-&gt;defaultPrevented();
+    if (m_contextLostMode == RealLostContext &amp;&amp; m_restoreAllowed)
+        m_restoreTimer.startOneShot(0);
+}
+
+void WebGLRenderingContextBase::maybeRestoreContext()
+{
+    ASSERT(m_contextLost);
+    if (!m_contextLost)
+        return;
+    
+    // The rendering context is not restored unless the default behavior of the
+    // webglcontextlost event was prevented earlier.
+    //
+    // Because of the way m_restoreTimer is set up for real vs. synthetic lost
+    // context events, we don't have to worry about this test short-circuiting
+    // the retry loop for real context lost events.
+    if (!m_restoreAllowed)
+        return;
+    
+    int contextLostReason = m_context-&gt;getExtensions()-&gt;getGraphicsResetStatusARB();
+    
+    switch (contextLostReason) {
+    case GraphicsContext3D::NO_ERROR:
+        // The GraphicsContext3D implementation might not fully
+        // support GL_ARB_robustness semantics yet. Alternatively, the
+        // WEBGL_lose_context extension might have been used to force
+        // a lost context.
+        break;
+    case Extensions3D::GUILTY_CONTEXT_RESET_ARB:
+        // The rendering context is not restored if this context was
+        // guilty of causing the graphics reset.
+        printWarningToConsole(&quot;WARNING: WebGL content on the page caused the graphics card to reset; not restoring the context&quot;);
+        return;
+    case Extensions3D::INNOCENT_CONTEXT_RESET_ARB:
+        // Always allow the context to be restored.
+        break;
+    case Extensions3D::UNKNOWN_CONTEXT_RESET_ARB:
+        // Warn. Ideally, prompt the user telling them that WebGL
+        // content on the page might have caused the graphics card to
+        // reset and ask them whether they want to continue running
+        // the content. Only if they say &quot;yes&quot; should we start
+        // attempting to restore the context.
+        printWarningToConsole(&quot;WARNING: WebGL content on the page might have caused the graphics card to reset&quot;);
+        break;
+    }
+    
+    Frame* frame = canvas()-&gt;document().frame();
+    if (!frame)
+        return;
+    
+    if (!frame-&gt;loader().client().allowWebGL(frame-&gt;settings().webGLEnabled()))
+        return;
+    
+    FrameView* view = frame-&gt;view();
+    if (!view)
+        return;
+    ScrollView* root = view-&gt;root();
+    if (!root)
+        return;
+    HostWindow* hostWindow = root-&gt;hostWindow();
+    if (!hostWindow)
+        return;
+    
+    RefPtr&lt;GraphicsContext3D&gt; context(GraphicsContext3D::create(m_attributes, hostWindow));
+    if (!context) {
+        if (m_contextLostMode == RealLostContext)
+            m_restoreTimer.startOneShot(secondsBetweenRestoreAttempts);
+        else
+            // This likely shouldn't happen but is the best way to report it to the WebGL app.
+            synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, &quot;&quot;, &quot;error restoring context&quot;);
+        return;
+    }
+    
+    // Construct a new drawing buffer with the new GraphicsContext3D.
+    if (m_drawingBuffer) {
+        m_drawingBuffer-&gt;discardResources();
+        DrawingBuffer::PreserveDrawingBuffer preserve = m_attributes.preserveDrawingBuffer ? DrawingBuffer::Preserve : DrawingBuffer::Discard;
+        DrawingBuffer::AlphaRequirement alpha = m_attributes.alpha ? DrawingBuffer::Alpha : DrawingBuffer::Opaque;
+        m_drawingBuffer = DrawingBuffer::create(context.get(), m_drawingBuffer-&gt;size(), preserve, alpha);
+        m_drawingBuffer-&gt;bind();
+    }
+    
+    m_context = context;
+    m_contextLost = false;
+    setupFlags();
+    initializeNewContext();
+    canvas()-&gt;dispatchEvent(WebGLContextEvent::create(eventNames().webglcontextrestoredEvent, false, true, &quot;&quot;));
+}
+
+String WebGLRenderingContextBase::ensureNotNull(const String&amp; text) const
+{
+    if (text.isNull())
+        return WTF::emptyString();
+    return text;
+}
+
+WebGLRenderingContextBase::LRUImageBufferCache::LRUImageBufferCache(int capacity)
+    : m_buffers(std::make_unique&lt;std::unique_ptr&lt;ImageBuffer&gt;[]&gt;(capacity))
+    , m_capacity(capacity)
+{
+}
+
+ImageBuffer* WebGLRenderingContextBase::LRUImageBufferCache::imageBuffer(const IntSize&amp; size)
+{
+    int i;
+    for (i = 0; i &lt; m_capacity; ++i) {
+        ImageBuffer* buf = m_buffers[i].get();
+        if (!buf)
+            break;
+        if (buf-&gt;logicalSize() != size)
+            continue;
+        bubbleToFront(i);
+        return buf;
+    }
+    
+    std::unique_ptr&lt;ImageBuffer&gt; temp = ImageBuffer::create(size, 1);
+    if (!temp)
+        return nullptr;
+    i = std::min(m_capacity - 1, i);
+    m_buffers[i] = WTF::move(temp);
+    
+    ImageBuffer* buf = m_buffers[i].get();
+    bubbleToFront(i);
+    return buf;
+}
+
+void WebGLRenderingContextBase::LRUImageBufferCache::bubbleToFront(int idx)
+{
+    for (int i = idx; i &gt; 0; --i)
+        m_buffers[i].swap(m_buffers[i-1]);
+}
+
+namespace {
+    
+    String GetErrorString(GC3Denum error)
+    {
+        switch (error) {
+        case GraphicsContext3D::INVALID_ENUM:
+            return &quot;INVALID_ENUM&quot;;
+        case GraphicsContext3D::INVALID_VALUE:
+            return &quot;INVALID_VALUE&quot;;
+        case GraphicsContext3D::INVALID_OPERATION:
+            return &quot;INVALID_OPERATION&quot;;
+        case GraphicsContext3D::OUT_OF_MEMORY:
+            return &quot;OUT_OF_MEMORY&quot;;
+        case GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION:
+            return &quot;INVALID_FRAMEBUFFER_OPERATION&quot;;
+        case GraphicsContext3D::CONTEXT_LOST_WEBGL:
+            return &quot;CONTEXT_LOST_WEBGL&quot;;
+        default:
+            return String::format(&quot;WebGL ERROR(%04x)&quot;, error);
+        }
+    }
+    
+} // namespace anonymous
+
+void WebGLRenderingContextBase::synthesizeGLError(GC3Denum error, const char* functionName, const char* description, ConsoleDisplayPreference display)
+{
+    if (m_synthesizedErrorsToConsole &amp;&amp; display == DisplayInConsole) {
+        String str = String(&quot;WebGL: &quot;) + GetErrorString(error) +  &quot;: &quot; + String(functionName) + &quot;: &quot; + String(description);
+        printGLErrorToConsole(str);
+    }
+    m_context-&gt;synthesizeGLError(error);
+}
+
+
+void WebGLRenderingContextBase::printGLWarningToConsole(const char* functionName, const char* description)
+{
+    if (m_synthesizedErrorsToConsole) {
+        String str = String(&quot;WebGL: &quot;) + String(functionName) + &quot;: &quot; + String(description);
+        printGLErrorToConsole(str);
+    }
+}
+
+void WebGLRenderingContextBase::applyStencilTest()
+{
+    bool haveStencilBuffer = false;
+    
+    if (m_framebufferBinding)
+        haveStencilBuffer = m_framebufferBinding-&gt;hasStencilBuffer();
+    else {
+        RefPtr&lt;WebGLContextAttributes&gt; attributes = getContextAttributes();
+        haveStencilBuffer = attributes-&gt;stencil();
+    }
+    enableOrDisable(GraphicsContext3D::STENCIL_TEST,
+                    m_stencilEnabled &amp;&amp; haveStencilBuffer);
+}
+
+void WebGLRenderingContextBase::enableOrDisable(GC3Denum capability, bool enable)
+{
+    if (enable)
+        m_context-&gt;enable(capability);
+    else
+        m_context-&gt;disable(capability);
+}
+
+IntSize WebGLRenderingContextBase::clampedCanvasSize()
+{
+    return IntSize(clamp(canvas()-&gt;width(), 1, m_maxViewportDims[0]),
+                   clamp(canvas()-&gt;height(), 1, m_maxViewportDims[1]));
+}
+
+GC3Dint WebGLRenderingContextBase::getMaxDrawBuffers()
+{
+    if (!supportsDrawBuffers())
+        return 0;
+    if (!m_maxDrawBuffers)
+        m_context-&gt;getIntegerv(Extensions3D::MAX_DRAW_BUFFERS_EXT, &amp;m_maxDrawBuffers);
+    if (!m_maxColorAttachments)
+        m_context-&gt;getIntegerv(Extensions3D::MAX_COLOR_ATTACHMENTS_EXT, &amp;m_maxColorAttachments);
+    // WEBGL_draw_buffers requires MAX_COLOR_ATTACHMENTS &gt;= MAX_DRAW_BUFFERS.
+    return std::min(m_maxDrawBuffers, m_maxColorAttachments);
+}
+
+GC3Dint WebGLRenderingContextBase::getMaxColorAttachments()
+{
+    if (!supportsDrawBuffers())
+        return 0;
+    if (!m_maxColorAttachments)
+        m_context-&gt;getIntegerv(Extensions3D::MAX_COLOR_ATTACHMENTS_EXT, &amp;m_maxColorAttachments);
+    return m_maxColorAttachments;
+}
+
+void WebGLRenderingContextBase::setBackDrawBuffer(GC3Denum buf)
+{
+    m_backDrawBuffer = buf;
+}
+
+void WebGLRenderingContextBase::restoreCurrentFramebuffer()
+{
+    ExceptionCode ec;
+    bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_framebufferBinding.get(), ec);
+}
+
+void WebGLRenderingContextBase::restoreCurrentTexture2D()
+{
+    ExceptionCode ec;
+    bindTexture(GraphicsContext3D::TEXTURE_2D, m_textureUnits[m_activeTextureUnit].texture2DBinding.get(), ec);
+}
+
+bool WebGLRenderingContextBase::supportsDrawBuffers()
+{
+    if (!m_drawBuffersWebGLRequirementsChecked) {
+        m_drawBuffersWebGLRequirementsChecked = true;
+        m_drawBuffersSupported = WebGLDrawBuffers::supported(this);
+    }
+    return m_drawBuffersSupported;
+}
+
+void WebGLRenderingContextBase::drawArraysInstanced(GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei primcount)
+{
+    if (!primcount) {
+        markContextChanged();
+        return;
+    }
+    
+    if (!validateDrawArrays(&quot;drawArraysInstanced&quot;, mode, first, count, primcount))
+        return;
+    
+    clearIfComposited();
+    
+    bool vertexAttrib0Simulated = false;
+    if (!isGLES2Compliant())
+        vertexAttrib0Simulated = simulateVertexAttrib0(first + count - 1);
+    if (!isGLES2NPOTStrict())
+        checkTextureCompleteness(&quot;drawArraysInstanced&quot;, true);
+    
+    m_context-&gt;drawArraysInstanced(mode, first, count, primcount);
+    
+    if (!isGLES2Compliant() &amp;&amp; vertexAttrib0Simulated)
+        restoreStatesAfterVertexAttrib0Simulation();
+    if (!isGLES2NPOTStrict())
+        checkTextureCompleteness(&quot;drawArraysInstanced&quot;, false);
+    markContextChanged();
+}
+
+void WebGLRenderingContextBase::drawElementsInstanced(GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, GC3Dsizei primcount)
+{
+    if (!primcount) {
+        markContextChanged();
+        return;
+    }
+    
+    unsigned numElements = 0;
+    if (!validateDrawElements(&quot;drawElementsInstanced&quot;, mode, count, type, offset, numElements, primcount))
+        return;
+    
+    clearIfComposited();
+    
+    bool vertexAttrib0Simulated = false;
+    if (!isGLES2Compliant()) {
+        if (!numElements)
+            validateIndexArrayPrecise(count, type, static_cast&lt;GC3Dintptr&gt;(offset), numElements);
+        vertexAttrib0Simulated = simulateVertexAttrib0(numElements);
+    }
+    if (!isGLES2NPOTStrict())
+        checkTextureCompleteness(&quot;drawElementsInstanced&quot;, true);
+    
+    m_context-&gt;drawElementsInstanced(mode, count, type, static_cast&lt;GC3Dintptr&gt;(offset), primcount);
+    
+    if (!isGLES2Compliant() &amp;&amp; vertexAttrib0Simulated)
+        restoreStatesAfterVertexAttrib0Simulation();
+    if (!isGLES2NPOTStrict())
+        checkTextureCompleteness(&quot;drawElementsInstanced&quot;, false);
+    markContextChanged();
+}
+
+void WebGLRenderingContextBase::vertexAttribDivisor(GC3Duint index, GC3Duint divisor)
+{
+    if (isContextLostOrPending())
+        return;
+    
+    if (index &gt;= m_maxVertexAttribs) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, &quot;vertexAttribDivisor&quot;, &quot;index out of range&quot;);
+        return;
+    }
+    
+    m_boundVertexArrayObject-&gt;setVertexAttribDivisor(index, divisor);
+    m_context-&gt;vertexAttribDivisor(index, divisor);
+}
+
+    
+} // namespace WebCore
+
+#endif // ENABLE(WEBGL)
</ins></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLRenderingContextBaseh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.h (0 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.h                                (rev 0)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -0,0 +1,816 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef WebGLRenderingContextBase_h
+#define WebGLRenderingContextBase_h
+
+#include &quot;ActiveDOMObject.h&quot;
+#include &quot;CanvasRenderingContext.h&quot;
+#include &quot;DrawingBuffer.h&quot;
+#include &quot;GraphicsContext3D.h&quot;
+#include &quot;ImageBuffer.h&quot;
+#include &quot;Timer.h&quot;
+#include &quot;WebGLGetInfo.h&quot;
+#include &lt;memory&gt;
+#include &lt;runtime/Float32Array.h&gt;
+#include &lt;runtime/Int32Array.h&gt;
+#include &lt;wtf/text/WTFString.h&gt;
+
+namespace WebCore {
+
+class ANGLEInstancedArrays;
+class EXTBlendMinMax;
+class EXTTextureFilterAnisotropic;
+class EXTShaderTextureLOD;
+class EXTsRGB;
+class EXTFragDepth;
+class HTMLImageElement;
+class HTMLVideoElement;
+class ImageBuffer;
+class ImageData;
+class IntSize;
+class OESStandardDerivatives;
+class OESTextureFloat;
+class OESTextureFloatLinear;
+class OESTextureHalfFloat;
+class OESTextureHalfFloatLinear;
+class OESVertexArrayObject;
+class OESElementIndexUint;
+class WebGLActiveInfo;
+class WebGLBuffer;
+class WebGLContextGroup;
+class WebGLContextObject;
+class WebGLCompressedTextureATC;
+class WebGLCompressedTexturePVRTC;
+class WebGLCompressedTextureS3TC;
+class WebGLContextAttributes;
+class WebGLDebugRendererInfo;
+class WebGLDebugShaders;
+class WebGLDepthTexture;
+class WebGLDrawBuffers;
+class WebGLExtension;
+class WebGLFramebuffer;
+class WebGLLoseContext;
+class WebGLObject;
+class WebGLProgram;
+class WebGLRenderbuffer;
+class WebGLShader;
+class WebGLSharedObject;
+class WebGLShaderPrecisionFormat;
+class WebGLTexture;
+class WebGLUniformLocation;
+class WebGLVertexArrayObjectOES;
+
+typedef int ExceptionCode;
+
+class WebGLRenderingContextBase : public CanvasRenderingContext, public ActiveDOMObject {
+public:
+    static std::unique_ptr&lt;WebGLRenderingContextBase&gt; create(HTMLCanvasElement*, WebGLContextAttributes*, const String&amp;);
+    virtual ~WebGLRenderingContextBase();
+
+#if PLATFORM(WIN)
+// FIXME: Implement accelerated 3d canvas on Windows.
+virtual bool isAccelerated() const override { return false; }
+#else
+virtual bool isAccelerated() const override { return true; }
+#endif
+
+int drawingBufferWidth() const;
+int drawingBufferHeight() const;
+
+void activeTexture(GC3Denum texture, ExceptionCode&amp;);
+void attachShader(WebGLProgram*, WebGLShader*, ExceptionCode&amp;);
+void bindAttribLocation(WebGLProgram*, GC3Duint index, const String&amp; name, ExceptionCode&amp;);
+void bindBuffer(GC3Denum target, WebGLBuffer*, ExceptionCode&amp;);
+void bindFramebuffer(GC3Denum target, WebGLFramebuffer*, ExceptionCode&amp;);
+void bindRenderbuffer(GC3Denum target, WebGLRenderbuffer*, ExceptionCode&amp;);
+void bindTexture(GC3Denum target, WebGLTexture*, ExceptionCode&amp;);
+void blendColor(GC3Dfloat red, GC3Dfloat green, GC3Dfloat blue, GC3Dfloat alpha);
+void blendEquation(GC3Denum mode);
+void blendEquationSeparate(GC3Denum modeRGB, GC3Denum modeAlpha);
+void blendFunc(GC3Denum sfactor, GC3Denum dfactor);
+void blendFuncSeparate(GC3Denum srcRGB, GC3Denum dstRGB, GC3Denum srcAlpha, GC3Denum dstAlpha);
+
+void bufferData(GC3Denum target, long long size, GC3Denum usage, ExceptionCode&amp;);
+void bufferData(GC3Denum target, ArrayBuffer* data, GC3Denum usage, ExceptionCode&amp;);
+void bufferData(GC3Denum target, ArrayBufferView* data, GC3Denum usage, ExceptionCode&amp;);
+void bufferSubData(GC3Denum target, long long offset, ArrayBuffer* data, ExceptionCode&amp;);
+void bufferSubData(GC3Denum target, long long offset, ArrayBufferView* data, ExceptionCode&amp;);
+
+GC3Denum checkFramebufferStatus(GC3Denum target);
+void clear(GC3Dbitfield mask);
+void clearColor(GC3Dfloat red, GC3Dfloat green, GC3Dfloat blue, GC3Dfloat alpha);
+void clearDepth(GC3Dfloat);
+void clearStencil(GC3Dint);
+void colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboolean alpha);
+void compileShader(WebGLShader*, ExceptionCode&amp;);
+
+void compressedTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width,
+                          GC3Dsizei height, GC3Dint border, ArrayBufferView* data);
+void compressedTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
+                             GC3Dsizei width, GC3Dsizei height, GC3Denum format, ArrayBufferView* data);
+
+void copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border);
+void copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
+
+PassRefPtr&lt;WebGLBuffer&gt; createBuffer();
+PassRefPtr&lt;WebGLFramebuffer&gt; createFramebuffer();
+PassRefPtr&lt;WebGLProgram&gt; createProgram();
+PassRefPtr&lt;WebGLRenderbuffer&gt; createRenderbuffer();
+PassRefPtr&lt;WebGLShader&gt; createShader(GC3Denum type, ExceptionCode&amp;);
+PassRefPtr&lt;WebGLTexture&gt; createTexture();
+
+void cullFace(GC3Denum mode);
+
+void deleteBuffer(WebGLBuffer*);
+void deleteFramebuffer(WebGLFramebuffer*);
+void deleteProgram(WebGLProgram*);
+void deleteRenderbuffer(WebGLRenderbuffer*);
+void deleteShader(WebGLShader*);
+void deleteTexture(WebGLTexture*);
+
+void depthFunc(GC3Denum);
+void depthMask(GC3Dboolean);
+void depthRange(GC3Dfloat zNear, GC3Dfloat zFar);
+void detachShader(WebGLProgram*, WebGLShader*, ExceptionCode&amp;);
+void disable(GC3Denum cap);
+void disableVertexAttribArray(GC3Duint index, ExceptionCode&amp;);
+void drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei count, ExceptionCode&amp;);
+void drawElements(GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, ExceptionCode&amp;);
+
+void enable(GC3Denum cap);
+void enableVertexAttribArray(GC3Duint index, ExceptionCode&amp;);
+void finish();
+void flush();
+void framebufferRenderbuffer(GC3Denum target, GC3Denum attachment, GC3Denum renderbuffertarget, WebGLRenderbuffer*, ExceptionCode&amp;);
+void framebufferTexture2D(GC3Denum target, GC3Denum attachment, GC3Denum textarget, WebGLTexture*, GC3Dint level, ExceptionCode&amp;);
+void frontFace(GC3Denum mode);
+void generateMipmap(GC3Denum target);
+
+PassRefPtr&lt;WebGLActiveInfo&gt; getActiveAttrib(WebGLProgram*, GC3Duint index, ExceptionCode&amp;);
+PassRefPtr&lt;WebGLActiveInfo&gt; getActiveUniform(WebGLProgram*, GC3Duint index, ExceptionCode&amp;);
+bool getAttachedShaders(WebGLProgram*, Vector&lt;RefPtr&lt;WebGLShader&gt;&gt;&amp;, ExceptionCode&amp;);
+GC3Dint getAttribLocation(WebGLProgram*, const String&amp; name);
+WebGLGetInfo getBufferParameter(GC3Denum target, GC3Denum pname, ExceptionCode&amp;);
+PassRefPtr&lt;WebGLContextAttributes&gt; getContextAttributes();
+GC3Denum getError();
+WebGLExtension* getExtension(const String&amp; name);
+WebGLGetInfo getFramebufferAttachmentParameter(GC3Denum target, GC3Denum attachment, GC3Denum pname, ExceptionCode&amp;);
+WebGLGetInfo getParameter(GC3Denum pname, ExceptionCode&amp;);
+WebGLGetInfo getProgramParameter(WebGLProgram*, GC3Denum pname, ExceptionCode&amp;);
+String getProgramInfoLog(WebGLProgram*, ExceptionCode&amp;);
+WebGLGetInfo getRenderbufferParameter(GC3Denum target, GC3Denum pname, ExceptionCode&amp;);
+WebGLGetInfo getShaderParameter(WebGLShader*, GC3Denum pname, ExceptionCode&amp;);
+String getShaderInfoLog(WebGLShader*, ExceptionCode&amp;);
+PassRefPtr&lt;WebGLShaderPrecisionFormat&gt; getShaderPrecisionFormat(GC3Denum shaderType, GC3Denum precisionType, ExceptionCode&amp;);
+String getShaderSource(WebGLShader*, ExceptionCode&amp;);
+Vector&lt;String&gt; getSupportedExtensions();
+WebGLGetInfo getTexParameter(GC3Denum target, GC3Denum pname, ExceptionCode&amp;);
+WebGLGetInfo getUniform(WebGLProgram*, const WebGLUniformLocation*, ExceptionCode&amp;);
+PassRefPtr&lt;WebGLUniformLocation&gt; getUniformLocation(WebGLProgram*, const String&amp;, ExceptionCode&amp;);
+WebGLGetInfo getVertexAttrib(GC3Duint index, GC3Denum pname, ExceptionCode&amp;);
+long long getVertexAttribOffset(GC3Duint index, GC3Denum pname);
+
+void hint(GC3Denum target, GC3Denum mode);
+GC3Dboolean isBuffer(WebGLBuffer*);
+bool isContextLost() const;
+GC3Dboolean isEnabled(GC3Denum cap);
+GC3Dboolean isFramebuffer(WebGLFramebuffer*);
+GC3Dboolean isProgram(WebGLProgram*);
+GC3Dboolean isRenderbuffer(WebGLRenderbuffer*);
+GC3Dboolean isShader(WebGLShader*);
+GC3Dboolean isTexture(WebGLTexture*);
+
+void lineWidth(GC3Dfloat);
+void linkProgram(WebGLProgram*, ExceptionCode&amp;);
+void pixelStorei(GC3Denum pname, GC3Dint param);
+void polygonOffset(GC3Dfloat factor, GC3Dfloat units);
+void readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, ArrayBufferView* pixels, ExceptionCode&amp;);
+void releaseShaderCompiler();
+void renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height);
+void sampleCoverage(GC3Dfloat value, GC3Dboolean invert);
+void scissor(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
+void shaderSource(WebGLShader*, const String&amp;, ExceptionCode&amp;);
+void stencilFunc(GC3Denum func, GC3Dint ref, GC3Duint mask);
+void stencilFuncSeparate(GC3Denum face, GC3Denum func, GC3Dint ref, GC3Duint mask);
+void stencilMask(GC3Duint);
+void stencilMaskSeparate(GC3Denum face, GC3Duint mask);
+void stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zpass);
+void stencilOpSeparate(GC3Denum face, GC3Denum fail, GC3Denum zfail, GC3Denum zpass);
+
+void texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
+                GC3Dsizei width, GC3Dsizei height, GC3Dint border,
+                GC3Denum format, GC3Denum type, ArrayBufferView*, ExceptionCode&amp;);
+void texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
+                GC3Denum format, GC3Denum type, ImageData*, ExceptionCode&amp;);
+void texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
+                GC3Denum format, GC3Denum type, HTMLImageElement*, ExceptionCode&amp;);
+void texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
+                GC3Denum format, GC3Denum type, HTMLCanvasElement*, ExceptionCode&amp;);
+#if ENABLE(VIDEO)
+void texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
+                GC3Denum format, GC3Denum type, HTMLVideoElement*, ExceptionCode&amp;);
+#endif
+
+void texParameterf(GC3Denum target, GC3Denum pname, GC3Dfloat param);
+void texParameteri(GC3Denum target, GC3Denum pname, GC3Dint param);
+
+void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
+                   GC3Dsizei width, GC3Dsizei height,
+                   GC3Denum format, GC3Denum type, ArrayBufferView*, ExceptionCode&amp;);
+void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
+                   GC3Denum format, GC3Denum type, ImageData*, ExceptionCode&amp;);
+void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
+                   GC3Denum format, GC3Denum type, HTMLImageElement*, ExceptionCode&amp;);
+void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
+                   GC3Denum format, GC3Denum type, HTMLCanvasElement*, ExceptionCode&amp;);
+#if ENABLE(VIDEO)
+void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
+                   GC3Denum format, GC3Denum type, HTMLVideoElement*, ExceptionCode&amp;);
+#endif
+
+void uniform1f(const WebGLUniformLocation* location, GC3Dfloat x, ExceptionCode&amp;);
+void uniform1fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&amp;);
+void uniform1fv(const WebGLUniformLocation* location, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp;);
+void uniform1i(const WebGLUniformLocation* location, GC3Dint x, ExceptionCode&amp;);
+void uniform1iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&amp;);
+void uniform1iv(const WebGLUniformLocation* location, GC3Dint* v, GC3Dsizei size, ExceptionCode&amp;);
+void uniform2f(const WebGLUniformLocation* location, GC3Dfloat x, GC3Dfloat y, ExceptionCode&amp;);
+void uniform2fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&amp;);
+void uniform2fv(const WebGLUniformLocation* location, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp;);
+void uniform2i(const WebGLUniformLocation* location, GC3Dint x, GC3Dint y, ExceptionCode&amp;);
+void uniform2iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&amp;);
+void uniform2iv(const WebGLUniformLocation* location, GC3Dint* v, GC3Dsizei size, ExceptionCode&amp;);
+void uniform3f(const WebGLUniformLocation* location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, ExceptionCode&amp;);
+void uniform3fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&amp;);
+void uniform3fv(const WebGLUniformLocation* location, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp;);
+void uniform3i(const WebGLUniformLocation* location, GC3Dint x, GC3Dint y, GC3Dint z, ExceptionCode&amp;);
+void uniform3iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&amp;);
+void uniform3iv(const WebGLUniformLocation* location, GC3Dint* v, GC3Dsizei size, ExceptionCode&amp;);
+void uniform4f(const WebGLUniformLocation* location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w, ExceptionCode&amp;);
+void uniform4fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&amp;);
+void uniform4fv(const WebGLUniformLocation* location, GC3Dfloat* v, GC3Dsizei size, ExceptionCode&amp;);
+void uniform4i(const WebGLUniformLocation* location, GC3Dint x, GC3Dint y, GC3Dint z, GC3Dint w, ExceptionCode&amp;);
+void uniform4iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&amp;);
+void uniform4iv(const WebGLUniformLocation* location, GC3Dint* v, GC3Dsizei size, ExceptionCode&amp;);
+void uniformMatrix2fv(const WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* value, ExceptionCode&amp;);
+void uniformMatrix2fv(const WebGLUniformLocation* location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size, ExceptionCode&amp;);
+void uniformMatrix3fv(const WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* value, ExceptionCode&amp;);
+void uniformMatrix3fv(const WebGLUniformLocation* location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size, ExceptionCode&amp;);
+void uniformMatrix4fv(const WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* value, ExceptionCode&amp;);
+void uniformMatrix4fv(const WebGLUniformLocation* location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size, ExceptionCode&amp;);
+
+void useProgram(WebGLProgram*, ExceptionCode&amp;);
+void validateProgram(WebGLProgram*, ExceptionCode&amp;);
+
+void vertexAttrib1f(GC3Duint index, GC3Dfloat x);
+void vertexAttrib1fv(GC3Duint index, Float32Array* values);
+void vertexAttrib1fv(GC3Duint index, GC3Dfloat* values, GC3Dsizei size);
+void vertexAttrib2f(GC3Duint index, GC3Dfloat x, GC3Dfloat y);
+void vertexAttrib2fv(GC3Duint index, Float32Array* values);
+void vertexAttrib2fv(GC3Duint index, GC3Dfloat* values, GC3Dsizei size);
+void vertexAttrib3f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z);
+void vertexAttrib3fv(GC3Duint index, Float32Array* values);
+void vertexAttrib3fv(GC3Duint index, GC3Dfloat* values, GC3Dsizei size);
+void vertexAttrib4f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w);
+void vertexAttrib4fv(GC3Duint index, Float32Array* values);
+void vertexAttrib4fv(GC3Duint index, GC3Dfloat* values, GC3Dsizei size);
+void vertexAttribPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dboolean normalized,
+                         GC3Dsizei stride, long long offset, ExceptionCode&amp;);
+
+void viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
+
+// WEBKIT_lose_context support
+enum LostContextMode {
+    // Lost context occurred at the graphics system level.
+    RealLostContext,
+    
+    // Lost context provoked by WEBKIT_lose_context.
+    SyntheticLostContext
+};
+void forceLostContext(LostContextMode);
+void forceRestoreContext();
+void loseContextImpl(LostContextMode);
+
+GraphicsContext3D* graphicsContext3D() const { return m_context.get(); }
+WebGLContextGroup* contextGroup() const { return m_contextGroup.get(); }
+virtual PlatformLayer* platformLayer() const override;
+
+void reshape(int width, int height);
+
+void markLayerComposited();
+virtual void paintRenderingResultsToCanvas() override;
+PassRefPtr&lt;ImageData&gt; paintRenderingResultsToImageData();
+
+void removeSharedObject(WebGLSharedObject*);
+void removeContextObject(WebGLContextObject*);
+
+unsigned getMaxVertexAttribs() const { return m_maxVertexAttribs; }
+
+// ANGLE_instanced_arrays extension functions.
+void drawArraysInstanced(GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei primcount);
+void drawElementsInstanced(GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, GC3Dsizei primcount);
+void vertexAttribDivisor(GC3Duint index, GC3Duint divisor);
+
+protected:
+WebGLRenderingContextBase(HTMLCanvasElement*, GraphicsContext3D::Attributes);
+WebGLRenderingContextBase(HTMLCanvasElement*, PassRefPtr&lt;GraphicsContext3D&gt;, GraphicsContext3D::Attributes);
+
+private:
+friend class WebGLDrawBuffers;
+friend class WebGLFramebuffer;
+friend class WebGLObject;
+friend class OESVertexArrayObject;
+friend class WebGLDebugShaders;
+friend class WebGLCompressedTextureATC;
+friend class WebGLCompressedTexturePVRTC;
+friend class WebGLCompressedTextureS3TC;
+friend class WebGLRenderingContextErrorMessageCallback;
+friend class WebGLVertexArrayObjectOES;
+
+void initializeNewContext();
+void setupFlags();
+
+// ActiveDOMObject
+virtual bool hasPendingActivity() const override;
+virtual void stop() override;
+virtual const char* activeDOMObjectName() const override { return &quot;WebGLRenderingContext&quot;; }
+
+void addSharedObject(WebGLSharedObject*);
+void addContextObject(WebGLContextObject*);
+void detachAndRemoveAllObjects();
+
+void destroyGraphicsContext3D();
+void markContextChanged();
+
+// Query whether it is built on top of compliant GLES2 implementation.
+bool isGLES2Compliant() { return m_isGLES2Compliant; }
+// Query if the GL implementation is NPOT strict.
+bool isGLES2NPOTStrict() { return m_isGLES2NPOTStrict; }
+// Query if the GL implementation generates errors on out-of-bounds buffer accesses.
+bool isErrorGeneratedOnOutOfBoundsAccesses() { return m_isErrorGeneratedOnOutOfBoundsAccesses; }
+// Query if the GL implementation initializes textures/renderbuffers to 0.
+bool isResourceSafe() { return m_isResourceSafe; }
+// Query if depth_stencil buffer is supported.
+bool isDepthStencilSupported() { return m_isDepthStencilSupported; }
+
+// Helper to return the size in bytes of OpenGL data types
+// like GL_FLOAT, GL_INT, etc.
+unsigned sizeInBytes(GC3Denum type);
+
+// Basic validation of count and offset against number of elements in element array buffer
+bool validateElementArraySize(GC3Dsizei count, GC3Denum type, GC3Dintptr offset);
+
+// Conservative but quick index validation
+bool validateIndexArrayConservative(GC3Denum type, unsigned&amp; numElementsRequired);
+
+// Precise but slow index validation -- only done if conservative checks fail
+bool validateIndexArrayPrecise(GC3Dsizei count, GC3Denum type, GC3Dintptr offset, unsigned&amp; numElementsRequired);
+bool validateVertexAttributes(unsigned elementCount, unsigned primitiveCount = 0);
+
+bool validateWebGLObject(const char*, WebGLObject*);
+
+bool validateDrawArrays(const char* functionName, GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei primcount);
+bool validateDrawElements(const char* functionName, GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, unsigned&amp; numElements, GC3Dsizei primcount);
+
+// Adds a compressed texture format.
+void addCompressedTextureFormat(GC3Denum);
+
+PassRefPtr&lt;Image&gt; drawImageIntoBuffer(Image*, int width, int height, int deviceScaleFactor);
+
+#if ENABLE(VIDEO)
+PassRefPtr&lt;Image&gt; videoFrameToImage(HTMLVideoElement*, BackingStoreCopy, ExceptionCode&amp;);
+#endif
+
+RefPtr&lt;GraphicsContext3D&gt; m_context;
+RefPtr&lt;WebGLContextGroup&gt; m_contextGroup;
+
+// Optional structure for rendering to a DrawingBuffer, instead of directly
+// to the back-buffer of m_context.
+RefPtr&lt;DrawingBuffer&gt; m_drawingBuffer;
+
+// Dispatches a context lost event once it is determined that one is needed.
+// This is used both for synthetic and real context losses. For real ones, it's
+// likely that there's no JavaScript on the stack, but that might be dependent
+// on how exactly the platform discovers that the context was lost. For better
+// portability we always defer the dispatch of the event.
+Timer m_dispatchContextLostEventTimer;
+bool m_restoreAllowed;
+Timer m_restoreTimer;
+
+bool m_needsUpdate;
+bool m_markedCanvasDirty;
+HashSet&lt;WebGLContextObject*&gt; m_contextObjects;
+
+// List of bound VBO's. Used to maintain info about sizes for ARRAY_BUFFER and stored values for ELEMENT_ARRAY_BUFFER
+RefPtr&lt;WebGLBuffer&gt; m_boundArrayBuffer;
+
+RefPtr&lt;WebGLVertexArrayObjectOES&gt; m_defaultVertexArrayObject;
+RefPtr&lt;WebGLVertexArrayObjectOES&gt; m_boundVertexArrayObject;
+void setBoundVertexArrayObject(PassRefPtr&lt;WebGLVertexArrayObjectOES&gt; arrayObject)
+{
+    if (arrayObject)
+        m_boundVertexArrayObject = arrayObject;
+    else
+        m_boundVertexArrayObject = m_defaultVertexArrayObject;
+}
+
+class VertexAttribValue {
+public:
+    VertexAttribValue()
+    {
+        initValue();
+    }
+    
+    void initValue()
+    {
+        value[0] = 0.0f;
+        value[1] = 0.0f;
+        value[2] = 0.0f;
+        value[3] = 1.0f;
+    }
+    
+    GC3Dfloat value[4];
+};
+Vector&lt;VertexAttribValue&gt; m_vertexAttribValue;
+unsigned m_maxVertexAttribs;
+RefPtr&lt;WebGLBuffer&gt; m_vertexAttrib0Buffer;
+long m_vertexAttrib0BufferSize;
+GC3Dfloat m_vertexAttrib0BufferValue[4];
+bool m_forceAttrib0BufferRefill;
+bool m_vertexAttrib0UsedBefore;
+
+RefPtr&lt;WebGLProgram&gt; m_currentProgram;
+RefPtr&lt;WebGLFramebuffer&gt; m_framebufferBinding;
+RefPtr&lt;WebGLRenderbuffer&gt; m_renderbufferBinding;
+struct TextureUnitState {
+    RefPtr&lt;WebGLTexture&gt; texture2DBinding;
+    RefPtr&lt;WebGLTexture&gt; textureCubeMapBinding;
+};
+Vector&lt;TextureUnitState&gt; m_textureUnits;
+unsigned long m_activeTextureUnit;
+
+RefPtr&lt;WebGLTexture&gt; m_blackTexture2D;
+RefPtr&lt;WebGLTexture&gt; m_blackTextureCubeMap;
+
+Vector&lt;GC3Denum&gt; m_compressedTextureFormats;
+
+// Fixed-size cache of reusable image buffers for video texImage2D calls.
+class LRUImageBufferCache {
+public:
+    LRUImageBufferCache(int capacity);
+    // The pointer returned is owned by the image buffer map.
+    ImageBuffer* imageBuffer(const IntSize&amp; size);
+private:
+    void bubbleToFront(int idx);
+    std::unique_ptr&lt;std::unique_ptr&lt;ImageBuffer&gt;[]&gt; m_buffers;
+    int m_capacity;
+};
+LRUImageBufferCache m_generatedImageCache;
+
+GC3Dint m_maxTextureSize;
+GC3Dint m_maxCubeMapTextureSize;
+GC3Dint m_maxRenderbufferSize;
+GC3Dint m_maxViewportDims[2];
+GC3Dint m_maxTextureLevel;
+GC3Dint m_maxCubeMapTextureLevel;
+
+GC3Dint m_maxDrawBuffers;
+GC3Dint m_maxColorAttachments;
+GC3Denum m_backDrawBuffer;
+bool m_drawBuffersWebGLRequirementsChecked;
+bool m_drawBuffersSupported;
+
+GC3Dint m_packAlignment;
+GC3Dint m_unpackAlignment;
+bool m_unpackFlipY;
+bool m_unpackPremultiplyAlpha;
+GC3Denum m_unpackColorspaceConversion;
+bool m_contextLost;
+LostContextMode m_contextLostMode;
+GraphicsContext3D::Attributes m_attributes;
+
+bool m_layerCleared;
+GC3Dfloat m_clearColor[4];
+bool m_scissorEnabled;
+GC3Dfloat m_clearDepth;
+GC3Dint m_clearStencil;
+GC3Dboolean m_colorMask[4];
+GC3Dboolean m_depthMask;
+
+bool m_stencilEnabled;
+GC3Duint m_stencilMask, m_stencilMaskBack;
+GC3Dint m_stencilFuncRef, m_stencilFuncRefBack; // Note that these are the user specified values, not the internal clamped value.
+GC3Duint m_stencilFuncMask, m_stencilFuncMaskBack;
+
+bool m_isGLES2Compliant;
+bool m_isGLES2NPOTStrict;
+bool m_isErrorGeneratedOnOutOfBoundsAccesses;
+bool m_isResourceSafe;
+bool m_isDepthStencilSupported;
+bool m_isRobustnessEXTSupported;
+
+bool m_synthesizedErrorsToConsole;
+int m_numGLErrorsToConsoleAllowed;
+
+// A WebGLRenderingContext can be created in a state where it appears as
+// a valid and active context, but will not execute any important operations
+// until its load policy is completely resolved.
+bool m_isPendingPolicyResolution;
+bool m_hasRequestedPolicyResolution;
+bool isContextLostOrPending();
+
+// Enabled extension objects.
+std::unique_ptr&lt;EXTFragDepth&gt; m_extFragDepth;
+std::unique_ptr&lt;EXTBlendMinMax&gt; m_extBlendMinMax;
+std::unique_ptr&lt;EXTsRGB&gt; m_extsRGB;
+std::unique_ptr&lt;EXTTextureFilterAnisotropic&gt; m_extTextureFilterAnisotropic;
+std::unique_ptr&lt;EXTShaderTextureLOD&gt; m_extShaderTextureLOD;
+std::unique_ptr&lt;OESTextureFloat&gt; m_oesTextureFloat;
+std::unique_ptr&lt;OESTextureFloatLinear&gt; m_oesTextureFloatLinear;
+std::unique_ptr&lt;OESTextureHalfFloat&gt; m_oesTextureHalfFloat;
+std::unique_ptr&lt;OESTextureHalfFloatLinear&gt; m_oesTextureHalfFloatLinear;
+std::unique_ptr&lt;OESStandardDerivatives&gt; m_oesStandardDerivatives;
+std::unique_ptr&lt;OESVertexArrayObject&gt; m_oesVertexArrayObject;
+std::unique_ptr&lt;OESElementIndexUint&gt; m_oesElementIndexUint;
+std::unique_ptr&lt;WebGLLoseContext&gt; m_webglLoseContext;
+std::unique_ptr&lt;WebGLDebugRendererInfo&gt; m_webglDebugRendererInfo;
+std::unique_ptr&lt;WebGLDebugShaders&gt; m_webglDebugShaders;
+std::unique_ptr&lt;WebGLCompressedTextureATC&gt; m_webglCompressedTextureATC;
+std::unique_ptr&lt;WebGLCompressedTexturePVRTC&gt; m_webglCompressedTexturePVRTC;
+std::unique_ptr&lt;WebGLCompressedTextureS3TC&gt; m_webglCompressedTextureS3TC;
+std::unique_ptr&lt;WebGLDepthTexture&gt; m_webglDepthTexture;
+std::unique_ptr&lt;WebGLDrawBuffers&gt; m_webglDrawBuffers;
+std::unique_ptr&lt;ANGLEInstancedArrays&gt; m_angleInstancedArrays;
+
+// Helpers for getParameter and others
+WebGLGetInfo getBooleanParameter(GC3Denum);
+WebGLGetInfo getBooleanArrayParameter(GC3Denum);
+WebGLGetInfo getFloatParameter(GC3Denum);
+WebGLGetInfo getIntParameter(GC3Denum);
+WebGLGetInfo getUnsignedIntParameter(GC3Denum);
+WebGLGetInfo getWebGLFloatArrayParameter(GC3Denum);
+WebGLGetInfo getWebGLIntArrayParameter(GC3Denum);
+
+// Clear the backbuffer if it was composited since the last operation.
+// clearMask is set to the bitfield of any clear that would happen anyway at this time
+// and the function returns true if that clear is now unnecessary.
+bool clearIfComposited(GC3Dbitfield clearMask = 0);
+
+// Helper to restore state that clearing the framebuffer may destroy.
+void restoreStateAfterClear();
+
+void texImage2DBase(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels, ExceptionCode&amp;);
+void texImage2DImpl(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Denum format, GC3Denum type, Image*, GraphicsContext3D::ImageHtmlDomSource, bool flipY, bool premultiplyAlpha, ExceptionCode&amp;);
+void texSubImage2DBase(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels, ExceptionCode&amp;);
+void texSubImage2DImpl(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Denum format, GC3Denum type, Image*, GraphicsContext3D::ImageHtmlDomSource, bool flipY, bool premultiplyAlpha, ExceptionCode&amp;);
+
+void checkTextureCompleteness(const char*, bool);
+
+void createFallbackBlackTextures1x1();
+
+// Helper function for copyTex{Sub}Image, check whether the internalformat
+// and the color buffer format of the current bound framebuffer combination
+// is valid.
+bool isTexInternalFormatColorBufferCombinationValid(GC3Denum texInternalFormat,GC3Denum colorBufferFormat);
+
+// Helper function to get the bound framebuffer's color buffer format.
+GC3Denum getBoundFramebufferColorFormat();
+
+// Helper function to get the bound framebuffer's width.
+int getBoundFramebufferWidth();
+
+// Helper function to get the bound framebuffer's height.
+int getBoundFramebufferHeight();
+
+// Helper function to verify limits on the length of uniform and attribute locations.
+bool validateLocationLength(const char* functionName, const String&amp;);
+
+// Helper function to check if size is non-negative.
+// Generate GL error and return false for negative inputs; otherwise, return true.
+bool validateSize(const char* functionName, GC3Dint x, GC3Dint y);
+
+// Helper function to check if all characters in the string belong to the
+// ASCII subset as defined in GLSL ES 1.0 spec section 3.1.
+bool validateString(const char* functionName, const String&amp;);
+
+// Helper function to check target and texture bound to the target.
+// Generate GL errors and return 0 if target is invalid or texture bound is
+// null.  Otherwise, return the texture bound to the target.
+WebGLTexture* validateTextureBinding(const char* functionName, GC3Denum target, bool useSixEnumsForCubeMap);
+
+// Helper function to check input format/type for functions {copy}Tex{Sub}Image.
+// Generates GL error and returns false if parameters are invalid.
+bool validateTexFuncFormatAndType(const char* functionName, GC3Denum format, GC3Denum type, GC3Dint level);
+
+// Helper function to check input level for functions {copy}Tex{Sub}Image.
+// Generates GL error and returns false if level is invalid.
+bool validateTexFuncLevel(const char* functionName, GC3Denum target, GC3Dint level);
+
+enum TexFuncValidationFunctionType {
+    NotTexSubImage2D,
+    TexSubImage2D,
+};
+
+enum TexFuncValidationSourceType {
+    SourceArrayBufferView,
+    SourceImageData,
+    SourceHTMLImageElement,
+    SourceHTMLCanvasElement,
+    SourceHTMLVideoElement,
+};
+
+// Helper function for tex{Sub}Image2D to check if the input format/type/level/target/width/height/border/xoffset/yoffset are valid.
+// Otherwise, it would return quickly without doing other work.
+bool validateTexFunc(const char* functionName, TexFuncValidationFunctionType, TexFuncValidationSourceType, GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width,
+                     GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, GC3Dint xoffset, GC3Dint yoffset);
+
+// Helper function to check input parameters for functions {copy}Tex{Sub}Image.
+// Generates GL error and returns false if parameters are invalid.
+bool validateTexFuncParameters(const char* functionName,
+                               TexFuncValidationFunctionType,
+                               GC3Denum target, GC3Dint level,
+                               GC3Denum internalformat,
+                               GC3Dsizei width, GC3Dsizei height, GC3Dint border,
+                               GC3Denum format, GC3Denum type);
+
+enum NullDisposition {
+    NullAllowed,
+    NullNotAllowed
+};
+
+// Helper function to validate that the given ArrayBufferView
+// is of the correct type and contains enough data for the texImage call.
+// Generates GL error and returns false if parameters are invalid.
+bool validateTexFuncData(const char* functionName, GC3Dint level,
+                         GC3Dsizei width, GC3Dsizei height,
+                         GC3Denum format, GC3Denum type,
+                         ArrayBufferView* pixels,
+                         NullDisposition);
+
+// Helper function to validate a given texture format is settable as in
+// you can supply data to texImage2D, or call texImage2D, copyTexImage2D and
+// copyTexSubImage2D.
+// Generates GL error and returns false if the format is not settable.
+bool validateSettableTexFormat(const char* functionName, GC3Denum format);
+
+// Helper function to validate compressed texture data is correct size
+// for the given format and dimensions.
+bool validateCompressedTexFuncData(const char* functionName,
+                                   GC3Dsizei width, GC3Dsizei height,
+                                   GC3Denum format, ArrayBufferView* pixels);
+
+// Helper function for validating compressed texture formats.
+bool validateCompressedTexFormat(GC3Denum format);
+
+// Helper function to validate compressed texture dimensions are valid for
+// the given format.
+bool validateCompressedTexDimensions(const char* functionName, GC3Denum target, GC3Dint level, GC3Dsizei width, GC3Dsizei height, GC3Denum format);
+
+// Helper function to validate compressed texture dimensions are valid for
+// the given format.
+bool validateCompressedTexSubDimensions(const char* functionName, GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
+                                        GC3Dsizei width, GC3Dsizei height, GC3Denum format, WebGLTexture*);
+
+// Helper function to validate mode for draw{Arrays/Elements}.
+bool validateDrawMode(const char* functionName, GC3Denum);
+
+// Helper function to validate if front/back stencilMask and stencilFunc settings are the same.
+bool validateStencilSettings(const char* functionName);
+
+// Helper function to validate stencil func.
+bool validateStencilFunc(const char* functionName, GC3Denum);
+
+// Helper function for texParameterf and texParameteri.
+void texParameter(GC3Denum target, GC3Denum pname, GC3Dfloat parami, GC3Dint paramf, bool isFloat);
+
+// Helper function to print GL errors to console.
+void printGLErrorToConsole(const String&amp;);
+void printGLWarningToConsole(const char* function, const char* reason);
+
+// Helper function to print warnings to console. Currently
+// used only to warn about use of obsolete functions.
+void printWarningToConsole(const String&amp;);
+
+// Helper function to validate input parameters for framebuffer functions.
+// Generate GL error if parameters are illegal.
+bool validateFramebufferFuncParameters(const char* functionName, GC3Denum target, GC3Denum attachment);
+
+// Helper function to validate blend equation mode.
+bool validateBlendEquation(const char* functionName, GC3Denum);
+
+// Helper function to validate blend func factors.
+bool validateBlendFuncFactors(const char* functionName, GC3Denum src, GC3Denum dst);
+
+// Helper function to validate a GL capability.
+bool validateCapability(const char* functionName, GC3Denum);
+
+// Helper function to validate input parameters for uniform functions.
+bool validateUniformParameters(const char* functionName, const WebGLUniformLocation*, Float32Array*, GC3Dsizei mod);
+bool validateUniformParameters(const char* functionName, const WebGLUniformLocation*, Int32Array*, GC3Dsizei mod);
+bool validateUniformParameters(const char* functionName, const WebGLUniformLocation*, void*, GC3Dsizei, GC3Dsizei mod);
+bool validateUniformMatrixParameters(const char* functionName, const WebGLUniformLocation*, GC3Dboolean transpose, Float32Array*, GC3Dsizei mod);
+bool validateUniformMatrixParameters(const char* functionName, const WebGLUniformLocation*, GC3Dboolean transpose, void*, GC3Dsizei, GC3Dsizei mod);
+
+// Helper function to validate parameters for bufferData.
+// Return the current bound buffer to target, or 0 if parameters are invalid.
+WebGLBuffer* validateBufferDataParameters(const char* functionName, GC3Denum target, GC3Denum usage);
+
+// Helper function for tex{Sub}Image2D to make sure image is ready and wouldn't taint Origin.
+bool validateHTMLImageElement(const char* functionName, HTMLImageElement*, ExceptionCode&amp;);
+
+// Helper function for tex{Sub}Image2D to make sure canvas is ready and wouldn't taint Origin.
+bool validateHTMLCanvasElement(const char* functionName, HTMLCanvasElement*, ExceptionCode&amp;);
+
+#if ENABLE(VIDEO)
+// Helper function for tex{Sub}Image2D to make sure video is ready wouldn't taint Origin.
+bool validateHTMLVideoElement(const char* functionName, HTMLVideoElement*, ExceptionCode&amp;);
+#endif
+
+// Helper functions for vertexAttribNf{v}.
+void vertexAttribfImpl(const char* functionName, GC3Duint index, GC3Dsizei expectedSize, GC3Dfloat, GC3Dfloat, GC3Dfloat, GC3Dfloat);
+void vertexAttribfvImpl(const char* functionName, GC3Duint index, Float32Array*, GC3Dsizei expectedSize);
+void vertexAttribfvImpl(const char* functionName, GC3Duint index, GC3Dfloat*, GC3Dsizei, GC3Dsizei expectedSize);
+
+// Helper function for delete* (deleteBuffer, deleteProgram, etc) functions.
+// Return false if caller should return without further processing.
+bool deleteObject(WebGLObject*);
+
+// Helper function for bind* (bindBuffer, bindTexture, etc) and useProgram.
+// If the object has already been deleted, set deleted to true upon return.
+// Return false if caller should return without further processing.
+bool checkObjectToBeBound(const char* functionName, WebGLObject*, bool&amp; deleted);
+
+// Helpers for simulating vertexAttrib0
+void initVertexAttrib0();
+bool simulateVertexAttrib0(GC3Dsizei numVertex);
+void restoreStatesAfterVertexAttrib0Simulation();
+
+void dispatchContextLostEvent();
+// Helper for restoration after context lost.
+void maybeRestoreContext();
+
+// Determine if we are running privileged code in the browser, for example,
+// a Safari or Chrome extension.
+bool allowPrivilegedExtensions() const;
+
+enum ConsoleDisplayPreference {
+    DisplayInConsole,
+    DontDisplayInConsole
+};
+
+// Wrapper for GraphicsContext3D::synthesizeGLError that sends a message
+// to the JavaScript console.
+void synthesizeGLError(GC3Denum, const char* functionName, const char* description, ConsoleDisplayPreference = DisplayInConsole);
+
+String ensureNotNull(const String&amp;) const;
+
+// Enable or disable stencil test based on user setting and
+// whether the current FBO has a stencil buffer.
+void applyStencilTest();
+
+// Helper for enabling or disabling a capability.
+void enableOrDisable(GC3Denum capability, bool enable);
+
+// Clamp the width and height to GL_MAX_VIEWPORT_DIMS.
+IntSize clampedCanvasSize();
+
+// First time called, if EXT_draw_buffers is supported, query the value; otherwise return 0.
+// Later, return the cached value.
+GC3Dint getMaxDrawBuffers();
+GC3Dint getMaxColorAttachments();
+
+void setBackDrawBuffer(GC3Denum);
+
+void restoreCurrentFramebuffer();
+void restoreCurrentTexture2D();
+
+// Check if EXT_draw_buffers extension is supported and if it satisfies the WebGL requirements.
+bool supportsDrawBuffers();
+};
+
+} // namespace WebCore
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLRenderingContextBaseidl"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.idl (0 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.idl                                (rev 0)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.idl        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -0,0 +1,677 @@
</span><ins>+/*
+* Copyright (C) 2015 Apple Inc. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in the
+*    documentation and/or other materials provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+*/
+
+typedef unsigned long  GLenum;
+typedef boolean        GLboolean;
+typedef unsigned long  GLbitfield;
+typedef byte           GLbyte;         /* 'byte' should be a signed 8 bit type. */
+typedef short          GLshort;
+typedef long           GLint;
+typedef long           GLsizei;
+typedef long long      GLintptr;
+typedef long long      GLsizeiptr;
+typedef octet          GLubyte;        /* 'octet' should be an unsigned 8 bit type. */
+typedef unsigned short GLushort;
+typedef unsigned long  GLuint;
+typedef unrestricted float GLfloat;
+typedef unrestricted float GLclampf;
+
+[
+Conditional=WEBGL,
+JSCustomMarkFunction,
+DoNotCheckConstants,
+] interface WebGLRenderingContextBase : CanvasRenderingContext {
+
+/* ClearBufferMask */
+const GLenum DEPTH_BUFFER_BIT               = 0x00000100;
+const GLenum STENCIL_BUFFER_BIT             = 0x00000400;
+const GLenum COLOR_BUFFER_BIT               = 0x00004000;
+
+/* BeginMode */
+const GLenum POINTS                         = 0x0000;
+const GLenum LINES                          = 0x0001;
+const GLenum LINE_LOOP                      = 0x0002;
+const GLenum LINE_STRIP                     = 0x0003;
+const GLenum TRIANGLES                      = 0x0004;
+const GLenum TRIANGLE_STRIP                 = 0x0005;
+const GLenum TRIANGLE_FAN                   = 0x0006;
+
+/* AlphaFunction (not supported in ES20) */
+/*      NEVER */
+/*      LESS */
+/*      EQUAL */
+/*      LEQUAL */
+/*      GREATER */
+/*      NOTEQUAL */
+/*      GEQUAL */
+/*      ALWAYS */
+
+/* BlendingFactorDest */
+const GLenum ZERO                           = 0;
+const GLenum ONE                            = 1;
+const GLenum SRC_COLOR                      = 0x0300;
+const GLenum ONE_MINUS_SRC_COLOR            = 0x0301;
+const GLenum SRC_ALPHA                      = 0x0302;
+const GLenum ONE_MINUS_SRC_ALPHA            = 0x0303;
+const GLenum DST_ALPHA                      = 0x0304;
+const GLenum ONE_MINUS_DST_ALPHA            = 0x0305;
+
+/* BlendingFactorSrc */
+/*      ZERO */
+/*      ONE */
+const GLenum DST_COLOR                      = 0x0306;
+const GLenum ONE_MINUS_DST_COLOR            = 0x0307;
+const GLenum SRC_ALPHA_SATURATE             = 0x0308;
+/*      SRC_ALPHA */
+/*      ONE_MINUS_SRC_ALPHA */
+/*      DST_ALPHA */
+/*      ONE_MINUS_DST_ALPHA */
+
+/* BlendEquationSeparate */
+const GLenum FUNC_ADD                       = 0x8006;
+const GLenum BLEND_EQUATION                 = 0x8009;
+const GLenum BLEND_EQUATION_RGB             = 0x8009;   /* same as BLEND_EQUATION */
+const GLenum BLEND_EQUATION_ALPHA           = 0x883D;
+
+/* BlendSubtract */
+const GLenum FUNC_SUBTRACT                  = 0x800A;
+const GLenum FUNC_REVERSE_SUBTRACT          = 0x800B;
+
+/* Separate Blend Functions */
+const GLenum BLEND_DST_RGB                  = 0x80C8;
+const GLenum BLEND_SRC_RGB                  = 0x80C9;
+const GLenum BLEND_DST_ALPHA                = 0x80CA;
+const GLenum BLEND_SRC_ALPHA                = 0x80CB;
+const GLenum CONSTANT_COLOR                 = 0x8001;
+const GLenum ONE_MINUS_CONSTANT_COLOR       = 0x8002;
+const GLenum CONSTANT_ALPHA                 = 0x8003;
+const GLenum ONE_MINUS_CONSTANT_ALPHA       = 0x8004;
+const GLenum BLEND_COLOR                    = 0x8005;
+
+/* Buffer Objects */
+const GLenum ARRAY_BUFFER                   = 0x8892;
+const GLenum ELEMENT_ARRAY_BUFFER           = 0x8893;
+const GLenum ARRAY_BUFFER_BINDING           = 0x8894;
+const GLenum ELEMENT_ARRAY_BUFFER_BINDING   = 0x8895;
+
+const GLenum STREAM_DRAW                    = 0x88E0;
+const GLenum STATIC_DRAW                    = 0x88E4;
+const GLenum DYNAMIC_DRAW                   = 0x88E8;
+
+const GLenum BUFFER_SIZE                    = 0x8764;
+const GLenum BUFFER_USAGE                   = 0x8765;
+
+const GLenum CURRENT_VERTEX_ATTRIB          = 0x8626;
+
+/* CullFaceMode */
+const GLenum FRONT                          = 0x0404;
+const GLenum BACK                           = 0x0405;
+const GLenum FRONT_AND_BACK                 = 0x0408;
+
+/* DepthFunction */
+/*      NEVER */
+/*      LESS */
+/*      EQUAL */
+/*      LEQUAL */
+/*      GREATER */
+/*      NOTEQUAL */
+/*      GEQUAL */
+/*      ALWAYS */
+
+/* EnableCap */
+const GLenum TEXTURE_2D                     = 0x0DE1;
+const GLenum CULL_FACE                      = 0x0B44;
+const GLenum BLEND                          = 0x0BE2;
+const GLenum DITHER                         = 0x0BD0;
+const GLenum STENCIL_TEST                   = 0x0B90;
+const GLenum DEPTH_TEST                     = 0x0B71;
+const GLenum SCISSOR_TEST                   = 0x0C11;
+const GLenum POLYGON_OFFSET_FILL            = 0x8037;
+const GLenum SAMPLE_ALPHA_TO_COVERAGE       = 0x809E;
+const GLenum SAMPLE_COVERAGE                = 0x80A0;
+
+/* ErrorCode */
+const GLenum NO_ERROR                       = 0;
+const GLenum INVALID_ENUM                   = 0x0500;
+const GLenum INVALID_VALUE                  = 0x0501;
+const GLenum INVALID_OPERATION              = 0x0502;
+const GLenum OUT_OF_MEMORY                  = 0x0505;
+
+/* FrontFaceDirection */
+const GLenum CW                             = 0x0900;
+const GLenum CCW                            = 0x0901;
+
+/* GetPName */
+const GLenum LINE_WIDTH                     = 0x0B21;
+const GLenum ALIASED_POINT_SIZE_RANGE       = 0x846D;
+const GLenum ALIASED_LINE_WIDTH_RANGE       = 0x846E;
+const GLenum CULL_FACE_MODE                 = 0x0B45;
+const GLenum FRONT_FACE                     = 0x0B46;
+const GLenum DEPTH_RANGE                    = 0x0B70;
+const GLenum DEPTH_WRITEMASK                = 0x0B72;
+const GLenum DEPTH_CLEAR_VALUE              = 0x0B73;
+const GLenum DEPTH_FUNC                     = 0x0B74;
+const GLenum STENCIL_CLEAR_VALUE            = 0x0B91;
+const GLenum STENCIL_FUNC                   = 0x0B92;
+const GLenum STENCIL_FAIL                   = 0x0B94;
+const GLenum STENCIL_PASS_DEPTH_FAIL        = 0x0B95;
+const GLenum STENCIL_PASS_DEPTH_PASS        = 0x0B96;
+const GLenum STENCIL_REF                    = 0x0B97;
+const GLenum STENCIL_VALUE_MASK             = 0x0B93;
+const GLenum STENCIL_WRITEMASK              = 0x0B98;
+const GLenum STENCIL_BACK_FUNC              = 0x8800;
+const GLenum STENCIL_BACK_FAIL              = 0x8801;
+const GLenum STENCIL_BACK_PASS_DEPTH_FAIL   = 0x8802;
+const GLenum STENCIL_BACK_PASS_DEPTH_PASS   = 0x8803;
+const GLenum STENCIL_BACK_REF               = 0x8CA3;
+const GLenum STENCIL_BACK_VALUE_MASK        = 0x8CA4;
+const GLenum STENCIL_BACK_WRITEMASK         = 0x8CA5;
+const GLenum VIEWPORT                       = 0x0BA2;
+const GLenum SCISSOR_BOX                    = 0x0C10;
+/*      SCISSOR_TEST */
+const GLenum COLOR_CLEAR_VALUE              = 0x0C22;
+const GLenum COLOR_WRITEMASK                = 0x0C23;
+const GLenum UNPACK_ALIGNMENT               = 0x0CF5;
+const GLenum PACK_ALIGNMENT                 = 0x0D05;
+const GLenum MAX_TEXTURE_SIZE               = 0x0D33;
+const GLenum MAX_VIEWPORT_DIMS              = 0x0D3A;
+const GLenum SUBPIXEL_BITS                  = 0x0D50;
+const GLenum RED_BITS                       = 0x0D52;
+const GLenum GREEN_BITS                     = 0x0D53;
+const GLenum BLUE_BITS                      = 0x0D54;
+const GLenum ALPHA_BITS                     = 0x0D55;
+const GLenum DEPTH_BITS                     = 0x0D56;
+const GLenum STENCIL_BITS                   = 0x0D57;
+const GLenum POLYGON_OFFSET_UNITS           = 0x2A00;
+/*      POLYGON_OFFSET_FILL */
+const GLenum POLYGON_OFFSET_FACTOR          = 0x8038;
+const GLenum TEXTURE_BINDING_2D             = 0x8069;
+const GLenum SAMPLE_BUFFERS                 = 0x80A8;
+const GLenum SAMPLES                        = 0x80A9;
+const GLenum SAMPLE_COVERAGE_VALUE          = 0x80AA;
+const GLenum SAMPLE_COVERAGE_INVERT         = 0x80AB;
+
+/* GetTextureParameter */
+/*      TEXTURE_MAG_FILTER */
+/*      TEXTURE_MIN_FILTER */
+/*      TEXTURE_WRAP_S */
+/*      TEXTURE_WRAP_T */
+
+const GLenum COMPRESSED_TEXTURE_FORMATS     = 0x86A3;
+
+/* HintMode */
+const GLenum DONT_CARE                      = 0x1100;
+const GLenum FASTEST                        = 0x1101;
+const GLenum NICEST                         = 0x1102;
+
+/* HintTarget */
+const GLenum GENERATE_MIPMAP_HINT            = 0x8192;
+
+/* DataType */
+const GLenum BYTE                           = 0x1400;
+const GLenum UNSIGNED_BYTE                  = 0x1401;
+const GLenum SHORT                          = 0x1402;
+const GLenum UNSIGNED_SHORT                 = 0x1403;
+const GLenum INT                            = 0x1404;
+const GLenum UNSIGNED_INT                   = 0x1405;
+const GLenum FLOAT                          = 0x1406;
+
+/* PixelFormat */
+const GLenum DEPTH_COMPONENT                = 0x1902;
+const GLenum ALPHA                          = 0x1906;
+const GLenum RGB                            = 0x1907;
+const GLenum RGBA                           = 0x1908;
+const GLenum LUMINANCE                      = 0x1909;
+const GLenum LUMINANCE_ALPHA                = 0x190A;
+
+/* PixelType */
+/*      UNSIGNED_BYTE */
+const GLenum UNSIGNED_SHORT_4_4_4_4         = 0x8033;
+const GLenum UNSIGNED_SHORT_5_5_5_1         = 0x8034;
+const GLenum UNSIGNED_SHORT_5_6_5           = 0x8363;
+
+/* Shaders */
+const GLenum FRAGMENT_SHADER                  = 0x8B30;
+const GLenum VERTEX_SHADER                    = 0x8B31;
+const GLenum MAX_VERTEX_ATTRIBS               = 0x8869;
+const GLenum MAX_VERTEX_UNIFORM_VECTORS       = 0x8DFB;
+const GLenum MAX_VARYING_VECTORS              = 0x8DFC;
+const GLenum MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
+const GLenum MAX_VERTEX_TEXTURE_IMAGE_UNITS   = 0x8B4C;
+const GLenum MAX_TEXTURE_IMAGE_UNITS          = 0x8872;
+const GLenum MAX_FRAGMENT_UNIFORM_VECTORS     = 0x8DFD;
+const GLenum SHADER_TYPE                      = 0x8B4F;
+const GLenum DELETE_STATUS                    = 0x8B80;
+const GLenum LINK_STATUS                      = 0x8B82;
+const GLenum VALIDATE_STATUS                  = 0x8B83;
+const GLenum ATTACHED_SHADERS                 = 0x8B85;
+const GLenum ACTIVE_UNIFORMS                  = 0x8B86;
+const GLenum ACTIVE_ATTRIBUTES                = 0x8B89;
+const GLenum SHADING_LANGUAGE_VERSION         = 0x8B8C;
+const GLenum CURRENT_PROGRAM                  = 0x8B8D;
+
+/* StencilFunction */
+const GLenum NEVER                          = 0x0200;
+const GLenum LESS                           = 0x0201;
+const GLenum EQUAL                          = 0x0202;
+const GLenum LEQUAL                         = 0x0203;
+const GLenum GREATER                        = 0x0204;
+const GLenum NOTEQUAL                       = 0x0205;
+const GLenum GEQUAL                         = 0x0206;
+const GLenum ALWAYS                         = 0x0207;
+
+/* StencilOp */
+/*      ZERO */
+const GLenum KEEP                           = 0x1E00;
+const GLenum REPLACE                        = 0x1E01;
+const GLenum INCR                           = 0x1E02;
+const GLenum DECR                           = 0x1E03;
+const GLenum INVERT                         = 0x150A;
+const GLenum INCR_WRAP                      = 0x8507;
+const GLenum DECR_WRAP                      = 0x8508;
+
+/* StringName */
+const GLenum VENDOR                         = 0x1F00;
+const GLenum RENDERER                       = 0x1F01;
+const GLenum VERSION                        = 0x1F02;
+
+/* TextureMagFilter */
+const GLenum NEAREST                        = 0x2600;
+const GLenum LINEAR                         = 0x2601;
+
+/* TextureMinFilter */
+/*      NEAREST */
+/*      LINEAR */
+const GLenum NEAREST_MIPMAP_NEAREST         = 0x2700;
+const GLenum LINEAR_MIPMAP_NEAREST          = 0x2701;
+const GLenum NEAREST_MIPMAP_LINEAR          = 0x2702;
+const GLenum LINEAR_MIPMAP_LINEAR           = 0x2703;
+
+/* TextureParameterName */
+const GLenum TEXTURE_MAG_FILTER             = 0x2800;
+const GLenum TEXTURE_MIN_FILTER             = 0x2801;
+const GLenum TEXTURE_WRAP_S                 = 0x2802;
+const GLenum TEXTURE_WRAP_T                 = 0x2803;
+
+/* TextureTarget */
+/*      TEXTURE_2D */
+const GLenum TEXTURE                        = 0x1702;
+
+const GLenum TEXTURE_CUBE_MAP               = 0x8513;
+const GLenum TEXTURE_BINDING_CUBE_MAP       = 0x8514;
+const GLenum TEXTURE_CUBE_MAP_POSITIVE_X    = 0x8515;
+const GLenum TEXTURE_CUBE_MAP_NEGATIVE_X    = 0x8516;
+const GLenum TEXTURE_CUBE_MAP_POSITIVE_Y    = 0x8517;
+const GLenum TEXTURE_CUBE_MAP_NEGATIVE_Y    = 0x8518;
+const GLenum TEXTURE_CUBE_MAP_POSITIVE_Z    = 0x8519;
+const GLenum TEXTURE_CUBE_MAP_NEGATIVE_Z    = 0x851A;
+const GLenum MAX_CUBE_MAP_TEXTURE_SIZE      = 0x851C;
+
+/* TextureUnit */
+const GLenum TEXTURE0                       = 0x84C0;
+const GLenum TEXTURE1                       = 0x84C1;
+const GLenum TEXTURE2                       = 0x84C2;
+const GLenum TEXTURE3                       = 0x84C3;
+const GLenum TEXTURE4                       = 0x84C4;
+const GLenum TEXTURE5                       = 0x84C5;
+const GLenum TEXTURE6                       = 0x84C6;
+const GLenum TEXTURE7                       = 0x84C7;
+const GLenum TEXTURE8                       = 0x84C8;
+const GLenum TEXTURE9                       = 0x84C9;
+const GLenum TEXTURE10                      = 0x84CA;
+const GLenum TEXTURE11                      = 0x84CB;
+const GLenum TEXTURE12                      = 0x84CC;
+const GLenum TEXTURE13                      = 0x84CD;
+const GLenum TEXTURE14                      = 0x84CE;
+const GLenum TEXTURE15                      = 0x84CF;
+const GLenum TEXTURE16                      = 0x84D0;
+const GLenum TEXTURE17                      = 0x84D1;
+const GLenum TEXTURE18                      = 0x84D2;
+const GLenum TEXTURE19                      = 0x84D3;
+const GLenum TEXTURE20                      = 0x84D4;
+const GLenum TEXTURE21                      = 0x84D5;
+const GLenum TEXTURE22                      = 0x84D6;
+const GLenum TEXTURE23                      = 0x84D7;
+const GLenum TEXTURE24                      = 0x84D8;
+const GLenum TEXTURE25                      = 0x84D9;
+const GLenum TEXTURE26                      = 0x84DA;
+const GLenum TEXTURE27                      = 0x84DB;
+const GLenum TEXTURE28                      = 0x84DC;
+const GLenum TEXTURE29                      = 0x84DD;
+const GLenum TEXTURE30                      = 0x84DE;
+const GLenum TEXTURE31                      = 0x84DF;
+const GLenum ACTIVE_TEXTURE                 = 0x84E0;
+
+/* TextureWrapMode */
+const GLenum REPEAT                         = 0x2901;
+const GLenum CLAMP_TO_EDGE                  = 0x812F;
+const GLenum MIRRORED_REPEAT                = 0x8370;
+
+/* Uniform Types */
+const GLenum FLOAT_VEC2                     = 0x8B50;
+const GLenum FLOAT_VEC3                     = 0x8B51;
+const GLenum FLOAT_VEC4                     = 0x8B52;
+const GLenum INT_VEC2                       = 0x8B53;
+const GLenum INT_VEC3                       = 0x8B54;
+const GLenum INT_VEC4                       = 0x8B55;
+const GLenum BOOL                           = 0x8B56;
+const GLenum BOOL_VEC2                      = 0x8B57;
+const GLenum BOOL_VEC3                      = 0x8B58;
+const GLenum BOOL_VEC4                      = 0x8B59;
+const GLenum FLOAT_MAT2                     = 0x8B5A;
+const GLenum FLOAT_MAT3                     = 0x8B5B;
+const GLenum FLOAT_MAT4                     = 0x8B5C;
+const GLenum SAMPLER_2D                     = 0x8B5E;
+const GLenum SAMPLER_CUBE                   = 0x8B60;
+
+/* Vertex Arrays */
+const GLenum VERTEX_ATTRIB_ARRAY_ENABLED        = 0x8622;
+const GLenum VERTEX_ATTRIB_ARRAY_SIZE           = 0x8623;
+const GLenum VERTEX_ATTRIB_ARRAY_STRIDE         = 0x8624;
+const GLenum VERTEX_ATTRIB_ARRAY_TYPE           = 0x8625;
+const GLenum VERTEX_ATTRIB_ARRAY_NORMALIZED     = 0x886A;
+const GLenum VERTEX_ATTRIB_ARRAY_POINTER        = 0x8645;
+const GLenum VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;
+
+/* Shader Source */
+const GLenum COMPILE_STATUS                 = 0x8B81;
+
+/* Shader Precision-Specified Types */
+const GLenum LOW_FLOAT                      = 0x8DF0;
+const GLenum MEDIUM_FLOAT                   = 0x8DF1;
+const GLenum HIGH_FLOAT                     = 0x8DF2;
+const GLenum LOW_INT                        = 0x8DF3;
+const GLenum MEDIUM_INT                     = 0x8DF4;
+const GLenum HIGH_INT                       = 0x8DF5;
+
+/* Framebuffer Object. */
+const GLenum FRAMEBUFFER                    = 0x8D40;
+const GLenum RENDERBUFFER                   = 0x8D41;
+
+const GLenum RGBA4                          = 0x8056;
+const GLenum RGB5_A1                        = 0x8057;
+const GLenum RGB565                         = 0x8D62;
+const GLenum DEPTH_COMPONENT16              = 0x81A5;
+const GLenum STENCIL_INDEX                  = 0x1901;
+const GLenum STENCIL_INDEX8                 = 0x8D48;
+const GLenum DEPTH_STENCIL                  = 0x84F9;
+
+const GLenum SRGB_EXT                                     = 0x8C40;
+const GLenum SRGB_ALPHA_EXT                               = 0x8C42;
+const GLenum SRGB8_ALPHA8_EXT                             = 0x8C43;
+const GLenum FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT    = 0x8210;
+
+const GLenum MIN_EXT                        = 0x8007;
+const GLenum MAX_EXT                        = 0x8008;
+
+const GLenum RENDERBUFFER_WIDTH             = 0x8D42;
+const GLenum RENDERBUFFER_HEIGHT            = 0x8D43;
+const GLenum RENDERBUFFER_INTERNAL_FORMAT   = 0x8D44;
+const GLenum RENDERBUFFER_RED_SIZE          = 0x8D50;
+const GLenum RENDERBUFFER_GREEN_SIZE        = 0x8D51;
+const GLenum RENDERBUFFER_BLUE_SIZE         = 0x8D52;
+const GLenum RENDERBUFFER_ALPHA_SIZE        = 0x8D53;
+const GLenum RENDERBUFFER_DEPTH_SIZE        = 0x8D54;
+const GLenum RENDERBUFFER_STENCIL_SIZE      = 0x8D55;
+
+const GLenum FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE           = 0x8CD0;
+const GLenum FRAMEBUFFER_ATTACHMENT_OBJECT_NAME           = 0x8CD1;
+const GLenum FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL         = 0x8CD2;
+const GLenum FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;
+
+const GLenum COLOR_ATTACHMENT0              = 0x8CE0;
+const GLenum DEPTH_ATTACHMENT               = 0x8D00;
+const GLenum STENCIL_ATTACHMENT             = 0x8D20;
+const GLenum DEPTH_STENCIL_ATTACHMENT       = 0x821A;
+
+const GLenum NONE                           = 0;
+
+const GLenum FRAMEBUFFER_COMPLETE                      = 0x8CD5;
+const GLenum FRAMEBUFFER_INCOMPLETE_ATTACHMENT         = 0x8CD6;
+const GLenum FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
+const GLenum FRAMEBUFFER_INCOMPLETE_DIMENSIONS         = 0x8CD9;
+const GLenum FRAMEBUFFER_UNSUPPORTED                   = 0x8CDD;
+
+const GLenum FRAMEBUFFER_BINDING            = 0x8CA6;
+const GLenum RENDERBUFFER_BINDING           = 0x8CA7;
+const GLenum MAX_RENDERBUFFER_SIZE          = 0x84E8;
+
+const GLenum INVALID_FRAMEBUFFER_OPERATION  = 0x0506;
+
+/* WebGL-specific enums */
+const GLenum UNPACK_FLIP_Y_WEBGL                = 0x9240;
+const GLenum UNPACK_PREMULTIPLY_ALPHA_WEBGL     = 0x9241;
+const GLenum CONTEXT_LOST_WEBGL                 = 0x9242;
+const GLenum UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;
+const GLenum BROWSER_DEFAULT_WEBGL              = 0x9244;
+
+readonly attribute GLsizei drawingBufferWidth;
+readonly attribute GLsizei drawingBufferHeight;
+
+[StrictTypeChecking, RaisesException] void         activeTexture(GLenum texture);
+[StrictTypeChecking, RaisesException] void         attachShader(WebGLProgram program, WebGLShader shader);
+[StrictTypeChecking, RaisesException] void         bindAttribLocation(WebGLProgram program, GLuint index, DOMString name);
+[StrictTypeChecking, RaisesException] void         bindBuffer(GLenum target, WebGLBuffer buffer);
+[StrictTypeChecking, RaisesException] void         bindFramebuffer(GLenum target, WebGLFramebuffer framebuffer);
+[StrictTypeChecking, RaisesException] void         bindRenderbuffer(GLenum target, WebGLRenderbuffer renderbuffer);
+[StrictTypeChecking, RaisesException] void         bindTexture(GLenum target, WebGLTexture texture);
+[StrictTypeChecking] void         blendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+[StrictTypeChecking] void         blendEquation(GLenum mode);
+[StrictTypeChecking] void         blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+[StrictTypeChecking] void         blendFunc(GLenum sfactor, GLenum dfactor);
+[StrictTypeChecking] void         blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+[StrictTypeChecking, RaisesException] void         bufferData(GLenum target, ArrayBuffer? data, GLenum usage);
+[StrictTypeChecking, RaisesException] void         bufferData(GLenum target, ArrayBufferView? data, GLenum usage);
+[StrictTypeChecking, RaisesException] void         bufferData(GLenum target, GLsizeiptr size, GLenum usage);
+[StrictTypeChecking, RaisesException] void         bufferSubData(GLenum target, GLintptr offset, ArrayBuffer? data);
+[StrictTypeChecking, RaisesException] void         bufferSubData(GLenum target, GLintptr offset, ArrayBufferView? data);
+
+[StrictTypeChecking] GLenum       checkFramebufferStatus(GLenum target);
+[StrictTypeChecking] void         clear(GLbitfield mask);
+[StrictTypeChecking] void         clearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+[StrictTypeChecking] void         clearDepth(GLclampf depth);
+[StrictTypeChecking] void         clearStencil(GLint s);
+[StrictTypeChecking] void         colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+[StrictTypeChecking, RaisesException] void         compileShader(WebGLShader shader);
+
+[StrictTypeChecking] void         compressedTexImage2D(GLenum target, GLint level, GLenum internalformat,
+GLsizei width, GLsizei height, GLint border, ArrayBufferView data);
+[StrictTypeChecking] void         compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+GLsizei width, GLsizei height, GLenum format, ArrayBufferView data);
+
+[StrictTypeChecking] void         copyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+[StrictTypeChecking] void         copyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+
+[StrictTypeChecking] WebGLBuffer createBuffer();
+[StrictTypeChecking] WebGLFramebuffer createFramebuffer();
+[StrictTypeChecking] WebGLProgram createProgram();
+[StrictTypeChecking] WebGLRenderbuffer createRenderbuffer();
+[StrictTypeChecking, RaisesException] WebGLShader createShader(GLenum type);
+[StrictTypeChecking] WebGLTexture createTexture();
+
+[StrictTypeChecking] void         cullFace(GLenum mode);
+
+[StrictTypeChecking] void         deleteBuffer(WebGLBuffer buffer);
+[StrictTypeChecking] void         deleteFramebuffer(WebGLFramebuffer framebuffer);
+[StrictTypeChecking] void         deleteProgram(WebGLProgram program);
+[StrictTypeChecking] void         deleteRenderbuffer(WebGLRenderbuffer renderbuffer);
+[StrictTypeChecking] void         deleteShader(WebGLShader shader);
+[StrictTypeChecking] void         deleteTexture(WebGLTexture texture);
+
+[StrictTypeChecking] void         depthFunc(GLenum func);
+[StrictTypeChecking] void         depthMask(GLboolean flag);
+[StrictTypeChecking] void         depthRange(GLclampf zNear, GLclampf zFar);
+[StrictTypeChecking, RaisesException] void         detachShader(WebGLProgram program, WebGLShader shader);
+[StrictTypeChecking] void         disable(GLenum cap);
+[StrictTypeChecking, RaisesException] void         disableVertexAttribArray(GLuint index);
+[StrictTypeChecking, RaisesException] void         drawArrays(GLenum mode, GLint first, GLsizei count);
+[StrictTypeChecking, RaisesException] void         drawElements(GLenum mode, GLsizei count, GLenum type, GLintptr offset);
+
+[StrictTypeChecking] void         enable(GLenum cap);
+[StrictTypeChecking, RaisesException] void         enableVertexAttribArray(GLuint index);
+[StrictTypeChecking] void         finish();
+[StrictTypeChecking] void         flush();
+[StrictTypeChecking, RaisesException] void         framebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, WebGLRenderbuffer renderbuffer);
+[StrictTypeChecking, RaisesException] void         framebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, WebGLTexture texture, GLint level);
+[StrictTypeChecking] void         frontFace(GLenum mode);
+[StrictTypeChecking] void         generateMipmap(GLenum target);
+
+[StrictTypeChecking, RaisesException] WebGLActiveInfo getActiveAttrib(WebGLProgram program, GLuint index);
+[StrictTypeChecking, RaisesException] WebGLActiveInfo getActiveUniform(WebGLProgram program, GLuint index);
+
+[StrictTypeChecking, Custom, RaisesException] void getAttachedShaders(WebGLProgram program);
+
+[StrictTypeChecking] GLint        getAttribLocation(WebGLProgram program, DOMString name);
+
+[StrictTypeChecking, Custom] any getBufferParameter(GLenum target, GLenum pname);
+
+[StrictTypeChecking] WebGLContextAttributes getContextAttributes();
+
+[StrictTypeChecking] GLenum getError();
+
+// object getExtension(DOMString name);
+[StrictTypeChecking, Custom] any getExtension(DOMString name);
+
+[StrictTypeChecking, Custom, RaisesException] any getFramebufferAttachmentParameter(GLenum target, GLenum attachment, GLenum pname);
+[StrictTypeChecking, Custom, RaisesException] any getParameter(GLenum pname);
+[StrictTypeChecking, Custom, RaisesException] any getProgramParameter(WebGLProgram program, GLenum pname);
+[StrictTypeChecking, TreatReturnedNullStringAs=Null, RaisesException] DOMString getProgramInfoLog(WebGLProgram program);
+[StrictTypeChecking, Custom, RaisesException] any getRenderbufferParameter(GLenum target, GLenum pname);
+[StrictTypeChecking, Custom, RaisesException] any getShaderParameter(WebGLShader shader, GLenum pname);
+
+[StrictTypeChecking, TreatReturnedNullStringAs=Null, RaisesException] DOMString    getShaderInfoLog(WebGLShader shader);
+
+[StrictTypeChecking, RaisesException] WebGLShaderPrecisionFormat getShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype);
+
+[StrictTypeChecking, TreatReturnedNullStringAs=Null, RaisesException] DOMString    getShaderSource(WebGLShader shader);
+
+[StrictTypeChecking, Custom] sequence&lt;DOMString&gt; getSupportedExtensions();
+
+[StrictTypeChecking, Custom, RaisesException] any getTexParameter(GLenum target, GLenum pname);
+
+[StrictTypeChecking, Custom, RaisesException] any getUniform(WebGLProgram program, WebGLUniformLocation location);
+
+[StrictTypeChecking, RaisesException] WebGLUniformLocation getUniformLocation(WebGLProgram program, DOMString name);
+
+[StrictTypeChecking, Custom, RaisesException] any getVertexAttrib(GLuint index, GLenum pname);
+
+[StrictTypeChecking] GLsizeiptr getVertexAttribOffset(GLuint index, GLenum pname);
+
+[StrictTypeChecking] void         hint(GLenum target, GLenum mode);
+[StrictTypeChecking] GLboolean    isBuffer(WebGLBuffer buffer);
+[StrictTypeChecking] GLboolean    isContextLost();
+[StrictTypeChecking] GLboolean    isEnabled(GLenum cap);
+[StrictTypeChecking] GLboolean    isFramebuffer(WebGLFramebuffer framebuffer);
+[StrictTypeChecking] GLboolean    isProgram(WebGLProgram program);
+[StrictTypeChecking] GLboolean    isRenderbuffer(WebGLRenderbuffer renderbuffer);
+[StrictTypeChecking] GLboolean    isShader(WebGLShader shader);
+[StrictTypeChecking] GLboolean    isTexture(WebGLTexture texture);
+[StrictTypeChecking] void         lineWidth(GLfloat width);
+[StrictTypeChecking, RaisesException] void         linkProgram(WebGLProgram program);
+[StrictTypeChecking] void         pixelStorei(GLenum pname, GLint param);
+[StrictTypeChecking] void         polygonOffset(GLfloat factor, GLfloat units);
+
+[StrictTypeChecking, RaisesException] void         readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, ArrayBufferView pixels);
+
+[StrictTypeChecking] void         releaseShaderCompiler();
+[StrictTypeChecking] void         renderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+[StrictTypeChecking] void         sampleCoverage(GLclampf value, GLboolean invert);
+[StrictTypeChecking] void         scissor(GLint x, GLint y, GLsizei width, GLsizei height);
+[StrictTypeChecking, RaisesException] void         shaderSource(WebGLShader shader, DOMString string);
+[StrictTypeChecking] void         stencilFunc(GLenum func, GLint ref, GLuint mask);
+[StrictTypeChecking] void         stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+[StrictTypeChecking] void         stencilMask(GLuint mask);
+[StrictTypeChecking] void         stencilMaskSeparate(GLenum face, GLuint mask);
+[StrictTypeChecking] void         stencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+[StrictTypeChecking] void         stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
+
+[StrictTypeChecking] void         texParameterf(GLenum target, GLenum pname, GLfloat param);
+[StrictTypeChecking] void         texParameteri(GLenum target, GLenum pname, GLint param);
+
+// Supported forms:
+[StrictTypeChecking, RaisesException] void         texImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, 
+GLint border, GLenum format, GLenum type, ArrayBufferView? pixels);
+[StrictTypeChecking, RaisesException] void         texImage2D(GLenum target, GLint level, GLenum internalformat,
+GLenum format, GLenum type, ImageData? pixels);
+[StrictTypeChecking, RaisesException] void         texImage2D(GLenum target, GLint level, GLenum internalformat,
+GLenum format, GLenum type, HTMLImageElement? image);
+[StrictTypeChecking, RaisesException] void         texImage2D(GLenum target, GLint level, GLenum internalformat,
+GLenum format, GLenum type, HTMLCanvasElement? canvas);
+#if defined(ENABLE_VIDEO) &amp;&amp; ENABLE_VIDEO
+[StrictTypeChecking, RaisesException] void         texImage2D(GLenum target, GLint level, GLenum internalformat,
+GLenum format, GLenum type, HTMLVideoElement? video);
+#endif
+
+[StrictTypeChecking, RaisesException] void         texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, 
+GLsizei width, GLsizei height, 
+GLenum format, GLenum type, ArrayBufferView? pixels);
+[StrictTypeChecking, RaisesException] void         texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+GLenum format, GLenum type, ImageData? pixels);
+[StrictTypeChecking, RaisesException] void         texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+GLenum format, GLenum type, HTMLImageElement? image);
+[StrictTypeChecking, RaisesException] void         texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+GLenum format, GLenum type, HTMLCanvasElement? canvas);
+#if defined(ENABLE_VIDEO) &amp;&amp; ENABLE_VIDEO
+[StrictTypeChecking, RaisesException] void         texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+GLenum format, GLenum type, HTMLVideoElement? video);
+#endif
+
+[StrictTypeChecking, RaisesException] void uniform1f(WebGLUniformLocation location, GLfloat x);
+[StrictTypeChecking, Custom, RaisesException] void uniform1fv(WebGLUniformLocation location, Float32Array v);
+[StrictTypeChecking, RaisesException] void uniform1i(WebGLUniformLocation location, GLint x);
+[StrictTypeChecking, Custom, RaisesException] void uniform1iv(WebGLUniformLocation location, Int32Array v);
+[StrictTypeChecking, RaisesException] void uniform2f(WebGLUniformLocation location, GLfloat x, GLfloat y);
+[StrictTypeChecking, Custom, RaisesException] void uniform2fv(WebGLUniformLocation location, Float32Array v);
+[StrictTypeChecking, RaisesException] void uniform2i(WebGLUniformLocation location, GLint x, GLint y);
+[StrictTypeChecking, Custom, RaisesException] void uniform2iv(WebGLUniformLocation location, Int32Array v);
+[StrictTypeChecking, RaisesException] void uniform3f(WebGLUniformLocation location, GLfloat x, GLfloat y, GLfloat z);
+[StrictTypeChecking, Custom, RaisesException] void uniform3fv(WebGLUniformLocation location, Float32Array v);
+[StrictTypeChecking, RaisesException] void uniform3i(WebGLUniformLocation location, GLint x, GLint y, GLint z);
+[StrictTypeChecking, Custom, RaisesException] void uniform3iv(WebGLUniformLocation location, Int32Array v);
+[StrictTypeChecking, RaisesException] void uniform4f(WebGLUniformLocation location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+[StrictTypeChecking, Custom, RaisesException] void uniform4fv(WebGLUniformLocation location, Float32Array v);
+[StrictTypeChecking, RaisesException] void uniform4i(WebGLUniformLocation location, GLint x, GLint y, GLint z, GLint w);
+[StrictTypeChecking, Custom, RaisesException] void uniform4iv(WebGLUniformLocation location, Int32Array v);
+
+[StrictTypeChecking, Custom, RaisesException] void uniformMatrix2fv(WebGLUniformLocation location, GLboolean transpose, Float32Array array);
+[StrictTypeChecking, Custom, RaisesException] void uniformMatrix3fv(WebGLUniformLocation location, GLboolean transpose, Float32Array array);
+[StrictTypeChecking, Custom, RaisesException] void uniformMatrix4fv(WebGLUniformLocation location, GLboolean transpose, Float32Array array);
+
+[StrictTypeChecking, RaisesException] void         useProgram(WebGLProgram program);
+[StrictTypeChecking, RaisesException] void         validateProgram(WebGLProgram program);
+
+[StrictTypeChecking] void         vertexAttrib1f(GLuint indx, GLfloat x);
+[StrictTypeChecking, Custom] void vertexAttrib1fv(GLuint indx, Float32Array values);
+[StrictTypeChecking] void         vertexAttrib2f(GLuint indx, GLfloat x, GLfloat y);
+[StrictTypeChecking, Custom] void vertexAttrib2fv(GLuint indx, Float32Array values);
+[StrictTypeChecking] void         vertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
+[StrictTypeChecking, Custom] void vertexAttrib3fv(GLuint indx, Float32Array values);
+[StrictTypeChecking] void         vertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+[StrictTypeChecking, Custom] void vertexAttrib4fv(GLuint indx, Float32Array values);
+[StrictTypeChecking, RaisesException] void         vertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, 
+GLsizei stride, GLintptr offset);
+
+[StrictTypeChecking] void         viewport(GLint x, GLint y, GLsizei width, GLsizei height);
+};
</ins></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLShadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLShader.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLShader.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLShader.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,16 +30,16 @@
</span><span class="cx"> #include &quot;WebGLShader.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;WebGLContextGroup.h&quot;
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;WebGLRenderingContextBase.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;WebGLShader&gt; WebGLShader::create(WebGLRenderingContext* ctx, GC3Denum type)
</del><ins>+PassRefPtr&lt;WebGLShader&gt; WebGLShader::create(WebGLRenderingContextBase* ctx, GC3Denum type)
</ins><span class="cx"> {
</span><span class="cx">     return adoptRef(new WebGLShader(ctx, type));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WebGLShader::WebGLShader(WebGLRenderingContext* ctx, GC3Denum type)
</del><ins>+WebGLShader::WebGLShader(WebGLRenderingContextBase* ctx, GC3Denum type)
</ins><span class="cx">     : WebGLSharedObject(ctx)
</span><span class="cx">     , m_type(type)
</span><span class="cx">     , m_source(&quot;&quot;)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLShaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLShader.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLShader.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLShader.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -36,7 +36,7 @@
</span><span class="cx"> public:
</span><span class="cx">     virtual ~WebGLShader();
</span><span class="cx"> 
</span><del>-    static PassRefPtr&lt;WebGLShader&gt; create(WebGLRenderingContext*, GC3Denum);
</del><ins>+    static PassRefPtr&lt;WebGLShader&gt; create(WebGLRenderingContextBase*, GC3Denum);
</ins><span class="cx"> 
</span><span class="cx">     GC3Denum getType() const { return m_type; }
</span><span class="cx">     const String&amp; getSource() const { return m_source; }
</span><span class="lines">@@ -47,7 +47,7 @@
</span><span class="cx">     void setValid(bool valid) { m_isValid = valid; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    WebGLShader(WebGLRenderingContext*, GC3Denum);
</del><ins>+    WebGLShader(WebGLRenderingContextBase*, GC3Denum);
</ins><span class="cx"> 
</span><span class="cx">     virtual void deleteObjectImpl(GraphicsContext3D*, Platform3DObject) override;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLSharedObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLSharedObject.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLSharedObject.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLSharedObject.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,11 +30,11 @@
</span><span class="cx"> #include &quot;WebGLSharedObject.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;WebGLContextGroup.h&quot;
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;WebGLRenderingContextBase.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-WebGLSharedObject::WebGLSharedObject(WebGLRenderingContext* context)
</del><ins>+WebGLSharedObject::WebGLSharedObject(WebGLRenderingContextBase* context)
</ins><span class="cx">     : WebGLObject(context),
</span><span class="cx">       m_contextGroup(context-&gt;contextGroup())
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLSharedObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLSharedObject.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLSharedObject.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLSharedObject.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> class GraphicsContext3D;
</span><span class="cx"> class WebGLContextGroup;
</span><del>-class WebGLRenderingContext;
</del><ins>+class WebGLRenderingContextBase;
</ins><span class="cx"> 
</span><span class="cx"> // WebGLSharedObject the base class for objects that can be shared by multiple
</span><span class="cx"> // WebGLRenderingContexts.
</span><span class="lines">@@ -48,7 +48,7 @@
</span><span class="cx">     virtual bool isShader() const { return false; }
</span><span class="cx">     virtual bool isTexture() const { return false; }
</span><span class="cx"> 
</span><del>-    virtual bool validate(const WebGLContextGroup* contextGroup, const WebGLRenderingContext*) const override
</del><ins>+    virtual bool validate(const WebGLContextGroup* contextGroup, const WebGLRenderingContextBase*) const override
</ins><span class="cx">     {
</span><span class="cx">         return contextGroup == m_contextGroup;
</span><span class="cx">     }
</span><span class="lines">@@ -56,7 +56,7 @@
</span><span class="cx">     void detachContextGroup();
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    WebGLSharedObject(WebGLRenderingContext*);
</del><ins>+    WebGLSharedObject(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     virtual bool hasGroupOrContext() const override
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLTexturecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLTexture.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLTexture.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLTexture.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -31,16 +31,16 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;WebGLContextGroup.h&quot;
</span><span class="cx"> #include &quot;WebGLFramebuffer.h&quot;
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;WebGLRenderingContextBase.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;WebGLTexture&gt; WebGLTexture::create(WebGLRenderingContext* ctx)
</del><ins>+PassRefPtr&lt;WebGLTexture&gt; WebGLTexture::create(WebGLRenderingContextBase* ctx)
</ins><span class="cx"> {
</span><span class="cx">     return adoptRef(new WebGLTexture(ctx));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WebGLTexture::WebGLTexture(WebGLRenderingContext* ctx)
</del><ins>+WebGLTexture::WebGLTexture(WebGLRenderingContextBase* ctx)
</ins><span class="cx">     : WebGLSharedObject(ctx)
</span><span class="cx">     , m_target(0)
</span><span class="cx">     , m_minFilter(GraphicsContext3D::NEAREST_MIPMAP_LINEAR)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLTextureh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLTexture.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLTexture.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLTexture.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -44,7 +44,7 @@
</span><span class="cx"> 
</span><span class="cx">     virtual ~WebGLTexture();
</span><span class="cx"> 
</span><del>-    static PassRefPtr&lt;WebGLTexture&gt; create(WebGLRenderingContext*);
</del><ins>+    static PassRefPtr&lt;WebGLTexture&gt; create(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     void setTarget(GC3Denum target, GC3Dint maxLevel);
</span><span class="cx">     void setParameteri(GC3Denum pname, GC3Dint param);
</span><span class="lines">@@ -82,7 +82,7 @@
</span><span class="cx">     static GC3Dint computeLevelCount(GC3Dsizei width, GC3Dsizei height);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    WebGLTexture(WebGLRenderingContext*);
</del><ins>+    WebGLTexture(WebGLRenderingContextBase*);
</ins><span class="cx"> 
</span><span class="cx">     virtual void deleteObjectImpl(GraphicsContext3D*, Platform3DObject) override;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLVertexArrayObjectOEScpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.cpp (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.cpp        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.cpp        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -30,16 +30,16 @@
</span><span class="cx"> #include &quot;WebGLVertexArrayObjectOES.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Extensions3D.h&quot;
</span><del>-#include &quot;WebGLRenderingContext.h&quot;
</del><ins>+#include &quot;WebGLRenderingContextBase.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;WebGLVertexArrayObjectOES&gt; WebGLVertexArrayObjectOES::create(WebGLRenderingContext* ctx, VaoType type)
</del><ins>+PassRefPtr&lt;WebGLVertexArrayObjectOES&gt; WebGLVertexArrayObjectOES::create(WebGLRenderingContextBase* ctx, VaoType type)
</ins><span class="cx"> {
</span><span class="cx">     return adoptRef(new WebGLVertexArrayObjectOES(ctx, type));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WebGLVertexArrayObjectOES::WebGLVertexArrayObjectOES(WebGLRenderingContext* ctx, VaoType type)
</del><ins>+WebGLVertexArrayObjectOES::WebGLVertexArrayObjectOES(WebGLRenderingContextBase* ctx, VaoType type)
</ins><span class="cx">     : WebGLContextObject(ctx)
</span><span class="cx">     , m_type(type)
</span><span class="cx">     , m_hasEverBeenBound(false)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasWebGLVertexArrayObjectOESh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.h (178389 => 178390)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.h        2015-01-14 00:19:10 UTC (rev 178389)
+++ trunk/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.h        2015-01-14 00:33:09 UTC (rev 178390)
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx">     
</span><span class="cx">     virtual ~WebGLVertexArrayObjectOES();
</span><span class="cx"> 
</span><del>-    static PassRefPtr&lt;WebGLVertexArrayObjectOES&gt; create(WebGLRenderingContext*, VaoType);
</del><ins>+    static PassRefPtr&lt;WebGLVertexArrayObjectOES&gt; create(WebGLRenderingContextBase*, VaoType);
</ins><span class="cx">     
</span><span class="cx">     // Cached values for vertex attrib range checks
</span><span class="cx">     struct VertexAttribState {
</span><span class="lines">@@ -89,7 +89,7 @@
</span><span class="cx">     void setVertexAttribDivisor(GC3Duint index, GC3Duint divisor);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    WebGLVertexArrayObjectOES(WebGLRenderingContext*, VaoType);
</del><ins>+    WebGLVertexArrayObjectOES(WebGLRenderingContextBase*, VaoType);
</ins><span class="cx"> 
</span><span class="cx">     virtual void deleteObjectImpl(GraphicsContext3D*, Platform3DObject) override;
</span><span class="cx">     
</span></span></pre>
</div>
</div>

</body>
</html>