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