Home | History | Annotate | Download | only in Plugins
      1 /*
      2  * Copyright (C) 2010 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
     14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
     17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     23  * THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 #include "NPObjectProxy.h"
     28 
     29 #if ENABLE(PLUGIN_PROCESS)
     30 
     31 #include "ArgumentCoders.h"
     32 #include "Connection.h"
     33 #include "NPIdentifierData.h"
     34 #include "NPObjectMessageReceiverMessages.h"
     35 #include "NPRemoteObjectMap.h"
     36 #include "NPRuntimeUtilities.h"
     37 #include "NPVariantData.h"
     38 
     39 namespace WebKit {
     40 
     41 NPObjectProxy* NPObjectProxy::create(NPRemoteObjectMap* npRemoteObjectMap, Plugin* plugin, uint64_t npObjectID)
     42 {
     43     NPObjectProxy* npObjectProxy = toNPObjectProxy(createNPObject(0, npClass()));
     44     npObjectProxy->initialize(npRemoteObjectMap, plugin, npObjectID);
     45 
     46     return npObjectProxy;
     47 }
     48 
     49 NPObjectProxy::NPObjectProxy()
     50     : m_npRemoteObjectMap(0)
     51     , m_plugin(0)
     52     , m_npObjectID(0)
     53 {
     54 }
     55 
     56 NPObjectProxy::~NPObjectProxy()
     57 {
     58     if (!m_npRemoteObjectMap)
     59         return;
     60 
     61     m_npRemoteObjectMap->npObjectProxyDestroyed(this);
     62     m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::Deallocate(), Messages::NPObjectMessageReceiver::Deallocate::Reply(), m_npObjectID);
     63 }
     64 
     65 bool NPObjectProxy::isNPObjectProxy(NPObject* npObject)
     66 {
     67     return npObject->_class == npClass();
     68 }
     69 
     70 void NPObjectProxy::invalidate()
     71 {
     72     ASSERT(m_npRemoteObjectMap);
     73     ASSERT(m_plugin);
     74 
     75     m_npRemoteObjectMap = 0;
     76     m_plugin = 0;
     77 }
     78 
     79 void NPObjectProxy::initialize(NPRemoteObjectMap* npRemoteObjectMap, Plugin* plugin, uint64_t npObjectID)
     80 {
     81     ASSERT(!m_npRemoteObjectMap);
     82     ASSERT(!m_plugin);
     83     ASSERT(!m_npObjectID);
     84 
     85     ASSERT(npRemoteObjectMap);
     86     ASSERT(plugin);
     87     ASSERT(npObjectID);
     88 
     89     m_npRemoteObjectMap = npRemoteObjectMap;
     90     m_plugin = plugin;
     91     m_npObjectID = npObjectID;
     92 }
     93 
     94 bool NPObjectProxy::hasMethod(NPIdentifier methodName)
     95 {
     96     if (!m_npRemoteObjectMap)
     97         return false;
     98 
     99     NPIdentifierData methodNameData = NPIdentifierData::fromNPIdentifier(methodName);
    100 
    101     bool returnValue = false;
    102 
    103     if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::HasMethod(methodNameData), Messages::NPObjectMessageReceiver::HasMethod::Reply(returnValue), m_npObjectID))
    104         return false;
    105 
    106     return returnValue;
    107 }
    108 
    109 bool NPObjectProxy::invoke(NPIdentifier methodName, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
    110 {
    111     if (!m_npRemoteObjectMap)
    112         return false;
    113 
    114     NPIdentifierData methodNameData = NPIdentifierData::fromNPIdentifier(methodName);
    115     Vector<NPVariantData> argumentsData;
    116     for (uint32_t i = 0; i < argumentCount; ++i)
    117         argumentsData.append(m_npRemoteObjectMap->npVariantToNPVariantData(arguments[i], m_plugin));
    118 
    119     bool returnValue = false;
    120     NPVariantData resultData;
    121 
    122     if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::Invoke(methodNameData, argumentsData), Messages::NPObjectMessageReceiver::Invoke::Reply(returnValue, resultData), m_npObjectID))
    123         return false;
    124 
    125     if (!returnValue)
    126         return false;
    127 
    128     *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData, m_plugin);
    129     return true;
    130 }
    131 
    132 bool NPObjectProxy::invokeDefault(const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
    133 {
    134     if (!m_npRemoteObjectMap)
    135         return false;
    136 
    137     Vector<NPVariantData> argumentsData;
    138     for (uint32_t i = 0; i < argumentCount; ++i)
    139         argumentsData.append(m_npRemoteObjectMap->npVariantToNPVariantData(arguments[i], m_plugin));
    140 
    141     bool returnValue = false;
    142     NPVariantData resultData;
    143 
    144     if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::InvokeDefault(argumentsData), Messages::NPObjectMessageReceiver::InvokeDefault::Reply(returnValue, resultData), m_npObjectID))
    145         return false;
    146 
    147     if (!returnValue)
    148         return false;
    149 
    150     *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData, m_plugin);
    151     return true;
    152 }
    153 
    154 bool NPObjectProxy::hasProperty(NPIdentifier propertyName)
    155 {
    156     if (!m_npRemoteObjectMap)
    157         return false;
    158 
    159     NPIdentifierData propertyNameData = NPIdentifierData::fromNPIdentifier(propertyName);
    160 
    161     bool returnValue = false;
    162 
    163     if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::HasProperty(propertyNameData), Messages::NPObjectMessageReceiver::HasProperty::Reply(returnValue), m_npObjectID))
    164         return false;
    165 
    166     return returnValue;
    167 }
    168 
    169 bool NPObjectProxy::getProperty(NPIdentifier propertyName, NPVariant* result)
    170 {
    171     if (!m_npRemoteObjectMap)
    172         return false;
    173 
    174     NPIdentifierData propertyNameData = NPIdentifierData::fromNPIdentifier(propertyName);
    175 
    176     bool returnValue = false;
    177     NPVariantData resultData;
    178 
    179     if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::GetProperty(propertyNameData), Messages::NPObjectMessageReceiver::GetProperty::Reply(returnValue, resultData), m_npObjectID))
    180         return false;
    181 
    182     if (!returnValue)
    183         return false;
    184 
    185     *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData, m_plugin);
    186     return true;
    187 }
    188 
    189 bool NPObjectProxy::setProperty(NPIdentifier propertyName, const NPVariant* value)
    190 {
    191     if (!m_npRemoteObjectMap)
    192         return false;
    193 
    194     NPIdentifierData propertyNameData = NPIdentifierData::fromNPIdentifier(propertyName);
    195     NPVariantData propertyValueData = m_npRemoteObjectMap->npVariantToNPVariantData(*value, m_plugin);
    196 
    197     bool returnValue = false;
    198 
    199     if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::SetProperty(propertyNameData, propertyValueData), Messages::NPObjectMessageReceiver::SetProperty::Reply(returnValue), m_npObjectID))
    200         return false;
    201 
    202     return returnValue;
    203 }
    204 
    205 bool NPObjectProxy::removeProperty(NPIdentifier propertyName)
    206 {
    207     if (!m_npRemoteObjectMap)
    208         return false;
    209 
    210     NPIdentifierData propertyNameData = NPIdentifierData::fromNPIdentifier(propertyName);
    211 
    212     bool returnValue = false;
    213 
    214     if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::RemoveProperty(propertyNameData), Messages::NPObjectMessageReceiver::RemoveProperty::Reply(returnValue), m_npObjectID))
    215         return false;
    216 
    217     return returnValue;
    218 }
    219 
    220 bool NPObjectProxy::enumerate(NPIdentifier** identifiers, uint32_t* identifierCount)
    221 {
    222     if (!m_npRemoteObjectMap)
    223         return false;
    224 
    225     bool returnValue;
    226     Vector<NPIdentifierData> identifiersData;
    227 
    228     if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::Enumerate(), Messages::NPObjectMessageReceiver::Enumerate::Reply(returnValue, identifiersData), m_npObjectID))
    229         return false;
    230 
    231     if (!returnValue)
    232         return false;
    233 
    234     NPIdentifier* nameIdentifiers = npnMemNewArray<NPIdentifier>(identifiersData.size());
    235 
    236     for (size_t i = 0; i < identifiersData.size(); ++i)
    237         nameIdentifiers[i] = identifiersData[i].createNPIdentifier();
    238 
    239     *identifiers = nameIdentifiers;
    240     *identifierCount = identifiersData.size();
    241     return true;
    242 }
    243 
    244 bool NPObjectProxy::construct(const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
    245 {
    246     if (!m_npRemoteObjectMap)
    247         return false;
    248 
    249     Vector<NPVariantData> argumentsData;
    250     for (uint32_t i = 0; i < argumentCount; ++i)
    251         argumentsData.append(m_npRemoteObjectMap->npVariantToNPVariantData(arguments[i], m_plugin));
    252 
    253     bool returnValue = false;
    254     NPVariantData resultData;
    255 
    256     if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::Construct(argumentsData), Messages::NPObjectMessageReceiver::Construct::Reply(returnValue, resultData), m_npObjectID))
    257         return false;
    258 
    259     if (!returnValue)
    260         return false;
    261 
    262     *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData, m_plugin);
    263     return true;
    264 }
    265 
    266 NPClass* NPObjectProxy::npClass()
    267 {
    268     static NPClass npClass = {
    269         NP_CLASS_STRUCT_VERSION,
    270         NP_Allocate,
    271         NP_Deallocate,
    272         0,
    273         NP_HasMethod,
    274         NP_Invoke,
    275         NP_InvokeDefault,
    276         NP_HasProperty,
    277         NP_GetProperty,
    278         NP_SetProperty,
    279         NP_RemoveProperty,
    280         NP_Enumerate,
    281         NP_Construct
    282     };
    283 
    284     return &npClass;
    285 }
    286 
    287 NPObject* NPObjectProxy::NP_Allocate(NPP npp, NPClass*)
    288 {
    289     ASSERT_UNUSED(npp, !npp);
    290 
    291     return new NPObjectProxy;
    292 }
    293 
    294 void NPObjectProxy::NP_Deallocate(NPObject* npObject)
    295 {
    296     NPObjectProxy* npObjectProxy = toNPObjectProxy(npObject);
    297     delete npObjectProxy;
    298 }
    299 
    300 bool NPObjectProxy::NP_HasMethod(NPObject* npObject, NPIdentifier methodName)
    301 {
    302     return toNPObjectProxy(npObject)->hasMethod(methodName);
    303 }
    304 
    305 bool NPObjectProxy::NP_Invoke(NPObject* npObject, NPIdentifier methodName, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
    306 {
    307     return toNPObjectProxy(npObject)->invoke(methodName, arguments, argumentCount, result);
    308 }
    309 
    310 bool NPObjectProxy::NP_InvokeDefault(NPObject* npObject, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
    311 {
    312     return toNPObjectProxy(npObject)->invokeDefault(arguments, argumentCount, result);
    313 }
    314 
    315 bool NPObjectProxy::NP_HasProperty(NPObject* npObject, NPIdentifier propertyName)
    316 {
    317     return toNPObjectProxy(npObject)->hasProperty(propertyName);
    318 }
    319 
    320 bool NPObjectProxy::NP_GetProperty(NPObject* npObject, NPIdentifier propertyName, NPVariant* result)
    321 {
    322     return toNPObjectProxy(npObject)->getProperty(propertyName, result);
    323 }
    324 
    325 bool NPObjectProxy::NP_SetProperty(NPObject* npObject, NPIdentifier propertyName, const NPVariant* value)
    326 {
    327     return toNPObjectProxy(npObject)->setProperty(propertyName, value);
    328 }
    329 
    330 bool NPObjectProxy::NP_RemoveProperty(NPObject* npObject, NPIdentifier propertyName)
    331 {
    332     return toNPObjectProxy(npObject)->removeProperty(propertyName);
    333 }
    334 
    335 bool NPObjectProxy::NP_Enumerate(NPObject* npObject, NPIdentifier** identifiers, uint32_t* identifierCount)
    336 {
    337     return toNPObjectProxy(npObject)->enumerate(identifiers, identifierCount);
    338 }
    339 
    340 bool NPObjectProxy::NP_Construct(NPObject* npObject, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
    341 {
    342     return toNPObjectProxy(npObject)->construct(arguments, argumentCount, result);
    343 }
    344 
    345 } // namespace WebKit
    346 
    347 #endif // ENABLE(PLUGIN_PROCESS)
    348