diff options
| author | Ben Murdoch <benm@google.com> | 2011-06-02 12:07:03 +0100 |
|---|---|---|
| committer | Ben Murdoch <benm@google.com> | 2011-06-10 10:47:21 +0100 |
| commit | 2daae5fd11344eaa88a0d92b0f6d65f8d2255c00 (patch) | |
| tree | e4964fbd1cb70599f7718ff03e50ea1dab33890b /Source/WebKit2/Scripts | |
| parent | 87bdf0060a247bfbe668342b87e0874182e0ffa9 (diff) | |
| download | external_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.zip external_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.tar.gz external_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.tar.bz2 | |
Merge WebKit at r84325: Initial merge by git.
Change-Id: Ic1a909300ecc0a13ddc6b4e784371d2ac6e3d59b
Diffstat (limited to 'Source/WebKit2/Scripts')
| -rw-r--r-- | Source/WebKit2/Scripts/webkit2/messages.py | 109 | ||||
| -rw-r--r-- | Source/WebKit2/Scripts/webkit2/messages_unittest.py | 112 |
2 files changed, 172 insertions, 49 deletions
diff --git a/Source/WebKit2/Scripts/webkit2/messages.py b/Source/WebKit2/Scripts/webkit2/messages.py index 159ca32..433658d 100644 --- a/Source/WebKit2/Scripts/webkit2/messages.py +++ b/Source/WebKit2/Scripts/webkit2/messages.py @@ -81,9 +81,9 @@ class MessageReceiver(object): elif line.startswith('#endif'): condition = None continue - match = re.search(r'([A-Za-z_0-9]+)\((.*?)\)(?:(?:\s+->\s+)\((.*?)\)(?:\s+(delayed))?)?', line) + match = re.search(r'([A-Za-z_0-9]+)\((.*?)\)(?:(?:\s+->\s+)\((.*?)\)(?:\s+(.*))?)?', line) if match: - name, parameters_string, reply_parameters_string, delayed_string = match.groups() + name, parameters_string, reply_parameters_string, attributes_string = match.groups() if parameters_string: parameters = parse_parameter_string(parameters_string) else: @@ -92,7 +92,13 @@ class MessageReceiver(object): for parameter in parameters: parameter.condition = condition - delayed = delayed_string == 'delayed' + if attributes_string: + attributes = frozenset(attributes_string.split()) + is_delayed = "Delayed" in attributes + dispatch_on_connection_queue = "DispatchOnConnectionQueue" in attributes + else: + is_delayed = False + dispatch_on_connection_queue = False if reply_parameters_string: reply_parameters = parse_parameter_string(reply_parameters_string) @@ -101,17 +107,18 @@ class MessageReceiver(object): else: reply_parameters = None - messages.append(Message(name, parameters, reply_parameters, delayed, condition)) + messages.append(Message(name, parameters, reply_parameters, is_delayed, dispatch_on_connection_queue, condition)) return MessageReceiver(destination, messages, master_condition) class Message(object): - def __init__(self, name, parameters, reply_parameters, delayed, condition): + def __init__(self, name, parameters, reply_parameters, is_delayed, dispatch_on_connection_queue, condition): self.name = name self.parameters = parameters self.reply_parameters = reply_parameters if self.reply_parameters is not None: - self.delayed = delayed + self.is_delayed = is_delayed + self.dispatch_on_connection_queue = dispatch_on_connection_queue self.condition = condition if len(self.parameters) != 0: self.is_variadic = parameter_type_is_variadic(self.parameters[-1].type) @@ -217,30 +224,20 @@ def message_to_struct_declaration(message): result.append(' {\n') result.append(' static const Kind messageID = %s;\n' % message.id()) if message.reply_parameters != None: - if message.delayed: + if message.is_delayed: send_parameters = [(function_parameter_type(x.type), x.name) for x in message.reply_parameters] - result.append(' struct DelayedReply {\n') - result.append(' DelayedReply(PassRefPtr<CoreIPC::Connection> connection, PassOwnPtr<CoreIPC::ArgumentDecoder> arguments)\n') - result.append(' : m_connection(connection)\n') - result.append(' , m_arguments(arguments)\n') - result.append(' {\n') - result.append(' }\n') + result.append(' struct DelayedReply : public ThreadSafeRefCounted<DelayedReply> {\n') + result.append(' DelayedReply(PassRefPtr<CoreIPC::Connection>, PassOwnPtr<CoreIPC::ArgumentEncoder>);\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(' ASSERT(m_arguments);\n') - result += [' m_arguments->encode(%s);\n' % x.name for x in message.reply_parameters] - result.append(' bool result = m_connection->sendSyncReply(m_arguments.release());\n') - result.append(' m_connection = nullptr;\n') - result.append(' return result;\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<CoreIPC::Connection> m_connection;\n') - result.append(' OwnPtr<CoreIPC::ArgumentDecoder> m_arguments;\n') + result.append(' OwnPtr<CoreIPC::ArgumentEncoder> m_arguments;\n') result.append(' };\n\n') - else: - result.append(' typedef %s Reply;\n' % reply_type(message)) + + result.append(' typedef %s Reply;\n' % reply_type(message)) result.append(' typedef %s DecodeType;\n' % decode_type(message)) if len(function_parameters): @@ -254,6 +251,7 @@ def message_to_struct_declaration(message): def struct_or_class(namespace, type): structs = frozenset([ + 'WebCore::EditorCommandsForKeyEvent', 'WebCore::CompositionUnderline', 'WebCore::GrammarDetail', 'WebCore::KeypressCommand', @@ -261,14 +259,15 @@ def struct_or_class(namespace, type): 'WebCore::PrintInfo', 'WebCore::ViewportArguments', 'WebCore::WindowFeatures', + 'WebKit::AttributedString', 'WebKit::ContextMenuState', 'WebKit::DictionaryPopupInfo', 'WebKit::DrawingAreaInfo', + 'WebKit::EditorState', 'WebKit::PlatformPopupMenuData', 'WebKit::PluginProcessCreationParameters', 'WebKit::PrintInfo', 'WebKit::SecurityOriginData', - 'WebKit::SelectionState', 'WebKit::TextCheckerState', 'WebKit::WebNavigationDataStore', 'WebKit::WebOpenPanelParameters::Data', @@ -299,6 +298,11 @@ def forward_declarations_and_headers(receiver): '"MessageID.h"', ]) + for message in receiver.messages: + if message.reply_parameters != None and message.is_delayed: + headers.add('<wtf/ThreadSafeRefCounted.h>') + types_by_namespace['CoreIPC'].update(['ArgumentEncoder', 'Connection']) + for parameter in receiver.iterparameters(): type = parameter.type @@ -385,14 +389,20 @@ def async_case_statement(receiver, message): def sync_case_statement(receiver, message): dispatch_function = 'handleMessage' + if message.is_delayed: + dispatch_function += 'Delayed' if message.is_variadic: dispatch_function += 'Variadic' result = [] result.append(' case Messages::%s::%s:\n' % (receiver.name, message.id())) - result.append(' CoreIPC::%s<Messages::%s::%s>(arguments, reply, this, &%s);\n' % (dispatch_function, receiver.name, message.name, handler_function(receiver, message))) - # FIXME: Handle delayed replies - result.append(' return CoreIPC::AutomaticReply;\n') + result.append(' CoreIPC::%s<Messages::%s::%s>(%sarguments, reply, this, &%s);\n' % (dispatch_function, receiver.name, message.name, 'connection, ' if message.is_delayed else '', handler_function(receiver, message))) + + if message.is_delayed: + result.append(' return CoreIPC::ManualReply;\n') + else: + result.append(' return CoreIPC::AutomaticReply;\n') + return surround_in_condition(''.join(result), message.condition) @@ -431,6 +441,7 @@ def headers_for_type(type): special_cases = { 'WTF::String': '<wtf/text/WTFString.h>', 'WebCore::CompositionUnderline': '<WebCore/Editor.h>', + 'WebCore::GrammarDetail': '<WebCore/TextCheckerClient.h>', 'WebCore::KeypressCommand': '<WebCore/KeyboardEvent.h>', 'WebCore::PluginInfo': '<WebCore/PluginData.h>', 'WebCore::TextCheckingResult': '<WebCore/TextCheckerClient.h>', @@ -518,6 +529,46 @@ def generate_message_handler(file): result += ['#include %s\n' % headercondition] result.append('\n') + sync_delayed_messages = [] + for message in receiver.messages: + if message.reply_parameters != None and message.is_delayed: + 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<CoreIPC::Connection> connection, PassOwnPtr<CoreIPC::ArgumentEncoder> arguments)\n' % message.name) + result.append(' : m_connection(connection)\n') + result.append(' , m_arguments(arguments)\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_arguments);\n') + result += [' m_arguments->encode(%s);\n' % x.name for x in message.reply_parameters] + result.append(' bool result = m_connection->sendSyncReply(m_arguments.release());\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 = [] @@ -541,7 +592,7 @@ def generate_message_handler(file): if sync_messages: result.append('\n') - result.append('CoreIPC::SyncReplyMode %s::didReceiveSync%sMessage(CoreIPC::Connection*, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments, CoreIPC::ArgumentEncoder* reply)\n' % (receiver.name, receiver.name)) + result.append('CoreIPC::SyncReplyMode %s::didReceiveSync%sMessage(CoreIPC::Connection*%s, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments, CoreIPC::ArgumentEncoder* reply)\n' % (receiver.name, receiver.name, ' connection' if sync_delayed_messages else '')) result.append('{\n') result.append(' switch (messageID.get<Messages::%s::Kind>()) {\n' % receiver.name) result += [sync_case_statement(receiver, message) for message in sync_messages] diff --git a/Source/WebKit2/Scripts/webkit2/messages_unittest.py b/Source/WebKit2/Scripts/webkit2/messages_unittest.py index 90d59ae..2fc5763 100644 --- a/Source/WebKit2/Scripts/webkit2/messages_unittest.py +++ b/Source/WebKit2/Scripts/webkit2/messages_unittest.py @@ -65,8 +65,10 @@ messages -> WebPage { CreatePlugin(uint64_t pluginInstanceID, WebKit::Plugin::Parameters parameters) -> (bool result) RunJavaScriptAlert(uint64_t frameID, WTF::String message) -> () - GetPlugins(bool refresh) -> (Vector<WebCore::PluginInfo> plugins) - GetPluginProcessConnection(WTF::String pluginPath) -> (CoreIPC::Connection::Handle connectionHandle) delayed + GetPlugins(bool refresh) -> (Vector<WebCore::PluginInfo> plugins) DispatchOnConnectionQueue + GetPluginProcessConnection(WTF::String pluginPath) -> (CoreIPC::Connection::Handle connectionHandle) Delayed + + TestMultipleAttributes() -> () DispatchOnConnectionQueue Delayed #if PLATFORM(MAC) DidCreateWebProcessConnection(CoreIPC::MachPort connectionIdentifier) @@ -177,6 +179,14 @@ _expected_results = { 'condition': None, }, { + 'name': 'TestMultipleAttributes', + 'parameters': ( + ), + 'reply_parameters': ( + ), + 'condition': None, + }, + { 'name': 'DidCreateWebProcessConnection', 'parameters': ( ('CoreIPC::MachPort', 'connectionIdentifier'), @@ -260,9 +270,12 @@ _expected_header = """/* #include "Plugin.h" #include <WebCore/KeyboardEvent.h> #include <WebCore/PluginData.h> +#include <wtf/ThreadSafeRefCounted.h> #include <wtf/Vector.h> namespace CoreIPC { + class ArgumentEncoder; + class Connection; class MachPort; } @@ -293,6 +306,7 @@ enum Kind { RunJavaScriptAlertID, GetPluginsID, GetPluginProcessConnectionID, + TestMultipleAttributesID, #if PLATFORM(MAC) DidCreateWebProcessConnectionID, #endif @@ -394,27 +408,18 @@ struct GetPlugins : CoreIPC::Arguments1<bool> { struct GetPluginProcessConnection : CoreIPC::Arguments1<const WTF::String&> { static const Kind messageID = GetPluginProcessConnectionID; - struct DelayedReply { - DelayedReply(PassRefPtr<CoreIPC::Connection> connection, PassOwnPtr<CoreIPC::ArgumentDecoder> arguments) - : m_connection(connection) - , m_arguments(arguments) - { - } + struct DelayedReply : public ThreadSafeRefCounted<DelayedReply> { + DelayedReply(PassRefPtr<CoreIPC::Connection>, PassOwnPtr<CoreIPC::ArgumentEncoder>); + ~DelayedReply(); - bool send(const CoreIPC::Connection::Handle& connectionHandle) - { - ASSERT(m_arguments); - m_arguments->encode(connectionHandle); - bool result = m_connection->sendSyncReply(m_arguments.release()); - m_connection = nullptr; - return result; - } + bool send(const CoreIPC::Connection::Handle& connectionHandle); private: RefPtr<CoreIPC::Connection> m_connection; - OwnPtr<CoreIPC::ArgumentDecoder> m_arguments; + OwnPtr<CoreIPC::ArgumentEncoder> m_arguments; }; + typedef CoreIPC::Arguments1<CoreIPC::Connection::Handle&> Reply; typedef CoreIPC::Arguments1<const WTF::String&> DecodeType; explicit GetPluginProcessConnection(const WTF::String& pluginPath) : CoreIPC::Arguments1<const WTF::String&>(pluginPath) @@ -422,6 +427,23 @@ struct GetPluginProcessConnection : CoreIPC::Arguments1<const WTF::String&> { } }; +struct TestMultipleAttributes : CoreIPC::Arguments0 { + static const Kind messageID = TestMultipleAttributesID; + struct DelayedReply : public ThreadSafeRefCounted<DelayedReply> { + DelayedReply(PassRefPtr<CoreIPC::Connection>, PassOwnPtr<CoreIPC::ArgumentEncoder>); + ~DelayedReply(); + + bool send(); + + private: + RefPtr<CoreIPC::Connection> m_connection; + OwnPtr<CoreIPC::ArgumentEncoder> m_arguments; + }; + + typedef CoreIPC::Arguments0 Reply; + typedef CoreIPC::Arguments0 DecodeType; +}; + #if PLATFORM(MAC) struct DidCreateWebProcessConnection : CoreIPC::Arguments1<const CoreIPC::MachPort&> { static const Kind messageID = DidCreateWebProcessConnectionID; @@ -511,6 +533,53 @@ _expected_receiver_implementation = """/* #include "WebPageMessages.h" #include "WebPreferencesStore.h" +namespace Messages { + +namespace WebPage { + +GetPluginProcessConnection::DelayedReply::DelayedReply(PassRefPtr<CoreIPC::Connection> connection, PassOwnPtr<CoreIPC::ArgumentEncoder> arguments) + : m_connection(connection) + , m_arguments(arguments) +{ +} + +GetPluginProcessConnection::DelayedReply::~DelayedReply() +{ + ASSERT(!m_connection); +} + +bool GetPluginProcessConnection::DelayedReply::send(const CoreIPC::Connection::Handle& connectionHandle) +{ + ASSERT(m_arguments); + m_arguments->encode(connectionHandle); + bool result = m_connection->sendSyncReply(m_arguments.release()); + m_connection = nullptr; + return result; +} + +TestMultipleAttributes::DelayedReply::DelayedReply(PassRefPtr<CoreIPC::Connection> connection, PassOwnPtr<CoreIPC::ArgumentEncoder> arguments) + : m_connection(connection) + , m_arguments(arguments) +{ +} + +TestMultipleAttributes::DelayedReply::~DelayedReply() +{ + ASSERT(!m_connection); +} + +bool TestMultipleAttributes::DelayedReply::send() +{ + ASSERT(m_arguments); + bool result = m_connection->sendSyncReply(m_arguments.release()); + m_connection = nullptr; + return result; +} + +} // namespace WebPage + +} // namespace Messages + namespace WebKit { void WebPage::didReceiveWebPageMessage(CoreIPC::Connection*, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments) @@ -551,7 +620,7 @@ void WebPage::didReceiveWebPageMessage(CoreIPC::Connection*, CoreIPC::MessageID ASSERT_NOT_REACHED(); } -CoreIPC::SyncReplyMode WebPage::didReceiveSyncWebPageMessage(CoreIPC::Connection*, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments, CoreIPC::ArgumentEncoder* reply) +CoreIPC::SyncReplyMode WebPage::didReceiveSyncWebPageMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments, CoreIPC::ArgumentEncoder* reply) { switch (messageID.get<Messages::WebPage::Kind>()) { case Messages::WebPage::CreatePluginID: @@ -564,8 +633,11 @@ CoreIPC::SyncReplyMode WebPage::didReceiveSyncWebPageMessage(CoreIPC::Connection CoreIPC::handleMessage<Messages::WebPage::GetPlugins>(arguments, reply, this, &WebPage::getPlugins); return CoreIPC::AutomaticReply; case Messages::WebPage::GetPluginProcessConnectionID: - CoreIPC::handleMessage<Messages::WebPage::GetPluginProcessConnection>(arguments, reply, this, &WebPage::getPluginProcessConnection); - return CoreIPC::AutomaticReply; + CoreIPC::handleMessageDelayed<Messages::WebPage::GetPluginProcessConnection>(connection, arguments, reply, this, &WebPage::getPluginProcessConnection); + return CoreIPC::ManualReply; + case Messages::WebPage::TestMultipleAttributesID: + CoreIPC::handleMessageDelayed<Messages::WebPage::TestMultipleAttributes>(connection, arguments, reply, this, &WebPage::testMultipleAttributes); + return CoreIPC::ManualReply; #if PLATFORM(MAC) case Messages::WebPage::InterpretKeyEventID: CoreIPC::handleMessage<Messages::WebPage::InterpretKeyEvent>(arguments, reply, this, &WebPage::interpretKeyEvent); |
