<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[218511] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/218511">218511</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2017-06-19 14:55:00 -0700 (Mon, 19 Jun 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>[WebIDL] Add support for serializers that have members that are themselves serializers (or inherit being a serializer from a parent)
https://bugs.webkit.org/show_bug.cgi?id=173395

Patch by Sam Weinig <sam@webkit.org> on 2017-06-19
Reviewed by Simon Fraser.

Source/WebCore:

Test: fast/css/DOMQuad-serialization.html

* bindings/scripts/CodeGenerator.pm:
(InheritsSerializable):
Helper to determine if an interface inherits from any interfaces
that are serializable. This is necessary because an attribute is
serializable even if its interface is not marked as serializable.

(IsSerializableAttribute):
Check ancestor interfaces as well to determine serializability.

* bindings/scripts/CodeGeneratorJS.pm:
(GenerateSerializerDefinition):
Specialize attributes that are serializable interfaces to call its interfaces
serialize function, thus allowing nested objects to be serialized.

* dom/DOMQuad.idl:
Add serializer.

* bindings/scripts/test/JS/JSTestSerialization.cpp:
* bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.cpp: Added.
* bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.h: Added.
* bindings/scripts/test/TestSerialization.idl:
* bindings/scripts/test/TestSerializationIndirectInheritance.idl: Added.
Add and update tests.

LayoutTests:

* fast/css/DOMQuad-serialization-expected.txt: Added.
* fast/css/DOMQuad-serialization.html: Added.
Add test for DOMQuad serialization, now that it is supported.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptsCodeGeneratorpm">trunk/Source/WebCore/bindings/scripts/CodeGenerator.pm</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm">trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestSerializationcpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestSerialization.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestTestSerializationidl">trunk/Source/WebCore/bindings/scripts/test/TestSerialization.idl</a></li>
<li><a href="#trunkSourceWebCoredomDOMQuadidl">trunk/Source/WebCore/dom/DOMQuad.idl</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastcssDOMQuadserializationexpectedtxt">trunk/LayoutTests/fast/css/DOMQuad-serialization-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastcssDOMQuadserializationhtml">trunk/LayoutTests/fast/css/DOMQuad-serialization.html</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestSerializationIndirectInheritancecpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestSerializationIndirectInheritanceh">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.h</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestTestSerializationIndirectInheritanceidl">trunk/Source/WebCore/bindings/scripts/test/TestSerializationIndirectInheritance.idl</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (218510 => 218511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog      2017-06-19 21:27:05 UTC (rev 218510)
+++ trunk/LayoutTests/ChangeLog 2017-06-19 21:55:00 UTC (rev 218511)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2017-06-19  Sam Weinig  <sam@webkit.org>
+
+        [WebIDL] Add support for serializers that have members that are themselves serializers (or inherit being a serializer from a parent)
+        https://bugs.webkit.org/show_bug.cgi?id=173395
+
+        Reviewed by Simon Fraser.
+
+        * fast/css/DOMQuad-serialization-expected.txt: Added.
+        * fast/css/DOMQuad-serialization.html: Added.
+        Add test for DOMQuad serialization, now that it is supported.
+
</ins><span class="cx"> 2017-06-19  Commit Queue  <commit-queue@webkit.org>
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r218505.
</span></span></pre></div>
<a id="trunkLayoutTestsfastcssDOMQuadserializationexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css/DOMQuad-serialization-expected.txt (0 => 218511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/DOMQuad-serialization-expected.txt                            (rev 0)
+++ trunk/LayoutTests/fast/css/DOMQuad-serialization-expected.txt       2017-06-19 21:55:00 UTC (rev 218511)
</span><span class="lines">@@ -0,0 +1,5 @@
</span><ins>+
+PASS DOMQuad has a toJSON function 
+PASS The values of all the points in a DOMQuad are serialized to JSON. 
+PASS The values of all the points in a DOMQuad are preserved through a round-trip through JSON.stringify and JSON.parse 
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastcssDOMQuadserializationhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css/DOMQuad-serialization.html (0 => 218511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/DOMQuad-serialization.html                            (rev 0)
+++ trunk/LayoutTests/fast/css/DOMQuad-serialization.html       2017-06-19 21:55:00 UTC (rev 218511)
</span><span class="lines">@@ -0,0 +1,54 @@
</span><ins>+<!DOCTYPE html>
+<html>
+<body>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+
+<script>
+
+test(() => {
+    var quad = new DOMQuad();
+    assert_equals(quad.__proto__, DOMQuad.prototype);
+
+    var toJSONDescriptor = Object.getOwnPropertyDescriptor(DOMQuad.prototype, "toJSON");
+    assert_exists(toJSONDescriptor, "value");
+    assert_true(toJSONDescriptor.enumerable);
+    assert_true(toJSONDescriptor.configurable);
+    assert_true(toJSONDescriptor.writable);
+}, "DOMQuad has a toJSON function");
+
+function check(jsonObject, quad)
+{
+    assert_equals(jsonObject.p1.x, quad.p1.x, "Expected value for p1.x is " + quad.p1.x);
+    assert_equals(jsonObject.p1.y, quad.p1.y, "Expected value for p1.y is " + quad.p1.y);
+    assert_equals(jsonObject.p1.z, quad.p1.z, "Expected value for p1.z is " + quad.p1.z);
+    assert_equals(jsonObject.p1.w, quad.p1.w, "Expected value for p1.w is " + quad.p1.w);
+    assert_equals(jsonObject.p2.x, quad.p2.x, "Expected value for p2.x is " + quad.p2.x);
+    assert_equals(jsonObject.p2.y, quad.p2.y, "Expected value for p2.y is " + quad.p2.y);
+    assert_equals(jsonObject.p2.z, quad.p2.z, "Expected value for p2.z is " + quad.p2.z);
+    assert_equals(jsonObject.p2.w, quad.p2.w, "Expected value for p2.w is " + quad.p2.w);
+    assert_equals(jsonObject.p3.x, quad.p3.x, "Expected value for p3.x is " + quad.p3.x);
+    assert_equals(jsonObject.p3.y, quad.p3.y, "Expected value for p3.y is " + quad.p3.y);
+    assert_equals(jsonObject.p3.z, quad.p3.z, "Expected value for p3.z is " + quad.p3.z);
+    assert_equals(jsonObject.p3.w, quad.p3.w, "Expected value for p3.w is " + quad.p3.w);
+    assert_equals(jsonObject.p4.x, quad.p4.x, "Expected value for p4.x is " + quad.p4.x);
+    assert_equals(jsonObject.p4.y, quad.p4.y, "Expected value for p4.y is " + quad.p4.y);
+    assert_equals(jsonObject.p4.z, quad.p4.z, "Expected value for p4.z is " + quad.p4.z);
+    assert_equals(jsonObject.p4.w, quad.p4.w, "Expected value for p4.w is " + quad.p4.w);
+}
+
+test(() => {
+    var quad = new DOMQuad();
+    jsonObject = quad.toJSON();
+    check(jsonObject, quad);
+}, "The values of all the points in a DOMQuad are serialized to JSON.");
+
+test(() => {
+    var quad = new DOMQuad();
+    parsedJSONObject = JSON.parse(JSON.stringify(quad))
+    check(parsedJSONObject, quad);
+}, "The values of all the points in a DOMQuad are preserved through a round-trip through JSON.stringify and JSON.parse");
+
+</script>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (218510 => 218511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2017-06-19 21:27:05 UTC (rev 218510)
+++ trunk/Source/WebCore/ChangeLog      2017-06-19 21:55:00 UTC (rev 218511)
</span><span class="lines">@@ -1,3 +1,36 @@
</span><ins>+2017-06-19  Sam Weinig  <sam@webkit.org>
+
+        [WebIDL] Add support for serializers that have members that are themselves serializers (or inherit being a serializer from a parent)
+        https://bugs.webkit.org/show_bug.cgi?id=173395
+
+        Reviewed by Simon Fraser.
+
+        Test: fast/css/DOMQuad-serialization.html
+
+        * bindings/scripts/CodeGenerator.pm:
+        (InheritsSerializable):
+        Helper to determine if an interface inherits from any interfaces
+        that are serializable. This is necessary because an attribute is
+        serializable even if its interface is not marked as serializable. 
+
+        (IsSerializableAttribute):
+        Check ancestor interfaces as well to determine serializability.
+
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (GenerateSerializerDefinition):
+        Specialize attributes that are serializable interfaces to call its interfaces
+        serialize function, thus allowing nested objects to be serialized.
+
+        * dom/DOMQuad.idl:
+        Add serializer.
+
+        * bindings/scripts/test/JS/JSTestSerialization.cpp:
+        * bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.cpp: Added.
+        * bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.h: Added.
+        * bindings/scripts/test/TestSerialization.idl:
+        * bindings/scripts/test/TestSerializationIndirectInheritance.idl: Added.
+        Add and update tests.
+
</ins><span class="cx"> 2017-06-19  Commit Queue  <commit-queue@webkit.org>
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r218505.
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptsCodeGeneratorpm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/CodeGenerator.pm (218510 => 218511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/CodeGenerator.pm   2017-06-19 21:27:05 UTC (rev 218510)
+++ trunk/Source/WebCore/bindings/scripts/CodeGenerator.pm      2017-06-19 21:55:00 UTC (rev 218511)
</span><span class="lines">@@ -903,9 +903,22 @@
</span><span class="cx">     return 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+sub InheritsSerializable
+{
+    my ($object, $interface) = @_;
+
+    my $anyParentIsSerializable = 0;
+    $object->ForAllParents($interface, sub {
+        my $parentInterface = shift;
+        $anyParentIsSerializable = 1 if $parentInterface->serializable;
+    }, 0);
+
+    return $anyParentIsSerializable;
+}
+
</ins><span class="cx"> sub IsSerializableAttribute
</span><span class="cx"> {
</span><del>-    my ($object, $currentInterface, $attribute) = @_;
</del><ins>+    my ($object, $interface, $attribute) = @_;
</ins><span class="cx"> 
</span><span class="cx">     # https://heycam.github.io/webidl/#dfn-serializable-type
</span><span class="cx"> 
</span><span class="lines">@@ -920,9 +933,12 @@
</span><span class="cx">         die "Serializer for non-primitive types is not currently supported\n";
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    my $interface = GetInterfaceForAttribute($object, $currentInterface, $attribute);
-    if ($interface && $interface->serializable) {
-        die "Serializer for non-primitive types is not currently supported\n";
</del><ins>+    return 0 if !$object->IsInterfaceType($type);
+
+    my $interfaceForAttribute = $object->GetInterfaceForAttribute($interface, $attribute);
+    if ($interfaceForAttribute) {
+        return 1 if $interfaceForAttribute->serializable;
+        return $object->InheritsSerializable($interfaceForAttribute);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return 0;
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (218510 => 218511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm 2017-06-19 21:27:05 UTC (rev 218510)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm    2017-06-19 21:55:00 UTC (rev 218511)
</span><span class="lines">@@ -5192,11 +5192,21 @@
</span><span class="cx">     push(@implContent, "\n");
</span><span class="cx"> 
</span><span class="cx">     foreach my $attribute (@serializedAttributes) {
</span><ins>+        assert("Attributes that throw exceptions are not supported with serializers yet.") if $attribute->extendedAttributes->{GetterMayThrowException} || $attribute->extendedAttributes->{MayThrowException};
+
</ins><span class="cx">         my $name = $attribute->name;
</span><span class="cx">         my $getFunctionName = GetAttributeGetterName($interface, $className, $attribute);
</span><span class="cx">         push(@implContent, "    auto ${name}Value = ${getFunctionName}Getter(state, thisObject, throwScope);\n");
</span><span class="cx">         push(@implContent, "    throwScope.assertNoException();\n");
</span><del>-        push(@implContent, "    result->putDirect(vm, Identifier::fromString(&vm, \"${name}\"), ${name}Value);\n");
</del><ins>+
+        if ($codeGenerator->IsInterfaceType($attribute->type)) {
+            my $attributeInterfaceName = $attribute->type->name;
+            push(@implContent, "    auto* ${name}SerializedValue = JS${attributeInterfaceName}::serialize(state, *jsCast<JS${attributeInterfaceName}*>(${name}Value), globalObject, throwScope);\n");
+            push(@implContent, "    result->putDirect(vm, Identifier::fromString(&vm, \"${name}\"), ${name}SerializedValue);\n");
+        } else {
+            push(@implContent, "    result->putDirect(vm, Identifier::fromString(&vm, \"${name}\"), ${name}Value);\n");
+        }
+
</ins><span class="cx">         push(@implContent, "\n");
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestSerializationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestSerialization.cpp (218510 => 218511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestSerialization.cpp    2017-06-19 21:27:05 UTC (rev 218510)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestSerialization.cpp       2017-06-19 21:55:00 UTC (rev 218511)
</span><span class="lines">@@ -32,6 +32,8 @@
</span><span class="cx"> #include "JSDOMOperation.h"
</span><span class="cx"> #include "JSDOMWrapperCache.h"
</span><span class="cx"> #include "JSTestException.h"
</span><ins>+#include "JSTestSerializationIndirectInheritance.h"
+#include "JSTestSerializationInheritFinal.h"
</ins><span class="cx"> #include <runtime/FunctionPrototype.h>
</span><span class="cx"> #include <runtime/JSCInlines.h>
</span><span class="cx"> #include <runtime/ObjectConstructor.h>
</span><span class="lines">@@ -61,6 +63,10 @@
</span><span class="cx"> bool setJSTestSerializationFifthLongAttribute(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
</span><span class="cx"> JSC::EncodedJSValue jsTestSerializationSixthTypedefAttribute(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
</span><span class="cx"> bool setJSTestSerializationSixthTypedefAttribute(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
</span><ins>+JSC::EncodedJSValue jsTestSerializationSeventhDirectlySerializableAttribute(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
+bool setJSTestSerializationSeventhDirectlySerializableAttribute(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
+JSC::EncodedJSValue jsTestSerializationEighthIndirectlyAttribute(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
+bool setJSTestSerializationEighthIndirectlyAttribute(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
</ins><span class="cx"> 
</span><span class="cx"> class JSTestSerializationPrototype : public JSC::JSNonFinalObject {
</span><span class="cx"> public:
</span><span class="lines">@@ -115,6 +121,8 @@
</span><span class="cx">     { "fourthUnrestrictedDoubleAttribute", CustomAccessor, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializationFourthUnrestrictedDoubleAttribute), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestSerializationFourthUnrestrictedDoubleAttribute) } },
</span><span class="cx">     { "fifthLongAttribute", CustomAccessor, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializationFifthLongAttribute), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestSerializationFifthLongAttribute) } },
</span><span class="cx">     { "sixthTypedefAttribute", CustomAccessor, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializationSixthTypedefAttribute), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestSerializationSixthTypedefAttribute) } },
</span><ins>+    { "seventhDirectlySerializableAttribute", CustomAccessor, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializationSeventhDirectlySerializableAttribute), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestSerializationSeventhDirectlySerializableAttribute) } },
+    { "eighthIndirectlyAttribute", CustomAccessor, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializationEighthIndirectlyAttribute), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestSerializationEighthIndirectlyAttribute) } },
</ins><span class="cx">     { "toJSON", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestSerializationPrototypeFunctionToJSON), (intptr_t) (0) } },
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -374,6 +382,66 @@
</span><span class="cx">     return IDLAttribute<JSTestSerialization>::set<setJSTestSerializationSixthTypedefAttributeSetter>(*state, thisValue, encodedValue, "sixthTypedefAttribute");
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static inline JSValue jsTestSerializationSeventhDirectlySerializableAttributeGetter(ExecState& state, JSTestSerialization& thisObject, ThrowScope& throwScope)
+{
+    UNUSED_PARAM(throwScope);
+    UNUSED_PARAM(state);
+    auto& impl = thisObject.wrapped();
+    JSValue result = toJS<IDLInterface<TestSerializationInheritFinal>>(state, *thisObject.globalObject(), impl.seventhDirectlySerializableAttribute());
+    return result;
+}
+
+EncodedJSValue jsTestSerializationSeventhDirectlySerializableAttribute(ExecState* state, EncodedJSValue thisValue, PropertyName)
+{
+    return IDLAttribute<JSTestSerialization>::get<jsTestSerializationSeventhDirectlySerializableAttributeGetter>(*state, thisValue, "seventhDirectlySerializableAttribute");
+}
+
+static inline bool setJSTestSerializationSeventhDirectlySerializableAttributeSetter(ExecState& state, JSTestSerialization& thisObject, JSValue value, ThrowScope& throwScope)
+{
+    UNUSED_PARAM(state);
+    UNUSED_PARAM(throwScope);
+    auto& impl = thisObject.wrapped();
+    auto nativeValue = convert<IDLInterface<TestSerializationInheritFinal>>(state, value, [](JSC::ExecState& state, JSC::ThrowScope& scope) { throwAttributeTypeError(state, scope, "TestSerialization", "seventhDirectlySerializableAttribute", "TestSerializationInheritFinal"); });
+    RETURN_IF_EXCEPTION(throwScope, false);
+    impl.setSeventhDirectlySerializableAttribute(*nativeValue);
+    return true;
+}
+
+bool setJSTestSerializationSeventhDirectlySerializableAttribute(ExecState* state, EncodedJSValue thisValue, EncodedJSValue encodedValue)
+{
+    return IDLAttribute<JSTestSerialization>::set<setJSTestSerializationSeventhDirectlySerializableAttributeSetter>(*state, thisValue, encodedValue, "seventhDirectlySerializableAttribute");
+}
+
+static inline JSValue jsTestSerializationEighthIndirectlyAttributeGetter(ExecState& state, JSTestSerialization& thisObject, ThrowScope& throwScope)
+{
+    UNUSED_PARAM(throwScope);
+    UNUSED_PARAM(state);
+    auto& impl = thisObject.wrapped();
+    JSValue result = toJS<IDLInterface<TestSerializationIndirectInheritance>>(state, *thisObject.globalObject(), impl.eighthIndirectlyAttribute());
+    return result;
+}
+
+EncodedJSValue jsTestSerializationEighthIndirectlyAttribute(ExecState* state, EncodedJSValue thisValue, PropertyName)
+{
+    return IDLAttribute<JSTestSerialization>::get<jsTestSerializationEighthIndirectlyAttributeGetter>(*state, thisValue, "eighthIndirectlyAttribute");
+}
+
+static inline bool setJSTestSerializationEighthIndirectlyAttributeSetter(ExecState& state, JSTestSerialization& thisObject, JSValue value, ThrowScope& throwScope)
+{
+    UNUSED_PARAM(state);
+    UNUSED_PARAM(throwScope);
+    auto& impl = thisObject.wrapped();
+    auto nativeValue = convert<IDLInterface<TestSerializationIndirectInheritance>>(state, value, [](JSC::ExecState& state, JSC::ThrowScope& scope) { throwAttributeTypeError(state, scope, "TestSerialization", "eighthIndirectlyAttribute", "TestSerializationIndirectInheritance"); });
+    RETURN_IF_EXCEPTION(throwScope, false);
+    impl.setEighthIndirectlyAttribute(*nativeValue);
+    return true;
+}
+
+bool setJSTestSerializationEighthIndirectlyAttribute(ExecState* state, EncodedJSValue thisValue, EncodedJSValue encodedValue)
+{
+    return IDLAttribute<JSTestSerialization>::set<setJSTestSerializationEighthIndirectlyAttributeSetter>(*state, thisValue, encodedValue, "eighthIndirectlyAttribute");
+}
+
</ins><span class="cx"> JSC::JSObject* JSTestSerialization::serialize(ExecState& state, JSTestSerialization& thisObject, JSDOMGlobalObject& globalObject, ThrowScope& throwScope)
</span><span class="cx"> {
</span><span class="cx">     auto& vm = state.vm();
</span><span class="lines">@@ -399,6 +467,16 @@
</span><span class="cx">     throwScope.assertNoException();
</span><span class="cx">     result->putDirect(vm, Identifier::fromString(&vm, "sixthTypedefAttribute"), sixthTypedefAttributeValue);
</span><span class="cx"> 
</span><ins>+    auto seventhDirectlySerializableAttributeValue = jsTestSerializationSeventhDirectlySerializableAttributeGetter(state, thisObject, throwScope);
+    throwScope.assertNoException();
+    auto* seventhDirectlySerializableAttributeSerializedValue = JSTestSerializationInheritFinal::serialize(state, *jsCast<JSTestSerializationInheritFinal*>(seventhDirectlySerializableAttributeValue), globalObject, throwScope);
+    result->putDirect(vm, Identifier::fromString(&vm, "seventhDirectlySerializableAttribute"), seventhDirectlySerializableAttributeSerializedValue);
+
+    auto eighthIndirectlyAttributeValue = jsTestSerializationEighthIndirectlyAttributeGetter(state, thisObject, throwScope);
+    throwScope.assertNoException();
+    auto* eighthIndirectlyAttributeSerializedValue = JSTestSerializationIndirectInheritance::serialize(state, *jsCast<JSTestSerializationIndirectInheritance*>(eighthIndirectlyAttributeValue), globalObject, throwScope);
+    result->putDirect(vm, Identifier::fromString(&vm, "eighthIndirectlyAttribute"), eighthIndirectlyAttributeSerializedValue);
+
</ins><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestSerializationIndirectInheritancecpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.cpp (0 => 218511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.cpp                         (rev 0)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.cpp    2017-06-19 21:55:00 UTC (rev 218511)
</span><span class="lines">@@ -0,0 +1,149 @@
</span><ins>+/*
+    This file is part of the WebKit open source project.
+    This file has been generated by generate-bindings.pl. DO NOT MODIFY!
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to
+    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1301, USA.
+*/
+
+#include "config.h"
+#include "JSTestSerializationIndirectInheritance.h"
+
+#include "JSDOMBinding.h"
+#include "JSDOMConstructorNotConstructable.h"
+#include "JSDOMExceptionHandling.h"
+#include "JSDOMWrapperCache.h"
+#include <runtime/JSCInlines.h>
+#include <wtf/GetPtr.h>
+
+using namespace JSC;
+
+namespace WebCore {
+
+// Attributes
+
+JSC::EncodedJSValue jsTestSerializationIndirectInheritanceConstructor(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
+bool setJSTestSerializationIndirectInheritanceConstructor(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
+
+class JSTestSerializationIndirectInheritancePrototype : public JSC::JSNonFinalObject {
+public:
+    using Base = JSC::JSNonFinalObject;
+    static JSTestSerializationIndirectInheritancePrototype* create(JSC::VM& vm, JSDOMGlobalObject* globalObject, JSC::Structure* structure)
+    {
+        JSTestSerializationIndirectInheritancePrototype* ptr = new (NotNull, JSC::allocateCell<JSTestSerializationIndirectInheritancePrototype>(vm.heap)) JSTestSerializationIndirectInheritancePrototype(vm, globalObject, structure);
+        ptr->finishCreation(vm);
+        return ptr;
+    }
+
+    DECLARE_INFO;
+    static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)
+    {
+        return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info());
+    }
+
+private:
+    JSTestSerializationIndirectInheritancePrototype(JSC::VM& vm, JSC::JSGlobalObject*, JSC::Structure* structure)
+        : JSC::JSNonFinalObject(vm, structure)
+    {
+    }
+
+    void finishCreation(JSC::VM&);
+};
+
+using JSTestSerializationIndirectInheritanceConstructor = JSDOMConstructorNotConstructable<JSTestSerializationIndirectInheritance>;
+
+template<> JSValue JSTestSerializationIndirectInheritanceConstructor::prototypeForStructure(JSC::VM& vm, const JSDOMGlobalObject& globalObject)
+{
+    return JSTestSerializationInherit::getConstructor(vm, &globalObject);
+}
+
+template<> void JSTestSerializationIndirectInheritanceConstructor::initializeProperties(VM& vm, JSDOMGlobalObject& globalObject)
+{
+    putDirect(vm, vm.propertyNames->prototype, JSTestSerializationIndirectInheritance::prototype(vm, globalObject), DontDelete | ReadOnly | DontEnum);
+    putDirect(vm, vm.propertyNames->name, jsNontrivialString(&vm, String(ASCIILiteral("TestSerializationIndirectInheritance"))), ReadOnly | DontEnum);
+    putDirect(vm, vm.propertyNames->length, jsNumber(0), ReadOnly | DontEnum);
+}
+
+template<> const ClassInfo JSTestSerializationIndirectInheritanceConstructor::s_info = { "TestSerializationIndirectInheritance", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSTestSerializationIndirectInheritanceConstructor) };
+
+/* Hash table for prototype */
+
+static const HashTableValue JSTestSerializationIndirectInheritancePrototypeTableValues[] =
+{
+    { "constructor", DontEnum, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestSerializationIndirectInheritanceConstructor), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestSerializationIndirectInheritanceConstructor) } },
+};
+
+const ClassInfo JSTestSerializationIndirectInheritancePrototype::s_info = { "TestSerializationIndirectInheritancePrototype", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSTestSerializationIndirectInheritancePrototype) };
+
+void JSTestSerializationIndirectInheritancePrototype::finishCreation(VM& vm)
+{
+    Base::finishCreation(vm);
+    reifyStaticProperties(vm, JSTestSerializationIndirectInheritancePrototypeTableValues, *this);
+}
+
+const ClassInfo JSTestSerializationIndirectInheritance::s_info = { "TestSerializationIndirectInheritance", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSTestSerializationIndirectInheritance) };
+
+JSTestSerializationIndirectInheritance::JSTestSerializationIndirectInheritance(Structure* structure, JSDOMGlobalObject& globalObject, Ref<TestSerializationIndirectInheritance>&& impl)
+    : JSTestSerializationInherit(structure, globalObject, WTFMove(impl))
+{
+}
+
+void JSTestSerializationIndirectInheritance::finishCreation(VM& vm)
+{
+    Base::finishCreation(vm);
+    ASSERT(inherits(vm, info()));
+
+}
+
+JSObject* JSTestSerializationIndirectInheritance::createPrototype(VM& vm, JSDOMGlobalObject& globalObject)
+{
+    return JSTestSerializationIndirectInheritancePrototype::create(vm, &globalObject, JSTestSerializationIndirectInheritancePrototype::createStructure(vm, &globalObject, JSTestSerializationInherit::prototype(vm, globalObject)));
+}
+
+JSObject* JSTestSerializationIndirectInheritance::prototype(VM& vm, JSDOMGlobalObject& globalObject)
+{
+    return getDOMPrototype<JSTestSerializationIndirectInheritance>(vm, globalObject);
+}
+
+JSValue JSTestSerializationIndirectInheritance::getConstructor(VM& vm, const JSGlobalObject* globalObject)
+{
+    return getDOMConstructor<JSTestSerializationIndirectInheritanceConstructor>(vm, *jsCast<const JSDOMGlobalObject*>(globalObject));
+}
+
+EncodedJSValue jsTestSerializationIndirectInheritanceConstructor(ExecState* state, EncodedJSValue thisValue, PropertyName)
+{
+    VM& vm = state->vm();
+    auto throwScope = DECLARE_THROW_SCOPE(vm);
+    auto* prototype = jsDynamicDowncast<JSTestSerializationIndirectInheritancePrototype*>(vm, JSValue::decode(thisValue));
+    if (UNLIKELY(!prototype))
+        return throwVMTypeError(state, throwScope);
+    return JSValue::encode(JSTestSerializationIndirectInheritance::getConstructor(state->vm(), prototype->globalObject()));
+}
+
+bool setJSTestSerializationIndirectInheritanceConstructor(ExecState* state, EncodedJSValue thisValue, EncodedJSValue encodedValue)
+{
+    VM& vm = state->vm();
+    auto throwScope = DECLARE_THROW_SCOPE(vm);
+    auto* prototype = jsDynamicDowncast<JSTestSerializationIndirectInheritancePrototype*>(vm, JSValue::decode(thisValue));
+    if (UNLIKELY(!prototype)) {
+        throwVMTypeError(state, throwScope);
+        return false;
+    }
+    // Shadowing a built-in constructor
+    return prototype->putDirect(state->vm(), state->propertyNames().constructor, JSValue::decode(encodedValue));
+}
+
+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestSerializationIndirectInheritanceh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.h (0 => 218511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.h                           (rev 0)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.h      2017-06-19 21:55:00 UTC (rev 218511)
</span><span class="lines">@@ -0,0 +1,66 @@
</span><ins>+/*
+    This file is part of the WebKit open source project.
+    This file has been generated by generate-bindings.pl. DO NOT MODIFY!
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to
+    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1301, USA.
+*/
+
+#pragma once
+
+#include "JSTestSerializationInherit.h"
+#include "TestSerializationIndirectInheritance.h"
+
+namespace WebCore {
+
+class JSTestSerializationIndirectInheritance : public JSTestSerializationInherit {
+public:
+    using Base = JSTestSerializationInherit;
+    using DOMWrapped = TestSerializationIndirectInheritance;
+    static JSTestSerializationIndirectInheritance* create(JSC::Structure* structure, JSDOMGlobalObject* globalObject, Ref<TestSerializationIndirectInheritance>&& impl)
+    {
+        JSTestSerializationIndirectInheritance* ptr = new (NotNull, JSC::allocateCell<JSTestSerializationIndirectInheritance>(globalObject->vm().heap)) JSTestSerializationIndirectInheritance(structure, *globalObject, WTFMove(impl));
+        ptr->finishCreation(globalObject->vm());
+        return ptr;
+    }
+
+    static JSC::JSObject* createPrototype(JSC::VM&, JSDOMGlobalObject&);
+    static JSC::JSObject* prototype(JSC::VM&, JSDOMGlobalObject&);
+
+    DECLARE_INFO;
+
+    static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)
+    {
+        return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info());
+    }
+
+    static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*);
+    TestSerializationIndirectInheritance& wrapped() const
+    {
+        return static_cast<TestSerializationIndirectInheritance&>(Base::wrapped());
+    }
+protected:
+    JSTestSerializationIndirectInheritance(JSC::Structure*, JSDOMGlobalObject&, Ref<TestSerializationIndirectInheritance>&&);
+
+    void finishCreation(JSC::VM&);
+};
+
+
+template<> struct JSDOMWrapperConverterTraits<TestSerializationIndirectInheritance> {
+    using WrapperClass = JSTestSerializationIndirectInheritance;
+    using ToWrappedReturnType = TestSerializationIndirectInheritance*;
+};
+
+} // namespace WebCore
</ins></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestTestSerializationidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/TestSerialization.idl (218510 => 218511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/TestSerialization.idl 2017-06-19 21:27:05 UTC (rev 218510)
+++ trunk/Source/WebCore/bindings/scripts/test/TestSerialization.idl    2017-06-19 21:55:00 UTC (rev 218511)
</span><span class="lines">@@ -33,5 +33,8 @@
</span><span class="cx">     attribute long                  fifthLongAttribute;
</span><span class="cx">     attribute TestTimeStamp         sixthTypedefAttribute;
</span><span class="cx"> 
</span><ins>+    attribute TestSerializationInheritFinal seventhDirectlySerializableAttribute;
+    attribute TestSerializationIndirectInheritance eighthIndirectlyAttribute;
+
</ins><span class="cx">     serializer = { attribute };
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestTestSerializationIndirectInheritanceidlfromrev218510trunkSourceWebCorebindingsscriptstestTestSerializationidl"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/bindings/scripts/test/TestSerializationIndirectInheritance.idl (from rev 218510, trunk/Source/WebCore/bindings/scripts/test/TestSerialization.idl) (0 => 218511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/TestSerializationIndirectInheritance.idl                              (rev 0)
+++ trunk/Source/WebCore/bindings/scripts/test/TestSerializationIndirectInheritance.idl 2017-06-19 21:55:00 UTC (rev 218511)
</span><span class="lines">@@ -0,0 +1,27 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+interface TestSerializationIndirectInheritance : TestSerializationInherit {
+};
</ins></span></pre></div>
<a id="trunkSourceWebCoredomDOMQuadidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/DOMQuad.idl (218510 => 218511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/DOMQuad.idl     2017-06-19 21:27:05 UTC (rev 218510)
+++ trunk/Source/WebCore/dom/DOMQuad.idl        2017-06-19 21:55:00 UTC (rev 218511)
</span><span class="lines">@@ -30,8 +30,7 @@
</span><span class="cx">     Exposed=(Window,Worker),
</span><span class="cx">     ImplementationLacksVTable,
</span><span class="cx">     JSCustomMarkFunction
</span><del>-]
-interface DOMQuad {
</del><ins>+] interface DOMQuad {
</ins><span class="cx">     [NewObject] static DOMQuad fromRect(optional DOMRectInit other);
</span><span class="cx">     [NewObject] static DOMQuad fromQuad(optional DOMQuadInit other);
</span><span class="cx"> 
</span><span class="lines">@@ -41,5 +40,5 @@
</span><span class="cx">     readonly attribute DOMPoint p4; // FIXME: Should be [SameObject].
</span><span class="cx">     [NewObject] DOMRect getBounds();
</span><span class="cx"> 
</span><del>-    // serializer = { attribute }; FIXME: implement.
</del><ins>+    serializer = { attribute };
</ins><span class="cx"> };
</span></span></pre>
</div>
</div>

</body>
</html>