diff options
author | Allan Sandfeld Jensen <allan.jensen@digia.com> | 2013-09-13 12:51:20 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-19 20:50:05 +0200 |
commit | d441d6f39bb846989d95bcf5caf387b42414718d (patch) | |
tree | e367e64a75991c554930278175d403c072de6bb8 /Source/WebKit2/Scripts/webkit2/messages.py | |
parent | 0060b2994c07842f4c59de64b5e3e430525c4b90 (diff) | |
download | qtwebkit-d441d6f39bb846989d95bcf5caf387b42414718d.tar.gz |
Import Qt5x2 branch of QtWebkit for Qt 5.2
Importing a new snapshot of webkit.
Change-Id: I2d01ad12cdc8af8cb015387641120a9d7ea5f10c
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@digia.com>
Diffstat (limited to 'Source/WebKit2/Scripts/webkit2/messages.py')
-rw-r--r-- | Source/WebKit2/Scripts/webkit2/messages.py | 171 |
1 files changed, 90 insertions, 81 deletions
diff --git a/Source/WebKit2/Scripts/webkit2/messages.py b/Source/WebKit2/Scripts/webkit2/messages.py index 0c9b94116..d062a1741 100644 --- a/Source/WebKit2/Scripts/webkit2/messages.py +++ b/Source/WebKit2/Scripts/webkit2/messages.py @@ -24,8 +24,9 @@ import collections import re from webkit2 import parser +WANTS_CONNECTION_ATTRIBUTE = 'WantsConnection' +LEGACY_RECEIVER_ATTRIBUTE = 'LegacyReceiver' DELAYED_ATTRIBUTE = 'Delayed' -DISPATCH_ON_CONNECTION_QUEUE_ATTRIBUTE = 'DispatchOnConnectionQueue' VARIADIC_ATTRIBUTE = 'Variadic' _license_header = """/* @@ -65,13 +66,6 @@ def surround_in_condition(string, condition): return '#if %s\n%s#endif\n' % (condition, string) -def messages_to_kind_enum(messages): - result = [] - result.append('enum Kind {\n') - result += [surround_in_condition(' %s,\n' % message.id(), message.condition) for message in messages] - result.append('};\n') - return ''.join(result) - def function_parameter_type(type): # Don't use references for built-in types. builtin_types = frozenset([ @@ -128,7 +122,6 @@ def message_to_struct_declaration(message): function_parameters = [(function_parameter_type(x.type), x.name) for x in message.parameters] result.append('struct %s : %s' % (message.name, base_class(message))) result.append(' {\n') - result.append(' static const Kind messageID = %s;\n' % message.id()) result.append(' static CoreIPC::StringReference receiverName() { return messageReceiverName(); }\n') result.append(' static CoreIPC::StringReference name() { return CoreIPC::StringReference("%s"); }\n' % message.name) result.append(' static const bool isSync = %s;\n' % ('false', 'true')[message.reply_parameters != None]) @@ -195,6 +188,7 @@ def struct_or_class(namespace, type): 'WebKit::DrawingAreaInfo', 'WebKit::EditorState', 'WebKit::NetworkProcessCreationParameters', + 'WebKit::OfflineStorageProcessCreationParameters', 'WebKit::PlatformPopupMenuData', 'WebKit::PluginCreationParameters', 'WebKit::PluginProcessCreationParameters', @@ -230,7 +224,6 @@ def forward_declarations_and_headers(receiver): headers = set([ '"Arguments.h"', '"MessageEncoder.h"', - '"MessageID.h"', '"StringReference.h"', ]) @@ -292,19 +285,10 @@ def generate_messages_header(file): result.append(' return CoreIPC::StringReference("%s");\n' % receiver.name) result.append('}\n') result.append('\n') - - result.append(messages_to_kind_enum(receiver.messages)) - 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) - result.append('\nnamespace CoreIPC {\n\n') - result.append('template<> struct MessageKindTraits<Messages::%s::Kind> {\n' % receiver.name) - result.append(' static const MessageClass messageClass = MessageClass%s;\n' % receiver.name) - result.append('};\n') - result.append('\n} // namespace CoreIPC\n') - if receiver.condition: result.append('\n#endif // %s\n' % receiver.condition) @@ -321,18 +305,17 @@ def handler_function(receiver, message): 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(DISPATCH_ON_CONNECTION_QUEUE_ATTRIBUTE): - dispatch_function += 'OnConnectionQueue' + + 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(' CoreIPC::%s<Messages::%s::%s>(%s);\n' % (dispatch_function, receiver.name, message.name, ', '.join(dispatch_function_args))) - if message.has_attribute(DISPATCH_ON_CONNECTION_QUEUE_ATTRIBUTE): - result.append(' didHandleMessage = true;\n') result.append(' return;\n') result.append(' }\n') return surround_in_condition(''.join(result), message.condition) @@ -345,20 +328,46 @@ def sync_message_statement(receiver, message): 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(' CoreIPC::%s<Messages::%s::%s>(%sdecoder, %sreplyEncoder, this, &%s);\n' % (dispatch_function, receiver.name, message.name, 'connection, ' if message.has_attribute(DELAYED_ATTRIBUTE) else '', '' if message.has_attribute(DELAYED_ATTRIBUTE) else '*', handler_function(receiver, message))) + result.append(' CoreIPC::%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 = { + # FIXME: Remove the unprefixed versions. + 'Vector': {'headers': ['<wtf/Vector.h>'], 'argument_coder_headers': ['"ArgumentCoders.h"']}, + 'HashMap': {'headers': ['<wtf/HashMap.h>'], 'argument_coder_headers': ['"ArgumentCoders.h"']}, + + 'WTF::Vector': {'headers': ['<wtf/Vector.h>'], 'argument_coder_headers': ['"ArgumentCoders.h"']}, + 'WTF::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]} + header_infos = [class_template_types[match.groupdict()['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): - # Check for Vector. - match = re.search(r'Vector<(.+)>', type) - if match: - element_type = match.groups()[0].strip() - return ['"ArgumentCoders.h"'] + argument_coder_headers_for_type(element_type) + header_infos_and_types = class_template_headers(type) special_cases = { 'WTF::String': '"ArgumentCoders.h"', @@ -366,24 +375,25 @@ def argument_coder_headers_for_type(type): 'WebKit::WebContextUserMessageEncoder': '"WebContextUserMessageCoders.h"', } - if type in special_cases: - return [special_cases[type]] + headers = [] + for header_info in header_infos_and_types['header_infos']: + headers += header_info['argument_coder_headers'] - split = type.split('::') - if len(split) < 2: - return [] - if split[0] == 'WebCore': - return ['"WebCoreArgumentCoders.h"'] + for type in header_infos_and_types['types']: + if type in special_cases: + headers.append(special_cases[type]) + continue - return [] + split = type.split('::') + if len(split) < 2: + continue + if split[0] == 'WebCore': + headers.append('"WebCoreArgumentCoders.h"') + return headers def headers_for_type(type): - # Check for Vector. - match = re.search(r'Vector<(.+)>', type) - if match: - element_type = match.groups()[0].strip() - return ['<wtf/Vector.h>'] + headers_for_type(element_type) + header_infos_and_types = class_template_headers(type) special_cases = { 'WTF::String': ['<wtf/text/WTFString.h>'], @@ -394,30 +404,39 @@ def headers_for_type(type): 'WebCore::KeypressCommand': ['<WebCore/KeyboardEvent.h>'], 'WebCore::FileChooserSettings': ['<WebCore/FileChooser.h>'], 'WebCore::PluginInfo': ['<WebCore/PluginData.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::WebLayerID': ['"WebLayerTreeInfo.h"'], - 'WebKit::WebLayerInfo': ['"WebLayerTreeInfo.h"'], 'WebKit::WebKeyboardEvent': ['"WebEvent.h"'], 'WebKit::WebMouseEvent': ['"WebEvent.h"'], 'WebKit::WebTouchEvent': ['"WebEvent.h"'], 'WebKit::WebWheelEvent': ['"WebEvent.h"'], } - if type in special_cases: - return special_cases[type] - # 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: - return [] - if split[0] == 'WebKit' or split[0] == 'CoreIPC': - return ['"%s.h"' % split[1]] - return ['<%s/%s.h>' % tuple(split)] + 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] == 'CoreIPC': + 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) @@ -517,7 +536,7 @@ def generate_message_handler(file): 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->encode(%s);\n' % x.name for x in message.reply_parameters] + result += [' *m_encoder << %s;\n' % x.name for x in message.reply_parameters] result.append(' bool result = m_connection->sendSyncReply(m_encoder.release());\n') result.append(' m_connection = nullptr;\n') result.append(' return result;\n') @@ -531,47 +550,37 @@ def generate_message_handler(file): result.append('namespace WebKit {\n\n') - async_dispatch_on_connection_queue_messages = [] - sync_dispatch_on_connection_queue_messages = [] async_messages = [] sync_messages = [] for message in receiver.messages: if message.reply_parameters is not None: - if message.has_attribute(DISPATCH_ON_CONNECTION_QUEUE_ATTRIBUTE): - sync_dispatch_on_connection_queue_messages.append(message) - else: - sync_messages.append(message) + sync_messages.append(message) else: - if message.has_attribute(DISPATCH_ON_CONNECTION_QUEUE_ATTRIBUTE): - async_dispatch_on_connection_queue_messages.append(message) - else: - async_messages.append(message) - - if async_dispatch_on_connection_queue_messages: - result.append('void %s::didReceive%sMessageOnConnectionWorkQueue(CoreIPC::Connection* connection, CoreIPC::MessageID, CoreIPC::MessageDecoder& decoder, bool& didHandleMessage)\n' % (receiver.name, receiver.name)) - result.append('{\n') - result.append('#if COMPILER(MSVC)\n') - result.append('#pragma warning(push)\n') - result.append('#pragma warning(disable: 4065)\n') - result.append('#endif\n') - result += [async_message_statement(receiver, message) for message in async_dispatch_on_connection_queue_messages] - result.append('#if COMPILER(MSVC)\n') - result.append('#pragma warning(pop)\n') - result.append('#endif\n') - result.append('}\n\n') + async_messages.append(message) if async_messages: - result.append('void %s::didReceive%sMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder& decoder)\n' % (receiver.name, receiver.name)) + if receiver.has_attribute(LEGACY_RECEIVER_ATTRIBUTE): + result.append('void %s::didReceive%sMessage(CoreIPC::Connection*, CoreIPC::MessageDecoder& decoder)\n' % (receiver.name, receiver.name)) + else: + result.append('void %s::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageDecoder& decoder)\n' % (receiver.name)) + result.append('{\n') result += [async_message_statement(receiver, message) for message in async_messages] + 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') - result.append('void %s::didReceiveSync%sMessage(CoreIPC::Connection*%s, CoreIPC::MessageID, CoreIPC::MessageDecoder& decoder, OwnPtr<CoreIPC::MessageEncoder>& replyEncoder)\n' % (receiver.name, receiver.name, ' connection' if sync_delayed_messages else '')) + if receiver.has_attribute(LEGACY_RECEIVER_ATTRIBUTE): + result.append('void %s::didReceiveSync%sMessage(CoreIPC::Connection*%s, CoreIPC::MessageDecoder& decoder, OwnPtr<CoreIPC::MessageEncoder>& replyEncoder)\n' % (receiver.name, receiver.name, ' connection' if sync_delayed_messages else '')) + else: + result.append('void %s::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageDecoder& decoder, OwnPtr<CoreIPC::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') |