1e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke# Copyright (c) 2010 The Chromium Authors. All rights reserved.
2e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke# Use of this source code is governed by a BSD-style license that can be
3e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke# found in the LICENSE file.
4e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
5e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkepackage CodeGeneratorInspector;
6e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
7e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkeuse strict;
8e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
9967717af5423377c967781471ee106e2bb4e11c8Ben Murdochuse Class::Struct;
10e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkeuse File::stat;
11e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
12e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkemy %typeTransform;
13cad810f21b803229eb11403f9209855525a25d57Steve Block$typeTransform{"ApplicationCache"} = {
14cad810f21b803229eb11403f9209855525a25d57Steve Block    "forward" => "InspectorApplicationCacheAgent",
15cad810f21b803229eb11403f9209855525a25d57Steve Block    "header" => "InspectorApplicationCacheAgent.h",
162bde8e466a4451c7319e3a072d118917957d6554Steve Block    "domainAccessor" => "m_applicationCacheAgent",
17dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch};
18cad810f21b803229eb11403f9209855525a25d57Steve Block$typeTransform{"CSS"} = {
19cad810f21b803229eb11403f9209855525a25d57Steve Block    "forward" => "InspectorCSSAgent",
20cad810f21b803229eb11403f9209855525a25d57Steve Block    "header" => "InspectorCSSAgent.h",
212bde8e466a4451c7319e3a072d118917957d6554Steve Block    "domainAccessor" => "m_cssAgent",
22dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch};
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch$typeTransform{"Console"} = {
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    "forward" => "InspectorConsoleAgent",
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    "header" => "InspectorConsoleAgent.h",
262bde8e466a4451c7319e3a072d118917957d6554Steve Block    "domainAccessor" => "m_consoleAgent",
272bde8e466a4451c7319e3a072d118917957d6554Steve Block};
282bde8e466a4451c7319e3a072d118917957d6554Steve Block$typeTransform{"Page"} = {
292bde8e466a4451c7319e3a072d118917957d6554Steve Block    "forward" => "InspectorPageAgent",
302bde8e466a4451c7319e3a072d118917957d6554Steve Block    "header" => "InspectorPageAgent.h",
312bde8e466a4451c7319e3a072d118917957d6554Steve Block    "domainAccessor" => "m_pageAgent",
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch};
33f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch$typeTransform{"Debugger"} = {
34dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "forward" => "InspectorDebuggerAgent",
35dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "header" => "InspectorDebuggerAgent.h",
362bde8e466a4451c7319e3a072d118917957d6554Steve Block    "domainAccessor" => "m_debuggerAgent",
37dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch};
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch$typeTransform{"BrowserDebugger"} = {
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    "forward" => "InspectorBrowserDebuggerAgent",
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    "header" => "InspectorBrowserDebuggerAgent.h",
412bde8e466a4451c7319e3a072d118917957d6554Steve Block    "domainAccessor" => "m_browserDebuggerAgent",
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch};
43cad810f21b803229eb11403f9209855525a25d57Steve Block$typeTransform{"Database"} = {
44cad810f21b803229eb11403f9209855525a25d57Steve Block    "forward" => "InspectorDatabaseAgent",
45cad810f21b803229eb11403f9209855525a25d57Steve Block    "header" => "InspectorDatabaseAgent.h",
462bde8e466a4451c7319e3a072d118917957d6554Steve Block    "domainAccessor" => "m_databaseAgent",
47a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch};
48dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch$typeTransform{"DOM"} = {
49dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "forward" => "InspectorDOMAgent",
50dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "header" => "InspectorDOMAgent.h",
512bde8e466a4451c7319e3a072d118917957d6554Steve Block    "domainAccessor" => "m_domAgent",
526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner};
53cad810f21b803229eb11403f9209855525a25d57Steve Block$typeTransform{"DOMStorage"} = {
54cad810f21b803229eb11403f9209855525a25d57Steve Block    "forward" => "InspectorDOMStorageAgent",
55cad810f21b803229eb11403f9209855525a25d57Steve Block    "header" => "InspectorDOMStorageAgent.h",
562bde8e466a4451c7319e3a072d118917957d6554Steve Block    "domainAccessor" => "m_domStorageAgent",
57e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block};
5828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu$typeTransform{"FileSystem"} = {
5928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    "forward" => "InspectorFileSystemAgent",
6028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    "header" => "InspectorFileSystemAgent.h",
612bde8e466a4451c7319e3a072d118917957d6554Steve Block    "domainAccessor" => "m_fileSystemAgent",
62ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch};
63cad810f21b803229eb11403f9209855525a25d57Steve Block$typeTransform{"Inspector"} = {
642bde8e466a4451c7319e3a072d118917957d6554Steve Block    "forward" => "InspectorAgent",
652bde8e466a4451c7319e3a072d118917957d6554Steve Block    "header" => "InspectorAgent.h",
66ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "domainAccessor" => "m_inspectorAgent",
67cad810f21b803229eb11403f9209855525a25d57Steve Block};
68cad810f21b803229eb11403f9209855525a25d57Steve Block$typeTransform{"Network"} = {
69cad810f21b803229eb11403f9209855525a25d57Steve Block    "forward" => "InspectorResourceAgent",
70cad810f21b803229eb11403f9209855525a25d57Steve Block    "header" => "InspectorResourceAgent.h",
712bde8e466a4451c7319e3a072d118917957d6554Steve Block    "domainAccessor" => "m_resourceAgent",
7228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu};
73e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block$typeTransform{"Profiler"} = {
74e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    "forward" => "InspectorProfilerAgent",
75e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    "header" => "InspectorProfilerAgent.h",
762bde8e466a4451c7319e3a072d118917957d6554Steve Block    "domainAccessor" => "m_profilerAgent",
77ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch};
78ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch$typeTransform{"Runtime"} = {
79ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "forward" => "InspectorRuntimeAgent",
80ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "header" => "InspectorRuntimeAgent.h",
812bde8e466a4451c7319e3a072d118917957d6554Steve Block    "domainAccessor" => "m_runtimeAgent",
82dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch};
8381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch$typeTransform{"Timeline"} = {
8481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    "forward" => "InspectorTimelineAgent",
8581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    "header" => "InspectorTimelineAgent.h",
862bde8e466a4451c7319e3a072d118917957d6554Steve Block    "domainAccessor" => "m_timelineAgent",
8781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
88cad810f21b803229eb11403f9209855525a25d57Steve Block
89dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch$typeTransform{"Frontend"} = {
90e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    "forward" => "InspectorFrontend",
91e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    "header" => "InspectorFrontend.h",
920617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen};
93e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke$typeTransform{"PassRefPtr"} = {
94e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "forwardHeader" => "wtf/PassRefPtr.h",
95e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke};
9654cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block$typeTransform{"RefCounted"} = {
9754cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    "forwardHeader" => "wtf/RefCounted.h",
9854cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block};
992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch$typeTransform{"InspectorFrontendChannel"} = {
1002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    "forward" => "InspectorFrontendChannel",
1012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    "header" => "InspectorFrontendChannel.h",
1022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch};
103e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke$typeTransform{"Object"} = {
104e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "param" => "PassRefPtr<InspectorObject>",
105dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "variable" => "RefPtr<InspectorObject>",
106dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "defaultValue" => "InspectorObject::create()",
107e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "forward" => "InspectorObject",
108e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "header" => "InspectorValues.h",
109ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "JSONType" => "Object",
11081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    "JSType" => "object",
111e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke};
112e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke$typeTransform{"Array"} = {
113e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "param" => "PassRefPtr<InspectorArray>",
114dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "variable" => "RefPtr<InspectorArray>",
115dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "defaultValue" => "InspectorArray::create()",
116e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "forward" => "InspectorArray",
117e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "header" => "InspectorValues.h",
118ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "JSONType" => "Array",
11981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    "JSType" => "object",
120e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke};
121e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke$typeTransform{"Value"} = {
122e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "param" => "PassRefPtr<InspectorValue>",
123dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "variable" => "RefPtr<InspectorValue>",
124dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "defaultValue" => "InspectorValue::null()",
125e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "forward" => "InspectorValue",
126e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "header" => "InspectorValues.h",
127ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "JSONType" => "Value",
12881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    "JSType" => "",
129e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke};
130e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke$typeTransform{"String"} = {
131e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "param" => "const String&",
132dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "variable" => "String",
1334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    "return" => "String",
134e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    "defaultValue" => "\"\"",
135ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "forwardHeader" => "PlatformString.h",
136e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "header" => "PlatformString.h",
137ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "JSONType" => "String",
138ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "JSType" => "string"
139e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke};
140e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke$typeTransform{"long"} = {
141e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "param" => "long",
142dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "variable" => "long",
143dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "defaultValue" => "0",
144e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "forward" => "",
145e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "header" => "",
146ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "JSONType" => "Number",
147ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "JSType" => "number"
148e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke};
149e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke$typeTransform{"int"} = {
150e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "param" => "int",
151dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "variable" => "int",
152dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "defaultValue" => "0",
153e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "forward" => "",
154e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "header" => "",
155e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    "JSONType" => "Number",
156ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "JSType" => "number"
157e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke};
158e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke$typeTransform{"unsigned long"} = {
159e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "param" => "unsigned long",
160dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "variable" => "unsigned long",
161dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "defaultValue" => "0u",
162dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "forward" => "",
163dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "header" => "",
164ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "JSONType" => "Number",
165ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "JSType" => "number"
166dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch};
167dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch$typeTransform{"unsigned int"} = {
168dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "param" => "unsigned int",
169dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "variable" => "unsigned int",
170dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "defaultValue" => "0u",
171e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "forward" => "",
172e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "header" => "",
173ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "JSONType" => "Number",
174ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "JSType" => "number"
175e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke};
176a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch$typeTransform{"double"} = {
177a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    "param" => "double",
178a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    "variable" => "double",
179a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    "defaultValue" => "0.0",
180a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    "forward" => "",
181a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    "header" => "",
182ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "JSONType" => "Number",
183ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "JSType" => "number"
184a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch};
185e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke$typeTransform{"boolean"} = {
186e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "param" => "bool",
187dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "variable"=> "bool",
188dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    "defaultValue" => "false",
189e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "forward" => "",
190e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "header" => "",
191ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "JSONType" => "Boolean",
192ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    "JSType" => "boolean"
193e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke};
194e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke$typeTransform{"void"} = {
195e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "forward" => "",
196e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    "header" => ""
197e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke};
1982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch$typeTransform{"Vector"} = {
1992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    "header" => "wtf/Vector.h"
2002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch};
201e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
202e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke# Default License Templates
203e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
204e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkemy $licenseTemplate = << "EOF";
205e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke// Copyright (c) 2010 The Chromium Authors. All rights reserved.
206e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke// Use of this source code is governed by a BSD-style license that can be
207e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke// found in the LICENSE file.
208e458d70a0d18538346f41b503114c9ebe6b2ce12Leon ClarkeEOF
209e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
210e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkemy $codeGenerator;
211e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkemy $outputDir;
212967717af5423377c967781471ee106e2bb4e11c8Ben Murdochmy $outputHeadersDir;
213e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkemy $writeDependencies;
214e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkemy $verbose;
215e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
216e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkemy $namespace;
217e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
2180617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenmy $backendClassName;
21954cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Blockmy $backendClassDeclaration;
220f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickmy $backendJSStubName;
2210617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenmy %backendTypes;
2222fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockmy @backendMethods;
2230617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenmy @backendMethodsImpl;
2242fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockmy %backendMethodSignatures;
2250617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenmy $backendConstructor;
226f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickmy @backendConstantDeclarations;
227f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickmy @backendConstantDefinitions;
2282bde8e466a4451c7319e3a072d118917957d6554Steve Blockmy @backendFooter;
2292fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockmy @backendJSStubs;
2302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochmy @backendJSEvents;
2312bde8e466a4451c7319e3a072d118917957d6554Steve Blockmy %backendDomains;
2320617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
233967717af5423377c967781471ee106e2bb4e11c8Ben Murdochmy $frontendClassName;
234967717af5423377c967781471ee106e2bb4e11c8Ben Murdochmy %frontendTypes;
2352fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockmy @frontendMethods;
23681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochmy @frontendAgentFields;
237967717af5423377c967781471ee106e2bb4e11c8Ben Murdochmy @frontendMethodsImpl;
2382fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockmy %frontendMethodSignatures;
239967717af5423377c967781471ee106e2bb4e11c8Ben Murdochmy $frontendConstructor;
240f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickmy @frontendConstantDeclarations;
241f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickmy @frontendConstantDefinitions;
24281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochmy @frontendFooter;
24381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
244e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke# Default constructor
245e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkesub new
246e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
247e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    my $object = shift;
248e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    my $reference = { };
249e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
250e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    $codeGenerator = shift;
251e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    $outputDir = shift;
252967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    $outputHeadersDir = shift;
253e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    shift; # $useLayerOnTop
254e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    shift; # $preprocessor
255e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    $writeDependencies = shift;
256e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    $verbose = shift;
257e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
258e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    bless($reference, $object);
259e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    return $reference;
260e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
261e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
262e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke# Params: 'idlDocument' struct
263e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkesub GenerateModule
264e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
265e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    my $object = shift;
266e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    my $dataNode = shift;
267e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
268e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    $namespace = $dataNode->module;
269967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    $namespace =~ s/core/WebCore/;
270967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
2712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    $frontendClassName = "InspectorFrontend";
2722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    $frontendConstructor = "    ${frontendClassName}(InspectorFrontendChannel*);";
27381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    push(@frontendFooter, "private:");
2742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@frontendFooter, "    InspectorFrontendChannel* m_inspectorFrontendChannel;");
275967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    $frontendTypes{"String"} = 1;
2762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    $frontendTypes{"InspectorFrontendChannel"} = 1;
277967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    $frontendTypes{"PassRefPtr"} = 1;
278967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
2792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    $backendClassName = "InspectorBackendDispatcher";
28054cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    $backendClassDeclaration = "InspectorBackendDispatcher: public RefCounted<InspectorBackendDispatcher>";
2812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    $backendJSStubName = "InspectorBackendStub";
282f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    $backendTypes{"Inspector"} = 1;
2832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    $backendTypes{"InspectorFrontendChannel"} = 1;
2840617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    $backendTypes{"PassRefPtr"} = 1;
28554cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    $backendTypes{"RefCounted"} = 1;
286e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    $backendTypes{"Object"} = 1;
28781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
28881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
28981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# Params: 'idlDocument' struct
29081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochsub GenerateInterface
29181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
29281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $object = shift;
29381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $interface = shift;
29481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $defines = shift;
2950617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
29681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my %agent = (
29781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        methodDeclarations => [],
29881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        methodSignatures => {}
29981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    );
30081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    generateFunctions($interface, \%agent);
30181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (@{$agent{methodDeclarations}}) {
30281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        generateAgentDeclaration($interface, \%agent);
30381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
30481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
30581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
30681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochsub generateAgentDeclaration
30781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
30881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $interface = shift;
30981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $agent = shift;
31081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $agentName = $interface->name;
31181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    push(@frontendMethods, "    class ${agentName} {");
31281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    push(@frontendMethods, "    public:");
3132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@frontendMethods, "        ${agentName}(InspectorFrontendChannel* inspectorFrontendChannel) : m_inspectorFrontendChannel(inspectorFrontendChannel) { }");
31481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    push(@frontendMethods, @{$agent->{methodDeclarations}});
3152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@frontendMethods, "        void setInspectorFrontendChannel(InspectorFrontendChannel* inspectorFrontendChannel) { m_inspectorFrontendChannel = inspectorFrontendChannel; }");
3162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@frontendMethods, "        InspectorFrontendChannel* getInspectorFrontendChannel() { return m_inspectorFrontendChannel; }");
31781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    push(@frontendMethods, "    private:");
3182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@frontendMethods, "        InspectorFrontendChannel* m_inspectorFrontendChannel;");
31981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    push(@frontendMethods, "    };");
32081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    push(@frontendMethods, "");
32181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
32281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $getterName = lc($agentName);
32381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    push(@frontendMethods, "    ${agentName}* ${getterName}() { return &m_${getterName}; }");
32481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    push(@frontendMethods, "");
32581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
32681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    push(@frontendFooter, "    ${agentName} m_${getterName};");
32781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
32881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    push(@frontendAgentFields, "m_${getterName}");
32981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
33081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
33181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochsub generateFrontendConstructorImpl
33281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
33381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my @frontendConstructorImpl;
3342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@frontendConstructorImpl, "${frontendClassName}::${frontendClassName}(InspectorFrontendChannel* inspectorFrontendChannel)");
3352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@frontendConstructorImpl, "    : m_inspectorFrontendChannel(inspectorFrontendChannel)");
33681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    foreach my $agentField (@frontendAgentFields) {
3372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        push(@frontendConstructorImpl, "    , ${agentField}(inspectorFrontendChannel)");
33881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
33981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    push(@frontendConstructorImpl, "{");
34081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    push(@frontendConstructorImpl, "}");
34181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return @frontendConstructorImpl;
342e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
343e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
344967717af5423377c967781471ee106e2bb4e11c8Ben Murdochsub generateFunctions
345e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
346e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    my $interface = shift;
34781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $agent = shift;
348e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
349e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    foreach my $function (@{$interface->functions}) {
35081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if ($function->signature->extendedAttributes->{"event"}) {
35181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            generateFrontendFunction($interface, $function, $agent);
352f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        } else {
3532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            generateBackendFunction($interface, $function);
354f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        }
355e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    }
356f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
3572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    collectBackendJSStubFunctions($interface);
3582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    collectBackendJSStubEvents($interface);
359e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
360e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
361967717af5423377c967781471ee106e2bb4e11c8Ben Murdochsub generateFrontendFunction
362e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
3632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    my $interface = shift;
364967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    my $function = shift;
36581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $agent = shift;
366967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
367f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    my $functionName = $function->signature->name;
368967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
3692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    my $domain = $interface->name;
370967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    my @argsFiltered = grep($_->direction eq "out", @{$function->parameters}); # just keep only out parameters for frontend interface.
371967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    map($frontendTypes{$_->type} = 1, @argsFiltered); # register required types.
37281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $arguments = join(", ", map(typeTraits($_->type, "param") . " " . $_->name, @argsFiltered)); # prepare arguments for function signature.
373967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
37481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $signature = "        void ${functionName}(${arguments});";
37581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    !$agent->{methodSignatures}->{$signature} || die "Duplicate frontend function was detected for signature '$signature'.";
37681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    $agent->{methodSignatures}->{$signature} = 1;
37781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    push(@{$agent->{methodDeclarations}}, $signature);
3782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    my @function;
38081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    push(@function, "void ${frontendClassName}::${domain}::${functionName}(${arguments})");
3812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    push(@function, "{");
3822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    push(@function, "    RefPtr<InspectorObject> ${functionName}Message = InspectorObject::create();");
3832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "    ${functionName}Message->setString(\"method\", \"$domain.$functionName\");");
38481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (scalar(@argsFiltered)) {
3852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        push(@function, "    RefPtr<InspectorObject> paramsObject = InspectorObject::create();");
3862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
38781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        foreach my $parameter (@argsFiltered) {
3882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            my $optional = $parameter->extendedAttributes->{"optional"} ? "if (" . $parameter->name . ")\n        " : "";
3892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            push(@function, "    " . $optional . "paramsObject->set" . typeTraits($parameter->type, "JSONType") . "(\"" . $parameter->name . "\", " . $parameter->name . ");");
39081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
3912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        push(@function, "    ${functionName}Message->setObject(\"params\", paramsObject);");
39281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
39354cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    push(@function, "    if (m_inspectorFrontendChannel)");
39454cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    push(@function, "        m_inspectorFrontendChannel->sendMessageToFrontend(${functionName}Message->toJSONString());");
3952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "}");
3962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "");
3972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@frontendMethodsImpl, @function);
39881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
39981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
4004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangsub camelCase
4014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
4024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    my $value = shift;
4034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    $value =~ s/\b(\w)/\U$1/g; # make a camel-case name for type name
4044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    $value =~ s/ //g;
4054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return $value;
4064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
4074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
4080617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsensub generateBackendFunction
4090617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
4102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    my $interface = shift;
4110617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    my $function = shift;
4120617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4130617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    my $functionName = $function->signature->name;
4142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    my $fullQualifiedFunctionName = $interface->name . "_" . $function->signature->name;
4152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    my $fullQualifiedFunctionNameDot = $interface->name . "." . $function->signature->name;
4160617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    push(@backendConstantDeclarations, "    static const char* ${fullQualifiedFunctionName}Cmd;");
4182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@backendConstantDefinitions, "const char* ${backendClassName}::${fullQualifiedFunctionName}Cmd = \"${fullQualifiedFunctionNameDot}\";");
419f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
420dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    map($backendTypes{$_->type} = 1, @{$function->parameters}); # register required types
4212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    my @inArgs = grep($_->direction eq "in", @{$function->parameters});
422dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    my @outArgs = grep($_->direction eq "out", @{$function->parameters});
42381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
4242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    my $signature = "    void ${fullQualifiedFunctionName}(long callId, InspectorObject* requestMessageObject);";
4252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    !$backendMethodSignatures{${signature}} || die "Duplicate function was detected for signature '$signature'.";
4262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    $backendMethodSignatures{${signature}} = "$fullQualifiedFunctionName";
4272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    push(@backendMethods, ${signature});
4280617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4290617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    my @function;
430e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    my $requestMessageObject = scalar(@inArgs) ? " requestMessageObject" : "";
4312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    push(@function, "void ${backendClassName}::${fullQualifiedFunctionName}(long callId, InspectorObject*$requestMessageObject)");
4320617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    push(@function, "{");
433e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    push(@function, "    RefPtr<InspectorArray> protocolErrors = InspectorArray::create();");
434dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    push(@function, "");
435dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
4362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    my $domain = $interface->name;
43781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $domainAccessor = typeTraits($domain, "domainAccessor");
438e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    $backendTypes{$domain} = 1;
4392bde8e466a4451c7319e3a072d118917957d6554Steve Block    $backendDomains{$domain} = 1;
440e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    push(@function, "    if (!$domainAccessor)");
4412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "        protocolErrors->pushString(\"$domain handler is not available.\");");
442dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    push(@function, "");
4430617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    # declare local variables for out arguments.
4452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (scalar(@outArgs)) {
4462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        push(@function, map("    " . typeTraits($_->type, "variable") . " out_" . $_->name . " = " . typeTraits($_->type, "defaultValue") . ";", @outArgs));
4472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        push(@function, "");
4482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4492bde8e466a4451c7319e3a072d118917957d6554Steve Block    push(@function, "    ErrorString error;");
4502bde8e466a4451c7319e3a072d118917957d6554Steve Block    push(@function, "");
451e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
4524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    my $indent = "";
4534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (scalar(@inArgs)) {
4542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        push(@function, "    if (RefPtr<InspectorObject> paramsContainer = requestMessageObject->getObject(\"params\")) {");
455e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
456e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        foreach my $parameter (@inArgs) {
457e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            my $name = $parameter->name;
458e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            my $type = $parameter->type;
4594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            my $typeString = camelCase($parameter->type);
4602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            my $optional = $parameter->extendedAttributes->{"optional"} ? "true" : "false";
4612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            push(@function, "        " . typeTraits($type, "variable") . " in_$name = get$typeString(paramsContainer.get(), \"$name\", $optional, protocolErrors.get());");
462e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        }
4634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        push(@function, "");
4644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        $indent = "    ";
4650617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    }
466dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
4672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    my $args = join(", ",
4692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                    ("&error",
4702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                     map(($_->extendedAttributes->{"optional"} ? "&" : "") . "in_" . $_->name, @inArgs),
4712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                     map("&out_" . $_->name, @outArgs)));
4722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    push(@function, "$indent    if (!protocolErrors->length())");
4744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    push(@function, "$indent        $domainAccessor->$functionName($args);");
4754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (scalar(@inArgs)) {
4762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        push(@function, "    } else");
4772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        push(@function, "        protocolErrors->pushString(\"'params' property with type 'object' was not found.\");");
4784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
479dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
4802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "");
481e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    push(@function, "    // use InspectorFrontend as a marker of WebInspector availability");
482e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    push(@function, "");
4832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "    if (protocolErrors->length()) {");
4842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "        reportProtocolError(&callId, InvalidParams, protocolErrors);");
4852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "        return;");
486e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    push(@function, "    }");
4872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "");
4882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "    if (error.length()) {");
4892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "        reportProtocolError(&callId, ServerError, error);");
4902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "        return;");
4912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "    }");
4922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "");
4932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "    RefPtr<InspectorObject> responseMessage = InspectorObject::create();");
4942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "    RefPtr<InspectorObject> result = InspectorObject::create();");
4952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, map("        result->set" . typeTraits($_->type, "JSONType") . "(\"" . $_->name . "\", out_" . $_->name . ");", @outArgs));
4962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "    responseMessage->setObject(\"result\", result);");
4972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "");
4982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@function, "    responseMessage->setNumber(\"id\", callId);");
49954cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    push(@function, "    if (m_inspectorFrontendChannel)");
50054cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    push(@function, "        m_inspectorFrontendChannel->sendMessageToFrontend(responseMessage->toJSONString());");
5010617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    push(@function, "}");
5020617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    push(@function, "");
5030617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    push(@backendMethodsImpl, @function);
5040617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
5050617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
506dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochsub generateBackendReportProtocolError
507dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
508dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    my $reportProtocolError = << "EOF";
509dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
5102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid ${backendClassName}::reportProtocolError(const long* const callId, CommonErrorCode code, const String& customText) const
511dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
5122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<InspectorArray> data = InspectorArray::create();
5132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    data->pushString(customText);
5142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    reportProtocolError(callId, code, data.release());
5152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
5162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid ${backendClassName}::reportProtocolError(const long* const callId, CommonErrorCode code, PassRefPtr<InspectorArray> data) const
5182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
5192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    DEFINE_STATIC_LOCAL(Vector<String>,s_commonErrors,);
5202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!s_commonErrors.size()) {
5212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        s_commonErrors.insert(ParseError, "{\\\"code\\\":-32700,\\\"message\\\":\\\"Parse error.\\\"}");
5222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        s_commonErrors.insert(InvalidRequest, "{\\\"code\\\":-32600,\\\"message\\\":\\\"Invalid Request.\\\"}");
5232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        s_commonErrors.insert(MethodNotFound, "{\\\"code\\\":-32601,\\\"message\\\":\\\"Method not found.\\\"}");
5242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        s_commonErrors.insert(InvalidParams, "{\\\"code\\\":-32602,\\\"message\\\":\\\"Invalid params.\\\"}");
5252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        s_commonErrors.insert(InternalError, "{\\\"code\\\":-32603,\\\"message\\\":\\\"Internal error.\\\"}");
5262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        s_commonErrors.insert(ServerError, "{\\\"code\\\":-32000,\\\"message\\\":\\\"Server error.\\\"}");
5272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(code >=0);
5292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT((unsigned)code < s_commonErrors.size());
5302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(s_commonErrors[code]);
5312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(InspectorObject::parseJSON(s_commonErrors[code]));
5322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<InspectorObject> error = InspectorObject::parseJSON(s_commonErrors[code])->asObject();
5332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(error);
5342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    error->setArray("data", data);
535e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    RefPtr<InspectorObject> message = InspectorObject::create();
5362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    message->setObject("error", error);
5372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (callId)
5382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        message->setNumber("id", *callId);
5392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    else
5402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        message->setValue("id", InspectorValue::null());
54154cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    if (m_inspectorFrontendChannel)
54254cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        m_inspectorFrontendChannel->sendMessageToFrontend(message->toJSONString());
543dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
544dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochEOF
545dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return split("\n", $reportProtocolError);
546dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
547dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
5484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangsub generateArgumentGetters
5494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
5504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    my $type = shift;
55181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $json = typeTraits($type, "JSONType");
55281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $variable = typeTraits($type, "variable");
55381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $defaultValue = typeTraits($type, "defaultValue");
55481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $return  = typeTraits($type, "return") ? typeTraits($type, "return") : typeTraits($type, "param");
5554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
5564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    my $typeString = camelCase($type);
5572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@backendConstantDeclarations, "    $return get$typeString(InspectorObject* object, const String& name, bool optional, InspectorArray* protocolErrors);");
5584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    my $getterBody = << "EOF";
5594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
5602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch$return InspectorBackendDispatcher::get$typeString(InspectorObject* object, const String& name, bool optional, InspectorArray* protocolErrors)
5614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
5624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ASSERT(object);
5634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ASSERT(protocolErrors);
5644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
5654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    $variable value = $defaultValue;
5664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    InspectorObject::const_iterator end = object->end();
5674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    InspectorObject::const_iterator valueIterator = object->find(name);
5684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
5692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (valueIterator == end) {
5702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!optional)
5712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            protocolErrors->pushString(String::format("Parameter '\%s' with type '$json' was not found.", name.utf8().data()));
5722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return value;
5734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
5742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!valueIterator->second->as$json(&value))
5762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        protocolErrors->pushString(String::format("Parameter '\%s' has wrong type. It should be '$json'.", name.utf8().data()));
5774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return value;
5784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
5794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEOF
5804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
5814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return split("\n", $getterBody);
5824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
583e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
5840617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsensub generateBackendDispatcher
5850617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
5860617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    my @body;
5872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    my @mapEntries = map("        dispatchMap.add(${_}Cmd, &${backendClassName}::$_);", map ($backendMethodSignatures{$_}, @backendMethods));
588dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    my $mapEntries = join("\n", @mapEntries);
589dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
590dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    my $backendDispatcherBody = << "EOF";
591dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid ${backendClassName}::dispatch(const String& message)
592dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
59354cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    RefPtr<${backendClassName}> protect = this;
594e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    typedef void (${backendClassName}::*CallHandler)(long callId, InspectorObject* messageObject);
595dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    typedef HashMap<String, CallHandler> DispatchMap;
596dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    DEFINE_STATIC_LOCAL(DispatchMap, dispatchMap, );
597e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    long callId = 0;
598e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
599dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (dispatchMap.isEmpty()) {
600dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch$mapEntries
601dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    }
602dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
603dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    RefPtr<InspectorValue> parsedMessage = InspectorValue::parseJSON(message);
604dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (!parsedMessage) {
6052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        reportProtocolError(0, ParseError, "Message should be in JSON format.");
606e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return;
607e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    }
608e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
609e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    RefPtr<InspectorObject> messageObject = parsedMessage->asObject();
610e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (!messageObject) {
6112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        reportProtocolError(0, InvalidRequest, "Invalid message format. The message should be a JSONified object.");
612dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        return;
613dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    }
614dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
6152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<InspectorValue> callIdValue = messageObject->get("id");
6162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!callIdValue) {
6172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        reportProtocolError(0, InvalidRequest, "Invalid message format. 'id' property was not found in the request.");
61881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
61981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
62081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
6212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!callIdValue->asNumber(&callId)) {
6222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        reportProtocolError(0, InvalidRequest, "Invalid message format. The type of 'id' property should be number.");
62381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
62481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
62581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
6262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<InspectorValue> methodValue = messageObject->get("method");
6272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!methodValue) {
6282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        reportProtocolError(&callId, InvalidRequest, "Invalid message format. 'method' property wasn't found.");
629dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        return;
630dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    }
631dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
6322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    String method;
6332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!methodValue->asString(&method)) {
6342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        reportProtocolError(&callId, InvalidRequest, "Invalid message format. The type of 'method' property should be string.");
635e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return;
636e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    }
637e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
6382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    HashMap<String, CallHandler>::iterator it = dispatchMap.find(method);
639dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (it == dispatchMap.end()) {
6402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        reportProtocolError(&callId, MethodNotFound, makeString("Invalid method name was received. '", method, "' wasn't found."));
641dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        return;
642dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    }
643dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
644e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    ((*this).*it->second)(callId, messageObject.get());
645dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
646dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochEOF
647dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return split("\n", $backendDispatcherBody);
6480617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
6490617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
650f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricksub generateBackendMessageParser
651f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
652f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    my $messageParserBody = << "EOF";
653f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickbool ${backendClassName}::getCommandName(const String& message, String* result)
654f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
655f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    RefPtr<InspectorValue> value = InspectorValue::parseJSON(message);
656f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (!value)
657f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return false;
658e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
659e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    RefPtr<InspectorObject> object = value->asObject();
660e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (!object)
661f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return false;
662f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
6632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!object->getString("method", result))
664f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return false;
665e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
66681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return true;
667f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
668f486d19d62f1bc33246748b14b14a9dfa617b57fIain MerrickEOF
669f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return split("\n", $messageParserBody);
670f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
671f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
6722fc2651226baac27029e38c9d6ef883fa32084dbSteve Blocksub collectBackendJSStubFunctions
673f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
674f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    my $interface = shift;
67581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my @functions = grep(!$_->signature->extendedAttributes->{"event"}, @{$interface->functions});
6762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    my $domain = $interface->name;
677e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
6782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    foreach my $function (@functions) {
679e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        my $name = $function->signature->name;
6802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        my @inArgs = grep($_->direction eq "in", @{$function->parameters});
6812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        my $argumentNames = join(
6822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            ",",
6832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            map("\"" . $_->name . "\": {"
6842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                . "\"optional\": " . ($_->extendedAttributes->{"optional"} ? "true " : "false") . ", "
6852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                . "\"type\": \"" . typeTraits($_->type, "JSType") . "\""
6862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                . "}",
6872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                 @inArgs));
6882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        push(@backendJSStubs, "    this._registerDelegate('{" .
6892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            "\"method\": \"$domain.$name\", " .
6902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            (scalar(@inArgs) ? "\"params\": {$argumentNames}, " : "") .
6912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            "\"id\": 0" .
692e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        "}');");
693e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    }
6942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
695f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
6962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochsub collectBackendJSStubEvents
6972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
6982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    my $interface = shift;
6992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    my @functions = grep($_->signature->extendedAttributes->{"event"}, @{$interface->functions});
7002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    my $domain = $interface->name;
7012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    foreach my $function (@functions) {
7032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        my $name = $domain . "." . $function->signature->name;
7042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        my @outArgs = grep($_->direction eq "out", @{$function->parameters});
7052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        my $argumentNames = join(",", map("\"" . $_->name . "\"" , @outArgs));
7062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        push(@backendJSEvents, "    this._eventArgs[\"" . $name . "\"] = [" . $argumentNames ."];");
7072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
7082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
7092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7102fc2651226baac27029e38c9d6ef883fa32084dbSteve Blocksub generateBackendStubJS
7112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
7122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    my $JSStubs = join("\n", @backendJSStubs);
7132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    my $JSEvents = join("\n", @backendJSEvents);
714f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    my $inspectorBackendStubJS = << "EOF";
715f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick$licenseTemplate
716f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
717f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochInspectorBackendStub = function()
718f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
719f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    this._lastCallbackId = 1;
72081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    this._pendingResponsesCount = 0;
721f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    this._callbacks = {};
722f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    this._domainDispatchers = {};
7232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this._eventArgs = {};
724f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick$JSStubs
7252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch$JSEvents
726f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
727f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
728f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochInspectorBackendStub.prototype = {
729f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    _wrap: function(callback)
730f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    {
731f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        var callbackId = this._lastCallbackId++;
732f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        this._callbacks[callbackId] = callback || function() {};
733f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return callbackId;
734f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    },
735f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
7362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    _registerDelegate: function(requestString)
737f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    {
7382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var domainAndFunction = JSON.parse(requestString).method.split(".");
7392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var agentName = domainAndFunction[0] + "Agent";
74081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!window[agentName])
74181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            window[agentName] = {};
7422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        window[agentName][domainAndFunction[1]] = this.sendMessageToBackend.bind(this, requestString);
743f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    },
744f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
745f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    sendMessageToBackend: function()
746f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    {
747e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        var args = Array.prototype.slice.call(arguments);
748e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        var request = JSON.parse(args.shift());
7492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var callback = (args.length && typeof args[args.length - 1] === "function") ? args.pop() : 0;
7502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var domainAndMethod = request.method.split(".");
7512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var agentMethod = domainAndMethod[0] + "Agent." + domainAndMethod[1];
7522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (request.params) {
7542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            for (var key in request.params) {
7552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                var typeName = request.params[key].type;
7562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                var optionalFlag = request.params[key].optional;
7572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                if (args.length === 0 && !optionalFlag) {
7592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                    console.error("Protocol Error: Invalid number of arguments for method '" + agentMethod + "' call. It should have the next arguments '" + JSON.stringify(request.params) + "'.");
7602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                    return;
7612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                }
7625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
7632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                var value = args.shift();
7642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                if (optionalFlag && typeof value === "undefined") {
7652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                    delete request.params[key];
7662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                    continue;
7672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                }
7682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                if (typeof value !== typeName) {
7702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                    console.error("Protocol Error: Invalid type of argument '" + key + "' for method '" + agentMethod + "' call. It should be '" + typeName + "' but it is '" + typeof value + "'.");
7712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                    return;
7722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                }
7732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                request.params[key] = value;
7755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
776e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        }
7775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
7782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (args.length === 1 && !callback) {
7792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (typeof args[0] !== "undefined") {
7802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                console.error("Protocol Error: Optional callback argument for method '" + agentMethod + "' call should be a function but its type is '" + typeof args[0] + "'.");
7815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                return;
7825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
7835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        }
7842bde8e466a4451c7319e3a072d118917957d6554Steve Block        request.id = this._wrap(callback || function() {});
785e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
7864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (window.dumpInspectorProtocolMessages)
7874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            console.log("frontend: " + JSON.stringify(request));
7884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
789e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        var message = JSON.stringify(request);
79081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
79181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        ++this._pendingResponsesCount;
792f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        InspectorFrontendHost.sendMessageToBackend(message);
793f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    },
794f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
795f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    registerDomainDispatcher: function(domain, dispatcher)
796f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    {
797f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        this._domainDispatchers[domain] = dispatcher;
798f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    },
799f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
800f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    dispatch: function(message)
801f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    {
802f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (window.dumpInspectorProtocolMessages)
803f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            console.log("backend: " + ((typeof message === "string") ? message : JSON.stringify(message)));
804f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
805f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        var messageObject = (typeof message === "string") ? JSON.parse(message) : message;
806f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
8072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if ("id" in messageObject) { // just a response for some request
8082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (messageObject.error && messageObject.error.code !== -32000)
809f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                this.reportProtocolError(messageObject);
81081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
8112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var arguments = [];
8122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (messageObject.result) {
8132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                for (var key in messageObject.result)
8142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                    arguments.push(messageObject.result[key]);
8152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            }
8162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var callback = this._callbacks[messageObject.id];
8182bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (callback) {
8192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                arguments.unshift(messageObject.error);
8202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                callback.apply(null, arguments);
8212bde8e466a4451c7319e3a072d118917957d6554Steve Block                --this._pendingResponsesCount;
8222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                delete this._callbacks[messageObject.id];
8232bde8e466a4451c7319e3a072d118917957d6554Steve Block            }
82481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
82581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (this._scripts && !this._pendingResponsesCount)
82681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                this.runAfterPendingDispatches();
82781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
828f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            return;
8292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        } else {
8302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var method = messageObject.method.split(".");
8312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var domainName = method[0];
8322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var functionName = method[1];
8332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (!(domainName in this._domainDispatchers)) {
8342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                console.error("Protocol Error: the message is for non-existing domain '" + domainName + "'");
8352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                return;
8362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            }
8372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var dispatcher = this._domainDispatchers[domainName];
8382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (!(functionName in dispatcher)) {
8392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                console.error("Protocol Error: Attempted to dispatch an unimplemented method '" + messageObject.method + "'");
840f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                return;
841f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            }
8422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (!this._eventArgs[messageObject.method]) {
8442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                console.error("Protocol Error: Attempted to dispatch an unspecified method '" + messageObject.method + "'");
845f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                return;
846f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            }
8472bde8e466a4451c7319e3a072d118917957d6554Steve Block
8482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var params = [];
8492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (messageObject.params) {
8502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                var paramNames = this._eventArgs[messageObject.method];
8512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                for (var i = 0; i < paramNames.length; ++i)
8522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                    params.push(messageObject.params[paramNames[i]]);
8532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            }
8542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            dispatcher[functionName].apply(dispatcher, params);
856f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
857f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    },
858f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
859f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    reportProtocolError: function(messageObject)
860f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    {
8612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var error = messageObject.error;
8622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        console.error(error.message + "(" + error.code + "): request with id = " + messageObject.id + " failed.");
8632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        for (var i = 0; i < error.data.length; ++i)
8642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            console.error("    " + error.data[i]);
86581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    },
86681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
86781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    runAfterPendingDispatches: function(script)
86881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
86981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!this._scripts)
87081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            this._scripts = [];
87181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
87281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (script)
87381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            this._scripts.push(script);
87481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
87581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!this._pendingResponsesCount) {
87681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            var scripts = this._scripts;
87781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            this._scripts = []
87881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            for (var id = 0; id < scripts.length; ++id)
87981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                 scripts[id].call(this);
88081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
881f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
882f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
883f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
884f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochInspectorBackend = new InspectorBackendStub();
885f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
886f486d19d62f1bc33246748b14b14a9dfa617b57fIain MerrickEOF
887f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return split("\n", $inspectorBackendStubJS);
888f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
889f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
890967717af5423377c967781471ee106e2bb4e11c8Ben Murdochsub generateHeader
891967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
892967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    my $className = shift;
89354cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    my $classDeclaration = shift;
894967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    my $types = shift;
895967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    my $constructor = shift;
896f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    my $constants = shift;
897967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    my $methods = shift;
898967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    my $footer = shift;
899967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
90081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $forwardHeaders = join("\n", sort(map("#include <" . typeTraits($_, "forwardHeader") . ">", grep(typeTraits($_, "forwardHeader"), keys %{$types}))));
90181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $forwardDeclarations = join("\n", sort(map("class " . typeTraits($_, "forward") . ";", grep(typeTraits($_, "forward"), keys %{$types}))));
902f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    my $constantDeclarations = join("\n", @{$constants});
9032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    my $methodsDeclarations = join("\n", @{$methods});
904967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
905967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    my $headerBody = << "EOF";
906967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
907967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
908967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch// found in the LICENSE file.
909967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#ifndef ${className}_h
910967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#define ${className}_h
911967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
912967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch${forwardHeaders}
913967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
914967717af5423377c967781471ee106e2bb4e11c8Ben Murdochnamespace $namespace {
915967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
916967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch$forwardDeclarations
917967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
91881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochtypedef String ErrorString;
91981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
92054cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Blockclass $classDeclaration {
921967717af5423377c967781471ee106e2bb4e11c8Ben Murdochpublic:
922967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch$constructor
923967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
924f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick$constantDeclarations
925967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch$methodsDeclarations
926967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
927967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch$footer
928967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch};
929967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
930967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch} // namespace $namespace
931967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif // !defined(${className}_h)
932967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
933967717af5423377c967781471ee106e2bb4e11c8Ben MurdochEOF
934967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return $headerBody;
935e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
936e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
937e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkesub generateSource
938e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
939967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    my $className = shift;
940967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    my $types = shift;
941f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    my $constants = shift;
942967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    my $methods = shift;
943967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
944e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    my @sourceContent = split("\r", $licenseTemplate);
945e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    push(@sourceContent, "\n#include \"config.h\"");
946967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    push(@sourceContent, "#include \"$className.h\"");
947a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    push(@sourceContent, "#include <wtf/text/StringConcatenate.h>");
9489f8811ec084be6ba9380c41abf6e2a080b6d9b91Russell Brenner    push(@sourceContent, "#include <wtf/text/CString.h>");
949e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    push(@sourceContent, "");
950e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    push(@sourceContent, "#if ENABLE(INSPECTOR)");
951e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    push(@sourceContent, "");
952e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
953e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    my %headers;
954967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    foreach my $type (keys %{$types}) {
95581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        $headers{"#include \"" . typeTraits($type, "header") . "\""} = 1 if !typeTraits($type, "header") eq  "";
956e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    }
957e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    push(@sourceContent, sort keys %headers);
958e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    push(@sourceContent, "");
959e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    push(@sourceContent, "namespace $namespace {");
960e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    push(@sourceContent, "");
9612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    push(@sourceContent, join("\n", @{$constants}));
962f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    push(@sourceContent, "");
963967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    push(@sourceContent, @{$methods});
964e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    push(@sourceContent, "");
965e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    push(@sourceContent, "} // namespace $namespace");
966e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    push(@sourceContent, "");
967e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    push(@sourceContent, "#endif // ENABLE(INSPECTOR)");
968e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    push(@sourceContent, "");
969e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    return @sourceContent;
970e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
971e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
97281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochsub typeTraits
97381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
97481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $type = shift;
97581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    my $trait = shift;
97681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return $typeTransform{$type}->{$trait};
97781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
97881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
9792bde8e466a4451c7319e3a072d118917957d6554Steve Blocksub generateBackendAgentFieldsAndConstructor
9802bde8e466a4451c7319e3a072d118917957d6554Steve Block{
9812bde8e466a4451c7319e3a072d118917957d6554Steve Block    my @arguments;
9822bde8e466a4451c7319e3a072d118917957d6554Steve Block    my @fieldInitializers;
9832bde8e466a4451c7319e3a072d118917957d6554Steve Block
9842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@arguments, "InspectorFrontendChannel* inspectorFrontendChannel");
9852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@fieldInitializers, "        : m_inspectorFrontendChannel(inspectorFrontendChannel)");
9862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@backendFooter, "    InspectorFrontendChannel* m_inspectorFrontendChannel;");
9872bde8e466a4451c7319e3a072d118917957d6554Steve Block
9882bde8e466a4451c7319e3a072d118917957d6554Steve Block    foreach my $domain (sort keys %backendDomains) {
9892bde8e466a4451c7319e3a072d118917957d6554Steve Block        # Add agent field declaration to the footer.
9902bde8e466a4451c7319e3a072d118917957d6554Steve Block        my $agentClassName = typeTraits($domain, "forward");
9912bde8e466a4451c7319e3a072d118917957d6554Steve Block        my $field = typeTraits($domain, "domainAccessor");
9922bde8e466a4451c7319e3a072d118917957d6554Steve Block        push(@backendFooter, "    ${agentClassName}* ${field};");
9932bde8e466a4451c7319e3a072d118917957d6554Steve Block
9942bde8e466a4451c7319e3a072d118917957d6554Steve Block        # Add agent parameter and initializer.
9952bde8e466a4451c7319e3a072d118917957d6554Steve Block        my $arg = substr($field, 2);
9962bde8e466a4451c7319e3a072d118917957d6554Steve Block        push(@fieldInitializers, "        , ${field}(${arg})");
9972bde8e466a4451c7319e3a072d118917957d6554Steve Block        push(@arguments, "${agentClassName}* ${arg}");
9982bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
9992bde8e466a4451c7319e3a072d118917957d6554Steve Block
10002bde8e466a4451c7319e3a072d118917957d6554Steve Block    my $argumentString = join(", ", @arguments);
10012bde8e466a4451c7319e3a072d118917957d6554Steve Block
10022bde8e466a4451c7319e3a072d118917957d6554Steve Block    my @backendHead;
10032bde8e466a4451c7319e3a072d118917957d6554Steve Block    push(@backendHead, "    ${backendClassName}(${argumentString})");
10042bde8e466a4451c7319e3a072d118917957d6554Steve Block    push(@backendHead, @fieldInitializers);
10052bde8e466a4451c7319e3a072d118917957d6554Steve Block    push(@backendHead, "    { }");
10062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@backendHead, "");
100754cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    push(@backendHead, "    void clearFrontend() { m_inspectorFrontendChannel = 0; }");
100854cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    push(@backendHead, "");
10092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@backendHead, "    enum CommonErrorCode {");
10102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@backendHead, "        ParseError = 0,");
10112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@backendHead, "        InvalidRequest,");
10122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@backendHead, "        MethodNotFound,");
10132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@backendHead, "        InvalidParams,");
10142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@backendHead, "        InternalError,");
10152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@backendHead, "        ServerError,");
10162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@backendHead, "        LastEntry,");
10172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@backendHead, "    };");
10182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@backendHead, "");
10192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@backendHead, "    void reportProtocolError(const long* const callId, CommonErrorCode, const String& errorText) const;");
10202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    push(@backendHead, "    void reportProtocolError(const long* const callId, CommonErrorCode, PassRefPtr<InspectorArray> data) const;");
10212bde8e466a4451c7319e3a072d118917957d6554Steve Block    push(@backendHead, "    void dispatch(const String& message);");
10222bde8e466a4451c7319e3a072d118917957d6554Steve Block    push(@backendHead, "    static bool getCommandName(const String& message, String* result);");
10232bde8e466a4451c7319e3a072d118917957d6554Steve Block    $backendConstructor = join("\n", @backendHead);
10242bde8e466a4451c7319e3a072d118917957d6554Steve Block}
10252bde8e466a4451c7319e3a072d118917957d6554Steve Block
1026e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkesub finish
1027e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
1028e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    my $object = shift;
1029e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
10302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    push(@backendMethodsImpl, generateBackendDispatcher());
10312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    push(@backendMethodsImpl, generateBackendReportProtocolError());
103281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    unshift(@frontendMethodsImpl, generateFrontendConstructorImpl(), "");
10332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1034967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    open(my $SOURCE, ">$outputDir/$frontendClassName.cpp") || die "Couldn't open file $outputDir/$frontendClassName.cpp";
1035f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    print $SOURCE join("\n", generateSource($frontendClassName, \%frontendTypes, \@frontendConstantDefinitions, \@frontendMethodsImpl));
1036e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    close($SOURCE);
1037e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    undef($SOURCE);
1038e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1039967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    open(my $HEADER, ">$outputHeadersDir/$frontendClassName.h") || die "Couldn't open file $outputHeadersDir/$frontendClassName.h";
104054cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    print $HEADER generateHeader($frontendClassName, $frontendClassName, \%frontendTypes, $frontendConstructor, \@frontendConstantDeclarations, \@frontendMethods, join("\n", @frontendFooter));
1041e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    close($HEADER);
1042e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    undef($HEADER);
1043967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
10442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    # Make dispatcher methods private on the backend.
10452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    push(@backendConstantDeclarations, "");
10462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    push(@backendConstantDeclarations, "private:");
10472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    foreach my $type (keys %backendTypes) {
104981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (typeTraits($type, "JSONType")) {
10502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            push(@backendMethodsImpl, generateArgumentGetters($type));
10512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
10522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
10532bde8e466a4451c7319e3a072d118917957d6554Steve Block    generateBackendAgentFieldsAndConstructor();
10542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    push(@backendMethodsImpl, generateBackendMessageParser());
10562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    push(@backendMethodsImpl, "");
10572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    push(@backendConstantDeclarations, "");
10592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10600617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    open($SOURCE, ">$outputDir/$backendClassName.cpp") || die "Couldn't open file $outputDir/$backendClassName.cpp";
1061f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    print $SOURCE join("\n", generateSource($backendClassName, \%backendTypes, \@backendConstantDefinitions, \@backendMethodsImpl));
10620617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    close($SOURCE);
10630617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    undef($SOURCE);
10640617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
10650617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    open($HEADER, ">$outputHeadersDir/$backendClassName.h") || die "Couldn't open file $outputHeadersDir/$backendClassName.h";
106654cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    print $HEADER join("\n", generateHeader($backendClassName, $backendClassDeclaration, \%backendTypes, $backendConstructor, \@backendConstantDeclarations, \@backendMethods, join("\n", @backendFooter)));
10670617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    close($HEADER);
10680617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    undef($HEADER);
1069f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
1070f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    open(my $JS_STUB, ">$outputDir/$backendJSStubName.js") || die "Couldn't open file $outputDir/$backendJSStubName.js";
10712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    print $JS_STUB join("\n", generateBackendStubJS());
1072f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    close($JS_STUB);
1073f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    undef($JS_STUB);
1074e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
1075e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1076e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke1;
1077