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 "WebProcessConnection.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(PLUGIN_PROCESS)
302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NPRemoteObjectMap.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PluginControllerProxy.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PluginProcess.h"
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "RunLoop.h"
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<WebProcessConnection> WebProcessConnection::create(CoreIPC::Connection::Identifier connectionIdentifier)
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return adoptRef(new WebProcessConnection(connectionIdentifier));
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebProcessConnection::~WebProcessConnection()
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_pluginControllers.isEmpty());
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_npRemoteObjectMap);
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_connection);
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebProcessConnection::WebProcessConnection(CoreIPC::Connection::Identifier connectionIdentifier)
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection = CoreIPC::Connection::createServerConnection(connectionIdentifier, this, RunLoop::main());
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_npRemoteObjectMap = NPRemoteObjectMap::create(m_connection.get());
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
552bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_connection->setOnlySendMessagesAsDispatchWhenWaitingForSyncReplyWhenProcessingSuchAMessage(true);
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->open();
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcessConnection::addPluginControllerProxy(PassOwnPtr<PluginControllerProxy> pluginController)
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t pluginInstanceID = pluginController->pluginInstanceID();
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_pluginControllers.contains(pluginInstanceID));
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginControllers.set(pluginInstanceID, pluginController.leakPtr());
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcessConnection::destroyPluginControllerProxy(PluginControllerProxy* pluginController)
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // This may end up calling removePluginControllerProxy which ends up deleting
7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // the WebProcessConnection object if this was the last object.
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    pluginController->destroy();
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
742bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebProcessConnection::removePluginControllerProxy(PluginControllerProxy* pluginController, Plugin* plugin)
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(m_pluginControllers.contains(pluginController->pluginInstanceID()));
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        OwnPtr<PluginControllerProxy> pluginControllerOwnPtr = adoptPtr(m_pluginControllers.take(pluginController->pluginInstanceID()));
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(pluginControllerOwnPtr == pluginController);
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
822bde8e466a4451c7319e3a072d118917957d6554Steve Block
832bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Invalidate all objects related to this plug-in.
842bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (plugin)
852bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_npRemoteObjectMap->pluginDestroyed(plugin);
862bde8e466a4451c7319e3a072d118917957d6554Steve Block
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_pluginControllers.isEmpty())
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_npRemoteObjectMap = nullptr;
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // The last plug-in went away, close this connection.
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->invalidate();
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection = nullptr;
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // This will cause us to be deleted.
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    PluginProcess::shared().removeWebProcessConnection(this);
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcessConnection::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments)
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!arguments->destinationID()) {
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT_NOT_REACHED();
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
10681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
10781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    PluginControllerProxy* pluginControllerProxy = m_pluginControllers.get(arguments->destinationID());
10881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!pluginControllerProxy)
10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
11081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
11181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    PluginController::PluginDestructionProtector protector(pluginControllerProxy->asPluginController());
11281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
11381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    pluginControllerProxy->didReceivePluginControllerProxyMessage(connection, messageID, arguments);
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochCoreIPC::SyncReplyMode WebProcessConnection::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments, CoreIPC::ArgumentEncoder* reply)
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t destinationID = arguments->destinationID();
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!destinationID)
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return didReceiveSyncWebProcessConnectionMessage(connection, messageID, arguments, reply);
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (messageID.is<CoreIPC::MessageClassNPObjectMessageReceiver>())
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return m_npRemoteObjectMap->didReceiveSyncMessage(connection, messageID, arguments, reply);
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    PluginControllerProxy* pluginControllerProxy = m_pluginControllers.get(arguments->destinationID());
12781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!pluginControllerProxy)
12881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return CoreIPC::AutomaticReply;
12981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
13081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    PluginController::PluginDestructionProtector protector(pluginControllerProxy->asPluginController());
13181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    CoreIPC::SyncReplyMode replyMode = pluginControllerProxy->didReceiveSyncPluginControllerProxyMessage(connection, messageID, arguments, reply);
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return replyMode;
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcessConnection::didClose(CoreIPC::Connection*)
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // The web process crashed. Destroy all the plug-in controllers. Destroying the last plug-in controller
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // will cause the web process connection itself to be destroyed.
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<PluginControllerProxy*> pluginControllers;
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    copyValuesToVector(m_pluginControllers, pluginControllers);
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < pluginControllers.size(); ++i)
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destroyPluginControllerProxy(pluginControllers[i]);
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcessConnection::destroyPlugin(uint64_t pluginInstanceID)
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    PluginControllerProxy* pluginControllerProxy = m_pluginControllers.get(pluginInstanceID);
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(pluginControllerProxy);
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    destroyPluginControllerProxy(pluginControllerProxy);
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcessConnection::didReceiveInvalidMessage(CoreIPC::Connection*, CoreIPC::MessageID)
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: Implement.
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebProcessConnection::syncMessageSendTimedOut(CoreIPC::Connection*)
1612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcessConnection::createPlugin(uint64_t pluginInstanceID, const Plugin::Parameters& parameters, const String& userAgent, bool isPrivateBrowsingEnabled, bool isAcceleratedCompositingEnabled, bool& result, uint32_t& remoteLayerClientID)
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    OwnPtr<PluginControllerProxy> pluginControllerProxy = PluginControllerProxy::create(this, pluginInstanceID, userAgent, isPrivateBrowsingEnabled, isAcceleratedCompositingEnabled);
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    PluginControllerProxy* pluginControllerProxyPtr = pluginControllerProxy.get();
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Make sure to add the proxy to the map before initializing it, since the plug-in might call out to the web process from
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // its NPP_New function. This will hand over ownership of the proxy to the web process connection.
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    addPluginControllerProxy(pluginControllerProxy.release());
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Now try to initialize the plug-in.
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    result = pluginControllerProxyPtr->initialize(parameters);
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1772bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!result)
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(MAC)
1812bde8e466a4451c7319e3a072d118917957d6554Steve Block    remoteLayerClientID = pluginControllerProxyPtr->remoteLayerClientID();
1822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // ENABLE(PLUGIN_PROCESS)
188