Changeset 207378 in webkit


Ignore:
Timestamp:
Oct 15, 2016 2:15:17 PM (8 years ago)
Author:
Simon Fraser
Message:

Implement serializer = { attribute }
https://bugs.webkit.org/show_bug.cgi?id=163466

Reviewed by Darin Adler.

Fix the code generator to generate code for serializer = { attribute }.
In IDLParser, extend domSerializable with flags for the 'inherit', 'getter' and
'attribute' values (the first two are still unsupported). Fix parseSerializationPattern()
to detect these; it needs to create the domSerializable() now. Basic support
for isSerializableAttribute() is added (primitive types only).

GenerateSerializerFunction is fixed to output code for the serializable attributes
in the order specified in "serializer = {}", as specified in WebIDL.

Removed custom serialization for ClientRect and PerformanceTiming.

Other minor cleanup to always get $interfaceName from $interface->name, and to fix
ObjectConstructor.h to be included as <runtime/ObjectConstructor.h>.

  • CMakeLists.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • bindings/js/JSBindingsAllInOne.cpp:
  • bindings/js/JSClientRectCustom.cpp: Removed.
  • bindings/js/JSPerformanceTimingCustom.cpp: Removed.
  • bindings/scripts/CodeGeneratorJS.pm:

(GenerateImplementation):
(GenerateSerializerFunction):

  • bindings/scripts/IDLParser.pm:

(parseSerializerRest):
(parseSerializationPattern):
(parseSerializationAttributes):
(isSerializableAttribute):
(applyMemberList):

  • bindings/scripts/test/JS/JSTestNode.cpp:
  • bindings/scripts/test/JS/JSTestObj.cpp:

(WebCore::jsTestObjPrototypeFunctionToJSONCaller):

  • bindings/scripts/test/JS/JSTestSerialization.cpp: Added.
  • bindings/scripts/test/JS/JSTestSerialization.h: Added.
  • bindings/scripts/test/TestObj.idl:
  • bindings/scripts/test/TestSerialization.idl: Copied from Source/WebCore/dom/ClientRect.idl.
  • dom/ClientRect.idl:
  • page/PerformanceTiming.idl:
Location:
trunk/Source/WebCore
Files:
2 added
2 deleted
11 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/CMakeLists.txt

    r207345 r207378  
    10761076    bindings/js/JSCallbackData.cpp
    10771077    bindings/js/JSCanvasRenderingContext2DCustom.cpp
    1078     bindings/js/JSClientRectCustom.cpp
    10791078    bindings/js/JSCommandLineAPIHostCustom.cpp
    10801079    bindings/js/JSCryptoAlgorithmBuilder.cpp
     
    11661165    bindings/js/JSNodeListCustom.cpp
    11671166    bindings/js/JSPerformanceEntryCustom.cpp
    1168     bindings/js/JSPerformanceTimingCustom.cpp
    11691167    bindings/js/JSPluginElementFunctions.cpp
    11701168    bindings/js/JSPopStateEventCustom.cpp
  • trunk/Source/WebCore/ChangeLog

    r207376 r207378  
     12016-10-15  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Implement serializer = { attribute }
     4        https://bugs.webkit.org/show_bug.cgi?id=163466
     5
     6        Reviewed by Darin Adler.
     7
     8        Fix the code generator to generate code for serializer = { attribute }.
     9        In IDLParser, extend domSerializable with flags for the 'inherit', 'getter' and
     10        'attribute' values (the first two are still unsupported). Fix parseSerializationPattern()
     11        to detect these; it needs to create the domSerializable() now. Basic support
     12        for isSerializableAttribute() is added (primitive types only).
     13       
     14        GenerateSerializerFunction is fixed to output code for the serializable attributes
     15        in the order specified in "serializer = {}", as specified in WebIDL.
     16       
     17        Removed custom serialization for ClientRect and PerformanceTiming.
     18       
     19        Other minor cleanup to always get $interfaceName from $interface->name, and to fix
     20        ObjectConstructor.h to be included as <runtime/ObjectConstructor.h>.
     21
     22        * CMakeLists.txt:
     23        * WebCore.xcodeproj/project.pbxproj:
     24        * bindings/js/JSBindingsAllInOne.cpp:
     25        * bindings/js/JSClientRectCustom.cpp: Removed.
     26        * bindings/js/JSPerformanceTimingCustom.cpp: Removed.
     27        * bindings/scripts/CodeGeneratorJS.pm:
     28        (GenerateImplementation):
     29        (GenerateSerializerFunction):
     30        * bindings/scripts/IDLParser.pm:
     31        (parseSerializerRest):
     32        (parseSerializationPattern):
     33        (parseSerializationAttributes):
     34        (isSerializableAttribute):
     35        (applyMemberList):
     36        * bindings/scripts/test/JS/JSTestNode.cpp:
     37        * bindings/scripts/test/JS/JSTestObj.cpp:
     38        (WebCore::jsTestObjPrototypeFunctionToJSONCaller):
     39        * bindings/scripts/test/JS/JSTestSerialization.cpp: Added.
     40        * bindings/scripts/test/JS/JSTestSerialization.h: Added.
     41        * bindings/scripts/test/TestObj.idl:
     42        * bindings/scripts/test/TestSerialization.idl: Copied from Source/WebCore/dom/ClientRect.idl.
     43        * dom/ClientRect.idl:
     44        * page/PerformanceTiming.idl:
     45
    1462016-10-15  Michael Catanzaro  <mcatanzaro@igalia.com>
    247
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r207361 r207378  
    13801380                31C0FF3F0E4CEFAC007D6FE5 /* JSWebKitTransitionEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31C0FF3B0E4CEFAC007D6FE5 /* JSWebKitTransitionEvent.cpp */; };
    13811381                31C0FF400E4CEFAC007D6FE5 /* JSWebKitTransitionEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 31C0FF3C0E4CEFAC007D6FE5 /* JSWebKitTransitionEvent.h */; };
    1382                 31C422461D74EB9A00F12342 /* JSPerformanceTimingCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31C422451D74EB9A00F12342 /* JSPerformanceTimingCustom.cpp */; };
    13831382                31D591B316697A6C00E6BF02 /* PlugInClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 31D591B116697A6C00E6BF02 /* PlugInClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
    13841383                31DCD29D1AB4FBDE0072E817 /* AnimationTrigger.h in Headers */ = {isa = PBXBuildFile; fileRef = 31DCD29C1AB4FBDE0072E817 /* AnimationTrigger.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    17401739                467302021C4EFE7800BCB357 /* IgnoreOpensDuringUnloadCountIncrementer.h in Headers */ = {isa = PBXBuildFile; fileRef = 467302011C4EFE6600BCB357 /* IgnoreOpensDuringUnloadCountIncrementer.h */; };
    17411740                4689F1AF1267BAE100E8D380 /* FileMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 4689F1AE1267BAE100E8D380 /* FileMetadata.h */; };
    1742                 46A58AC51D46B3FA00432036 /* JSClientRectCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46A58AC41D46B3FA00432036 /* JSClientRectCustom.cpp */; };
    17431741                46B63F6C1C6E8D19002E914B /* JSEventTargetCustom.h in Headers */ = {isa = PBXBuildFile; fileRef = 46B63F6B1C6E8CDF002E914B /* JSEventTargetCustom.h */; settings = {ATTRIBUTES = (Private, ); }; };
    17441742                46C83EFD1A9BBE2900A79A41 /* GeoNotifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46C83EFB1A9BBE2900A79A41 /* GeoNotifier.cpp */; };
     
    83488346                31C0FF3B0E4CEFAC007D6FE5 /* JSWebKitTransitionEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWebKitTransitionEvent.cpp; sourceTree = "<group>"; };
    83498347                31C0FF3C0E4CEFAC007D6FE5 /* JSWebKitTransitionEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWebKitTransitionEvent.h; sourceTree = "<group>"; };
    8350                 31C422451D74EB9A00F12342 /* JSPerformanceTimingCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPerformanceTimingCustom.cpp; sourceTree = "<group>"; };
    83518348                31D591B116697A6C00E6BF02 /* PlugInClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlugInClient.h; sourceTree = "<group>"; };
    83528349                31DCD29C1AB4FBDE0072E817 /* AnimationTrigger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnimationTrigger.h; sourceTree = "<group>"; };
     
    87568753                467302011C4EFE6600BCB357 /* IgnoreOpensDuringUnloadCountIncrementer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IgnoreOpensDuringUnloadCountIncrementer.h; sourceTree = "<group>"; };
    87578754                4689F1AE1267BAE100E8D380 /* FileMetadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileMetadata.h; sourceTree = "<group>"; };
    8758                 46A58AC41D46B3FA00432036 /* JSClientRectCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSClientRectCustom.cpp; sourceTree = "<group>"; };
    87598755                46B63F6B1C6E8CDF002E914B /* JSEventTargetCustom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSEventTargetCustom.h; sourceTree = "<group>"; };
    87608756                46C83EFB1A9BBE2900A79A41 /* GeoNotifier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GeoNotifier.cpp; sourceTree = "<group>"; };
     
    2120221198                                8931DE5A14C44C44000DC9D2 /* JSBlobCustom.cpp */,
    2120321199                                49EED14B1051971900099FAB /* JSCanvasRenderingContext2DCustom.cpp */,
    21204                                 46A58AC41D46B3FA00432036 /* JSClientRectCustom.cpp */,
    2120521200                                A584FE371864DAC100843B10 /* JSCommandLineAPIHostCustom.cpp */,
    2120621201                                7CEF26181D6A92E300BE905D /* JSCryptoCustom.cpp */,
     
    2128321278                                1A750DD30A90E729000FF215 /* JSNodeIteratorCustom.cpp */,
    2128421279                                BCD9C2610C17AA67005C90A2 /* JSNodeListCustom.cpp */,
    21285                                 31C422451D74EB9A00F12342 /* JSPerformanceTimingCustom.cpp */,
    2128621280                                AD20B18C18E9D216005A8083 /* JSNodeListCustom.h */,
    2128721281                                A85F22081430377D007CC884 /* JSPopStateEventCustom.cpp */,
     
    2773027724                                FD31600712B0267600C1A359 /* AudioDestinationNode.cpp in Sources */,
    2773127725                                FD31608112B026F700C1A359 /* AudioDSPKernelProcessor.cpp in Sources */,
    27732                                 31C422461D74EB9A00F12342 /* JSPerformanceTimingCustom.cpp in Sources */,
    2773327726                                CD5596911475B678001D0BD0 /* AudioFileReaderIOS.cpp in Sources */,
    2773427727                                FD3160BE12B0272A00C1A359 /* AudioFileReaderMac.cpp in Sources */,
     
    2871828711                                65DF31F309D1CC60000BE325 /* JSCharacterData.cpp in Sources */,
    2871928712                                BCC065870F3CE2A700CD2D87 /* JSClientRect.cpp in Sources */,
    28720                                 46A58AC51D46B3FA00432036 /* JSClientRectCustom.cpp in Sources */,
    2872128713                                BCC065890F3CE2A700CD2D87 /* JSClientRectList.cpp in Sources */,
    2872228714                                E3150EA61DA7219000194012 /* JSNodeDOMJIT.cpp in Sources */,
  • trunk/Source/WebCore/bindings/js/JSBindingsAllInOne.cpp

    r206956 r207378  
    4242#include "JSCallbackData.cpp"
    4343#include "JSCanvasRenderingContext2DCustom.cpp"
    44 #include "JSClientRectCustom.cpp"
    4544#include "JSCommandLineAPIHostCustom.cpp"
    4645#include "JSCryptoCustom.cpp"
  • trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm

    r207355 r207378  
    37463746
    37473747    GenerateImplementationIterableFunctions($interface) if $interface->iterable;
    3748     GenerateSerializerFunction($interface, $interfaceName, $className) if $interface->serializable;
     3748    GenerateSerializerFunction($interface, $className) if $interface->serializable;
    37493749
    37503750    if ($needsVisitChildren) {
     
    39693969sub GenerateSerializerFunction
    39703970{
    3971     my ($interface, $interfaceName, $className) = @_;
     3971    my ($interface, $className) = @_;
     3972
     3973    my $interfaceName = $interface->name;
     3974
    39723975    my $serializerFunctionName = "toJSON";
    39733976    my $serializerNativeFunctionName = $codeGenerator->WK_lcfirst($className) . "PrototypeFunction" . $codeGenerator->WK_ucfirst($serializerFunctionName);
    39743977
    3975     AddToImplIncludes("ObjectConstructor.h");
     3978    AddToImplIncludes("<runtime/ObjectConstructor.h>");
    39763979    push(@implContent, "static inline EncodedJSValue ${serializerNativeFunctionName}Caller(ExecState* state, JS$interfaceName* thisObject, JSC::ThrowScope& throwScope)\n");
    39773980    push(@implContent, "{\n");
     
    39793982    push(@implContent, "    auto* result = constructEmptyObject(state);\n");
    39803983    push(@implContent, "\n");
    3981     foreach my $attribute (@{$interface->attributes}) {
     3984
     3985    my @serializedAttributes = ();
     3986    foreach my $attribute_name (@{$interface->serializable->attributes}) {
     3987        foreach my $attribute (@{$interface->attributes}) {
     3988            if ($attribute_name eq $attribute->signature->name) {
     3989                push @serializedAttributes, $attribute;
     3990                last;
     3991            }
     3992        }
     3993    }
     3994
     3995    foreach my $attribute (@serializedAttributes) {
    39823996        my $name = $attribute->signature->name;
    3983         if (grep $_ eq $name, @{$interface->serializable->attributes}) {
    3984             my $getFunctionName = GetAttributeGetterName($interface, $className, $attribute);
    3985             push(@implContent, "    auto ${name}Value = ${getFunctionName}Getter(*state, *thisObject, throwScope);\n");
    3986             push(@implContent, "    ASSERT(!throwScope.exception());\n");
    3987             push(@implContent, "    result->putDirect(vm, Identifier::fromString(&vm, \"${name}\"), ${name}Value);\n");
    3988             push(@implContent, "\n");
    3989         }
    3990     }
     3997
     3998        my $getFunctionName = GetAttributeGetterName($interface, $className, $attribute);
     3999        push(@implContent, "    auto ${name}Value = ${getFunctionName}Getter(*state, *thisObject, throwScope);\n");
     4000        push(@implContent, "    ASSERT(!throwScope.exception());\n");
     4001        push(@implContent, "    result->putDirect(vm, Identifier::fromString(&vm, \"${name}\"), ${name}Value);\n");
     4002        push(@implContent, "\n");
     4003    }
     4004
    39914005    push(@implContent, "    return JSValue::encode(result);\n");
    39924006    push(@implContent, "}\n");
  • trunk/Source/WebCore/bindings/scripts/IDLParser.pm

    r207150 r207378  
    113113struct( domSerializable => {
    114114    attributes => '@', # List of attributes to serialize
     115    hasAttribute => '$', # serializer = { attribute }
     116    hasInherit => '$', # serializer = { inherit }
     117    hasGetter => '$', # serializer = { getter }
    115118    functions => '@', # toJSON function
    116119});
     
    11491152    if ($next->value() eq "=") {
    11501153        $self->assertTokenValue($self->getToken(), "=", __LINE__);
    1151         my $attributes = $self->parseSerializationPattern();
    1152 
    1153         my $newDataNode = domSerializable->new();
    1154         $newDataNode->attributes($attributes);
    1155 
    1156         return $newDataNode;
     1154
     1155        return $self->parseSerializationPattern();
     1156
    11571157    }
    11581158    if ($next->type() == IdentifierToken || $next->value() eq "(") {
     
    11681168    if ($next->value() eq "{") {
    11691169        $self->assertTokenValue($self->getToken(), "{", __LINE__);
    1170         my $attributes = $self->parseSerializationAttributes();
     1170        my $newDataNode = domSerializable->new();
     1171        $self->parseSerializationAttributes($newDataNode);
    11711172        $self->assertTokenValue($self->getToken(), "}", __LINE__);
    1172         return \@{$attributes};
     1173        return $newDataNode;
    11731174    }
    11741175    if ($next->value() eq "[") {
     
    11801181        $self->assertTokenType($token, IdentifierToken);
    11811182        push(@attributes, $token->value());
    1182         return \@attributes;
     1183
     1184        my $newDataNode = domSerializable->new();
     1185        $newDataNode->attributes(\@attributes);
     1186
     1187        return $newDataNode;
    11831188    }
    11841189    $self->assertUnexpectedToken($next->value(), __LINE__);
     
    11881193{
    11891194    my $self = shift;
     1195    my $domSerializable = shift;
    11901196    my $token = $self->getToken();
    11911197
    11921198    if ($token->value() eq "getter") {
     1199        $domSerializable->hasGetter(1);
    11931200        die "Serializer getter keyword is not currently supported.";
    11941201
    11951202    }
    11961203    if ($token->value() eq "inherit") {
     1204        $domSerializable->hasInherit(1);
    11971205        die "Serializer inherit keyword is not currently supported.";
     1206    }
     1207
     1208    if ($token->value() eq "attribute") {
     1209        $domSerializable->hasAttribute(1);
     1210        # Attributes will be filled in via applyMemberList()
     1211        return;
    11981212    }
    11991213
     
    12021216    push(@attributes, $token->value());
    12031217    push(@attributes, @{$self->parseIdentifiers()});
    1204     return \@attributes;
     1218    $domSerializable->attributes(\@attributes);
    12051219}
    12061220
     
    23172331}
    23182332
     2333sub isSerializableAttribute
     2334{
     2335    my $attribute = shift;
     2336
     2337    # FIXME: Need to support more than primitive serializable types.
     2338    # This check may have to move to the code generator, if we don't have enough information
     2339    # here to determine serializability: https://heycam.github.io/webidl/#idl-serializers
     2340    my $serializable_types = '^(\(byte|octet|short|unsigned short|long|unsigned long|long long|unsigned long long|float|unrestricted float|double|unrestricted double|boolean|DOMString|ByteString|USVString)$';
     2341    return $attribute->signature->type =~ /$serializable_types/;
     2342}
    23192343
    23202344sub applyMemberList
     
    23522376    if ($interface->serializable) {
    23532377        my $numSerializerAttributes = @{$interface->serializable->attributes};
    2354         if ($numSerializerAttributes == 0) {
     2378        if ($interface->serializable->hasAttribute) {
     2379            foreach my $attribute (@{$interface->attributes}) {
     2380                if (isSerializableAttribute($attribute)) {
     2381                    push(@{$interface->serializable->attributes}, $attribute->signature->name);
     2382                }
     2383            }
     2384        } elsif ($numSerializerAttributes == 0) {
    23552385            foreach my $attribute (@{$interface->attributes}) {
    23562386                push(@{$interface->serializable->attributes}, $attribute->signature->name);
  • trunk/Source/WebCore/bindings/scripts/test/JS/JSTestNode.cpp

    r207324 r207378  
    2727#include "JSDOMIterator.h"
    2828#include "JSDOMPromise.h"
    29 #include "ObjectConstructor.h"
    3029#include "RuntimeEnabledFeatures.h"
    3130#include "URL.h"
    3231#include <runtime/Error.h>
    3332#include <runtime/JSString.h>
     33#include <runtime/ObjectConstructor.h>
    3434#include <wtf/GetPtr.h>
    3535
  • trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp

    r207328 r207378  
    5454#include "JSTestSubObj.h"
    5555#include "JSXPathNSResolver.h"
    56 #include "ObjectConstructor.h"
    5756#include "RuntimeEnabledFeatures.h"
    5857#include "SVGDocument.h"
     
    77417740    auto* result = constructEmptyObject(state);
    77427741
     7742    auto createValue = jsTestObjCreateGetter(*state, *thisObject, throwScope);
     7743    ASSERT(!throwScope.exception());
     7744    result->putDirect(vm, Identifier::fromString(&vm, "create"), createValue);
     7745
    77437746    auto readOnlyStringAttrValue = jsTestObjReadOnlyStringAttrGetter(*state, *thisObject, throwScope);
    77447747    ASSERT(!throwScope.exception());
     
    77527755    ASSERT(!throwScope.exception());
    77537756    result->putDirect(vm, Identifier::fromString(&vm, "longAttr"), longAttrValue);
    7754 
    7755     auto createValue = jsTestObjCreateGetter(*state, *thisObject, throwScope);
    7756     ASSERT(!throwScope.exception());
    7757     result->putDirect(vm, Identifier::fromString(&vm, "create"), createValue);
    77587757
    77597758    return JSValue::encode(result);
  • trunk/Source/WebCore/bindings/scripts/test/TestObj.idl

    r207170 r207378  
    415415    stringifier attribute USVString stringifierAttribute;
    416416
    417 
    418     serializer = {readOnlyStringAttr, create, enumAttr, longAttr};
     417    serializer = {create, readOnlyStringAttr, enumAttr, longAttr};
    419418};
    420419
  • trunk/Source/WebCore/bindings/scripts/test/TestSerialization.idl

    r207377 r207378  
    11/*
    2  * Copyright (C) 2009 Apple Inc. All Rights Reserved.
     2 * Copyright (C) 2016 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2222 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    2323 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    24  *
    2524 */
    2625
    27 [
    28     ImplementationLacksVTable,
    29     ExportMacro=WEBCORE_EXPORT,
    30 ] interface ClientRect {
    31     readonly attribute unrestricted float top;
    32     readonly attribute unrestricted float right;
    33     readonly attribute unrestricted float bottom;
    34     readonly attribute unrestricted float left;
    35     readonly attribute unrestricted float width;
    36     readonly attribute unrestricted float height;
     26interface TestSerialization {
     27    attribute DOMString             firstStringAttribute;
     28    attribute long                  secondLongAttribute;
     29    attribute TestNode              thirdUnserializableAttribute;
     30    attribute unrestricted double   fourthUnrestrictedDoubleAttribute;
     31    attribute long                  fifthLongAttribute;
    3732
    38     // FIXME: should be serializer = { attribute };
    39     [Custom] Object toJSON();
     33    serializer = { attribute };
    4034};
    41 
  • trunk/Source/WebCore/dom/ClientRect.idl

    r203702 r207378  
    3636    readonly attribute unrestricted float height;
    3737
    38     // FIXME: should be serializer = { attribute };
    39     [Custom] Object toJSON();
     38    serializer = { attribute };
    4039};
    41 
  • trunk/Source/WebCore/page/PerformanceTiming.idl

    r205161 r207378  
    5555    readonly attribute unsigned long long loadEventEnd;
    5656
    57     // FIXME: Should be serializer = { attribute };
    58     [Custom] Object toJSON();
     57    serializer = { attribute };
    5958};
    60 
Note: See TracChangeset for help on using the changeset viewer.