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 "NPObjectMessageReceiver.h" 28 29#if ENABLE(PLUGIN_PROCESS) 30 31#include "NPIdentifierData.h" 32#include "NPRemoteObjectMap.h" 33#include "NPRuntimeUtilities.h" 34#include "NPVariantData.h" 35 36namespace WebKit { 37 38PassOwnPtr<NPObjectMessageReceiver> NPObjectMessageReceiver::create(NPRemoteObjectMap* npRemoteObjectMap, Plugin* plugin, uint64_t npObjectID, NPObject* npObject) 39{ 40 return adoptPtr(new NPObjectMessageReceiver(npRemoteObjectMap, plugin, npObjectID, npObject)); 41} 42 43NPObjectMessageReceiver::NPObjectMessageReceiver(NPRemoteObjectMap* npRemoteObjectMap, Plugin* plugin, uint64_t npObjectID, NPObject* npObject) 44 : m_npRemoteObjectMap(npRemoteObjectMap) 45 , m_plugin(plugin) 46 , m_npObjectID(npObjectID) 47 , m_npObject(npObject) 48{ 49 retainNPObject(m_npObject); 50} 51 52NPObjectMessageReceiver::~NPObjectMessageReceiver() 53{ 54 m_npRemoteObjectMap->unregisterNPObject(m_npObjectID); 55 56 releaseNPObject(m_npObject); 57} 58 59void NPObjectMessageReceiver::deallocate() 60{ 61 delete this; 62} 63 64void NPObjectMessageReceiver::hasMethod(const NPIdentifierData& methodNameData, bool& returnValue) 65{ 66 if (!m_npObject->_class->hasMethod) { 67 returnValue = false; 68 return; 69 } 70 71 returnValue = m_npObject->_class->hasMethod(m_npObject, methodNameData.createNPIdentifier()); 72} 73 74void NPObjectMessageReceiver::invoke(const NPIdentifierData& methodNameData, const Vector<NPVariantData>& argumentsData, bool& returnValue, NPVariantData& resultData) 75{ 76 if (!m_npObject->_class->invoke) { 77 returnValue = false; 78 return; 79 } 80 81 Vector<NPVariant> arguments; 82 for (size_t i = 0; i < argumentsData.size(); ++i) 83 arguments.append(m_npRemoteObjectMap->npVariantDataToNPVariant(argumentsData[i], m_plugin)); 84 85 NPVariant result; 86 VOID_TO_NPVARIANT(result); 87 88 returnValue = m_npObject->_class->invoke(m_npObject, methodNameData.createNPIdentifier(), arguments.data(), arguments.size(), &result); 89 if (returnValue) { 90 // Convert the NPVariant to an NPVariantData. 91 resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result, m_plugin); 92 } 93 94 // Release all arguments. 95 for (size_t i = 0; i < argumentsData.size(); ++i) 96 releaseNPVariantValue(&arguments[i]); 97 98 // And release the result. 99 releaseNPVariantValue(&result); 100} 101 102void NPObjectMessageReceiver::invokeDefault(const Vector<NPVariantData>& argumentsData, bool& returnValue, NPVariantData& resultData) 103{ 104 if (!m_npObject->_class->invokeDefault) { 105 returnValue = false; 106 return; 107 } 108 109 Vector<NPVariant> arguments; 110 for (size_t i = 0; i < argumentsData.size(); ++i) 111 arguments.append(m_npRemoteObjectMap->npVariantDataToNPVariant(argumentsData[i], m_plugin)); 112 113 NPVariant result; 114 VOID_TO_NPVARIANT(result); 115 116 returnValue = m_npObject->_class->invokeDefault(m_npObject, arguments.data(), arguments.size(), &result); 117 if (returnValue) { 118 // Convert the NPVariant to an NPVariantData. 119 resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result, m_plugin); 120 } 121 122 // Release all arguments. 123 for (size_t i = 0; i < argumentsData.size(); ++i) 124 releaseNPVariantValue(&arguments[i]); 125 126 // And release the result. 127 releaseNPVariantValue(&result); 128} 129 130void NPObjectMessageReceiver::hasProperty(const NPIdentifierData& propertyNameData, bool& returnValue) 131{ 132 if (!m_npObject->_class->hasProperty) { 133 returnValue = false; 134 return; 135 } 136 137 returnValue = m_npObject->_class->hasProperty(m_npObject, propertyNameData.createNPIdentifier()); 138} 139 140void NPObjectMessageReceiver::getProperty(const NPIdentifierData& propertyNameData, bool& returnValue, NPVariantData& resultData) 141{ 142 if (!m_npObject->_class->getProperty) { 143 returnValue = false; 144 return; 145 } 146 147 NPVariant result; 148 returnValue = m_npObject->_class->getProperty(m_npObject, propertyNameData.createNPIdentifier(), &result); 149 if (!returnValue) 150 return; 151 152 // Convert the NPVariant to an NPVariantData. 153 resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result, m_plugin); 154 155 // And release the result. 156 releaseNPVariantValue(&result); 157} 158 159void NPObjectMessageReceiver::setProperty(const NPIdentifierData& propertyNameData, const NPVariantData& propertyValueData, bool& returnValue) 160{ 161 if (!m_npObject->_class->setProperty) { 162 returnValue = false; 163 return; 164 } 165 166 NPVariant propertyValue = m_npRemoteObjectMap->npVariantDataToNPVariant(propertyValueData, m_plugin); 167 168 // Set the property. 169 returnValue = m_npObject->_class->setProperty(m_npObject, propertyNameData.createNPIdentifier(), &propertyValue); 170 171 // And release the value. 172 releaseNPVariantValue(&propertyValue); 173} 174 175void NPObjectMessageReceiver::removeProperty(const NPIdentifierData& propertyNameData, bool& returnValue) 176{ 177 if (!m_npObject->_class->removeProperty) { 178 returnValue = false; 179 return; 180 } 181 182 returnValue = m_npObject->_class->removeProperty(m_npObject, propertyNameData.createNPIdentifier()); 183} 184 185void NPObjectMessageReceiver::enumerate(bool& returnValue, Vector<NPIdentifierData>& identifiersData) 186{ 187 if (!NP_CLASS_STRUCT_VERSION_HAS_ENUM(m_npObject->_class) || !m_npObject->_class->enumerate) { 188 returnValue = false; 189 return; 190 } 191 192 NPIdentifier* identifiers = 0; 193 uint32_t identifierCount = 0; 194 195 returnValue = m_npObject->_class->enumerate(m_npObject, &identifiers, &identifierCount); 196 if (!returnValue) 197 return; 198 199 for (uint32_t i = 0; i < identifierCount; ++i) 200 identifiersData.append(NPIdentifierData::fromNPIdentifier(identifiers[i])); 201 202 npnMemFree(identifiers); 203} 204 205void NPObjectMessageReceiver::construct(const Vector<NPVariantData>& argumentsData, bool& returnValue, NPVariantData& resultData) 206{ 207 if (!NP_CLASS_STRUCT_VERSION_HAS_CTOR(m_npObject->_class) || !m_npObject->_class->construct) { 208 returnValue = false; 209 return; 210 } 211 212 Vector<NPVariant> arguments; 213 for (size_t i = 0; i < argumentsData.size(); ++i) 214 arguments.append(m_npRemoteObjectMap->npVariantDataToNPVariant(argumentsData[i], m_plugin)); 215 216 NPVariant result; 217 VOID_TO_NPVARIANT(result); 218 219 returnValue = m_npObject->_class->construct(m_npObject, arguments.data(), arguments.size(), &result); 220 if (returnValue) { 221 // Convert the NPVariant to an NPVariantData. 222 resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result, m_plugin); 223 } 224 225 // Release all arguments. 226 for (size_t i = 0; i < argumentsData.size(); ++i) 227 releaseNPVariantValue(&arguments[i]); 228 229 // And release the result. 230 releaseNPVariantValue(&result); 231} 232 233} // namespace WebKit 234 235#endif // ENABLE(PLUGIN_PROCESS) 236 237