summaryrefslogtreecommitdiffstats
path: root/Source/WebKit2/Scripts
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2011-06-02 12:07:03 +0100
committerBen Murdoch <benm@google.com>2011-06-10 10:47:21 +0100
commit2daae5fd11344eaa88a0d92b0f6d65f8d2255c00 (patch)
treee4964fbd1cb70599f7718ff03e50ea1dab33890b /Source/WebKit2/Scripts
parent87bdf0060a247bfbe668342b87e0874182e0ffa9 (diff)
downloadexternal_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.py109
-rw-r--r--Source/WebKit2/Scripts/webkit2/messages_unittest.py112
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);