NPObjectProxy.cpp revision 2fc2651226baac27029e38c9d6ef883fa32084db
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 39namespace WebKit { 40 41NPObjectProxy* NPObjectProxy::create(NPRemoteObjectMap* npRemoteObjectMap, uint64_t npObjectID) 42{ 43 NPObjectProxy* npObjectProxy = toNPObjectProxy(createNPObject(0, npClass())); 44 npObjectProxy->initialize(npRemoteObjectMap, npObjectID); 45 46 return npObjectProxy; 47} 48 49NPObjectProxy::NPObjectProxy() 50 : m_npRemoteObjectMap(0) 51 , m_npObjectID(0) 52{ 53} 54 55NPObjectProxy::~NPObjectProxy() 56{ 57 if (!m_npRemoteObjectMap) 58 return; 59 60 m_npRemoteObjectMap->npObjectProxyDestroyed(this); 61 m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::Deallocate(), Messages::NPObjectMessageReceiver::Deallocate::Reply(), m_npObjectID); 62} 63 64bool NPObjectProxy::isNPObjectProxy(NPObject* npObject) 65{ 66 return npObject->_class == npClass(); 67} 68 69void NPObjectProxy::invalidate() 70{ 71 ASSERT(m_npRemoteObjectMap); 72 73 m_npRemoteObjectMap = 0; 74} 75 76void NPObjectProxy::initialize(NPRemoteObjectMap* npRemoteObjectMap, uint64_t npObjectID) 77{ 78 ASSERT(!m_npRemoteObjectMap); 79 ASSERT(!m_npObjectID); 80 81 ASSERT(npRemoteObjectMap); 82 ASSERT(npObjectID); 83 84 m_npRemoteObjectMap = npRemoteObjectMap; 85 m_npObjectID = npObjectID; 86} 87 88bool NPObjectProxy::hasMethod(NPIdentifier methodName) 89{ 90 if (!m_npRemoteObjectMap) 91 return false; 92 93 NPIdentifierData methodNameData = NPIdentifierData::fromNPIdentifier(methodName); 94 95 bool returnValue = false; 96 97 if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::HasMethod(methodNameData), Messages::NPObjectMessageReceiver::HasMethod::Reply(returnValue), m_npObjectID)) 98 return false; 99 100 return returnValue; 101} 102 103bool NPObjectProxy::invoke(NPIdentifier methodName, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result) 104{ 105 if (!m_npRemoteObjectMap) 106 return false; 107 108 NPIdentifierData methodNameData = NPIdentifierData::fromNPIdentifier(methodName); 109 Vector<NPVariantData> argumentsData; 110 for (uint32_t i = 0; i < argumentCount; ++i) 111 argumentsData.append(m_npRemoteObjectMap->npVariantToNPVariantData(arguments[i])); 112 113 bool returnValue = false; 114 NPVariantData resultData; 115 116 if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::Invoke(methodNameData, argumentsData), Messages::NPObjectMessageReceiver::Invoke::Reply(returnValue, resultData), m_npObjectID)) 117 return false; 118 119 if (!returnValue) 120 return false; 121 122 *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData); 123 return true; 124} 125 126bool NPObjectProxy::invokeDefault(const NPVariant* arguments, uint32_t argumentCount, NPVariant* result) 127{ 128 if (!m_npRemoteObjectMap) 129 return false; 130 131 Vector<NPVariantData> argumentsData; 132 for (uint32_t i = 0; i < argumentCount; ++i) 133 argumentsData.append(m_npRemoteObjectMap->npVariantToNPVariantData(arguments[i])); 134 135 bool returnValue = false; 136 NPVariantData resultData; 137 138 if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::InvokeDefault(argumentsData), Messages::NPObjectMessageReceiver::InvokeDefault::Reply(returnValue, resultData), m_npObjectID)) 139 return false; 140 141 if (!returnValue) 142 return false; 143 144 *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData); 145 return true; 146} 147 148bool NPObjectProxy::hasProperty(NPIdentifier propertyName) 149{ 150 if (!m_npRemoteObjectMap) 151 return false; 152 153 NPIdentifierData propertyNameData = NPIdentifierData::fromNPIdentifier(propertyName); 154 155 bool returnValue = false; 156 157 if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::HasProperty(propertyNameData), Messages::NPObjectMessageReceiver::HasProperty::Reply(returnValue), m_npObjectID)) 158 return false; 159 160 return returnValue; 161} 162 163bool NPObjectProxy::getProperty(NPIdentifier propertyName, NPVariant* result) 164{ 165 if (!m_npRemoteObjectMap) 166 return false; 167 168 NPIdentifierData propertyNameData = NPIdentifierData::fromNPIdentifier(propertyName); 169 170 bool returnValue = false; 171 NPVariantData resultData; 172 173 if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::GetProperty(propertyNameData), Messages::NPObjectMessageReceiver::GetProperty::Reply(returnValue, resultData), m_npObjectID)) 174 return false; 175 176 if (!returnValue) 177 return false; 178 179 *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData); 180 return true; 181} 182 183bool NPObjectProxy::setProperty(NPIdentifier propertyName, const NPVariant* value) 184{ 185 if (!m_npRemoteObjectMap) 186 return false; 187 188 NPIdentifierData propertyNameData = NPIdentifierData::fromNPIdentifier(propertyName); 189 NPVariantData propertyValueData = m_npRemoteObjectMap->npVariantToNPVariantData(*value); 190 191 bool returnValue = false; 192 193 if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::SetProperty(propertyNameData, propertyValueData), Messages::NPObjectMessageReceiver::SetProperty::Reply(returnValue), m_npObjectID)) 194 return false; 195 196 return returnValue; 197} 198 199bool NPObjectProxy::removeProperty(NPIdentifier propertyName) 200{ 201 if (!m_npRemoteObjectMap) 202 return false; 203 204 NPIdentifierData propertyNameData = NPIdentifierData::fromNPIdentifier(propertyName); 205 206 bool returnValue = false; 207 208 if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::RemoveProperty(propertyNameData), Messages::NPObjectMessageReceiver::RemoveProperty::Reply(returnValue), m_npObjectID)) 209 return false; 210 211 return returnValue; 212} 213 214bool NPObjectProxy::enumerate(NPIdentifier** identifiers, uint32_t* identifierCount) 215{ 216 if (!m_npRemoteObjectMap) 217 return false; 218 219 bool returnValue; 220 Vector<NPIdentifierData> identifiersData; 221 222 if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::Enumerate(), Messages::NPObjectMessageReceiver::Enumerate::Reply(returnValue, identifiersData), m_npObjectID)) 223 return false; 224 225 if (!returnValue) 226 return false; 227 228 NPIdentifier* nameIdentifiers = npnMemNewArray<NPIdentifier>(identifiersData.size()); 229 230 for (size_t i = 0; i < identifiersData.size(); ++i) 231 nameIdentifiers[i] = identifiersData[i].createNPIdentifier(); 232 233 *identifiers = nameIdentifiers; 234 *identifierCount = identifiersData.size(); 235 return true; 236} 237 238bool NPObjectProxy::construct(const NPVariant* arguments, uint32_t argumentCount, NPVariant* result) 239{ 240 if (!m_npRemoteObjectMap) 241 return false; 242 243 Vector<NPVariantData> argumentsData; 244 for (uint32_t i = 0; i < argumentCount; ++i) 245 argumentsData.append(m_npRemoteObjectMap->npVariantToNPVariantData(arguments[i])); 246 247 bool returnValue = false; 248 NPVariantData resultData; 249 250 if (!m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::Construct(argumentsData), Messages::NPObjectMessageReceiver::Construct::Reply(returnValue, resultData), m_npObjectID)) 251 return false; 252 253 if (!returnValue) 254 return false; 255 256 *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData); 257 return true; 258} 259 260NPClass* NPObjectProxy::npClass() 261{ 262 static NPClass npClass = { 263 NP_CLASS_STRUCT_VERSION, 264 NP_Allocate, 265 NP_Deallocate, 266 0, 267 NP_HasMethod, 268 NP_Invoke, 269 NP_InvokeDefault, 270 NP_HasProperty, 271 NP_GetProperty, 272 NP_SetProperty, 273 NP_RemoveProperty, 274 NP_Enumerate, 275 NP_Construct 276 }; 277 278 return &npClass; 279} 280 281NPObject* NPObjectProxy::NP_Allocate(NPP npp, NPClass*) 282{ 283 ASSERT_UNUSED(npp, !npp); 284 285 return new NPObjectProxy; 286} 287 288void NPObjectProxy::NP_Deallocate(NPObject* npObject) 289{ 290 NPObjectProxy* npObjectProxy = toNPObjectProxy(npObject); 291 delete npObjectProxy; 292} 293 294bool NPObjectProxy::NP_HasMethod(NPObject* npObject, NPIdentifier methodName) 295{ 296 return toNPObjectProxy(npObject)->hasMethod(methodName); 297} 298 299bool NPObjectProxy::NP_Invoke(NPObject* npObject, NPIdentifier methodName, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result) 300{ 301 return toNPObjectProxy(npObject)->invoke(methodName, arguments, argumentCount, result); 302} 303 304bool NPObjectProxy::NP_InvokeDefault(NPObject* npObject, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result) 305{ 306 return toNPObjectProxy(npObject)->invokeDefault(arguments, argumentCount, result); 307} 308 309bool NPObjectProxy::NP_HasProperty(NPObject* npObject, NPIdentifier propertyName) 310{ 311 return toNPObjectProxy(npObject)->hasProperty(propertyName); 312} 313 314bool NPObjectProxy::NP_GetProperty(NPObject* npObject, NPIdentifier propertyName, NPVariant* result) 315{ 316 return toNPObjectProxy(npObject)->getProperty(propertyName, result); 317} 318 319bool NPObjectProxy::NP_SetProperty(NPObject* npObject, NPIdentifier propertyName, const NPVariant* value) 320{ 321 return toNPObjectProxy(npObject)->setProperty(propertyName, value); 322} 323 324bool NPObjectProxy::NP_RemoveProperty(NPObject* npObject, NPIdentifier propertyName) 325{ 326 return toNPObjectProxy(npObject)->removeProperty(propertyName); 327} 328 329bool NPObjectProxy::NP_Enumerate(NPObject* npObject, NPIdentifier** identifiers, uint32_t* identifierCount) 330{ 331 return toNPObjectProxy(npObject)->enumerate(identifiers, identifierCount); 332} 333 334bool NPObjectProxy::NP_Construct(NPObject* npObject, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result) 335{ 336 return toNPObjectProxy(npObject)->construct(arguments, argumentCount, result); 337} 338 339} // namespace WebKit 340 341#endif // ENABLE(PLUGIN_PROCESS) 342