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 a0db395f7a486008d6ec09599360ebeb4fdf4743..b5e5a902a4f68871187bf3313a6d8d1e0b71116d 100644 |
--- a/Source/bindings/scripts/code_generator_v8.pm |
+++ b/Source/bindings/scripts/code_generator_v8.pm |
@@ -1635,8 +1635,16 @@ END |
} elsif ($attribute->type eq "EventHandler") { |
AddToImplIncludes("bindings/v8/V8AbstractEventListener.h"); |
my $getterFunc = ToMethodName($attribute->name); |
+ my $getterString; |
# FIXME: Pass the main world ID for main-world-only getters. |
- $code .= " EventListener* jsValue = imp->${getterFunc}(isolatedWorldForIsolate(info.GetIsolate()));\n"; |
+ my $implementedBy = $attribute->extendedAttributes->{"ImplementedBy"}; |
+ if ($implementedBy) { |
+ my $implementedByImplName = GetImplNameFromImplementedBy($implementedBy); |
+ $getterString = "${implementedByImplName}::${getterFunc}(imp, isolatedWorldForIsolate(info.GetIsolate()))"; |
+ } else { |
+ $getterString = "imp->${getterFunc}(isolatedWorldForIsolate(info.GetIsolate()))"; |
+ } |
+ $code .= " EventListener* jsValue = ${getterString};\n"; |
$code .= " v8SetReturnValue(info, jsValue ? v8::Handle<v8::Value>(V8AbstractEventListener::cast(jsValue)->getListenerObject(imp->executionContext())) : v8::Handle<v8::Value>(v8::Null(info.GetIsolate())));\n"; |
} else { |
my $nativeValue = NativeToJSValue($attribute->type, $attribute->extendedAttributes, $expression, " ", "", "info.Holder()", "info.GetIsolate()", "info", "imp", $forMainWorldSuffix, "return"); |
@@ -1955,15 +1963,30 @@ END |
if ($attribute->type eq "EventHandler") { |
my $implSetterFunctionName = FirstLetterToUpperCase($attrName); |
- if (!InheritsInterface($interface, "Node")) { |
- my $attrImplName = GetImplName($attribute); |
- $code .= " transferHiddenDependency(info.Holder(), imp->${attrImplName}(isolatedWorldForIsolate(info.GetIsolate())), jsValue, ${v8ClassName}::eventListenerCacheIndex, info.GetIsolate());\n"; |
- } |
- if (($interfaceName eq "Window" or $interfaceName eq "WorkerGlobalScope") and $attribute->name eq "onerror") { |
- AddToImplIncludes("bindings/v8/V8ErrorHandler.h"); |
- $code .= " imp->set$implSetterFunctionName(V8EventListenerList::findOrCreateWrapper<V8ErrorHandler>(jsValue, true, info.GetIsolate()), isolatedWorldForIsolate(info.GetIsolate()));\n"; |
+ my $implementedBy = $attribute->extendedAttributes->{"ImplementedBy"}; |
+ if ($implementedBy) { |
+ my $implementedByImplName = GetImplNameFromImplementedBy($implementedBy); |
+ if (!InheritsInterface($interface, "Node")) { |
+ my $attrImplName = GetImplName($attribute); |
+ $code .= " transferHiddenDependency(info.Holder(), ${implementedByImplName}::${attrImplName}(imp, isolatedWorldForIsolate(info.GetIsolate())), jsValue, ${v8ClassName}::eventListenerCacheIndex, info.GetIsolate());\n"; |
+ } |
+ if (($interfaceName eq "Window" or $interfaceName eq "WorkerGlobalScope") and $attribute->name eq "onerror") { |
+ AddToImplIncludes("bindings/v8/V8ErrorHandler.h"); |
+ $code .= " ${implementedByImplName}::set$implSetterFunctionName(imp, V8EventListenerList::findOrCreateWrapper<V8ErrorHandler>(jsValue, true, info.GetIsolate()), isolatedWorldForIsolate(info.GetIsolate()));\n"; |
+ } else { |
+ $code .= " ${implementedByImplName}::set$implSetterFunctionName(imp, V8EventListenerList::getEventListener(jsValue, true, ListenerFindOrCreate), isolatedWorldForIsolate(info.GetIsolate()));\n"; |
+ } |
} else { |
Nils Barth (inactive)
2013/10/24 02:41:39
You might be able to avoid having multiple branche
|
- $code .= " imp->set$implSetterFunctionName(V8EventListenerList::getEventListener(jsValue, true, ListenerFindOrCreate), isolatedWorldForIsolate(info.GetIsolate()));\n"; |
+ if (!InheritsInterface($interface, "Node")) { |
Nils Barth (inactive)
2013/10/24 02:41:39
I think you can make this section simpler by havin
|
+ my $attrImplName = GetImplName($attribute); |
+ $code .= " transferHiddenDependency(info.Holder(), imp->${attrImplName}(isolatedWorldForIsolate(info.GetIsolate())), jsValue, ${v8ClassName}::eventListenerCacheIndex, info.GetIsolate());\n"; |
+ } |
+ if (($interfaceName eq "Window" or $interfaceName eq "WorkerGlobalScope") and $attribute->name eq "onerror") { |
+ AddToImplIncludes("bindings/v8/V8ErrorHandler.h"); |
+ $code .= " imp->set$implSetterFunctionName(V8EventListenerList::findOrCreateWrapper<V8ErrorHandler>(jsValue, true, info.GetIsolate()), isolatedWorldForIsolate(info.GetIsolate()));\n"; |
+ } else { |
+ $code .= " imp->set$implSetterFunctionName(V8EventListenerList::getEventListener(jsValue, true, ListenerFindOrCreate), isolatedWorldForIsolate(info.GetIsolate()));\n"; |
+ } |
} |
} else { |
my ($functionName, @arguments) = SetterExpression($interfaceName, $attribute); |