Changeset 223780 in webkit
- Timestamp:
- Oct 20, 2017 12:21:51 PM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r223779 r223780 1 2017-10-20 Andy Estes <aestes@apple.com> 2 3 Generated serializers do not properly handle optional interface attributes 4 https://bugs.webkit.org/show_bug.cgi?id=178542 5 6 Reviewed by Sam Weinig. 7 8 * bindings/scripts/CodeGeneratorJS.pm: 9 (GenerateSerializerDefinition): 10 * bindings/scripts/test/JS/JSTestSerialization.cpp: 11 (WebCore::JSTestSerialization::serialize): 12 1 13 2017-10-20 Antoine Quint <graouts@apple.com> 2 14 -
trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
r223746 r223780 5256 5256 if ($codeGenerator->IsInterfaceType($attribute->type)) { 5257 5257 my $attributeInterfaceName = $attribute->type->name; 5258 push(@implContent, " auto* ${name}SerializedValue = JS${attributeInterfaceName}::serialize(state, *jsCast<JS${attributeInterfaceName}*>(${name}Value), globalObject, throwScope);\n"); 5259 push(@implContent, " result->putDirect(vm, Identifier::fromString(&vm, \"${name}\"), ${name}SerializedValue);\n"); 5258 if ($attribute->type->isNullable) { 5259 push(@implContent, " if (!${name}Value.isNull()) {\n"); 5260 push(@implContent, " auto* ${name}SerializedValue = JS${attributeInterfaceName}::serialize(state, *jsCast<JS${attributeInterfaceName}*>(${name}Value), globalObject, throwScope);\n"); 5261 push(@implContent, " result->putDirect(vm, Identifier::fromString(&vm, \"${name}\"), ${name}SerializedValue);\n"); 5262 push(@implContent, " } else\n"); 5263 push(@implContent, " result->putDirect(vm, Identifier::fromString(&vm, \"${name}\"), ${name}Value);\n"); 5264 } else { 5265 push(@implContent, " auto* ${name}SerializedValue = JS${attributeInterfaceName}::serialize(state, *jsCast<JS${attributeInterfaceName}*>(${name}Value), globalObject, throwScope);\n"); 5266 push(@implContent, " result->putDirect(vm, Identifier::fromString(&vm, \"${name}\"), ${name}SerializedValue);\n"); 5267 } 5260 5268 } else { 5261 5269 push(@implContent, " result->putDirect(vm, Identifier::fromString(&vm, \"${name}\"), ${name}Value);\n"); -
trunk/Source/WebCore/bindings/scripts/test/JS/JSTestSerialization.cpp
r223476 r223780 26 26 #include "JSDOMConstructorNotConstructable.h" 27 27 #include "JSDOMConvertInterface.h" 28 #include "JSDOMConvertNullable.h" 28 29 #include "JSDOMConvertNumbers.h" 29 30 #include "JSDOMConvertStrings.h" … … 68 69 JSC::EncodedJSValue jsTestSerializationEighthIndirectlyAttribute(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName); 69 70 bool setJSTestSerializationEighthIndirectlyAttribute(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue); 71 JSC::EncodedJSValue jsTestSerializationNinthOptionalDirectlySerializableAttribute(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName); 72 bool setJSTestSerializationNinthOptionalDirectlySerializableAttribute(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue); 70 73 71 74 class JSTestSerializationPrototype : public JSC::JSNonFinalObject { … … 124 127 { "seventhDirectlySerializableAttribute", static_cast<unsigned>(JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializationSeventhDirectlySerializableAttribute), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestSerializationSeventhDirectlySerializableAttribute) } }, 125 128 { "eighthIndirectlyAttribute", static_cast<unsigned>(JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializationEighthIndirectlyAttribute), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestSerializationEighthIndirectlyAttribute) } }, 129 { "ninthOptionalDirectlySerializableAttribute", static_cast<unsigned>(JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializationNinthOptionalDirectlySerializableAttribute), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestSerializationNinthOptionalDirectlySerializableAttribute) } }, 126 130 { "toJSON", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestSerializationPrototypeFunctionToJSON), (intptr_t) (0) } }, 127 131 }; … … 451 455 } 452 456 457 static inline JSValue jsTestSerializationNinthOptionalDirectlySerializableAttributeGetter(ExecState& state, JSTestSerialization& thisObject, ThrowScope& throwScope) 458 { 459 UNUSED_PARAM(throwScope); 460 UNUSED_PARAM(state); 461 auto& impl = thisObject.wrapped(); 462 JSValue result = toJS<IDLNullable<IDLInterface<TestSerializationInheritFinal>>>(state, *thisObject.globalObject(), throwScope, impl.ninthOptionalDirectlySerializableAttribute()); 463 return result; 464 } 465 466 EncodedJSValue jsTestSerializationNinthOptionalDirectlySerializableAttribute(ExecState* state, EncodedJSValue thisValue, PropertyName) 467 { 468 return IDLAttribute<JSTestSerialization>::get<jsTestSerializationNinthOptionalDirectlySerializableAttributeGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "ninthOptionalDirectlySerializableAttribute"); 469 } 470 471 static inline bool setJSTestSerializationNinthOptionalDirectlySerializableAttributeSetter(ExecState& state, JSTestSerialization& thisObject, JSValue value, ThrowScope& throwScope) 472 { 473 UNUSED_PARAM(throwScope); 474 auto& impl = thisObject.wrapped(); 475 auto nativeValue = convert<IDLNullable<IDLInterface<TestSerializationInheritFinal>>>(state, value, [](JSC::ExecState& state, JSC::ThrowScope& scope) { throwAttributeTypeError(state, scope, "TestSerialization", "ninthOptionalDirectlySerializableAttribute", "TestSerializationInheritFinal"); }); 476 RETURN_IF_EXCEPTION(throwScope, false); 477 AttributeSetter::call(state, throwScope, [&] { 478 return impl.setNinthOptionalDirectlySerializableAttribute(WTFMove(nativeValue)); 479 }); 480 return true; 481 } 482 483 bool setJSTestSerializationNinthOptionalDirectlySerializableAttribute(ExecState* state, EncodedJSValue thisValue, EncodedJSValue encodedValue) 484 { 485 return IDLAttribute<JSTestSerialization>::set<setJSTestSerializationNinthOptionalDirectlySerializableAttributeSetter>(*state, thisValue, encodedValue, "ninthOptionalDirectlySerializableAttribute"); 486 } 487 453 488 JSC::JSObject* JSTestSerialization::serialize(ExecState& state, JSTestSerialization& thisObject, JSDOMGlobalObject& globalObject, ThrowScope& throwScope) 454 489 { … … 485 520 auto* eighthIndirectlyAttributeSerializedValue = JSTestSerializationIndirectInheritance::serialize(state, *jsCast<JSTestSerializationIndirectInheritance*>(eighthIndirectlyAttributeValue), globalObject, throwScope); 486 521 result->putDirect(vm, Identifier::fromString(&vm, "eighthIndirectlyAttribute"), eighthIndirectlyAttributeSerializedValue); 522 523 auto ninthOptionalDirectlySerializableAttributeValue = jsTestSerializationNinthOptionalDirectlySerializableAttributeGetter(state, thisObject, throwScope); 524 throwScope.assertNoException(); 525 if (!ninthOptionalDirectlySerializableAttributeValue.isNull()) { 526 auto* ninthOptionalDirectlySerializableAttributeSerializedValue = JSTestSerializationInheritFinal::serialize(state, *jsCast<JSTestSerializationInheritFinal*>(ninthOptionalDirectlySerializableAttributeValue), globalObject, throwScope); 527 result->putDirect(vm, Identifier::fromString(&vm, "ninthOptionalDirectlySerializableAttribute"), ninthOptionalDirectlySerializableAttributeSerializedValue); 528 } else 529 result->putDirect(vm, Identifier::fromString(&vm, "ninthOptionalDirectlySerializableAttribute"), ninthOptionalDirectlySerializableAttributeValue); 487 530 488 531 return result; -
trunk/Source/WebCore/bindings/scripts/test/TestSerialization.idl
r218511 r223780 36 36 attribute TestSerializationInheritFinal seventhDirectlySerializableAttribute; 37 37 attribute TestSerializationIndirectInheritance eighthIndirectlyAttribute; 38 attribute TestSerializationInheritFinal? ninthOptionalDirectlySerializableAttribute; 38 39 39 40 serializer = { attribute };
Note: See TracChangeset
for help on using the changeset viewer.