summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/WebProcessProxy.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2012-11-22 09:09:45 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2012-11-22 09:10:13 +0100
commit470286ecfe79d59df14944e5b5d34630fc739391 (patch)
tree43983212872e06cebefd2ae474418fa2908ca54c /Source/WebKit2/UIProcess/WebProcessProxy.cpp
parent23037105e948c2065da5a937d3a2396b0ff45c1e (diff)
downloadqtwebkit-470286ecfe79d59df14944e5b5d34630fc739391.tar.gz
Imported WebKit commit e89504fa9195b2063b2530961d4b73dd08de3242 (http://svn.webkit.org/repository/webkit/trunk@135485)
Change-Id: I03774e5ac79721c13ffa30d152537a74d0b12e66 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'Source/WebKit2/UIProcess/WebProcessProxy.cpp')
-rw-r--r--Source/WebKit2/UIProcess/WebProcessProxy.cpp72
1 files changed, 63 insertions, 9 deletions
diff --git a/Source/WebKit2/UIProcess/WebProcessProxy.cpp b/Source/WebKit2/UIProcess/WebProcessProxy.cpp
index 8bc16ca52..fdeda3a8f 100644
--- a/Source/WebKit2/UIProcess/WebProcessProxy.cpp
+++ b/Source/WebKit2/UIProcess/WebProcessProxy.cpp
@@ -93,6 +93,9 @@ WebProcessProxy::WebProcessProxy(PassRefPtr<WebContext> context)
: m_responsivenessTimer(this)
, m_context(context)
, m_mayHaveUniversalFileReadSandboxExtension(false)
+#if ENABLE(CUSTOM_PROTOCOLS)
+ , m_customProtocolManagerProxy(this)
+#endif
{
connect();
}
@@ -101,7 +104,10 @@ WebProcessProxy::~WebProcessProxy()
{
if (m_connection)
m_connection->invalidate();
-
+
+ if (m_webConnection)
+ m_webConnection->invalidate();
+
for (size_t i = 0; i < m_pendingMessages.size(); ++i)
m_pendingMessages[i].first.releaseArguments();
@@ -114,10 +120,10 @@ WebProcessProxy::~WebProcessProxy()
WebProcessProxy* WebProcessProxy::fromConnection(CoreIPC::Connection* connection)
{
ASSERT(connection);
- WebConnectionToWebProcess* webConnection = static_cast<WebConnectionToWebProcess*>(connection->client());
- WebProcessProxy* webProcessProxy = webConnection->webProcessProxy();
+ WebProcessProxy* webProcessProxy = static_cast<WebProcessProxy*>(connection->client());
ASSERT(webProcessProxy->connection() == connection);
+
return webProcessProxy;
}
@@ -135,11 +141,16 @@ void WebProcessProxy::connect()
void WebProcessProxy::disconnect()
{
if (m_connection) {
- m_connection->connection()->removeQueueClient(this);
+ m_connection->removeQueueClient(this);
m_connection->invalidate();
m_connection = nullptr;
}
+ if (m_webConnection) {
+ m_webConnection->invalidate();
+ m_webConnection = nullptr;
+ }
+
m_responsivenessTimer.stop();
Vector<RefPtr<WebFrameProxy> > frames;
@@ -182,6 +193,21 @@ void WebProcessProxy::terminate()
m_processLauncher->terminateProcess();
}
+void WebProcessProxy::addMessageReceiver(CoreIPC::StringReference messageReceiverName, CoreIPC::MessageReceiver* messageReceiver)
+{
+ m_messageReceiverMap.addMessageReceiver(messageReceiverName, messageReceiver);
+}
+
+void WebProcessProxy::addMessageReceiver(CoreIPC::StringReference messageReceiverName, uint64_t destinationID, CoreIPC::MessageReceiver* messageReceiver)
+{
+ m_messageReceiverMap.addMessageReceiver(messageReceiverName, destinationID, messageReceiver);
+}
+
+void WebProcessProxy::removeMessageReceiver(CoreIPC::StringReference messageReceiverName, uint64_t destinationID)
+{
+ m_messageReceiverMap.removeMessageReceiver(messageReceiverName, destinationID);
+}
+
WebPageProxy* WebProcessProxy::webPage(uint64_t pageID) const
{
return m_pageMap.get(pageID);
@@ -415,6 +441,9 @@ void WebProcessProxy::getNetworkProcessConnection(PassRefPtr<Messages::WebProces
void WebProcessProxy::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::MessageDecoder& decoder)
{
+ if (m_messageReceiverMap.dispatchMessage(connection, messageID, decoder))
+ return;
+
if (m_context->dispatchMessage(connection, messageID, decoder))
return;
@@ -423,6 +452,13 @@ void WebProcessProxy::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC
return;
}
+#if ENABLE(CUSTOM_PROTOCOLS)
+ if (messageID.is<CoreIPC::MessageClassCustomProtocolManagerProxy>()) {
+ m_customProtocolManagerProxy.didReceiveMessage(connection, messageID, decoder);
+ return;
+ }
+#endif
+
uint64_t pageID = decoder.destinationID();
if (!pageID)
return;
@@ -436,6 +472,9 @@ void WebProcessProxy::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC
void WebProcessProxy::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::MessageDecoder& decoder, OwnPtr<CoreIPC::MessageEncoder>& replyEncoder)
{
+ if (m_messageReceiverMap.dispatchSyncMessage(connection, messageID, decoder, replyEncoder))
+ return;
+
if (m_context->dispatchSyncMessage(connection, messageID, decoder, replyEncoder))
return;
@@ -467,6 +506,8 @@ void WebProcessProxy::didClose(CoreIPC::Connection*)
// to be deleted before we can finish our work.
RefPtr<WebProcessProxy> protect(this);
+ webConnection()->didClose();
+
Vector<RefPtr<WebPageProxy> > pages;
copyValuesToVector(m_pageMap, pages);
@@ -474,14 +515,19 @@ void WebProcessProxy::didClose(CoreIPC::Connection*)
for (size_t i = 0, size = pages.size(); i < size; ++i)
pages[i]->processDidCrash();
+
}
-void WebProcessProxy::didReceiveInvalidMessage(CoreIPC::Connection*, CoreIPC::StringReference messageReceiverName, CoreIPC::StringReference messageName)
+void WebProcessProxy::didReceiveInvalidMessage(CoreIPC::Connection* connection, CoreIPC::StringReference messageReceiverName, CoreIPC::StringReference messageName)
{
WTFLogAlways("Received an invalid message \"%s.%s\" from the web process.\n", messageReceiverName.toString().data(), messageName.toString().data());
// Terminate the WebProcesses.
terminate();
+
+ // Since we've invalidated the connection we'll never get a CoreIPC::Connection::Client::didClose
+ // callback so we'll explicitly call it here instead.
+ didClose(connection);
}
void WebProcessProxy::didBecomeUnresponsive(ResponsivenessTimer*)
@@ -516,10 +562,18 @@ void WebProcessProxy::didFinishLaunching(ProcessLauncher*, CoreIPC::Connection::
void WebProcessProxy::didFinishLaunching(CoreIPC::Connection::Identifier connectionIdentifier)
{
ASSERT(!m_connection);
-
- m_connection = WebConnectionToWebProcess::create(this, connectionIdentifier, RunLoop::main());
- m_connection->connection()->addQueueClient(this);
- m_connection->connection()->open();
+
+ m_connection = CoreIPC::Connection::createServerConnection(connectionIdentifier, this, RunLoop::main());
+#if OS(DARWIN)
+ m_connection->setShouldCloseConnectionOnMachExceptions();
+#elif PLATFORM(QT) && !OS(WINDOWS)
+ m_connection->setShouldCloseConnectionOnProcessTermination(processIdentifier());
+#endif
+
+ m_connection->addQueueClient(this);
+ m_connection->open();
+
+ m_webConnection = WebConnectionToWebProcess::create(this);
for (size_t i = 0; i < m_pendingMessages.size(); ++i) {
CoreIPC::Connection::OutgoingMessage& outgoingMessage = m_pendingMessages[i].first;