Index: Source/bindings/scripts/code_generator_v8.pm |
diff --git a/Source/bindings/scripts/code_generator_v8.pm b/Source/bindings/scripts/code_generator_v8.pm |
index a0a5565bfee9821123c4808b9a22969be0671c31..4e120c376667f005afb40a42fdcc5adb1eec3ca8 100644 |
--- a/Source/bindings/scripts/code_generator_v8.pm |
+++ b/Source/bindings/scripts/code_generator_v8.pm |
@@ -2166,7 +2166,7 @@ sub GenerateParametersCheckExpression |
# FIXME: Implement WebIDL overload resolution algorithm. |
if ($type eq "DOMString") { |
if ($parameter->extendedAttributes->{"StrictTypeChecking"}) { |
- push(@andExpression, "${value}->IsNull() || ${value}->IsUndefined() || ${value}->IsString() || ${value}->IsObject()"); |
+ push(@andExpression, "isUndefinedOrNull(${value}) || ${value}->IsString() || ${value}->IsObject()"); |
} |
} elsif (IsCallbackInterface($parameter->type)) { |
# For Callbacks only checks if the value is null or object. |
@@ -2368,7 +2368,7 @@ sub GenerateFunction |
my $isNonListSVGType = $svgNativeType && !($interfaceName =~ /List$/); |
my $hasExceptionState = 0; |
- if ($raisesExceptions || $isEventListener || $isSecurityCheckNecessary || $isNonListSVGType) { |
+ if ($raisesExceptions || $isEventListener || $isSecurityCheckNecessary || $isNonListSVGType || HasSerializedScriptValueParameter($function)) { |
$code .= " ExceptionState exceptionState(ExceptionState::ExecutionContext, \"${unoverloadedName}\", \"${interfaceName}\", info.Holder(), info.GetIsolate());\n"; |
$hasExceptionState = 1; |
} |
@@ -2454,7 +2454,7 @@ END |
END |
} |
- my ($parameterCheckString, $paramIndex, %replacements) = GenerateParametersCheck($function, $interface, $forMainWorldSuffix); |
+ my ($parameterCheckString, $paramIndex, %replacements) = GenerateParametersCheck($function, $interface, $forMainWorldSuffix, $hasExceptionState); |
$code .= $parameterCheckString; |
# Build the function call string. |
@@ -2543,6 +2543,7 @@ sub GenerateParametersCheck |
my $function = shift; |
my $interface = shift; |
my $forMainWorldSuffix = shift; |
+ my $hasExceptionState = shift; |
my $style = shift || "new"; |
my $functionName = $function->name; |
@@ -2576,9 +2577,14 @@ END |
AddToImplIncludes("$v8ClassName.h"); |
if ($parameter->isOptional) { |
$parameterCheckString .= " OwnPtr<" . $parameter->type . "> $parameterName;\n"; |
- $parameterCheckString .= " if (info.Length() > $paramIndex && !info[$paramIndex]->IsNull() && !info[$paramIndex]->IsUndefined()) {\n"; |
+ $parameterCheckString .= " if (info.Length() > $paramIndex && !isUndefinedOrNull(info[$paramIndex])) {\n"; |
$parameterCheckString .= " if (!info[$paramIndex]->IsFunction()) {\n"; |
- $parameterCheckString .= " throwTypeError(ExceptionMessages::failedToExecute(\"$functionName\", \"$interfaceName\", \"The callback provided as parameter $humanFriendlyIndex is not a function.\"), info.GetIsolate());\n"; |
+ if ($hasExceptionState) { |
+ $parameterCheckString .= " exceptionState.throwTypeError(\"The callback provided as parameter $humanFriendlyIndex is not a function.\");\n"; |
+ $parameterCheckString .= " exceptionState.throwIfNeeded();\n"; |
+ } else { |
+ $parameterCheckString .= " throwTypeError(ExceptionMessages::failedToExecute(\"$functionName\", \"$interfaceName\", \"The callback provided as parameter $humanFriendlyIndex is not a function.\"), info.GetIsolate());\n"; |
+ } |
$parameterCheckString .= " return;\n"; |
$parameterCheckString .= " }\n"; |
$parameterCheckString .= " $parameterName = ${v8ClassName}::create(v8::Handle<v8::Function>::Cast(info[$paramIndex]), getExecutionContext());\n"; |
@@ -2591,7 +2597,12 @@ END |
$parameterCheckString .= "!info[$paramIndex]->IsFunction()"; |
} |
$parameterCheckString .= ") {\n"; |
- $parameterCheckString .= " throwTypeError(ExceptionMessages::failedToExecute(\"$functionName\", \"$interfaceName\", \"The callback provided as parameter $humanFriendlyIndex is not a function.\"), info.GetIsolate());\n"; |
+ if ($hasExceptionState) { |
+ $parameterCheckString .= " exceptionState.throwTypeError(\"The callback provided as parameter $humanFriendlyIndex is not a function.\");\n"; |
+ $parameterCheckString .= " exceptionState.throwIfNeeded();\n"; |
+ } else { |
+ $parameterCheckString .= " throwTypeError(ExceptionMessages::failedToExecute(\"$functionName\", \"$interfaceName\", \"The callback provided as parameter $humanFriendlyIndex is not a function.\"), info.GetIsolate());\n"; |
+ } |
$parameterCheckString .= " return;\n"; |
$parameterCheckString .= " }\n"; |
$parameterCheckString .= " OwnPtr<" . $parameter->type . "> $parameterName = "; |
@@ -2607,9 +2618,8 @@ END |
$parameterCheckString .= " $parameterName = clampTo<$idlType>($nativeValue);\n"; |
} elsif ($parameter->type eq "SerializedScriptValue") { |
AddToImplIncludes("bindings/v8/SerializedScriptValue.h"); |
- $parameterCheckString .= " bool ${parameterName}DidThrow = false;\n"; |
- $parameterCheckString .= " $nativeType $parameterName = SerializedScriptValue::create(info[$paramIndex], 0, 0, ${parameterName}DidThrow, info.GetIsolate());\n"; |
- $parameterCheckString .= " if (${parameterName}DidThrow)\n"; |
+ $parameterCheckString .= " $nativeType $parameterName = SerializedScriptValue::create(info[$paramIndex], 0, 0, exceptionState, info.GetIsolate());\n"; |
+ $parameterCheckString .= " if (exceptionState.throwIfNeeded())\n"; |
$parameterCheckString .= " return;\n"; |
} elsif ($parameter->isVariadic) { |
my $nativeElementType = GetNativeType($parameter->type); |
@@ -2622,7 +2632,12 @@ END |
$parameterCheckString .= " Vector<$nativeElementType> $parameterName;\n"; |
$parameterCheckString .= " for (int i = $paramIndex; i < info.Length(); ++i) {\n"; |
$parameterCheckString .= " if (!V8${argType}::hasInstance(info[i], info.GetIsolate(), worldType(info.GetIsolate()))) {\n"; |
- $parameterCheckString .= " throwTypeError(ExceptionMessages::failedToExecute(\"$functionName\", \"$interfaceName\", \"parameter $humanFriendlyIndex is not of type \'$argType\'.\"), info.GetIsolate());\n"; |
+ if ($hasExceptionState) { |
+ $parameterCheckString .= " exceptionState.throwTypeError(\"parameter $humanFriendlyIndex is not of type \'$argType\'.\");\n"; |
+ $parameterCheckString .= " exceptionState.throwIfNeeded();\n"; |
+ } else { |
+ $parameterCheckString .= " throwTypeError(ExceptionMessages::failedToExecute(\"$functionName\", \"$interfaceName\", \"parameter $humanFriendlyIndex is not of type \'$argType\'.\"), info.GetIsolate());\n"; |
+ } |
$parameterCheckString .= " return;\n"; |
$parameterCheckString .= " }\n"; |
$parameterCheckString .= " $parameterName.append(V8${argType}::toNative(v8::Handle<v8::Object>::Cast(info[i])));\n"; |
@@ -2650,7 +2665,12 @@ END |
my $enumValidationExpression = join(" || ", @validEqualities); |
$parameterCheckString .= " String string = $parameterName;\n"; |
$parameterCheckString .= " if (!($enumValidationExpression)) {\n"; |
- $parameterCheckString .= " throwTypeError(ExceptionMessages::failedToExecute(\"$functionName\", \"$interfaceName\", \"parameter $humanFriendlyIndex (\'\" + string + \"\') is not a valid enum value.\"), info.GetIsolate());\n"; |
+ if ($hasExceptionState) { |
+ $parameterCheckString .= " exceptionState.throwTypeError(\"parameter $humanFriendlyIndex (\'\" + string + \"\') is not a valid enum value.\");\n"; |
+ $parameterCheckString .= " exceptionState.throwIfNeeded();\n"; |
+ } else { |
+ $parameterCheckString .= " throwTypeError(ExceptionMessages::failedToExecute(\"$functionName\", \"$interfaceName\", \"parameter $humanFriendlyIndex (\'\" + string + \"\') is not a valid enum value.\"), info.GetIsolate());\n"; |
+ } |
$parameterCheckString .= " return;\n"; |
$parameterCheckString .= " }\n"; |
} |
@@ -2666,7 +2686,12 @@ END |
my $argType = $parameter->type; |
if (IsWrapperType($argType)) { |
$parameterCheckString .= " if (info.Length() > $paramIndex && !isUndefinedOrNull($argValue) && !V8${argType}::hasInstance($argValue, info.GetIsolate(), worldType(info.GetIsolate()))) {\n"; |
- $parameterCheckString .= " throwTypeError(ExceptionMessages::failedToExecute(\"$functionName\", \"$interfaceName\", \"parameter $humanFriendlyIndex is not of type \'$argType\'.\"), info.GetIsolate());\n"; |
+ if ($hasExceptionState) { |
+ $parameterCheckString .= " exceptionState.throwTypeError(\"parameter $humanFriendlyIndex is not of type \'$argType\'.\");\n"; |
+ $parameterCheckString .= " exceptionState.throwIfNeeded();\n"; |
+ }else { |
+ $parameterCheckString .= " throwTypeError(ExceptionMessages::failedToExecute(\"$functionName\", \"$interfaceName\", \"parameter $humanFriendlyIndex is not of type \'$argType\'.\"), info.GetIsolate());\n"; |
+ } |
$parameterCheckString .= " return;\n"; |
$parameterCheckString .= " }\n"; |
} |
@@ -2678,7 +2703,10 @@ END |
$parameterCheckString .= JSValueToNativeStatement($parameter->type, $parameter->extendedAttributes, $humanFriendlyIndex, $jsValue, $parameterName, " ", "info.GetIsolate()"); |
if ($nativeType eq 'Dictionary' or $nativeType eq 'ScriptPromise') { |
$parameterCheckString .= " if (!$parameterName.isUndefinedOrNull() && !$parameterName.isObject()) {\n"; |
- if ($functionName eq "Constructor") { |
+ if ($hasExceptionState) { |
+ $parameterCheckString .= " exceptionState.throwTypeError(\"parameter ${humanFriendlyIndex} ('${parameterName}') is not an object.\");\n"; |
+ $parameterCheckString .= " exceptionState.throwIfNeeded();\n"; |
+ } elsif ($functionName eq "Constructor") { |
$parameterCheckString .= " throwTypeError(ExceptionMessages::failedToConstruct(\"$interfaceName\", \"parameter ${humanFriendlyIndex} ('${parameterName}') is not an object.\"), info.GetIsolate());\n"; |
} else { |
$parameterCheckString .= " throwTypeError(ExceptionMessages::failedToExecute(\"$functionName\", \"$interfaceName\", \"parameter ${humanFriendlyIndex} ('${parameterName}') is not an object.\"), info.GetIsolate());\n"; |
@@ -2747,7 +2775,7 @@ sub GenerateSingleConstructorCallback |
} |
my $constructorRaisesException = $interface->extendedAttributes->{"RaisesException"} && $interface->extendedAttributes->{"RaisesException"} eq "Constructor"; |
- my $raisesExceptions = $function->extendedAttributes->{"RaisesException"} || $constructorRaisesException; |
+ my $raisesExceptions = $function->extendedAttributes->{"RaisesException"} || $constructorRaisesException || HasSerializedScriptValueParameter($function); |
my @beforeArgumentList; |
my @afterArgumentList; |
@@ -2767,7 +2795,7 @@ END |
} |
# FIXME: Currently [Constructor(...)] does not yet support optional arguments without [Default=...] |
- my ($parameterCheckString, $paramIndex, %replacements) = GenerateParametersCheck($function, $interface, ""); |
+ my ($parameterCheckString, $paramIndex, %replacements) = GenerateParametersCheck($function, $interface, "", $raisesExceptions); |
$code .= $parameterCheckString; |
if ($interface->extendedAttributes->{"ConstructorCallWith"}) { |
@@ -2955,7 +2983,7 @@ END |
AddToImplIncludes("bindings/v8/SerializedScriptValue.h"); |
} |
if (@anyAttributeNames && $interface->name ne 'ErrorEvent') { |
- # If we're in an isolated world, create a SerializedScriptValue andi |
+ # If we're in an isolated world, create a SerializedScriptValue and |
# store it in the event for later cloning if the property is accessed |
# from another world. |
# The main world case is handled lazily (in Custom code). |
@@ -3041,7 +3069,7 @@ sub GenerateNamedConstructor |
my $implClassName = GetImplName($interface); |
my $v8ClassName = GetV8ClassName($interface); |
my $constructorRaisesException = $interface->extendedAttributes->{"RaisesException"} && $interface->extendedAttributes->{"RaisesException"} eq "Constructor"; |
- my $raisesExceptions = $function->extendedAttributes->{"RaisesException"} || $constructorRaisesException; |
+ my $raisesExceptions = $function->extendedAttributes->{"RaisesException"} || $constructorRaisesException || HasSerializedScriptValueParameter($function); |
my $maybeObserveFeature = GenerateFeatureObservation($function->extendedAttributes->{"MeasureAs"}); |
my $maybeDeprecateFeature = GenerateDeprecationNotification($function->extendedAttributes->{"DeprecateAs"}); |
@@ -3089,7 +3117,7 @@ END |
my $hasExceptionState = $raisesExceptions; |
$code .= GenerateArgumentsCountCheck($function, $interface, $hasExceptionState); |
- my ($parameterCheckString, $paramIndex, %replacements) = GenerateParametersCheck($function, $interface); |
+ my ($parameterCheckString, $paramIndex, %replacements) = GenerateParametersCheck($function, $interface, "", $raisesExceptions); |
$code .= $parameterCheckString; |
push(@beforeArgumentList, "*document"); |
@@ -6343,4 +6371,16 @@ sub NeedsSpecialWrap |
return 0; |
} |
+sub HasSerializedScriptValueParameter |
+{ |
+ my $function = shift; |
+ |
+ foreach my $parameter (@{$function->parameters}) { |
+ if ($parameter->type eq "SerializedScriptValue") { |
+ return 1; |
+ } |
+ } |
+ return 0; |
+} |
+ |
1; |