• 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 "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