<!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>[206812] trunk/Source/WebCore</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/206812">206812</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2016-10-05 09:09:20 -0700 (Wed, 05 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Bindings] Declare dictionary / enumeration template specializations in the header
https://bugs.webkit.org/show_bug.cgi?id=162929

Reviewed by Darin Adler.

Declare dictionary / enumeration template specializations in the header
so that:
- They can be used from custom bindings code.
- Dictionaries / enumerations can be used to their own IDL files to
  share them (Bug 162912).

No new tests, rebaselined bindings tests.

* WebCore.xcodeproj/project.pbxproj:
* bindings/generic/IDLTypes.h:
* bindings/js/JSDOMConvert.h:
* bindings/scripts/CodeGeneratorJS.pm:
(GenerateInterface):
(GenerateEnumerationImplementationContent):
(GenerateEnumerationHeaderContent):
(GenerateDictionaryHeaderContent):
(GenerateHeader):
(GenerateCallbackHeader):
(GenerateCallbackImplementation):
(GenerateDefaultValue): Deleted.
(GenerateDictionaryImplementationContent): Deleted.
(GenerateParametersCheck): Deleted.
* bindings/scripts/test/JS/JSTestObj.cpp:
* bindings/scripts/test/JS/JSTestObj.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorebindingsgenericIDLTypesh">trunk/Source/WebCore/bindings/generic/IDLTypes.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMConverth">trunk/Source/WebCore/bindings/js/JSDOMConvert.h</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm">trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestObjcpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestObjh">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (206811 => 206812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-10-05 16:02:35 UTC (rev 206811)
+++ trunk/Source/WebCore/ChangeLog        2016-10-05 16:09:20 UTC (rev 206812)
</span><span class="lines">@@ -1,3 +1,35 @@
</span><ins>+2016-10-05  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        [Bindings] Declare dictionary / enumeration template specializations in the header
+        https://bugs.webkit.org/show_bug.cgi?id=162929
+
+        Reviewed by Darin Adler.
+
+        Declare dictionary / enumeration template specializations in the header
+        so that:
+        - They can be used from custom bindings code.
+        - Dictionaries / enumerations can be used to their own IDL files to
+          share them (Bug 162912).
+
+        No new tests, rebaselined bindings tests.
+
+        * WebCore.xcodeproj/project.pbxproj:
+        * bindings/generic/IDLTypes.h:
+        * bindings/js/JSDOMConvert.h:
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (GenerateInterface):
+        (GenerateEnumerationImplementationContent):
+        (GenerateEnumerationHeaderContent):
+        (GenerateDictionaryHeaderContent):
+        (GenerateHeader):
+        (GenerateCallbackHeader):
+        (GenerateCallbackImplementation):
+        (GenerateDefaultValue): Deleted.
+        (GenerateDictionaryImplementationContent): Deleted.
+        (GenerateParametersCheck): Deleted.
+        * bindings/scripts/test/JS/JSTestObj.cpp:
+        * bindings/scripts/test/JS/JSTestObj.h:
+
</ins><span class="cx"> 2016-10-05  Zan Dobersek  &lt;zdobersek@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Rename ENABLE_ENCRYPTED_MEDIA_V2 to ENABLE_LEGACY_ENCRYPTED_MEDIA
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (206811 => 206812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-10-05 16:02:35 UTC (rev 206811)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-10-05 16:09:20 UTC (rev 206812)
</span><span class="lines">@@ -2772,7 +2772,7 @@
</span><span class="cx">                 7C93F34E1AA6BF0700A98BAB /* ContentExtensionCompiler.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C93F34C1AA6BF0700A98BAB /* ContentExtensionCompiler.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 7C9DBFED1A9C49B1000D6B25 /* JSHTMLAttachmentElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C9DBFEB1A9C49B1000D6B25 /* JSHTMLAttachmentElement.cpp */; };
</span><span class="cx">                 7C9DBFEE1A9C49B1000D6B25 /* JSHTMLAttachmentElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C9DBFEC1A9C49B1000D6B25 /* JSHTMLAttachmentElement.h */; };
</span><del>-                7CC16FFB1D77375300CE0877 /* IDLTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CC16FFA1D77375300CE0877 /* IDLTypes.h */; };
</del><ins>+                7CC16FFB1D77375300CE0877 /* IDLTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CC16FFA1D77375300CE0877 /* IDLTypes.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 7CC289DF1AA0FE5D009A9CE3 /* URLRegistry.h in Headers */ = {isa = PBXBuildFile; fileRef = CDEE393817974274001D7580 /* URLRegistry.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 7CC564B818BABEA6001B9652 /* TelephoneNumberDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CC564B618BABEA6001B9652 /* TelephoneNumberDetector.h */; };
</span><span class="cx">                 7CC564BA18BAC720001B9652 /* TelephoneNumberDetectorCocoa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC564B918BAC720001B9652 /* TelephoneNumberDetectorCocoa.cpp */; };
</span><span class="lines">@@ -3099,7 +3099,7 @@
</span><span class="cx">                 930705EB09E0C9F600B17FE4 /* JSCSSPrimitiveValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 930705EA09E0C9F600B17FE4 /* JSCSSPrimitiveValue.h */; };
</span><span class="cx">                 9307F1D70AF2D59000DBA31A /* HitTestResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9307F1D50AF2D59000DBA31A /* HitTestResult.cpp */; };
</span><span class="cx">                 9307F1D80AF2D59000DBA31A /* HitTestResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 9307F1D60AF2D59000DBA31A /* HitTestResult.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><del>-                930841341CDDB15500B0958C /* JSDOMConvert.h in Headers */ = {isa = PBXBuildFile; fileRef = 930841331CDDB15500B0958C /* JSDOMConvert.h */; };
</del><ins>+                930841341CDDB15500B0958C /* JSDOMConvert.h in Headers */ = {isa = PBXBuildFile; fileRef = 930841331CDDB15500B0958C /* JSDOMConvert.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 930908910AF7EDE40081DF01 /* HitTestRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 930908900AF7EDE40081DF01 /* HitTestRequest.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 930C90DD19CF965300D6C21A /* InlineIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 930C90DC19CF965300D6C21A /* InlineIterator.cpp */; };
</span><span class="cx">                 93153BDA14181F7A00FCF5BE /* missingImage@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 93153BD914181F7A00FCF5BE /* missingImage@2x.png */; };
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsgenericIDLTypesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/generic/IDLTypes.h (206811 => 206812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/generic/IDLTypes.h        2016-10-05 16:02:35 UTC (rev 206811)
+++ trunk/Source/WebCore/bindings/generic/IDLTypes.h        2016-10-05 16:09:20 UTC (rev 206812)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;wtf/Brigand.h&gt;
</span><span class="cx"> #include &lt;wtf/StdLibExtras.h&gt;
</span><ins>+#include &lt;wtf/text/WTFString.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> class JSValue;
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMConverth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMConvert.h (206811 => 206812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMConvert.h        2016-10-05 16:02:35 UTC (rev 206811)
+++ trunk/Source/WebCore/bindings/js/JSDOMConvert.h        2016-10-05 16:09:20 UTC (rev 206812)
</span><span class="lines">@@ -408,4 +408,8 @@
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+// Used for IDL enumerations.
+template&lt;typename T&gt; Optional&lt;T&gt; parse(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;typename T&gt; const char* expectedEnumerationValues();
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (206811 => 206812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2016-10-05 16:02:35 UTC (rev 206811)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2016-10-05 16:09:20 UTC (rev 206812)
</span><span class="lines">@@ -128,10 +128,10 @@
</span><span class="cx">     AddStringifierOperationIfNeeded($interface);
</span><span class="cx"> 
</span><span class="cx">     if ($interface-&gt;isCallback) {
</span><del>-        $object-&gt;GenerateCallbackHeader($interface);
</del><ins>+        $object-&gt;GenerateCallbackHeader($interface, $enumerations, $dictionaries);
</ins><span class="cx">         $object-&gt;GenerateCallbackImplementation($interface, $enumerations, $dictionaries);
</span><span class="cx">     } else {
</span><del>-        $object-&gt;GenerateHeader($interface);
</del><ins>+        $object-&gt;GenerateHeader($interface, $enumerations, $dictionaries);
</ins><span class="cx">         $object-&gt;GenerateImplementation($interface, $enumerations, $dictionaries);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -808,14 +808,7 @@
</span><span class="cx"> 
</span><span class="cx">     return &quot;&quot; unless @$enumerations;
</span><span class="cx"> 
</span><del>-    # FIXME: Could optimize this to only generate the parts of each enumeration that are actually
-    # used, which would require iterating over everything in the interface.
-
</del><span class="cx">     my $result = &quot;&quot;;
</span><del>-
-    $result .= &quot;template&lt;typename T&gt; Optional&lt;T&gt; parse(ExecState&amp;, JSValue);\n&quot;;
-    $result .= &quot;template&lt;typename T&gt; const char* expectedEnumerationValues();\n\n&quot;;
-
</del><span class="cx">     foreach my $enumeration (@$enumerations) {
</span><span class="cx">         my $name = $enumeration-&gt;name;
</span><span class="cx"> 
</span><span class="lines">@@ -827,9 +820,6 @@
</span><span class="cx">         my $conditionalString = $codeGenerator-&gt;GenerateConditionalString($enumeration);
</span><span class="cx">         $result .= &quot;#if ${conditionalString}\n\n&quot; if $conditionalString;
</span><span class="cx"> 
</span><del>-        # Declare this instead of using &quot;static&quot; because it may be unused and we don't want warnings about that.
-        $result .= &quot;JSString* jsStringWithCache(ExecState*, $className);\n\n&quot;;
-
</del><span class="cx">         # Take an ExecState* instead of an ExecState&amp; to match the jsStringWithCache from JSString.h.
</span><span class="cx">         # FIXME: Change to take VM&amp; instead of ExecState*.
</span><span class="cx">         $result .= &quot;JSString* jsStringWithCache(ExecState* state, $className enumerationValue)\n&quot;;
</span><span class="lines">@@ -855,10 +845,6 @@
</span><span class="cx">         $result .= &quot;    return jsStringWithCache(state, values[static_cast&lt;size_t&gt;(enumerationValue)]);\n&quot;;
</span><span class="cx">         $result .= &quot;}\n\n&quot;;
</span><span class="cx"> 
</span><del>-        $result .= &quot;template&lt;&gt; struct JSValueTraits&lt;$className&gt; {\n&quot;;
-        $result .= &quot;    static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, $className value) { return jsStringWithCache(state, value); }\n&quot;;
-        $result .= &quot;};\n\n&quot;;
-
</del><span class="cx">         # FIXME: Change to take VM&amp; instead of ExecState&amp;.
</span><span class="cx">         # FIXME: Consider using toStringOrNull to make exception checking faster.
</span><span class="cx">         # FIXME: Consider finding a more efficient way to match against all the strings quickly.
</span><span class="lines">@@ -892,7 +878,7 @@
</span><span class="cx">         $result .= &quot;    return result.value();\n&quot;;
</span><span class="cx">         $result .= &quot;}\n\n&quot;;
</span><span class="cx"> 
</span><del>-        $result .= &quot;template&lt;&gt; inline const char* expectedEnumerationValues&lt;$className&gt;()\n&quot;;
</del><ins>+        $result .= &quot;template&lt;&gt; const char* expectedEnumerationValues&lt;$className&gt;()\n&quot;;
</ins><span class="cx">         $result .= &quot;{\n&quot;;
</span><span class="cx">         $result .= &quot;    return \&quot;\\\&quot;&quot; . join (&quot;\\\&quot;, \\\&quot;&quot;, @{$enumeration-&gt;values}) . &quot;\\\&quot;\&quot;;\n&quot;;
</span><span class="cx">         $result .= &quot;}\n\n&quot;;
</span><span class="lines">@@ -902,6 +888,42 @@
</span><span class="cx">     return $result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+sub GenerateEnumerationHeaderContent
+{
+    my ($interface, $enumerations) = @_;
+
+    return &quot;&quot; unless @$enumerations;
+
+    # FIXME: Could optimize this to only generate the parts of each enumeration that are actually
+    # used, which would require iterating over everything in the interface.
+
+    $headerIncludes{&quot;JSDOMConvert.h&quot;} = 1;
+
+    my $result = &quot;&quot;;
+
+    foreach my $enumeration (@$enumerations) {
+        my $name = $enumeration-&gt;name;
+
+        my $className = GetEnumerationClassName($interface, $name);
+
+        my $conditionalString = $codeGenerator-&gt;GenerateConditionalString($enumeration);
+        $result .= &quot;#if ${conditionalString}\n\n&quot; if $conditionalString;
+
+        $result .= &quot;JSC::JSString* jsStringWithCache(JSC::ExecState*, $className);\n\n&quot;;
+
+        $result .= &quot;template&lt;&gt; struct JSValueTraits&lt;$className&gt; {\n&quot;;
+        $result .= &quot;    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, $className value) { return jsStringWithCache(state, value); }\n&quot;;
+        $result .= &quot;};\n\n&quot;;
+
+        $result .= &quot;template&lt;&gt; Optional&lt;$className&gt; parse&lt;$className&gt;(JSC::ExecState&amp;, JSC::JSValue);\n&quot;;
+        $result .= &quot;template&lt;&gt; $className convert&lt;$className&gt;(JSC::ExecState&amp;, JSC::JSValue);\n&quot;;
+        $result .= &quot;template&lt;&gt; const char* expectedEnumerationValues&lt;$className&gt;();\n\n&quot;;
+
+        $result .= &quot;#endif\n\n&quot; if $conditionalString;
+    }
+    return $result;
+}
+
</ins><span class="cx"> sub GetDictionaryClassName
</span><span class="cx"> {
</span><span class="cx">     my ($interface, $name) = @_;
</span><span class="lines">@@ -951,6 +973,31 @@
</span><span class="cx">     return &quot;&quot;;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+sub GenerateDictionaryHeaderContent
+{
+    my ($interface, $allDictionaries) = @_;
+
+    return &quot;&quot; unless @$allDictionaries;
+
+    $headerIncludes{&quot;JSDOMConvert.h&quot;} = 1;
+
+    my $result = &quot;&quot;;
+    foreach my $dictionary (@$allDictionaries) {
+        my $name = $dictionary-&gt;name;
+
+        my $conditionalString = $codeGenerator-&gt;GenerateConditionalString($dictionary);
+        $result .= &quot;#if ${conditionalString}\n\n&quot; if $conditionalString;
+
+        $headerIncludes{$interface-&gt;name . &quot;.h&quot;} = 1;
+
+        my $className = GetDictionaryClassName($interface, $name);
+        $result .= &quot;template&lt;&gt; Optional&lt;$className&gt; convertDictionary&lt;$className&gt;(JSC::ExecState&amp;, JSC::JSValue);\n\n&quot;;
+
+        $result .= &quot;#endif\n\n&quot; if $conditionalString;
+    }
+    return $result;
+}
+
</ins><span class="cx"> sub GenerateDictionaryImplementationContent
</span><span class="cx"> {
</span><span class="cx">     my ($interface, $allDictionaries) = @_;
</span><span class="lines">@@ -1079,7 +1126,7 @@
</span><span class="cx"> 
</span><span class="cx"> sub GenerateHeader
</span><span class="cx"> {
</span><del>-    my ($object, $interface) = @_;
</del><ins>+    my ($object, $interface, $enumerations, $dictionaries) = @_;
</ins><span class="cx"> 
</span><span class="cx">     my $interfaceName = $interface-&gt;name;
</span><span class="cx">     my $className = &quot;JS$interfaceName&quot;;
</span><span class="lines">@@ -1571,6 +1618,9 @@
</span><span class="cx">         push(@headerContent, &quot;};\n&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    push(@headerContent, GenerateEnumerationHeaderContent($interface, $enumerations));
+    push(@headerContent, GenerateDictionaryHeaderContent($interface, $dictionaries));
+
</ins><span class="cx">     my $conditionalString = $codeGenerator-&gt;GenerateConditionalString($interface);
</span><span class="cx">     push(@headerContent, &quot;\n} // namespace WebCore\n&quot;);
</span><span class="cx">     push(@headerContent, &quot;\n#endif // ${conditionalString}\n&quot;) if $conditionalString;
</span><span class="lines">@@ -4126,7 +4176,7 @@
</span><span class="cx"> 
</span><span class="cx"> sub GenerateCallbackHeader
</span><span class="cx"> {
</span><del>-    my ($object, $interface) = @_;
</del><ins>+    my ($object, $interface, $enumerations, $dictionaries) = @_;
</ins><span class="cx"> 
</span><span class="cx">     my $interfaceName = $interface-&gt;name;
</span><span class="cx">     my $className = &quot;JS$interfaceName&quot;;
</span><span class="lines">@@ -4185,6 +4235,9 @@
</span><span class="cx">     push(@headerContent, &quot;JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, $interfaceName&amp;);\n&quot;);
</span><span class="cx">     push(@headerContent, &quot;inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, $interfaceName* impl) { return impl ? toJS(state, globalObject, *impl) : JSC::jsNull(); }\n\n&quot;);
</span><span class="cx"> 
</span><ins>+    push(@headerContent, GenerateEnumerationHeaderContent($interface, $enumerations));
+    push(@headerContent, GenerateDictionaryHeaderContent($interface, $dictionaries));
+
</ins><span class="cx">     push(@headerContent, &quot;} // namespace WebCore\n&quot;);
</span><span class="cx"> 
</span><span class="cx">     my $conditionalString = $codeGenerator-&gt;GenerateConditionalString($interface);
</span><span class="lines">@@ -4193,7 +4246,7 @@
</span><span class="cx"> 
</span><span class="cx"> sub GenerateCallbackImplementation
</span><span class="cx"> {
</span><del>-    my ($object, $interface, $enumerations) = @_;
</del><ins>+    my ($object, $interface, $enumerations, $dictionaries) = @_;
</ins><span class="cx"> 
</span><span class="cx">     my $interfaceName = $interface-&gt;name;
</span><span class="cx">     my $visibleInterfaceName = $codeGenerator-&gt;GetVisibleInterfaceName($interface);
</span><span class="lines">@@ -4211,6 +4264,7 @@
</span><span class="cx">     push(@implContent, &quot;namespace WebCore {\n\n&quot;);
</span><span class="cx"> 
</span><span class="cx">     push(@implContent, GenerateEnumerationImplementationContent($interface, $enumerations));
</span><ins>+    push(@implContent, GenerateDictionaryImplementationContent($interface, $dictionaries));
</ins><span class="cx"> 
</span><span class="cx">     # Constructor
</span><span class="cx">     push(@implContent, &quot;${className}::${className}(JSObject* callback, JSDOMGlobalObject* globalObject)\n&quot;);
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestObjcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp (206811 => 206812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp        2016-10-05 16:02:35 UTC (rev 206811)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp        2016-10-05 16:09:20 UTC (rev 206812)
</span><span class="lines">@@ -34,7 +34,6 @@
</span><span class="cx"> #include &quot;JSBlob.h&quot;
</span><span class="cx"> #include &quot;JSDOMBinding.h&quot;
</span><span class="cx"> #include &quot;JSDOMConstructor.h&quot;
</span><del>-#include &quot;JSDOMConvert.h&quot;
</del><span class="cx"> #include &quot;JSDOMIterator.h&quot;
</span><span class="cx"> #include &quot;JSDOMPromise.h&quot;
</span><span class="cx"> #include &quot;JSDOMStringList.h&quot;
</span><span class="lines">@@ -92,11 +91,6 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-template&lt;typename T&gt; Optional&lt;T&gt; parse(ExecState&amp;, JSValue);
-template&lt;typename T&gt; const char* expectedEnumerationValues();
-
-JSString* jsStringWithCache(ExecState*, TestObj::EnumType);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, TestObj::EnumType enumerationValue)
</span><span class="cx"> {
</span><span class="cx">     static NeverDestroyed&lt;const String&gt; values[] = {
</span><span class="lines">@@ -113,10 +107,6 @@
</span><span class="cx">     return jsStringWithCache(state, values[static_cast&lt;size_t&gt;(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; struct JSValueTraits&lt;TestObj::EnumType&gt; {
-    static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, TestObj::EnumType value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template&lt;&gt; Optional&lt;TestObj::EnumType&gt; parse&lt;TestObj::EnumType&gt;(ExecState&amp; state, JSValue value)
</span><span class="cx"> {
</span><span class="cx">     auto stringValue = value.toWTFString(&amp;state);
</span><span class="lines">@@ -143,13 +133,11 @@
</span><span class="cx">     return result.value();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; inline const char* expectedEnumerationValues&lt;TestObj::EnumType&gt;()
</del><ins>+template&lt;&gt; const char* expectedEnumerationValues&lt;TestObj::EnumType&gt;()
</ins><span class="cx"> {
</span><span class="cx">     return &quot;\&quot;\&quot;, \&quot;enumValue1\&quot;, \&quot;EnumValue2\&quot;, \&quot;EnumValue3\&quot;&quot;;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-JSString* jsStringWithCache(ExecState*, TestObj::Optional);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, TestObj::Optional enumerationValue)
</span><span class="cx"> {
</span><span class="cx">     static NeverDestroyed&lt;const String&gt; values[] = {
</span><span class="lines">@@ -166,10 +154,6 @@
</span><span class="cx">     return jsStringWithCache(state, values[static_cast&lt;size_t&gt;(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; struct JSValueTraits&lt;TestObj::Optional&gt; {
-    static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, TestObj::Optional value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template&lt;&gt; Optional&lt;TestObj::Optional&gt; parse&lt;TestObj::Optional&gt;(ExecState&amp; state, JSValue value)
</span><span class="cx"> {
</span><span class="cx">     auto stringValue = value.toWTFString(&amp;state);
</span><span class="lines">@@ -196,13 +180,11 @@
</span><span class="cx">     return result.value();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; inline const char* expectedEnumerationValues&lt;TestObj::Optional&gt;()
</del><ins>+template&lt;&gt; const char* expectedEnumerationValues&lt;TestObj::Optional&gt;()
</ins><span class="cx"> {
</span><span class="cx">     return &quot;\&quot;\&quot;, \&quot;OptionalValue1\&quot;, \&quot;OptionalValue2\&quot;, \&quot;OptionalValue3\&quot;&quot;;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-JSString* jsStringWithCache(ExecState*, AlternateEnumName);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, AlternateEnumName enumerationValue)
</span><span class="cx"> {
</span><span class="cx">     static NeverDestroyed&lt;const String&gt; values[] = {
</span><span class="lines">@@ -215,10 +197,6 @@
</span><span class="cx">     return jsStringWithCache(state, values[static_cast&lt;size_t&gt;(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; struct JSValueTraits&lt;AlternateEnumName&gt; {
-    static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, AlternateEnumName value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template&lt;&gt; Optional&lt;AlternateEnumName&gt; parse&lt;AlternateEnumName&gt;(ExecState&amp; state, JSValue value)
</span><span class="cx"> {
</span><span class="cx">     auto stringValue = value.toWTFString(&amp;state);
</span><span class="lines">@@ -241,7 +219,7 @@
</span><span class="cx">     return result.value();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; inline const char* expectedEnumerationValues&lt;AlternateEnumName&gt;()
</del><ins>+template&lt;&gt; const char* expectedEnumerationValues&lt;AlternateEnumName&gt;()
</ins><span class="cx"> {
</span><span class="cx">     return &quot;\&quot;enumValue1\&quot;, \&quot;EnumValue2\&quot;&quot;;
</span><span class="cx"> }
</span><span class="lines">@@ -248,8 +226,6 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(Condition1)
</span><span class="cx"> 
</span><del>-JSString* jsStringWithCache(ExecState*, TestObj::EnumA);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, TestObj::EnumA enumerationValue)
</span><span class="cx"> {
</span><span class="cx">     static NeverDestroyed&lt;const String&gt; values[] = {
</span><span class="lines">@@ -260,10 +236,6 @@
</span><span class="cx">     return jsStringWithCache(state, values[static_cast&lt;size_t&gt;(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; struct JSValueTraits&lt;TestObj::EnumA&gt; {
-    static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, TestObj::EnumA value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template&lt;&gt; Optional&lt;TestObj::EnumA&gt; parse&lt;TestObj::EnumA&gt;(ExecState&amp; state, JSValue value)
</span><span class="cx"> {
</span><span class="cx">     auto stringValue = value.toWTFString(&amp;state);
</span><span class="lines">@@ -284,7 +256,7 @@
</span><span class="cx">     return result.value();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; inline const char* expectedEnumerationValues&lt;TestObj::EnumA&gt;()
</del><ins>+template&lt;&gt; const char* expectedEnumerationValues&lt;TestObj::EnumA&gt;()
</ins><span class="cx"> {
</span><span class="cx">     return &quot;\&quot;A\&quot;&quot;;
</span><span class="cx"> }
</span><span class="lines">@@ -293,8 +265,6 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(Condition1) &amp;&amp; ENABLE(Condition2)
</span><span class="cx"> 
</span><del>-JSString* jsStringWithCache(ExecState*, TestObj::EnumB);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, TestObj::EnumB enumerationValue)
</span><span class="cx"> {
</span><span class="cx">     static NeverDestroyed&lt;const String&gt; values[] = {
</span><span class="lines">@@ -305,10 +275,6 @@
</span><span class="cx">     return jsStringWithCache(state, values[static_cast&lt;size_t&gt;(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; struct JSValueTraits&lt;TestObj::EnumB&gt; {
-    static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, TestObj::EnumB value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template&lt;&gt; Optional&lt;TestObj::EnumB&gt; parse&lt;TestObj::EnumB&gt;(ExecState&amp; state, JSValue value)
</span><span class="cx"> {
</span><span class="cx">     auto stringValue = value.toWTFString(&amp;state);
</span><span class="lines">@@ -329,7 +295,7 @@
</span><span class="cx">     return result.value();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; inline const char* expectedEnumerationValues&lt;TestObj::EnumB&gt;()
</del><ins>+template&lt;&gt; const char* expectedEnumerationValues&lt;TestObj::EnumB&gt;()
</ins><span class="cx"> {
</span><span class="cx">     return &quot;\&quot;B\&quot;&quot;;
</span><span class="cx"> }
</span><span class="lines">@@ -338,8 +304,6 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(Condition1) || ENABLE(Condition2)
</span><span class="cx"> 
</span><del>-JSString* jsStringWithCache(ExecState*, TestObj::EnumC);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, TestObj::EnumC enumerationValue)
</span><span class="cx"> {
</span><span class="cx">     static NeverDestroyed&lt;const String&gt; values[] = {
</span><span class="lines">@@ -350,10 +314,6 @@
</span><span class="cx">     return jsStringWithCache(state, values[static_cast&lt;size_t&gt;(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; struct JSValueTraits&lt;TestObj::EnumC&gt; {
-    static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, TestObj::EnumC value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template&lt;&gt; Optional&lt;TestObj::EnumC&gt; parse&lt;TestObj::EnumC&gt;(ExecState&amp; state, JSValue value)
</span><span class="cx"> {
</span><span class="cx">     auto stringValue = value.toWTFString(&amp;state);
</span><span class="lines">@@ -374,7 +334,7 @@
</span><span class="cx">     return result.value();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; inline const char* expectedEnumerationValues&lt;TestObj::EnumC&gt;()
</del><ins>+template&lt;&gt; const char* expectedEnumerationValues&lt;TestObj::EnumC&gt;()
</ins><span class="cx"> {
</span><span class="cx">     return &quot;\&quot;C\&quot;&quot;;
</span><span class="cx"> }
</span><span class="lines">@@ -381,8 +341,6 @@
</span><span class="cx"> 
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-JSString* jsStringWithCache(ExecState*, TestObj::Kind);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, TestObj::Kind enumerationValue)
</span><span class="cx"> {
</span><span class="cx">     static NeverDestroyed&lt;const String&gt; values[] = {
</span><span class="lines">@@ -395,10 +353,6 @@
</span><span class="cx">     return jsStringWithCache(state, values[static_cast&lt;size_t&gt;(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; struct JSValueTraits&lt;TestObj::Kind&gt; {
-    static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, TestObj::Kind value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template&lt;&gt; Optional&lt;TestObj::Kind&gt; parse&lt;TestObj::Kind&gt;(ExecState&amp; state, JSValue value)
</span><span class="cx"> {
</span><span class="cx">     auto stringValue = value.toWTFString(&amp;state);
</span><span class="lines">@@ -421,13 +375,11 @@
</span><span class="cx">     return result.value();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; inline const char* expectedEnumerationValues&lt;TestObj::Kind&gt;()
</del><ins>+template&lt;&gt; const char* expectedEnumerationValues&lt;TestObj::Kind&gt;()
</ins><span class="cx"> {
</span><span class="cx">     return &quot;\&quot;quick\&quot;, \&quot;dead\&quot;&quot;;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-JSString* jsStringWithCache(ExecState*, TestObj::Size);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, TestObj::Size enumerationValue)
</span><span class="cx"> {
</span><span class="cx">     static NeverDestroyed&lt;const String&gt; values[] = {
</span><span class="lines">@@ -440,10 +392,6 @@
</span><span class="cx">     return jsStringWithCache(state, values[static_cast&lt;size_t&gt;(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; struct JSValueTraits&lt;TestObj::Size&gt; {
-    static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, TestObj::Size value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template&lt;&gt; Optional&lt;TestObj::Size&gt; parse&lt;TestObj::Size&gt;(ExecState&amp; state, JSValue value)
</span><span class="cx"> {
</span><span class="cx">     auto stringValue = value.toWTFString(&amp;state);
</span><span class="lines">@@ -466,13 +414,11 @@
</span><span class="cx">     return result.value();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; inline const char* expectedEnumerationValues&lt;TestObj::Size&gt;()
</del><ins>+template&lt;&gt; const char* expectedEnumerationValues&lt;TestObj::Size&gt;()
</ins><span class="cx"> {
</span><span class="cx">     return &quot;\&quot;small\&quot;, \&quot;much-much-larger\&quot;&quot;;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-JSString* jsStringWithCache(ExecState*, TestObj::Confidence);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, TestObj::Confidence enumerationValue)
</span><span class="cx"> {
</span><span class="cx">     static NeverDestroyed&lt;const String&gt; values[] = {
</span><span class="lines">@@ -485,10 +431,6 @@
</span><span class="cx">     return jsStringWithCache(state, values[static_cast&lt;size_t&gt;(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; struct JSValueTraits&lt;TestObj::Confidence&gt; {
-    static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, TestObj::Confidence value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template&lt;&gt; Optional&lt;TestObj::Confidence&gt; parse&lt;TestObj::Confidence&gt;(ExecState&amp; state, JSValue value)
</span><span class="cx"> {
</span><span class="cx">     auto stringValue = value.toWTFString(&amp;state);
</span><span class="lines">@@ -511,7 +453,7 @@
</span><span class="cx">     return result.value();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; inline const char* expectedEnumerationValues&lt;TestObj::Confidence&gt;()
</del><ins>+template&lt;&gt; const char* expectedEnumerationValues&lt;TestObj::Confidence&gt;()
</ins><span class="cx"> {
</span><span class="cx">     return &quot;\&quot;high\&quot;, \&quot;kinda-low\&quot;&quot;;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestObjh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h (206811 => 206812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h        2016-10-05 16:02:35 UTC (rev 206811)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h        2016-10-05 16:09:20 UTC (rev 206812)
</span><span class="lines">@@ -20,6 +20,7 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><ins>+#include &quot;JSDOMConvert.h&quot;
</ins><span class="cx"> #include &quot;JSDOMWrapper.h&quot;
</span><span class="cx"> #include &quot;TestObj.h&quot;
</span><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><span class="lines">@@ -104,5 +105,119 @@
</span><span class="cx"> template&lt;&gt; struct JSDOMWrapperConverterTraits&lt;TestObj&gt; {
</span><span class="cx">     using WrapperClass = JSTestObj;
</span><span class="cx"> };
</span><ins>+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::EnumType);
</ins><span class="cx"> 
</span><ins>+template&lt;&gt; struct JSValueTraits&lt;TestObj::EnumType&gt; {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::EnumType value) { return jsStringWithCache(state, value); }
+};
+
+template&lt;&gt; Optional&lt;TestObj::EnumType&gt; parse&lt;TestObj::EnumType&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; TestObj::EnumType convert&lt;TestObj::EnumType&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; const char* expectedEnumerationValues&lt;TestObj::EnumType&gt;();
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::Optional);
+
+template&lt;&gt; struct JSValueTraits&lt;TestObj::Optional&gt; {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::Optional value) { return jsStringWithCache(state, value); }
+};
+
+template&lt;&gt; Optional&lt;TestObj::Optional&gt; parse&lt;TestObj::Optional&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; TestObj::Optional convert&lt;TestObj::Optional&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; const char* expectedEnumerationValues&lt;TestObj::Optional&gt;();
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, AlternateEnumName);
+
+template&lt;&gt; struct JSValueTraits&lt;AlternateEnumName&gt; {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, AlternateEnumName value) { return jsStringWithCache(state, value); }
+};
+
+template&lt;&gt; Optional&lt;AlternateEnumName&gt; parse&lt;AlternateEnumName&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; AlternateEnumName convert&lt;AlternateEnumName&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; const char* expectedEnumerationValues&lt;AlternateEnumName&gt;();
+
+#if ENABLE(Condition1)
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::EnumA);
+
+template&lt;&gt; struct JSValueTraits&lt;TestObj::EnumA&gt; {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::EnumA value) { return jsStringWithCache(state, value); }
+};
+
+template&lt;&gt; Optional&lt;TestObj::EnumA&gt; parse&lt;TestObj::EnumA&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; TestObj::EnumA convert&lt;TestObj::EnumA&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; const char* expectedEnumerationValues&lt;TestObj::EnumA&gt;();
+
+#endif
+
+#if ENABLE(Condition1) &amp;&amp; ENABLE(Condition2)
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::EnumB);
+
+template&lt;&gt; struct JSValueTraits&lt;TestObj::EnumB&gt; {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::EnumB value) { return jsStringWithCache(state, value); }
+};
+
+template&lt;&gt; Optional&lt;TestObj::EnumB&gt; parse&lt;TestObj::EnumB&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; TestObj::EnumB convert&lt;TestObj::EnumB&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; const char* expectedEnumerationValues&lt;TestObj::EnumB&gt;();
+
+#endif
+
+#if ENABLE(Condition1) || ENABLE(Condition2)
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::EnumC);
+
+template&lt;&gt; struct JSValueTraits&lt;TestObj::EnumC&gt; {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::EnumC value) { return jsStringWithCache(state, value); }
+};
+
+template&lt;&gt; Optional&lt;TestObj::EnumC&gt; parse&lt;TestObj::EnumC&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; TestObj::EnumC convert&lt;TestObj::EnumC&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; const char* expectedEnumerationValues&lt;TestObj::EnumC&gt;();
+
+#endif
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::Kind);
+
+template&lt;&gt; struct JSValueTraits&lt;TestObj::Kind&gt; {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::Kind value) { return jsStringWithCache(state, value); }
+};
+
+template&lt;&gt; Optional&lt;TestObj::Kind&gt; parse&lt;TestObj::Kind&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; TestObj::Kind convert&lt;TestObj::Kind&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; const char* expectedEnumerationValues&lt;TestObj::Kind&gt;();
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::Size);
+
+template&lt;&gt; struct JSValueTraits&lt;TestObj::Size&gt; {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::Size value) { return jsStringWithCache(state, value); }
+};
+
+template&lt;&gt; Optional&lt;TestObj::Size&gt; parse&lt;TestObj::Size&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; TestObj::Size convert&lt;TestObj::Size&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; const char* expectedEnumerationValues&lt;TestObj::Size&gt;();
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::Confidence);
+
+template&lt;&gt; struct JSValueTraits&lt;TestObj::Confidence&gt; {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::Confidence value) { return jsStringWithCache(state, value); }
+};
+
+template&lt;&gt; Optional&lt;TestObj::Confidence&gt; parse&lt;TestObj::Confidence&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; TestObj::Confidence convert&lt;TestObj::Confidence&gt;(JSC::ExecState&amp;, JSC::JSValue);
+template&lt;&gt; const char* expectedEnumerationValues&lt;TestObj::Confidence&gt;();
+
+template&lt;&gt; Optional&lt;TestObj::Dictionary&gt; convertDictionary&lt;TestObj::Dictionary&gt;(JSC::ExecState&amp;, JSC::JSValue);
+
+template&lt;&gt; Optional&lt;TestObj::DictionaryThatShouldNotTolerateNull&gt; convertDictionary&lt;TestObj::DictionaryThatShouldNotTolerateNull&gt;(JSC::ExecState&amp;, JSC::JSValue);
+
+template&lt;&gt; Optional&lt;TestObj::DictionaryThatShouldTolerateNull&gt; convertDictionary&lt;TestObj::DictionaryThatShouldTolerateNull&gt;(JSC::ExecState&amp;, JSC::JSValue);
+
+template&lt;&gt; Optional&lt;AlternateDictionaryName&gt; convertDictionary&lt;AlternateDictionaryName&gt;(JSC::ExecState&amp;, JSC::JSValue);
+
+template&lt;&gt; Optional&lt;TestObj::ParentDictionary&gt; convertDictionary&lt;TestObj::ParentDictionary&gt;(JSC::ExecState&amp;, JSC::JSValue);
+
+template&lt;&gt; Optional&lt;TestObj::ChildDictionary&gt; convertDictionary&lt;TestObj::ChildDictionary&gt;(JSC::ExecState&amp;, JSC::JSValue);
+
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre>
</div>
</div>

</body>
</html>