Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(166)

Unified Diff: Source/bindings/scripts/code_generator_v8.pm

Issue 99083002: WIP: Migrate generated bindings to new ExceptionState constructor. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase. Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 2840c0842c190afbb02450705305cbc58dcab746..3392def01f3547280fa6520b8d5e6cdebcf1765d 100644
--- a/Source/bindings/scripts/code_generator_v8.pm
+++ b/Source/bindings/scripts/code_generator_v8.pm
@@ -1276,6 +1276,7 @@ sub GenerateDomainSafeFunctionSetter
{
my $interface = shift;
+ my $interfaceName = $interface->name();
my $implClassName = GetImplName($interface);
my $v8ClassName = GetV8ClassName($interface);
@@ -1288,7 +1289,8 @@ static void ${implClassName}OriginSafeMethodSetter(v8::Local<v8::String> name, v
if (holder.IsEmpty())
return;
${implClassName}* imp = ${v8ClassName}::toNative(holder);
- ExceptionState exceptionState(info.Holder(), info.GetIsolate());
+ v8::String::Utf8Value attributeName(name);
+ ExceptionState exceptionState(ExceptionState::SetterContext, *attributeName, "${interfaceName}", info.Holder(), info.GetIsolate());
if (!BindingSecurity::shouldAllowAccessToFrame(imp->frame(), exceptionState)) {
exceptionState.throwIfNeeded();
return;
@@ -1542,7 +1544,7 @@ END
if ($useExceptions || $attribute->extendedAttributes->{"CheckSecurity"}) {
AddToImplIncludes("bindings/v8/ExceptionMessages.h");
AddToImplIncludes("bindings/v8/ExceptionState.h");
- $code .= " ExceptionState exceptionState(info.Holder(), info.GetIsolate());\n";
+ $code .= " ExceptionState exceptionState(ExceptionState::GetterContext, \"${attrName}\", \"${interfaceName}\" ,info.Holder(), info.GetIsolate());\n";
}
# Generate security checks if necessary
@@ -1800,6 +1802,7 @@ sub GenerateReplaceableAttributeSetter
{
my $interface = shift;
+ my $interfaceName = $interface->name();
my $implClassName = GetImplName($interface);
my $v8ClassName = GetV8ClassName($interface);
@@ -1812,7 +1815,8 @@ END
AddToImplIncludes("bindings/v8/BindingSecurity.h");
$code .= <<END;
${implClassName}* imp = ${v8ClassName}::toNative(info.Holder());
- ExceptionState exceptionState(info.Holder(), info.GetIsolate());
+ v8::String::Utf8Value attributeName(name);
+ ExceptionState exceptionState(ExceptionState::SetterContext, *attributeName, "${interfaceName}", info.Holder(), info.GetIsolate());
if (!BindingSecurity::shouldAllowAccessToFrame(imp->frame(), exceptionState)) {
exceptionState.throwIfNeeded();
return;
@@ -1926,6 +1930,18 @@ sub GenerateNormalAttributeSetter
}
$code .= "{\n";
+ my $raisesException = $attribute->extendedAttributes->{"RaisesException"};
+ my $useExceptions = 1 if $raisesException && ($raisesException eq "VALUE_IS_MISSING" or $raisesException eq "Setter");
+
+ # We throw exceptions using 'ExceptionState' if the attribute explicitly claims that exceptions
+ # may be raised, or if a strict type check might fail, or if we're dealing with SVG, which does
+ # strange things with tearoffs and read-only wrappers.
+ if ($useExceptions or $attribute->extendedAttributes->{"StrictTypeChecking"} or GetSVGTypeNeedingTearOff($interfaceName) or GetSVGTypeNeedingTearOff($attrType)) {
+ AddToImplIncludes("bindings/v8/ExceptionMessages.h");
+ AddToImplIncludes("bindings/v8/ExceptionState.h");
+ $code .= " ExceptionState exceptionState(ExceptionState::SetterContext, \"${attrName}\", \"${interfaceName}\", info.Holder(), info.GetIsolate());\n";
+ }
+
# If the "StrictTypeChecking" extended attribute is present, and the attribute's type is an
# interface type, then if the incoming value does not implement that interface, a TypeError is
# thrown rather than silently passing NULL to the C++ code.
@@ -1935,7 +1951,8 @@ sub GenerateNormalAttributeSetter
my $argType = $attribute->type;
if (IsWrapperType($argType)) {
$code .= " if (!isUndefinedOrNull(jsValue) && !V8${argType}::hasInstance(jsValue, info.GetIsolate(), worldType(info.GetIsolate()))) {\n";
- $code .= " throwTypeError(ExceptionMessages::failedToSet(\"${attrName}\", \"${interfaceName}\", \"The provided value is not of type '${argType}'.\"), info.GetIsolate());\n";
+ $code .= " exceptionState.throwTypeError(\"The provided value is not of type '${argType}'.\");\n";
+ $code .= " exceptionState.throwIfNeeded();\n";
$code .= " return;\n";
$code .= " }\n";
}
@@ -1949,11 +1966,10 @@ sub GenerateNormalAttributeSetter
$svgNativeType* imp = ${v8ClassName}::toNative(info.Holder());
END
} else {
- AddToImplIncludes("bindings/v8/ExceptionMessages.h");
- AddToImplIncludes("bindings/v8/ExceptionState.h");
$code .= " $svgNativeType* wrapper = ${v8ClassName}::toNative(info.Holder());\n";
$code .= " if (wrapper->isReadOnly()) {\n";
- $code .= " setDOMException(NoModificationAllowedError, ExceptionMessages::failedToSet(\"${attrName}\", \"${interfaceName}\", \"The attribute is read-only.\"), info.GetIsolate());\n";
+ $code .= " exceptionState.throwDOMException(NoModificationAllowedError, \"The attribute is read-only.\");\n";
+ $code .= " exceptionState.throwIfNeeded();\n";
$code .= " return;\n";
$code .= " }\n";
$code .= " $svgWrappedNativeType& impInstance = wrapper->propertyReference();\n";
@@ -2045,22 +2061,14 @@ END
if ($returnSvgNativeType) {
$code .= <<END;
if (!$expression) {
- throwTypeError(ExceptionMessages::failedToSet(\"${attrName}\", \"${interfaceName}\", \"The provided value is not of type '$returnType'.\"), info.GetIsolate());
+ exceptionState.throwTypeError(\"The provided value is not of type '$returnType'.\");
+ exceptionState.throwIfNeeded();
return;
}
END
$expression = $expression . "->propertyReference()";
}
- my $raisesException = $attribute->extendedAttributes->{"RaisesException"};
- my $useExceptions = 1 if $raisesException && ($raisesException eq "VALUE_IS_MISSING" or $raisesException eq "Setter");
-
- if ($useExceptions) {
- AddToImplIncludes("bindings/v8/ExceptionMessages.h");
- AddToImplIncludes("bindings/v8/ExceptionState.h");
- $code .= " ExceptionState exceptionState(info.Holder(), info.GetIsolate());\n";
- }
-
if ($attribute->type eq "EventHandler") {
my $implementedBy = $attribute->extendedAttributes->{"ImplementedBy"};
my $implementedByImplName;
@@ -2331,6 +2339,7 @@ sub GenerateFunction
my $implClassName = GetImplName($interface);
my $v8ClassName = GetV8ClassName($interface);
my $name = $function->name;
+ my $unoverloadedName = $function->name;
my $implName = GetImplName($function);
my $funcExt = $function->extendedAttributes;
@@ -2349,19 +2358,30 @@ sub GenerateFunction
$code .= "static void ${name}Method${forMainWorldSuffix}(const v8::FunctionCallbackInfo<v8::Value>& info)\n";
$code .= "{\n";
- if ($name eq "addEventListener" || $name eq "removeEventListener") {
+ # We throw exceptions using 'ExceptionState' if the function explicitly claims that exceptions
+ # may be raised, or for event listeners, or for security-checking, and for weird SVG stuff.
+ my $isEventListener = $name eq "addEventListener" || $name eq "removeEventListener";
+ my $isSecurityCheckNecessary = $interface->extendedAttributes->{"CheckSecurity"} && !$function->extendedAttributes->{"DoNotCheckSecurity"};
+ my $raisesExceptions = $function->extendedAttributes->{"RaisesException"};
+ my ($svgPropertyType, $svgListPropertyType, $svgNativeType) = GetSVGPropertyTypes($interfaceName);
+ my $isNonListSVGType = $svgNativeType && !($interfaceName =~ /List$/);
+
+ if ($raisesExceptions || $isEventListener || $isSecurityCheckNecessary || $isNonListSVGType) {
+ AddToImplIncludes("bindings/v8/ExceptionState.h");
+ $code .= " ExceptionState exceptionState(ExceptionState::ExecutionContext, \"${unoverloadedName}\", \"${interfaceName}\", info.Holder(), info.GetIsolate());\n";
+ }
+
+ if ($isEventListener) {
my $lookupType = ($name eq "addEventListener") ? "OrCreate" : "Only";
my $passRefPtrHandling = ($name eq "addEventListener") ? "" : ".get()";
my $hiddenDependencyAction = ($name eq "addEventListener") ? "create" : "remove";
AddToImplIncludes("bindings/v8/BindingSecurity.h");
- AddToImplIncludes("bindings/v8/ExceptionState.h");
AddToImplIncludes("bindings/v8/V8EventListenerList.h");
AddToImplIncludes("core/frame/DOMWindow.h");
$code .= <<END;
EventTarget* impl = ${v8ClassName}::toNative(info.Holder());
if (DOMWindow* window = impl->toDOMWindow()) {
- ExceptionState exceptionState(info.Holder(), info.GetIsolate());
if (!BindingSecurity::shouldAllowAccessToFrame(window->frame(), exceptionState)) {
exceptionState.throwIfNeeded();
return;
@@ -2397,19 +2417,16 @@ END
return;
}
- my ($svgPropertyType, $svgListPropertyType, $svgNativeType) = GetSVGPropertyTypes($interfaceName);
-
if ($svgNativeType) {
my $nativeClassName = GetNativeType($interfaceName);
if ($interfaceName =~ /List$/) {
$code .= " $nativeClassName imp = ${v8ClassName}::toNative(info.Holder());\n";
} else {
- AddToImplIncludes("bindings/v8/ExceptionMessages.h");
- AddToImplIncludes("bindings/v8/ExceptionState.h");
AddToImplIncludes("core/dom/ExceptionCode.h");
$code .= " $nativeClassName wrapper = ${v8ClassName}::toNative(info.Holder());\n";
$code .= " if (wrapper->isReadOnly()) {\n";
- $code .= " setDOMException(NoModificationAllowedError, ExceptionMessages::failedToExecute(\"${name}\", \"${interfaceName}\", \"The object is read-only.\"), info.GetIsolate());\n";
+ $code .= " exceptionState.throwDOMException(NoModificationAllowedError, \"The object is read-only.\");\n";
+ $code .= " exceptionState.throwIfNeeded();\n";
$code .= " return;\n";
$code .= " }\n";
my $svgWrappedNativeType = GetSVGWrappedTypeNeedingTearOff($interfaceName);
@@ -2424,15 +2441,8 @@ END
$code .= GenerateCustomElementInvocationScopeIfNeeded($funcExt);
- my $raisesExceptions = $function->extendedAttributes->{"RaisesException"} || ($interface->extendedAttributes->{"CheckSecurity"} && !$function->extendedAttributes->{"DoNotCheckSecurity"});
- if ($raisesExceptions) {
- AddToImplIncludes("bindings/v8/ExceptionMessages.h");
- AddToImplIncludes("bindings/v8/ExceptionState.h");
- $code .= " ExceptionState exceptionState(info.Holder(), info.GetIsolate());\n";
- }
-
# Check domain security if needed
- if ($interface->extendedAttributes->{"CheckSecurity"} && !$function->extendedAttributes->{"DoNotCheckSecurity"}) {
+ if ($isSecurityCheckNecessary) {
# We have not find real use cases yet.
AddToImplIncludes("bindings/v8/BindingSecurity.h");
$code .= <<END;
« no previous file with comments | « LayoutTests/webaudio/dom-exceptions-expected.txt ('k') | Source/bindings/tests/results/V8SupportTestInterface.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698