Change the queue client base class to be private everywhere
https://bugs.webkit.org/show_bug.cgi?id=109604
Reviewed by Andreas Kling.
Move connection queue client registration inside of the respective queue client classes.
Also, it's too late to add queue clients in ChildProcessProxy::didFinishLaunching, so do this in
ChildProcessProxy::connectionWillOpen instead.
Finally, assert that queue clients are only being added and removed from the client thread.
* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::initializeConnection):
* Platform/CoreIPC/Connection.cpp:
(CoreIPC::Connection::addQueueClient):
(CoreIPC::Connection::removeQueueClient):
* Shared/mac/SecItemShim.cpp:
(WebKit::SecItemShim::initializeConnection):
(WebKit):
* Shared/mac/SecItemShim.h:
(SecItemShim):
* UIProcess/Network/NetworkProcessProxy.cpp:
(WebKit::NetworkProcessProxy::connectionWillOpen):
(WebKit):
(WebKit::NetworkProcessProxy::connectionWillClose):
(WebKit::NetworkProcessProxy::didFinishLaunching):
* UIProcess/Network/NetworkProcessProxy.h:
(NetworkProcessProxy):
* UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::connectionWillOpen):
(WebKit::WebProcessProxy::didFinishLaunching):
* UIProcess/mac/SecItemShimProxy.cpp:
(WebKit::SecItemShimProxy::initializeConnection):
(WebKit):
* UIProcess/mac/SecItemShimProxy.h:
(SecItemShimProxy):
* WebProcess/Plugins/PluginProcessConnectionManager.cpp:
(WebKit::PluginProcessConnectionManager::initializeConnection):
(WebKit):
* WebProcess/Plugins/PluginProcessConnectionManager.h:
(PluginProcessConnectionManager):
* WebProcess/WebPage/EventDispatcher.cpp:
(WebKit::EventDispatcher::initializeConnection):
(WebKit):
* WebProcess/WebPage/EventDispatcher.h:
(EventDispatcher):
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::initializeConnection):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@142656 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebKit2/ChangeLog b/Source/WebKit2/ChangeLog
index 41834e3..007b4a9 100644
--- a/Source/WebKit2/ChangeLog
+++ b/Source/WebKit2/ChangeLog
@@ -1,3 +1,55 @@
+2013-02-12 Anders Carlsson <andersca@apple.com>
+
+ Change the queue client base class to be private everywhere
+ https://bugs.webkit.org/show_bug.cgi?id=109604
+
+ Reviewed by Andreas Kling.
+
+ Move connection queue client registration inside of the respective queue client classes.
+
+ Also, it's too late to add queue clients in ChildProcessProxy::didFinishLaunching, so do this in
+ ChildProcessProxy::connectionWillOpen instead.
+
+ Finally, assert that queue clients are only being added and removed from the client thread.
+
+ * NetworkProcess/NetworkProcess.cpp:
+ (WebKit::NetworkProcess::initializeConnection):
+ * Platform/CoreIPC/Connection.cpp:
+ (CoreIPC::Connection::addQueueClient):
+ (CoreIPC::Connection::removeQueueClient):
+ * Shared/mac/SecItemShim.cpp:
+ (WebKit::SecItemShim::initializeConnection):
+ (WebKit):
+ * Shared/mac/SecItemShim.h:
+ (SecItemShim):
+ * UIProcess/Network/NetworkProcessProxy.cpp:
+ (WebKit::NetworkProcessProxy::connectionWillOpen):
+ (WebKit):
+ (WebKit::NetworkProcessProxy::connectionWillClose):
+ (WebKit::NetworkProcessProxy::didFinishLaunching):
+ * UIProcess/Network/NetworkProcessProxy.h:
+ (NetworkProcessProxy):
+ * UIProcess/WebProcessProxy.cpp:
+ (WebKit::WebProcessProxy::connectionWillOpen):
+ (WebKit::WebProcessProxy::didFinishLaunching):
+ * UIProcess/mac/SecItemShimProxy.cpp:
+ (WebKit::SecItemShimProxy::initializeConnection):
+ (WebKit):
+ * UIProcess/mac/SecItemShimProxy.h:
+ (SecItemShimProxy):
+ * WebProcess/Plugins/PluginProcessConnectionManager.cpp:
+ (WebKit::PluginProcessConnectionManager::initializeConnection):
+ (WebKit):
+ * WebProcess/Plugins/PluginProcessConnectionManager.h:
+ (PluginProcessConnectionManager):
+ * WebProcess/WebPage/EventDispatcher.cpp:
+ (WebKit::EventDispatcher::initializeConnection):
+ (WebKit):
+ * WebProcess/WebPage/EventDispatcher.h:
+ (EventDispatcher):
+ * WebProcess/WebProcess.cpp:
+ (WebKit::WebProcess::initializeConnection):
+
2013-02-12 Brady Eidson <beidson@apple.com>
Add WKContext API to retrieve basic network process statistics
diff --git a/Source/WebKit2/NetworkProcess/NetworkProcess.cpp b/Source/WebKit2/NetworkProcess/NetworkProcess.cpp
index aa15f2c..1a2b55f 100644
--- a/Source/WebKit2/NetworkProcess/NetworkProcess.cpp
+++ b/Source/WebKit2/NetworkProcess/NetworkProcess.cpp
@@ -165,7 +165,7 @@
ChildProcess::initializeConnection(connection);
#if USE(SECURITY_FRAMEWORK)
- connection->addQueueClient(&SecItemShim::shared());
+ SecItemShim::shared().initializeConnection(connection);
#endif
}
diff --git a/Source/WebKit2/Platform/CoreIPC/Connection.cpp b/Source/WebKit2/Platform/CoreIPC/Connection.cpp
index bda281a..0b6b735 100644
--- a/Source/WebKit2/Platform/CoreIPC/Connection.cpp
+++ b/Source/WebKit2/Platform/CoreIPC/Connection.cpp
@@ -256,11 +256,16 @@
void Connection::addQueueClient(QueueClient* queueClient)
{
+ ASSERT(RunLoop::current() == m_clientRunLoop);
+ ASSERT(!m_isConnected);
+
m_connectionQueue->dispatch(WTF::bind(&Connection::addQueueClientOnWorkQueue, this, queueClient));
}
void Connection::removeQueueClient(QueueClient* queueClient)
{
+ ASSERT(RunLoop::current() == m_clientRunLoop);
+
m_connectionQueue->dispatch(WTF::bind(&Connection::removeQueueClientOnWorkQueue, this, queueClient));
}
diff --git a/Source/WebKit2/Shared/mac/SecItemShim.cpp b/Source/WebKit2/Shared/mac/SecItemShim.cpp
index 7d573b9..914b774 100644
--- a/Source/WebKit2/Shared/mac/SecItemShim.cpp
+++ b/Source/WebKit2/Shared/mac/SecItemShim.cpp
@@ -132,6 +132,11 @@
func(callbacks);
}
+void SecItemShim::initializeConnection(CoreIPC::Connection* connection)
+{
+ connection->addQueueClient(this);
+}
+
void SecItemShim::didReceiveMessageOnConnectionWorkQueue(CoreIPC::Connection* connection, OwnPtr<CoreIPC::MessageDecoder>& decoder)
{
if (decoder->messageReceiverName() == Messages::SecItemShim::messageReceiverName()) {
diff --git a/Source/WebKit2/Shared/mac/SecItemShim.h b/Source/WebKit2/Shared/mac/SecItemShim.h
index 2c008e4..f58a095 100644
--- a/Source/WebKit2/Shared/mac/SecItemShim.h
+++ b/Source/WebKit2/Shared/mac/SecItemShim.h
@@ -35,12 +35,13 @@
class ChildProcess;
class SecItemResponseData;
-class SecItemShim : public CoreIPC::Connection::QueueClient {
+class SecItemShim : private CoreIPC::Connection::QueueClient {
WTF_MAKE_NONCOPYABLE(SecItemShim);
public:
static SecItemShim& shared();
void initialize(ChildProcess*);
+ void initializeConnection(CoreIPC::Connection*);
private:
SecItemShim();
diff --git a/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.cpp b/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.cpp
index d2e205f..f15bdb4 100644
--- a/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.cpp
+++ b/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.cpp
@@ -72,6 +72,17 @@
platformGetLaunchOptions(launchOptions);
}
+void NetworkProcessProxy::connectionWillOpen(CoreIPC::Connection* connection)
+{
+#if USE(SECURITY_FRAMEWORK)
+ SecItemShimProxy::shared().initializeConnection(connection);
+#endif
+}
+
+void NetworkProcessProxy::connectionWillClose(CoreIPC::Connection*)
+{
+}
+
void NetworkProcessProxy::getNetworkProcessConnection(PassRefPtr<Messages::WebProcessProxy::GetNetworkProcessConnection::DelayedReply> reply)
{
m_pendingConnectionReplies.append(reply);
@@ -168,10 +179,6 @@
{
ChildProcessProxy::didFinishLaunching(launcher, connectionIdentifier);
-#if USE(SECURITY_FRAMEWORK)
- connection()->addQueueClient(&SecItemShimProxy::shared());
-#endif
-
if (CoreIPC::Connection::identifierIsNull(connectionIdentifier)) {
// FIXME: Do better cleanup here.
return;
diff --git a/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.h b/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.h
index 031dff0..378670b 100644
--- a/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.h
+++ b/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.h
@@ -64,9 +64,12 @@
private:
NetworkProcessProxy(WebContext*);
+ // ChildProcessProxy
virtual void getLaunchOptions(ProcessLauncher::LaunchOptions&) OVERRIDE;
- void platformGetLaunchOptions(ProcessLauncher::LaunchOptions&);
+ virtual void connectionWillOpen(CoreIPC::Connection*) OVERRIDE;
+ virtual void connectionWillClose(CoreIPC::Connection*) OVERRIDE;
+ void platformGetLaunchOptions(ProcessLauncher::LaunchOptions&);
void networkProcessCrashedOrFailedToLaunch();
// CoreIPC::Connection::Client
diff --git a/Source/WebKit2/UIProcess/WebProcessProxy.cpp b/Source/WebKit2/UIProcess/WebProcessProxy.cpp
index c6b66f3..484119a 100644
--- a/Source/WebKit2/UIProcess/WebProcessProxy.cpp
+++ b/Source/WebKit2/UIProcess/WebProcessProxy.cpp
@@ -123,6 +123,10 @@
{
ASSERT(this->connection() == connection);
+#if USE(SECURITY_FRAMEWORK)
+ SecItemShimProxy::shared().initializeConnection(connection);
+#endif
+
m_context->processWillOpenConnection(this);
}
@@ -443,10 +447,6 @@
{
ChildProcessProxy::didFinishLaunching(launcher, connectionIdentifier);
-#if USE(SECURITY_FRAMEWORK)
- connection()->addQueueClient(&SecItemShimProxy::shared());
-#endif
-
m_webConnection = WebConnectionToWebProcess::create(this);
m_context->processDidFinishLaunching(this);
diff --git a/Source/WebKit2/UIProcess/mac/SecItemShimProxy.cpp b/Source/WebKit2/UIProcess/mac/SecItemShimProxy.cpp
index aefa860..7dccd35 100644
--- a/Source/WebKit2/UIProcess/mac/SecItemShimProxy.cpp
+++ b/Source/WebKit2/UIProcess/mac/SecItemShimProxy.cpp
@@ -46,6 +46,11 @@
{
}
+void SecItemShimProxy::initializeConnection(CoreIPC::Connection* connection)
+{
+ connection->addQueueClient(this);
+}
+
static void handleSecItemRequest(CoreIPC::Connection* connection, uint64_t requestID, const SecItemRequestData& request)
{
SecItemResponseData response;
diff --git a/Source/WebKit2/UIProcess/mac/SecItemShimProxy.h b/Source/WebKit2/UIProcess/mac/SecItemShimProxy.h
index 2ec4902..b77a236 100644
--- a/Source/WebKit2/UIProcess/mac/SecItemShimProxy.h
+++ b/Source/WebKit2/UIProcess/mac/SecItemShimProxy.h
@@ -34,11 +34,13 @@
class SecItemRequestData;
-class SecItemShimProxy : public CoreIPC::Connection::QueueClient {
+class SecItemShimProxy : private CoreIPC::Connection::QueueClient {
WTF_MAKE_NONCOPYABLE(SecItemShimProxy);
public:
static SecItemShimProxy& shared();
+ void initializeConnection(CoreIPC::Connection*);
+
private:
SecItemShimProxy();
diff --git a/Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.cpp b/Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.cpp
index 8707cad..d8070d3 100644
--- a/Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.cpp
+++ b/Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.cpp
@@ -50,6 +50,11 @@
{
}
+void PluginProcessConnectionManager::initializeConnection(CoreIPC::Connection* connection)
+{
+ connection->addQueueClient(this);
+}
+
PluginProcessConnection* PluginProcessConnectionManager::getPluginProcessConnection(const String& pluginPath, PluginProcess::Type processType)
{
for (size_t i = 0; i < m_pluginProcessConnections.size(); ++i) {
diff --git a/Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.h b/Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.h
index 749ed70..ce0f7b1 100644
--- a/Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.h
+++ b/Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.h
@@ -38,20 +38,18 @@
// Manages plug-in process connections for the given web process.
-namespace CoreIPC {
- class Connection;
-}
-
namespace WebKit {
class PluginProcessConnection;
-class PluginProcessConnectionManager : public CoreIPC::Connection::QueueClient {
+class PluginProcessConnectionManager : private CoreIPC::Connection::QueueClient {
WTF_MAKE_NONCOPYABLE(PluginProcessConnectionManager);
public:
PluginProcessConnectionManager();
~PluginProcessConnectionManager();
+ void initializeConnection(CoreIPC::Connection*);
+
PluginProcessConnection* getPluginProcessConnection(const String& pluginPath, PluginProcess::Type);
void removePluginProcessConnection(PluginProcessConnection*);
diff --git a/Source/WebKit2/WebProcess/WebPage/EventDispatcher.cpp b/Source/WebKit2/WebProcess/WebPage/EventDispatcher.cpp
index 432926c..62f4057 100644
--- a/Source/WebKit2/WebProcess/WebPage/EventDispatcher.cpp
+++ b/Source/WebKit2/WebProcess/WebPage/EventDispatcher.cpp
@@ -73,6 +73,11 @@
}
#endif
+void EventDispatcher::initializeConnection(CoreIPC::Connection* connection)
+{
+ connection->addQueueClient(this);
+}
+
void EventDispatcher::didReceiveMessageOnConnectionWorkQueue(CoreIPC::Connection* connection, OwnPtr<CoreIPC::MessageDecoder>& decoder)
{
if (decoder->messageReceiverName() == Messages::EventDispatcher::messageReceiverName()) {
diff --git a/Source/WebKit2/WebProcess/WebPage/EventDispatcher.h b/Source/WebKit2/WebProcess/WebPage/EventDispatcher.h
index b6e8536..0fcd2e1 100644
--- a/Source/WebKit2/WebProcess/WebPage/EventDispatcher.h
+++ b/Source/WebKit2/WebProcess/WebPage/EventDispatcher.h
@@ -46,7 +46,7 @@
class WebGestureEvent;
#endif
-class EventDispatcher : public CoreIPC::Connection::QueueClient {
+class EventDispatcher : private CoreIPC::Connection::QueueClient {
WTF_MAKE_NONCOPYABLE(EventDispatcher);
public:
@@ -58,6 +58,8 @@
void removeScrollingTreeForPage(WebPage*);
#endif
+ void initializeConnection(CoreIPC::Connection*);
+
private:
// CoreIPC::Connection::QueueClient
virtual void didReceiveMessageOnConnectionWorkQueue(CoreIPC::Connection*, OwnPtr<CoreIPC::MessageDecoder>&) OVERRIDE;
diff --git a/Source/WebKit2/WebProcess/WebProcess.cpp b/Source/WebKit2/WebProcess/WebProcess.cpp
index 80da285..108f6ac 100644
--- a/Source/WebKit2/WebProcess/WebProcess.cpp
+++ b/Source/WebKit2/WebProcess/WebProcess.cpp
@@ -205,14 +205,15 @@
ChildProcess::initializeConnection(connection);
connection->setShouldExitOnSyncMessageSendFailure(true);
- connection->addQueueClient(&m_eventDispatcher);
+
+ m_eventDispatcher.initializeConnection(connection);
#if ENABLE(PLUGIN_PROCESS)
- connection->addQueueClient(&m_pluginProcessConnectionManager);
+ m_pluginProcessConnectionManager.initializeConnection(connection);
#endif
#if USE(SECURITY_FRAMEWORK)
- connection->addQueueClient(&SecItemShim::shared());
+ SecItemShim::shared().initializeConnection(connection);
#endif
m_webConnection = WebConnectionToUIProcess::create(this);