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