diff options
Diffstat (limited to 'Source/WebKit2/Scripts/webkit2/messages.py')
-rw-r--r-- | Source/WebKit2/Scripts/webkit2/messages.py | 631 |
1 files changed, 0 insertions, 631 deletions
diff --git a/Source/WebKit2/Scripts/webkit2/messages.py b/Source/WebKit2/Scripts/webkit2/messages.py deleted file mode 100644 index 6190eb0cf..000000000 --- a/Source/WebKit2/Scripts/webkit2/messages.py +++ /dev/null @@ -1,631 +0,0 @@ -# Copyright (C) 2010, 2011 Apple Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -import collections -import re -import sys -from webkit2 import parser - -WANTS_CONNECTION_ATTRIBUTE = 'WantsConnection' -LEGACY_RECEIVER_ATTRIBUTE = 'LegacyReceiver' -DELAYED_ATTRIBUTE = 'Delayed' -VARIADIC_ATTRIBUTE = 'Variadic' - -_license_header = """/* - * Copyright (C) 2010 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -""" - - -def messages_header_filename(receiver): - return '%sMessages.h' % receiver.name - - -def surround_in_condition(string, condition): - if not condition: - return string - return '#if %s\n%s#endif\n' % (condition, string) - - -def function_parameter_type(type): - # Don't use references for built-in types. - builtin_types = frozenset([ - 'bool', - 'float', - 'double', - 'uint8_t', - 'uint16_t', - 'uint32_t', - 'uint64_t', - 'int8_t', - 'int16_t', - 'int32_t', - 'int64_t', - ]) - - if type in builtin_types: - return type - - return 'const %s&' % type - - -def reply_parameter_type(type): - return '%s&' % type - - -def arguments_type_old(parameters, parameter_type_function): - arguments_type = 'IPC::Arguments%d' % len(parameters) - if len(parameters): - arguments_type = '%s<%s>' % (arguments_type, ', '.join(parameter_type_function(parameter.type) for parameter in parameters)) - return arguments_type - - -def arguments_type(message): - return 'std::tuple<%s>' % ', '.join(function_parameter_type(parameter.type) for parameter in message.parameters) - -def base_class(message): - return arguments_type(message.parameters, function_parameter_type) - - -def reply_type(message): - return arguments_type_old(message.reply_parameters, reply_parameter_type) - - -def decode_type(message): - parameters = message.parameters - - if message.has_attribute(VARIADIC_ATTRIBUTE): - parameters = parameters[:-1] - - return 'std::tuple<%s>' % ', '.join(parameter.type for parameter in parameters) - -def delayed_reply_type(message): - return arguments_type_old(message.reply_parameters, function_parameter_type) - - -def message_to_struct_declaration(message): - result = [] - function_parameters = [(function_parameter_type(x.type), x.name) for x in message.parameters] - result.append('class %s {\n' % message.name) - result.append('public:\n') - result.append(' typedef %s DecodeType;\n' % decode_type(message)) - result.append('\n') - result.append(' static IPC::StringReference receiverName() { return messageReceiverName(); }\n') - result.append(' static IPC::StringReference name() { return IPC::StringReference("%s"); }\n' % message.name) - result.append(' static const bool isSync = %s;\n' % ('false', 'true')[message.reply_parameters != None]) - result.append('\n') - if message.reply_parameters != None: - if message.has_attribute(DELAYED_ATTRIBUTE): - send_parameters = [(function_parameter_type(x.type), x.name) for x in message.reply_parameters] - result.append(' struct DelayedReply : public ThreadSafeRefCounted<DelayedReply> {\n') - result.append(' DelayedReply(PassRefPtr<IPC::Connection>, std::unique_ptr<IPC::MessageEncoder>);\n') - result.append(' ~DelayedReply();\n') - result.append('\n') - result.append(' bool send(%s);\n' % ', '.join([' '.join(x) for x in send_parameters])) - result.append('\n') - result.append(' private:\n') - result.append(' RefPtr<IPC::Connection> m_connection;\n') - result.append(' std::unique_ptr<IPC::MessageEncoder> m_encoder;\n') - result.append(' };\n\n') - - result.append(' typedef %s Reply;\n' % reply_type(message)) - - if len(function_parameters): - result.append(' %s%s(%s)' % (len(function_parameters) == 1 and 'explicit ' or '', message.name, ', '.join([' '.join(x) for x in function_parameters]))) - result.append('\n : m_arguments(%s)\n' % ', '.join([x[1] for x in function_parameters])) - result.append(' {\n') - result.append(' }\n\n') - result.append(' const %s arguments() const\n' % arguments_type(message)) - result.append(' {\n') - result.append(' return m_arguments;\n') - result.append(' }\n') - result.append('\n') - result.append('private:\n') - result.append(' %s m_arguments;\n' % arguments_type(message)) - result.append('};\n') - return surround_in_condition(''.join(result), message.condition) - - -def struct_or_class(namespace, type): - structs = frozenset([ - 'WebCore::Animation', - 'WebCore::EditorCommandsForKeyEvent', - 'WebCore::CompositionUnderline', - 'WebCore::Cookie', - 'WebCore::DragSession', - 'WebCore::FloatPoint3D', - 'WebCore::FileChooserSettings', - 'WebCore::GrammarDetail', - 'WebCore::IDBDatabaseMetadata', - 'WebCore::IDBGetResult', - 'WebCore::IDBIndexMetadata', - 'WebCore::IDBKeyData', - 'WebCore::IDBKeyRangeData', - 'WebCore::IDBObjectStoreMetadata', - 'WebCore::IdentityTransformOperation', - 'WebCore::KeypressCommand', - 'WebCore::Length', - 'WebCore::MatrixTransformOperation', - 'WebCore::Matrix3DTransformOperation', - 'WebCore::NotificationContents', - 'WebCore::PasteboardImage', - 'WebCore::PasteboardWebContent', - 'WebCore::PerspectiveTransformOperation', - 'WebCore::PluginInfo', - 'WebCore::PrintInfo', - 'WebCore::RotateTransformOperation', - 'WebCore::ScaleTransformOperation', - 'WebCore::SkewTransformOperation', - 'WebCore::TimingFunction', - 'WebCore::TransformationMatrix', - 'WebCore::TransformOperation', - 'WebCore::TransformOperations', - 'WebCore::TranslateTransformOperation', - 'WebCore::ViewportArguments', - 'WebCore::ViewportAttributes', - 'WebCore::WindowFeatures', - 'WebKit::AttributedString', - 'WebKit::ColorSpaceData', - 'WebKit::ContextMenuState', - 'WebKit::DatabaseProcessCreationParameters', - 'WebKit::DictionaryPopupInfo', - 'WebKit::DrawingAreaInfo', - 'WebKit::EditorState', - 'WebKit::InteractionInformationAtPosition', - 'WebKit::NavigationActionData', - 'WebKit::NetworkProcessCreationParameters', - 'WebKit::PlatformPopupMenuData', - 'WebKit::PluginCreationParameters', - 'WebKit::PluginProcessCreationParameters', - 'WebKit::PrintInfo', - 'WebKit::SecurityOriginData', - 'WebKit::StatisticsData', - 'WebKit::TextCheckerState', - 'WebKit::WebNavigationDataStore', - 'WebKit::WebPageCreationParameters', - 'WebKit::WebPreferencesStore', - 'WebKit::WebProcessCreationParameters', - 'WebKit::WindowGeometry', - ]) - - qualified_name = '%s::%s' % (namespace, type) - if qualified_name in structs: - return 'struct %s' % type - - return 'class %s' % type - -def forward_declarations_for_namespace(namespace, types): - result = [] - result.append('namespace %s {\n' % namespace) - result += [' %s;\n' % struct_or_class(namespace, x) for x in types] - result.append('}\n') - return ''.join(result) - - -def forward_declarations_and_headers(receiver): - types_by_namespace = collections.defaultdict(set) - - headers = set([ - '"Arguments.h"', - '"MessageEncoder.h"', - '"StringReference.h"', - ]) - - non_template_wtf_types = frozenset([ - 'String', - ]) - - for message in receiver.messages: - if message.reply_parameters != None and message.has_attribute(DELAYED_ATTRIBUTE): - headers.add('<wtf/ThreadSafeRefCounted.h>') - types_by_namespace['IPC'].update(['Connection']) - - for parameter in receiver.iterparameters(): - type = parameter.type - - if type.find('<') != -1: - # Don't forward declare class templates. - headers.update(headers_for_type(type)) - continue - - split = type.split('::') - - # Handle WTF types even if the WTF:: prefix is not given - if split[0] in non_template_wtf_types: - split.insert(0, 'WTF') - - if len(split) == 2: - namespace = split[0] - inner_type = split[1] - types_by_namespace[namespace].add(inner_type) - elif len(split) > 2: - # We probably have a nested struct, which means we can't forward declare it. - # Include its header instead. - headers.update(headers_for_type(type)) - - forward_declarations = '\n'.join([forward_declarations_for_namespace(namespace, types) for (namespace, types) in sorted(types_by_namespace.items())]) - headers = ['#include %s\n' % header for header in sorted(headers)] - - return (forward_declarations, headers) - -def generate_messages_header(file): - receiver = parser.parse(file) - header_guard = messages_header_filename(receiver).replace('.', '_') - - result = [] - - result.append(_license_header) - - result.append('#ifndef %s\n' % header_guard) - result.append('#define %s\n\n' % header_guard) - - if receiver.condition: - result.append('#if %s\n\n' % receiver.condition) - - forward_declarations, headers = forward_declarations_and_headers(receiver) - - result += headers - result.append('\n') - - result.append(forward_declarations) - result.append('\n') - - result.append('namespace Messages {\nnamespace %s {\n' % receiver.name) - result.append('\n') - result.append('static inline IPC::StringReference messageReceiverName()\n') - result.append('{\n') - result.append(' return IPC::StringReference("%s");\n' % receiver.name) - result.append('}\n') - result.append('\n') - result.append('\n'.join([message_to_struct_declaration(x) for x in receiver.messages])) - result.append('\n') - result.append('} // namespace %s\n} // namespace Messages\n' % receiver.name) - - if receiver.condition: - result.append('\n#endif // %s\n' % receiver.condition) - - result.append('\n#endif // %s\n' % header_guard) - - return ''.join(result) - - -def handler_function(receiver, message): - if message.name.find('URL') == 0: - return '%s::%s' % (receiver.name, 'url' + message.name[3:]) - return '%s::%s' % (receiver.name, message.name[0].lower() + message.name[1:]) - - -def async_message_statement(receiver, message): - dispatch_function_args = ['decoder', 'this', '&%s' % handler_function(receiver, message)] - - dispatch_function = 'handleMessage' - if message.has_attribute(VARIADIC_ATTRIBUTE): - dispatch_function += 'Variadic' - - if message.has_attribute(WANTS_CONNECTION_ATTRIBUTE): - dispatch_function_args.insert(0, 'connection') - - result = [] - result.append(' if (decoder.messageName() == Messages::%s::%s::name()) {\n' % (receiver.name, message.name)) - result.append(' IPC::%s<Messages::%s::%s>(%s);\n' % (dispatch_function, receiver.name, message.name, ', '.join(dispatch_function_args))) - result.append(' return;\n') - result.append(' }\n') - return surround_in_condition(''.join(result), message.condition) - - -def sync_message_statement(receiver, message): - dispatch_function = 'handleMessage' - if message.has_attribute(DELAYED_ATTRIBUTE): - dispatch_function += 'Delayed' - if message.has_attribute(VARIADIC_ATTRIBUTE): - dispatch_function += 'Variadic' - - wants_connection = message.has_attribute(DELAYED_ATTRIBUTE) or message.has_attribute(WANTS_CONNECTION_ATTRIBUTE) - - result = [] - result.append(' if (decoder.messageName() == Messages::%s::%s::name()) {\n' % (receiver.name, message.name)) - result.append(' IPC::%s<Messages::%s::%s>(%sdecoder, %sreplyEncoder, this, &%s);\n' % (dispatch_function, receiver.name, message.name, 'connection, ' if wants_connection else '', '' if message.has_attribute(DELAYED_ATTRIBUTE) else '*', handler_function(receiver, message))) - result.append(' return;\n') - result.append(' }\n') - return surround_in_condition(''.join(result), message.condition) - - -def class_template_headers(template_string): - template_string = template_string.strip() - - class_template_types = { - 'Vector': {'headers': ['<wtf/Vector.h>'], 'argument_coder_headers': ['"ArgumentCoders.h"']}, - 'HashMap': {'headers': ['<wtf/HashMap.h>'], 'argument_coder_headers': ['"ArgumentCoders.h"']}, - 'std::pair': {'headers': ['<utility>'], 'argument_coder_headers': ['"ArgumentCoders.h"']}, - } - - match = re.match('(?P<template_name>.+?)<(?P<parameter_string>.+)>', template_string) - if not match: - return {'header_infos':[], 'types':[template_string]} - - template_name = match.groupdict()['template_name'] - if template_name not in class_template_types: - sys.stderr.write("Error: no class template type is defined for '%s'\n" % (template_string)) - sys.exit(1) - - header_infos = [class_template_types[template_name]] - types = [] - - for parameter in parser.split_parameters_string(match.groupdict()['parameter_string']): - parameter_header_infos_and_types = class_template_headers(parameter) - - header_infos += parameter_header_infos_and_types['header_infos']; - types += parameter_header_infos_and_types['types'] - - return {'header_infos':header_infos, 'types':types} - - -def argument_coder_headers_for_type(type): - header_infos_and_types = class_template_headers(type) - - special_cases = { - 'String': '"ArgumentCoders.h"', - 'WebKit::InjectedBundleUserMessageEncoder': '"InjectedBundleUserMessageCoders.h"', - 'WebKit::WebContextUserMessageEncoder': '"WebContextUserMessageCoders.h"', - } - - headers = [] - for header_info in header_infos_and_types['header_infos']: - headers += header_info['argument_coder_headers'] - - for type in header_infos_and_types['types']: - if type in special_cases: - headers.append(special_cases[type]) - continue - - split = type.split('::') - if len(split) < 2: - continue - if split[0] == 'WebCore': - headers.append('"WebCoreArgumentCoders.h"') - - return headers - -def headers_for_type(type): - header_infos_and_types = class_template_headers(type) - - special_cases = { - 'String': ['<wtf/text/WTFString.h>'], - 'WebCore::CompositionUnderline': ['<WebCore/Editor.h>'], - 'WebCore::GrammarDetail': ['<WebCore/TextCheckerClient.h>'], - 'WebCore::GraphicsLayerAnimations': ['<WebCore/GraphicsLayerAnimation.h>'], - 'WebCore::KeyframeValueList': ['<WebCore/GraphicsLayer.h>'], - 'WebCore::KeypressCommand': ['<WebCore/KeyboardEvent.h>'], - 'WebCore::FileChooserSettings': ['<WebCore/FileChooser.h>'], - 'WebCore::PluginInfo': ['<WebCore/PluginData.h>'], - 'WebCore::PasteboardImage': ['<WebCore/Pasteboard.h>'], - 'WebCore::PasteboardWebContent': ['<WebCore/Pasteboard.h>'], - 'WebCore::TextCheckingRequestData': ['<WebCore/TextChecking.h>'], - 'WebCore::TextCheckingResult': ['<WebCore/TextCheckerClient.h>'], - 'WebCore::ViewportAttributes': ['<WebCore/ViewportArguments.h>'], - 'WebKit::InjectedBundleUserMessageEncoder': [], - 'WebKit::WebContextUserMessageEncoder': [], - 'WebKit::WebGestureEvent': ['"WebEvent.h"'], - 'WebKit::WebKeyboardEvent': ['"WebEvent.h"'], - 'WebKit::WebMouseEvent': ['"WebEvent.h"'], - 'WebKit::WebTouchEvent': ['"WebEvent.h"'], - 'WebKit::WebWheelEvent': ['"WebEvent.h"'], - } - - headers = [] - for header_info in header_infos_and_types['header_infos']: - headers += header_info['headers'] - - for type in header_infos_and_types['types']: - if type in special_cases: - headers += special_cases[type] - continue - - # We assume that we must include a header for a type iff it has a scope - # resolution operator (::). - split = type.split('::') - if len(split) < 2: - continue - - if split[0] == 'WebKit' or split[0] == 'IPC': - headers.append('"%s.h"' % split[1]) - else: - headers.append('<%s/%s.h>' % tuple(split)) - - return headers - -def generate_message_handler(file): - receiver = parser.parse(file) - header_conditions = { - '"%s"' % messages_header_filename(receiver): [None], - '"HandleMessage.h"': [None], - '"MessageDecoder.h"': [None], - } - - type_conditions = {} - for parameter in receiver.iterparameters(): - if not parameter.type in type_conditions: - type_conditions[parameter.type] = [] - - if not parameter.condition in type_conditions[parameter.type]: - type_conditions[parameter.type].append(parameter.condition) - - for parameter in receiver.iterparameters(): - type = parameter.type - conditions = type_conditions[type] - - argument_encoder_headers = argument_coder_headers_for_type(type) - if argument_encoder_headers: - for header in argument_encoder_headers: - if header not in header_conditions: - header_conditions[header] = [] - header_conditions[header].extend(conditions) - - type_headers = headers_for_type(type) - for header in type_headers: - if header not in header_conditions: - header_conditions[header] = [] - header_conditions[header].extend(conditions) - - for message in receiver.messages: - if message.reply_parameters is not None: - for reply_parameter in message.reply_parameters: - type = reply_parameter.type - argument_encoder_headers = argument_coder_headers_for_type(type) - if argument_encoder_headers: - for header in argument_encoder_headers: - if header not in header_conditions: - header_conditions[header] = [] - header_conditions[header].append(message.condition) - - type_headers = headers_for_type(type) - for header in type_headers: - if header not in header_conditions: - header_conditions[header] = [] - header_conditions[header].append(message.condition) - - - result = [] - - result.append(_license_header) - result.append('#include "config.h"\n') - result.append('\n') - - if receiver.condition: - result.append('#if %s\n\n' % receiver.condition) - - result.append('#include "%s.h"\n\n' % receiver.name) - for header in sorted(header_conditions): - if header_conditions[header] and not None in header_conditions[header]: - result.append('#if %s\n' % ' || '.join(set(header_conditions[header]))) - result += ['#include %s\n' % header] - result.append('#endif\n') - else: - result += ['#include %s\n' % header] - result.append('\n') - - sync_delayed_messages = [] - for message in receiver.messages: - if message.reply_parameters != None and message.has_attribute(DELAYED_ATTRIBUTE): - sync_delayed_messages.append(message) - - if sync_delayed_messages: - result.append('namespace Messages {\n\nnamespace %s {\n\n' % receiver.name) - - for message in sync_delayed_messages: - send_parameters = [(function_parameter_type(x.type), x.name) for x in message.reply_parameters] - - if message.condition: - result.append('#if %s\n\n' % message.condition) - - result.append('%s::DelayedReply::DelayedReply(PassRefPtr<IPC::Connection> connection, std::unique_ptr<IPC::MessageEncoder> encoder)\n' % message.name) - result.append(' : m_connection(connection)\n') - result.append(' , m_encoder(std::move(encoder))\n') - result.append('{\n') - result.append('}\n') - result.append('\n') - result.append('%s::DelayedReply::~DelayedReply()\n' % message.name) - result.append('{\n') - result.append(' ASSERT(!m_connection);\n') - result.append('}\n') - result.append('\n') - result.append('bool %s::DelayedReply::send(%s)\n' % (message.name, ', '.join([' '.join(x) for x in send_parameters]))) - result.append('{\n') - result.append(' ASSERT(m_encoder);\n') - result += [' *m_encoder << %s;\n' % x.name for x in message.reply_parameters] - result.append(' bool result = m_connection->sendSyncReply(std::move(m_encoder));\n') - result.append(' m_connection = nullptr;\n') - result.append(' return result;\n') - result.append('}\n') - result.append('\n') - - if message.condition: - result.append('#endif\n\n') - - result.append('} // namespace %s\n\n} // namespace Messages\n\n' % receiver.name) - - result.append('namespace WebKit {\n\n') - - async_messages = [] - sync_messages = [] - for message in receiver.messages: - if message.reply_parameters is not None: - sync_messages.append(message) - else: - async_messages.append(message) - - if async_messages: - if receiver.has_attribute(LEGACY_RECEIVER_ATTRIBUTE): - result.append('void %s::didReceive%sMessage(IPC::Connection*, IPC::MessageDecoder& decoder)\n' % (receiver.name, receiver.name)) - else: - result.append('void %s::didReceiveMessage(IPC::Connection* connection, IPC::MessageDecoder& decoder)\n' % (receiver.name)) - - result.append('{\n') - result += [async_message_statement(receiver, message) for message in async_messages] - if (receiver.superclass): - result.append(' %s::didReceiveMessage(connection, decoder);\n' % (receiver.superclass)) - else: - if not receiver.has_attribute(LEGACY_RECEIVER_ATTRIBUTE): - result.append(' UNUSED_PARAM(connection);\n') - result.append(' ASSERT_NOT_REACHED();\n') - result.append('}\n') - - if sync_messages: - result.append('\n') - if receiver.has_attribute(LEGACY_RECEIVER_ATTRIBUTE): - result.append('void %s::didReceiveSync%sMessage(IPC::Connection*%s, IPC::MessageDecoder& decoder, std::unique_ptr<IPC::MessageEncoder>& replyEncoder)\n' % (receiver.name, receiver.name, ' connection' if sync_delayed_messages else '')) - else: - result.append('void %s::didReceiveSyncMessage(IPC::Connection* connection, IPC::MessageDecoder& decoder, std::unique_ptr<IPC::MessageEncoder>& replyEncoder)\n' % (receiver.name)) - result.append('{\n') - result += [sync_message_statement(receiver, message) for message in sync_messages] - if not receiver.has_attribute(LEGACY_RECEIVER_ATTRIBUTE): - result.append(' UNUSED_PARAM(connection);\n') - result.append(' ASSERT_NOT_REACHED();\n') - result.append('}\n') - - result.append('\n} // namespace WebKit\n') - - if receiver.condition: - result.append('\n#endif // %s\n' % receiver.condition) - - return ''.join(result) |