1/* 2 * Copyright (C) 2010 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "PluginProcessConnectionManager.h" 28 29#if ENABLE(PLUGIN_PROCESS) 30 31#include "ArgumentDecoder.h" 32#include "ArgumentEncoder.h" 33#include "PluginProcessConnection.h" 34#include "PluginProcessConnectionManagerMessages.h" 35#include "WebCoreArgumentCoders.h" 36#include "WebProcess.h" 37#include "WebProcessProxyMessages.h" 38 39#if PLATFORM(MAC) 40#include "MachPort.h" 41#endif 42 43namespace WebKit { 44 45PassRefPtr<PluginProcessConnectionManager> PluginProcessConnectionManager::create() 46{ 47 return adoptRef(new PluginProcessConnectionManager); 48} 49 50PluginProcessConnectionManager::PluginProcessConnectionManager() 51 : m_queue(WorkQueue::create("com.apple.WebKit.PluginProcessConnectionManager")) 52{ 53} 54 55PluginProcessConnectionManager::~PluginProcessConnectionManager() 56{ 57} 58 59void PluginProcessConnectionManager::initializeConnection(CoreIPC::Connection* connection) 60{ 61 connection->addWorkQueueMessageReceiver(Messages::PluginProcessConnectionManager::messageReceiverName(), m_queue.get(), this); 62} 63 64PluginProcessConnection* PluginProcessConnectionManager::getPluginProcessConnection(uint64_t pluginProcessToken) 65{ 66 for (size_t i = 0; i < m_pluginProcessConnections.size(); ++i) { 67 if (m_pluginProcessConnections[i]->pluginProcessToken() == pluginProcessToken) 68 return m_pluginProcessConnections[i].get(); 69 } 70 71 CoreIPC::Attachment encodedConnectionIdentifier; 72 bool supportsAsynchronousInitialization; 73 if (!WebProcess::shared().parentProcessConnection()->sendSync(Messages::WebProcessProxy::GetPluginProcessConnection(pluginProcessToken), 74 Messages::WebProcessProxy::GetPluginProcessConnection::Reply(encodedConnectionIdentifier, supportsAsynchronousInitialization), 0)) 75 return 0; 76 77#if PLATFORM(MAC) 78 CoreIPC::Connection::Identifier connectionIdentifier(encodedConnectionIdentifier.port()); 79 if (CoreIPC::Connection::identifierIsNull(connectionIdentifier)) 80 return 0; 81#elif USE(UNIX_DOMAIN_SOCKETS) 82 CoreIPC::Connection::Identifier connectionIdentifier = encodedConnectionIdentifier.fileDescriptor(); 83 if (connectionIdentifier == -1) 84 return 0; 85#endif 86 87 RefPtr<PluginProcessConnection> pluginProcessConnection = PluginProcessConnection::create(this, pluginProcessToken, connectionIdentifier, supportsAsynchronousInitialization); 88 m_pluginProcessConnections.append(pluginProcessConnection); 89 90 { 91 MutexLocker locker(m_tokensAndConnectionsMutex); 92 ASSERT(!m_tokensAndConnections.contains(pluginProcessToken)); 93 94 m_tokensAndConnections.set(pluginProcessToken, pluginProcessConnection->connection()); 95 } 96 97 return pluginProcessConnection.get(); 98} 99 100void PluginProcessConnectionManager::removePluginProcessConnection(PluginProcessConnection* pluginProcessConnection) 101{ 102 size_t vectorIndex = m_pluginProcessConnections.find(pluginProcessConnection); 103 ASSERT(vectorIndex != notFound); 104 105 { 106 MutexLocker locker(m_tokensAndConnectionsMutex); 107 ASSERT(m_tokensAndConnections.contains(pluginProcessConnection->pluginProcessToken())); 108 109 m_tokensAndConnections.remove(pluginProcessConnection->pluginProcessToken()); 110 } 111 112 m_pluginProcessConnections.remove(vectorIndex); 113} 114 115void PluginProcessConnectionManager::pluginProcessCrashed(uint64_t pluginProcessToken) 116{ 117 MutexLocker locker(m_tokensAndConnectionsMutex); 118 CoreIPC::Connection* connection = m_tokensAndConnections.get(pluginProcessToken); 119 120 // It's OK for connection to be null here; it will happen if this web process doesn't know 121 // anything about the plug-in process. 122 if (!connection) 123 return; 124 125 connection->postConnectionDidCloseOnConnectionWorkQueue(); 126} 127 128} // namespace WebKit 129 130#endif // ENABLE(PLUGIN_PROCESS) 131