Fix too-strict type error exceptions introduced in WebGL bindings
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 22 Sep 2013 07:11:10 +0000 (07:11 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 22 Sep 2013 07:11:10 +0000 (07:11 +0000)
https://bugs.webkit.org/show_bug.cgi?id=121759

Reviewed by Alexey Proskuryakov.

* bindings/js/JSWebGLRenderingContextCustom.cpp:
(WebCore::JSWebGLRenderingContext::getAttachedShaders): Allow undefined
or null without throwing type error.
(WebCore::JSWebGLRenderingContext::getProgramParameter): Ditto.
(WebCore::JSWebGLRenderingContext::getUniform): Ditto.
(WebCore::dataFunctionf): Ditto.
(WebCore::dataFunctioni): Ditto.
(WebCore::dataFunctionMatrix): Ditto.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@156243 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/accessibility/accessibility-node-memory-management.html
Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp

index 49cc2d7..28008e2 100644 (file)
@@ -2,26 +2,27 @@
 <html>
 <body>
 <script src="../resources/js-test-pre.js"></script>
-
 <canvas id="canvas" tabindex="-1"></canvas>
-
 <div id="console"></div>
 <script>
+
+var jsTestIsAsync = true;
+
 description("This test makes sure that AccessibilityNodeObjects are properly detached when the node they point to is deleted.");
 
 if (window.testRunner && window.accessibilityController) {
-    window.testRunner.dumpAsText();
+    testRunner.dumpAsText();
 
     // Create an ordinary button on the page, focus it and get its accessibility role.
     var button = document.createElement('button');
     document.body.appendChild(button);
     button.focus();
-    window.axElement = accessibilityController.focusedElement;
-    window.expectedButtonRole = axElement.role;
+    axElement = accessibilityController.focusedElement;
+    expectedButtonRole = axElement.role;
 
-    // Now remove the node from the tree and get the role of the detached accessibility object.
+    // Now remove the button from the tree and get the role of the detached accessibility object.
     document.body.removeChild(button);
-    window.expectedDetachedRole = axElement.role;
+    expectedDetachedRole = axElement.role;
     shouldBeTrue("expectedButtonRole != expectedDetachedRole");
 
     // This time create a button that's a child of a canvas element. It will be focusable but not rendered.
@@ -31,26 +32,33 @@ if (window.testRunner && window.accessibilityController) {
         var button = document.createElement('button');
         canvas.appendChild(button);
 
-        // Note: focusing the button and using that to get its accessibility object creates an extra
+        // Note: Focusing the button and using that to get its accessibility object creates an extra
         // reference to the button and it won't get deleted when we want it to. So instead we focus the
         // canvas and get its first child.
         canvas.focus();
-        window.axElement = accessibilityController.focusedElement.childAtIndex(0);
+        axElement = accessibilityController.focusedElement.childAtIndex(0);
 
-        window.canvasButtonRole = axElement.role;
+        canvasButtonRole = axElement.role;
         shouldBe("canvasButtonRole", "expectedButtonRole");
 
-        // Now delete the node.
+        // Now delete the last reference to the button.
         canvas.removeChild(button);
     })();
 
-    // Explicitly run garbage collection now; since there are no more references to the button,
-    // the node will be destroyed.
+    setTimeout("finishTest()", 0);
+}
+
+function finishTest()
+{
+    // Explicitly run garbage collection now. Since there are no more references to the button,
+    // it will be destroyed.
     gc();
 
     // Ensure that the accessibility object is detached by checking its role.
-    window.detachedCanvasButtonRole = axElement.role;
+    detachedCanvasButtonRole = axElement.role;
     shouldBe("detachedCanvasButtonRole", "expectedDetachedRole");
+
+    finishJSTest();
 }
 
 </script>
index 0a4555a..3d91546 100644 (file)
@@ -1,3 +1,19 @@
+2013-09-21  Darin Adler  <darin@apple.com>
+
+        Fix too-strict type error exceptions introduced in WebGL bindings
+        https://bugs.webkit.org/show_bug.cgi?id=121759
+
+        Reviewed by Alexey Proskuryakov.
+
+        * bindings/js/JSWebGLRenderingContextCustom.cpp:
+        (WebCore::JSWebGLRenderingContext::getAttachedShaders): Allow undefined
+        or null without throwing type error.
+        (WebCore::JSWebGLRenderingContext::getProgramParameter): Ditto.
+        (WebCore::JSWebGLRenderingContext::getUniform): Ditto.
+        (WebCore::dataFunctionf): Ditto.
+        (WebCore::dataFunctioni): Ditto.
+        (WebCore::dataFunctionMatrix): Ditto.
+
 2013-09-21  Sam Weinig  <sam@webkit.org>
 
         Event and EventTarget interfaces don't need to be store as AtomicStrings
index ca0aedf..052c00a 100644 (file)
@@ -247,7 +247,7 @@ JSValue JSWebGLRenderingContext::getAttachedShaders(ExecState* exec)
     ExceptionCode ec = 0;
     WebGLRenderingContext* context = static_cast<WebGLRenderingContext*>(impl());
     WebGLProgram* program = toWebGLProgram(exec->uncheckedArgument(0));
-    if (!program)
+    if (!program && !exec->uncheckedArgument(0).isUndefinedOrNull())
         return throwTypeError(exec);
     Vector<RefPtr<WebGLShader> > shaders;
     bool succeed = context->getAttachedShaders(program, shaders, ec);
@@ -331,7 +331,7 @@ JSValue JSWebGLRenderingContext::getProgramParameter(ExecState* exec)
     ExceptionCode ec = 0;
     WebGLRenderingContext* context = static_cast<WebGLRenderingContext*>(impl());
     WebGLProgram* program = toWebGLProgram(exec->uncheckedArgument(0));
-    if (!program)
+    if (!program && !exec->uncheckedArgument(0).isUndefinedOrNull())
         return throwTypeError(exec);
     unsigned pname = exec->uncheckedArgument(1).toInt32(exec);
     if (exec->hadException())
@@ -395,10 +395,10 @@ JSValue JSWebGLRenderingContext::getUniform(ExecState* exec)
     ExceptionCode ec = 0;
     WebGLRenderingContext* context = static_cast<WebGLRenderingContext*>(impl());
     WebGLProgram* program = toWebGLProgram(exec->uncheckedArgument(0));
-    if (!program)
+    if (!program && !exec->uncheckedArgument(0).isUndefinedOrNull())
         return throwTypeError(exec);
     WebGLUniformLocation* location = toWebGLUniformLocation(exec->uncheckedArgument(1));
-    if (!location)
+    if (!location && !exec->uncheckedArgument(1).isUndefinedOrNull())
         return throwTypeError(exec);
     WebGLGetInfo info = context->getUniform(program, location, ec);
     if (ec) {
@@ -469,7 +469,7 @@ static JSC::JSValue dataFunctionf(DataFunctionToCall f, JSC::ExecState* exec, We
     
     if (functionForUniform(f)) {
         location = toWebGLUniformLocation(exec->uncheckedArgument(0));
-        if (!location)
+        if (!location && !exec->uncheckedArgument(0).isUndefinedOrNull())
             return throwTypeError(exec);
     } else
         index = exec->uncheckedArgument(0).toInt32(exec);
@@ -555,7 +555,7 @@ static JSC::JSValue dataFunctioni(DataFunctionToCall f, JSC::ExecState* exec, We
         return exec->vm().throwException(exec, createNotEnoughArgumentsError(exec));
 
     WebGLUniformLocation* location = toWebGLUniformLocation(exec->uncheckedArgument(0));
-    if (!location)
+    if (!location && !exec->uncheckedArgument(0).isUndefinedOrNull())
         return throwTypeError(exec);
   
     RefPtr<Int32Array> webGLArray = toInt32Array(exec->uncheckedArgument(1));
@@ -615,7 +615,7 @@ static JSC::JSValue dataFunctionMatrix(DataFunctionMatrixToCall f, JSC::ExecStat
         return exec->vm().throwException(exec, createNotEnoughArgumentsError(exec));
 
     WebGLUniformLocation* location = toWebGLUniformLocation(exec->uncheckedArgument(0));
-    if (!location)
+    if (!location && !exec->uncheckedArgument(0).isUndefinedOrNull())
         return throwTypeError(exec);
 
     bool transpose = exec->uncheckedArgument(1).toBoolean(exec);