OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/browser_plugin/browser_plugin_bindings.h" | 5 #include "content/renderer/browser_plugin/browser_plugin_bindings.h" |
6 | 6 |
7 #include <cstdlib> | 7 #include <cstdlib> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 message_channel.get(); | 44 message_channel.get(); |
45 } | 45 } |
46 | 46 |
47 std::string StringFromNPVariant(const NPVariant& variant) { | 47 std::string StringFromNPVariant(const NPVariant& variant) { |
48 if (!NPVARIANT_IS_STRING(variant)) | 48 if (!NPVARIANT_IS_STRING(variant)) |
49 return std::string(); | 49 return std::string(); |
50 const NPString& np_string = NPVARIANT_TO_STRING(variant); | 50 const NPString& np_string = NPVARIANT_TO_STRING(variant); |
51 return std::string(np_string.UTF8Characters, np_string.UTF8Length); | 51 return std::string(np_string.UTF8Characters, np_string.UTF8Length); |
52 } | 52 } |
53 | 53 |
54 // Depending on where the attribute comes from it could be a string, int32, | |
55 // or a double. Javascript tends to produce an int32 or a string, but setting | |
56 // the value from the developer tools console may also produce a double. | |
57 int IntFromNPVariant(const NPVariant& variant) { | |
58 int value = 0; | |
59 switch (variant.type) { | |
60 case NPVariantType_Double: | |
61 value = NPVARIANT_TO_DOUBLE(variant); | |
62 break; | |
63 case NPVariantType_Int32: | |
64 value = NPVARIANT_TO_INT32(variant); | |
65 break; | |
66 case NPVariantType_String: | |
67 base::StringToInt(StringFromNPVariant(variant), &value); | |
68 break; | |
69 default: | |
70 break; | |
71 } | |
72 return value; | |
73 } | |
74 | |
75 //------------------------------------------------------------------------------ | 54 //------------------------------------------------------------------------------ |
76 // Implementations of NPClass functions. These are here to: | 55 // Implementations of NPClass functions. These are here to: |
77 // - Implement src attribute. | 56 // - Implement src attribute. |
78 //------------------------------------------------------------------------------ | 57 //------------------------------------------------------------------------------ |
79 NPObject* BrowserPluginBindingsAllocate(NPP npp, NPClass* the_class) { | 58 NPObject* BrowserPluginBindingsAllocate(NPP npp, NPClass* the_class) { |
80 return new BrowserPluginBindings::BrowserPluginNPObject; | 59 return new BrowserPluginBindings::BrowserPluginNPObject; |
81 } | 60 } |
82 | 61 |
83 void BrowserPluginBindingsDeallocate(NPObject* object) { | 62 void BrowserPluginBindingsDeallocate(NPObject* object) { |
84 BrowserPluginBindings::BrowserPluginNPObject* instance = | 63 BrowserPluginBindings::BrowserPluginNPObject* instance = |
85 static_cast<BrowserPluginBindings::BrowserPluginNPObject*>(object); | 64 static_cast<BrowserPluginBindings::BrowserPluginNPObject*>(object); |
86 delete instance; | 65 delete instance; |
87 } | 66 } |
88 | 67 |
89 bool BrowserPluginBindingsHasMethod(NPObject* np_obj, NPIdentifier name) { | 68 bool BrowserPluginBindingsHasMethod(NPObject* np_obj, NPIdentifier name) { |
90 if (!np_obj) | 69 return false; |
91 return false; | |
92 | |
93 BrowserPluginBindings* bindings = GetBindings(np_obj); | |
94 if (!bindings) | |
95 return false; | |
96 | |
97 return bindings->HasMethod(name); | |
98 } | |
99 | |
100 bool BrowserPluginBindingsInvoke(NPObject* np_obj, NPIdentifier name, | |
101 const NPVariant* args, uint32 arg_count, | |
102 NPVariant* result) { | |
103 if (!np_obj) | |
104 return false; | |
105 | |
106 BrowserPluginBindings* bindings = GetBindings(np_obj); | |
107 if (!bindings) | |
108 return false; | |
109 | |
110 return bindings->InvokeMethod(name, args, arg_count, result); | |
111 } | 70 } |
112 | 71 |
113 bool BrowserPluginBindingsInvokeDefault(NPObject* np_obj, | 72 bool BrowserPluginBindingsInvokeDefault(NPObject* np_obj, |
114 const NPVariant* args, | 73 const NPVariant* args, |
115 uint32 arg_count, | 74 uint32 arg_count, |
116 NPVariant* result) { | 75 NPVariant* result) { |
117 NOTIMPLEMENTED(); | 76 NOTIMPLEMENTED(); |
118 return false; | 77 return false; |
119 } | 78 } |
120 | 79 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 NOTIMPLEMENTED(); | 129 NOTIMPLEMENTED(); |
171 return true; | 130 return true; |
172 } | 131 } |
173 | 132 |
174 NPClass browser_plugin_message_class = { | 133 NPClass browser_plugin_message_class = { |
175 NP_CLASS_STRUCT_VERSION, | 134 NP_CLASS_STRUCT_VERSION, |
176 &BrowserPluginBindingsAllocate, | 135 &BrowserPluginBindingsAllocate, |
177 &BrowserPluginBindingsDeallocate, | 136 &BrowserPluginBindingsDeallocate, |
178 NULL, | 137 NULL, |
179 &BrowserPluginBindingsHasMethod, | 138 &BrowserPluginBindingsHasMethod, |
180 &BrowserPluginBindingsInvoke, | 139 NULL, |
181 &BrowserPluginBindingsInvokeDefault, | 140 &BrowserPluginBindingsInvokeDefault, |
182 &BrowserPluginBindingsHasProperty, | 141 &BrowserPluginBindingsHasProperty, |
183 &BrowserPluginBindingsGetProperty, | 142 &BrowserPluginBindingsGetProperty, |
184 &BrowserPluginBindingsSetProperty, | 143 &BrowserPluginBindingsSetProperty, |
185 NULL, | 144 NULL, |
186 &BrowserPluginBindingsEnumerate, | 145 &BrowserPluginBindingsEnumerate, |
187 }; | 146 }; |
188 | 147 |
189 } // namespace | 148 } // namespace |
190 | 149 |
191 // BrowserPluginMethodBinding -------------------------------------------------- | |
192 | |
193 class BrowserPluginMethodBinding { | |
194 public: | |
195 BrowserPluginMethodBinding(const char name[], uint32 arg_count) | |
196 : name_(name), | |
197 arg_count_(arg_count) { | |
198 } | |
199 | |
200 virtual ~BrowserPluginMethodBinding() {} | |
201 | |
202 bool MatchesName(NPIdentifier name) const { | |
203 return WebBindings::getStringIdentifier(name_.c_str()) == name; | |
204 } | |
205 | |
206 uint32 arg_count() const { return arg_count_; } | |
207 | |
208 virtual bool Invoke(BrowserPluginBindings* bindings, | |
209 const NPVariant* args, | |
210 NPVariant* result) = 0; | |
211 | |
212 private: | |
213 std::string name_; | |
214 uint32 arg_count_; | |
215 | |
216 DISALLOW_COPY_AND_ASSIGN(BrowserPluginMethodBinding); | |
217 }; | |
218 | |
219 class BrowserPluginBindingAttach: public BrowserPluginMethodBinding { | |
220 public: | |
221 BrowserPluginBindingAttach() | |
222 : BrowserPluginMethodBinding(browser_plugin::kMethodInternalAttach, 2) {} | |
223 | |
224 virtual bool Invoke(BrowserPluginBindings* bindings, | |
225 const NPVariant* args, | |
226 NPVariant* result) OVERRIDE { | |
227 bool attached = InvokeHelper(bindings, args); | |
228 BOOLEAN_TO_NPVARIANT(attached, *result); | |
229 return true; | |
230 } | |
231 | |
232 private: | |
233 bool InvokeHelper(BrowserPluginBindings* bindings, const NPVariant* args) { | |
234 if (!bindings->instance()->render_view()) | |
235 return false; | |
236 | |
237 int instance_id = IntFromNPVariant(args[0]); | |
238 if (!instance_id) | |
239 return false; | |
240 | |
241 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); | |
242 v8::Handle<v8::Value> obj(blink::WebBindings::toV8Value(&args[1])); | |
243 scoped_ptr<base::Value> value( | |
244 converter->FromV8Value(obj, bindings->instance()->render_view()-> | |
245 GetWebView()->mainFrame()->mainWorldScriptContext())); | |
246 if (!value) | |
247 return false; | |
248 | |
249 if (!value->IsType(base::Value::TYPE_DICTIONARY)) | |
250 return false; | |
251 | |
252 scoped_ptr<base::DictionaryValue> extra_params( | |
253 static_cast<base::DictionaryValue*>(value.release())); | |
254 bindings->instance()->Attach(instance_id, extra_params.Pass()); | |
255 return true; | |
256 } | |
257 DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingAttach); | |
258 }; | |
259 | |
260 // BrowserPluginPropertyBinding ------------------------------------------------ | 150 // BrowserPluginPropertyBinding ------------------------------------------------ |
261 | 151 |
262 class BrowserPluginPropertyBinding { | 152 class BrowserPluginPropertyBinding { |
263 public: | 153 public: |
264 explicit BrowserPluginPropertyBinding(const char name[]) : name_(name) {} | 154 explicit BrowserPluginPropertyBinding(const char name[]) : name_(name) {} |
265 virtual ~BrowserPluginPropertyBinding() {} | 155 virtual ~BrowserPluginPropertyBinding() {} |
266 const std::string& name() const { return name_; } | 156 const std::string& name() const { return name_; } |
267 bool MatchesName(NPIdentifier name) const { | 157 bool MatchesName(NPIdentifier name) const { |
268 return WebBindings::getStringIdentifier(name_.c_str()) == name; | 158 return WebBindings::getStringIdentifier(name_.c_str()) == name; |
269 } | 159 } |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 BrowserPluginBindings::BrowserPluginBindings(BrowserPlugin* instance) | 248 BrowserPluginBindings::BrowserPluginBindings(BrowserPlugin* instance) |
359 : instance_(instance), | 249 : instance_(instance), |
360 np_object_(NULL), | 250 np_object_(NULL), |
361 weak_ptr_factory_(this) { | 251 weak_ptr_factory_(this) { |
362 NPObject* obj = | 252 NPObject* obj = |
363 WebBindings::createObject(instance->pluginNPP(), | 253 WebBindings::createObject(instance->pluginNPP(), |
364 &browser_plugin_message_class); | 254 &browser_plugin_message_class); |
365 np_object_ = static_cast<BrowserPluginBindings::BrowserPluginNPObject*>(obj); | 255 np_object_ = static_cast<BrowserPluginBindings::BrowserPluginNPObject*>(obj); |
366 np_object_->message_channel = weak_ptr_factory_.GetWeakPtr(); | 256 np_object_->message_channel = weak_ptr_factory_.GetWeakPtr(); |
367 | 257 |
368 method_bindings_.push_back(new BrowserPluginBindingAttach); | |
369 | |
370 property_bindings_.push_back( | 258 property_bindings_.push_back( |
371 new BrowserPluginPropertyBindingAllowTransparency); | 259 new BrowserPluginPropertyBindingAllowTransparency); |
372 property_bindings_.push_back(new BrowserPluginPropertyBindingContentWindow); | 260 property_bindings_.push_back(new BrowserPluginPropertyBindingContentWindow); |
373 } | 261 } |
374 | 262 |
375 BrowserPluginBindings::~BrowserPluginBindings() { | 263 BrowserPluginBindings::~BrowserPluginBindings() { |
376 WebBindings::releaseObject(np_object_); | 264 WebBindings::releaseObject(np_object_); |
377 } | 265 } |
378 | 266 |
379 bool BrowserPluginBindings::HasMethod(NPIdentifier name) const { | |
380 for (BindingList::const_iterator iter = method_bindings_.begin(); | |
381 iter != method_bindings_.end(); | |
382 ++iter) { | |
383 if ((*iter)->MatchesName(name)) | |
384 return true; | |
385 } | |
386 return false; | |
387 } | |
388 | |
389 bool BrowserPluginBindings::InvokeMethod(NPIdentifier name, | |
390 const NPVariant* args, | |
391 uint32 arg_count, | |
392 NPVariant* result) { | |
393 for (BindingList::iterator iter = method_bindings_.begin(); | |
394 iter != method_bindings_.end(); | |
395 ++iter) { | |
396 if ((*iter)->MatchesName(name) && (*iter)->arg_count() == arg_count) | |
397 return (*iter)->Invoke(this, args, result); | |
398 } | |
399 return false; | |
400 } | |
401 | |
402 bool BrowserPluginBindings::HasProperty(NPIdentifier name) const { | 267 bool BrowserPluginBindings::HasProperty(NPIdentifier name) const { |
403 for (PropertyBindingList::const_iterator iter = property_bindings_.begin(); | 268 for (PropertyBindingList::const_iterator iter = property_bindings_.begin(); |
404 iter != property_bindings_.end(); | 269 iter != property_bindings_.end(); |
405 ++iter) { | 270 ++iter) { |
406 if ((*iter)->MatchesName(name)) | 271 if ((*iter)->MatchesName(name)) |
407 return true; | 272 return true; |
408 } | 273 } |
409 return false; | 274 return false; |
410 } | 275 } |
411 | 276 |
(...skipping 30 matching lines...) Expand all Loading... |
442 for (PropertyBindingList::iterator iter = property_bindings_.begin(); | 307 for (PropertyBindingList::iterator iter = property_bindings_.begin(); |
443 iter != property_bindings_.end(); | 308 iter != property_bindings_.end(); |
444 ++iter) { | 309 ++iter) { |
445 if ((*iter)->MatchesName(name)) | 310 if ((*iter)->MatchesName(name)) |
446 return (*iter)->GetProperty(this, result); | 311 return (*iter)->GetProperty(this, result); |
447 } | 312 } |
448 return false; | 313 return false; |
449 } | 314 } |
450 | 315 |
451 } // namespace content | 316 } // namespace content |
OLD | NEW |