Implement strict testing criterion for callback function definition
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 23 Mar 2012 04:31:32 +0000 (04:31 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 23 Mar 2012 04:31:32 +0000 (04:31 +0000)
https://bugs.webkit.org/show_bug.cgi?id=80005

Patch by Mao Yujie <yujie.mao@intel.com> on 2012-03-22
Reviewed by Adam Barth.

Source/WebCore:

Callback function should be defined as the function type instead of
the object type.

LayoutTest: fast/dom/MediaStream/argument-types.html

* bindings/scripts/CodeGeneratorJS.pm:
(GenerateParametersCheckExpression):
(GenerateParametersCheck):
* bindings/scripts/CodeGeneratorV8.pm:
(GenerateParametersCheckExpression):
(GenerateParametersCheck):

LayoutTests:

Modify some tests to align with their behavior.

* fast/dom/MediaStream/argument-types-expected.txt:
* fast/dom/MediaStream/script-tests/argument-types.js:
* fast/mediastream/peerconnection-argument-types-expected.txt:
* fast/mediastream/script-tests/argument-types.js:

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

LayoutTests/ChangeLog
LayoutTests/fast/dom/MediaStream/argument-types-expected.txt
LayoutTests/fast/dom/MediaStream/script-tests/argument-types.js
LayoutTests/fast/mediastream/peerconnection-argument-types-expected.txt
LayoutTests/fast/mediastream/script-tests/argument-types.js
Source/WebCore/ChangeLog
Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
Source/WebCore/bindings/scripts/CodeGeneratorV8.pm

index 5043a0a..b0df402 100644 (file)
@@ -1,3 +1,17 @@
+2012-03-22  Mao Yujie  <yujie.mao@intel.com>
+
+        Implement strict testing criterion for callback function definition
+        https://bugs.webkit.org/show_bug.cgi?id=80005
+
+        Reviewed by Adam Barth.
+
+        Modify some tests to align with their behavior.
+
+        * fast/dom/MediaStream/argument-types-expected.txt:
+        * fast/dom/MediaStream/script-tests/argument-types.js:
+        * fast/mediastream/peerconnection-argument-types-expected.txt:
+        * fast/mediastream/script-tests/argument-types.js:
+
 2012-03-22  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
 
         Convert hasGrammarMarker to use Internals interface
index 831201a..cabd23a 100644 (file)
@@ -27,8 +27,8 @@ PASS navigator.webkitGetUserMedia(emptyFunction, emptyFunction) threw exception
 PASS navigator.webkitGetUserMedia("video", "video") threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
 PASS navigator.webkitGetUserMedia("video", undefined) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
 PASS navigator.webkitGetUserMedia("video", null) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
-PASS navigator.webkitGetUserMedia("video", {}) did not throw exception.
-PASS navigator.webkitGetUserMedia("video", objectThrowingException) did not throw exception.
+PASS navigator.webkitGetUserMedia("video", {}) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS navigator.webkitGetUserMedia("video", objectThrowingException) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
 PASS navigator.webkitGetUserMedia("video", true) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
 PASS navigator.webkitGetUserMedia("video", 42) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
 PASS navigator.webkitGetUserMedia("video", Infinity) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
@@ -41,8 +41,8 @@ PASS navigator.webkitGetUserMedia("audio, video user", emptyFunction, undefined)
 PASS navigator.webkitGetUserMedia("audio, video environment", emptyFunction, undefined) did not throw exception.
 PASS navigator.webkitGetUserMedia("video", emptyFunction, "video") threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
 PASS navigator.webkitGetUserMedia("video", emptyFunction, null) did not throw exception.
-PASS navigator.webkitGetUserMedia("video", emptyFunction, {}) did not throw exception.
-PASS navigator.webkitGetUserMedia("video", emptyFunction, objectThrowingException) did not throw exception.
+PASS navigator.webkitGetUserMedia("video", emptyFunction, {}) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS navigator.webkitGetUserMedia("video", emptyFunction, objectThrowingException) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
 PASS navigator.webkitGetUserMedia("video", emptyFunction, true) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
 PASS navigator.webkitGetUserMedia("video", emptyFunction, 42) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
 PASS navigator.webkitGetUserMedia("video", emptyFunction, Infinity) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
index b8105d4..8243ce9 100644 (file)
@@ -62,8 +62,8 @@ test('navigator.webkitGetUserMedia(emptyFunction, emptyFunction)', true, notSupp
 test('navigator.webkitGetUserMedia("video", "video")', true, typeMismatchError);
 test('navigator.webkitGetUserMedia("video", undefined)', true, typeMismatchError);
 test('navigator.webkitGetUserMedia("video", null)', true, typeMismatchError);
-test('navigator.webkitGetUserMedia("video", {})', false);
-test('navigator.webkitGetUserMedia("video", objectThrowingException)', false);
+test('navigator.webkitGetUserMedia("video", {})', true, typeMismatchError);
+test('navigator.webkitGetUserMedia("video", objectThrowingException)', true, typeMismatchError);
 test('navigator.webkitGetUserMedia("video", true)', true, typeMismatchError);
 test('navigator.webkitGetUserMedia("video", 42)', true, typeMismatchError);
 test('navigator.webkitGetUserMedia("video", Infinity)', true, typeMismatchError);
@@ -78,8 +78,8 @@ test('navigator.webkitGetUserMedia("audio, video user", emptyFunction, undefined
 test('navigator.webkitGetUserMedia("audio, video environment", emptyFunction, undefined)', false);
 test('navigator.webkitGetUserMedia("video", emptyFunction, "video")', true, typeMismatchError);
 test('navigator.webkitGetUserMedia("video", emptyFunction, null)', false );
-test('navigator.webkitGetUserMedia("video", emptyFunction, {})', false);
-test('navigator.webkitGetUserMedia("video", emptyFunction, objectThrowingException)', false);
+test('navigator.webkitGetUserMedia("video", emptyFunction, {})', true, typeMismatchError);
+test('navigator.webkitGetUserMedia("video", emptyFunction, objectThrowingException)', true, typeMismatchError);
 test('navigator.webkitGetUserMedia("video", emptyFunction, true)', true, typeMismatchError);
 test('navigator.webkitGetUserMedia("video", emptyFunction, 42)', true, typeMismatchError);
 test('navigator.webkitGetUserMedia("video", emptyFunction, Infinity)', true, typeMismatchError);
index c576cbd..a4c4960 100644 (file)
@@ -45,7 +45,7 @@ PASS new webkitDeprecatedPeerConnection("TURNS NONE",emptyFunction) did not thro
 PASS new webkitDeprecatedPeerConnection("STUN NONE",emptyFunction) did not throw exception.
 PASS new webkitDeprecatedPeerConnection("STUNS NONE",emptyFunction) did not throw exception.
 PASS new webkitDeprecatedPeerConnection("TURN NONE",undefined) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
-PASS new webkitDeprecatedPeerConnection("TURNS NONE",{}) did not throw exception.
+PASS new webkitDeprecatedPeerConnection("TURNS NONE",{}) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
 PASS new webkitDeprecatedPeerConnection("STUN NONE",42) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
 PASS new webkitDeprecatedPeerConnection("STUNS NONE",Infinity) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
 PASS new webkitDeprecatedPeerConnection("STUNS NONE",-Infinity) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
index dd6b444..9d04b2c 100644 (file)
@@ -79,7 +79,7 @@ test('new webkitDeprecatedPeerConnection("TURNS NONE",emptyFunction)',false);
 test('new webkitDeprecatedPeerConnection("STUN NONE",emptyFunction)', false);
 test('new webkitDeprecatedPeerConnection("STUNS NONE",emptyFunction)', false);
 test('new webkitDeprecatedPeerConnection("TURN NONE",undefined)',  true);
-test('new webkitDeprecatedPeerConnection("TURNS NONE",{})', false);
+test('new webkitDeprecatedPeerConnection("TURNS NONE",{})', true);
 test('new webkitDeprecatedPeerConnection("STUN NONE",42)',  true);
 test('new webkitDeprecatedPeerConnection("STUNS NONE",Infinity)', true);
 test('new webkitDeprecatedPeerConnection("STUNS NONE",-Infinity)', true);
index 2a2daf4..e9a222e 100644 (file)
@@ -1,3 +1,22 @@
+2012-03-22  Mao Yujie  <yujie.mao@intel.com>
+
+        Implement strict testing criterion for callback function definition
+        https://bugs.webkit.org/show_bug.cgi?id=80005
+
+        Reviewed by Adam Barth.
+
+        Callback function should be defined as the function type instead of
+        the object type.
+
+        LayoutTest: fast/dom/MediaStream/argument-types.html
+
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (GenerateParametersCheckExpression):
+        (GenerateParametersCheck):
+        * bindings/scripts/CodeGeneratorV8.pm:
+        (GenerateParametersCheckExpression):
+        (GenerateParametersCheck):
+
 2012-03-22  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
 
         Convert hasGrammarMarker to use Internals interface
index 448256b..b0bf67a 100644 (file)
@@ -1231,7 +1231,7 @@ sub GenerateParametersCheckExpression
             $usedArguments{$parameterIndex} = 1;
         } elsif ($parameter->extendedAttributes->{"Callback"}) {
             # For Callbacks only checks if the value is null or object.
-            push(@andExpression, "(${value}.isNull() || ${value}.isObject())");
+            push(@andExpression, "(${value}.isNull() || ${value}.isFunction())");
             $usedArguments{$parameterIndex} = 1;
         } elsif (IsArrayType($type)) {
             # FIXME: Add proper support for T[], T[]?, sequence<T>
@@ -2500,14 +2500,14 @@ sub GenerateParametersCheck
             if ($optional) {
                 push(@$outputArray, "    RefPtr<$argType> $name;\n");
                 push(@$outputArray, "    if (exec->argumentCount() > $argsIndex && !exec->argument($argsIndex).isUndefinedOrNull()) {\n");
-                push(@$outputArray, "        if (!exec->argument($argsIndex).isObject()) {\n");
+                push(@$outputArray, "        if (!exec->argument($argsIndex).isFunction()) {\n");
                 push(@$outputArray, "            setDOMException(exec, TYPE_MISMATCH_ERR);\n");
                 push(@$outputArray, "            return JSValue::encode(jsUndefined());\n");
                 push(@$outputArray, "        }\n");
                 push(@$outputArray, "        $name = ${callbackClassName}::create(asObject(exec->argument($argsIndex)), castedThis->globalObject());\n");
                 push(@$outputArray, "    }\n");
             } else {
-                push(@$outputArray, "    if (exec->argumentCount() <= $argsIndex || !exec->argument($argsIndex).isObject()) {\n");
+                push(@$outputArray, "    if (exec->argumentCount() <= $argsIndex || !exec->argument($argsIndex).isFunction()) {\n");
                 push(@$outputArray, "        setDOMException(exec, TYPE_MISMATCH_ERR);\n");
                 push(@$outputArray, "        return JSValue::encode(jsUndefined());\n");
                 push(@$outputArray, "    }\n");
index 677639e..95c1f30 100644 (file)
@@ -1284,7 +1284,7 @@ sub GenerateParametersCheckExpression
             push(@andExpression, "(${value}->IsNull() || ${value}->IsUndefined() || ${value}->IsString() || ${value}->IsObject())");
         } elsif ($parameter->extendedAttributes->{"Callback"}) {
             # For Callbacks only checks if the value is null or object.
-            push(@andExpression, "(${value}->IsNull() || ${value}->IsObject())");
+            push(@andExpression, "(${value}->IsNull() || ${value}->IsFunction())");
         } elsif (IsArrayType($type)) {
             # FIXME: Add proper support for T[], T[]?, sequence<T>.
             push(@andExpression, "(${value}->IsNull() || ${value}->IsArray())");
@@ -1585,12 +1585,12 @@ sub GenerateParametersCheck
             if ($optional) {
                 $parameterCheckString .= "    RefPtr<" . $parameter->type . "> $parameterName;\n";
                 $parameterCheckString .= "    if (args.Length() > $paramIndex && !args[$paramIndex]->IsNull() && !args[$paramIndex]->IsUndefined()) {\n";
-                $parameterCheckString .= "        if (!args[$paramIndex]->IsObject())\n";
+                $parameterCheckString .= "        if (!args[$paramIndex]->IsFunction())\n";
                 $parameterCheckString .= "            return throwError(TYPE_MISMATCH_ERR);\n";
                 $parameterCheckString .= "        $parameterName = ${className}::create(args[$paramIndex], getScriptExecutionContext());\n";
                 $parameterCheckString .= "    }\n";
             } else {
-                $parameterCheckString .= "    if (args.Length() <= $paramIndex || !args[$paramIndex]->IsObject())\n";
+                $parameterCheckString .= "    if (args.Length() <= $paramIndex || !args[$paramIndex]->IsFunction())\n";
                 $parameterCheckString .= "        return throwError(TYPE_MISMATCH_ERR);\n";
                 $parameterCheckString .= "    RefPtr<" . $parameter->type . "> $parameterName = ${className}::create(args[$paramIndex], getScriptExecutionContext());\n";
             }