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 "PluginProxy.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(PLUGIN_PROCESS)
302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "DataReference.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NPRemoteObjectMap.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NPRuntimeUtilities.h"
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NPVariantData.h"
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PluginController.h"
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PluginControllerProxyMessages.h"
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PluginProcessConnection.h"
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PluginProcessConnectionManager.h"
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ShareableBitmap.h"
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebCoreArgumentCoders.h"
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebEvent.h"
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebProcessConnectionMessages.h"
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/GraphicsContext.h>
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic uint64_t generatePluginInstanceID()
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static uint64_t uniquePluginInstanceID;
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return ++uniquePluginInstanceID;
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<PluginProxy> PluginProxy::create(const String& pluginPath)
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return adoptRef(new PluginProxy(pluginPath));
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPluginProxy::PluginProxy(const String& pluginPath)
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    : m_pluginPath(pluginPath)
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_pluginInstanceID(generatePluginInstanceID())
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_pluginController(0)
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_pluginBackingStoreContainsValidData(false)
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_isStarted(false)
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_waitingForPaintInResponseToUpdate(false)
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_remoteLayerClientID(0)
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPluginProxy::~PluginProxy()
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::pluginProcessCrashed()
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_pluginController)
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_pluginController->pluginProcessCrashed();
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool PluginProxy::initialize(PluginController* pluginController, const Parameters& parameters)
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_pluginController);
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(pluginController);
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginController = pluginController;
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_connection);
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection = PluginProcessConnectionManager::shared().getPluginProcessConnection(m_pluginPath);
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_connection)
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Add the plug-in proxy before creating the plug-in; it needs to be in the map because CreatePlugin
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // can call back out to the plug-in proxy.
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->addPluginProxy(this);
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Ask the plug-in process to create a plug-in.
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool result = false;
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint32_t remoteLayerClientID = 0;
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_connection->connection()->sendSync(Messages::WebProcessConnection::CreatePlugin(m_pluginInstanceID, parameters, pluginController->userAgent(), pluginController->isPrivateBrowsingEnabled(), pluginController->isAcceleratedCompositingEnabled()), Messages::WebProcessConnection::CreatePlugin::Reply(result, remoteLayerClientID), 0) || !result) {
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_connection->removePluginProxy(this);
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_remoteLayerClientID = remoteLayerClientID;
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_isStarted = true;
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::destroy()
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_isStarted);
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->sendSync(Messages::WebProcessConnection::DestroyPlugin(m_pluginInstanceID), Messages::WebProcessConnection::DestroyPlugin::Reply(), 0);
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_isStarted = false;
12081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_pluginController = 0;
12181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->removePluginProxy(this);
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::paint(GraphicsContext* graphicsContext, const IntRect& dirtyRect)
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!needsBackingStore() || !m_backingStore)
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_pluginBackingStoreContainsValidData) {
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_connection->connection()->sendSync(Messages::PluginControllerProxy::PaintEntirePlugin(), Messages::PluginControllerProxy::PaintEntirePlugin::Reply(), m_pluginInstanceID);
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Blit the plug-in backing store into our own backing store.
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        OwnPtr<WebCore::GraphicsContext> graphicsContext = m_backingStore->createGraphicsContext();
1352bde8e466a4451c7319e3a072d118917957d6554Steve Block        graphicsContext->setCompositeOperation(CompositeCopy);
1362bde8e466a4451c7319e3a072d118917957d6554Steve Block
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_pluginBackingStore->paint(*graphicsContext, IntPoint(), IntRect(0, 0, m_frameRect.width(), m_frameRect.height()));
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_pluginBackingStoreContainsValidData = true;
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntRect dirtyRectInPluginCoordinates = dirtyRect;
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    dirtyRectInPluginCoordinates.move(-m_frameRect.x(), -m_frameRect.y());
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_backingStore->paint(*graphicsContext, dirtyRect.location(), dirtyRectInPluginCoordinates);
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_waitingForPaintInResponseToUpdate) {
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_waitingForPaintInResponseToUpdate = false;
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_connection->connection()->send(Messages::PluginControllerProxy::DidUpdate(), m_pluginInstanceID);
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochPassRefPtr<ShareableBitmap> PluginProxy::snapshot()
15581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
1562bde8e466a4451c7319e3a072d118917957d6554Steve Block    ShareableBitmap::Handle snapshotStoreHandle;
1572bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_connection->connection()->sendSync(Messages::PluginControllerProxy::Snapshot(), Messages::PluginControllerProxy::Snapshot::Reply(snapshotStoreHandle), m_pluginInstanceID);
15881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
1592bde8e466a4451c7319e3a072d118917957d6554Steve Block    RefPtr<ShareableBitmap> snapshotBuffer = ShareableBitmap::create(snapshotStoreHandle);
16081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return snapshotBuffer.release();
16181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
16281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
1632bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool PluginProxy::isTransparent()
1642bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1652bde8e466a4451c7319e3a072d118917957d6554Steve Block    // This should never be called from the web process.
1662bde8e466a4451c7319e3a072d118917957d6554Steve Block    ASSERT_NOT_REACHED();
1672bde8e466a4451c7319e3a072d118917957d6554Steve Block    return false;
1682bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1692bde8e466a4451c7319e3a072d118917957d6554Steve Block
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::geometryDidChange(const IntRect& frameRect, const IntRect& clipRect)
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_isStarted);
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_frameRect = frameRect;
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!needsBackingStore()) {
1772bde8e466a4451c7319e3a072d118917957d6554Steve Block        ShareableBitmap::Handle pluginBackingStoreHandle;
1782bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_connection->connection()->send(Messages::PluginControllerProxy::GeometryDidChange(frameRect, clipRect, pluginBackingStoreHandle), m_pluginInstanceID, CoreIPC::DispatchMessageEvenWhenWaitingForSyncReply);
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool didUpdateBackingStore = false;
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_backingStore) {
1842bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_backingStore = ShareableBitmap::create(frameRect.size(), ShareableBitmap::SupportsAlpha);
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        didUpdateBackingStore = true;
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    } else if (frameRect.size() != m_backingStore->size()) {
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // The backing store already exists, just resize it.
18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!m_backingStore->resize(frameRect.size()))
18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return;
19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        didUpdateBackingStore = true;
19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1942bde8e466a4451c7319e3a072d118917957d6554Steve Block    ShareableBitmap::Handle pluginBackingStoreHandle;
19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (didUpdateBackingStore) {
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Create a new plug-in backing store.
1982bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_pluginBackingStore = ShareableBitmap::createShareable(frameRect.size(), ShareableBitmap::SupportsAlpha);
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!m_pluginBackingStore)
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return;
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Create a handle to the plug-in backing store so we can send it over.
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!m_pluginBackingStore->createHandle(pluginBackingStoreHandle)) {
2042bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_pluginBackingStore = nullptr;
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return;
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_pluginBackingStoreContainsValidData = false;
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2112bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_connection->connection()->send(Messages::PluginControllerProxy::GeometryDidChange(frameRect, clipRect, pluginBackingStoreHandle), m_pluginInstanceID, CoreIPC::DispatchMessageEvenWhenWaitingForSyncReply);
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::frameDidFinishLoading(uint64_t requestID)
21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->send(Messages::PluginControllerProxy::FrameDidFinishLoading(requestID), m_pluginInstanceID);
21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::frameDidFail(uint64_t requestID, bool wasCancelled)
22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->send(Messages::PluginControllerProxy::FrameDidFail(requestID, wasCancelled), m_pluginInstanceID);
22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::didEvaluateJavaScript(uint64_t requestID, const WTF::String& requestURLString, const WTF::String& result)
22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->send(Messages::PluginControllerProxy::DidEvaluateJavaScript(requestID, requestURLString, result), m_pluginInstanceID);
22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::streamDidReceiveResponse(uint64_t streamID, const KURL& responseURL, uint32_t streamLength, uint32_t lastModifiedTime, const WTF::String& mimeType, const WTF::String& headers)
23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->send(Messages::PluginControllerProxy::StreamDidReceiveResponse(streamID, responseURL.string(), streamLength, lastModifiedTime, mimeType, headers), m_pluginInstanceID);
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::streamDidReceiveData(uint64_t streamID, const char* bytes, int length)
23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->send(Messages::PluginControllerProxy::StreamDidReceiveData(streamID, CoreIPC::DataReference(reinterpret_cast<const uint8_t*>(bytes), length)), m_pluginInstanceID);
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::streamDidFinishLoading(uint64_t streamID)
24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->send(Messages::PluginControllerProxy::StreamDidFinishLoading(streamID), m_pluginInstanceID);
24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::streamDidFail(uint64_t streamID, bool wasCancelled)
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->send(Messages::PluginControllerProxy::StreamDidFail(streamID, wasCancelled), m_pluginInstanceID);
24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::manualStreamDidReceiveResponse(const KURL& responseURL, uint32_t streamLength,  uint32_t lastModifiedTime, const WTF::String& mimeType, const WTF::String& headers)
25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->send(Messages::PluginControllerProxy::ManualStreamDidReceiveResponse(responseURL.string(), streamLength, lastModifiedTime, mimeType, headers), m_pluginInstanceID);
25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::manualStreamDidReceiveData(const char* bytes, int length)
25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->send(Messages::PluginControllerProxy::ManualStreamDidReceiveData(CoreIPC::DataReference(reinterpret_cast<const uint8_t*>(bytes), length)), m_pluginInstanceID);
25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::manualStreamDidFinishLoading()
26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->send(Messages::PluginControllerProxy::ManualStreamDidFinishLoading(), m_pluginInstanceID);
26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::manualStreamDidFail(bool wasCancelled)
26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->send(Messages::PluginControllerProxy::ManualStreamDidFail(wasCancelled), m_pluginInstanceID);
26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool PluginProxy::handleMouseEvent(const WebMouseEvent& mouseEvent)
27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool handled = false;
27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_connection->connection()->sendSync(Messages::PluginControllerProxy::HandleMouseEvent(mouseEvent), Messages::PluginControllerProxy::HandleMouseEvent::Reply(handled), m_pluginInstanceID))
27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return handled;
27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool PluginProxy::handleWheelEvent(const WebWheelEvent& wheelEvent)
27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool handled = false;
28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_connection->connection()->sendSync(Messages::PluginControllerProxy::HandleWheelEvent(wheelEvent), Messages::PluginControllerProxy::HandleWheelEvent::Reply(handled), m_pluginInstanceID))
28265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
28365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return handled;
28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool PluginProxy::handleMouseEnterEvent(const WebMouseEvent& mouseEnterEvent)
28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool handled = false;
29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_connection->connection()->sendSync(Messages::PluginControllerProxy::HandleMouseEnterEvent(mouseEnterEvent), Messages::PluginControllerProxy::HandleMouseEnterEvent::Reply(handled), m_pluginInstanceID))
29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return handled;
29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool PluginProxy::handleMouseLeaveEvent(const WebMouseEvent& mouseLeaveEvent)
29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool handled = false;
29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_connection->connection()->sendSync(Messages::PluginControllerProxy::HandleMouseLeaveEvent(mouseLeaveEvent), Messages::PluginControllerProxy::HandleMouseLeaveEvent::Reply(handled), m_pluginInstanceID))
30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return handled;
30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool PluginProxy::handleKeyboardEvent(const WebKeyboardEvent& keyboardEvent)
30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool handled = false;
30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_connection->connection()->sendSync(Messages::PluginControllerProxy::HandleKeyboardEvent(keyboardEvent), Messages::PluginControllerProxy::HandleKeyboardEvent::Reply(handled), m_pluginInstanceID))
30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return handled;
31265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
31365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::setFocus(bool hasFocus)
31565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
31665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->send(Messages::PluginControllerProxy::SetFocus(hasFocus), m_pluginInstanceID);
31765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
31865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNPObject* PluginProxy::pluginScriptableNPObject()
32065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
32165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t pluginScriptableNPObjectID = 0;
32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_connection->connection()->sendSync(Messages::PluginControllerProxy::GetPluginScriptableNPObject(), Messages::PluginControllerProxy::GetPluginScriptableNPObject::Reply(pluginScriptableNPObjectID), m_pluginInstanceID))
32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!pluginScriptableNPObjectID)
32765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
32865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3292bde8e466a4451c7319e3a072d118917957d6554Steve Block    return m_connection->npRemoteObjectMap()->createNPObjectProxy(pluginScriptableNPObjectID, this);
33065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
33165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC)
33365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::windowFocusChanged(bool hasFocus)
33465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
33565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->send(Messages::PluginControllerProxy::WindowFocusChanged(hasFocus), m_pluginInstanceID);
33665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
33765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::windowAndViewFramesChanged(const WebCore::IntRect& windowFrameInScreenCoordinates, const WebCore::IntRect& viewFrameInWindowCoordinates)
33965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
34065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->send(Messages::PluginControllerProxy::WindowAndViewFramesChanged(windowFrameInScreenCoordinates, viewFrameInWindowCoordinates), m_pluginInstanceID);
34165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
34265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::windowVisibilityChanged(bool isVisible)
34465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
34565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->send(Messages::PluginControllerProxy::WindowVisibilityChanged(isVisible), m_pluginInstanceID);
34665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
34765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochuint64_t PluginProxy::pluginComplexTextInputIdentifier() const
34965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
35065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_pluginInstanceID;
35165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
35265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::sendComplexTextInput(const String& textInput)
35465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
35565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->send(Messages::PluginControllerProxy::SendComplexTextInput(textInput), m_pluginInstanceID);
35665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
35765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
35965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
36065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::privateBrowsingStateChanged(bool isPrivateBrowsingEnabled)
36165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
36265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->connection()->send(Messages::PluginControllerProxy::PrivateBrowsingStateChanged(isPrivateBrowsingEnabled), m_pluginInstanceID);
36365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
36465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
36565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPluginController* PluginProxy::controller()
36665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
36765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_pluginController;
36865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
36965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::loadURL(uint64_t requestID, const String& method, const String& urlString, const String& target, const HTTPHeaderMap& headerFields, const Vector<uint8_t>& httpBody, bool allowPopups)
37165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
37265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginController->loadURL(requestID, method, urlString, target, headerFields, httpBody, allowPopups);
37365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
37465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::proxiesForURL(const String& urlString, String& proxyString)
37665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
37765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    proxyString = m_pluginController->proxiesForURL(urlString);
37865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
37965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::cookiesForURL(const String& urlString, String& cookieString)
38165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
38265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    cookieString = m_pluginController->cookiesForURL(urlString);
38365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
38465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::setCookiesForURL(const String& urlString, const String& cookieString)
38665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
38765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginController->setCookiesForURL(urlString, cookieString);
38865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
38965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
39065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::getWindowScriptNPObject(uint64_t& windowScriptNPObjectID)
39165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
39265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPObject* windowScriptNPObject = m_pluginController->windowScriptNPObject();
39365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!windowScriptNPObject) {
39465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        windowScriptNPObjectID = 0;
39565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
39665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
39765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3982bde8e466a4451c7319e3a072d118917957d6554Steve Block    windowScriptNPObjectID = m_connection->npRemoteObjectMap()->registerNPObject(windowScriptNPObject, this);
39965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    releaseNPObject(windowScriptNPObject);
40065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
40165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
40265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::getPluginElementNPObject(uint64_t& pluginElementNPObjectID)
40365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
40465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPObject* pluginElementNPObject = m_pluginController->pluginElementNPObject();
40565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!pluginElementNPObject) {
40665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        pluginElementNPObjectID = 0;
40765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
40865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
40965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4102bde8e466a4451c7319e3a072d118917957d6554Steve Block    pluginElementNPObjectID = m_connection->npRemoteObjectMap()->registerNPObject(pluginElementNPObject, this);
41165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    releaseNPObject(pluginElementNPObject);
41265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
41365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
41465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::evaluate(const NPVariantData& npObjectAsVariantData, const String& scriptString, bool allowPopups, bool& returnValue, NPVariantData& resultData)
41565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
41681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    PluginController::PluginDestructionProtector protector(m_pluginController);
41781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
4182bde8e466a4451c7319e3a072d118917957d6554Steve Block    NPVariant npObjectAsVariant = m_connection->npRemoteObjectMap()->npVariantDataToNPVariant(npObjectAsVariantData, this);
4192bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!NPVARIANT_IS_OBJECT(npObjectAsVariant) || !(NPVARIANT_TO_OBJECT(npObjectAsVariant))) {
4202bde8e466a4451c7319e3a072d118917957d6554Steve Block        returnValue = false;
4212bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
4222bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
4232bde8e466a4451c7319e3a072d118917957d6554Steve Block
42465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPVariant result;
42565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    returnValue = m_pluginController->evaluate(NPVARIANT_TO_OBJECT(npObjectAsVariant), scriptString, &result, allowPopups);
42665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!returnValue)
42765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
42865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
42965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Convert the NPVariant to an NPVariantData.
4302bde8e466a4451c7319e3a072d118917957d6554Steve Block    resultData = m_connection->npRemoteObjectMap()->npVariantToNPVariantData(result, this);
43165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
43265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // And release the result.
43365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    releaseNPVariantValue(&result);
43465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
43565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    releaseNPVariantValue(&npObjectAsVariant);
43665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
43765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
43865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::cancelStreamLoad(uint64_t streamID)
43965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
44065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginController->cancelStreamLoad(streamID);
44165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
44265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
44365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::cancelManualStreamLoad()
44465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
44565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginController->cancelManualStreamLoad();
44665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
44765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
44865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::setStatusbarText(const String& statusbarText)
44965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
45065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginController->setStatusbarText(statusbarText);
45165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
45265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
45365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC)
45465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::setComplexTextInputEnabled(bool complexTextInputEnabled)
45565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
45665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginController->setComplexTextInputEnabled(complexTextInputEnabled);
45765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
45865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
45965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
46065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProxy::update(const IntRect& paintedRect)
46165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
46265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (paintedRect == m_frameRect)
46365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_pluginBackingStoreContainsValidData = true;
46465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
46565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntRect paintedRectPluginCoordinates = paintedRect;
46665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    paintedRectPluginCoordinates.move(-m_frameRect.x(), -m_frameRect.y());
46765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
46865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_backingStore) {
46965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Blit the plug-in backing store into our own backing store.
47065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        OwnPtr<GraphicsContext> graphicsContext = m_backingStore->createGraphicsContext();
4712bde8e466a4451c7319e3a072d118917957d6554Steve Block        graphicsContext->setCompositeOperation(CompositeCopy);
47265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_pluginBackingStore->paint(*graphicsContext, paintedRectPluginCoordinates.location(),
47365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                    paintedRectPluginCoordinates);
47465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
47565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
47665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Ask the controller to invalidate the rect for us.
47765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_waitingForPaintInResponseToUpdate = true;
47865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginController->invalidate(paintedRectPluginCoordinates);
47965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
48065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
48165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
48265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
48365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // ENABLE(PLUGIN_PROCESS)
484