• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
create(NPRemoteObjectMap * npRemoteObjectMap,Plugin * plugin,uint64_t npObjectID)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 
NPObjectProxy()49 NPObjectProxy::NPObjectProxy()
50     : m_npRemoteObjectMap(0)
51     , m_plugin(0)
52     , m_npObjectID(0)
53 {
54 }
55 
~NPObjectProxy()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 
isNPObjectProxy(NPObject * npObject)65 bool NPObjectProxy::isNPObjectProxy(NPObject* npObject)
66 {
67     return npObject->_class == npClass();
68 }
69 
invalidate()70 void NPObjectProxy::invalidate()
71 {
72     ASSERT(m_npRemoteObjectMap);
73     ASSERT(m_plugin);
74 
75     m_npRemoteObjectMap = 0;
76     m_plugin = 0;
77 }
78 
initialize(NPRemoteObjectMap * npRemoteObjectMap,Plugin * plugin,uint64_t npObjectID)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 
hasMethod(NPIdentifier methodName)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 
invoke(NPIdentifier methodName,const NPVariant * arguments,uint32_t argumentCount,NPVariant * result)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 
invokeDefault(const NPVariant * arguments,uint32_t argumentCount,NPVariant * result)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 
hasProperty(NPIdentifier propertyName)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 
getProperty(NPIdentifier propertyName,NPVariant * result)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 
setProperty(NPIdentifier propertyName,const NPVariant * value)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 
removeProperty(NPIdentifier propertyName)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 
enumerate(NPIdentifier ** identifiers,uint32_t * identifierCount)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 
construct(const NPVariant * arguments,uint32_t argumentCount,NPVariant * result)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 
npClass()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 
NP_Allocate(NPP npp,NPClass *)287 NPObject* NPObjectProxy::NP_Allocate(NPP npp, NPClass*)
288 {
289     ASSERT_UNUSED(npp, !npp);
290 
291     return new NPObjectProxy;
292 }
293 
NP_Deallocate(NPObject * npObject)294 void NPObjectProxy::NP_Deallocate(NPObject* npObject)
295 {
296     NPObjectProxy* npObjectProxy = toNPObjectProxy(npObject);
297     delete npObjectProxy;
298 }
299 
NP_HasMethod(NPObject * npObject,NPIdentifier methodName)300 bool NPObjectProxy::NP_HasMethod(NPObject* npObject, NPIdentifier methodName)
301 {
302     return toNPObjectProxy(npObject)->hasMethod(methodName);
303 }
304 
NP_Invoke(NPObject * npObject,NPIdentifier methodName,const NPVariant * arguments,uint32_t argumentCount,NPVariant * result)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 
NP_InvokeDefault(NPObject * npObject,const NPVariant * arguments,uint32_t argumentCount,NPVariant * result)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 
NP_HasProperty(NPObject * npObject,NPIdentifier propertyName)315 bool NPObjectProxy::NP_HasProperty(NPObject* npObject, NPIdentifier propertyName)
316 {
317     return toNPObjectProxy(npObject)->hasProperty(propertyName);
318 }
319 
NP_GetProperty(NPObject * npObject,NPIdentifier propertyName,NPVariant * result)320 bool NPObjectProxy::NP_GetProperty(NPObject* npObject, NPIdentifier propertyName, NPVariant* result)
321 {
322     return toNPObjectProxy(npObject)->getProperty(propertyName, result);
323 }
324 
NP_SetProperty(NPObject * npObject,NPIdentifier propertyName,const NPVariant * value)325 bool NPObjectProxy::NP_SetProperty(NPObject* npObject, NPIdentifier propertyName, const NPVariant* value)
326 {
327     return toNPObjectProxy(npObject)->setProperty(propertyName, value);
328 }
329 
NP_RemoveProperty(NPObject * npObject,NPIdentifier propertyName)330 bool NPObjectProxy::NP_RemoveProperty(NPObject* npObject, NPIdentifier propertyName)
331 {
332     return toNPObjectProxy(npObject)->removeProperty(propertyName);
333 }
334 
NP_Enumerate(NPObject * npObject,NPIdentifier ** identifiers,uint32_t * identifierCount)335 bool NPObjectProxy::NP_Enumerate(NPObject* npObject, NPIdentifier** identifiers, uint32_t* identifierCount)
336 {
337     return toNPObjectProxy(npObject)->enumerate(identifiers, identifierCount);
338 }
339 
NP_Construct(NPObject * npObject,const NPVariant * arguments,uint32_t argumentCount,NPVariant * result)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