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

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

Issue 64683006: [svg] TearOffs dynamically hold on to the current contextElement(). (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: gchack Created 7 years, 1 month 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 f9a5992db8fcc84e45da7628099bc711aef553c8..63e765c8977d919d73aaadf16dbb74b287f41758 100644
--- a/Source/bindings/scripts/code_generator_v8.pm
+++ b/Source/bindings/scripts/code_generator_v8.pm
@@ -467,7 +467,7 @@ sub HeaderFilesForInterface
sub NeedsResolveWrapperReachability
{
my $interface = shift;
- return $interface->extendedAttributes->{"GenerateIsReachable"} || $interface->extendedAttributes->{"CustomIsReachable"} || $interface->extendedAttributes->{"SetReference"};
+ return $interface->extendedAttributes->{"GenerateIsReachable"} || $interface->extendedAttributes->{"CustomIsReachable"} || $interface->extendedAttributes->{"SetReference"} || SVGTypeNeedsToHoldContextElement($interface->name);
}
sub GenerateResolveWrapperReachability
@@ -480,17 +480,29 @@ sub GenerateResolveWrapperReachability
return;
}
+ my $nativeType = GetNativeTypeForConversions($interface);
my $code = <<END;
void ${v8ClassName}::resolveWrapperReachability(void* object, const v8::Persistent<v8::Object>& wrapper, v8::Isolate* isolate)
{
- ${implClassName}* impl = fromInternalPointer(object);
+ ${nativeType}* impl = fromInternalPointer(object);
END
- if ($interface->extendedAttributes->{"SetReference"}) {
+ my $needSetWrapperReferenceContext = SVGTypeNeedsToHoldContextElement($interface->name) || $interface->extendedAttributes->{"SetReference"};
+ if ($needSetWrapperReferenceContext) {
$code .= <<END;
v8::Local<v8::Object> creationContext = v8::Local<v8::Object>::New(isolate, wrapper);
V8WrapperInstantiationScope scope(creationContext, isolate);
END
}
+ if (SVGTypeNeedsToHoldContextElement($interface->name)) {
+ AddToImplIncludes("V8SVGPathElement.h");
+ $code .= <<END;
+ if (impl->contextElement()) {
+ if (!DOMDataStore::containsWrapper<V8SVGElement>(impl->contextElement(), isolate))
+ wrap(impl->contextElement(), creationContext, isolate);
+ DOMDataStore::setWrapperReference<V8SVGElement>(wrapper, impl->contextElement(), isolate);
+ }
+END
+ }
for my $setReference (@{$interface->extendedAttributes->{"SetReference"}}) {
my $setReferenceType = $setReference->type;
my $setReferenceName = $setReference->name;
@@ -4215,25 +4227,6 @@ v8::Handle<v8::Object> wrap($implClassName* impl, v8::Handle<v8::Object> creatio
END
}
- # Add strong reference from TearOff to SVGElement, so that SVGElement would never get GC-ed while the TearOff is alive. We do this in V8-side to avoid circular reference on Blink side.
- if (SVGTypeNeedsToHoldContextElement($interface->name)) {
- # below include needed for SVGPathSegListPropertyTearOff
- AddToImplIncludes("V8SVGPathElement.h");
- AddToImplIncludes("bindings/v8/V8HiddenPropertyName.h");
- $implementation{nameSpaceWebCore}->add(<<END);
-v8::Handle<v8::Object> wrap($nativeType* impl, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
-{
- ASSERT(impl);
- ASSERT(!DOMDataStore::containsWrapper<${v8ClassName}>(impl, isolate));
- v8::Handle<v8::Object> wrapper = ${v8ClassName}::createWrapper(impl, creationContext, isolate);
- if (impl->contextElement())
- V8HiddenPropertyName::setNamedHiddenReference(wrapper, "contextElement", toV8(impl->contextElement(), creationContext, isolate));
- return wrapper;
-}
-
-END
- }
-
my @perContextEnabledFunctions;
my @normalFunctions;
my $needsDomainSafeFunctionSetter = 0;
@@ -6292,7 +6285,6 @@ sub NeedsSpecialWrap
return 1 if $interface->extendedAttributes->{"CustomToV8"};
return 1 if $interface->extendedAttributes->{"SpecialWrapFor"};
return 1 if InheritsInterface($interface, "Document");
- return 1 if SVGTypeNeedsToHoldContextElement($interface->name);
return 0;
}

Powered by Google App Engine
This is Rietveld 408576698