| Index: third_party/inspector_protocol/templates/TypeBuilder_cpp.template | 
| diff --git a/third_party/inspector_protocol/templates/TypeBuilder_cpp.template b/third_party/inspector_protocol/templates/TypeBuilder_cpp.template | 
| index f90dbd1064a8e1a8ce055b93d3b39a42367b21a6..14b55b979485f10d3d851f64ca4710cb70c671ec 100644 | 
| --- a/third_party/inspector_protocol/templates/TypeBuilder_cpp.template | 
| +++ b/third_party/inspector_protocol/templates/TypeBuilder_cpp.template | 
| @@ -26,7 +26,7 @@ namespace {{type.id}}Enum { | 
| const char* {{ literal | dash_to_camelcase}} = "{{literal}}"; | 
| {% endfor %} | 
| } // namespace {{type.id}}Enum | 
| -      {% if type.exported %} | 
| +      {% if protocol.is_exported(domain.domain, type.id) %} | 
|  | 
| namespace API { | 
| namespace {{type.id}}Enum { | 
| @@ -62,11 +62,11 @@ std::unique_ptr<{{type.id}}> {{type.id}}::fromValue(protocol::Value* value, Erro | 
| {% if property.optional %} | 
| if ({{property.name}}Value) { | 
| errors->setName("{{property.name}}"); | 
| -        result->m_{{property.name}} = ValueConversions<{{resolve_type(property).raw_type}}>::fromValue({{property.name}}Value, errors); | 
| +        result->m_{{property.name}} = ValueConversions<{{protocol.resolve_type(property).raw_type}}>::fromValue({{property.name}}Value, errors); | 
| } | 
| {% else %} | 
| errors->setName("{{property.name}}"); | 
| -    result->m_{{property.name}} = ValueConversions<{{resolve_type(property).raw_type}}>::fromValue({{property.name}}Value, errors); | 
| +    result->m_{{property.name}} = ValueConversions<{{protocol.resolve_type(property).raw_type}}>::fromValue({{property.name}}Value, errors); | 
| {% endif %} | 
| {% endfor %} | 
| errors->pop(); | 
| @@ -79,11 +79,13 @@ std::unique_ptr<protocol::DictionaryValue> {{type.id}}::toValue() const | 
| { | 
| std::unique_ptr<protocol::DictionaryValue> result = DictionaryValue::create(); | 
| {% for property in type.properties %} | 
| +      {% set property_type = protocol.resolve_type(property) %} | 
| +      {% set property_field = "m_" + property.name %} | 
| {% if property.optional %} | 
| -    if (m_{{property.name}}.isJust()) | 
| -        result->setValue("{{property.name}}", ValueConversions<{{resolve_type(property).raw_type}}>::toValue(m_{{property.name}}.fromJust())); | 
| +    if ({{property_field}}.isJust()) | 
| +        result->setValue("{{property.name}}", ValueConversions<{{property_type.raw_type}}>::toValue({{property_field}}.fromJust())); | 
| {% else %} | 
| -    result->setValue("{{property.name}}", ValueConversions<{{resolve_type(property).raw_type}}>::toValue({{resolve_type(property).to_raw_type % ("m_" + property.name)}})); | 
| +    result->setValue("{{property.name}}", ValueConversions<{{property_type.raw_type}}>::toValue({{property_type.to_raw_type % property_field}})); | 
| {% endif %} | 
| {% endfor %} | 
| return result; | 
| @@ -94,7 +96,7 @@ std::unique_ptr<{{type.id}}> {{type.id}}::clone() const | 
| ErrorSupport errors; | 
| return fromValue(toValue().get(), &errors); | 
| } | 
| -    {% if type.exported %} | 
| +    {% if protocol.is_exported(domain.domain, type.id) %} | 
|  | 
| {{config.exported.string_out}} {{type.id}}::toJSONString() const | 
| { | 
| @@ -127,7 +129,7 @@ const char* {{ literal | to_title_case}} = "{{literal}}"; | 
| {% endfor %} | 
| } // namespace {{param.name | to_title_case}}Enum | 
| } // namespace {{command.name | to_title_case }} | 
| -        {% if param.exported %} | 
| +        {% if protocol.is_exported(domain.domain, command.name + "." + param.name) %} | 
|  | 
| namespace API { | 
| namespace {{command.name | to_title_case}} { | 
| @@ -145,14 +147,14 @@ const char* {{ literal | to_title_case}} = "{{literal}}"; | 
|  | 
| // ------------- Frontend notifications. | 
| {% for event in domain.events %} | 
| -    {% if not generate_event(domain.domain, event.name) %}{% continue %}{% endif %} | 
| +    {% if not protocol.generate_event(domain.domain, event.name) %}{% continue %}{% endif %} | 
|  | 
| void Frontend::{{event.name | to_method_case}}( | 
| {%- for parameter in event.parameters %} | 
| {% if "optional" in parameter -%} | 
| -        Maybe<{{resolve_type(parameter).raw_type}}> | 
| +        Maybe<{{protocol.resolve_type(parameter).raw_type}}> | 
| {%- else -%} | 
| -        {{resolve_type(parameter).pass_type}} | 
| +        {{protocol.resolve_type(parameter).pass_type}} | 
| {%- endif %} {{parameter.name}}{%- if not loop.last -%}, {% endif -%} | 
| {% endfor -%}) | 
| { | 
| @@ -162,7 +164,7 @@ void Frontend::{{event.name | to_method_case}}( | 
| std::unique_ptr<{{event.name | to_title_case}}Notification> messageData = {{event.name | to_title_case}}Notification::{{"create" | to_method_case}}() | 
| {% for parameter in event.parameters %} | 
| {% if not "optional" in parameter %} | 
| -        .{{"set" | to_method_case}}{{parameter.name | to_title_case}}({{resolve_type(parameter).to_pass_type % parameter.name}}) | 
| +        .{{"set" | to_method_case}}{{parameter.name | to_title_case}}({{protocol.resolve_type(parameter).to_pass_type % parameter.name}}) | 
| {% endif %} | 
| {% endfor %} | 
| .{{ "build" | to_method_case }}(); | 
| @@ -199,7 +201,7 @@ public: | 
| , m_fallThroughForNotFound(fallThroughForNotFound) { | 
| {% for command in domain.commands %} | 
| {% if "redirect" in command %}{% continue %}{% endif %} | 
| -    {% if not generate_command(domain.domain, command.name) %}{% continue %}{% endif %} | 
| +    {% if not protocol.generate_command(domain.domain, command.name) %}{% continue %}{% endif %} | 
| m_dispatchMap["{{domain.domain}}.{{command.name}}"] = &DispatcherImpl::{{command.name}}; | 
| {% endfor %} | 
| } | 
| @@ -213,7 +215,7 @@ protected: | 
|  | 
| {% for command in domain.commands %} | 
| {% if "redirect" in command %}{% continue %}{% endif %} | 
| -    {% if not generate_command(domain.domain, command.name) %}{% continue %}{% endif %} | 
| +    {% if not protocol.generate_command(domain.domain, command.name) %}{% continue %}{% endif %} | 
| DispatchResponse::Status {{command.name}}(int callId, std::unique_ptr<DictionaryValue> requestMessageObject, ErrorSupport*); | 
| {% endfor %} | 
|  | 
| @@ -236,21 +238,22 @@ DispatchResponse::Status DispatcherImpl::dispatch(int callId, const String& meth | 
| } | 
|  | 
| {% for command in domain.commands %} | 
| +    {% set command_name_title = command.name | to_title_case %} | 
| {% if "redirect" in command %}{% continue %}{% endif %} | 
| -    {% if not generate_command(domain.domain, command.name) %}{% continue %}{% endif %} | 
| -    {% if is_async_command(domain.domain, command.name) %} | 
| +    {% if not protocol.generate_command(domain.domain, command.name) %}{% continue %}{% endif %} | 
| +    {% if protocol.is_async_command(domain.domain, command.name) %} | 
|  | 
| -class {{command.name | to_title_case}}CallbackImpl : public Backend::{{command.name | to_title_case}}Callback, public DispatcherBase::Callback { | 
| +class {{command_name_title}}CallbackImpl : public Backend::{{command_name_title}}Callback, public DispatcherBase::Callback { | 
| public: | 
| -    {{command.name | to_title_case}}CallbackImpl(std::unique_ptr<DispatcherBase::WeakPtr> backendImpl, int callId, int callbackId) | 
| +    {{command_name_title}}CallbackImpl(std::unique_ptr<DispatcherBase::WeakPtr> backendImpl, int callId, int callbackId) | 
| : DispatcherBase::Callback(std::move(backendImpl), callId, callbackId) { } | 
|  | 
| void sendSuccess( | 
| {%- for parameter in command.returns -%} | 
| {%- if "optional" in parameter -%} | 
| -        Maybe<{{resolve_type(parameter).raw_type}}> {{parameter.name}} | 
| +        Maybe<{{protocol.resolve_type(parameter).raw_type}}> {{parameter.name}} | 
| {%- else -%} | 
| -        {{resolve_type(parameter).pass_type}} {{parameter.name}} | 
| +        {{protocol.resolve_type(parameter).pass_type}} {{parameter.name}} | 
| {%- endif -%} | 
| {%- if not loop.last -%}, {% endif -%} | 
| {%- endfor -%}) override | 
| @@ -259,9 +262,9 @@ public: | 
| {% for parameter in command.returns %} | 
| {% if "optional" in parameter %} | 
| if ({{parameter.name}}.isJust()) | 
| -            resultObject->setValue("{{parameter.name}}", ValueConversions<{{resolve_type(parameter).raw_type}}>::toValue({{parameter.name}}.fromJust())); | 
| +            resultObject->setValue("{{parameter.name}}", ValueConversions<{{protocol.resolve_type(parameter).raw_type}}>::toValue({{parameter.name}}.fromJust())); | 
| {% else %} | 
| -        resultObject->setValue("{{parameter.name}}", ValueConversions<{{resolve_type(parameter).raw_type}}>::toValue({{resolve_type(parameter).to_raw_type % parameter.name}})); | 
| +        resultObject->setValue("{{parameter.name}}", ValueConversions<{{protocol.resolve_type(parameter).raw_type}}>::toValue({{protocol.resolve_type(parameter).to_raw_type % parameter.name}})); | 
| {% endif %} | 
| {% endfor %} | 
| sendIfActive(std::move(resultObject), DispatchResponse::OK()); | 
| @@ -286,17 +289,18 @@ DispatchResponse::Status DispatcherImpl::{{command.name}}(int callId, std::uniqu | 
| // Prepare input parameters. | 
| protocol::DictionaryValue* object = DictionaryValue::cast(requestMessageObject->get("params")); | 
| errors->push(); | 
| -      {% for property in command.parameters %} | 
| -    protocol::Value* {{property.name}}Value = object ? object->get("{{property.name}}") : nullptr; | 
| -        {% if property.optional %} | 
| -    Maybe<{{resolve_type(property).raw_type}}> in_{{property.name}}; | 
| -    if ({{property.name}}Value) { | 
| -        errors->setName("{{property.name}}"); | 
| -        in_{{property.name}} = ValueConversions<{{resolve_type(property).raw_type}}>::fromValue({{property.name}}Value, errors); | 
| +      {% for parameter in command.parameters %} | 
| +        {% set parameter_type = protocol.resolve_type(parameter) %} | 
| +    protocol::Value* {{parameter.name}}Value = object ? object->get("{{parameter.name}}") : nullptr; | 
| +        {% if parameter.optional %} | 
| +    Maybe<{{parameter_type.raw_type}}> in_{{parameter.name}}; | 
| +    if ({{parameter.name}}Value) { | 
| +        errors->setName("{{parameter.name}}"); | 
| +        in_{{parameter.name}} = ValueConversions<{{parameter_type.raw_type}}>::fromValue({{parameter.name}}Value, errors); | 
| } | 
| {% else %} | 
| -    errors->setName("{{property.name}}"); | 
| -    {{resolve_type(property).type}} in_{{property.name}} = ValueConversions<{{resolve_type(property).raw_type}}>::fromValue({{property.name}}Value, errors); | 
| +    errors->setName("{{parameter.name}}"); | 
| +    {{parameter_type.type}} in_{{parameter.name}} = ValueConversions<{{parameter_type.raw_type}}>::fromValue({{parameter.name}}Value, errors); | 
| {% endif %} | 
| {% endfor %} | 
| errors->pop(); | 
| @@ -305,32 +309,32 @@ DispatchResponse::Status DispatcherImpl::{{command.name}}(int callId, std::uniqu | 
| return DispatchResponse::kError; | 
| } | 
| {% endif %} | 
| -    {% if "returns" in command and not is_async_command(domain.domain, command.name) %} | 
| +    {% if "returns" in command and not protocol.is_async_command(domain.domain, command.name) %} | 
| // Declare output parameters. | 
| -      {% for property in command.returns %} | 
| -        {% if "optional" in property %} | 
| -    Maybe<{{resolve_type(property).raw_type}}> out_{{property.name}}; | 
| +      {% for parameter in command.returns %} | 
| +        {% if "optional" in parameter %} | 
| +    Maybe<{{protocol.resolve_type(parameter).raw_type}}> out_{{parameter.name}}; | 
| {% else %} | 
| -    {{resolve_type(property).type}} out_{{property.name}}; | 
| +    {{protocol.resolve_type(parameter).type}} out_{{parameter.name}}; | 
| {% endif %} | 
| {% endfor %} | 
| {% endif %} | 
|  | 
| -    {% if not is_async_command(domain.domain, command.name) %} | 
| +    {% if not protocol.is_async_command(domain.domain, command.name) %} | 
| std::unique_ptr<DispatcherBase::WeakPtr> weak = weakPtr(); | 
| DispatchResponse response = m_backend->{{command.name | to_method_case}}( | 
| -      {%- for property in command.parameters -%} | 
| +      {%- for parameter in command.parameters -%} | 
| {%- if not loop.first -%}, {% endif -%} | 
| -        {%- if "optional" in property -%} | 
| -        std::move(in_{{property.name}}) | 
| +        {%- if "optional" in parameter -%} | 
| +        std::move(in_{{parameter.name}}) | 
| {%- else -%} | 
| -        {{resolve_type(property).to_pass_type % ("in_" + property.name)}} | 
| +        {{protocol.resolve_type(parameter).to_pass_type % ("in_" + parameter.name)}} | 
| {%- endif -%} | 
| {%- endfor %} | 
| {%- if "returns" in command %} | 
| -        {%- for property in command.returns -%} | 
| +        {%- for parameter in command.returns -%} | 
| {%- if not loop.first or command.parameters -%}, {% endif -%} | 
| -          &out_{{property.name}} | 
| +          &out_{{parameter.name}} | 
| {%- endfor %} | 
| {% endif %}); | 
| {% if "returns" in command %} | 
| @@ -341,9 +345,9 @@ DispatchResponse::Status DispatcherImpl::{{command.name}}(int callId, std::uniqu | 
| {% for parameter in command.returns %} | 
| {% if "optional" in parameter %} | 
| if (out_{{parameter.name}}.isJust()) | 
| -            result->setValue("{{parameter.name}}", ValueConversions<{{resolve_type(parameter).raw_type}}>::toValue(out_{{parameter.name}}.fromJust())); | 
| +            result->setValue("{{parameter.name}}", ValueConversions<{{protocol.resolve_type(parameter).raw_type}}>::toValue(out_{{parameter.name}}.fromJust())); | 
| {% else %} | 
| -        result->setValue("{{parameter.name}}", ValueConversions<{{resolve_type(parameter).raw_type}}>::toValue({{resolve_type(parameter).to_raw_type % ("out_" + parameter.name)}})); | 
| +        result->setValue("{{parameter.name}}", ValueConversions<{{protocol.resolve_type(parameter).raw_type}}>::toValue({{protocol.resolve_type(parameter).to_raw_type % ("out_" + parameter.name)}})); | 
| {% endif %} | 
| {% endfor %} | 
| } | 
| @@ -356,14 +360,14 @@ DispatchResponse::Status DispatcherImpl::{{command.name}}(int callId, std::uniqu | 
| return response.status(); | 
| {% else %} | 
| std::unique_ptr<DispatcherBase::WeakPtr> weak = weakPtr(); | 
| -    std::unique_ptr<{{command.name | to_title_case}}CallbackImpl> callback(new {{command.name | to_title_case}}CallbackImpl(weakPtr(), callId, nextCallbackId())); | 
| +    std::unique_ptr<{{command_name_title}}CallbackImpl> callback(new {{command.name | to_title_case}}CallbackImpl(weakPtr(), callId, nextCallbackId())); | 
| m_backend->{{command.name | to_method_case}}( | 
| {%- for property in command.parameters -%} | 
| {%- if not loop.first -%}, {% endif -%} | 
| {%- if "optional" in property -%} | 
| std::move(in_{{property.name}}) | 
| {%- else -%} | 
| -        {{resolve_type(property).to_pass_type % ("in_" + property.name)}} | 
| +        {{protocol.resolve_type(property).to_pass_type % ("in_" + property.name)}} | 
| {%- endif -%} | 
| {%- endfor -%} | 
| {%- if command.parameters -%}, {% endif -%} | 
|  |