Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(401)

Side by Side Diff: content/renderer/browser_plugin/browser_plugin_bindings.cc

Issue 444813002: Remove BrowserPlugin's -internal-attach method (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move AttachToBrowserPlugin to RenderFrame Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 return bindings->SetProperty(np_obj, name, variant); 124 return bindings->SetProperty(np_obj, name, variant);
166 } 125 }
167 126
168 bool BrowserPluginBindingsEnumerate(NPObject *np_obj, NPIdentifier **value, 127 bool BrowserPluginBindingsEnumerate(NPObject *np_obj, NPIdentifier **value,
169 uint32_t *count) { 128 uint32_t *count) {
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, &BrowserPluginBindingsAllocate,
176 &BrowserPluginBindingsAllocate, 135 &BrowserPluginBindingsDeallocate, NULL,
177 &BrowserPluginBindingsDeallocate, 136 &BrowserPluginBindingsHasMethod, NULL,
178 NULL, 137 &BrowserPluginBindingsInvokeDefault, &BrowserPluginBindingsHasProperty,
179 &BrowserPluginBindingsHasMethod, 138 &BrowserPluginBindingsGetProperty, &BrowserPluginBindingsSetProperty,
180 &BrowserPluginBindingsInvoke, 139 NULL, &BrowserPluginBindingsEnumerate,
Xi Han 2014/08/12 18:17:55 Should we change this format back?
Fady Samuel 2014/08/13 22:24:40 Done.
181 &BrowserPluginBindingsInvokeDefault,
182 &BrowserPluginBindingsHasProperty,
183 &BrowserPluginBindingsGetProperty,
184 &BrowserPluginBindingsSetProperty,
185 NULL,
186 &BrowserPluginBindingsEnumerate,
187 }; 140 };
188 141
189 } // namespace 142 } // namespace
190 143
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 ------------------------------------------------ 144 // BrowserPluginPropertyBinding ------------------------------------------------
261 145
262 class BrowserPluginPropertyBinding { 146 class BrowserPluginPropertyBinding {
263 public: 147 public:
264 explicit BrowserPluginPropertyBinding(const char name[]) : name_(name) {} 148 explicit BrowserPluginPropertyBinding(const char name[]) : name_(name) {}
265 virtual ~BrowserPluginPropertyBinding() {} 149 virtual ~BrowserPluginPropertyBinding() {}
266 const std::string& name() const { return name_; } 150 const std::string& name() const { return name_; }
267 bool MatchesName(NPIdentifier name) const { 151 bool MatchesName(NPIdentifier name) const {
268 return WebBindings::getStringIdentifier(name_.c_str()) == name; 152 return WebBindings::getStringIdentifier(name_.c_str()) == name;
269 } 153 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 BrowserPluginBindings::BrowserPluginBindings(BrowserPlugin* instance) 242 BrowserPluginBindings::BrowserPluginBindings(BrowserPlugin* instance)
359 : instance_(instance), 243 : instance_(instance),
360 np_object_(NULL), 244 np_object_(NULL),
361 weak_ptr_factory_(this) { 245 weak_ptr_factory_(this) {
362 NPObject* obj = 246 NPObject* obj =
363 WebBindings::createObject(instance->pluginNPP(), 247 WebBindings::createObject(instance->pluginNPP(),
364 &browser_plugin_message_class); 248 &browser_plugin_message_class);
365 np_object_ = static_cast<BrowserPluginBindings::BrowserPluginNPObject*>(obj); 249 np_object_ = static_cast<BrowserPluginBindings::BrowserPluginNPObject*>(obj);
366 np_object_->message_channel = weak_ptr_factory_.GetWeakPtr(); 250 np_object_->message_channel = weak_ptr_factory_.GetWeakPtr();
367 251
368 method_bindings_.push_back(new BrowserPluginBindingAttach);
369
370 property_bindings_.push_back( 252 property_bindings_.push_back(
371 new BrowserPluginPropertyBindingAllowTransparency); 253 new BrowserPluginPropertyBindingAllowTransparency);
372 property_bindings_.push_back(new BrowserPluginPropertyBindingContentWindow); 254 property_bindings_.push_back(new BrowserPluginPropertyBindingContentWindow);
373 } 255 }
374 256
375 BrowserPluginBindings::~BrowserPluginBindings() { 257 BrowserPluginBindings::~BrowserPluginBindings() {
376 WebBindings::releaseObject(np_object_); 258 WebBindings::releaseObject(np_object_);
377 } 259 }
378 260
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 { 261 bool BrowserPluginBindings::HasProperty(NPIdentifier name) const {
403 for (PropertyBindingList::const_iterator iter = property_bindings_.begin(); 262 for (PropertyBindingList::const_iterator iter = property_bindings_.begin();
404 iter != property_bindings_.end(); 263 iter != property_bindings_.end();
405 ++iter) { 264 ++iter) {
406 if ((*iter)->MatchesName(name)) 265 if ((*iter)->MatchesName(name))
407 return true; 266 return true;
408 } 267 }
409 return false; 268 return false;
410 } 269 }
411 270
(...skipping 30 matching lines...) Expand all
442 for (PropertyBindingList::iterator iter = property_bindings_.begin(); 301 for (PropertyBindingList::iterator iter = property_bindings_.begin();
443 iter != property_bindings_.end(); 302 iter != property_bindings_.end();
444 ++iter) { 303 ++iter) {
445 if ((*iter)->MatchesName(name)) 304 if ((*iter)->MatchesName(name))
446 return (*iter)->GetProperty(this, result); 305 return (*iter)->GetProperty(this, result);
447 } 306 }
448 return false; 307 return false;
449 } 308 }
450 309
451 } // namespace content 310 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698