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 "NPObjectMessageReceiver.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(PLUGIN_PROCESS)
302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NPIdentifierData.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NPRemoteObjectMap.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NPRuntimeUtilities.h"
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NPVariantData.h"
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
382bde8e466a4451c7319e3a072d118917957d6554Steve BlockPassOwnPtr<NPObjectMessageReceiver> NPObjectMessageReceiver::create(NPRemoteObjectMap* npRemoteObjectMap, Plugin* plugin, uint64_t npObjectID, NPObject* npObject)
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
402bde8e466a4451c7319e3a072d118917957d6554Steve Block    return adoptPtr(new NPObjectMessageReceiver(npRemoteObjectMap, plugin, npObjectID, npObject));
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
432bde8e466a4451c7319e3a072d118917957d6554Steve BlockNPObjectMessageReceiver::NPObjectMessageReceiver(NPRemoteObjectMap* npRemoteObjectMap, Plugin* plugin, uint64_t npObjectID, NPObject* npObject)
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    : m_npRemoteObjectMap(npRemoteObjectMap)
452bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_plugin(plugin)
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_npObjectID(npObjectID)
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_npObject(npObject)
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    retainNPObject(m_npObject);
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNPObjectMessageReceiver::~NPObjectMessageReceiver()
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_npRemoteObjectMap->unregisterNPObject(m_npObjectID);
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    releaseNPObject(m_npObject);
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NPObjectMessageReceiver::deallocate()
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    delete this;
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NPObjectMessageReceiver::hasMethod(const NPIdentifierData& methodNameData, bool& returnValue)
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npObject->_class->hasMethod) {
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        returnValue = false;
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    returnValue = m_npObject->_class->hasMethod(m_npObject, methodNameData.createNPIdentifier());
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NPObjectMessageReceiver::invoke(const NPIdentifierData& methodNameData, const Vector<NPVariantData>& argumentsData, bool& returnValue, NPVariantData& resultData)
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npObject->_class->invoke) {
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        returnValue = false;
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<NPVariant> arguments;
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < argumentsData.size(); ++i)
832bde8e466a4451c7319e3a072d118917957d6554Steve Block        arguments.append(m_npRemoteObjectMap->npVariantDataToNPVariant(argumentsData[i], m_plugin));
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPVariant result;
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    VOID_TO_NPVARIANT(result);
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    returnValue = m_npObject->_class->invoke(m_npObject, methodNameData.createNPIdentifier(), arguments.data(), arguments.size(), &result);
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (returnValue) {
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Convert the NPVariant to an NPVariantData.
912bde8e466a4451c7319e3a072d118917957d6554Steve Block        resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result, m_plugin);
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Release all arguments.
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < argumentsData.size(); ++i)
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        releaseNPVariantValue(&arguments[i]);
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // And release the result.
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    releaseNPVariantValue(&result);
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NPObjectMessageReceiver::invokeDefault(const Vector<NPVariantData>& argumentsData, bool& returnValue, NPVariantData& resultData)
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npObject->_class->invokeDefault) {
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        returnValue = false;
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<NPVariant> arguments;
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < argumentsData.size(); ++i)
1112bde8e466a4451c7319e3a072d118917957d6554Steve Block        arguments.append(m_npRemoteObjectMap->npVariantDataToNPVariant(argumentsData[i], m_plugin));
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPVariant result;
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    VOID_TO_NPVARIANT(result);
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    returnValue = m_npObject->_class->invokeDefault(m_npObject, arguments.data(), arguments.size(), &result);
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (returnValue) {
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Convert the NPVariant to an NPVariantData.
1192bde8e466a4451c7319e3a072d118917957d6554Steve Block        resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result, m_plugin);
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Release all arguments.
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < argumentsData.size(); ++i)
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        releaseNPVariantValue(&arguments[i]);
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // And release the result.
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    releaseNPVariantValue(&result);
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NPObjectMessageReceiver::hasProperty(const NPIdentifierData& propertyNameData, bool& returnValue)
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npObject->_class->hasProperty) {
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        returnValue = false;
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    returnValue = m_npObject->_class->hasProperty(m_npObject, propertyNameData.createNPIdentifier());
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NPObjectMessageReceiver::getProperty(const NPIdentifierData& propertyNameData, bool& returnValue, NPVariantData& resultData)
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npObject->_class->getProperty) {
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        returnValue = false;
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPVariant result;
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    returnValue = m_npObject->_class->getProperty(m_npObject, propertyNameData.createNPIdentifier(), &result);
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!returnValue)
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Convert the NPVariant to an NPVariantData.
1532bde8e466a4451c7319e3a072d118917957d6554Steve Block    resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result, m_plugin);
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // And release the result.
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    releaseNPVariantValue(&result);
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NPObjectMessageReceiver::setProperty(const NPIdentifierData& propertyNameData, const NPVariantData& propertyValueData, bool& returnValue)
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npObject->_class->setProperty) {
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        returnValue = false;
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1662bde8e466a4451c7319e3a072d118917957d6554Steve Block    NPVariant propertyValue = m_npRemoteObjectMap->npVariantDataToNPVariant(propertyValueData, m_plugin);
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Set the property.
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    returnValue = m_npObject->_class->setProperty(m_npObject, propertyNameData.createNPIdentifier(), &propertyValue);
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // And release the value.
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    releaseNPVariantValue(&propertyValue);
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NPObjectMessageReceiver::removeProperty(const NPIdentifierData& propertyNameData, bool& returnValue)
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_npObject->_class->removeProperty) {
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        returnValue = false;
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    returnValue = m_npObject->_class->removeProperty(m_npObject, propertyNameData.createNPIdentifier());
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NPObjectMessageReceiver::enumerate(bool& returnValue, Vector<NPIdentifierData>& identifiersData)
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!NP_CLASS_STRUCT_VERSION_HAS_ENUM(m_npObject->_class) || !m_npObject->_class->enumerate) {
18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        returnValue = false;
18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPIdentifier* identifiers = 0;
19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint32_t identifierCount = 0;
19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    returnValue = m_npObject->_class->enumerate(m_npObject, &identifiers, &identifierCount);
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!returnValue)
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (uint32_t i = 0; i < identifierCount; ++i)
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        identifiersData.append(NPIdentifierData::fromNPIdentifier(identifiers[i]));
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    npnMemFree(identifiers);
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NPObjectMessageReceiver::construct(const Vector<NPVariantData>& argumentsData, bool& returnValue, NPVariantData& resultData)
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!NP_CLASS_STRUCT_VERSION_HAS_CTOR(m_npObject->_class) || !m_npObject->_class->construct) {
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        returnValue = false;
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<NPVariant> arguments;
21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < argumentsData.size(); ++i)
2142bde8e466a4451c7319e3a072d118917957d6554Steve Block        arguments.append(m_npRemoteObjectMap->npVariantDataToNPVariant(argumentsData[i], m_plugin));
21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPVariant result;
21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    VOID_TO_NPVARIANT(result);
21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    returnValue = m_npObject->_class->construct(m_npObject, arguments.data(), arguments.size(), &result);
22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (returnValue) {
22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Convert the NPVariant to an NPVariantData.
2222bde8e466a4451c7319e3a072d118917957d6554Steve Block        resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result, m_plugin);
22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Release all arguments.
22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < argumentsData.size(); ++i)
22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        releaseNPVariantValue(&arguments[i]);
22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // And release the result.
23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    releaseNPVariantValue(&result);
23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // ENABLE(PLUGIN_PROCESS)
23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
237