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 | |
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')
-rw-r--r-- | Source/WebKit2/Scripts/webkit2/messages.py | 171 | ||||
-rw-r--r-- | Source/WebKit2/Scripts/webkit2/messages_unittest.py | 149 | ||||
-rw-r--r-- | Source/WebKit2/Scripts/webkit2/model.py | 8 | ||||
-rw-r--r-- | Source/WebKit2/Scripts/webkit2/parser.py | 33 |
4 files changed, 169 insertions, 192 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') diff --git a/Source/WebKit2/Scripts/webkit2/messages_unittest.py b/Source/WebKit2/Scripts/webkit2/messages_unittest.py index 6b1ebfd2f..a7a403ca6 100644 --- a/Source/WebKit2/Scripts/webkit2/messages_unittest.py +++ b/Source/WebKit2/Scripts/webkit2/messages_unittest.py @@ -52,7 +52,7 @@ _messages_file_contents = """# Copyright (C) 2010 Apple Inc. All rights reserved #if ENABLE(WEBKIT2) -messages -> WebPage { +messages -> WebPage LegacyReceiver { LoadURL(WTF::String url) #if ENABLE(TOUCH_EVENTS) TouchEvent(WebKit::WebTouchEvent event) @@ -62,18 +62,19 @@ messages -> WebPage { PreferencesDidChange(WebKit::WebPreferencesStore store) SendDoubleAndFloat(double d, float f) - SendInts(Vector<uint64_t> ints, Vector<Vector<uint64_t> > intVectors) + SendInts(Vector<uint64_t> ints, Vector<Vector<uint64_t>> intVectors) CreatePlugin(uint64_t pluginInstanceID, WebKit::Plugin::Parameters parameters) -> (bool result) RunJavaScriptAlert(uint64_t frameID, WTF::String message) -> () - GetPlugins(bool refresh) -> (Vector<WebCore::PluginInfo> plugins) DispatchOnConnectionQueue + GetPlugins(bool refresh) -> (Vector<WebCore::PluginInfo> plugins) GetPluginProcessConnection(WTF::String pluginPath) -> (CoreIPC::Connection::Handle connectionHandle) Delayed - TestMultipleAttributes() -> () DispatchOnConnectionQueue Delayed - TestConnectionQueue(uint64_t pluginID) DispatchOnConnectionQueue + TestMultipleAttributes() -> () WantsConnection Delayed TestParameterAttributes([AttributeOne AttributeTwo] uint64_t foo, double bar, [AttributeThree] double baz) + TemplateTest(WTF::HashMap<String, std::pair<String, uint64_t>> a) + #if PLATFORM(MAC) DidCreateWebProcessConnection(CoreIPC::MachPort connectionIdentifier) #endif @@ -146,7 +147,7 @@ _expected_results = { 'name': 'SendInts', 'parameters': ( ('Vector<uint64_t>', 'ints'), - ('Vector<Vector<uint64_t> >', 'intVectors') + ('Vector<Vector<uint64_t>>', 'intVectors') ), 'conditions': (None), }, @@ -199,18 +200,18 @@ _expected_results = { 'conditions': (None), }, { - 'name': 'TestConnectionQueue', + 'name': 'TestParameterAttributes', 'parameters': ( - ('uint64_t', 'pluginID'), + ('uint64_t', 'foo', ('AttributeOne', 'AttributeTwo')), + ('double', 'bar'), + ('double', 'baz', ('AttributeThree',)), ), 'conditions': (None), }, { - 'name': 'TestParameterAttributes', + 'name': 'TemplateTest', 'parameters': ( - ('uint64_t', 'foo', ('AttributeOne', 'AttributeTwo')), - ('double', 'bar'), - ('double', 'baz', ('AttributeThree',)), + ('WTF::HashMap<String, std::pair<String, uint64_t>>', 'a'), ), 'conditions': (None), }, @@ -316,11 +317,12 @@ _expected_header = """/* #include "Arguments.h" #include "Connection.h" #include "MessageEncoder.h" -#include "MessageID.h" #include "Plugin.h" #include "StringReference.h" #include <WebCore/KeyboardEvent.h> #include <WebCore/PluginData.h> +#include <utility> +#include <wtf/HashMap.h> #include <wtf/ThreadSafeRefCounted.h> #include <wtf/Vector.h> @@ -347,39 +349,7 @@ static inline CoreIPC::StringReference messageReceiverName() return CoreIPC::StringReference("WebPage"); } -enum Kind { - LoadURLID, -#if ENABLE(TOUCH_EVENTS) - TouchEventID, -#endif - DidReceivePolicyDecisionID, - CloseID, - PreferencesDidChangeID, - SendDoubleAndFloatID, - SendIntsID, - CreatePluginID, - RunJavaScriptAlertID, - GetPluginsID, - GetPluginProcessConnectionID, - TestMultipleAttributesID, - TestConnectionQueueID, - TestParameterAttributesID, -#if PLATFORM(MAC) - DidCreateWebProcessConnectionID, -#endif -#if PLATFORM(MAC) - InterpretKeyEventID, -#endif -#if ENABLE(DEPRECATED_FEATURE) - DeprecatedOperationID, -#endif -#if ENABLE(EXPERIMENTAL_FEATURE) - ExperimentalOperationID, -#endif -}; - struct LoadURL : CoreIPC::Arguments1<const WTF::String&> { - static const Kind messageID = LoadURLID; static CoreIPC::StringReference receiverName() { return messageReceiverName(); } static CoreIPC::StringReference name() { return CoreIPC::StringReference("LoadURL"); } static const bool isSync = false; @@ -393,7 +363,6 @@ struct LoadURL : CoreIPC::Arguments1<const WTF::String&> { #if ENABLE(TOUCH_EVENTS) struct TouchEvent : CoreIPC::Arguments1<const WebKit::WebTouchEvent&> { - static const Kind messageID = TouchEventID; static CoreIPC::StringReference receiverName() { return messageReceiverName(); } static CoreIPC::StringReference name() { return CoreIPC::StringReference("TouchEvent"); } static const bool isSync = false; @@ -407,7 +376,6 @@ struct TouchEvent : CoreIPC::Arguments1<const WebKit::WebTouchEvent&> { #endif struct DidReceivePolicyDecision : CoreIPC::Arguments3<uint64_t, uint64_t, uint32_t> { - static const Kind messageID = DidReceivePolicyDecisionID; static CoreIPC::StringReference receiverName() { return messageReceiverName(); } static CoreIPC::StringReference name() { return CoreIPC::StringReference("DidReceivePolicyDecision"); } static const bool isSync = false; @@ -420,7 +388,6 @@ struct DidReceivePolicyDecision : CoreIPC::Arguments3<uint64_t, uint64_t, uint32 }; struct Close : CoreIPC::Arguments0 { - static const Kind messageID = CloseID; static CoreIPC::StringReference receiverName() { return messageReceiverName(); } static CoreIPC::StringReference name() { return CoreIPC::StringReference("Close"); } static const bool isSync = false; @@ -429,7 +396,6 @@ struct Close : CoreIPC::Arguments0 { }; struct PreferencesDidChange : CoreIPC::Arguments1<const WebKit::WebPreferencesStore&> { - static const Kind messageID = PreferencesDidChangeID; static CoreIPC::StringReference receiverName() { return messageReceiverName(); } static CoreIPC::StringReference name() { return CoreIPC::StringReference("PreferencesDidChange"); } static const bool isSync = false; @@ -442,7 +408,6 @@ struct PreferencesDidChange : CoreIPC::Arguments1<const WebKit::WebPreferencesSt }; struct SendDoubleAndFloat : CoreIPC::Arguments2<double, float> { - static const Kind messageID = SendDoubleAndFloatID; static CoreIPC::StringReference receiverName() { return messageReceiverName(); } static CoreIPC::StringReference name() { return CoreIPC::StringReference("SendDoubleAndFloat"); } static const bool isSync = false; @@ -454,21 +419,19 @@ struct SendDoubleAndFloat : CoreIPC::Arguments2<double, float> { } }; -struct SendInts : CoreIPC::Arguments2<const Vector<uint64_t>&, const Vector<Vector<uint64_t> >&> { - static const Kind messageID = SendIntsID; +struct SendInts : CoreIPC::Arguments2<const Vector<uint64_t>&, const Vector<Vector<uint64_t>>&> { static CoreIPC::StringReference receiverName() { return messageReceiverName(); } static CoreIPC::StringReference name() { return CoreIPC::StringReference("SendInts"); } static const bool isSync = false; - typedef CoreIPC::Arguments2<const Vector<uint64_t>&, const Vector<Vector<uint64_t> >&> DecodeType; - SendInts(const Vector<uint64_t>& ints, const Vector<Vector<uint64_t> >& intVectors) - : CoreIPC::Arguments2<const Vector<uint64_t>&, const Vector<Vector<uint64_t> >&>(ints, intVectors) + typedef CoreIPC::Arguments2<const Vector<uint64_t>&, const Vector<Vector<uint64_t>>&> DecodeType; + SendInts(const Vector<uint64_t>& ints, const Vector<Vector<uint64_t>>& intVectors) + : CoreIPC::Arguments2<const Vector<uint64_t>&, const Vector<Vector<uint64_t>>&>(ints, intVectors) { } }; struct CreatePlugin : CoreIPC::Arguments2<uint64_t, const WebKit::Plugin::Parameters&> { - static const Kind messageID = CreatePluginID; static CoreIPC::StringReference receiverName() { return messageReceiverName(); } static CoreIPC::StringReference name() { return CoreIPC::StringReference("CreatePlugin"); } static const bool isSync = true; @@ -482,7 +445,6 @@ struct CreatePlugin : CoreIPC::Arguments2<uint64_t, const WebKit::Plugin::Parame }; struct RunJavaScriptAlert : CoreIPC::Arguments2<uint64_t, const WTF::String&> { - static const Kind messageID = RunJavaScriptAlertID; static CoreIPC::StringReference receiverName() { return messageReceiverName(); } static CoreIPC::StringReference name() { return CoreIPC::StringReference("RunJavaScriptAlert"); } static const bool isSync = true; @@ -496,7 +458,6 @@ struct RunJavaScriptAlert : CoreIPC::Arguments2<uint64_t, const WTF::String&> { }; struct GetPlugins : CoreIPC::Arguments1<bool> { - static const Kind messageID = GetPluginsID; static CoreIPC::StringReference receiverName() { return messageReceiverName(); } static CoreIPC::StringReference name() { return CoreIPC::StringReference("GetPlugins"); } static const bool isSync = true; @@ -510,7 +471,6 @@ struct GetPlugins : CoreIPC::Arguments1<bool> { }; struct GetPluginProcessConnection : CoreIPC::Arguments1<const WTF::String&> { - static const Kind messageID = GetPluginProcessConnectionID; static CoreIPC::StringReference receiverName() { return messageReceiverName(); } static CoreIPC::StringReference name() { return CoreIPC::StringReference("GetPluginProcessConnection"); } static const bool isSync = true; @@ -535,7 +495,6 @@ struct GetPluginProcessConnection : CoreIPC::Arguments1<const WTF::String&> { }; struct TestMultipleAttributes : CoreIPC::Arguments0 { - static const Kind messageID = TestMultipleAttributesID; static CoreIPC::StringReference receiverName() { return messageReceiverName(); } static CoreIPC::StringReference name() { return CoreIPC::StringReference("TestMultipleAttributes"); } static const bool isSync = true; @@ -555,35 +514,32 @@ struct TestMultipleAttributes : CoreIPC::Arguments0 { typedef CoreIPC::Arguments0 DecodeType; }; -struct TestConnectionQueue : CoreIPC::Arguments1<uint64_t> { - static const Kind messageID = TestConnectionQueueID; +struct TestParameterAttributes : CoreIPC::Arguments3<uint64_t, double, double> { static CoreIPC::StringReference receiverName() { return messageReceiverName(); } - static CoreIPC::StringReference name() { return CoreIPC::StringReference("TestConnectionQueue"); } + static CoreIPC::StringReference name() { return CoreIPC::StringReference("TestParameterAttributes"); } static const bool isSync = false; - typedef CoreIPC::Arguments1<uint64_t> DecodeType; - explicit TestConnectionQueue(uint64_t pluginID) - : CoreIPC::Arguments1<uint64_t>(pluginID) + typedef CoreIPC::Arguments3<uint64_t, double, double> DecodeType; + TestParameterAttributes(uint64_t foo, double bar, double baz) + : CoreIPC::Arguments3<uint64_t, double, double>(foo, bar, baz) { } }; -struct TestParameterAttributes : CoreIPC::Arguments3<uint64_t, double, double> { - static const Kind messageID = TestParameterAttributesID; +struct TemplateTest : CoreIPC::Arguments1<const WTF::HashMap<String, std::pair<String, uint64_t>>&> { static CoreIPC::StringReference receiverName() { return messageReceiverName(); } - static CoreIPC::StringReference name() { return CoreIPC::StringReference("TestParameterAttributes"); } + static CoreIPC::StringReference name() { return CoreIPC::StringReference("TemplateTest"); } static const bool isSync = false; - typedef CoreIPC::Arguments3<uint64_t, double, double> DecodeType; - TestParameterAttributes(uint64_t foo, double bar, double baz) - : CoreIPC::Arguments3<uint64_t, double, double>(foo, bar, baz) + typedef CoreIPC::Arguments1<const WTF::HashMap<String, std::pair<String, uint64_t>>&> DecodeType; + explicit TemplateTest(const WTF::HashMap<String, std::pair<String, uint64_t>>& a) + : CoreIPC::Arguments1<const WTF::HashMap<String, std::pair<String, uint64_t>>&>(a) { } }; #if PLATFORM(MAC) struct DidCreateWebProcessConnection : CoreIPC::Arguments1<const CoreIPC::MachPort&> { - static const Kind messageID = DidCreateWebProcessConnectionID; static CoreIPC::StringReference receiverName() { return messageReceiverName(); } static CoreIPC::StringReference name() { return CoreIPC::StringReference("DidCreateWebProcessConnection"); } static const bool isSync = false; @@ -598,7 +554,6 @@ struct DidCreateWebProcessConnection : CoreIPC::Arguments1<const CoreIPC::MachPo #if PLATFORM(MAC) struct InterpretKeyEvent : CoreIPC::Arguments1<uint32_t> { - static const Kind messageID = InterpretKeyEventID; static CoreIPC::StringReference receiverName() { return messageReceiverName(); } static CoreIPC::StringReference name() { return CoreIPC::StringReference("InterpretKeyEvent"); } static const bool isSync = true; @@ -614,7 +569,6 @@ struct InterpretKeyEvent : CoreIPC::Arguments1<uint32_t> { #if ENABLE(DEPRECATED_FEATURE) struct DeprecatedOperation : CoreIPC::Arguments1<const CoreIPC::DummyType&> { - static const Kind messageID = DeprecatedOperationID; static CoreIPC::StringReference receiverName() { return messageReceiverName(); } static CoreIPC::StringReference name() { return CoreIPC::StringReference("DeprecatedOperation"); } static const bool isSync = false; @@ -629,7 +583,6 @@ struct DeprecatedOperation : CoreIPC::Arguments1<const CoreIPC::DummyType&> { #if ENABLE(EXPERIMENTAL_FEATURE) struct ExperimentalOperation : CoreIPC::Arguments1<const CoreIPC::DummyType&> { - static const Kind messageID = ExperimentalOperationID; static CoreIPC::StringReference receiverName() { return messageReceiverName(); } static CoreIPC::StringReference name() { return CoreIPC::StringReference("ExperimentalOperation"); } static const bool isSync = false; @@ -645,14 +598,6 @@ struct ExperimentalOperation : CoreIPC::Arguments1<const CoreIPC::DummyType&> { } // namespace WebPage } // namespace Messages -namespace CoreIPC { - -template<> struct MessageKindTraits<Messages::WebPage::Kind> { - static const MessageClass messageClass = MessageClassWebPage; -}; - -} // namespace CoreIPC - #endif // ENABLE(WEBKIT2) #endif // WebPageMessages_h @@ -709,6 +654,8 @@ _expected_receiver_implementation = """/* #include <WebCore/KeyboardEvent.h> #endif #include <WebCore/PluginData.h> +#include <utility> +#include <wtf/HashMap.h> #include <wtf/Vector.h> #include <wtf/text/WTFString.h> @@ -730,7 +677,7 @@ GetPluginProcessConnection::DelayedReply::~DelayedReply() bool GetPluginProcessConnection::DelayedReply::send(const CoreIPC::Connection::Handle& connectionHandle) { ASSERT(m_encoder); - m_encoder->encode(connectionHandle); + *m_encoder << connectionHandle; bool result = m_connection->sendSyncReply(m_encoder.release()); m_connection = nullptr; return result; @@ -761,23 +708,7 @@ bool TestMultipleAttributes::DelayedReply::send() namespace WebKit { -void WebPage::didReceiveWebPageMessageOnConnectionWorkQueue(CoreIPC::Connection* connection, CoreIPC::MessageID, CoreIPC::MessageDecoder& decoder, bool& didHandleMessage) -{ -#if COMPILER(MSVC) -#pragma warning(push) -#pragma warning(disable: 4065) -#endif - if (decoder.messageName() == Messages::WebPage::TestConnectionQueue::name()) { - CoreIPC::handleMessageOnConnectionQueue<Messages::WebPage::TestConnectionQueue>(connection, decoder, this, &WebPage::testConnectionQueue); - didHandleMessage = true; - return; - } -#if COMPILER(MSVC) -#pragma warning(pop) -#endif -} - -void WebPage::didReceiveWebPageMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder& decoder) +void WebPage::didReceiveWebPageMessage(CoreIPC::Connection*, CoreIPC::MessageDecoder& decoder) { if (decoder.messageName() == Messages::WebPage::LoadURL::name()) { CoreIPC::handleMessage<Messages::WebPage::LoadURL>(decoder, this, &WebPage::loadURL); @@ -813,6 +744,10 @@ void WebPage::didReceiveWebPageMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::handleMessage<Messages::WebPage::TestParameterAttributes>(decoder, this, &WebPage::testParameterAttributes); return; } + if (decoder.messageName() == Messages::WebPage::TemplateTest::name()) { + CoreIPC::handleMessage<Messages::WebPage::TemplateTest>(decoder, this, &WebPage::templateTest); + return; + } #if PLATFORM(MAC) if (decoder.messageName() == Messages::WebPage::DidCreateWebProcessConnection::name()) { CoreIPC::handleMessage<Messages::WebPage::DidCreateWebProcessConnection>(decoder, this, &WebPage::didCreateWebProcessConnection); @@ -834,7 +769,7 @@ void WebPage::didReceiveWebPageMessage(CoreIPC::Connection*, CoreIPC::MessageID, ASSERT_NOT_REACHED(); } -void WebPage::didReceiveSyncWebPageMessage(CoreIPC::Connection* connection, CoreIPC::MessageID, CoreIPC::MessageDecoder& decoder, OwnPtr<CoreIPC::MessageEncoder>& replyEncoder) +void WebPage::didReceiveSyncWebPageMessage(CoreIPC::Connection* connection, CoreIPC::MessageDecoder& decoder, OwnPtr<CoreIPC::MessageEncoder>& replyEncoder) { if (decoder.messageName() == Messages::WebPage::CreatePlugin::name()) { CoreIPC::handleMessage<Messages::WebPage::CreatePlugin>(decoder, *replyEncoder, this, &WebPage::createPlugin); @@ -844,10 +779,18 @@ void WebPage::didReceiveSyncWebPageMessage(CoreIPC::Connection* connection, Core CoreIPC::handleMessage<Messages::WebPage::RunJavaScriptAlert>(decoder, *replyEncoder, this, &WebPage::runJavaScriptAlert); return; } + if (decoder.messageName() == Messages::WebPage::GetPlugins::name()) { + CoreIPC::handleMessage<Messages::WebPage::GetPlugins>(decoder, *replyEncoder, this, &WebPage::getPlugins); + return; + } if (decoder.messageName() == Messages::WebPage::GetPluginProcessConnection::name()) { CoreIPC::handleMessageDelayed<Messages::WebPage::GetPluginProcessConnection>(connection, decoder, replyEncoder, this, &WebPage::getPluginProcessConnection); return; } + if (decoder.messageName() == Messages::WebPage::TestMultipleAttributes::name()) { + CoreIPC::handleMessageDelayed<Messages::WebPage::TestMultipleAttributes>(connection, decoder, replyEncoder, this, &WebPage::testMultipleAttributes); + return; + } #if PLATFORM(MAC) if (decoder.messageName() == Messages::WebPage::InterpretKeyEvent::name()) { CoreIPC::handleMessage<Messages::WebPage::InterpretKeyEvent>(decoder, *replyEncoder, this, &WebPage::interpretKeyEvent); diff --git a/Source/WebKit2/Scripts/webkit2/model.py b/Source/WebKit2/Scripts/webkit2/model.py index b10416c96..a84ebcb28 100644 --- a/Source/WebKit2/Scripts/webkit2/model.py +++ b/Source/WebKit2/Scripts/webkit2/model.py @@ -24,8 +24,9 @@ import itertools class MessageReceiver(object): - def __init__(self, name, messages, condition): + def __init__(self, name, attributes, messages, condition): self.name = name + self.attributes = frozenset(attributes or []) self.messages = messages self.condition = condition @@ -33,6 +34,8 @@ class MessageReceiver(object): return itertools.chain((parameter for message in self.messages for parameter in message.parameters), (reply_parameter for message in self.messages if message.reply_parameters for reply_parameter in message.reply_parameters)) + def has_attribute(self, attribute): + return attribute in self.attributes class Message(object): def __init__(self, name, parameters, reply_parameters, attributes, condition): @@ -42,9 +45,6 @@ class Message(object): self.attributes = frozenset(attributes or []) self.condition = condition - def id(self): - return '%sID' % self.name - def has_attribute(self, attribute): return attribute in self.attributes diff --git a/Source/WebKit2/Scripts/webkit2/parser.py b/Source/WebKit2/Scripts/webkit2/parser.py index c40080f0a..e16593ae6 100644 --- a/Source/WebKit2/Scripts/webkit2/parser.py +++ b/Source/WebKit2/Scripts/webkit2/parser.py @@ -26,17 +26,20 @@ from webkit2 import model def parse(file): + receiver_attributes = None destination = None messages = [] condition = None master_condition = None for line in file: - match = re.search(r'messages -> ([A-Za-z_0-9]+) {', line) + match = re.search(r'messages -> (?P<destination>[A-Za-z_0-9]+) \s*(?:(?P<attributes>.*?)\s+)?{', line) if match: + receiver_attributes = parse_attributes_string(match.group('attributes')) + if condition: master_condition = condition condition = None - destination = match.group(1) + destination = match.group('destination') continue if line.startswith('#'): if line.startswith('#if '): @@ -66,7 +69,7 @@ def parse(file): reply_parameters = None messages.append(model.Message(name, parameters, reply_parameters, attributes, condition)) - return model.MessageReceiver(destination, messages, master_condition) + return model.MessageReceiver(destination, receiver_attributes, messages, master_condition) def parse_attributes_string(attributes_string): @@ -75,9 +78,31 @@ def parse_attributes_string(attributes_string): return attributes_string.split() +def split_parameters_string(parameters_string): + parameters = [] + current_parameter_string = '' + + nest_level = 0 + for character in parameters_string: + if character == ',' and nest_level == 0: + parameters.append(current_parameter_string) + current_parameter_string = '' + continue + + if character == '<': + nest_level += 1 + elif character == '>': + nest_level -= 1 + + current_parameter_string += character + + parameters.append(current_parameter_string) + return parameters + def parse_parameters_string(parameters_string): parameters = [] - for parameter_string in parameters_string.split(', '): + + for parameter_string in split_parameters_string(parameters_string): match = re.search(r'\s*(?:\[(?P<attributes>.*?)\]\s+)?(?P<type_and_name>.*)', parameter_string) attributes_string, type_and_name_string = match.group('attributes', 'type_and_name') parameter_type, parameter_name = type_and_name_string.rsplit(' ', 1) |