Index: Source/bindings/scripts/deprecated_code_generator_v8.pm |
diff --git a/Source/bindings/scripts/deprecated_code_generator_v8.pm b/Source/bindings/scripts/deprecated_code_generator_v8.pm |
index ba06614be71ae0c6d679f3dd411a8aeb3f48eee1..6a1a1d58729b20a1ae80a4ed0b7ab6183b0555db 100644 |
--- a/Source/bindings/scripts/deprecated_code_generator_v8.pm |
+++ b/Source/bindings/scripts/deprecated_code_generator_v8.pm |
@@ -2650,6 +2650,13 @@ sub GenerateEventConstructor |
my $implClassName = GetImplName($interface); |
my $v8ClassName = GetV8ClassName($interface); |
+ my @anyAttributeNames; |
+ foreach my $attribute (@{$interface->attributes}) { |
+ if ($attribute->type eq "any") { |
+ push(@anyAttributeNames, $attribute->name); |
+ } |
+ } |
+ |
AddToImplIncludes("bindings/v8/Dictionary.h"); |
$implementation{nameSpaceInternal}->add(<<END); |
static void constructor(const v8::FunctionCallbackInfo<v8::Value>& args) |
@@ -2660,29 +2667,51 @@ static void constructor(const v8::FunctionCallbackInfo<v8::Value>& args) |
} |
V8TRYCATCH_FOR_V8STRINGRESOURCE_VOID(V8StringResource<>, type, args[0]); |
+END |
+ |
+ foreach my $attrName (@anyAttributeNames) { |
+ $implementation{nameSpaceInternal}->add(" v8::Local<v8::Value> ${attrName};\n"); |
+ } |
+ |
+ $implementation{nameSpaceInternal}->add(<<END); |
${implClassName}Init eventInit; |
if (args.Length() >= 2) { |
V8TRYCATCH_VOID(Dictionary, options, Dictionary(args[1], args.GetIsolate())); |
if (!fill${implClassName}Init(eventInit, options)) |
return; |
END |
- for (my $index = 0; $index < @{$interface->attributes}; $index++) { |
- my $attribute = @{$interface->attributes}[$index]; |
- if ($attribute->type eq "any") { |
- my $attributeName = $attribute->name; |
- $implementation{nameSpaceInternal}->add(<<END); |
- v8::Local<v8::Value> ${attributeName}; |
- options.get("${attributeName}", ${attributeName}); |
- if (!${attributeName}.IsEmpty()) |
- args.Holder()->SetHiddenValue(V8HiddenPropertyName::${attributeName}(), ${attributeName}); |
-END |
- } |
- } |
+ |
+ # Store 'any'-typed properties on the wrapper to avoid leaking them between isolated worlds. |
+ foreach my $attrName (@anyAttributeNames) { |
$implementation{nameSpaceInternal}->add(<<END); |
+ options.get("${attrName}", ${attrName}); |
+ if (!${attrName}.IsEmpty()) |
+ args.Holder()->SetHiddenValue(V8HiddenPropertyName::${attrName}(), ${attrName}); |
+END |
+ } |
+ |
+ $implementation{nameSpaceInternal}->add(<<END); |
} |
RefPtr<${implClassName}> event = ${implClassName}::create(type, eventInit); |
+END |
+ |
+ if (@anyAttributeNames) { |
+ # 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). |
+ $implementation{nameSpaceInternal}->add(" if (isolatedWorldForIsolate(args.GetIsolate())) {\n"); |
+ foreach my $attrName (@anyAttributeNames) { |
+ my $setter = "setSerialized" . FirstLetterToUpperCase($attrName); |
+ $implementation{nameSpaceInternal}->add(<<END); |
+ if (!${attrName}.IsEmpty()) |
+ event->${setter}(SerializedScriptValue::createAndSwallowExceptions(${attrName}, args.GetIsolate())); |
+END |
+ } |
+ $implementation{nameSpaceInternal}->add(" }\n\n"); |
+ } |
+ $implementation{nameSpaceInternal}->add(<<END); |
v8::Handle<v8::Object> wrapper = args.Holder(); |
V8DOMWrapper::associateObjectWithWrapper<${v8ClassName}>(event.release(), &${v8ClassName}::info, wrapper, args.GetIsolate(), WrapperConfiguration::Dependent); |
v8SetReturnValue(args, wrapper); |
@@ -2704,12 +2733,10 @@ END |
END |
} |
- for (my $index = 0; $index < @{$interface->attributes}; $index++) { |
- my $attribute = @{$interface->attributes}[$index]; |
+ foreach my $attribute (@{$interface->attributes}) { |
if ($attribute->extendedAttributes->{"InitializedByEventConstructor"}) { |
- my $attributeName = $attribute->name; |
- my $attributeType = $attribute->type; |
- if (not ($attribute->type eq "any")) { |
+ if ($attribute->type ne "any") { |
+ my $attributeName = $attribute->name; |
$code .= " options.get(\"$attributeName\", eventInit.$attributeName);\n"; |
} |
} |