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
36 namespace WebKit {
37
create(NPRemoteObjectMap * npRemoteObjectMap,Plugin * plugin,uint64_t npObjectID,NPObject * npObject)38 PassOwnPtr<NPObjectMessageReceiver> NPObjectMessageReceiver::create(NPRemoteObjectMap* npRemoteObjectMap, Plugin* plugin, uint64_t npObjectID, NPObject* npObject)
39 {
40 return adoptPtr(new NPObjectMessageReceiver(npRemoteObjectMap, plugin, npObjectID, npObject));
41 }
42
NPObjectMessageReceiver(NPRemoteObjectMap * npRemoteObjectMap,Plugin * plugin,uint64_t npObjectID,NPObject * npObject)43 NPObjectMessageReceiver::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
~NPObjectMessageReceiver()52 NPObjectMessageReceiver::~NPObjectMessageReceiver()
53 {
54 m_npRemoteObjectMap->unregisterNPObject(m_npObjectID);
55
56 releaseNPObject(m_npObject);
57 }
58
deallocate()59 void NPObjectMessageReceiver::deallocate()
60 {
61 delete this;
62 }
63
hasMethod(const NPIdentifierData & methodNameData,bool & returnValue)64 void 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
invoke(const NPIdentifierData & methodNameData,const Vector<NPVariantData> & argumentsData,bool & returnValue,NPVariantData & resultData)74 void 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
invokeDefault(const Vector<NPVariantData> & argumentsData,bool & returnValue,NPVariantData & resultData)102 void 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
hasProperty(const NPIdentifierData & propertyNameData,bool & returnValue)130 void 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
getProperty(const NPIdentifierData & propertyNameData,bool & returnValue,NPVariantData & resultData)140 void 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
setProperty(const NPIdentifierData & propertyNameData,const NPVariantData & propertyValueData,bool & returnValue)159 void 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
removeProperty(const NPIdentifierData & propertyNameData,bool & returnValue)175 void 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
enumerate(bool & returnValue,Vector<NPIdentifierData> & identifiersData)185 void 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
construct(const Vector<NPVariantData> & argumentsData,bool & returnValue,NPVariantData & resultData)205 void 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