Changeset 223780 in webkit


Ignore:
Timestamp:
Oct 20, 2017 12:21:51 PM (7 years ago)
Author:
aestes@apple.com
Message:

Generated serializers do not properly handle optional interface attributes
https://bugs.webkit.org/show_bug.cgi?id=178542

Reviewed by Sam Weinig.

  • bindings/scripts/CodeGeneratorJS.pm:

(GenerateSerializerDefinition):

  • bindings/scripts/test/JS/JSTestSerialization.cpp:

(WebCore::JSTestSerialization::serialize):

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r223779 r223780  
     12017-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
    1132017-10-20  Antoine Quint  <graouts@apple.com>
    214
  • trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm

    r223746 r223780  
    52565256        if ($codeGenerator->IsInterfaceType($attribute->type)) {
    52575257            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            }
    52605268        } else {
    52615269            push(@implContent, "    result->putDirect(vm, Identifier::fromString(&vm, \"${name}\"), ${name}Value);\n");
  • trunk/Source/WebCore/bindings/scripts/test/JS/JSTestSerialization.cpp

    r223476 r223780  
    2626#include "JSDOMConstructorNotConstructable.h"
    2727#include "JSDOMConvertInterface.h"
     28#include "JSDOMConvertNullable.h"
    2829#include "JSDOMConvertNumbers.h"
    2930#include "JSDOMConvertStrings.h"
     
    6869JSC::EncodedJSValue jsTestSerializationEighthIndirectlyAttribute(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
    6970bool setJSTestSerializationEighthIndirectlyAttribute(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
     71JSC::EncodedJSValue jsTestSerializationNinthOptionalDirectlySerializableAttribute(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
     72bool setJSTestSerializationNinthOptionalDirectlySerializableAttribute(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
    7073
    7174class JSTestSerializationPrototype : public JSC::JSNonFinalObject {
     
    124127    { "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) } },
    125128    { "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) } },
    126130    { "toJSON", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestSerializationPrototypeFunctionToJSON), (intptr_t) (0) } },
    127131};
     
    451455}
    452456
     457static 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
     466EncodedJSValue jsTestSerializationNinthOptionalDirectlySerializableAttribute(ExecState* state, EncodedJSValue thisValue, PropertyName)
     467{
     468    return IDLAttribute<JSTestSerialization>::get<jsTestSerializationNinthOptionalDirectlySerializableAttributeGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "ninthOptionalDirectlySerializableAttribute");
     469}
     470
     471static 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
     483bool setJSTestSerializationNinthOptionalDirectlySerializableAttribute(ExecState* state, EncodedJSValue thisValue, EncodedJSValue encodedValue)
     484{
     485    return IDLAttribute<JSTestSerialization>::set<setJSTestSerializationNinthOptionalDirectlySerializableAttributeSetter>(*state, thisValue, encodedValue, "ninthOptionalDirectlySerializableAttribute");
     486}
     487
    453488JSC::JSObject* JSTestSerialization::serialize(ExecState& state, JSTestSerialization& thisObject, JSDOMGlobalObject& globalObject, ThrowScope& throwScope)
    454489{
     
    485520    auto* eighthIndirectlyAttributeSerializedValue = JSTestSerializationIndirectInheritance::serialize(state, *jsCast<JSTestSerializationIndirectInheritance*>(eighthIndirectlyAttributeValue), globalObject, throwScope);
    486521    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);
    487530
    488531    return result;
  • trunk/Source/WebCore/bindings/scripts/test/TestSerialization.idl

    r218511 r223780  
    3636    attribute TestSerializationInheritFinal seventhDirectlySerializableAttribute;
    3737    attribute TestSerializationIndirectInheritance eighthIndirectlyAttribute;
     38    attribute TestSerializationInheritFinal? ninthOptionalDirectlySerializableAttribute;
    3839
    3940    serializer = { attribute };
Note: See TracChangeset for help on using the changeset viewer.