[SCM] WebKit Debian packaging branch, webkit-1.2, updated. upstream/1.1.90-6072-g9a69373

eric at webkit.org eric at webkit.org
Thu Apr 8 00:28:43 UTC 2010


The following commit has been merged in the webkit-1.2 branch:
commit 751bf5253023a92f9375fbc89c9cc6c4ff997d34
Author: eric at webkit.org <eric at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Dec 9 02:38:06 2009 +0000

    2009-12-08  Peterson Trethewey  <petersont at google.com>
    
            Reviewed by Oliver Hunt.
    
            Implement WebGLUniformLocation and change API to use it.
            https://bugs.webkit.org/show_bug.cgi?id=31173
    
            * fast/canvas/webgl/resources/structUniformShader.vert: Added.
            * fast/canvas/webgl/script-tests/uniform-location.js: Added.
            * fast/canvas/webgl/uniform-location-expected.txt: Added.
            * fast/canvas/webgl/uniform-location.html: Added.
    2009-12-08  Peterson Trethewey  <petersont at google.com>
    
            Reviewed by Oliver Hunt.
    
            Implement WebGLUniformLocation and change API to use it.
            https://bugs.webkit.org/show_bug.cgi?id=31173
    
            Test: fast/canvas/webgl/uniform-location.html
    
            * DerivedSources.make:
            * WebCore.gypi:
            * WebCore.xcodeproj/project.pbxproj:
            * bindings/js/JSWebGLRenderingContextCustom.cpp:
            (WebCore::JSWebGLRenderingContext::getProgramParameter):
            (WebCore::JSWebGLRenderingContext::getUniform):
            (WebCore::functionForUniform):
            (WebCore::dataFunctionf):
            (WebCore::dataFunctioni):
            (WebCore::dataFunctionMatrix):
            * bindings/scripts/CodeGeneratorV8.pm:
            * bindings/v8/DerivedSourcesAllInOne.cpp:
            * bindings/v8/V8Index.cpp:
            * bindings/v8/V8Index.h:
            * bindings/v8/custom/V8WebGLRenderingContextCustom.cpp:
            (WebCore::toWebGLUniformLocation):
            (WebCore::):
            (WebCore::CALLBACK_FUNC_DECL):
            (WebCore::isFunctionToCallForAttribute):
            (WebCore::vertexAttribAndUniformHelperf):
            (WebCore::uniformHelperi):
            (WebCore::uniformMatrixHelper):
            * html/canvas/WebGLRenderingContext.cpp:
            (WebCore::WebGLRenderingContext::getUniform):
            (WebCore::WebGLRenderingContext::getUniformLocation):
            (WebCore::WebGLRenderingContext::uniform1f):
            (WebCore::WebGLRenderingContext::uniform1fv):
            (WebCore::WebGLRenderingContext::uniform1i):
            (WebCore::WebGLRenderingContext::uniform1iv):
            (WebCore::WebGLRenderingContext::uniform2f):
            (WebCore::WebGLRenderingContext::uniform2fv):
            (WebCore::WebGLRenderingContext::uniform2i):
            (WebCore::WebGLRenderingContext::uniform2iv):
            (WebCore::WebGLRenderingContext::uniform3f):
            (WebCore::WebGLRenderingContext::uniform3fv):
            (WebCore::WebGLRenderingContext::uniform3i):
            (WebCore::WebGLRenderingContext::uniform3iv):
            (WebCore::WebGLRenderingContext::uniform4f):
            (WebCore::WebGLRenderingContext::uniform4fv):
            (WebCore::WebGLRenderingContext::uniform4i):
            (WebCore::WebGLRenderingContext::uniform4iv):
            (WebCore::WebGLRenderingContext::uniformMatrix2fv):
            (WebCore::WebGLRenderingContext::uniformMatrix3fv):
            (WebCore::WebGLRenderingContext::uniformMatrix4fv):
            * html/canvas/WebGLRenderingContext.h:
            * html/canvas/WebGLRenderingContext.idl:
            * html/canvas/WebGLUniformLocation.cpp: Added.
            (WebCore::WebGLUniformLocation::create):
            (WebCore::WebGLUniformLocation::WebGLUniformLocation):
            * html/canvas/WebGLUniformLocation.h: Added.
            (WebCore::WebGLUniformLocation::~WebGLUniformLocation):
            (WebCore::WebGLUniformLocation::program):
            (WebCore::WebGLUniformLocation::location):
            * html/canvas/WebGLUniformLocation.idl: Added.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@51884 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 233b0a3..c08fea9 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,15 @@
+2009-12-08  Peterson Trethewey  <petersont at google.com>
+
+        Reviewed by Oliver Hunt.
+
+        Implement WebGLUniformLocation and change API to use it.
+        https://bugs.webkit.org/show_bug.cgi?id=31173
+
+        * fast/canvas/webgl/resources/structUniformShader.vert: Added.
+        * fast/canvas/webgl/script-tests/uniform-location.js: Added.
+        * fast/canvas/webgl/uniform-location-expected.txt: Added.
+        * fast/canvas/webgl/uniform-location.html: Added.
+
 2009-12-08  Adam Langley  <agl at google.com>
 
         Reviewed by Darin Adler.
diff --git a/LayoutTests/fast/canvas/webgl/resources/structUniformShader.vert b/LayoutTests/fast/canvas/webgl/resources/structUniformShader.vert
new file mode 100644
index 0000000..ce73a21
--- /dev/null
+++ b/LayoutTests/fast/canvas/webgl/resources/structUniformShader.vert
@@ -0,0 +1,23 @@
+attribute vec4 a_vertex;
+attribute vec3 a_normal;
+
+uniform mat4 u_modelViewProjMatrix;
+
+struct MyStruct
+{
+  int x;
+  int y;
+};
+
+uniform MyStruct u_struct;
+uniform float u_array[4];
+
+varying vec3 v_normal;
+
+void main()
+{ 
+    v_normal = a_normal;
+    gl_Position = u_modelViewProjMatrix * a_vertex +
+        vec4(u_struct.x, u_struct.y, 0, 1) +
+        vec4(u_array[0], u_array[1], u_array[2], u_array[3]);
+}
diff --git a/LayoutTests/fast/canvas/webgl/script-tests/uniform-location.js b/LayoutTests/fast/canvas/webgl/script-tests/uniform-location.js
new file mode 100644
index 0000000..bc6c2f2
--- /dev/null
+++ b/LayoutTests/fast/canvas/webgl/script-tests/uniform-location.js
@@ -0,0 +1,36 @@
+description("Tests calling WebGL APIs with objects from other contexts");
+
+var contextA = create3DContext();
+var contextB = create3DContext();
+var programA1 = loadStandardProgram(contextA);
+var programA2 = loadStandardProgram(contextA);
+var programB = loadStandardProgram(contextB);
+var programS = loadProgram(contextA, "resources/structUniformShader.vert", "resources/fragmentShader.frag");
+var programV = loadProgram(contextA, "resources/floatUniformShader.vert", "resources/noopUniformShader.frag");
+var locationA = contextA.getUniformLocation(programA1, 'u_modelViewProjMatrix');
+var locationB = contextB.getUniformLocation(programB, 'u_modelViewProjMatrix');
+var locationSx = contextA.getUniformLocation(programS, "u_struct.x");
+var locationArray0 = contextA.getUniformLocation(programS, "u_array[0]");
+var locationVec4 = contextA.getUniformLocation(programV, "fval4");
+
+var vec = [1, 2, 3, 4];
+var mat = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
+
+shouldBeUndefined("contextA.useProgram(programA2)");
+shouldThrow("contextA.uniformMatrix4fv(locationA, false, mat)");
+shouldBeUndefined("contextA.useProgram(programA1)");
+shouldBeUndefined("contextA.uniformMatrix4fv(locationA, false, mat)");
+shouldThrow("contextA.uniformMatrix4fv(0, false, mat)");
+
+shouldBeUndefined("contextA.useProgram(programS)");
+shouldBeUndefined("contextA.uniform1i(locationSx, 3)");
+shouldBeUndefined("contextA.uniform1f(locationArray0, 4.0)");
+
+shouldBe("contextA.getUniform(programS, locationSx)", "3");
+shouldBe("contextA.getUniform(programS, locationArray0)", "4.0");
+
+shouldBeUndefined("contextA.useProgram(programV)");
+shouldBeUndefined("contextA.uniform4fv(locationVec4, vec)");
+shouldBe("contextA.getUniform(programV, locationVec4)", "vec");
+
+successfullyParsed = true;
diff --git a/LayoutTests/fast/canvas/webgl/uniform-location-expected.txt b/LayoutTests/fast/canvas/webgl/uniform-location-expected.txt
new file mode 100644
index 0000000..babdaab
--- /dev/null
+++ b/LayoutTests/fast/canvas/webgl/uniform-location-expected.txt
@@ -0,0 +1,21 @@
+Tests calling WebGL APIs with objects from other contexts
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS contextA.useProgram(programA2) is undefined.
+PASS contextA.uniformMatrix4fv(locationA, false, mat) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS contextA.useProgram(programA1) is undefined.
+PASS contextA.uniformMatrix4fv(locationA, false, mat) is undefined.
+PASS contextA.uniformMatrix4fv(0, false, mat) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS contextA.useProgram(programS) is undefined.
+PASS contextA.uniform1i(locationSx, 3) is undefined.
+PASS contextA.uniform1f(locationArray0, 4.0) is undefined.
+PASS contextA.getUniform(programS, locationSx) is 3
+PASS contextA.getUniform(programS, locationArray0) is 4.0
+PASS contextA.useProgram(programV) is undefined.
+PASS contextA.uniform4fv(locationVec4, vec) is undefined.
+PASS contextA.getUniform(programV, locationVec4) is vec
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/canvas/webgl/uniform-location.html b/LayoutTests/fast/canvas/webgl/uniform-location.html
new file mode 100644
index 0000000..c98f659
--- /dev/null
+++ b/LayoutTests/fast/canvas/webgl/uniform-location.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+<link rel="stylesheet" href="../../js/resources/js-test-style.css"/>
+<script src="../../js/resources/js-test-pre.js"></script>
+<script src="resources/webgl-test.js"></script>
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+
+<script src="script-tests/uniform-location.js"></script>
+
+<script src="../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 6f5b02c..dcd46fc 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,67 @@
+2009-12-08  Peterson Trethewey  <petersont at google.com>
+
+        Reviewed by Oliver Hunt.
+
+        Implement WebGLUniformLocation and change API to use it.
+        https://bugs.webkit.org/show_bug.cgi?id=31173
+
+        Test: fast/canvas/webgl/uniform-location.html
+
+        * DerivedSources.make:
+        * WebCore.gypi:
+        * WebCore.xcodeproj/project.pbxproj:
+        * bindings/js/JSWebGLRenderingContextCustom.cpp:
+        (WebCore::JSWebGLRenderingContext::getProgramParameter):
+        (WebCore::JSWebGLRenderingContext::getUniform):
+        (WebCore::functionForUniform):
+        (WebCore::dataFunctionf):
+        (WebCore::dataFunctioni):
+        (WebCore::dataFunctionMatrix):
+        * bindings/scripts/CodeGeneratorV8.pm:
+        * bindings/v8/DerivedSourcesAllInOne.cpp:
+        * bindings/v8/V8Index.cpp:
+        * bindings/v8/V8Index.h:
+        * bindings/v8/custom/V8WebGLRenderingContextCustom.cpp:
+        (WebCore::toWebGLUniformLocation):
+        (WebCore::):
+        (WebCore::CALLBACK_FUNC_DECL):
+        (WebCore::isFunctionToCallForAttribute):
+        (WebCore::vertexAttribAndUniformHelperf):
+        (WebCore::uniformHelperi):
+        (WebCore::uniformMatrixHelper):
+        * html/canvas/WebGLRenderingContext.cpp:
+        (WebCore::WebGLRenderingContext::getUniform):
+        (WebCore::WebGLRenderingContext::getUniformLocation):
+        (WebCore::WebGLRenderingContext::uniform1f):
+        (WebCore::WebGLRenderingContext::uniform1fv):
+        (WebCore::WebGLRenderingContext::uniform1i):
+        (WebCore::WebGLRenderingContext::uniform1iv):
+        (WebCore::WebGLRenderingContext::uniform2f):
+        (WebCore::WebGLRenderingContext::uniform2fv):
+        (WebCore::WebGLRenderingContext::uniform2i):
+        (WebCore::WebGLRenderingContext::uniform2iv):
+        (WebCore::WebGLRenderingContext::uniform3f):
+        (WebCore::WebGLRenderingContext::uniform3fv):
+        (WebCore::WebGLRenderingContext::uniform3i):
+        (WebCore::WebGLRenderingContext::uniform3iv):
+        (WebCore::WebGLRenderingContext::uniform4f):
+        (WebCore::WebGLRenderingContext::uniform4fv):
+        (WebCore::WebGLRenderingContext::uniform4i):
+        (WebCore::WebGLRenderingContext::uniform4iv):
+        (WebCore::WebGLRenderingContext::uniformMatrix2fv):
+        (WebCore::WebGLRenderingContext::uniformMatrix3fv):
+        (WebCore::WebGLRenderingContext::uniformMatrix4fv):
+        * html/canvas/WebGLRenderingContext.h:
+        * html/canvas/WebGLRenderingContext.idl:
+        * html/canvas/WebGLUniformLocation.cpp: Added.
+        (WebCore::WebGLUniformLocation::create):
+        (WebCore::WebGLUniformLocation::WebGLUniformLocation):
+        * html/canvas/WebGLUniformLocation.h: Added.
+        (WebCore::WebGLUniformLocation::~WebGLUniformLocation):
+        (WebCore::WebGLUniformLocation::program):
+        (WebCore::WebGLUniformLocation::location):
+        * html/canvas/WebGLUniformLocation.idl: Added.
+
 2009-12-08  Adam Langley  <agl at google.com>
 
         Reviewed by Darin Adler.
diff --git a/WebCore/DerivedSources.make b/WebCore/DerivedSources.make
index fbd514e..8191222 100644
--- a/WebCore/DerivedSources.make
+++ b/WebCore/DerivedSources.make
@@ -88,6 +88,7 @@ DOM_CLASSES = \
     WebGLShader \
     WebGLShortArray \
     WebGLTexture \
+    WebGLUniformLocation \
     WebGLUnsignedByteArray \
     WebGLUnsignedIntArray \
     WebGLUnsignedShortArray \
diff --git a/WebCore/WebCore.gypi b/WebCore/WebCore.gypi
index 9624300..2a020ed 100644
--- a/WebCore/WebCore.gypi
+++ b/WebCore/WebCore.gypi
@@ -96,6 +96,7 @@
             'html/canvas/WebGLRenderingContext.idl',
             'html/canvas/WebGLShader.idl',
             'html/canvas/WebGLShortArray.idl',
+            'html/canvas/WebGLUniformLocation.idl',
             'html/canvas/WebGLUnsignedByteArray.idl',
             'html/canvas/WebGLUnsignedIntArray.idl',
             'html/canvas/WebGLUnsignedShortArray.idl',
@@ -1324,6 +1325,8 @@
             'html/canvas/CanvasStyle.h',
             'html/canvas/WebGLTexture.cpp',
             'html/canvas/WebGLTexture.h',
+            'html/canvas/WebGLUniformLocation.cpp',
+            'html/canvas/WebGLUniformLocation.h',
             'html/canvas/WebGLUnsignedByteArray.cpp',
             'html/canvas/WebGLUnsignedByteArray.h',
             'html/canvas/WebGLUnsignedIntArray.cpp',
diff --git a/WebCore/WebCore.xcodeproj/project.pbxproj b/WebCore/WebCore.xcodeproj/project.pbxproj
index 9a65a1b..375c20a 100644
--- a/WebCore/WebCore.xcodeproj/project.pbxproj
+++ b/WebCore/WebCore.xcodeproj/project.pbxproj
@@ -156,6 +156,11 @@
 		0B9056F80F2685F30095FF6A /* WorkerThreadableLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0B9056F60F2685F30095FF6A /* WorkerThreadableLoader.cpp */; };
 		0B9056F90F2685F30095FF6A /* WorkerThreadableLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B9056F70F2685F30095FF6A /* WorkerThreadableLoader.h */; settings = {ATTRIBUTES = (); }; };
 		0BE030A20F3112FB003C1A46 /* RenderLineBoxList.h in Headers */ = {isa = PBXBuildFile; fileRef = 0BE030A10F3112FB003C1A46 /* RenderLineBoxList.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		0C3F1F5A10C8871200D72CE1 /* WebGLUniformLocation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C3F1F5710C8871200D72CE1 /* WebGLUniformLocation.cpp */; };
+		0C3F1F5B10C8871200D72CE1 /* WebGLUniformLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C3F1F5810C8871200D72CE1 /* WebGLUniformLocation.h */; };
+		0C3F1F5C10C8871200D72CE1 /* WebGLUniformLocation.idl in Resources */ = {isa = PBXBuildFile; fileRef = 0C3F1F5910C8871200D72CE1 /* WebGLUniformLocation.idl */; };
+		0C45342710CDBBFA00869157 /* JSWebGLUniformLocation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C45342510CDBBFA00869157 /* JSWebGLUniformLocation.cpp */; };
+		0C45342810CDBBFA00869157 /* JSWebGLUniformLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C45342610CDBBFA00869157 /* JSWebGLUniformLocation.h */; };
 		0F11A54F0F39233100C37884 /* RenderSelectionInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F11A54E0F39233100C37884 /* RenderSelectionInfo.h */; };
 		0F15DA8A0F3AAEE70000CE47 /* AnimationControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F15DA890F3AAEE70000CE47 /* AnimationControllerPrivate.h */; };
 		0F500AAF0F54DB1B00EEF928 /* TransformState.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F500AAE0F54DB1B00EEF928 /* TransformState.h */; };
@@ -5351,6 +5356,11 @@
 		0B9056F60F2685F30095FF6A /* WorkerThreadableLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WorkerThreadableLoader.cpp; sourceTree = "<group>"; };
 		0B9056F70F2685F30095FF6A /* WorkerThreadableLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkerThreadableLoader.h; sourceTree = "<group>"; };
 		0BE030A10F3112FB003C1A46 /* RenderLineBoxList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderLineBoxList.h; sourceTree = "<group>"; };
+		0C3F1F5710C8871200D72CE1 /* WebGLUniformLocation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebGLUniformLocation.cpp; path = canvas/WebGLUniformLocation.cpp; sourceTree = "<group>"; };
+		0C3F1F5810C8871200D72CE1 /* WebGLUniformLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebGLUniformLocation.h; path = canvas/WebGLUniformLocation.h; sourceTree = "<group>"; };
+		0C3F1F5910C8871200D72CE1 /* WebGLUniformLocation.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = WebGLUniformLocation.idl; path = canvas/WebGLUniformLocation.idl; sourceTree = "<group>"; };
+		0C45342510CDBBFA00869157 /* JSWebGLUniformLocation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWebGLUniformLocation.cpp; sourceTree = "<group>"; };
+		0C45342610CDBBFA00869157 /* JSWebGLUniformLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWebGLUniformLocation.h; sourceTree = "<group>"; };
 		0F11A54E0F39233100C37884 /* RenderSelectionInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderSelectionInfo.h; sourceTree = "<group>"; };
 		0F15DA890F3AAEE70000CE47 /* AnimationControllerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AnimationControllerPrivate.h; path = animation/AnimationControllerPrivate.h; sourceTree = "<group>"; };
 		0F500AAE0F54DB1B00EEF928 /* TransformState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TransformState.h; sourceTree = "<group>"; };
@@ -10739,6 +10749,9 @@
 				49C7B9C51042D32F0009D447 /* WebGLTexture.cpp */,
 				49C7B9C61042D32F0009D447 /* WebGLTexture.h */,
 				49C7B9C71042D32F0009D447 /* WebGLTexture.idl */,
+				0C3F1F5710C8871200D72CE1 /* WebGLUniformLocation.cpp */,
+				0C3F1F5810C8871200D72CE1 /* WebGLUniformLocation.h */,
+				0C3F1F5910C8871200D72CE1 /* WebGLUniformLocation.idl */,
 				49EECDD610503C2300099FAB /* WebGLUnsignedByteArray.cpp */,
 				49EECDD710503C2300099FAB /* WebGLUnsignedByteArray.h */,
 				49EECDD810503C2300099FAB /* WebGLUnsignedByteArray.idl */,
@@ -12899,6 +12912,8 @@
 				49EECEF9105070C400099FAB /* JSWebGLShortArray.h */,
 				49C7B9911042D2D30009D447 /* JSWebGLTexture.cpp */,
 				49C7B9921042D2D30009D447 /* JSWebGLTexture.h */,
+				0C45342510CDBBFA00869157 /* JSWebGLUniformLocation.cpp */,
+				0C45342610CDBBFA00869157 /* JSWebGLUniformLocation.h */,
 				49EECEFA105070C400099FAB /* JSWebGLUnsignedByteArray.cpp */,
 				49EECEFB105070C400099FAB /* JSWebGLUnsignedByteArray.h */,
 				49EECEFC105070C400099FAB /* JSWebGLUnsignedIntArray.cpp */,
@@ -18229,6 +18244,8 @@
 				F4EAF4AF10C742B1009100D3 /* OpenTypeSanitizer.h in Headers */,
 				599D1E3310C97D6E00E0EF12 /* jni_utility_private.h in Headers */,
 				7ADE722610CBBB9B006B3B3A /* ContextMenuSelectionHandler.h in Headers */,
+ 				0C3F1F5B10C8871200D72CE1 /* WebGLUniformLocation.h in Headers */,
+ 				0C45342810CDBBFA00869157 /* JSWebGLUniformLocation.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -18330,6 +18347,7 @@
 				1AB1AE7A0C051FDE00139F4F /* zoomInCursor.png in Resources */,
 				1AB1AE7B0C051FDE00139F4F /* zoomOutCursor.png in Resources */,
 				5174E20C10A1F49A00F95E6F /* PopStateEvent.idl in Resources */,
+				0C3F1F5C10C8871200D72CE1 /* WebGLUniformLocation.idl in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -20383,6 +20401,8 @@
 				7A0E771E10C00DB100A0276E /* JSInspectorFrontendHost.cpp in Sources */,
 				F4EAF4AE10C742B1009100D3 /* OpenTypeSanitizer.cpp in Sources */,
 				599D1E3210C97D6E00E0EF12 /* jni_utility_private.cpp in Sources */,
+				0C3F1F5A10C8871200D72CE1 /* WebGLUniformLocation.cpp in Sources */,
+				0C45342710CDBBFA00869157 /* JSWebGLUniformLocation.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp b/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp
index 47fb793..77875fc 100644
--- a/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp
+++ b/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp
@@ -43,6 +43,7 @@
 #include "JSWebGLRenderbuffer.h"
 #include "JSWebGLShader.h"
 #include "JSWebGLTexture.h"
+#include "JSWebGLUniformLocation.h"
 #include "JSWebGLUnsignedByteArray.h"
 #include "JSWebKitCSSMatrix.h"
 #include "NotImplemented.h"
@@ -187,37 +188,6 @@ enum WhichProgramCall {
     kProgramParameter, kUniform
 };
 
-static JSValue getProgramParameterHelper(JSWebGLRenderingContext* obj, ExecState* exec, const ArgList& args, WhichProgramCall programCall)
-{
-    if (args.size() != 2)
-        return throwError(exec, SyntaxError);
-
-    ExceptionCode ec = 0;
-    WebGLRenderingContext* context = static_cast<WebGLRenderingContext*>(obj->impl());
-    WebGLProgram* program = toWebGLProgram(args.at(0));
-    unsigned pname = args.at(1).toInt32(exec);
-    if (exec->hadException())
-        return jsUndefined();
-    WebGLGetInfo info;
-    switch (programCall) {
-    case kProgramParameter:
-        info = context->getProgramParameter(program, pname, ec);
-        break;
-    case kUniform:
-        // pname -> location
-        info = context->getUniform(program, pname, ec);
-        break;
-    default:
-        notImplemented();
-        break;
-    }
-    if (ec) {
-        setDOMException(exec, ec);
-        return jsUndefined();
-    }
-    return toJS(exec, obj->globalObject(), info);
-}
-
 JSValue JSWebGLRenderingContext::getBufferParameter(ExecState* exec, const ArgList& args)
 {
     return getObjectParameter(this, exec, args, kBuffer);
@@ -267,7 +237,21 @@ JSValue JSWebGLRenderingContext::getParameter(ExecState* exec, const ArgList& ar
 
 JSValue JSWebGLRenderingContext::getProgramParameter(ExecState* exec, const ArgList& args)
 {
-    return getProgramParameterHelper(this, exec, args, kProgramParameter);
+    if (args.size() != 2)
+        return throwError(exec, SyntaxError);
+
+    ExceptionCode ec = 0;
+    WebGLRenderingContext* context = static_cast<WebGLRenderingContext*>(impl());
+    WebGLProgram* program = toWebGLProgram(args.at(0));
+    unsigned pname = args.at(1).toInt32(exec);
+    if (exec->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, const ArgList& args)
@@ -301,7 +285,21 @@ JSValue JSWebGLRenderingContext::getTexParameter(ExecState* exec, const ArgList&
 
 JSValue JSWebGLRenderingContext::getUniform(ExecState* exec, const ArgList& args)
 {
-    return getProgramParameterHelper(this, exec, args, kUniform);
+    if (args.size() != 2)
+        return throwError(exec, SyntaxError);
+
+    ExceptionCode ec = 0;
+    WebGLRenderingContext* context = static_cast<WebGLRenderingContext*>(impl());
+    WebGLProgram* program = toWebGLProgram(args.at(0));
+    WebGLUniformLocation* loc = toWebGLUniformLocation(args.at(1));
+    if (exec->hadException())
+        return jsUndefined();
+    WebGLGetInfo info = context->getUniform(program, loc, ec);
+    if (ec) {
+        setDOMException(exec, ec);
+        return jsUndefined();
+    }
+    return toJS(exec, globalObject(), info);
 }
 
 JSValue JSWebGLRenderingContext::getVertexAttrib(ExecState* exec, const ArgList& args)
@@ -463,30 +461,54 @@ enum DataFunctionMatrixToCall {
     f_uniformMatrix2fv, f_uniformMatrix3fv, f_uniformMatrix4fv
 };
 
+bool functionForUniform(DataFunctionToCall f)
+{
+    switch (f) {
+    case f_uniform1v:
+    case f_uniform2v:
+    case f_uniform3v:
+    case f_uniform4v:
+        return true;
+        break;
+    default: break;
+    }
+    return false;
+}
+
 static JSC::JSValue dataFunctionf(DataFunctionToCall f, JSC::ExecState* exec, const JSC::ArgList& args, WebGLRenderingContext* context)
 {
     if (args.size() != 2)
         return throwError(exec, SyntaxError);
+    
+    WebGLUniformLocation* location = 0;
+    long index = -1;
+    
+    if (functionForUniform(f))
+        location = toWebGLUniformLocation(args.at(0));
+    else
+        index = args.at(0).toInt32(exec);
 
-    long location = args.at(0).toInt32(exec);
-    if (exec->hadException())    
+    if (exec->hadException())
         return jsUndefined();
         
     RefPtr<WebGLFloatArray> webGLArray = toWebGLFloatArray(args.at(1));
     if (exec->hadException())    
         return jsUndefined();
         
+    ExceptionCode ec = 0;
     if (webGLArray) {
         switch(f) {
-            case f_uniform1v: context->uniform1fv(location, webGLArray.get()); break;
-            case f_uniform2v: context->uniform2fv(location, webGLArray.get()); break;
-            case f_uniform3v: context->uniform3fv(location, webGLArray.get()); break;
-            case f_uniform4v: context->uniform4fv(location, webGLArray.get()); break;
-            case f_vertexAttrib1v: context->vertexAttrib1fv(location, webGLArray.get()); break;
-            case f_vertexAttrib2v: context->vertexAttrib2fv(location, webGLArray.get()); break;
-            case f_vertexAttrib3v: context->vertexAttrib3fv(location, webGLArray.get()); break;
-            case f_vertexAttrib4v: context->vertexAttrib4fv(location, webGLArray.get()); break;
+            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;
         }
+        if (ec != 0)
+            setDOMException(exec, ec);
         return jsUndefined();
     }
     
@@ -498,15 +520,17 @@ static JSC::JSValue dataFunctionf(DataFunctionToCall f, JSC::ExecState* exec, co
         return throwError(exec, TypeError);
 
     switch(f) {
-        case f_uniform1v: context->uniform1fv(location, array, size); break;
-        case f_uniform2v: context->uniform2fv(location, array, size); break;
-        case f_uniform3v: context->uniform3fv(location, array, size); break;
-        case f_uniform4v: context->uniform4fv(location, array, size); break;
-        case f_vertexAttrib1v: context->vertexAttrib1fv(location, array, size); break;
-        case f_vertexAttrib2v: context->vertexAttrib2fv(location, array, size); break;
-        case f_vertexAttrib3v: context->vertexAttrib3fv(location, array, size); break;
-        case f_vertexAttrib4v: context->vertexAttrib4fv(location, array, size); break;
+        case f_uniform1v: context->uniform1fv(location, array, size, ec); break;
+        case f_uniform2v: context->uniform2fv(location, array, size, ec); break;
+        case f_uniform3v: context->uniform3fv(location, array, size, ec); break;
+        case f_uniform4v: context->uniform4fv(location, array, size, ec); break;
+        case f_vertexAttrib1v: context->vertexAttrib1fv(index, array, size); break;
+        case f_vertexAttrib2v: context->vertexAttrib2fv(index, array, size); break;
+        case f_vertexAttrib3v: context->vertexAttrib3fv(index, array, size); break;
+        case f_vertexAttrib4v: context->vertexAttrib4fv(index, array, size); break;
     }
+    if (ec != 0)
+        setDOMException(exec, ec);
     return jsUndefined();
 }
 
@@ -515,22 +539,26 @@ static JSC::JSValue dataFunctioni(DataFunctionToCall f, JSC::ExecState* exec, co
     if (args.size() != 2)
         return throwError(exec, SyntaxError);
 
-    long location = args.at(0).toInt32(exec);
-    if (exec->hadException())    
+    WebGLUniformLocation* location = toWebGLUniformLocation(args.at(0));
+  
+    if (exec->hadException())
         return jsUndefined();
         
     RefPtr<WebGLIntArray> webGLArray = toWebGLIntArray(args.at(1));
     if (exec->hadException())    
         return jsUndefined();
         
+    ExceptionCode ec = 0;
     if (webGLArray) {
         switch(f) {
-            case f_uniform1v: context->uniform1iv(location, webGLArray.get()); break;
-            case f_uniform2v: context->uniform2iv(location, webGLArray.get()); break;
-            case f_uniform3v: context->uniform3iv(location, webGLArray.get()); break;
-            case f_uniform4v: context->uniform4iv(location, webGLArray.get()); break;
+            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;
         }
+        if (ec != 0)
+            setDOMException(exec, ec);
         return jsUndefined();
     }
     
@@ -542,12 +570,14 @@ static JSC::JSValue dataFunctioni(DataFunctionToCall f, JSC::ExecState* exec, co
         return throwError(exec, TypeError);
 
     switch(f) {
-        case f_uniform1v: context->uniform1iv(location, array, size); break;
-        case f_uniform2v: context->uniform2iv(location, array, size); break;
-        case f_uniform3v: context->uniform3iv(location, array, size); break;
-        case f_uniform4v: context->uniform4iv(location, array, size); break;
+        case f_uniform1v: context->uniform1iv(location, array, size, ec); break;
+        case f_uniform2v: context->uniform2iv(location, array, size, ec); break;
+        case f_uniform3v: context->uniform3iv(location, array, size, ec); break;
+        case f_uniform4v: context->uniform4iv(location, array, size, ec); break;
         default: break;
     }
+    if (ec != 0)
+        setDOMException(exec, ec);
     return jsUndefined();
 }
 
@@ -556,7 +586,8 @@ static JSC::JSValue dataFunctionMatrix(DataFunctionMatrixToCall f, JSC::ExecStat
     if (args.size() != 3)
         return throwError(exec, SyntaxError);
 
-    long location = args.at(0).toInt32(exec);
+    WebGLUniformLocation* location = toWebGLUniformLocation(args.at(0));
+
     if (exec->hadException())    
         return jsUndefined();
         
@@ -568,12 +599,15 @@ static JSC::JSValue dataFunctionMatrix(DataFunctionMatrixToCall f, JSC::ExecStat
     if (exec->hadException())    
         return jsUndefined();
         
+    ExceptionCode ec = 0;
     if (webGLArray) {
         switch(f) {
-            case f_uniformMatrix2fv: context->uniformMatrix2fv(location, transpose, webGLArray.get()); break;
-            case f_uniformMatrix3fv: context->uniformMatrix3fv(location, transpose, webGLArray.get()); break;
-            case f_uniformMatrix4fv: context->uniformMatrix4fv(location, transpose, webGLArray.get()); break;
+            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;
         }
+        if (ec != 0)
+            setDOMException(exec, ec);
         return jsUndefined();
     }
     
@@ -585,10 +619,12 @@ static JSC::JSValue dataFunctionMatrix(DataFunctionMatrixToCall f, JSC::ExecStat
         return throwError(exec, TypeError);
 
     switch(f) {
-        case f_uniformMatrix2fv: context->uniformMatrix2fv(location, transpose, array, size); break;
-        case f_uniformMatrix3fv: context->uniformMatrix3fv(location, transpose, array, size); break;
-        case f_uniformMatrix4fv: context->uniformMatrix4fv(location, transpose, array, size); break;
+        case f_uniformMatrix2fv: context->uniformMatrix2fv(location, transpose, array, size, ec); break;
+        case f_uniformMatrix3fv: context->uniformMatrix3fv(location, transpose, array, size, ec); break;
+        case f_uniformMatrix4fv: context->uniformMatrix4fv(location, transpose, array, size, ec); break;
     }
+    if (ec != 0)
+        setDOMException(exec, ec);
     return jsUndefined();
 }
 
diff --git a/WebCore/bindings/scripts/CodeGeneratorV8.pm b/WebCore/bindings/scripts/CodeGeneratorV8.pm
index 8f63e0d..89cf13d 100644
--- a/WebCore/bindings/scripts/CodeGeneratorV8.pm
+++ b/WebCore/bindings/scripts/CodeGeneratorV8.pm
@@ -1816,6 +1816,7 @@ sub IsRefPtrType
     return 1 if $type eq "WebGLShader";
     return 1 if $type eq "WebGLShortArray";
     return 1 if $type eq "WebGLTexture";
+    return 1 if $type eq "WebGLUniformLocation";
     return 1 if $type eq "WebGLUnsignedByteArray";
     return 1 if $type eq "WebGLUnsignedIntArray";
     return 1 if $type eq "WebGLUnsignedShortArray";
@@ -1918,6 +1919,7 @@ my %typeCanFailConversion = (
     "WebGLShader" => 0,
     "WebGLShortArray" => 0,
     "WebGLTexture" => 0,
+    "WebGLUniformLocation" => 0,
     "CompareHow" => 0,
     "DataGridColumn" => 0,
     "DOMString" => 0,
diff --git a/WebCore/bindings/v8/DerivedSourcesAllInOne.cpp b/WebCore/bindings/v8/DerivedSourcesAllInOne.cpp
index b32d7d4..4344c96 100644
--- a/WebCore/bindings/v8/DerivedSourcesAllInOne.cpp
+++ b/WebCore/bindings/v8/DerivedSourcesAllInOne.cpp
@@ -57,6 +57,7 @@
 #include "bindings/V8WebGLShader.cpp"
 #include "bindings/V8WebGLShortArray.cpp"
 #include "bindings/V8WebGLTexture.cpp"
+#include "bindings/V8WebGLUniformLocation.cpp"
 #include "bindings/V8WebGLUnsignedByteArray.cpp"
 #include "bindings/V8WebGLUnsignedIntArray.cpp"
 #include "bindings/V8WebGLUnsignedShortArray.cpp"
diff --git a/WebCore/bindings/v8/V8Index.cpp b/WebCore/bindings/v8/V8Index.cpp
index 2b9a922..ff88710 100644
--- a/WebCore/bindings/v8/V8Index.cpp
+++ b/WebCore/bindings/v8/V8Index.cpp
@@ -407,6 +407,7 @@
 #include "V8WebGLShader.h"
 #include "V8WebGLShortArray.h"
 #include "V8WebGLTexture.h"
+#include "V8WebGLUniformLocation.h"
 #include "V8WebGLUnsignedByteArray.h"
 #include "V8WebGLUnsignedIntArray.h"
 #include "V8WebGLUnsignedShortArray.h"
diff --git a/WebCore/bindings/v8/V8Index.h b/WebCore/bindings/v8/V8Index.h
index 1c87d25..cebb382 100644
--- a/WebCore/bindings/v8/V8Index.h
+++ b/WebCore/bindings/v8/V8Index.h
@@ -460,6 +460,7 @@ typedef v8::Persistent<v8::FunctionTemplate> (*FunctionTemplateFactory)();
     V(WEBGLSHADER, WebGLShader)                                         \
     V(WEBGLSHORTARRAY, WebGLShortArray)                                 \
     V(WEBGLTEXTURE, WebGLTexture)                                       \
+    V(WEBGLUNIFORMLOCATION, WebGLUniformLocation)                       \
     V(WEBGLUNSIGNEDBYTEARRAY, WebGLUnsignedByteArray)                   \
     V(WEBGLUNSIGNEDINTARRAY, WebGLUnsignedIntArray)                     \
     V(WEBGLUNSIGNEDSHORTARRAY, WebGLUnsignedShortArray)
diff --git a/WebCore/bindings/v8/custom/V8WebGLRenderingContextCustom.cpp b/WebCore/bindings/v8/custom/V8WebGLRenderingContextCustom.cpp
index 45a8626..c5f18da 100644
--- a/WebCore/bindings/v8/custom/V8WebGLRenderingContextCustom.cpp
+++ b/WebCore/bindings/v8/custom/V8WebGLRenderingContextCustom.cpp
@@ -48,6 +48,7 @@
 #include "V8WebGLProgram.h"
 #include "V8WebGLShader.h"
 #include "V8WebGLShortArray.h"
+#include "V8WebGLUniformLocation.h"
 #include "V8WebGLUnsignedByteArray.h"
 #include "V8WebGLUnsignedIntArray.h"
 #include "V8WebGLUnsignedShortArray.h"
@@ -262,47 +263,21 @@ static v8::Handle<v8::Value> getObjectParameter(const v8::Arguments& args, Objec
     return toV8(info);
 }
 
-enum WhichProgramCall {
-    kProgramParameter, kUniform
-};
-
-static v8::Handle<v8::Value> getProgramParameter(const v8::Arguments& args, WhichProgramCall programCall)
+static WebGLUniformLocation* toWebGLUniformLocation(v8::Handle<v8::Value> value, bool& ok)
 {
-    if (args.Length() != 2) {
-        V8Proxy::setDOMException(SYNTAX_ERR);
-        return notHandledByInterceptor();
+    ok = false;
+    WebGLUniformLocation* location = 0;
+    if (V8WebGLUniformLocation::HasInstance(value)) {
+        location = V8DOMWrapper::convertToNativeObject<WebGLUniformLocation>(
+            V8ClassIndex::WEBGLUNIFORMLOCATION, value->ToObject());
+        ok = true;
     }
-
-    ExceptionCode ec = 0;
-    WebGLRenderingContext* context =
-        V8DOMWrapper::convertDOMWrapperToNative<WebGLRenderingContext>(args.Holder());
-    WebGLProgram* program = V8WebGLProgram::HasInstance(args[0]) ? v8DOMWrapperTo<WebGLProgram>(V8ClassIndex::WEBGLPROGRAM, v8::Handle<v8::Object>::Cast(args[0])) : 0;
-    bool ok;
-    unsigned pname = toInt32(args[1], ok);
-    if (!ok) {
-        V8Proxy::setDOMException(SYNTAX_ERR);
-        return notHandledByInterceptor();
-    }
-    WebGLGetInfo info;
-    switch (programCall) {
-    case kProgramParameter:
-        info = context->getProgramParameter(program, pname, ec);
-        break;
-    case kUniform:
-        // pname -> location
-        info = context->getUniform(program, pname, ec);
-        break;
-    default:
-        notImplemented();
-        break;
-    }
-    if (ec) {
-        V8Proxy::setDOMException(ec);
-        return v8::Undefined();
-    }
-    return toV8(info);
+    return location;
 }
 
+enum WhichProgramCall {
+    kProgramParameter, kUniform
+};
 
 CALLBACK_FUNC_DECL(WebGLRenderingContextGetBufferParameter)
 {
@@ -375,7 +350,28 @@ CALLBACK_FUNC_DECL(WebGLRenderingContextGetParameter)
 CALLBACK_FUNC_DECL(WebGLRenderingContextGetProgramParameter)
 {
     INC_STATS("DOM.WebGLRenderingContext.getProgramParameter()");
-    return getProgramParameter(args, kProgramParameter);
+
+    if (args.Length() != 2) {
+        V8Proxy::setDOMException(SYNTAX_ERR);
+        return notHandledByInterceptor();
+    }
+
+    ExceptionCode ec = 0;
+    WebGLRenderingContext* context =
+        V8DOMWrapper::convertDOMWrapperToNative<WebGLRenderingContext>(args.Holder());
+    WebGLProgram* program = V8WebGLProgram::HasInstance(args[0]) ? v8DOMWrapperTo<WebGLProgram>(V8ClassIndex::WEBGLPROGRAM, v8::Handle<v8::Object>::Cast(args[0])) : 0;
+    bool ok;
+    unsigned pname = toInt32(args[1], ok);
+    if (!ok) {
+        V8Proxy::setDOMException(SYNTAX_ERR);
+        return notHandledByInterceptor();
+    }
+    WebGLGetInfo info = context->getProgramParameter(program, pname, ec);
+    if (ec) {
+        V8Proxy::setDOMException(ec);
+        return v8::Undefined();
+    }
+    return toV8(info);
 }
 
 CALLBACK_FUNC_DECL(WebGLRenderingContextGetRenderbufferParameter)
@@ -420,7 +416,30 @@ CALLBACK_FUNC_DECL(WebGLRenderingContextGetTexParameter)
 CALLBACK_FUNC_DECL(WebGLRenderingContextGetUniform)
 {
     INC_STATS("DOM.WebGLRenderingContext.getUniform()");
-    return getProgramParameter(args, kUniform);
+
+    if (args.Length() != 2) {
+        V8Proxy::setDOMException(SYNTAX_ERR);
+        return notHandledByInterceptor();
+    }
+
+    ExceptionCode ec = 0;
+    WebGLRenderingContext* context =
+        V8DOMWrapper::convertDOMWrapperToNative<WebGLRenderingContext>(args.Holder());
+    WebGLProgram* program = V8WebGLProgram::HasInstance(args[0]) ? v8DOMWrapperTo<WebGLProgram>(V8ClassIndex::WEBGLPROGRAM, v8::Handle<v8::Object>::Cast(args[0])) : 0;
+
+    bool ok = false;
+    WebGLUniformLocation* location = toWebGLUniformLocation(args[1], ok);
+
+    if (!ok) {
+        V8Proxy::setDOMException(SYNTAX_ERR);
+        return notHandledByInterceptor();
+    }
+    WebGLGetInfo info = context->getUniform(program, location, ec);
+    if (ec) {
+        V8Proxy::setDOMException(ec);
+        return v8::Undefined();
+    }
+    return toV8(info);
 }
 
 CALLBACK_FUNC_DECL(WebGLRenderingContextGetVertexAttrib)
@@ -560,35 +579,57 @@ enum FunctionToCall {
     kVertexAttrib1v, kVertexAttrib2v, kVertexAttrib3v, kVertexAttrib4v
 };
 
+bool isFunctionToCallForAttribute(FunctionToCall functionToCall)
+{
+    switch (functionToCall) {
+    case kVertexAttrib1v:
+    case kVertexAttrib2v:
+    case kVertexAttrib3v:
+    case kVertexAttrib4v:
+        return true;
+    default:
+        break;
+    }
+    return false;
+}
+
 static v8::Handle<v8::Value> vertexAttribAndUniformHelperf(const v8::Arguments& args,
                                                            FunctionToCall functionToCall) {
     // Forms:
-    // * glUniform1fv(GLint location, Array data);
-    // * glUniform1fv(GLint location, WebGLFloatArray data);
-    // * glUniform2fv(GLint location, Array data);
-    // * glUniform2fv(GLint location, WebGLFloatArray data);
-    // * glUniform3fv(GLint location, Array data);
-    // * glUniform3fv(GLint location, WebGLFloatArray data);
-    // * glUniform4fv(GLint location, Array data);
-    // * glUniform4fv(GLint location, WebGLFloatArray data);
-    // * glVertexAttrib1fv(GLint location, Array data);
-    // * glVertexAttrib1fv(GLint location, WebGLFloatArray data);
-    // * glVertexAttrib2fv(GLint location, Array data);
-    // * glVertexAttrib2fv(GLint location, WebGLFloatArray data);
-    // * glVertexAttrib3fv(GLint location, Array data);
-    // * glVertexAttrib3fv(GLint location, WebGLFloatArray data);
-    // * glVertexAttrib4fv(GLint location, Array data);
-    // * glVertexAttrib4fv(GLint location, WebGLFloatArray data);
+    // * glUniform1fv(WebGLUniformLocation location, Array data);
+    // * glUniform1fv(WebGLUniformLocation location, WebGLFloatArray data);
+    // * glUniform2fv(WebGLUniformLocation location, Array data);
+    // * glUniform2fv(WebGLUniformLocation location, WebGLFloatArray data);
+    // * glUniform3fv(WebGLUniformLocation location, Array data);
+    // * glUniform3fv(WebGLUniformLocation location, WebGLFloatArray data);
+    // * glUniform4fv(WebGLUniformLocation location, Array data);
+    // * glUniform4fv(WebGLUniformLocation location, WebGLFloatArray data);
+    // * glVertexAttrib1fv(GLint index, Array data);
+    // * glVertexAttrib1fv(GLint index, WebGLFloatArray data);
+    // * glVertexAttrib2fv(GLint index, Array data);
+    // * glVertexAttrib2fv(GLint index, WebGLFloatArray data);
+    // * glVertexAttrib3fv(GLint index, Array data);
+    // * glVertexAttrib3fv(GLint index, WebGLFloatArray data);
+    // * glVertexAttrib4fv(GLint index, Array data);
+    // * glVertexAttrib4fv(GLint index, WebGLFloatArray data);
 
     if (args.Length() != 3) {
         V8Proxy::setDOMException(SYNTAX_ERR);
         return notHandledByInterceptor();
     }
 
+    bool ok = false;
+    int index = -1;
+    WebGLUniformLocation* location = 0;
+
+    if (isFunctionToCallForAttribute(functionToCall))
+        index = toInt32(args[0], ok);
+    else
+        location = toWebGLUniformLocation(args[0], ok);
+
     WebGLRenderingContext* context =
         V8DOMWrapper::convertDOMWrapperToNative<WebGLRenderingContext>(args.Holder());
-    bool ok;
-    int location = toInt32(args[0], ok);
+
     if (!ok) {
         V8Proxy::setDOMException(SYNTAX_ERR);
         return notHandledByInterceptor();
@@ -602,10 +643,10 @@ static v8::Handle<v8::Value> vertexAttribAndUniformHelperf(const v8::Arguments&
             case kUniform2v: context->uniform2fv(location, array); break;
             case kUniform3v: context->uniform3fv(location, array); break;
             case kUniform4v: context->uniform4fv(location, array); break;
-            case kVertexAttrib1v: context->vertexAttrib1fv(location, array); break;
-            case kVertexAttrib2v: context->vertexAttrib2fv(location, array); break;
-            case kVertexAttrib3v: context->vertexAttrib3fv(location, array); break;
-            case kVertexAttrib4v: context->vertexAttrib4fv(location, array); break;
+            case kVertexAttrib1v: context->vertexAttrib1fv(index, array); break;
+            case kVertexAttrib2v: context->vertexAttrib2fv(index, array); break;
+            case kVertexAttrib3v: context->vertexAttrib3fv(index, array); break;
+            case kVertexAttrib4v: context->vertexAttrib4fv(index, array); break;
             default: ASSERT_NOT_REACHED(); break;
         }
         return v8::Undefined();
@@ -629,10 +670,10 @@ static v8::Handle<v8::Value> vertexAttribAndUniformHelperf(const v8::Arguments&
         case kUniform2v: context->uniform2fv(location, data, len); break;
         case kUniform3v: context->uniform3fv(location, data, len); break;
         case kUniform4v: context->uniform4fv(location, data, len); break;
-        case kVertexAttrib1v: context->vertexAttrib1fv(location, data, len); break;
-        case kVertexAttrib2v: context->vertexAttrib2fv(location, data, len); break;
-        case kVertexAttrib3v: context->vertexAttrib3fv(location, data, len); break;
-        case kVertexAttrib4v: context->vertexAttrib4fv(location, data, len); break;
+        case kVertexAttrib1v: context->vertexAttrib1fv(index, data, len); break;
+        case kVertexAttrib2v: context->vertexAttrib2fv(index, data, len); break;
+        case kVertexAttrib3v: context->vertexAttrib3fv(index, data, len); break;
+        case kVertexAttrib4v: context->vertexAttrib4fv(index, data, len); break;
         default: ASSERT_NOT_REACHED(); break;
     }
     fastFree(data);
@@ -642,14 +683,14 @@ static v8::Handle<v8::Value> vertexAttribAndUniformHelperf(const v8::Arguments&
 static v8::Handle<v8::Value> uniformHelperi(const v8::Arguments& args,
                                             FunctionToCall functionToCall) {
     // Forms:
-    // * glUniform1iv(GLint location, Array data);
-    // * glUniform1iv(GLint location, WebGLIntArray data);
-    // * glUniform2iv(GLint location, Array data);
-    // * glUniform2iv(GLint location, WebGLIntArray data);
-    // * glUniform3iv(GLint location, Array data);
-    // * glUniform3iv(GLint location, WebGLIntArray data);
-    // * glUniform4iv(GLint location, Array data);
-    // * glUniform4iv(GLint location, WebGLIntArray data);
+    // * glUniform1iv(GLUniformLocation location, Array data);
+    // * glUniform1iv(GLUniformLocation location, WebGLIntArray data);
+    // * glUniform2iv(GLUniformLocation location, Array data);
+    // * glUniform2iv(GLUniformLocation location, WebGLIntArray data);
+    // * glUniform3iv(GLUniformLocation location, Array data);
+    // * glUniform3iv(GLUniformLocation location, WebGLIntArray data);
+    // * glUniform4iv(GLUniformLocation location, Array data);
+    // * glUniform4iv(GLUniformLocation location, WebGLIntArray data);
 
     if (args.Length() != 3) {
         V8Proxy::setDOMException(SYNTAX_ERR);
@@ -658,8 +699,9 @@ static v8::Handle<v8::Value> uniformHelperi(const v8::Arguments& args,
 
     WebGLRenderingContext* context =
         V8DOMWrapper::convertDOMWrapperToNative<WebGLRenderingContext>(args.Holder());
-    bool ok;
-    int location = toInt32(args[0], ok);
+    bool ok = false;
+    WebGLUniformLocation* location = toWebGLUniformLocation(args[0], ok);
+
     if (!ok) {
         V8Proxy::setDOMException(SYNTAX_ERR);
         return notHandledByInterceptor();
@@ -769,8 +811,10 @@ static v8::Handle<v8::Value> uniformMatrixHelper(const v8::Arguments& args,
 
     WebGLRenderingContext* context =
         V8DOMWrapper::convertDOMWrapperToNative<WebGLRenderingContext>(args.Holder());
-    bool ok;
-    int location = toInt32(args[0], ok);
+
+    bool ok = false;
+    WebGLUniformLocation* location = toWebGLUniformLocation(args[0], ok);
+    
     if (!ok) {
         V8Proxy::setDOMException(SYNTAX_ERR);
         return notHandledByInterceptor();
diff --git a/WebCore/html/canvas/WebGLRenderingContext.cpp b/WebCore/html/canvas/WebGLRenderingContext.cpp
index a19d5c6..aadcbb4 100644
--- a/WebCore/html/canvas/WebGLRenderingContext.cpp
+++ b/WebCore/html/canvas/WebGLRenderingContext.cpp
@@ -36,6 +36,7 @@
 #include "WebGLRenderbuffer.h"
 #include "WebGLTexture.h"
 #include "WebGLShader.h"
+#include "WebGLUniformLocation.h"
 #include "HTMLCanvasElement.h"
 #include "HTMLImageElement.h"
 #include "ImageBuffer.h"
@@ -1147,13 +1148,15 @@ WebGLGetInfo WebGLRenderingContext::getTexParameter(unsigned long target, unsign
     }
 }
 
-WebGLGetInfo WebGLRenderingContext::getUniform(WebGLProgram* program, long location, ExceptionCode& ec)
+WebGLGetInfo WebGLRenderingContext::getUniform(WebGLProgram* program, const WebGLUniformLocation* uniformLocation, ExceptionCode& ec)
 {
-    if (!program || program->context() != this) {
+    if (!program || uniformLocation->program() != program || program->context() != this) {
         // FIXME: raise GL_INVALID_VALUE error
         ec = TYPE_MISMATCH_ERR;
         return WebGLGetInfo();
     }
+    long location = uniformLocation->location();
+    
     WebGLStateRestorer(this, false);
     // FIXME: make this more efficient using WebGLUniformLocation and caching types in it
     int activeUniforms = 0;
@@ -1275,13 +1278,14 @@ WebGLGetInfo WebGLRenderingContext::getUniform(WebGLProgram* program, long locat
     return WebGLGetInfo();
 }
 
-long WebGLRenderingContext::getUniformLocation(WebGLProgram* program, const String& name, ExceptionCode& ec)
+PassRefPtr<WebGLUniformLocation> WebGLRenderingContext::getUniformLocation(WebGLProgram* program, const String& name, ExceptionCode& ec)
 {
     if (!program || program->context() != this) {
         ec = TYPE_MISMATCH_ERR;
         return 0;
     }
-    return m_context->getUniformLocation(program, name);
+    WebGLStateRestorer(this, false);
+    return WebGLUniformLocation::create(program, m_context->getUniformLocation(program, name));
 }
 
 WebGLGetInfo WebGLRenderingContext::getVertexAttrib(unsigned long index, unsigned long pname, ExceptionCode& ec)
@@ -1646,289 +1650,469 @@ void WebGLRenderingContext::texSubImage2D(unsigned target, unsigned level, unsig
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform1f(long location, float x)
+void WebGLRenderingContext::uniform1f(const WebGLUniformLocation* location, float x, ExceptionCode& ec)
 {
-    m_context->uniform1f(location, x);
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+
+    m_context->uniform1f(location->location(), x);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform1fv(long location, WebGLFloatArray* v)
+void WebGLRenderingContext::uniform1fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
-    m_context->uniform1fv(location, v->data(), v->length());
+    m_context->uniform1fv(location->location(), v->data(), v->length());
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform1fv(long location, float* v, int size)
+void WebGLRenderingContext::uniform1fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
-    m_context->uniform1fv(location, v, size);
+    m_context->uniform1fv(location->location(), v, size);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform1i(long location, int x)
+void WebGLRenderingContext::uniform1i(const WebGLUniformLocation* location, int x, ExceptionCode& ec)
 {
-    m_context->uniform1i(location, x);
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
+    m_context->uniform1i(location->location(), x);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform1iv(long location, WebGLIntArray* v)
+void WebGLRenderingContext::uniform1iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
-    m_context->uniform1iv(location, v->data(), v->length());
+    m_context->uniform1iv(location->location(), v->data(), v->length());
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform1iv(long location, int* v, int size)
+void WebGLRenderingContext::uniform1iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
-    m_context->uniform1iv(location, v, size);
+    m_context->uniform1iv(location->location(), v, size);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform2f(long location, float x, float y)
+void WebGLRenderingContext::uniform2f(const WebGLUniformLocation* location, float x, float y, ExceptionCode& ec)
 {
-    m_context->uniform2f(location, x, y);
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
+    m_context->uniform2f(location->location(), x, y);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform2fv(long location, WebGLFloatArray* v)
+void WebGLRenderingContext::uniform2fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 2
-    m_context->uniform2fv(location, v->data(), v->length() / 2);
+    m_context->uniform2fv(location->location(), v->data(), v->length() / 2);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform2fv(long location, float* v, int size)
+void WebGLRenderingContext::uniform2fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 2
-    m_context->uniform2fv(location, v, size / 2);
+    m_context->uniform2fv(location->location(), v, size / 2);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform2i(long location, int x, int y)
+void WebGLRenderingContext::uniform2i(const WebGLUniformLocation* location, int x, int y, ExceptionCode& ec)
 {
-    m_context->uniform2i(location, x, y);
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
+    m_context->uniform2i(location->location(), x, y);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform2iv(long location, WebGLIntArray* v)
+void WebGLRenderingContext::uniform2iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 2
-    m_context->uniform2iv(location, v->data(), v->length() / 2);
+    m_context->uniform2iv(location->location(), v->data(), v->length() / 2);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform2iv(long location, int* v, int size)
+void WebGLRenderingContext::uniform2iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 2
-    m_context->uniform2iv(location, v, size / 2);
+    m_context->uniform2iv(location->location(), v, size / 2);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform3f(long location, float x, float y, float z)
+void WebGLRenderingContext::uniform3f(const WebGLUniformLocation* location, float x, float y, float z, ExceptionCode& ec)
 {
-    m_context->uniform3f(location, x, y, z);
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
+    m_context->uniform3f(location->location(), x, y, z);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform3fv(long location, WebGLFloatArray* v)
+void WebGLRenderingContext::uniform3fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 3
-    m_context->uniform3fv(location, v->data(), v->length() / 3);
+    m_context->uniform3fv(location->location(), v->data(), v->length() / 3);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform3fv(long location, float* v, int size)
+void WebGLRenderingContext::uniform3fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 3
-    m_context->uniform3fv(location, v, size / 3);
+    m_context->uniform3fv(location->location(), v, size / 3);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform3i(long location, int x, int y, int z)
+void WebGLRenderingContext::uniform3i(const WebGLUniformLocation* location, int x, int y, int z, ExceptionCode& ec)
 {
-    m_context->uniform3i(location, x, y, z);
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
+    m_context->uniform3i(location->location(), x, y, z);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform3iv(long location, WebGLIntArray* v)
+void WebGLRenderingContext::uniform3iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 3
-    m_context->uniform3iv(location, v->data(), v->length() / 3);
+    m_context->uniform3iv(location->location(), v->data(), v->length() / 3);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform3iv(long location, int* v, int size)
+void WebGLRenderingContext::uniform3iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 3
-    m_context->uniform3iv(location, v, size / 3);
+    m_context->uniform3iv(location->location(), v, size / 3);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform4f(long location, float x, float y, float z, float w)
+void WebGLRenderingContext::uniform4f(const WebGLUniformLocation* location, float x, float y, float z, float w, ExceptionCode& ec)
 {
-    m_context->uniform4f(location, x, y, z, w);
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
+    m_context->uniform4f(location->location(), x, y, z, w);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform4fv(long location, WebGLFloatArray* v)
+void WebGLRenderingContext::uniform4fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 4
-    m_context->uniform4fv(location, v->data(), v->length() / 4);
+    m_context->uniform4fv(location->location(), v->data(), v->length() / 4);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform4fv(long location, float* v, int size)
+void WebGLRenderingContext::uniform4fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 4
-    m_context->uniform4fv(location, v, size / 4);
+    m_context->uniform4fv(location->location(), v, size / 4);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform4i(long location, int x, int y, int z, int w)
+void WebGLRenderingContext::uniform4i(const WebGLUniformLocation* location, int x, int y, int z, int w, ExceptionCode& ec)
 {
-    m_context->uniform4i(location, x, y, z, w);
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
+    m_context->uniform4i(location->location(), x, y, z, w);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform4iv(long location, WebGLIntArray* v)
+void WebGLRenderingContext::uniform4iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 4
-    m_context->uniform4iv(location, v->data(), v->length() / 4);
+    m_context->uniform4iv(location->location(), v->data(), v->length() / 4);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniform4iv(long location, int* v, int size)
+void WebGLRenderingContext::uniform4iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 4
-    m_context->uniform4iv(location, v, size / 4);
+    m_context->uniform4iv(location->location(), v, size / 4);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniformMatrix2fv(long location, bool transpose, WebGLFloatArray* v)
+void WebGLRenderingContext::uniformMatrix2fv(const WebGLUniformLocation* location, bool transpose, WebGLFloatArray* v, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 4
-    m_context->uniformMatrix2fv(location, transpose, v->data(), v->length() / 4);
+    m_context->uniformMatrix2fv(location->location(), transpose, v->data(), v->length() / 4);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniformMatrix2fv(long location, bool transpose, float* v, int size)
+void WebGLRenderingContext::uniformMatrix2fv(const WebGLUniformLocation* location, bool transpose, float* v, int size, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 4
-    m_context->uniformMatrix2fv(location, transpose, v, size / 4);
+    m_context->uniformMatrix2fv(location->location(), transpose, v, size / 4);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniformMatrix3fv(long location, bool transpose, WebGLFloatArray* v)
+void WebGLRenderingContext::uniformMatrix3fv(const WebGLUniformLocation* location, bool transpose, WebGLFloatArray* v, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 9
-    m_context->uniformMatrix3fv(location, transpose, v->data(), v->length() / 9);
+    m_context->uniformMatrix3fv(location->location(), transpose, v->data(), v->length() / 9);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniformMatrix3fv(long location, bool transpose, float* v, int size)
+void WebGLRenderingContext::uniformMatrix3fv(const WebGLUniformLocation* location, bool transpose, float* v, int size, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 9
-    m_context->uniformMatrix3fv(location, transpose, v, size / 9);
+    m_context->uniformMatrix3fv(location->location(), transpose, v, size / 9);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniformMatrix4fv(long location, bool transpose, WebGLFloatArray* v)
+void WebGLRenderingContext::uniformMatrix4fv(const WebGLUniformLocation* location, bool transpose, WebGLFloatArray* v, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 16
-    m_context->uniformMatrix4fv(location, transpose, v->data(), v->length() / 16);
+    m_context->uniformMatrix4fv(location->location(), transpose, v->data(), v->length() / 16);
     cleanupAfterGraphicsCall(false);
 }
 
-void WebGLRenderingContext::uniformMatrix4fv(long location, bool transpose, float* v, int size)
+void WebGLRenderingContext::uniformMatrix4fv(const WebGLUniformLocation* location, bool transpose, float* v, int size, ExceptionCode& ec)
 {
+    if (!location || location->program() != m_currentProgram) {
+        // FIXME: raise GL_INVALID_OPERATION error
+        ec = TYPE_MISMATCH_ERR;
+        return;
+    }
+    
     // FIXME: we need to throw if no array passed in
     if (!v)
         return;
         
     // FIXME: length needs to be a multiple of 16
-    m_context->uniformMatrix4fv(location, transpose, v, size / 16);
+    m_context->uniformMatrix4fv(location->location(), transpose, v, size / 16);
     cleanupAfterGraphicsCall(false);
 }
 
diff --git a/WebCore/html/canvas/WebGLRenderingContext.h b/WebCore/html/canvas/WebGLRenderingContext.h
index 62b8899..399b155 100644
--- a/WebCore/html/canvas/WebGLRenderingContext.h
+++ b/WebCore/html/canvas/WebGLRenderingContext.h
@@ -45,6 +45,7 @@ class WebGLProgram;
 class WebGLRenderbuffer;
 class WebGLShader;
 class WebGLTexture;
+class WebGLUniformLocation;
 class HTMLImageElement;
 class HTMLVideoElement;
 class ImageData;
@@ -157,9 +158,9 @@ class WebKitCSSMatrix;
 
         WebGLGetInfo getTexParameter(unsigned long target, unsigned long pname, ExceptionCode&);
 
-        WebGLGetInfo getUniform(WebGLProgram* program, long location, ExceptionCode& ec);
+        WebGLGetInfo getUniform(WebGLProgram*, const WebGLUniformLocation*, ExceptionCode&);
 
-        long getUniformLocation(WebGLProgram*, const String& name, ExceptionCode&);
+        PassRefPtr<WebGLUniformLocation> getUniformLocation(WebGLProgram*, const String&, ExceptionCode&);
 
         WebGLGetInfo getVertexAttrib(unsigned long index, unsigned long pname, ExceptionCode&);
 
@@ -224,36 +225,36 @@ class WebKitCSSMatrix;
                            unsigned width, unsigned height, HTMLVideoElement* video,
                            bool flipY, bool premultiplyAlpha, ExceptionCode&);
 
-        void uniform1f(long location, float x);
-        void uniform1fv(long location, WebGLFloatArray* v);
-        void uniform1fv(long location, float* v, int size);
-        void uniform1i(long location, int x);
-        void uniform1iv(long location, WebGLIntArray* v);
-        void uniform1iv(long location, int* v, int size);
-        void uniform2f(long location, float x, float y);
-        void uniform2fv(long location, WebGLFloatArray* v);
-        void uniform2fv(long location, float* v, int size);
-        void uniform2i(long location, int x, int y);
-        void uniform2iv(long location, WebGLIntArray* v);
-        void uniform2iv(long location, int* v, int size);
-        void uniform3f(long location, float x, float y, float z);
-        void uniform3fv(long location, WebGLFloatArray* v);
-        void uniform3fv(long location, float* v, int size);
-        void uniform3i(long location, int x, int y, int z);
-        void uniform3iv(long location, WebGLIntArray* v);
-        void uniform3iv(long location, int* v, int size);
-        void uniform4f(long location, float x, float y, float z, float w);
-        void uniform4fv(long location, WebGLFloatArray* v);
-        void uniform4fv(long location, float* v, int size);
-        void uniform4i(long location, int x, int y, int z, int w);
-        void uniform4iv(long location, WebGLIntArray* v);
-        void uniform4iv(long location, int* v, int size);
-        void uniformMatrix2fv(long location, bool transpose, WebGLFloatArray* value);
-        void uniformMatrix2fv(long location, bool transpose, float* value, int size);
-        void uniformMatrix3fv(long location, bool transpose, WebGLFloatArray* value);
-        void uniformMatrix3fv(long location, bool transpose, float* value, int size);
-        void uniformMatrix4fv(long location, bool transpose, WebGLFloatArray* value);
-        void uniformMatrix4fv(long location, bool transpose, float* value, int size);
+        void uniform1f(const WebGLUniformLocation* location, float x, ExceptionCode&);
+        void uniform1fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode&);
+        void uniform1fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&);
+        void uniform1i(const WebGLUniformLocation* location, int x, ExceptionCode&);
+        void uniform1iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode&);
+        void uniform1iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&);
+        void uniform2f(const WebGLUniformLocation* location, float x, float y, ExceptionCode&);
+        void uniform2fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode&);
+        void uniform2fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&);
+        void uniform2i(const WebGLUniformLocation* location, int x, int y, ExceptionCode&);
+        void uniform2iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode&);
+        void uniform2iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&);
+        void uniform3f(const WebGLUniformLocation* location, float x, float y, float z, ExceptionCode&);
+        void uniform3fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode&);
+        void uniform3fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&);
+        void uniform3i(const WebGLUniformLocation* location, int x, int y, int z, ExceptionCode&);
+        void uniform3iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode&);
+        void uniform3iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&);
+        void uniform4f(const WebGLUniformLocation* location, float x, float y, float z, float w, ExceptionCode&);
+        void uniform4fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode&);
+        void uniform4fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&);
+        void uniform4i(const WebGLUniformLocation* location, int x, int y, int z, int w, ExceptionCode&);
+        void uniform4iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode&);
+        void uniform4iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&);
+        void uniformMatrix2fv(const WebGLUniformLocation* location, bool transpose, WebGLFloatArray* value, ExceptionCode&);
+        void uniformMatrix2fv(const WebGLUniformLocation* location, bool transpose, float* value, int size, ExceptionCode&);
+        void uniformMatrix3fv(const WebGLUniformLocation* location, bool transpose, WebGLFloatArray* value, ExceptionCode&);
+        void uniformMatrix3fv(const WebGLUniformLocation* location, bool transpose, float* value, int size, ExceptionCode&);
+        void uniformMatrix4fv(const WebGLUniformLocation* location, bool transpose, WebGLFloatArray* value, ExceptionCode&);
+        void uniformMatrix4fv(const WebGLUniformLocation* location, bool transpose, float* value, int size, ExceptionCode&);
 
         void useProgram(WebGLProgram*, ExceptionCode&);
         void validateProgram(WebGLProgram*, ExceptionCode&);
diff --git a/WebCore/html/canvas/WebGLRenderingContext.idl b/WebCore/html/canvas/WebGLRenderingContext.idl
index 8f3c531..78de8c8 100644
--- a/WebCore/html/canvas/WebGLRenderingContext.idl
+++ b/WebCore/html/canvas/WebGLRenderingContext.idl
@@ -567,10 +567,10 @@ module html {
         // any getTexParameter(in unsigned long target, in unsigned long pname) raises(DOMException);
         [Custom] void getTexParameter();
 
-        // any getUniform(in WebGLProgram program, in long location) raises(DOMException);
+        // any getUniform(in WebGLProgram program, in WebGLUniformLocation location) raises(DOMException);
         [Custom] void getUniform();
-        
-        long getUniformLocation(in WebGLProgram program, in DOMString name) raises(DOMException);
+
+        WebGLUniformLocation getUniformLocation(in WebGLProgram program, in DOMString name) raises(DOMException);
 
         // any getVertexAttrib(in unsigned long index, in unsigned long pname) raises(DOMException);
         [Custom] void getVertexAttrib();
@@ -638,26 +638,26 @@ module html {
         //                      [Optional] GLboolean flipY, [Optional] in premultiplyAlpha);
         [Custom] void texSubImage2D();
 
-        void uniform1f(in long location, in float x);
-        [Custom] void uniform1fv(in long location, in WebGLFloatArray v);
-        void uniform1i(in long location, in long x);
-        [Custom] void uniform1iv(in long location, in WebGLIntArray v);
-        void uniform2f(in long location, in float x, in float y);
-        [Custom] void uniform2fv(in long location, in WebGLFloatArray v);
-        void uniform2i(in long location, in long x, in long y);
-        [Custom] void uniform2iv(in long location, in WebGLIntArray v);
-        void uniform3f(in long location, in float x, in float y, in float z);
-        [Custom] void uniform3fv(in long location, in WebGLFloatArray v);
-        void uniform3i(in long location, in long x, in long y, in long z);
-        [Custom] void uniform3iv(in long location, in WebGLIntArray v);
-        void uniform4f(in long location, in float x, in float y, in float z, in float w);
-        [Custom] void uniform4fv(in long location, in WebGLFloatArray v);
-        void uniform4i(in long location, in long x, in long y, in long z, in long w);
-        [Custom] void uniform4iv(in long location, in WebGLIntArray v);
-
-        [Custom] void uniformMatrix2fv(in long location, in boolean transpose, in WebGLFloatArray array);
-        [Custom] void uniformMatrix3fv(in long location, in boolean transpose, in WebGLFloatArray array);
-        [Custom] void uniformMatrix4fv(in long location, in boolean transpose, in WebGLFloatArray array);
+        void uniform1f(in WebGLUniformLocation location, in float x) raises(DOMException);
+        [Custom] void uniform1fv(in WebGLUniformLocation location, in WebGLFloatArray v) raises(DOMException);
+        void uniform1i(in WebGLUniformLocation location, in long x) raises(DOMException);
+        [Custom] void uniform1iv(in WebGLUniformLocation location, in WebGLIntArray v) raises(DOMException);
+        void uniform2f(in WebGLUniformLocation location, in float x, in float y) raises(DOMException);
+        [Custom] void uniform2fv(in WebGLUniformLocation location, in WebGLFloatArray v) raises(DOMException);
+        void uniform2i(in WebGLUniformLocation location, in long x, in long y) raises(DOMException);
+        [Custom] void uniform2iv(in WebGLUniformLocation location, in WebGLIntArray v) raises(DOMException);
+        void uniform3f(in WebGLUniformLocation location, in float x, in float y, in float z) raises(DOMException);
+        [Custom] void uniform3fv(in WebGLUniformLocation location, in WebGLFloatArray v) raises(DOMException);
+        void uniform3i(in WebGLUniformLocation location, in long x, in long y, in long z) raises(DOMException);
+        [Custom] void uniform3iv(in WebGLUniformLocation location, in WebGLIntArray v) raises(DOMException);
+        void uniform4f(in WebGLUniformLocation location, in float x, in float y, in float z, in float w) raises(DOMException);
+        [Custom] void uniform4fv(in WebGLUniformLocation location, in WebGLFloatArray v) raises(DOMException);
+        void uniform4i(in WebGLUniformLocation location, in long x, in long y, in long z, in long w) raises(DOMException);
+        [Custom] void uniform4iv(in WebGLUniformLocation location, in WebGLIntArray v) raises(DOMException);
+
+        [Custom] void uniformMatrix2fv(in WebGLUniformLocation location, in boolean transpose, in WebGLFloatArray array) raises(DOMException);
+        [Custom] void uniformMatrix3fv(in WebGLUniformLocation location, in boolean transpose, in WebGLFloatArray array) raises(DOMException);
+        [Custom] void uniformMatrix4fv(in WebGLUniformLocation location, in boolean transpose, in WebGLFloatArray array) raises(DOMException);
 
         void         useProgram(in WebGLProgram program) raises(DOMException);
         void         validateProgram(in WebGLProgram program) raises(DOMException);
diff --git a/WebCore/html/canvas/WebGLUniformLocation.cpp b/WebCore/html/canvas/WebGLUniformLocation.cpp
new file mode 100644
index 0000000..2157470
--- /dev/null
+++ b/WebCore/html/canvas/WebGLUniformLocation.cpp
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2009 Google 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 COMPUTER, 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 COMPUTER, 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 "config.h"
+
+#if ENABLE(3D_CANVAS)
+
+#include "WebGLUniformLocation.h"
+
+namespace WebCore {
+    
+PassRefPtr<WebGLUniformLocation> WebGLUniformLocation::create(WebGLProgram* program, long location)
+{
+    return adoptRef(new WebGLUniformLocation(program, location));
+}
+
+WebGLUniformLocation::WebGLUniformLocation(WebGLProgram* program, long location)
+    : m_program(program)
+    , m_location(location)
+{
+}
+
+}
+
+#endif // ENABLE(3D_CANVAS)
diff --git a/WebCore/html/canvas/WebGLUniformLocation.h b/WebCore/html/canvas/WebGLUniformLocation.h
new file mode 100644
index 0000000..f9f7a11
--- /dev/null
+++ b/WebCore/html/canvas/WebGLUniformLocation.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2009 Google 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 COMPUTER, 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 COMPUTER, 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 WebGLUniformLocation_h
+#define WebGLUniformLocation_h
+
+#include "CanvasObject.h"
+#include "WebGLProgram.h"
+
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefCounted.h>
+
+namespace WebCore {
+
+class WebGLUniformLocation : public RefCounted<WebGLUniformLocation> {
+public:
+    virtual ~WebGLUniformLocation() { }
+
+    static PassRefPtr<WebGLUniformLocation> create(WebGLProgram* program, long location);
+
+    WebGLProgram* program() const { return m_program.get(); }
+
+    long location() const { return m_location; }
+
+protected:
+    WebGLUniformLocation(WebGLProgram* program, long location);
+
+private:
+    RefPtr<WebGLProgram> m_program;
+    long m_location;
+};
+
+} // namespace WebCore
+
+#endif // WebGLUniformLocation_h
diff --git a/WebCore/html/canvas/WebGLUniformLocation.idl b/WebCore/html/canvas/WebGLUniformLocation.idl
new file mode 100644
index 0000000..b080241
--- /dev/null
+++ b/WebCore/html/canvas/WebGLUniformLocation.idl
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2009 Google 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 COMPUTER, 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 COMPUTER, 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. 
+ */
+
+module html {
+    interface [Conditional=3D_CANVAS] WebGLUniformLocation {
+    };
+}

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list