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);