| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "chrome/plugin/npobject_proxy.h" | 5 #include "chrome/plugin/npobject_proxy.h" |
| 6 | 6 |
| 7 #include "base/waitable_event.h" | 7 #include "base/waitable_event.h" |
| 8 #include "chrome/common/plugin_messages.h" | 8 #include "chrome/common/plugin_messages.h" |
| 9 #include "chrome/plugin/npobject_util.h" | 9 #include "chrome/plugin/npobject_util.h" |
| 10 #include "chrome/plugin/plugin_channel_base.h" | 10 #include "chrome/plugin/plugin_channel_base.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 proxy = wrapper->proxy; | 42 proxy = wrapper->proxy; |
| 43 } | 43 } |
| 44 | 44 |
| 45 return proxy; | 45 return proxy; |
| 46 } | 46 } |
| 47 | 47 |
| 48 NPObjectProxy::NPObjectProxy( | 48 NPObjectProxy::NPObjectProxy( |
| 49 PluginChannelBase* channel, | 49 PluginChannelBase* channel, |
| 50 int route_id, | 50 int route_id, |
| 51 intptr_t npobject_ptr, | 51 intptr_t npobject_ptr, |
| 52 base::WaitableEvent* modal_dialog_event) | 52 base::WaitableEvent* modal_dialog_event, |
| 53 const GURL& page_url) |
| 53 : channel_(channel), | 54 : channel_(channel), |
| 54 route_id_(route_id), | 55 route_id_(route_id), |
| 55 npobject_ptr_(npobject_ptr), | 56 npobject_ptr_(npobject_ptr), |
| 56 modal_dialog_event_(modal_dialog_event) { | 57 modal_dialog_event_(modal_dialog_event), |
| 58 page_url_(page_url) { |
| 57 channel_->AddRoute(route_id, this, true); | 59 channel_->AddRoute(route_id, this, true); |
| 58 } | 60 } |
| 59 | 61 |
| 60 NPObjectProxy::~NPObjectProxy() { | 62 NPObjectProxy::~NPObjectProxy() { |
| 61 if (channel_.get()) { | 63 if (channel_.get()) { |
| 62 Send(new NPObjectMsg_Release(route_id_)); | 64 Send(new NPObjectMsg_Release(route_id_)); |
| 63 if (channel_.get()) | 65 if (channel_.get()) |
| 64 channel_->RemoveRoute(route_id_); | 66 channel_->RemoveRoute(route_id_); |
| 65 } | 67 } |
| 66 } | 68 } |
| 67 | 69 |
| 68 NPObject* NPObjectProxy::Create(PluginChannelBase* channel, | 70 NPObject* NPObjectProxy::Create(PluginChannelBase* channel, |
| 69 int route_id, | 71 int route_id, |
| 70 intptr_t npobject_ptr, | 72 intptr_t npobject_ptr, |
| 71 base::WaitableEvent* modal_dialog_event) { | 73 base::WaitableEvent* modal_dialog_event, |
| 74 const GURL& page_url) { |
| 72 NPObjectWrapper* obj = reinterpret_cast<NPObjectWrapper*>( | 75 NPObjectWrapper* obj = reinterpret_cast<NPObjectWrapper*>( |
| 73 NPN_CreateObject(0, &npclass_proxy_)); | 76 NPN_CreateObject(0, &npclass_proxy_)); |
| 74 obj->proxy = new NPObjectProxy( | 77 obj->proxy = new NPObjectProxy( |
| 75 channel, route_id, npobject_ptr, modal_dialog_event); | 78 channel, route_id, npobject_ptr, modal_dialog_event, page_url); |
| 76 | 79 |
| 77 return reinterpret_cast<NPObject*>(obj); | 80 return reinterpret_cast<NPObject*>(obj); |
| 78 } | 81 } |
| 79 | 82 |
| 80 bool NPObjectProxy::Send(IPC::Message* msg) { | 83 bool NPObjectProxy::Send(IPC::Message* msg) { |
| 81 if (channel_.get()) | 84 if (channel_.get()) |
| 82 return channel_->Send(msg); | 85 return channel_->Send(msg); |
| 83 | 86 |
| 84 delete msg; | 87 delete msg; |
| 85 return false; | 88 return false; |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 CreateNPIdentifierParam(name, &name_param); | 162 CreateNPIdentifierParam(name, &name_param); |
| 160 } | 163 } |
| 161 | 164 |
| 162 // Note: This instance can get destroyed in the context of | 165 // Note: This instance can get destroyed in the context of |
| 163 // Send so addref the channel in this scope. | 166 // Send so addref the channel in this scope. |
| 164 scoped_refptr<PluginChannelBase> channel_copy = proxy->channel_; | 167 scoped_refptr<PluginChannelBase> channel_copy = proxy->channel_; |
| 165 std::vector<NPVariant_Param> args_param; | 168 std::vector<NPVariant_Param> args_param; |
| 166 for (unsigned int i = 0; i < arg_count; ++i) { | 169 for (unsigned int i = 0; i < arg_count; ++i) { |
| 167 NPVariant_Param param; | 170 NPVariant_Param param; |
| 168 CreateNPVariantParam( | 171 CreateNPVariantParam( |
| 169 args[i], channel_copy, ¶m, false, proxy->modal_dialog_event_); | 172 args[i], channel_copy, ¶m, false, proxy->modal_dialog_event_, |
| 173 proxy->page_url_); |
| 170 args_param.push_back(param); | 174 args_param.push_back(param); |
| 171 } | 175 } |
| 172 | 176 |
| 173 NPVariant_Param param_result; | 177 NPVariant_Param param_result; |
| 174 NPObjectMsg_Invoke* msg = new NPObjectMsg_Invoke( | 178 NPObjectMsg_Invoke* msg = new NPObjectMsg_Invoke( |
| 175 proxy->route_id_, is_default, name_param, args_param, ¶m_result, | 179 proxy->route_id_, is_default, name_param, args_param, ¶m_result, |
| 176 &result); | 180 &result); |
| 177 | 181 |
| 178 // If we're in the plugin process and this invoke leads to a dialog box, the | 182 // If we're in the plugin process and this invoke leads to a dialog box, the |
| 179 // plugin will hang the window hierarchy unless we pump the window message | 183 // plugin will hang the window hierarchy unless we pump the window message |
| 180 // queue while waiting for a reply. We need to do this to simulate what | 184 // queue while waiting for a reply. We need to do this to simulate what |
| 181 // happens when everything runs in-process (while calling MessageBox window | 185 // happens when everything runs in-process (while calling MessageBox window |
| 182 // messages are pumped). | 186 // messages are pumped). |
| 183 msg->set_pump_messages_event(proxy->modal_dialog_event_); | 187 msg->set_pump_messages_event(proxy->modal_dialog_event_); |
| 184 | 188 |
| 185 base::WaitableEvent* modal_dialog_event_handle = proxy->modal_dialog_event_; | 189 base::WaitableEvent* modal_dialog_event_handle = proxy->modal_dialog_event_; |
| 186 | 190 |
| 191 GURL page_url = proxy->page_url_; |
| 187 proxy->Send(msg); | 192 proxy->Send(msg); |
| 188 | 193 |
| 189 // Send may delete proxy. | 194 // Send may delete proxy. |
| 190 proxy = NULL; | 195 proxy = NULL; |
| 191 | 196 |
| 192 if (!result) | 197 if (!result) |
| 193 return false; | 198 return false; |
| 194 | 199 |
| 195 CreateNPVariant( | 200 CreateNPVariant( |
| 196 param_result, channel_copy, np_result, modal_dialog_event_handle); | 201 param_result, channel_copy, np_result, modal_dialog_event_handle, |
| 202 page_url); |
| 197 return true; | 203 return true; |
| 198 } | 204 } |
| 199 | 205 |
| 200 bool NPObjectProxy::NPHasProperty(NPObject *obj, | 206 bool NPObjectProxy::NPHasProperty(NPObject *obj, |
| 201 NPIdentifier name) { | 207 NPIdentifier name) { |
| 202 bool result = false; | 208 bool result = false; |
| 203 NPObjectProxy* proxy = GetProxy(obj); | 209 NPObjectProxy* proxy = GetProxy(obj); |
| 204 if (!proxy) { | 210 if (!proxy) { |
| 205 return obj->_class->hasProperty(obj, name); | 211 return obj->_class->hasProperty(obj, name); |
| 206 } | 212 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 236 if (!proxy) { | 242 if (!proxy) { |
| 237 return obj->_class->getProperty(obj, name, np_result); | 243 return obj->_class->getProperty(obj, name, np_result); |
| 238 } | 244 } |
| 239 | 245 |
| 240 NPIdentifier_Param name_param; | 246 NPIdentifier_Param name_param; |
| 241 CreateNPIdentifierParam(name, &name_param); | 247 CreateNPIdentifierParam(name, &name_param); |
| 242 | 248 |
| 243 NPVariant_Param param; | 249 NPVariant_Param param; |
| 244 base::WaitableEvent* modal_dialog_event_handle = proxy->modal_dialog_event_; | 250 base::WaitableEvent* modal_dialog_event_handle = proxy->modal_dialog_event_; |
| 245 scoped_refptr<PluginChannelBase> channel(proxy->channel_); | 251 scoped_refptr<PluginChannelBase> channel(proxy->channel_); |
| 252 |
| 253 GURL page_url = proxy->page_url_; |
| 246 proxy->Send(new NPObjectMsg_GetProperty( | 254 proxy->Send(new NPObjectMsg_GetProperty( |
| 247 proxy->route_id(), name_param, ¶m, &result)); | 255 proxy->route_id(), name_param, ¶m, &result)); |
| 248 // Send may delete proxy. | 256 // Send may delete proxy. |
| 249 proxy = NULL; | 257 proxy = NULL; |
| 250 if (!result) | 258 if (!result) |
| 251 return false; | 259 return false; |
| 252 | 260 |
| 253 CreateNPVariant( | 261 CreateNPVariant( |
| 254 param, channel.get(), np_result, modal_dialog_event_handle); | 262 param, channel.get(), np_result, modal_dialog_event_handle, page_url); |
| 255 | 263 |
| 256 return true; | 264 return true; |
| 257 } | 265 } |
| 258 | 266 |
| 259 bool NPObjectProxy::NPSetProperty(NPObject *obj, | 267 bool NPObjectProxy::NPSetProperty(NPObject *obj, |
| 260 NPIdentifier name, | 268 NPIdentifier name, |
| 261 const NPVariant *value) { | 269 const NPVariant *value) { |
| 262 bool result = false; | 270 bool result = false; |
| 263 NPObjectProxy* proxy = GetProxy(obj); | 271 NPObjectProxy* proxy = GetProxy(obj); |
| 264 if (!proxy) { | 272 if (!proxy) { |
| 265 return obj->_class->setProperty(obj, name, value); | 273 return obj->_class->setProperty(obj, name, value); |
| 266 } | 274 } |
| 267 | 275 |
| 268 NPIdentifier_Param name_param; | 276 NPIdentifier_Param name_param; |
| 269 CreateNPIdentifierParam(name, &name_param); | 277 CreateNPIdentifierParam(name, &name_param); |
| 270 | 278 |
| 271 NPVariant_Param value_param; | 279 NPVariant_Param value_param; |
| 272 CreateNPVariantParam( | 280 CreateNPVariantParam( |
| 273 *value, proxy->channel(), &value_param, false, | 281 *value, proxy->channel(), &value_param, false, |
| 274 proxy->modal_dialog_event_); | 282 proxy->modal_dialog_event_, proxy->page_url_); |
| 275 | 283 |
| 276 proxy->Send(new NPObjectMsg_SetProperty( | 284 proxy->Send(new NPObjectMsg_SetProperty( |
| 277 proxy->route_id(), name_param, value_param, &result)); | 285 proxy->route_id(), name_param, value_param, &result)); |
| 278 // Send may delete proxy. | 286 // Send may delete proxy. |
| 279 proxy = NULL; | 287 proxy = NULL; |
| 280 | 288 |
| 281 return result; | 289 return result; |
| 282 } | 290 } |
| 283 | 291 |
| 284 bool NPObjectProxy::NPRemoveProperty(NPObject *obj, | 292 bool NPObjectProxy::NPRemoveProperty(NPObject *obj, |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 | 359 |
| 352 bool result = false; | 360 bool result = false; |
| 353 | 361 |
| 354 // Note: This instance can get destroyed in the context of | 362 // Note: This instance can get destroyed in the context of |
| 355 // Send so addref the channel in this scope. | 363 // Send so addref the channel in this scope. |
| 356 scoped_refptr<PluginChannelBase> channel_copy = proxy->channel_; | 364 scoped_refptr<PluginChannelBase> channel_copy = proxy->channel_; |
| 357 std::vector<NPVariant_Param> args_param; | 365 std::vector<NPVariant_Param> args_param; |
| 358 for (unsigned int i = 0; i < arg_count; ++i) { | 366 for (unsigned int i = 0; i < arg_count; ++i) { |
| 359 NPVariant_Param param; | 367 NPVariant_Param param; |
| 360 CreateNPVariantParam( | 368 CreateNPVariantParam( |
| 361 args[i], channel_copy, ¶m, false, proxy->modal_dialog_event_); | 369 args[i], channel_copy, ¶m, false, proxy->modal_dialog_event_, |
| 370 proxy->page_url_); |
| 362 args_param.push_back(param); | 371 args_param.push_back(param); |
| 363 } | 372 } |
| 364 | 373 |
| 365 NPVariant_Param param_result; | 374 NPVariant_Param param_result; |
| 366 NPObjectMsg_Construct* msg = new NPObjectMsg_Construct( | 375 NPObjectMsg_Construct* msg = new NPObjectMsg_Construct( |
| 367 proxy->route_id_, args_param, ¶m_result, &result); | 376 proxy->route_id_, args_param, ¶m_result, &result); |
| 368 | 377 |
| 369 // See comment in NPObjectProxy::NPInvokePrivate. | 378 // See comment in NPObjectProxy::NPInvokePrivate. |
| 370 msg->set_pump_messages_event(proxy->modal_dialog_event_); | 379 msg->set_pump_messages_event(proxy->modal_dialog_event_); |
| 371 | 380 |
| 372 base::WaitableEvent* modal_dialog_event_handle = proxy->modal_dialog_event_; | 381 base::WaitableEvent* modal_dialog_event_handle = proxy->modal_dialog_event_; |
| 373 | 382 |
| 383 GURL page_url = proxy->page_url_; |
| 374 proxy->Send(msg); | 384 proxy->Send(msg); |
| 375 | 385 |
| 376 // Send may delete proxy. | 386 // Send may delete proxy. |
| 377 proxy = NULL; | 387 proxy = NULL; |
| 378 | 388 |
| 379 if (!result) | 389 if (!result) |
| 380 return false; | 390 return false; |
| 381 | 391 |
| 382 CreateNPVariant( | 392 CreateNPVariant( |
| 383 param_result, channel_copy, np_result, modal_dialog_event_handle); | 393 param_result, channel_copy, np_result, modal_dialog_event_handle, |
| 394 page_url); |
| 384 return true; | 395 return true; |
| 385 } | 396 } |
| 386 | 397 |
| 387 bool NPObjectProxy::NPNEvaluate(NPP npp, | 398 bool NPObjectProxy::NPNEvaluate(NPP npp, |
| 388 NPObject *obj, | 399 NPObject *obj, |
| 389 NPString *script, | 400 NPString *script, |
| 390 NPVariant *result_var) { | 401 NPVariant *result_var) { |
| 391 bool result = false; | 402 bool result = false; |
| 392 NPObjectProxy* proxy = GetProxy(obj); | 403 NPObjectProxy* proxy = GetProxy(obj); |
| 393 if (!proxy) { | 404 if (!proxy) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 411 script_str, | 422 script_str, |
| 412 popups_allowed, | 423 popups_allowed, |
| 413 &result_param, | 424 &result_param, |
| 414 &result); | 425 &result); |
| 415 | 426 |
| 416 // Please refer to the comments in NPObjectProxy::NPInvokePrivate for | 427 // Please refer to the comments in NPObjectProxy::NPInvokePrivate for |
| 417 // the reasoning behind setting the pump messages event in the sync message. | 428 // the reasoning behind setting the pump messages event in the sync message. |
| 418 msg->set_pump_messages_event(proxy->modal_dialog_event_); | 429 msg->set_pump_messages_event(proxy->modal_dialog_event_); |
| 419 scoped_refptr<PluginChannelBase> channel(proxy->channel_); | 430 scoped_refptr<PluginChannelBase> channel(proxy->channel_); |
| 420 base::WaitableEvent* modal_dialog_event_handle = proxy->modal_dialog_event_; | 431 base::WaitableEvent* modal_dialog_event_handle = proxy->modal_dialog_event_; |
| 432 |
| 433 GURL page_url = proxy->page_url_; |
| 421 proxy->Send(msg); | 434 proxy->Send(msg); |
| 422 // Send may delete proxy. | 435 // Send may delete proxy. |
| 423 proxy = NULL; | 436 proxy = NULL; |
| 424 if (!result) | 437 if (!result) |
| 425 return false; | 438 return false; |
| 426 | 439 |
| 427 CreateNPVariant( | 440 CreateNPVariant( |
| 428 result_param, channel.get(), result_var, modal_dialog_event_handle); | 441 result_param, channel.get(), result_var, modal_dialog_event_handle, |
| 442 page_url); |
| 429 return true; | 443 return true; |
| 430 } | 444 } |
| 431 | 445 |
| 432 void NPObjectProxy::NPNSetException(NPObject *obj, | 446 void NPObjectProxy::NPNSetException(NPObject *obj, |
| 433 const NPUTF8 *message) { | 447 const NPUTF8 *message) { |
| 434 NPObjectProxy* proxy = GetProxy(obj); | 448 NPObjectProxy* proxy = GetProxy(obj); |
| 435 if (!proxy) { | 449 if (!proxy) { |
| 436 return; | 450 return; |
| 437 } | 451 } |
| 438 | 452 |
| 439 NPVariant_Param result_param; | 453 NPVariant_Param result_param; |
| 440 std::string message_str(message); | 454 std::string message_str(message); |
| 441 | 455 |
| 442 proxy->Send(new NPObjectMsg_SetException(proxy->route_id(), message_str)); | 456 proxy->Send(new NPObjectMsg_SetException(proxy->route_id(), message_str)); |
| 443 // Send may delete proxy. | 457 // Send may delete proxy. |
| 444 proxy = NULL; | 458 proxy = NULL; |
| 445 } | 459 } |
| OLD | NEW |