165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/* 265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved. 365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without 565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions 665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met: 765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright 865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer. 965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer in the 1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * documentation and/or other materials provided with the distribution. 1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE. 2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */ 2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h" 2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PluginProcess.h" 2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(PLUGIN_PROCESS) 302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "ArgumentCoders.h" 3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NetscapePluginModule.h" 3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PluginProcessProxyMessages.h" 3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PluginProcessCreationParameters.h" 3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebProcessConnection.h" 3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(MAC) 382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "MachPort.h" 392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit { 4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const double shutdownTimeout = 15.0; 4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPluginProcess& PluginProcess::shared() 4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch DEFINE_STATIC_LOCAL(PluginProcess, pluginProcess, ()); 4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return pluginProcess; 4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPluginProcess::PluginProcess() 522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch : ChildProcess(shutdownTimeout) 532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(MAC) 5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_compositingRenderServerPort(MACH_PORT_NULL) 5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPluginProcess::~PluginProcess() 6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 632fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid PluginProcess::initialize(CoreIPC::Connection::Identifier serverIdentifier, RunLoop* runLoop) 6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(!m_connection); 6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_connection = CoreIPC::Connection::createClientConnection(serverIdentifier, this, runLoop); 682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_connection->setDidCloseOnConnectionWorkQueueCallback(didCloseOnConnectionWorkQueue); 6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_connection->open(); 7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProcess::removeWebProcessConnection(WebProcessConnection* webProcessConnection) 7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch size_t vectorIndex = m_webProcessConnections.find(webProcessConnection); 7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(vectorIndex != notFound); 7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_webProcessConnections.remove(vectorIndex); 782bde8e466a4451c7319e3a072d118917957d6554Steve Block 792bde8e466a4451c7319e3a072d118917957d6554Steve Block if (m_webProcessConnections.isEmpty() && m_pluginModule) { 802bde8e466a4451c7319e3a072d118917957d6554Steve Block // Decrement the load count. This is balanced by a call to incrementLoadCount in createWebProcessConnection. 812bde8e466a4451c7319e3a072d118917957d6554Steve Block m_pluginModule->decrementLoadCount(); 822bde8e466a4451c7319e3a072d118917957d6554Steve Block } 8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch enableTermination(); 8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNetscapePluginModule* PluginProcess::netscapePluginModule() 8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_pluginModule) { 9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(!m_pluginPath.isNull()); 9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pluginModule = NetscapePluginModule::getOrCreate(m_pluginPath); 9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC) 9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_pluginModule) { 9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_pluginModule->pluginQuirks().contains(PluginQuirks::PrognameShouldBeWebKitPluginHost)) 9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch setprogname("WebKitPluginHost"); 9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return m_pluginModule.get(); 10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 1042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool PluginProcess::shouldTerminate() 1052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 1062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(m_webProcessConnections.isEmpty()); 1072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return true; 1092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 1102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProcess::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments) 11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch didReceivePluginProcessMessage(connection, messageID, arguments); 11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProcess::didClose(CoreIPC::Connection*) 11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // The UI process has crashed, just go ahead and quit. 11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // FIXME: If the plug-in is spinning in the main loop, we'll never get this message. 12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RunLoop::current()->stop(); 12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProcess::didReceiveInvalidMessage(CoreIPC::Connection*, CoreIPC::MessageID) 12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 1272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid PluginProcess::syncMessageSendTimedOut(CoreIPC::Connection*) 1282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 1292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 1302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1312fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid PluginProcess::initializePluginProcess(const PluginProcessCreationParameters& parameters) 13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(!m_pluginModule); 13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pluginPath = parameters.pluginPath; 13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 137ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch platformInitialize(parameters); 13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProcess::createWebProcessConnection() 14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 1422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool didHaveAnyWebProcessConnections = !m_webProcessConnections.isEmpty(); 14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 1442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(MAC) 14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Create the listening port. 14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch mach_port_t listeningPort; 14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &listeningPort); 14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Create a listening connection. 15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<WebProcessConnection> connection = WebProcessConnection::create(listeningPort); 15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_webProcessConnections.append(connection.release()); 15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CoreIPC::MachPort clientPort(listeningPort, MACH_MSG_TYPE_MAKE_SEND); 15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_connection->send(Messages::PluginProcessProxy::DidCreateWebProcessConnection(clientPort), 0); 1552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#else 1562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // FIXME: Implement. 1572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT_NOT_REACHED(); 1582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 1602bde8e466a4451c7319e3a072d118917957d6554Steve Block if (NetscapePluginModule* module = netscapePluginModule()) { 1612bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!didHaveAnyWebProcessConnections) { 1622bde8e466a4451c7319e3a072d118917957d6554Steve Block // Increment the load count. This is matched by a call to decrementLoadCount in removeWebProcessConnection. 1632bde8e466a4451c7319e3a072d118917957d6554Steve Block // We do this so that the plug-in module's NP_Shutdown won't be called until right before exiting. 1642bde8e466a4451c7319e3a072d118917957d6554Steve Block module->incrementLoadCount(); 1652bde8e466a4451c7319e3a072d118917957d6554Steve Block } 1662bde8e466a4451c7319e3a072d118917957d6554Steve Block } 1672bde8e466a4451c7319e3a072d118917957d6554Steve Block 1682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch disableTermination(); 16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid PluginProcess::getSitesWithData(uint64_t callbackID) 17281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 1732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch LocalTerminationDisabler terminationDisabler(*this); 1742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 17581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch Vector<String> sites; 17681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (NetscapePluginModule* module = netscapePluginModule()) 17781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch sites = module->sitesWithData(); 17881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 17981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_connection->send(Messages::PluginProcessProxy::DidGetSitesWithData(sites, callbackID), 0); 18081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 18181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 18281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid PluginProcess::clearSiteData(const Vector<String>& sites, uint64_t flags, uint64_t maxAgeInSeconds, uint64_t callbackID) 18381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 1842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch LocalTerminationDisabler terminationDisabler(*this); 1852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 18681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (NetscapePluginModule* module = netscapePluginModule()) { 18781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (sites.isEmpty()) { 18881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Clear everything. 18981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch module->clearSiteData(String(), flags, maxAgeInSeconds); 19081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } else { 19181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for (size_t i = 0; i < sites.size(); ++i) 19281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch module->clearSiteData(sites[i], flags, maxAgeInSeconds); 19381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 19481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 19581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 19681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_connection->send(Messages::PluginProcessProxy::DidClearSiteData(callbackID), 0); 19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit 20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // ENABLE(PLUGIN_PROCESS) 20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 203