WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Better patch
bug-77295-20120130151715.patch (text/plain), 46.18 KB, created by
Pablo Flouret
on 2012-01-30 15:17:16 PST
(
hide
)
Description:
Better patch
Filename:
MIME Type:
Creator:
Pablo Flouret
Created:
2012-01-30 15:17:16 PST
Size:
46.18 KB
patch
obsolete
>Subversion Revision: 105963 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index f267670fc257b118739753de43a9974491c224a0..a0acdab6ef9598eee8835fb4299a6cd7ba161f21 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,80 @@ >+2012-01-29 Pablo Flouret <pablof@motorola.com> >+ >+ V8 idl code generator doesn't handle SerializedScriptValue attributes properly. >+ https://bugs.webkit.org/show_bug.cgi?id=77295 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Only the case of one (and only one) SerializedScriptValue attribute was >+ handled, and it was deserialized eagerly in the constructor instead of >+ generating getters/setters. This patch gets rid of that behavior and >+ generates the getters and setters instead (similar to what the JSC >+ generator does). >+ Also handle the case of SSV attributes with [CachedAttribute] >+ declaration, caching the deserialized value in a hidden attribute on the >+ object. >+ >+ * bindings/scripts/CodeGeneratorV8.pm: >+ (GenerateNormalAttrGetter): >+ (GenerateNormalAttrSetter): >+ (GenerateConstructorCallback): >+ (GenerateNamedConstructorCallback): >+ (GenerateSingleBatchedAttribute): >+ (GenerateImplementation): >+ (GenerateToV8Converters): >+ (JSValueToNative): >+ (NativeToJSValue): >+ * bindings/scripts/test/CPP/WebDOMTestSerializedScriptValueInterface.cpp: >+ (WebDOMTestSerializedScriptValueInterface::setValue): >+ (WebDOMTestSerializedScriptValueInterface::readonlyValue): >+ (WebDOMTestSerializedScriptValueInterface::cachedValue): >+ (WebDOMTestSerializedScriptValueInterface::setCachedValue): >+ (WebDOMTestSerializedScriptValueInterface::cachedReadonlyValue): >+ * bindings/scripts/test/CPP/WebDOMTestSerializedScriptValueInterface.h: >+ (WebDOMTestSerializedScriptValueInterface): >+ * bindings/scripts/test/GObject/WebKitDOMTestSerializedScriptValueInterface.cpp: >+ (webkit_dom_test_serialized_script_value_interface_set_value): >+ (webkit_dom_test_serialized_script_value_interface_get_readonly_value): >+ (webkit_dom_test_serialized_script_value_interface_get_cached_value): >+ (webkit_dom_test_serialized_script_value_interface_set_cached_value): >+ (webkit_dom_test_serialized_script_value_interface_get_cached_readonly_value): >+ (webkit_dom_test_serialized_script_value_interface_get_property): >+ (webkit_dom_test_serialized_script_value_interface_class_init): >+ * bindings/scripts/test/GObject/WebKitDOMTestSerializedScriptValueInterface.h: >+ * bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.cpp: >+ (): >+ (WebCore::jsTestSerializedScriptValueInterfaceReadonlyValue): >+ (WebCore): >+ (WebCore::jsTestSerializedScriptValueInterfaceCachedValue): >+ (WebCore::jsTestSerializedScriptValueInterfaceCachedReadonlyValue): >+ (WebCore::JSTestSerializedScriptValueInterface::put): >+ (WebCore::setJSTestSerializedScriptValueInterfaceValue): >+ (WebCore::setJSTestSerializedScriptValueInterfaceCachedValue): >+ * bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.h: >+ (JSTestSerializedScriptValueInterface): >+ (JSTestSerializedScriptValueInterfacePrototype): >+ (WebCore): >+ * bindings/scripts/test/ObjC/DOMTestSerializedScriptValueInterface.h: >+ * bindings/scripts/test/ObjC/DOMTestSerializedScriptValueInterface.mm: >+ (-[DOMTestSerializedScriptValueInterface setValue:]): >+ (-[DOMTestSerializedScriptValueInterface readonlyValue]): >+ (-[DOMTestSerializedScriptValueInterface cachedValue]): >+ (-[DOMTestSerializedScriptValueInterface setCachedValue:]): >+ (-[DOMTestSerializedScriptValueInterface cachedReadonlyValue]): >+ * bindings/scripts/test/TestSerializedScriptValueInterface.idl: >+ * bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp: >+ (WebCore::TestSerializedScriptValueInterfaceInternal::valueAttrGetter): >+ (TestSerializedScriptValueInterfaceInternal): >+ (WebCore::TestSerializedScriptValueInterfaceInternal::valueAttrSetter): >+ (WebCore::TestSerializedScriptValueInterfaceInternal::readonlyValueAttrGetter): >+ (WebCore::TestSerializedScriptValueInterfaceInternal::cachedValueAttrGetter): >+ (WebCore::TestSerializedScriptValueInterfaceInternal::cachedValueAttrSetter): >+ (WebCore::TestSerializedScriptValueInterfaceInternal::cachedReadonlyValueAttrGetter): >+ (): >+ (WebCore::V8TestSerializedScriptValueInterface::constructorCallback): >+ (WebCore::ConfigureV8TestSerializedScriptValueInterfaceTemplate): >+ (WebCore::V8TestSerializedScriptValueInterface::wrapSlow): >+ > 2012-01-25 Daniel Cheng <dcheng@chromium.org> > > [chromium] Fix ClipboardChromium::validateFilename to actually operate on extensions >diff --git a/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm b/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm >index 8e04cfcb4c4d5553a892cea2224c334a5845720e..215ae0882bed2d26da5bdc10f994e4adcbed4aa2 100644 >--- a/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm >+++ b/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm >@@ -192,26 +192,6 @@ sub GenerateConditionalString > } > } > >-sub GenerateEagerDeserialization >-{ >- my $serializedAttribute = shift; >- >- # Eagerly deserialize attributes of type SerializedScriptValue while we're >- # in the right context. >- >- die "Attribute of type SerializedScriptValue expected" if $serializedAttribute->signature->type ne "SerializedScriptValue"; >- my $attrName = $serializedAttribute->signature->name; >- my $attrAttr = "v8::DontDelete"; >- if ($serializedAttribute->type =~ /^readonly/) { >- $attrAttr .= " | v8::ReadOnly"; >- } >- $attrAttr = "static_cast<v8::PropertyAttribute>($attrAttr)"; >- my $getterFunc = $codeGenerator->WK_lcfirst($attrName); >- push(@implContent, <<END); >- SerializedScriptValue::deserializeAndSetProperty(wrapper, "${attrName}", ${attrAttr}, impl->${getterFunc}()); >-END >-} >- > sub GetSVGPropertyTypes > { > my $implType = shift; >@@ -859,6 +839,14 @@ END > return; > # Skip the rest of the function! > } >+ if ($attribute->signature->type eq "SerializedScriptValue" && $attrExt->{"CachedAttribute"}) { >+ push(@implContentDecls, <<END); >+ v8::Handle<v8::String> propertyName = v8::String::NewSymbol("${attrName}"); >+ v8::Handle<v8::Value> value = info.Holder()->GetHiddenValue(propertyName); >+ if (!value.IsEmpty()) >+ return value; >+END >+ } > push(@implContentDecls, <<END); > ${implClassName}* imp = V8${implClassName}::toNative(info.Holder()); > END >@@ -1004,7 +992,17 @@ END > push(@implContentDecls, " return toV8(WTF::getPtr(${tearOffType}::create($result)));\n"); > } > } else { >- push(@implContentDecls, " " . ReturnNativeToJSValue($attribute->signature, $result, " ").";\n"); >+ if ($attribute->signature->type eq "SerializedScriptValue" && $attrExt->{"CachedAttribute"}) { >+ my $getterFunc = $codeGenerator->WK_lcfirst($attribute->signature->name); >+ push(@implContentDecls, <<END); >+ SerializedScriptValue* serialized = imp->${getterFunc}(); >+ value = serialized ? serialized->deserialize() : v8::Handle<v8::Value>(v8::Null()); >+ info.Holder()->SetHiddenValue(propertyName, value); >+ return value; >+END >+ } else { >+ push(@implContentDecls, " " . ReturnNativeToJSValue($attribute->signature, $result, " ").";\n"); >+ } > } > > push(@implContentDecls, "}\n\n"); # end of getter >@@ -1189,6 +1187,12 @@ END > } > } > >+ if ($attribute->signature->type eq "SerializedScriptValue" && $attribute->signature->extendedAttributes->{"CachedAttribute"}) { >+ push(@implContentDecls, <<END); >+ info.Holder()->DeleteHiddenValue(v8::String::NewSymbol("${attrName}")); // Invalidate the cached value. >+END >+ } >+ > push(@implContentDecls, " return;\n"); > push(@implContentDecls, "}\n\n"); # end of setter > push(@implContentDecls, "#endif // ${conditionalString}\n\n") if $conditionalString; >@@ -1617,7 +1621,6 @@ sub GenerateConstructorCallback > my $function = shift; > my $dataNode = shift; > my $implClassName = shift; >- my $serializedAttribute = shift; > > my $raisesExceptions = @{$function->raisesExceptions}; > if ($dataNode->extendedAttributes->{"ConstructorRaisesException"}) { >@@ -1693,11 +1696,6 @@ END > > V8DOMWrapper::setDOMWrapper(wrapper, &info, impl.get()); > impl->ref(); >-END >- if ($serializedAttribute) { >- GenerateEagerDeserialization($serializedAttribute); >- } >- push(@implContent, <<END); > V8DOMWrapper::setJSWrapperFor${DOMObject}(impl.get(), v8::Persistent<v8::Object>::New(wrapper)); > return args.Holder(); > END >@@ -1778,7 +1776,6 @@ sub GenerateNamedConstructorCallback > my $function = shift; > my $dataNode = shift; > my $implClassName = shift; >- my $serializedAttribute = shift; > > my $raisesExceptions = @{$function->raisesExceptions}; > if ($dataNode->extendedAttributes->{"ConstructorRaisesException"}) { >@@ -1877,11 +1874,6 @@ END > > V8DOMWrapper::setDOMWrapper(wrapper, &V8${implClassName}Constructor::info, impl.get()); > impl->ref(); >-END >- if ($serializedAttribute) { >- GenerateEagerDeserialization($serializedAttribute); >- } >- push(@implContent, <<END); > V8DOMWrapper::setJSWrapperFor${DOMObject}(impl.get(), v8::Persistent<v8::Object>::New(wrapper)); > return args.Holder(); > END >@@ -1939,10 +1931,6 @@ sub GenerateSingleBatchedAttribute > my $attrName = $attribute->signature->name; > my $attrExt = $attribute->signature->extendedAttributes; > >- # Attributes of type SerializedScriptValue are set in the >- # constructor and don't require callbacks. >- return if ($attribute->signature->type eq "SerializedScriptValue"); >- > my $accessControl = "v8::DEFAULT"; > if ($attrExt->{"DoNotCheckDomainSecurityOnGet"}) { > $accessControl = "v8::ALL_CAN_READ"; >@@ -2277,7 +2265,6 @@ sub GenerateImplementation > push(@implContentDecls, "template <typename T> void V8_USE(T) { }\n\n"); > > my $hasConstructors = 0; >- my $serializedAttribute; > # Generate property accessors for attributes. > for (my $index = 0; $index < @{$dataNode->attributes}; $index++) { > my $attribute = @{$dataNode->attributes}[$index]; >@@ -2296,13 +2283,8 @@ sub GenerateImplementation > $attribute->signature->extendedAttributes->{"v8OnProto"} = 1; > } > >- # Attributes of type SerializedScriptValue are set in the >- # constructor and don't require callbacks. > if ($attrType eq "SerializedScriptValue") { >- die "Only one attribute of type SerializedScriptValue supported" if $serializedAttribute; > AddToImplIncludes("SerializedScriptValue.h"); >- $serializedAttribute = $attribute; >- next; > } > > # Do not generate accessor if this is a custom attribute. The >@@ -2389,7 +2371,7 @@ sub GenerateImplementation > } > > my $has_attributes = 0; >- if (@$attributes && (@$attributes > 1 || $$attributes[0]->signature->type ne "SerializedScriptValue")) { >+ if (@$attributes) { > $has_attributes = 1; > push(@implContent, "static const BatchedAttribute ${interfaceName}Attrs[] = {\n"); > GenerateBatchedAttributeData($dataNode, $attributes); >@@ -2473,9 +2455,9 @@ END > push(@implContentDecls, "} // namespace ${interfaceName}Internal\n\n"); > > if ($dataNode->extendedAttributes->{"NamedConstructor"} && !($dataNode->extendedAttributes->{"V8CustomConstructor"} || $dataNode->extendedAttributes->{"CustomConstructor"})) { >- GenerateNamedConstructorCallback($dataNode->constructor, $dataNode, $interfaceName, $serializedAttribute); >+ GenerateNamedConstructorCallback($dataNode->constructor, $dataNode, $interfaceName); > } elsif ($dataNode->extendedAttributes->{"Constructor"} && !($dataNode->extendedAttributes->{"V8CustomConstructor"} || $dataNode->extendedAttributes->{"CustomConstructor"})) { >- GenerateConstructorCallback($dataNode->constructor, $dataNode, $interfaceName, $serializedAttribute); >+ GenerateConstructorCallback($dataNode->constructor, $dataNode, $interfaceName); > } elsif (IsConstructorTemplate($dataNode, "Event")) { > GenerateEventConstructorCallback($dataNode, $interfaceName); > } >@@ -2804,7 +2786,7 @@ v8::Persistent<v8::ObjectTemplate> V8DOMWindow::GetShadowObjectTemplate() > END > } > >- GenerateToV8Converters($dataNode, $interfaceName, $className, $nativeType, $serializedAttribute); >+ GenerateToV8Converters($dataNode, $interfaceName, $className, $nativeType); > > push(@implContent, <<END); > >@@ -3036,7 +3018,6 @@ sub GenerateToV8Converters > my $interfaceName = shift; > my $className = shift; > my $nativeType = shift; >- my $serializedAttribute = shift; > > my $domMapFunction = GetDomMapFunction($dataNode, $interfaceName); > my $forceNewObjectInput = IsDOMNodeType($interfaceName) ? ", bool forceNewObject" : ""; >@@ -3108,10 +3089,6 @@ END > END > push(@implContent, "\n impl->ref();\n") if IsRefPtrType($interfaceName); > >- if ($serializedAttribute) { >- GenerateEagerDeserialization($serializedAttribute); >- } >- > push(@implContent, <<END); > v8::Persistent<v8::Object> wrapperHandle = v8::Persistent<v8::Object>::New(wrapper); > >@@ -3501,7 +3478,10 @@ sub JSValueToNative > return $value; > } > >- die "Unexpected SerializedScriptValue" if $type eq "SerializedScriptValue"; >+ if ($type eq "SerializedScriptValue") { >+ AddToImplIncludes("SerializedScriptValue.h"); >+ return "SerializedScriptValue::create($value)"; >+ } > > if ($type eq "IDBKey") { > AddToImplIncludes("IDBBindingUtilities.h"); >@@ -3773,7 +3753,7 @@ sub NativeToJSValue > > if ($type eq "SerializedScriptValue") { > AddToImplIncludes("$type.h"); >- return "$value->deserialize()"; >+ return "$value ? $value->deserialize() : v8::Handle<v8::Value>(v8::Null())"; > } > > AddToImplIncludes("wtf/RefCounted.h"); >diff --git a/Source/WebCore/bindings/scripts/test/CPP/WebDOMTestSerializedScriptValueInterface.cpp b/Source/WebCore/bindings/scripts/test/CPP/WebDOMTestSerializedScriptValueInterface.cpp >index edae8ad3cc0c70d58cfc36c023f0763ad72697bc..541546450a58d32736dacc755b83b628de08588e 100644 >--- a/Source/WebCore/bindings/scripts/test/CPP/WebDOMTestSerializedScriptValueInterface.cpp >+++ b/Source/WebCore/bindings/scripts/test/CPP/WebDOMTestSerializedScriptValueInterface.cpp >@@ -83,6 +83,46 @@ WebDOMString WebDOMTestSerializedScriptValueInterface::value() const > return impl()->value()->toString(); > } > >+void WebDOMTestSerializedScriptValueInterface::setValue(const WebDOMString& newValue) >+{ >+ if (!impl()) >+ return; >+ >+ impl()->setValue(WebCore::SerializedScriptValue::create(WTF::String(newValue))); >+} >+ >+WebDOMString WebDOMTestSerializedScriptValueInterface::readonlyValue() const >+{ >+ if (!impl()) >+ return WebDOMString(); >+ >+ return impl()->readonlyValue()->toString(); >+} >+ >+WebDOMString WebDOMTestSerializedScriptValueInterface::cachedValue() const >+{ >+ if (!impl()) >+ return WebDOMString(); >+ >+ return impl()->cachedValue()->toString(); >+} >+ >+void WebDOMTestSerializedScriptValueInterface::setCachedValue(const WebDOMString& newCachedValue) >+{ >+ if (!impl()) >+ return; >+ >+ impl()->setCachedValue(WebCore::SerializedScriptValue::create(WTF::String(newCachedValue))); >+} >+ >+WebDOMString WebDOMTestSerializedScriptValueInterface::cachedReadonlyValue() const >+{ >+ if (!impl()) >+ return WebDOMString(); >+ >+ return impl()->cachedReadonlyValue()->toString(); >+} >+ > WebCore::TestSerializedScriptValueInterface* toWebCore(const WebDOMTestSerializedScriptValueInterface& wrapper) > { > return wrapper.impl(); >diff --git a/Source/WebCore/bindings/scripts/test/CPP/WebDOMTestSerializedScriptValueInterface.h b/Source/WebCore/bindings/scripts/test/CPP/WebDOMTestSerializedScriptValueInterface.h >index f0daf552b7a5fe2ee1656d8974db75f0e1979cc4..d03b75e6a767f22cfcfbf9a5d55822de71b24399 100644 >--- a/Source/WebCore/bindings/scripts/test/CPP/WebDOMTestSerializedScriptValueInterface.h >+++ b/Source/WebCore/bindings/scripts/test/CPP/WebDOMTestSerializedScriptValueInterface.h >@@ -43,6 +43,11 @@ public: > virtual ~WebDOMTestSerializedScriptValueInterface(); > > WebDOMString value() const; >+ void setValue(const WebDOMString&); >+ WebDOMString readonlyValue() const; >+ WebDOMString cachedValue() const; >+ void setCachedValue(const WebDOMString&); >+ WebDOMString cachedReadonlyValue() const; > > WebCore::TestSerializedScriptValueInterface* impl() const; > >diff --git a/Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestSerializedScriptValueInterface.cpp b/Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestSerializedScriptValueInterface.cpp >index 7592b0212e469f0ffd489255a0477ad8a6f274fc..961c4b3a5c2f92d47364456160c8fb5806da374f 100644 >--- a/Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestSerializedScriptValueInterface.cpp >+++ b/Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestSerializedScriptValueInterface.cpp >@@ -65,6 +65,69 @@ webkit_dom_test_serialized_script_value_interface_get_value(WebKitDOMTestSeriali > return res; > } > >+void >+webkit_dom_test_serialized_script_value_interface_set_value(WebKitDOMTestSerializedScriptValueInterface* self, WebKitDOMSerializedScriptValue* value) >+{ >+ g_return_if_fail(self); >+ WebCore::JSMainThreadNullState state; >+ WebCore::TestSerializedScriptValueInterface * item = WebKit::core(self); >+ g_return_if_fail(value); >+ WebCore::SerializedScriptValue * converted_value = NULL; >+ if (value != NULL) { >+ converted_value = WebKit::core(value); >+ g_return_if_fail(converted_value); >+ } >+ item->setValue(converted_value); >+} >+ >+WebKitDOMSerializedScriptValue* >+webkit_dom_test_serialized_script_value_interface_get_readonly_value(WebKitDOMTestSerializedScriptValueInterface* self) >+{ >+ g_return_val_if_fail(self, 0); >+ WebCore::JSMainThreadNullState state; >+ WebCore::TestSerializedScriptValueInterface * item = WebKit::core(self); >+ PassRefPtr<WebCore::SerializedScriptValue> g_res = WTF::getPtr(item->readonlyValue()); >+ WebKitDOMSerializedScriptValue* res = WebKit::kit(g_res.get()); >+ return res; >+} >+ >+WebKitDOMSerializedScriptValue* >+webkit_dom_test_serialized_script_value_interface_get_cached_value(WebKitDOMTestSerializedScriptValueInterface* self) >+{ >+ g_return_val_if_fail(self, 0); >+ WebCore::JSMainThreadNullState state; >+ WebCore::TestSerializedScriptValueInterface * item = WebKit::core(self); >+ PassRefPtr<WebCore::SerializedScriptValue> g_res = WTF::getPtr(item->cachedValue()); >+ WebKitDOMSerializedScriptValue* res = WebKit::kit(g_res.get()); >+ return res; >+} >+ >+void >+webkit_dom_test_serialized_script_value_interface_set_cached_value(WebKitDOMTestSerializedScriptValueInterface* self, WebKitDOMSerializedScriptValue* value) >+{ >+ g_return_if_fail(self); >+ WebCore::JSMainThreadNullState state; >+ WebCore::TestSerializedScriptValueInterface * item = WebKit::core(self); >+ g_return_if_fail(value); >+ WebCore::SerializedScriptValue * converted_value = NULL; >+ if (value != NULL) { >+ converted_value = WebKit::core(value); >+ g_return_if_fail(converted_value); >+ } >+ item->setCachedValue(converted_value); >+} >+ >+WebKitDOMSerializedScriptValue* >+webkit_dom_test_serialized_script_value_interface_get_cached_readonly_value(WebKitDOMTestSerializedScriptValueInterface* self) >+{ >+ g_return_val_if_fail(self, 0); >+ WebCore::JSMainThreadNullState state; >+ WebCore::TestSerializedScriptValueInterface * item = WebKit::core(self); >+ PassRefPtr<WebCore::SerializedScriptValue> g_res = WTF::getPtr(item->cachedReadonlyValue()); >+ WebKitDOMSerializedScriptValue* res = WebKit::kit(g_res.get()); >+ return res; >+} >+ > > G_DEFINE_TYPE(WebKitDOMTestSerializedScriptValueInterface, webkit_dom_test_serialized_script_value_interface, WEBKIT_TYPE_DOM_OBJECT) > >@@ -84,6 +147,9 @@ WebCore::TestSerializedScriptValueInterface* core(WebKitDOMTestSerializedScriptV > enum { > PROP_0, > PROP_VALUE, >+ PROP_READONLY_VALUE, >+ PROP_CACHED_VALUE, >+ PROP_CACHED_READONLY_VALUE, > }; > > >@@ -126,6 +192,24 @@ static void webkit_dom_test_serialized_script_value_interface_get_property(GObje > g_value_set_object(value, WebKit::kit(ptr.get())); > break; > } >+ case PROP_READONLY_VALUE: >+ { >+ RefPtr<WebCore::SerializedScriptValue> ptr = coreSelf->readonlyValue(); >+ g_value_set_object(value, WebKit::kit(ptr.get())); >+ break; >+ } >+ case PROP_CACHED_VALUE: >+ { >+ RefPtr<WebCore::SerializedScriptValue> ptr = coreSelf->cachedValue(); >+ g_value_set_object(value, WebKit::kit(ptr.get())); >+ break; >+ } >+ case PROP_CACHED_READONLY_VALUE: >+ { >+ RefPtr<WebCore::SerializedScriptValue> ptr = coreSelf->cachedReadonlyValue(); >+ g_value_set_object(value, WebKit::kit(ptr.get())); >+ break; >+ } > default: > G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); > break; >@@ -152,7 +236,28 @@ static void webkit_dom_test_serialized_script_value_interface_class_init(WebKitD > PROP_VALUE, > g_param_spec_object("value", /* name */ > "test_serialized_script_value_interface_value", /* short description */ >- "read-only WebKitDOMSerializedScriptValue* TestSerializedScriptValueInterface.value", /* longer - could do with some extra doc stuff here */ >+ "read-write WebKitDOMSerializedScriptValue* TestSerializedScriptValueInterface.value", /* longer - could do with some extra doc stuff here */ >+ WEBKIT_TYPE_DOM_SERIALIZED_SCRIPT_VALUE, /* gobject type */ >+ WEBKIT_PARAM_READWRITE)); >+ g_object_class_install_property(gobjectClass, >+ PROP_READONLY_VALUE, >+ g_param_spec_object("readonly-value", /* name */ >+ "test_serialized_script_value_interface_readonly-value", /* short description */ >+ "read-only WebKitDOMSerializedScriptValue* TestSerializedScriptValueInterface.readonly-value", /* longer - could do with some extra doc stuff here */ >+ WEBKIT_TYPE_DOM_SERIALIZED_SCRIPT_VALUE, /* gobject type */ >+ WEBKIT_PARAM_READABLE)); >+ g_object_class_install_property(gobjectClass, >+ PROP_CACHED_VALUE, >+ g_param_spec_object("cached-value", /* name */ >+ "test_serialized_script_value_interface_cached-value", /* short description */ >+ "read-write WebKitDOMSerializedScriptValue* TestSerializedScriptValueInterface.cached-value", /* longer - could do with some extra doc stuff here */ >+ WEBKIT_TYPE_DOM_SERIALIZED_SCRIPT_VALUE, /* gobject type */ >+ WEBKIT_PARAM_READWRITE)); >+ g_object_class_install_property(gobjectClass, >+ PROP_CACHED_READONLY_VALUE, >+ g_param_spec_object("cached-readonly-value", /* name */ >+ "test_serialized_script_value_interface_cached-readonly-value", /* short description */ >+ "read-only WebKitDOMSerializedScriptValue* TestSerializedScriptValueInterface.cached-readonly-value", /* longer - could do with some extra doc stuff here */ > WEBKIT_TYPE_DOM_SERIALIZED_SCRIPT_VALUE, /* gobject type */ > WEBKIT_PARAM_READABLE)); > >diff --git a/Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestSerializedScriptValueInterface.h b/Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestSerializedScriptValueInterface.h >index 7e71262d7e069a31bb7e462e8c30381276b8765a..516141859ce3e53cb54e4bebf3e4923cc9e4f3dc 100644 >--- a/Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestSerializedScriptValueInterface.h >+++ b/Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestSerializedScriptValueInterface.h >@@ -56,6 +56,58 @@ webkit_dom_test_serialized_script_value_interface_get_type (void); > WEBKIT_API WebKitDOMSerializedScriptValue* > webkit_dom_test_serialized_script_value_interface_get_value(WebKitDOMTestSerializedScriptValueInterface* self); > >+/** >+ * webkit_dom_test_serialized_script_value_interface_set_value: >+ * @self: A #WebKitDOMTestSerializedScriptValueInterface >+ * @value: A #WebKitDOMSerializedScriptValue >+ * >+ * Returns: (transfer none): >+ * >+**/ >+WEBKIT_API void >+webkit_dom_test_serialized_script_value_interface_set_value(WebKitDOMTestSerializedScriptValueInterface* self, WebKitDOMSerializedScriptValue* value); >+ >+/** >+ * webkit_dom_test_serialized_script_value_interface_get_readonly_value: >+ * @self: A #WebKitDOMTestSerializedScriptValueInterface >+ * >+ * Returns: (transfer none): >+ * >+**/ >+WEBKIT_API WebKitDOMSerializedScriptValue* >+webkit_dom_test_serialized_script_value_interface_get_readonly_value(WebKitDOMTestSerializedScriptValueInterface* self); >+ >+/** >+ * webkit_dom_test_serialized_script_value_interface_get_cached_value: >+ * @self: A #WebKitDOMTestSerializedScriptValueInterface >+ * >+ * Returns: (transfer none): >+ * >+**/ >+WEBKIT_API WebKitDOMSerializedScriptValue* >+webkit_dom_test_serialized_script_value_interface_get_cached_value(WebKitDOMTestSerializedScriptValueInterface* self); >+ >+/** >+ * webkit_dom_test_serialized_script_value_interface_set_cached_value: >+ * @self: A #WebKitDOMTestSerializedScriptValueInterface >+ * @value: A #WebKitDOMSerializedScriptValue >+ * >+ * Returns: (transfer none): >+ * >+**/ >+WEBKIT_API void >+webkit_dom_test_serialized_script_value_interface_set_cached_value(WebKitDOMTestSerializedScriptValueInterface* self, WebKitDOMSerializedScriptValue* value); >+ >+/** >+ * webkit_dom_test_serialized_script_value_interface_get_cached_readonly_value: >+ * @self: A #WebKitDOMTestSerializedScriptValueInterface >+ * >+ * Returns: (transfer none): >+ * >+**/ >+WEBKIT_API WebKitDOMSerializedScriptValue* >+webkit_dom_test_serialized_script_value_interface_get_cached_readonly_value(WebKitDOMTestSerializedScriptValueInterface* self); >+ > G_END_DECLS > > #endif /* WebKitDOMTestSerializedScriptValueInterface_h */ >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.cpp >index fb2f21d71bab34ba11fa1cbd64c26a5657241e48..02deeda6feb2239a62576b4f11fcd3840dd0c2d4 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.cpp >@@ -42,12 +42,15 @@ ASSERT_HAS_TRIVIAL_DESTRUCTOR(JSTestSerializedScriptValueInterface); > > static const HashTableValue JSTestSerializedScriptValueInterfaceTableValues[] = > { >- { "value", DontDelete | ReadOnly, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializedScriptValueInterfaceValue), (intptr_t)0, NoIntrinsic }, >+ { "value", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializedScriptValueInterfaceValue), (intptr_t)setJSTestSerializedScriptValueInterfaceValue, NoIntrinsic }, >+ { "readonlyValue", DontDelete | ReadOnly, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializedScriptValueInterfaceReadonlyValue), (intptr_t)0, NoIntrinsic }, >+ { "cachedValue", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializedScriptValueInterfaceCachedValue), (intptr_t)setJSTestSerializedScriptValueInterfaceCachedValue, NoIntrinsic }, >+ { "cachedReadonlyValue", DontDelete | ReadOnly, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializedScriptValueInterfaceCachedReadonlyValue), (intptr_t)0, NoIntrinsic }, > { "constructor", DontEnum | ReadOnly, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializedScriptValueInterfaceConstructor), (intptr_t)0, NoIntrinsic }, > { 0, 0, 0, 0, NoIntrinsic } > }; > >-static const HashTable JSTestSerializedScriptValueInterfaceTable = { 4, 3, JSTestSerializedScriptValueInterfaceTableValues, 0 }; >+static const HashTable JSTestSerializedScriptValueInterfaceTable = { 17, 15, JSTestSerializedScriptValueInterfaceTableValues, 0 }; > /* Hash table for constructor */ > > static const HashTableValue JSTestSerializedScriptValueInterfaceConstructorTableValues[] = >@@ -167,12 +170,71 @@ JSValue jsTestSerializedScriptValueInterfaceValue(ExecState* exec, JSValue slotB > } > > >+JSValue jsTestSerializedScriptValueInterfaceReadonlyValue(ExecState* exec, JSValue slotBase, const Identifier&) >+{ >+ JSTestSerializedScriptValueInterface* castedThis = static_cast<JSTestSerializedScriptValueInterface*>(asObject(slotBase)); >+ UNUSED_PARAM(exec); >+ TestSerializedScriptValueInterface* impl = static_cast<TestSerializedScriptValueInterface*>(castedThis->impl()); >+ JSValue result = impl->readonlyValue() ? impl->readonlyValue()->deserialize(exec, castedThis->globalObject(), 0) : jsNull(); >+ return result; >+} >+ >+ >+JSValue jsTestSerializedScriptValueInterfaceCachedValue(ExecState* exec, JSValue slotBase, const Identifier&) >+{ >+ JSTestSerializedScriptValueInterface* castedThis = static_cast<JSTestSerializedScriptValueInterface*>(asObject(slotBase)); >+ UNUSED_PARAM(exec); >+ if (JSValue cachedValue = castedThis->m_cachedValue.get()) >+ return cachedValue; >+ TestSerializedScriptValueInterface* impl = static_cast<TestSerializedScriptValueInterface*>(castedThis->impl()); >+ JSValue result = impl->cachedValue() ? impl->cachedValue()->deserialize(exec, castedThis->globalObject(), 0) : jsNull(); >+ castedThis->m_cachedValue.set(exec->globalData(), castedThis, result); >+ return result; >+} >+ >+ >+JSValue jsTestSerializedScriptValueInterfaceCachedReadonlyValue(ExecState* exec, JSValue slotBase, const Identifier&) >+{ >+ JSTestSerializedScriptValueInterface* castedThis = static_cast<JSTestSerializedScriptValueInterface*>(asObject(slotBase)); >+ UNUSED_PARAM(exec); >+ if (JSValue cachedValue = castedThis->m_cachedReadonlyValue.get()) >+ return cachedValue; >+ TestSerializedScriptValueInterface* impl = static_cast<TestSerializedScriptValueInterface*>(castedThis->impl()); >+ JSValue result = impl->cachedReadonlyValue() ? impl->cachedReadonlyValue()->deserialize(exec, castedThis->globalObject(), 0) : jsNull(); >+ castedThis->m_cachedReadonlyValue.set(exec->globalData(), castedThis, result); >+ return result; >+} >+ >+ > JSValue jsTestSerializedScriptValueInterfaceConstructor(ExecState* exec, JSValue slotBase, const Identifier&) > { > JSTestSerializedScriptValueInterface* domObject = static_cast<JSTestSerializedScriptValueInterface*>(asObject(slotBase)); > return JSTestSerializedScriptValueInterface::getConstructor(exec, domObject->globalObject()); > } > >+void JSTestSerializedScriptValueInterface::put(JSCell* cell, ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot) >+{ >+ JSTestSerializedScriptValueInterface* thisObject = jsCast<JSTestSerializedScriptValueInterface*>(cell); >+ ASSERT_GC_OBJECT_INHERITS(thisObject, &s_info); >+ lookupPut<JSTestSerializedScriptValueInterface, Base>(exec, propertyName, value, &JSTestSerializedScriptValueInterfaceTable, thisObject, slot); >+} >+ >+void setJSTestSerializedScriptValueInterfaceValue(ExecState* exec, JSObject* thisObject, JSValue value) >+{ >+ JSTestSerializedScriptValueInterface* castedThis = static_cast<JSTestSerializedScriptValueInterface*>(thisObject); >+ TestSerializedScriptValueInterface* impl = static_cast<TestSerializedScriptValueInterface*>(castedThis->impl()); >+ impl->setValue(SerializedScriptValue::create(exec, value)); >+} >+ >+ >+void setJSTestSerializedScriptValueInterfaceCachedValue(ExecState* exec, JSObject* thisObject, JSValue value) >+{ >+ JSTestSerializedScriptValueInterface* castedThis = static_cast<JSTestSerializedScriptValueInterface*>(thisObject); >+ TestSerializedScriptValueInterface* impl = static_cast<TestSerializedScriptValueInterface*>(castedThis->impl()); >+ impl->setCachedValue(SerializedScriptValue::create(exec, value)); >+} >+ >+ > JSValue JSTestSerializedScriptValueInterface::getConstructor(ExecState* exec, JSGlobalObject* globalObject) > { > return getDOMConstructor<JSTestSerializedScriptValueInterfaceConstructor>(exec, static_cast<JSDOMGlobalObject*>(globalObject)); >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.h b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.h >index e1e255fbbc37ab9e8a359da7e930e3f7f7b262b1..363fc85e0e7c855dba9e098b20668eb59ed31b3b 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.h >@@ -44,6 +44,7 @@ public: > static JSC::JSObject* createPrototype(JSC::ExecState*, JSC::JSGlobalObject*); > static bool getOwnPropertySlot(JSC::JSCell*, JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertySlot&); > static bool getOwnPropertyDescriptor(JSC::JSObject*, JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertyDescriptor&); >+ static void put(JSC::JSCell*, JSC::ExecState*, const JSC::Identifier& propertyName, JSC::JSValue, JSC::PutPropertySlot&); > static void destroy(JSC::JSCell*); > static const JSC::ClassInfo s_info; > >@@ -53,6 +54,10 @@ public: > } > > static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*); >+ JSC::WriteBarrier<JSC::Unknown> m_cachedValue; >+ JSC::WriteBarrier<JSC::Unknown> m_cachedReadonlyValue; >+ static void visitChildren(JSCell*, JSC::SlotVisitor&); >+ > TestSerializedScriptValueInterface* impl() const { return m_impl; } > void releaseImpl() { m_impl->deref(); m_impl = 0; } > >@@ -63,7 +68,7 @@ private: > protected: > JSTestSerializedScriptValueInterface(JSC::Structure*, JSDOMGlobalObject*, PassRefPtr<TestSerializedScriptValueInterface>); > void finishCreation(JSC::JSGlobalData&); >- static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags; >+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | JSC::OverridesVisitChildren | Base::StructureFlags; > }; > > class JSTestSerializedScriptValueInterfaceOwner : public JSC::WeakHandleOwner { >@@ -105,7 +110,7 @@ public: > private: > JSTestSerializedScriptValueInterfacePrototype(JSC::JSGlobalData& globalData, JSC::JSGlobalObject*, JSC::Structure* structure) : JSC::JSNonFinalObject(globalData, structure) { } > protected: >- static const unsigned StructureFlags = Base::StructureFlags; >+ static const unsigned StructureFlags = JSC::OverridesVisitChildren | Base::StructureFlags; > }; > > class JSTestSerializedScriptValueInterfaceConstructor : public DOMConstructorObject { >@@ -138,6 +143,11 @@ protected: > // Attributes > > JSC::JSValue jsTestSerializedScriptValueInterfaceValue(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&); >+void setJSTestSerializedScriptValueInterfaceValue(JSC::ExecState*, JSC::JSObject*, JSC::JSValue); >+JSC::JSValue jsTestSerializedScriptValueInterfaceReadonlyValue(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&); >+JSC::JSValue jsTestSerializedScriptValueInterfaceCachedValue(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&); >+void setJSTestSerializedScriptValueInterfaceCachedValue(JSC::ExecState*, JSC::JSObject*, JSC::JSValue); >+JSC::JSValue jsTestSerializedScriptValueInterfaceCachedReadonlyValue(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&); > JSC::JSValue jsTestSerializedScriptValueInterfaceConstructor(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&); > > } // namespace WebCore >diff --git a/Source/WebCore/bindings/scripts/test/ObjC/DOMTestSerializedScriptValueInterface.h b/Source/WebCore/bindings/scripts/test/ObjC/DOMTestSerializedScriptValueInterface.h >index ff98133dba806dbc62d646a64808ff0aad5ab4e9..b5f3a17c95b251121b5951db7bca5bed4499b7ce 100644 >--- a/Source/WebCore/bindings/scripts/test/ObjC/DOMTestSerializedScriptValueInterface.h >+++ b/Source/WebCore/bindings/scripts/test/ObjC/DOMTestSerializedScriptValueInterface.h >@@ -32,6 +32,11 @@ > > @interface DOMTestSerializedScriptValueInterface : DOMObject > - (NSString *)value; >+- (void)setValue:(NSString *)newValue; >+- (NSString *)readonlyValue; >+- (NSString *)cachedValue; >+- (void)setCachedValue:(NSString *)newCachedValue; >+- (NSString *)cachedReadonlyValue; > @end > > #endif >diff --git a/Source/WebCore/bindings/scripts/test/ObjC/DOMTestSerializedScriptValueInterface.mm b/Source/WebCore/bindings/scripts/test/ObjC/DOMTestSerializedScriptValueInterface.mm >index 1a0fc7b11a798d11fdd5c1672c03741f9bc662cc..388f1c56d7cb282e79de30c971f8cc0557aff110 100644 >--- a/Source/WebCore/bindings/scripts/test/ObjC/DOMTestSerializedScriptValueInterface.mm >+++ b/Source/WebCore/bindings/scripts/test/ObjC/DOMTestSerializedScriptValueInterface.mm >@@ -75,6 +75,40 @@ > return IMPL->value()->toString(); > } > >+- (void)setValue:(NSString *)newValue >+{ >+ WebCore::JSMainThreadNullState state; >+ ASSERT(newValue); >+ >+ IMPL->setValue(WebCore::SerializedScriptValue::create(WTF::String(newValue))); >+} >+ >+- (NSString *)readonlyValue >+{ >+ WebCore::JSMainThreadNullState state; >+ return IMPL->readonlyValue()->toString(); >+} >+ >+- (NSString *)cachedValue >+{ >+ WebCore::JSMainThreadNullState state; >+ return IMPL->cachedValue()->toString(); >+} >+ >+- (void)setCachedValue:(NSString *)newCachedValue >+{ >+ WebCore::JSMainThreadNullState state; >+ ASSERT(newCachedValue); >+ >+ IMPL->setCachedValue(WebCore::SerializedScriptValue::create(WTF::String(newCachedValue))); >+} >+ >+- (NSString *)cachedReadonlyValue >+{ >+ WebCore::JSMainThreadNullState state; >+ return IMPL->cachedReadonlyValue()->toString(); >+} >+ > @end > > WebCore::TestSerializedScriptValueInterface* core(DOMTestSerializedScriptValueInterface *wrapper) >diff --git a/Source/WebCore/bindings/scripts/test/TestSerializedScriptValueInterface.idl b/Source/WebCore/bindings/scripts/test/TestSerializedScriptValueInterface.idl >index ee1787e48acd0a25d725482bc7dcbd71918cc669..dddee9fae64dec3f09692720b730632aa1694c96 100644 >--- a/Source/WebCore/bindings/scripts/test/TestSerializedScriptValueInterface.idl >+++ b/Source/WebCore/bindings/scripts/test/TestSerializedScriptValueInterface.idl >@@ -30,8 +30,9 @@ module test { > Conditional=Condition1|Condition2, > Constructor(in DOMString hello, in SerializedScriptValue value), > ] TestSerializedScriptValueInterface { >- // The case of a single SerializedScriptValue attribute is a bit of a >- // special case. >- readonly attribute SerializedScriptValue value; >+ attribute SerializedScriptValue value; >+ readonly attribute SerializedScriptValue readonlyValue; >+ attribute [CachedAttribute] SerializedScriptValue cachedValue; >+ readonly attribute [CachedAttribute] SerializedScriptValue cachedReadonlyValue; > }; > } >diff --git a/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp b/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp >index 3d3581bc6f7851265a597f978ee48ae5f45924f3..27e51b2307b489f17d80d62c43de87af2e2e4883 100644 >--- a/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp >+++ b/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp >@@ -42,8 +42,80 @@ namespace TestSerializedScriptValueInterfaceInternal { > > template <typename T> void V8_USE(T) { } > >+static v8::Handle<v8::Value> valueAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) >+{ >+ INC_STATS("DOM.TestSerializedScriptValueInterface.value._get"); >+ TestSerializedScriptValueInterface* imp = V8TestSerializedScriptValueInterface::toNative(info.Holder()); >+ return imp->value() ? imp->value()->deserialize() : v8::Handle<v8::Value>(v8::Null()); >+} >+ >+static void valueAttrSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info) >+{ >+ INC_STATS("DOM.TestSerializedScriptValueInterface.value._set"); >+ TestSerializedScriptValueInterface* imp = V8TestSerializedScriptValueInterface::toNative(info.Holder()); >+ RefPtr<SerializedScriptValue> v = SerializedScriptValue::create(value); >+ imp->setValue(WTF::getPtr(v)); >+ return; >+} >+ >+static v8::Handle<v8::Value> readonlyValueAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) >+{ >+ INC_STATS("DOM.TestSerializedScriptValueInterface.readonlyValue._get"); >+ TestSerializedScriptValueInterface* imp = V8TestSerializedScriptValueInterface::toNative(info.Holder()); >+ return imp->readonlyValue() ? imp->readonlyValue()->deserialize() : v8::Handle<v8::Value>(v8::Null()); >+} >+ >+static v8::Handle<v8::Value> cachedValueAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) >+{ >+ INC_STATS("DOM.TestSerializedScriptValueInterface.cachedValue._get"); >+ v8::Handle<v8::String> propertyName = v8::String::NewSymbol("cachedValue"); >+ v8::Handle<v8::Value> value = info.Holder()->GetHiddenValue(propertyName); >+ if (!value.IsEmpty()) >+ return value; >+ TestSerializedScriptValueInterface* imp = V8TestSerializedScriptValueInterface::toNative(info.Holder()); >+ SerializedScriptValue* serialized = imp->cachedValue(); >+ value = serialized ? serialized->deserialize() : v8::Handle<v8::Value>(v8::Null()); >+ info.Holder()->SetHiddenValue(propertyName, value); >+ return value; >+} >+ >+static void cachedValueAttrSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info) >+{ >+ INC_STATS("DOM.TestSerializedScriptValueInterface.cachedValue._set"); >+ TestSerializedScriptValueInterface* imp = V8TestSerializedScriptValueInterface::toNative(info.Holder()); >+ RefPtr<SerializedScriptValue> v = SerializedScriptValue::create(value); >+ imp->setCachedValue(WTF::getPtr(v)); >+ info.Holder()->DeleteHiddenValue(v8::String::NewSymbol("cachedValue")); // Invalidate the cached value. >+ return; >+} >+ >+static v8::Handle<v8::Value> cachedReadonlyValueAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) >+{ >+ INC_STATS("DOM.TestSerializedScriptValueInterface.cachedReadonlyValue._get"); >+ v8::Handle<v8::String> propertyName = v8::String::NewSymbol("cachedReadonlyValue"); >+ v8::Handle<v8::Value> value = info.Holder()->GetHiddenValue(propertyName); >+ if (!value.IsEmpty()) >+ return value; >+ TestSerializedScriptValueInterface* imp = V8TestSerializedScriptValueInterface::toNative(info.Holder()); >+ SerializedScriptValue* serialized = imp->cachedReadonlyValue(); >+ value = serialized ? serialized->deserialize() : v8::Handle<v8::Value>(v8::Null()); >+ info.Holder()->SetHiddenValue(propertyName, value); >+ return value; >+} >+ > } // namespace TestSerializedScriptValueInterfaceInternal > >+static const BatchedAttribute TestSerializedScriptValueInterfaceAttrs[] = { >+ // Attribute 'value' (Type: 'attribute' ExtAttr: '') >+ {"value", TestSerializedScriptValueInterfaceInternal::valueAttrGetter, TestSerializedScriptValueInterfaceInternal::valueAttrSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */}, >+ // Attribute 'readonlyValue' (Type: 'readonly attribute' ExtAttr: '') >+ {"readonlyValue", TestSerializedScriptValueInterfaceInternal::readonlyValueAttrGetter, 0, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */}, >+ // Attribute 'cachedValue' (Type: 'attribute' ExtAttr: 'CachedAttribute') >+ {"cachedValue", TestSerializedScriptValueInterfaceInternal::cachedValueAttrGetter, TestSerializedScriptValueInterfaceInternal::cachedValueAttrSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */}, >+ // Attribute 'cachedReadonlyValue' (Type: 'readonly attribute' ExtAttr: 'CachedAttribute') >+ {"cachedReadonlyValue", TestSerializedScriptValueInterfaceInternal::cachedReadonlyValueAttrGetter, 0, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */}, >+}; >+ > v8::Handle<v8::Value> V8TestSerializedScriptValueInterface::constructorCallback(const v8::Arguments& args) > { > INC_STATS("DOM.TestSerializedScriptValueInterface.Constructor"); >@@ -66,7 +138,6 @@ v8::Handle<v8::Value> V8TestSerializedScriptValueInterface::constructorCallback( > > V8DOMWrapper::setDOMWrapper(wrapper, &info, impl.get()); > impl->ref(); >- SerializedScriptValue::deserializeAndSetProperty(wrapper, "value", static_cast<v8::PropertyAttribute>(v8::DontDelete | v8::ReadOnly), impl->value()); > V8DOMWrapper::setJSWrapperForDOMObject(impl.get(), v8::Persistent<v8::Object>::New(wrapper)); > return args.Holder(); > } >@@ -77,7 +148,7 @@ static v8::Persistent<v8::FunctionTemplate> ConfigureV8TestSerializedScriptValue > > v8::Local<v8::Signature> defaultSignature; > defaultSignature = configureTemplate(desc, "TestSerializedScriptValueInterface", v8::Persistent<v8::FunctionTemplate>(), V8TestSerializedScriptValueInterface::internalFieldCount, >- 0, 0, >+ TestSerializedScriptValueInterfaceAttrs, WTF_ARRAY_LENGTH(TestSerializedScriptValueInterfaceAttrs), > 0, 0); > UNUSED_PARAM(defaultSignature); // In some cases, it will not be used. > desc->SetCallHandler(V8TestSerializedScriptValueInterface::constructorCallback); >@@ -130,7 +201,6 @@ v8::Handle<v8::Object> V8TestSerializedScriptValueInterface::wrapSlow(TestSerial > return wrapper; > > impl->ref(); >- SerializedScriptValue::deserializeAndSetProperty(wrapper, "value", static_cast<v8::PropertyAttribute>(v8::DontDelete | v8::ReadOnly), impl->value()); > v8::Persistent<v8::Object> wrapperHandle = v8::Persistent<v8::Object>::New(wrapper); > > if (!hasDependentLifetime)
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 77295
:
124462
| 124611