PluginProcessProxy.cpp revision 81bc750723a18f21cd17d1b173cd2a4dda9cea6e
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 "PluginProcessProxy.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(PLUGIN_PROCESS)
302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "MachPort.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PluginProcessCreationParameters.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PluginProcessManager.h"
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PluginProcessMessages.h"
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "RunLoop.h"
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebCoreArgumentCoders.h"
3781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "WebPluginSiteDataManager.h"
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebProcessProxy.h"
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
4181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if PLATFORM(MAC)
4381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic bool pluginNeedsExecutableHeap(const PluginInfoStore::Plugin& pluginInfo)
4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (pluginInfo.bundleIdentifier == "com.apple.QuickTime Plugin.plugin")
4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
4881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return true;
4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassOwnPtr<PluginProcessProxy> PluginProcessProxy::create(PluginProcessManager* PluginProcessManager, const PluginInfoStore::Plugin& pluginInfo)
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return adoptPtr(new PluginProcessProxy(PluginProcessManager, pluginInfo));
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPluginProcessProxy::PluginProcessProxy(PluginProcessManager* PluginProcessManager, const PluginInfoStore::Plugin& pluginInfo)
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    : m_pluginProcessManager(PluginProcessManager)
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_pluginInfo(pluginInfo)
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_numPendingConnectionRequests(0)
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ProcessLauncher::LaunchOptions launchOptions;
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    launchOptions.processType = ProcessLauncher::PluginProcess;
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC)
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    launchOptions.architecture = pluginInfo.pluginArchitecture;
6681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    launchOptions.executableHeap = pluginNeedsExecutableHeap(pluginInfo);
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_processLauncher = ProcessLauncher::create(this, launchOptions);
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPluginProcessProxy::~PluginProcessProxy()
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Asks the plug-in process to create a new connection to a web process. The connection identifier will be
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// encoded in the given argument encoder and sent back to the connection of the given web process.
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProcessProxy::createWebProcessConnection(WebProcessProxy* webProcessProxy, CoreIPC::ArgumentEncoder* reply)
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pendingConnectionReplies.append(make_pair(webProcessProxy, reply));
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_processLauncher->isLaunching()) {
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_numPendingConnectionRequests++;
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Ask the plug-in process to create a connection. Since the plug-in can be waiting for a synchronous reply
882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // we need to make sure that this message is always processed, even when the plug-in is waiting for a synchronus reply.
892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_connection->send(Messages::PluginProcess::CreateWebProcessConnection(), 0, CoreIPC::DispatchMessageEvenWhenWaitingForSyncReply);
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid PluginProcessProxy::getSitesWithData(WebPluginSiteDataManager* webPluginSiteDataManager, uint64_t callbackID)
9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(!m_pendingGetSitesReplies.contains(callbackID));
9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_pendingGetSitesReplies.set(callbackID, webPluginSiteDataManager);
9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
9781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_processLauncher->isLaunching()) {
9881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_pendingGetSitesRequests.append(callbackID);
9981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
10081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
10181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
10281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Ask the plug-in process for the sites with data.
10381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_connection->send(Messages::PluginProcess::GetSitesWithData(callbackID), 0);
10481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
10581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
10681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid PluginProcessProxy::clearSiteData(WebPluginSiteDataManager* webPluginSiteDataManager, const Vector<String>& sites, uint64_t flags, uint64_t maxAgeInSeconds, uint64_t callbackID)
10781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
10881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(!m_pendingClearSiteDataReplies.contains(callbackID));
10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_pendingClearSiteDataReplies.set(callbackID, webPluginSiteDataManager);
11081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
11181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_processLauncher->isLaunching()) {
11281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        ClearSiteDataRequest request;
11381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        request.sites = sites;
11481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        request.flags = flags;
11581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        request.maxAgeInSeconds = maxAgeInSeconds;
11681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        request.callbackID = callbackID;
11781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_pendingClearSiteDataRequests.append(request);
11881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
11981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
12081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
12181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Ask the plug-in process to clear the site data.
12281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_connection->send(Messages::PluginProcess::ClearSiteData(sites, flags, maxAgeInSeconds, callbackID), 0);
12381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
12481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProcessProxy::pluginProcessCrashedOrFailedToLaunch()
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // The plug-in process must have crashed or exited, send any pending sync replies we might have.
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    while (!m_pendingConnectionReplies.isEmpty()) {
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        RefPtr<WebProcessProxy> replyWebProcessProxy = m_pendingConnectionReplies.first().first.release();
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CoreIPC::ArgumentEncoder* reply = m_pendingConnectionReplies.first().second;
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_pendingConnectionReplies.removeFirst();
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // FIXME: This is Mac specific.
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        reply->encode(CoreIPC::MachPort(0, MACH_MSG_TYPE_MOVE_SEND));
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        replyWebProcessProxy->connection()->sendSyncReply(reply);
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    while (!m_pendingGetSitesReplies.isEmpty())
13981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        didGetSitesWithData(Vector<String>(), m_pendingGetSitesReplies.begin()->first);
14081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
14181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    while (!m_pendingClearSiteDataReplies.isEmpty())
14281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        didClearSiteData(m_pendingClearSiteDataReplies.begin()->first);
14381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Tell the plug-in process manager to forget about this plug-in process proxy.
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginProcessManager->removePluginProcessProxy(this);
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    delete this;
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProcessProxy::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments)
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    didReceivePluginProcessProxyMessage(connection, messageID, arguments);
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProcessProxy::didClose(CoreIPC::Connection*)
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    pluginProcessCrashedOrFailedToLaunch();
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProcessProxy::didReceiveInvalidMessage(CoreIPC::Connection*, CoreIPC::MessageID)
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProcessProxy::didFinishLaunching(ProcessLauncher*, CoreIPC::Connection::Identifier connectionIdentifier)
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_connection);
16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!connectionIdentifier) {
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        pluginProcessCrashedOrFailedToLaunch();
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection = CoreIPC::Connection::createServerConnection(connectionIdentifier, this, RunLoop::main());
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->open();
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    PluginProcessCreationParameters parameters;
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    parameters.pluginPath = m_pluginInfo.path;
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    platformInitializePluginProcess(parameters);
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Initialize the plug-in host process.
1822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_connection->send(Messages::PluginProcess::InitializePluginProcess(parameters), 0);
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Send all our pending requests.
18581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    for (size_t i = 0; i < m_pendingGetSitesRequests.size(); ++i)
18681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_connection->send(Messages::PluginProcess::GetSitesWithData(m_pendingGetSitesRequests[i]), 0);
18781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_pendingGetSitesRequests.clear();
18881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
18981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    for (size_t i = 0; i < m_pendingClearSiteDataRequests.size(); ++i) {
19081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        const ClearSiteDataRequest& request = m_pendingClearSiteDataRequests[i];
19181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_connection->send(Messages::PluginProcess::ClearSiteData(request.sites, request.flags, request.maxAgeInSeconds, request.callbackID), 0);
19281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
19381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_pendingClearSiteDataRequests.clear();
19481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (unsigned i = 0; i < m_numPendingConnectionRequests; ++i)
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_connection->send(Messages::PluginProcess::CreateWebProcessConnection(), 0);
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_numPendingConnectionRequests = 0;
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProcessProxy::didCreateWebProcessConnection(const CoreIPC::MachPort& machPort)
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_pendingConnectionReplies.isEmpty());
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Grab the first pending connection reply.
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RefPtr<WebProcessProxy> replyWebProcessProxy = m_pendingConnectionReplies.first().first.release();
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CoreIPC::ArgumentEncoder* reply = m_pendingConnectionReplies.first().second;
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pendingConnectionReplies.removeFirst();
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: This is Mac specific.
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    reply->encode(CoreIPC::MachPort(machPort.port(), MACH_MSG_TYPE_MOVE_SEND));
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    replyWebProcessProxy->connection()->sendSyncReply(reply);
21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid PluginProcessProxy::didGetSitesWithData(const Vector<String>& sites, uint64_t callbackID)
21681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
21781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<WebPluginSiteDataManager> webPluginSiteDataManager = m_pendingGetSitesReplies.take(callbackID);
21881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(webPluginSiteDataManager);
21981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
22081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webPluginSiteDataManager->didGetSitesWithDataForSinglePlugin(sites, callbackID);
22181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
22281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
22381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid PluginProcessProxy::didClearSiteData(uint64_t callbackID)
22481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
22581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<WebPluginSiteDataManager> webPluginSiteDataManager = m_pendingClearSiteDataReplies.take(callbackID);
22681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(webPluginSiteDataManager);
22781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
22881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webPluginSiteDataManager->didClearSiteDataForSinglePlugin(callbackID);
22981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
23081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // ENABLE(PLUGIN_PROCESS)
234