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 "NPObjectProxy.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(PLUGIN_PROCESS)
302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ArgumentCoders.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "Connection.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NPIdentifierData.h"
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NPObjectMessageReceiverMessages.h"
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NPRemoteObjectMap.h"
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NPRuntimeUtilities.h"
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NPVariantData.h"
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
412bde8e466a4451c7319e3a072d118917957d6554Steve BlockNPObjectProxy* NPObjectProxy::create(NPRemoteObjectMap* npRemoteObjectMap, Plugin* plugin, uint64_t npObjectID)
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPObjectProxy* npObjectProxy = toNPObjectProxy(createNPObject(0, npClass()));
442bde8e466a4451c7319e3a072d118917957d6554Steve Block    npObjectProxy->initialize(npRemoteObjectMap, plugin, npObjectID);
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return npObjectProxy;
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNPObjectProxy::NPObjectProxy()
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    : m_npRemoteObjectMap(0)
512bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_plugin(0)
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_npObjectID(0)
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNPObjectProxy::~NPObjectProxy()
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap)
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_npRemoteObjectMap->npObjectProxyDestroyed(this);
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::Deallocate(), Messages::NPObjectMessageReceiver::Deallocate::Reply(), m_npObjectID);
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::isNPObjectProxy(NPObject* npObject)
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return npObject->_class == npClass();
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NPObjectProxy::invalidate()
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_npRemoteObjectMap);
732bde8e466a4451c7319e3a072d118917957d6554Steve Block    ASSERT(m_plugin);
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_npRemoteObjectMap = 0;
762bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_plugin = 0;
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
792bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid NPObjectProxy::initialize(NPRemoteObjectMap* npRemoteObjectMap, Plugin* plugin, uint64_t npObjectID)
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_npRemoteObjectMap);
822bde8e466a4451c7319e3a072d118917957d6554Steve Block    ASSERT(!m_plugin);
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_npObjectID);
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(npRemoteObjectMap);
862bde8e466a4451c7319e3a072d118917957d6554Steve Block    ASSERT(plugin);
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(npObjectID);
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_npRemoteObjectMap = npRemoteObjectMap;
902bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_plugin = plugin;
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_npObjectID = npObjectID;
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::hasMethod(NPIdentifier methodName)
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap)
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPIdentifierData methodNameData = NPIdentifierData::fromNPIdentifier(methodName);
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool returnValue = false;
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::HasMethod(methodNameData), Messages::NPObjectMessageReceiver::HasMethod::Reply(returnValue), m_npObjectID))
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return returnValue;
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::invoke(NPIdentifier methodName, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap)
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPIdentifierData methodNameData = NPIdentifierData::fromNPIdentifier(methodName);
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<NPVariantData> argumentsData;
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (uint32_t i = 0; i < argumentCount; ++i)
1172bde8e466a4451c7319e3a072d118917957d6554Steve Block        argumentsData.append(m_npRemoteObjectMap->npVariantToNPVariantData(arguments[i], m_plugin));
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool returnValue = false;
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPVariantData resultData;
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::Invoke(methodNameData, argumentsData), Messages::NPObjectMessageReceiver::Invoke::Reply(returnValue, resultData), m_npObjectID))
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!returnValue)
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1282bde8e466a4451c7319e3a072d118917957d6554Steve Block    *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData, m_plugin);
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::invokeDefault(const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap)
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<NPVariantData> argumentsData;
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (uint32_t i = 0; i < argumentCount; ++i)
1392bde8e466a4451c7319e3a072d118917957d6554Steve Block        argumentsData.append(m_npRemoteObjectMap->npVariantToNPVariantData(arguments[i], m_plugin));
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool returnValue = false;
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPVariantData resultData;
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::InvokeDefault(argumentsData), Messages::NPObjectMessageReceiver::InvokeDefault::Reply(returnValue, resultData), m_npObjectID))
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!returnValue)
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1502bde8e466a4451c7319e3a072d118917957d6554Steve Block    *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData, m_plugin);
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::hasProperty(NPIdentifier propertyName)
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap)
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPIdentifierData propertyNameData = NPIdentifierData::fromNPIdentifier(propertyName);
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool returnValue = false;
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::HasProperty(propertyNameData), Messages::NPObjectMessageReceiver::HasProperty::Reply(returnValue), m_npObjectID))
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return returnValue;
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::getProperty(NPIdentifier propertyName, NPVariant* result)
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap)
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPIdentifierData propertyNameData = NPIdentifierData::fromNPIdentifier(propertyName);
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool returnValue = false;
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPVariantData resultData;
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::GetProperty(propertyNameData), Messages::NPObjectMessageReceiver::GetProperty::Reply(returnValue, resultData), m_npObjectID))
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!returnValue)
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1852bde8e466a4451c7319e3a072d118917957d6554Steve Block    *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData, m_plugin);
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::setProperty(NPIdentifier propertyName, const NPVariant* value)
19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap)
19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPIdentifierData propertyNameData = NPIdentifierData::fromNPIdentifier(propertyName);
1952bde8e466a4451c7319e3a072d118917957d6554Steve Block    NPVariantData propertyValueData = m_npRemoteObjectMap->npVariantToNPVariantData(*value, m_plugin);
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool returnValue = false;
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::SetProperty(propertyNameData, propertyValueData), Messages::NPObjectMessageReceiver::SetProperty::Reply(returnValue), m_npObjectID))
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return returnValue;
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::removeProperty(NPIdentifier propertyName)
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap)
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPIdentifierData propertyNameData = NPIdentifierData::fromNPIdentifier(propertyName);
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool returnValue = false;
21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::RemoveProperty(propertyNameData), Messages::NPObjectMessageReceiver::RemoveProperty::Reply(returnValue), m_npObjectID))
21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return returnValue;
21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::enumerate(NPIdentifier** identifiers, uint32_t* identifierCount)
22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap)
22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool returnValue;
22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<NPIdentifierData> identifiersData;
22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::Enumerate(), Messages::NPObjectMessageReceiver::Enumerate::Reply(returnValue, identifiersData), m_npObjectID))
22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!returnValue)
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPIdentifier* nameIdentifiers = npnMemNewArray<NPIdentifier>(identifiersData.size());
23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < identifiersData.size(); ++i)
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        nameIdentifiers[i] = identifiersData[i].createNPIdentifier();
23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    *identifiers = nameIdentifiers;
24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    *identifierCount = identifiersData.size();
24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::construct(const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap)
24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<NPVariantData> argumentsData;
25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (uint32_t i = 0; i < argumentCount; ++i)
2512bde8e466a4451c7319e3a072d118917957d6554Steve Block        argumentsData.append(m_npRemoteObjectMap->npVariantToNPVariantData(arguments[i], m_plugin));
25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool returnValue = false;
25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPVariantData resultData;
25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::Construct(argumentsData), Messages::NPObjectMessageReceiver::Construct::Reply(returnValue, resultData), m_npObjectID))
25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!returnValue)
26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2622bde8e466a4451c7319e3a072d118917957d6554Steve Block    *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData, m_plugin);
26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNPClass* NPObjectProxy::npClass()
26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static NPClass npClass = {
26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_CLASS_STRUCT_VERSION,
27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_Allocate,
27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_Deallocate,
27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        0,
27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_HasMethod,
27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_Invoke,
27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_InvokeDefault,
27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_HasProperty,
27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_GetProperty,
27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_SetProperty,
27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_RemoveProperty,
28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_Enumerate,
28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_Construct
28265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    };
28365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return &npClass;
28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNPObject* NPObjectProxy::NP_Allocate(NPP npp, NPClass*)
28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_UNUSED(npp, !npp);
29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return new NPObjectProxy;
29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NPObjectProxy::NP_Deallocate(NPObject* npObject)
29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPObjectProxy* npObjectProxy = toNPObjectProxy(npObject);
29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    delete npObjectProxy;
29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::NP_HasMethod(NPObject* npObject, NPIdentifier methodName)
30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPObjectProxy(npObject)->hasMethod(methodName);
30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::NP_Invoke(NPObject* npObject, NPIdentifier methodName, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPObjectProxy(npObject)->invoke(methodName, arguments, argumentCount, result);
30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::NP_InvokeDefault(NPObject* npObject, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
31165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
31265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPObjectProxy(npObject)->invokeDefault(arguments, argumentCount, result);
31365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
31465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::NP_HasProperty(NPObject* npObject, NPIdentifier propertyName)
31665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
31765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPObjectProxy(npObject)->hasProperty(propertyName);
31865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
31965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
32065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::NP_GetProperty(NPObject* npObject, NPIdentifier propertyName, NPVariant* result)
32165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPObjectProxy(npObject)->getProperty(propertyName, result);
32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::NP_SetProperty(NPObject* npObject, NPIdentifier propertyName, const NPVariant* value)
32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
32765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPObjectProxy(npObject)->setProperty(propertyName, value);
32865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
32965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::NP_RemoveProperty(NPObject* npObject, NPIdentifier propertyName)
33165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
33265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPObjectProxy(npObject)->removeProperty(propertyName);
33365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
33465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::NP_Enumerate(NPObject* npObject, NPIdentifier** identifiers, uint32_t* identifierCount)
33665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
33765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPObjectProxy(npObject)->enumerate(identifiers, identifierCount);
33865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
33965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPObjectProxy::NP_Construct(NPObject* npObject, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
34165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
34265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPObjectProxy(npObject)->construct(arguments, argumentCount, result);
34365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
34465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
34665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // ENABLE(PLUGIN_PROCESS)
348