<!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>[213960] trunk/Source/JavaScriptCore</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/213960">213960</a></dd>
<dt>Author</dt> <dd>bburg@apple.com</dd>
<dt>Date</dt> <dd>2017-03-14 16:44:01 -0700 (Tue, 14 Mar 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Cocoa] Web Inspector: generated code for parsing an array of primitive-type enums from payload does not work
https://bugs.webkit.org/show_bug.cgi?id=169629

Reviewed by Joseph Pecoraro.

This was encountered while trying to compile new protocol definitions that support the Actions API.

* inspector/scripts/codegen/models.py:
(EnumType.__repr__): Improve debug logging so fields match the class member names.

* inspector/scripts/codegen/objc_generator.py:
(ObjCGenerator.payload_to_objc_expression_for_member):
If the array elements are actually a primitive type, then there's no need to do any
conversion from a payload. This happens for free since the payload is a tree of
NSDictionary, NSString, NSNumber, etc.

* inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result:
* inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result:
Rebaseline.

* inspector/scripts/tests/generic/type-declaration-object-type.json:
Add new cases for properties that contain an array with enum type references and an array of anonymous enums.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptscodegenmodelspy">trunk/Source/JavaScriptCore/inspector/scripts/codegen/models.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptscodegenobjc_generatorpy">trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedshadowedoptionaltypesettersjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedtypedeclarationobjecttypejsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenerictypedeclarationobjecttypejson">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/type-declaration-object-type.json</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (213959 => 213960)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/JavaScriptCore/ChangeLog        2017-03-14 23:44:01 UTC (rev 213960)
</span><span class="lines">@@ -1,3 +1,28 @@
</span><ins>+2017-03-14  Brian Burg  &lt;bburg@apple.com&gt;
+
+        [Cocoa] Web Inspector: generated code for parsing an array of primitive-type enums from payload does not work
+        https://bugs.webkit.org/show_bug.cgi?id=169629
+
+        Reviewed by Joseph Pecoraro.
+
+        This was encountered while trying to compile new protocol definitions that support the Actions API.
+
+        * inspector/scripts/codegen/models.py:
+        (EnumType.__repr__): Improve debug logging so fields match the class member names.
+
+        * inspector/scripts/codegen/objc_generator.py:
+        (ObjCGenerator.payload_to_objc_expression_for_member):
+        If the array elements are actually a primitive type, then there's no need to do any
+        conversion from a payload. This happens for free since the payload is a tree of
+        NSDictionary, NSString, NSNumber, etc. 
+
+        * inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result:
+        * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result:
+        Rebaseline.
+
+        * inspector/scripts/tests/generic/type-declaration-object-type.json:
+        Add new cases for properties that contain an array with enum type references and an array of anonymous enums.
+
</ins><span class="cx"> 2017-03-14  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Record the HashSet/HashMap operations in DFG/FTL/B3 and replay them in a benchmark
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptscodegenmodelspy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/codegen/models.py (213959 => 213960)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/codegen/models.py        2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/JavaScriptCore/inspector/scripts/codegen/models.py        2017-03-14 23:44:01 UTC (rev 213960)
</span><span class="lines">@@ -258,7 +258,7 @@
</span><span class="cx">         self.is_anonymous = is_anonymous
</span><span class="cx"> 
</span><span class="cx">     def __repr__(self):
</span><del>-        return 'EnumType[value_type=%s; values=%s]' % (self.qualified_name(), ', '.join(map(str, self.enum_values())))
</del><ins>+        return 'EnumType[primitive_type=%s; enum_values=%s]' % (self.qualified_name(), ', '.join(map(str, self.enum_values())))
</ins><span class="cx"> 
</span><span class="cx">     def is_enum(self):
</span><span class="cx">         return True
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptscodegenobjc_generatorpy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator.py (213959 => 213960)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator.py        2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator.py        2017-03-14 23:44:01 UTC (rev 213960)
</span><span class="lines">@@ -486,9 +486,17 @@
</span><span class="cx">             objc_class = self.objc_class_for_type(member.type)
</span><span class="cx">             return '[[%s alloc] initWithPayload:payload[@&quot;%s&quot;]]' % (objc_class, member.member_name)
</span><span class="cx">         if isinstance(_type, ArrayType):
</span><del>-            objc_class = self.objc_class_for_type(member.type.element_type)
-            return 'objcArrayFromPayload&lt;%s&gt;(payload[@&quot;%s&quot;])' % (objc_class, member.member_name)
</del><ins>+            element_type = member.type.element_type
+            if isinstance(element_type, EnumType):
+                element_type = element_type.primitive_type
</ins><span class="cx"> 
</span><ins>+            # In this case, there is no conversion that needs to be done, the array already contains an ObjC type.
+            if isinstance(element_type, PrimitiveType):
+                return 'payload[@&quot;%s&quot;]' % member.member_name
+            else:
+                objc_class = self.objc_class_for_type(element_type)
+                return 'objcArrayFromPayload&lt;%s&gt;(payload[@&quot;%s&quot;])' % (objc_class, member.member_name)
+
</ins><span class="cx">     # JSON object setter/getter selectors for types.
</span><span class="cx"> 
</span><span class="cx">     @staticmethod
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedshadowedoptionaltypesettersjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result (213959 => 213960)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result        2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result        2017-03-14 23:44:01 UTC (rev 213960)
</span><span class="lines">@@ -1061,7 +1061,7 @@
</span><span class="cx"> 
</span><span class="cx">     self.string = payload[@&quot;string&quot;];
</span><span class="cx"> 
</span><del>-    self.array = objcArrayFromPayload&lt;NSString&gt;(payload[@&quot;array&quot;]);
</del><ins>+    self.array = payload[@&quot;array&quot;];
</ins><span class="cx"> 
</span><span class="cx">     return self;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedtypedeclarationobjecttypejsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result (213959 => 213960)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result        2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result        2017-03-14 23:44:01 UTC (rev 213960)
</span><span class="lines">@@ -28,6 +28,11 @@
</span><span class="cx"> 
</span><span class="cx"> // DO NOT EDIT THIS FILE. It is automatically generated from type-declaration-object-type.json
</span><span class="cx"> // by the script: Source/JavaScriptCore/inspector/scripts/generate-inspector-protocol-bindings.py
</span><ins>+
+// Database.
+InspectorBackend.registerEnum(&quot;Database.MouseButton&quot;, {None: &quot;None&quot;, Left: &quot;Left&quot;, Middle: &quot;Middle&quot;, Right: &quot;Right&quot;});
+InspectorBackend.registerEnum(&quot;Database.OptionalParameterBundleDirectionality&quot;, {LTR: &quot;LTR&quot;, RTL: &quot;RTL&quot;});
+InspectorBackend.registerEnum(&quot;Database.ParameterBundleDirectionality&quot;, {LTR: &quot;LTR&quot;, RTL: &quot;RTL&quot;});
</ins><span class="cx"> ### End File: InspectorBackendCommands.js
</span><span class="cx"> 
</span><span class="cx"> ### Begin File: TestAlternateBackendDispatchers.h
</span><span class="lines">@@ -320,6 +325,7 @@
</span><span class="cx"> class ParameterBundle;
</span><span class="cx"> class ObjectWithPropertyNameConflicts;
</span><span class="cx"> class DummyObject;
</span><ins>+enum class MouseButton;
</ins><span class="cx"> } // Database
</span><span class="cx"> 
</span><span class="cx"> namespace Test {
</span><span class="lines">@@ -334,6 +340,17 @@
</span><span class="cx"> } // Database
</span><span class="cx"> // End of typedefs.
</span><span class="cx"> 
</span><ins>+namespace TestHelpers {
+
+String getEnumConstantValue(int code);
+
+template&lt;typename T&gt; String getEnumConstantValue(T enumValue)
+{
+    return getEnumConstantValue(static_cast&lt;int&gt;(enumValue));
+}
+
+} // namespace TestHelpers
+
</ins><span class="cx"> namespace Database {
</span><span class="cx"> /* Database error. */
</span><span class="cx"> class Error : public Inspector::InspectorObjectBase {
</span><span class="lines">@@ -400,8 +417,20 @@
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+/* Enumerates different mouse buttons that can be used. */
+enum class MouseButton {
+    None = 0,
+    Left = 1,
+    Middle = 2,
+    Right = 3,
+}; // enum class MouseButton
</ins><span class="cx"> class OptionalParameterBundle : public Inspector::InspectorObjectBase {
</span><span class="cx"> public:
</span><ins>+    // Named after property name 'directionality' while generating OptionalParameterBundle.
+    enum class Directionality {
+        LTR = 4,
+        RTL = 5,
+    }; // enum class Directionality
</ins><span class="cx">     enum {
</span><span class="cx">         NoFieldsSet = 0,
</span><span class="cx">         AllFieldsSet = 0
</span><span class="lines">@@ -450,6 +479,16 @@
</span><span class="cx">         InspectorObjectBase::setArray(ASCIILiteral(&quot;columnNames&quot;), WTFMove(value));
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    void setButtons(RefPtr&lt;Inspector::Protocol::Array&lt;Inspector::Protocol::Database::MouseButton&gt;&gt; value)
+    {
+        InspectorObjectBase::setArray(ASCIILiteral(&quot;buttons&quot;), WTFMove(value));
+    }
+
+    void setDirectionality(Directionality value)
+    {
+        InspectorObjectBase::setString(ASCIILiteral(&quot;directionality&quot;), Inspector::Protocol::TestHelpers::getEnumConstantValue(value));
+    }
+
</ins><span class="cx">     void setNotes(const String&amp; value)
</span><span class="cx">     {
</span><span class="cx">         InspectorObjectBase::setString(ASCIILiteral(&quot;notes&quot;), value);
</span><span class="lines">@@ -483,16 +522,23 @@
</span><span class="cx"> 
</span><span class="cx"> class ParameterBundle : public Inspector::InspectorObjectBase {
</span><span class="cx"> public:
</span><ins>+    // Named after property name 'directionality' while generating ParameterBundle.
+    enum class Directionality {
+        LTR = 4,
+        RTL = 5,
+    }; // enum class Directionality
</ins><span class="cx">     enum {
</span><span class="cx">         NoFieldsSet = 0,
</span><span class="cx">         ColumnNamesSet = 1 &lt;&lt; 0,
</span><del>-        NotesSet = 1 &lt;&lt; 1,
-        TimestampSet = 1 &lt;&lt; 2,
-        ValuesSet = 1 &lt;&lt; 3,
-        PayloadSet = 1 &lt;&lt; 4,
-        ErrorSet = 1 &lt;&lt; 5,
-        ErrorListSet = 1 &lt;&lt; 6,
-        AllFieldsSet = (ColumnNamesSet | NotesSet | TimestampSet | ValuesSet | PayloadSet | ErrorSet | ErrorListSet)
</del><ins>+        ButtonsSet = 1 &lt;&lt; 1,
+        DirectionalitySet = 1 &lt;&lt; 2,
+        NotesSet = 1 &lt;&lt; 3,
+        TimestampSet = 1 &lt;&lt; 4,
+        ValuesSet = 1 &lt;&lt; 5,
+        PayloadSet = 1 &lt;&lt; 6,
+        ErrorSet = 1 &lt;&lt; 7,
+        ErrorListSet = 1 &lt;&lt; 8,
+        AllFieldsSet = (ColumnNamesSet | ButtonsSet | DirectionalitySet | NotesSet | TimestampSet | ValuesSet | PayloadSet | ErrorSet | ErrorListSet)
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     template&lt;int STATE&gt;
</span><span class="lines">@@ -520,6 +566,20 @@
</span><span class="cx">             return castState&lt;ColumnNamesSet&gt;();
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        Builder&lt;STATE | ButtonsSet&gt;&amp; setButtons(RefPtr&lt;Inspector::Protocol::Array&lt;Inspector::Protocol::Database::MouseButton&gt;&gt; value)
+        {
+            COMPILE_ASSERT(!(STATE &amp; ButtonsSet), property_buttons_already_set);
+            m_result-&gt;setArray(ASCIILiteral(&quot;buttons&quot;), value);
+            return castState&lt;ButtonsSet&gt;();
+        }
+
+        Builder&lt;STATE | DirectionalitySet&gt;&amp; setDirectionality(Directionality value)
+        {
+            COMPILE_ASSERT(!(STATE &amp; DirectionalitySet), property_directionality_already_set);
+            m_result-&gt;setString(ASCIILiteral(&quot;directionality&quot;), Inspector::Protocol::TestHelpers::getEnumConstantValue(value));
+            return castState&lt;DirectionalitySet&gt;();
+        }
+
</ins><span class="cx">         Builder&lt;STATE | NotesSet&gt;&amp; setNotes(const String&amp; value)
</span><span class="cx">         {
</span><span class="cx">             COMPILE_ASSERT(!(STATE &amp; NotesSet), property_notes_already_set);
</span><span class="lines">@@ -576,6 +636,8 @@
</span><span class="cx">      * Synthetic constructor:
</span><span class="cx">      * Ref&lt;ParameterBundle&gt; result = ParameterBundle::create()
</span><span class="cx">      *     .setColumnNames(...)
</span><ins>+     *     .setButtons(...)
+     *     .setDirectionality(...)
</ins><span class="cx">      *     .setNotes(...)
</span><span class="cx">      *     .setTimestamp(...)
</span><span class="cx">      *     .setValues(...)
</span><span class="lines">@@ -687,15 +749,22 @@
</span><span class="cx"> namespace Test {
</span><span class="cx"> class ParameterBundle : public Inspector::InspectorObjectBase {
</span><span class="cx"> public:
</span><ins>+    // Named after property name 'directionality' while generating ParameterBundle.
+    enum class Directionality {
+        LTR = 4,
+        RTL = 5,
+    }; // enum class Directionality
</ins><span class="cx">     enum {
</span><span class="cx">         NoFieldsSet = 0,
</span><del>-        ColumnNamesSet = 1 &lt;&lt; 0,
-        NotesSet = 1 &lt;&lt; 1,
-        TimestampSet = 1 &lt;&lt; 2,
-        ValuesSet = 1 &lt;&lt; 3,
-        PayloadSet = 1 &lt;&lt; 4,
-        ErrorSet = 1 &lt;&lt; 5,
-        AllFieldsSet = (ColumnNamesSet | NotesSet | TimestampSet | ValuesSet | PayloadSet | ErrorSet)
</del><ins>+        DirectionalitySet = 1 &lt;&lt; 0,
+        ButtonsSet = 1 &lt;&lt; 1,
+        ColumnNamesSet = 1 &lt;&lt; 2,
+        NotesSet = 1 &lt;&lt; 3,
+        TimestampSet = 1 &lt;&lt; 4,
+        ValuesSet = 1 &lt;&lt; 5,
+        PayloadSet = 1 &lt;&lt; 6,
+        ErrorSet = 1 &lt;&lt; 7,
+        AllFieldsSet = (DirectionalitySet | ButtonsSet | ColumnNamesSet | NotesSet | TimestampSet | ValuesSet | PayloadSet | ErrorSet)
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     template&lt;int STATE&gt;
</span><span class="lines">@@ -716,6 +785,20 @@
</span><span class="cx">         friend class ParameterBundle;
</span><span class="cx">     public:
</span><span class="cx"> 
</span><ins>+        Builder&lt;STATE | DirectionalitySet&gt;&amp; setDirectionality(Directionality value)
+        {
+            COMPILE_ASSERT(!(STATE &amp; DirectionalitySet), property_directionality_already_set);
+            m_result-&gt;setString(ASCIILiteral(&quot;directionality&quot;), Inspector::Protocol::TestHelpers::getEnumConstantValue(value));
+            return castState&lt;DirectionalitySet&gt;();
+        }
+
+        Builder&lt;STATE | ButtonsSet&gt;&amp; setButtons(RefPtr&lt;Inspector::Protocol::Array&lt;Inspector::Protocol::Database::MouseButton&gt;&gt; value)
+        {
+            COMPILE_ASSERT(!(STATE &amp; ButtonsSet), property_buttons_already_set);
+            m_result-&gt;setArray(ASCIILiteral(&quot;buttons&quot;), value);
+            return castState&lt;ButtonsSet&gt;();
+        }
+
</ins><span class="cx">         Builder&lt;STATE | ColumnNamesSet&gt;&amp; setColumnNames(RefPtr&lt;Inspector::Protocol::Array&lt;String&gt;&gt; value)
</span><span class="cx">         {
</span><span class="cx">             COMPILE_ASSERT(!(STATE &amp; ColumnNamesSet), property_columnNames_already_set);
</span><span class="lines">@@ -771,6 +854,8 @@
</span><span class="cx">     /*
</span><span class="cx">      * Synthetic constructor:
</span><span class="cx">      * Ref&lt;ParameterBundle&gt; result = ParameterBundle::create()
</span><ins>+     *     .setDirectionality(...)
+     *     .setButtons(...)
</ins><span class="cx">      *     .setColumnNames(...)
</span><span class="cx">      *     .setNotes(...)
</span><span class="cx">      *     .setTimestamp(...)
</span><span class="lines">@@ -789,6 +874,25 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+namespace TestHelpers {
+
+template&lt;typename ProtocolEnumType&gt;
+std::optional&lt;ProtocolEnumType&gt; parseEnumValueFromString(const String&amp;);
+
+// Enums in the 'Database' Domain
+template&lt;&gt;
+std::optional&lt;Inspector::Protocol::Database::MouseButton&gt; parseEnumValueFromString&lt;Inspector::Protocol::Database::MouseButton&gt;(const String&amp;);
+template&lt;&gt;
+std::optional&lt;Inspector::Protocol::Database::OptionalParameterBundle::Directionality&gt; parseEnumValueFromString&lt;Inspector::Protocol::Database::OptionalParameterBundle::Directionality&gt;(const String&amp;);
+template&lt;&gt;
+std::optional&lt;Inspector::Protocol::Database::ParameterBundle::Directionality&gt; parseEnumValueFromString&lt;Inspector::Protocol::Database::ParameterBundle::Directionality&gt;(const String&amp;);
+
+// Enums in the 'Test' Domain
+template&lt;&gt;
+std::optional&lt;Inspector::Protocol::Test::ParameterBundle::Directionality&gt; parseEnumValueFromString&lt;Inspector::Protocol::Test::ParameterBundle::Directionality&gt;(const String&amp;);
+
+} // namespace TestHelpers
+
</ins><span class="cx"> } // namespace Protocol
</span><span class="cx"> 
</span><span class="cx"> } // namespace Inspector
</span><span class="lines">@@ -835,8 +939,87 @@
</span><span class="cx"> 
</span><span class="cx"> namespace Protocol {
</span><span class="cx"> 
</span><ins>+namespace TestHelpers {
</ins><span class="cx"> 
</span><ins>+static const char* const enum_constant_values[] = {
+    &quot;None&quot;,
+    &quot;Left&quot;,
+    &quot;Middle&quot;,
+    &quot;Right&quot;,
+    &quot;LTR&quot;,
+    &quot;RTL&quot;,
+};
</ins><span class="cx"> 
</span><ins>+String getEnumConstantValue(int code) {
+    return enum_constant_values[code];
+}
+
+// Enums in the 'Database' Domain
+template&lt;&gt;
+std::optional&lt;Inspector::Protocol::Database::MouseButton&gt; parseEnumValueFromString&lt;Inspector::Protocol::Database::MouseButton&gt;(const String&amp; protocolString)
+{
+    static const size_t constantValues[] = {
+        (size_t)Inspector::Protocol::Database::MouseButton::None,
+        (size_t)Inspector::Protocol::Database::MouseButton::Left,
+        (size_t)Inspector::Protocol::Database::MouseButton::Middle,
+        (size_t)Inspector::Protocol::Database::MouseButton::Right,
+    };
+    for (size_t i = 0; i &lt; 4; ++i)
+        if (protocolString == enum_constant_values[constantValues[i]])
+            return (Inspector::Protocol::Database::MouseButton)constantValues[i];
+
+    return std::nullopt;
+}
+
+template&lt;&gt;
+std::optional&lt;Inspector::Protocol::Database::OptionalParameterBundle::Directionality&gt; parseEnumValueFromString&lt;Inspector::Protocol::Database::OptionalParameterBundle::Directionality&gt;(const String&amp; protocolString)
+{
+    static const size_t constantValues[] = {
+        (size_t)Inspector::Protocol::Database::OptionalParameterBundle::Directionality::LTR,
+        (size_t)Inspector::Protocol::Database::OptionalParameterBundle::Directionality::RTL,
+    };
+    for (size_t i = 0; i &lt; 2; ++i)
+        if (protocolString == enum_constant_values[constantValues[i]])
+            return (Inspector::Protocol::Database::OptionalParameterBundle::Directionality)constantValues[i];
+
+    return std::nullopt;
+}
+
+template&lt;&gt;
+std::optional&lt;Inspector::Protocol::Database::ParameterBundle::Directionality&gt; parseEnumValueFromString&lt;Inspector::Protocol::Database::ParameterBundle::Directionality&gt;(const String&amp; protocolString)
+{
+    static const size_t constantValues[] = {
+        (size_t)Inspector::Protocol::Database::ParameterBundle::Directionality::LTR,
+        (size_t)Inspector::Protocol::Database::ParameterBundle::Directionality::RTL,
+    };
+    for (size_t i = 0; i &lt; 2; ++i)
+        if (protocolString == enum_constant_values[constantValues[i]])
+            return (Inspector::Protocol::Database::ParameterBundle::Directionality)constantValues[i];
+
+    return std::nullopt;
+}
+
+
+// Enums in the 'Test' Domain
+template&lt;&gt;
+std::optional&lt;Inspector::Protocol::Test::ParameterBundle::Directionality&gt; parseEnumValueFromString&lt;Inspector::Protocol::Test::ParameterBundle::Directionality&gt;(const String&amp; protocolString)
+{
+    static const size_t constantValues[] = {
+        (size_t)Inspector::Protocol::Test::ParameterBundle::Directionality::LTR,
+        (size_t)Inspector::Protocol::Test::ParameterBundle::Directionality::RTL,
+    };
+    for (size_t i = 0; i &lt; 2; ++i)
+        if (protocolString == enum_constant_values[constantValues[i]])
+            return (Inspector::Protocol::Test::ParameterBundle::Directionality)constantValues[i];
+
+    return std::nullopt;
+}
+
+
+} // namespace TestHelpers
+
+
+
</ins><span class="cx"> } // namespace Protocol
</span><span class="cx"> 
</span><span class="cx"> } // namespace Inspector
</span><span class="lines">@@ -1129,8 +1312,29 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+typedef NS_ENUM(NSInteger, TestProtocolDatabaseMouseButton) {
+    TestProtocolDatabaseMouseButtonNone,
+    TestProtocolDatabaseMouseButtonLeft,
+    TestProtocolDatabaseMouseButtonMiddle,
+    TestProtocolDatabaseMouseButtonRight,
+};
</ins><span class="cx"> 
</span><ins>+typedef NS_ENUM(NSInteger, TestProtocolDatabaseOptionalParameterBundleDirectionality) {
+    TestProtocolDatabaseOptionalParameterBundleDirectionalityLTR,
+    TestProtocolDatabaseOptionalParameterBundleDirectionalityRTL,
+};
</ins><span class="cx"> 
</span><ins>+typedef NS_ENUM(NSInteger, TestProtocolDatabaseParameterBundleDirectionality) {
+    TestProtocolDatabaseParameterBundleDirectionalityLTR,
+    TestProtocolDatabaseParameterBundleDirectionalityRTL,
+};
+
+typedef NS_ENUM(NSInteger, TestProtocolTestParameterBundleDirectionality) {
+    TestProtocolTestParameterBundleDirectionalityLTR,
+    TestProtocolTestParameterBundleDirectionalityRTL,
+};
+
+
</ins><span class="cx"> __attribute__((visibility (&quot;default&quot;)))
</span><span class="cx"> @interface TestProtocolDatabaseError : RWIProtocolJSONObject
</span><span class="cx"> - (instancetype)initWithPayload:(NSDictionary&lt;NSString *, id&gt; *)payload;
</span><span class="lines">@@ -1145,6 +1349,8 @@
</span><span class="cx"> - (instancetype)initWithPayload:(NSDictionary&lt;NSString *, id&gt; *)payload;
</span><span class="cx"> - (instancetype)initWithJSONObject:(RWIProtocolJSONObject *)jsonObject;
</span><span class="cx"> /* optional */ @property (nonatomic, copy) NSArray/*&lt;NSString&gt;*/ *columnNames;
</span><ins>+/* optional */ @property (nonatomic, copy) NSArray/*&lt;NSString&gt;*/ *buttons;
+/* optional */ @property (nonatomic, assign) TestProtocolDatabaseOptionalParameterBundleDirectionality directionality;
</ins><span class="cx"> /* optional */ @property (nonatomic, copy) NSString *notes;
</span><span class="cx"> /* optional */ @property (nonatomic, assign) double timestamp;
</span><span class="cx"> /* optional */ @property (nonatomic, retain) RWIProtocolJSONObject *values;
</span><span class="lines">@@ -1157,8 +1363,10 @@
</span><span class="cx"> @interface TestProtocolDatabaseParameterBundle : RWIProtocolJSONObject
</span><span class="cx"> - (instancetype)initWithPayload:(NSDictionary&lt;NSString *, id&gt; *)payload;
</span><span class="cx"> - (instancetype)initWithJSONObject:(RWIProtocolJSONObject *)jsonObject;
</span><del>-- (instancetype)initWithColumnNames:(NSArray/*&lt;NSString&gt;*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error errorList:(NSArray/*&lt;TestProtocolDatabaseError&gt;*/ *)errorList;
</del><ins>+- (instancetype)initWithColumnNames:(NSArray/*&lt;NSString&gt;*/ *)columnNames buttons:(NSArray/*&lt;NSString&gt;*/ *)buttons directionality:(TestProtocolDatabaseParameterBundleDirectionality)directionality notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error errorList:(NSArray/*&lt;TestProtocolDatabaseError&gt;*/ *)errorList;
</ins><span class="cx"> /* required */ @property (nonatomic, copy) NSArray/*&lt;NSString&gt;*/ *columnNames;
</span><ins>+/* required */ @property (nonatomic, copy) NSArray/*&lt;NSString&gt;*/ *buttons;
+/* required */ @property (nonatomic, assign) TestProtocolDatabaseParameterBundleDirectionality directionality;
</ins><span class="cx"> /* required */ @property (nonatomic, copy) NSString *notes;
</span><span class="cx"> /* required */ @property (nonatomic, assign) double timestamp;
</span><span class="cx"> /* required */ @property (nonatomic, retain) RWIProtocolJSONObject *values;
</span><span class="lines">@@ -1189,7 +1397,9 @@
</span><span class="cx"> @interface TestProtocolTestParameterBundle : RWIProtocolJSONObject
</span><span class="cx"> - (instancetype)initWithPayload:(NSDictionary&lt;NSString *, id&gt; *)payload;
</span><span class="cx"> - (instancetype)initWithJSONObject:(RWIProtocolJSONObject *)jsonObject;
</span><del>-- (instancetype)initWithColumnNames:(NSArray/*&lt;NSString&gt;*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error;
</del><ins>+- (instancetype)initWithDirectionality:(TestProtocolTestParameterBundleDirectionality)directionality buttons:(NSArray/*&lt;NSString&gt;*/ *)buttons columnNames:(NSArray/*&lt;NSString&gt;*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error;
+/* required */ @property (nonatomic, assign) TestProtocolTestParameterBundleDirectionality directionality;
+/* required */ @property (nonatomic, copy) NSArray/*&lt;NSString&gt;*/ *buttons;
</ins><span class="cx"> /* required */ @property (nonatomic, copy) NSArray/*&lt;NSString&gt;*/ *columnNames;
</span><span class="cx"> /* required */ @property (nonatomic, copy) NSString *notes;
</span><span class="cx"> /* required */ @property (nonatomic, assign) double timestamp;
</span><span class="lines">@@ -1314,9 +1524,95 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+inline String toProtocolString(TestProtocolDatabaseMouseButton value)
+{
+    switch(value) {
+    case TestProtocolDatabaseMouseButtonNone:
+        return ASCIILiteral(&quot;None&quot;);
+    case TestProtocolDatabaseMouseButtonLeft:
+        return ASCIILiteral(&quot;Left&quot;);
+    case TestProtocolDatabaseMouseButtonMiddle:
+        return ASCIILiteral(&quot;Middle&quot;);
+    case TestProtocolDatabaseMouseButtonRight:
+        return ASCIILiteral(&quot;Right&quot;);
+    }
+}
</ins><span class="cx"> 
</span><ins>+template&lt;&gt;
+inline std::optional&lt;TestProtocolDatabaseMouseButton&gt; fromProtocolString(const String&amp; value)
+{
+    if (value == &quot;None&quot;)
+        return TestProtocolDatabaseMouseButtonNone;
+    if (value == &quot;Left&quot;)
+        return TestProtocolDatabaseMouseButtonLeft;
+    if (value == &quot;Middle&quot;)
+        return TestProtocolDatabaseMouseButtonMiddle;
+    if (value == &quot;Right&quot;)
+        return TestProtocolDatabaseMouseButtonRight;
+    return std::nullopt;
+}
</ins><span class="cx"> 
</span><ins>+inline String toProtocolString(TestProtocolDatabaseOptionalParameterBundleDirectionality value)
+{
+    switch(value) {
+    case TestProtocolDatabaseOptionalParameterBundleDirectionalityLTR:
+        return ASCIILiteral(&quot;LTR&quot;);
+    case TestProtocolDatabaseOptionalParameterBundleDirectionalityRTL:
+        return ASCIILiteral(&quot;RTL&quot;);
+    }
+}
</ins><span class="cx"> 
</span><ins>+template&lt;&gt;
+inline std::optional&lt;TestProtocolDatabaseOptionalParameterBundleDirectionality&gt; fromProtocolString(const String&amp; value)
+{
+    if (value == &quot;LTR&quot;)
+        return TestProtocolDatabaseOptionalParameterBundleDirectionalityLTR;
+    if (value == &quot;RTL&quot;)
+        return TestProtocolDatabaseOptionalParameterBundleDirectionalityRTL;
+    return std::nullopt;
+}
+
+inline String toProtocolString(TestProtocolDatabaseParameterBundleDirectionality value)
+{
+    switch(value) {
+    case TestProtocolDatabaseParameterBundleDirectionalityLTR:
+        return ASCIILiteral(&quot;LTR&quot;);
+    case TestProtocolDatabaseParameterBundleDirectionalityRTL:
+        return ASCIILiteral(&quot;RTL&quot;);
+    }
+}
+
+template&lt;&gt;
+inline std::optional&lt;TestProtocolDatabaseParameterBundleDirectionality&gt; fromProtocolString(const String&amp; value)
+{
+    if (value == &quot;LTR&quot;)
+        return TestProtocolDatabaseParameterBundleDirectionalityLTR;
+    if (value == &quot;RTL&quot;)
+        return TestProtocolDatabaseParameterBundleDirectionalityRTL;
+    return std::nullopt;
+}
+
+
+inline String toProtocolString(TestProtocolTestParameterBundleDirectionality value)
+{
+    switch(value) {
+    case TestProtocolTestParameterBundleDirectionalityLTR:
+        return ASCIILiteral(&quot;LTR&quot;);
+    case TestProtocolTestParameterBundleDirectionalityRTL:
+        return ASCIILiteral(&quot;RTL&quot;);
+    }
+}
+
+template&lt;&gt;
+inline std::optional&lt;TestProtocolTestParameterBundleDirectionality&gt; fromProtocolString(const String&amp; value)
+{
+    if (value == &quot;LTR&quot;)
+        return TestProtocolTestParameterBundleDirectionalityLTR;
+    if (value == &quot;RTL&quot;)
+        return TestProtocolTestParameterBundleDirectionalityRTL;
+    return std::nullopt;
+}
+
</ins><span class="cx"> } // namespace Inspector
</span><span class="cx"> 
</span><span class="cx"> ### End File: TestProtocolTypeConversions.h
</span><span class="lines">@@ -1364,6 +1660,7 @@
</span><span class="cx"> 
</span><span class="cx"> + (void)_parseError:(TestProtocolDatabaseError **)outValue fromPayload:(id)payload;
</span><span class="cx"> + (void)_parseErrorList:(NSArray/*&lt;TestProtocolDatabaseError&gt;*/ **)outValue fromPayload:(id)payload;
</span><ins>++ (void)_parseMouseButton:(NSNumber **)outValue fromPayload:(id)payload;
</ins><span class="cx"> + (void)_parseOptionalParameterBundle:(TestProtocolDatabaseOptionalParameterBundle **)outValue fromPayload:(id)payload;
</span><span class="cx"> + (void)_parseParameterBundle:(TestProtocolDatabaseParameterBundle **)outValue fromPayload:(id)payload;
</span><span class="cx"> + (void)_parseObjectWithPropertyNameConflicts:(TestProtocolDatabaseObjectWithPropertyNameConflicts **)outValue fromPayload:(id)payload;
</span><span class="lines">@@ -1390,6 +1687,14 @@
</span><span class="cx">     *outValue = (NSArray/*&lt;TestProtocolDatabaseError&gt;*/ *)payload;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>++ (void)_parseMouseButton:(NSNumber **)outValue fromPayload:(id)payload
+{
+    THROW_EXCEPTION_FOR_BAD_TYPE(payload, [NSString class]);
+    std::optional&lt;TestProtocolDatabaseMouseButton&gt; result = Inspector::fromProtocolString&lt;TestProtocolDatabaseMouseButton&gt;(payload);
+    THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(result, @&quot;MouseButton&quot;);
+    *outValue = @(result.value());
+}
+
</ins><span class="cx"> + (void)_parseOptionalParameterBundle:(TestProtocolDatabaseOptionalParameterBundle **)outValue fromPayload:(id)payload
</span><span class="cx"> {
</span><span class="cx">     THROW_EXCEPTION_FOR_BAD_TYPE(payload, [NSDictionary class]);
</span><span class="lines">@@ -1534,8 +1839,14 @@
</span><span class="cx">     if (!(self = [super init]))
</span><span class="cx">         return nil;
</span><span class="cx"> 
</span><del>-    self.columnNames = objcArrayFromPayload&lt;NSString&gt;(payload[@&quot;columnNames&quot;]);
</del><ins>+    self.columnNames = payload[@&quot;columnNames&quot;];
</ins><span class="cx"> 
</span><ins>+    self.buttons = payload[@&quot;buttons&quot;];
+
+    std::optional&lt;TestProtocolDatabaseOptionalParameterBundleDirectionality&gt; directionality = fromProtocolString&lt;TestProtocolDatabaseOptionalParameterBundleDirectionality&gt;(payload[@&quot;directionality&quot;]);
+    if (directionality)
+        self.directionality = directionality.value();
+
</ins><span class="cx">     self.notes = payload[@&quot;notes&quot;];
</span><span class="cx"> 
</span><span class="cx">     self.timestamp = [payload[@&quot;timestamp&quot;] doubleValue];
</span><span class="lines">@@ -1568,6 +1879,26 @@
</span><span class="cx">     return objcStringArray([super inspectorArrayForKey:@&quot;columnNames&quot;]);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)setButtons:(NSArray/*&lt;NSString&gt;*/ *)buttons
+{
+    [super setInspectorArray:inspectorStringArray(buttons) forKey:@&quot;buttons&quot;];
+}
+
+- (NSArray/*&lt;NSString&gt;*/ *)buttons
+{
+    return objcStringArray([super inspectorArrayForKey:@&quot;buttons&quot;]);
+}
+
+- (void)setDirectionality:(TestProtocolDatabaseOptionalParameterBundleDirectionality)directionality
+{
+    [super setString:toProtocolString(directionality) forKey:@&quot;directionality&quot;];
+}
+
+- (TestProtocolDatabaseOptionalParameterBundleDirectionality)directionality
+{
+    return fromProtocolString&lt;TestProtocolDatabaseOptionalParameterBundleDirectionality&gt;([super stringForKey:@&quot;directionality&quot;]).value();
+}
+
</ins><span class="cx"> - (void)setNotes:(NSString *)notes
</span><span class="cx"> {
</span><span class="cx">     [super setString:notes forKey:@&quot;notes&quot;];
</span><span class="lines">@@ -1639,8 +1970,16 @@
</span><span class="cx">         return nil;
</span><span class="cx"> 
</span><span class="cx">     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@&quot;columnNames&quot;], @&quot;columnNames&quot;);
</span><del>-    self.columnNames = objcArrayFromPayload&lt;NSString&gt;(payload[@&quot;columnNames&quot;]);
</del><ins>+    self.columnNames = payload[@&quot;columnNames&quot;];
</ins><span class="cx"> 
</span><ins>+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@&quot;buttons&quot;], @&quot;buttons&quot;);
+    self.buttons = payload[@&quot;buttons&quot;];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@&quot;directionality&quot;], @&quot;directionality&quot;);
+    std::optional&lt;TestProtocolDatabaseParameterBundleDirectionality&gt; directionality = fromProtocolString&lt;TestProtocolDatabaseParameterBundleDirectionality&gt;(payload[@&quot;directionality&quot;]);
+    THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(directionality, @&quot;directionality&quot;);
+    self.directionality = directionality.value();
+
</ins><span class="cx">     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@&quot;notes&quot;], @&quot;notes&quot;);
</span><span class="cx">     self.notes = payload[@&quot;notes&quot;];
</span><span class="cx"> 
</span><span class="lines">@@ -1669,12 +2008,13 @@
</span><span class="cx">     return self;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (instancetype)initWithColumnNames:(NSArray/*&lt;NSString&gt;*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error errorList:(NSArray/*&lt;TestProtocolDatabaseError&gt;*/ *)errorList
</del><ins>+- (instancetype)initWithColumnNames:(NSArray/*&lt;NSString&gt;*/ *)columnNames buttons:(NSArray/*&lt;NSString&gt;*/ *)buttons directionality:(TestProtocolDatabaseParameterBundleDirectionality)directionality notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error errorList:(NSArray/*&lt;TestProtocolDatabaseError&gt;*/ *)errorList
</ins><span class="cx"> {
</span><span class="cx">     if (!(self = [super init]))
</span><span class="cx">         return nil;
</span><span class="cx"> 
</span><span class="cx">     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(columnNames, @&quot;columnNames&quot;);
</span><ins>+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(buttons, @&quot;buttons&quot;);
</ins><span class="cx">     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(notes, @&quot;notes&quot;);
</span><span class="cx">     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(values, @&quot;values&quot;);
</span><span class="cx">     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload, @&quot;payload&quot;);
</span><span class="lines">@@ -1683,6 +2023,8 @@
</span><span class="cx">     THROW_EXCEPTION_FOR_BAD_TYPE_IN_ARRAY(errorList, [TestProtocolDatabaseError class]);
</span><span class="cx"> 
</span><span class="cx">     self.columnNames = columnNames;
</span><ins>+    self.buttons = buttons;
+    self.directionality = directionality;
</ins><span class="cx">     self.notes = notes;
</span><span class="cx">     self.timestamp = timestamp;
</span><span class="cx">     self.values = values;
</span><span class="lines">@@ -1703,6 +2045,26 @@
</span><span class="cx">     return objcStringArray([super inspectorArrayForKey:@&quot;columnNames&quot;]);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)setButtons:(NSArray/*&lt;NSString&gt;*/ *)buttons
+{
+    [super setInspectorArray:inspectorStringArray(buttons) forKey:@&quot;buttons&quot;];
+}
+
+- (NSArray/*&lt;NSString&gt;*/ *)buttons
+{
+    return objcStringArray([super inspectorArrayForKey:@&quot;buttons&quot;]);
+}
+
+- (void)setDirectionality:(TestProtocolDatabaseParameterBundleDirectionality)directionality
+{
+    [super setString:toProtocolString(directionality) forKey:@&quot;directionality&quot;];
+}
+
+- (TestProtocolDatabaseParameterBundleDirectionality)directionality
+{
+    return fromProtocolString&lt;TestProtocolDatabaseParameterBundleDirectionality&gt;([super stringForKey:@&quot;directionality&quot;]).value();
+}
+
</ins><span class="cx"> - (void)setNotes:(NSString *)notes
</span><span class="cx"> {
</span><span class="cx">     [super setString:notes forKey:@&quot;notes&quot;];
</span><span class="lines">@@ -1897,8 +2259,16 @@
</span><span class="cx">     if (!(self = [super init]))
</span><span class="cx">         return nil;
</span><span class="cx"> 
</span><ins>+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@&quot;directionality&quot;], @&quot;directionality&quot;);
+    std::optional&lt;TestProtocolTestParameterBundleDirectionality&gt; directionality = fromProtocolString&lt;TestProtocolTestParameterBundleDirectionality&gt;(payload[@&quot;directionality&quot;]);
+    THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(directionality, @&quot;directionality&quot;);
+    self.directionality = directionality.value();
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@&quot;buttons&quot;], @&quot;buttons&quot;);
+    self.buttons = payload[@&quot;buttons&quot;];
+
</ins><span class="cx">     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@&quot;columnNames&quot;], @&quot;columnNames&quot;);
</span><del>-    self.columnNames = objcArrayFromPayload&lt;NSString&gt;(payload[@&quot;columnNames&quot;]);
</del><ins>+    self.columnNames = payload[@&quot;columnNames&quot;];
</ins><span class="cx"> 
</span><span class="cx">     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@&quot;notes&quot;], @&quot;notes&quot;);
</span><span class="cx">     self.notes = payload[@&quot;notes&quot;];
</span><span class="lines">@@ -1925,11 +2295,12 @@
</span><span class="cx">     return self;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (instancetype)initWithColumnNames:(NSArray/*&lt;NSString&gt;*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error
</del><ins>+- (instancetype)initWithDirectionality:(TestProtocolTestParameterBundleDirectionality)directionality buttons:(NSArray/*&lt;NSString&gt;*/ *)buttons columnNames:(NSArray/*&lt;NSString&gt;*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error
</ins><span class="cx"> {
</span><span class="cx">     if (!(self = [super init]))
</span><span class="cx">         return nil;
</span><span class="cx"> 
</span><ins>+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(buttons, @&quot;buttons&quot;);
</ins><span class="cx">     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(columnNames, @&quot;columnNames&quot;);
</span><span class="cx">     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(notes, @&quot;notes&quot;);
</span><span class="cx">     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(values, @&quot;values&quot;);
</span><span class="lines">@@ -1936,6 +2307,8 @@
</span><span class="cx">     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload, @&quot;payload&quot;);
</span><span class="cx">     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(error, @&quot;error&quot;);
</span><span class="cx"> 
</span><ins>+    self.directionality = directionality;
+    self.buttons = buttons;
</ins><span class="cx">     self.columnNames = columnNames;
</span><span class="cx">     self.notes = notes;
</span><span class="cx">     self.timestamp = timestamp;
</span><span class="lines">@@ -1946,6 +2319,26 @@
</span><span class="cx">     return self;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)setDirectionality:(TestProtocolTestParameterBundleDirectionality)directionality
+{
+    [super setString:toProtocolString(directionality) forKey:@&quot;directionality&quot;];
+}
+
+- (TestProtocolTestParameterBundleDirectionality)directionality
+{
+    return fromProtocolString&lt;TestProtocolTestParameterBundleDirectionality&gt;([super stringForKey:@&quot;directionality&quot;]).value();
+}
+
+- (void)setButtons:(NSArray/*&lt;NSString&gt;*/ *)buttons
+{
+    [super setInspectorArray:inspectorStringArray(buttons) forKey:@&quot;buttons&quot;];
+}
+
+- (NSArray/*&lt;NSString&gt;*/ *)buttons
+{
+    return objcStringArray([super inspectorArrayForKey:@&quot;buttons&quot;]);
+}
+
</ins><span class="cx"> - (void)setColumnNames:(NSArray/*&lt;NSString&gt;*/ *)columnNames
</span><span class="cx"> {
</span><span class="cx">     [super setInspectorArray:inspectorStringArray(columnNames) forKey:@&quot;columnNames&quot;];
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenerictypedeclarationobjecttypejson"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/type-declaration-object-type.json (213959 => 213960)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/type-declaration-object-type.json        2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/type-declaration-object-type.json        2017-03-14 23:44:01 UTC (rev 213960)
</span><span class="lines">@@ -18,10 +18,23 @@
</span><span class="cx">             &quot;items&quot;: { &quot;$ref&quot;: &quot;Error&quot; }
</span><span class="cx">         },
</span><span class="cx">         {
</span><ins>+            &quot;id&quot;: &quot;MouseButton&quot;,
+            &quot;type&quot;: &quot;string&quot;,
+            &quot;description&quot;: &quot;Enumerates different mouse buttons that can be used.&quot;,
+            &quot;enum&quot;: [
+                &quot;None&quot;,
+                &quot;Left&quot;,
+                &quot;Middle&quot;,
+                &quot;Right&quot;
+            ]
+        },
+        {
</ins><span class="cx">             &quot;id&quot;: &quot;OptionalParameterBundle&quot;,
</span><span class="cx">             &quot;type&quot;: &quot;object&quot;,
</span><span class="cx">             &quot;properties&quot;: [
</span><span class="cx">                 { &quot;name&quot;: &quot;columnNames&quot;, &quot;type&quot;: &quot;array&quot;, &quot;optional&quot;: true, &quot;items&quot;: { &quot;type&quot;: &quot;string&quot; } },
</span><ins>+                { &quot;name&quot;: &quot;buttons&quot;, &quot;type&quot;: &quot;array&quot;, &quot;optional&quot;: true, &quot;items&quot;: { &quot;$ref&quot;: &quot;MouseButton&quot; } },
+                { &quot;name&quot;: &quot;directionality&quot;, &quot;type&quot;: &quot;string&quot;, &quot;enum&quot;: [&quot;LTR&quot;, &quot;RTL&quot;], &quot;optional&quot;: true },
</ins><span class="cx">                 { &quot;name&quot;: &quot;notes&quot;, &quot;type&quot;: &quot;string&quot;, &quot;optional&quot;: true },
</span><span class="cx">                 { &quot;name&quot;: &quot;timestamp&quot;, &quot;type&quot;: &quot;number&quot;, &quot;optional&quot;: true },
</span><span class="cx">                 { &quot;name&quot;: &quot;values&quot;, &quot;type&quot;: &quot;object&quot;, &quot;optional&quot;: true },
</span><span class="lines">@@ -35,6 +48,8 @@
</span><span class="cx">             &quot;type&quot;: &quot;object&quot;,
</span><span class="cx">             &quot;properties&quot;: [
</span><span class="cx">                 { &quot;name&quot;: &quot;columnNames&quot;, &quot;type&quot;: &quot;array&quot;, &quot;items&quot;: { &quot;type&quot;: &quot;string&quot; } },
</span><ins>+                { &quot;name&quot;: &quot;buttons&quot;, &quot;type&quot;: &quot;array&quot;, &quot;items&quot;: { &quot;$ref&quot;: &quot;MouseButton&quot; } },
+                { &quot;name&quot;: &quot;directionality&quot;, &quot;type&quot;: &quot;string&quot;, &quot;enum&quot;: [&quot;LTR&quot;, &quot;RTL&quot;] },
</ins><span class="cx">                 { &quot;name&quot;: &quot;notes&quot;, &quot;type&quot;: &quot;string&quot; },
</span><span class="cx">                 { &quot;name&quot;: &quot;timestamp&quot;, &quot;type&quot;: &quot;number&quot; },
</span><span class="cx">                 { &quot;name&quot;: &quot;values&quot;, &quot;type&quot;: &quot;object&quot; },
</span><span class="lines">@@ -70,6 +85,8 @@
</span><span class="cx">             &quot;id&quot;: &quot;ParameterBundle&quot;,
</span><span class="cx">             &quot;type&quot;: &quot;object&quot;,
</span><span class="cx">             &quot;properties&quot;: [
</span><ins>+                { &quot;name&quot;: &quot;directionality&quot;, &quot;type&quot;: &quot;string&quot;, &quot;enum&quot;: [&quot;LTR&quot;, &quot;RTL&quot;] },
+                { &quot;name&quot;: &quot;buttons&quot;, &quot;type&quot;: &quot;array&quot;, &quot;items&quot;: { &quot;$ref&quot;: &quot;Database.MouseButton&quot; } },
</ins><span class="cx">                 { &quot;name&quot;: &quot;columnNames&quot;, &quot;type&quot;: &quot;array&quot;, &quot;items&quot;: { &quot;type&quot;: &quot;string&quot; } },
</span><span class="cx">                 { &quot;name&quot;: &quot;notes&quot;, &quot;type&quot;: &quot;string&quot; },
</span><span class="cx">                 { &quot;name&quot;: &quot;timestamp&quot;, &quot;type&quot;: &quot;number&quot; },
</span></span></pre>
</div>
</div>

</body>
</html>