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