| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "webkit/glue/plugins/pepper_plugin_module.h" | 5 #include "webkit/glue/plugins/pepper_plugin_module.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 #include "ppapi/c/pp_module.h" | 40 #include "ppapi/c/pp_module.h" |
| 41 #include "ppapi/c/pp_resource.h" | 41 #include "ppapi/c/pp_resource.h" |
| 42 #include "ppapi/c/pp_var.h" | 42 #include "ppapi/c/pp_var.h" |
| 43 #include "ppapi/c/ppb_core.h" | 43 #include "ppapi/c/ppb_core.h" |
| 44 #include "ppapi/c/ppb_graphics_2d.h" | 44 #include "ppapi/c/ppb_graphics_2d.h" |
| 45 #include "ppapi/c/ppb_image_data.h" | 45 #include "ppapi/c/ppb_image_data.h" |
| 46 #include "ppapi/c/ppb_instance.h" | 46 #include "ppapi/c/ppb_instance.h" |
| 47 #include "ppapi/c/ppb_var.h" | 47 #include "ppapi/c/ppb_var.h" |
| 48 #include "ppapi/c/ppp.h" | 48 #include "ppapi/c/ppp.h" |
| 49 #include "ppapi/c/ppp_instance.h" | 49 #include "ppapi/c/ppp_instance.h" |
| 50 #include "ppapi/proxy/host_dispatcher.h" |
| 51 #include "ppapi/proxy/ppapi_messages.h" |
| 50 #include "webkit/glue/plugins/pepper_audio.h" | 52 #include "webkit/glue/plugins/pepper_audio.h" |
| 51 #include "webkit/glue/plugins/pepper_buffer.h" | 53 #include "webkit/glue/plugins/pepper_buffer.h" |
| 52 #include "webkit/glue/plugins/pepper_char_set.h" | 54 #include "webkit/glue/plugins/pepper_char_set.h" |
| 53 #include "webkit/glue/plugins/pepper_cursor_control.h" | 55 #include "webkit/glue/plugins/pepper_cursor_control.h" |
| 54 #include "webkit/glue/plugins/pepper_directory_reader.h" | 56 #include "webkit/glue/plugins/pepper_directory_reader.h" |
| 55 #include "webkit/glue/plugins/pepper_file_chooser.h" | 57 #include "webkit/glue/plugins/pepper_file_chooser.h" |
| 56 #include "webkit/glue/plugins/pepper_file_io.h" | 58 #include "webkit/glue/plugins/pepper_file_io.h" |
| 57 #include "webkit/glue/plugins/pepper_file_ref.h" | 59 #include "webkit/glue/plugins/pepper_file_ref.h" |
| 58 #include "webkit/glue/plugins/pepper_file_system.h" | 60 #include "webkit/glue/plugins/pepper_file_system.h" |
| 59 #include "webkit/glue/plugins/pepper_font.h" | 61 #include "webkit/glue/plugins/pepper_font.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 73 #include "webkit/glue/plugins/pepper_var.h" | 75 #include "webkit/glue/plugins/pepper_var.h" |
| 74 #include "webkit/glue/plugins/pepper_video_decoder.h" | 76 #include "webkit/glue/plugins/pepper_video_decoder.h" |
| 75 #include "webkit/glue/plugins/pepper_widget.h" | 77 #include "webkit/glue/plugins/pepper_widget.h" |
| 76 #include "webkit/glue/plugins/ppb_private.h" | 78 #include "webkit/glue/plugins/ppb_private.h" |
| 77 #include "webkit/glue/plugins/ppb_private2.h" | 79 #include "webkit/glue/plugins/ppb_private2.h" |
| 78 | 80 |
| 79 #ifdef ENABLE_GPU | 81 #ifdef ENABLE_GPU |
| 80 #include "webkit/glue/plugins/pepper_graphics_3d.h" | 82 #include "webkit/glue/plugins/pepper_graphics_3d.h" |
| 81 #endif // ENABLE_GPU | 83 #endif // ENABLE_GPU |
| 82 | 84 |
| 85 #if defined(OS_POSIX) |
| 86 #include "ipc/ipc_channel_posix.h" |
| 87 #endif |
| 88 |
| 83 namespace pepper { | 89 namespace pepper { |
| 84 | 90 |
| 85 namespace { | 91 namespace { |
| 86 | 92 |
| 87 // Maintains all currently loaded plugin libs for validating PP_Module | 93 // Maintains all currently loaded plugin libs for validating PP_Module |
| 88 // identifiers. | 94 // identifiers. |
| 89 typedef std::set<PluginModule*> PluginModuleSet; | 95 typedef std::set<PluginModule*> PluginModuleSet; |
| 90 | 96 |
| 91 PluginModuleSet* GetLivePluginSet() { | 97 PluginModuleSet* GetLivePluginSet() { |
| 92 static PluginModuleSet live_plugin_libs; | 98 static PluginModuleSet live_plugin_libs; |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 const FilePath& path) { | 329 const FilePath& path) { |
| 324 // FIXME(brettw) do uniquifying of the plugin here like the NPAPI one. | 330 // FIXME(brettw) do uniquifying of the plugin here like the NPAPI one. |
| 325 | 331 |
| 326 scoped_refptr<PluginModule> lib(new PluginModule()); | 332 scoped_refptr<PluginModule> lib(new PluginModule()); |
| 327 if (!lib->InitFromFile(path)) | 333 if (!lib->InitFromFile(path)) |
| 328 return NULL; | 334 return NULL; |
| 329 | 335 |
| 330 return lib; | 336 return lib; |
| 331 } | 337 } |
| 332 | 338 |
| 339 // static |
| 333 scoped_refptr<PluginModule> PluginModule::CreateInternalModule( | 340 scoped_refptr<PluginModule> PluginModule::CreateInternalModule( |
| 334 EntryPoints entry_points) { | 341 EntryPoints entry_points) { |
| 335 scoped_refptr<PluginModule> lib(new PluginModule()); | 342 scoped_refptr<PluginModule> lib(new PluginModule()); |
| 336 if (!lib->InitFromEntryPoints(entry_points)) | 343 if (!lib->InitFromEntryPoints(entry_points)) |
| 337 return NULL; | 344 return NULL; |
| 338 | 345 |
| 339 return lib; | 346 return lib; |
| 340 } | 347 } |
| 341 | 348 |
| 342 // static | 349 // static |
| 350 scoped_refptr<PluginModule> PluginModule::CreateOutOfProcessModule( |
| 351 MessageLoop* ipc_message_loop, |
| 352 const IPC::ChannelHandle& handle, |
| 353 base::WaitableEvent* shutdown_event) { |
| 354 scoped_refptr<PluginModule> lib(new PluginModule); |
| 355 if (!lib->InitForOutOfProcess(ipc_message_loop, handle, shutdown_event)) |
| 356 return NULL; |
| 357 return lib; |
| 358 } |
| 359 |
| 360 // static |
| 343 const PPB_Core* PluginModule::GetCore() { | 361 const PPB_Core* PluginModule::GetCore() { |
| 344 return &core_interface; | 362 return &core_interface; |
| 345 } | 363 } |
| 346 | 364 |
| 347 bool PluginModule::InitFromEntryPoints(const EntryPoints& entry_points) { | 365 bool PluginModule::InitFromEntryPoints(const EntryPoints& entry_points) { |
| 348 if (initialized_) | 366 if (initialized_) |
| 349 return true; | 367 return true; |
| 350 | 368 |
| 351 // Attempt to run the initialization funciton. | 369 // Attempt to run the initialization funciton. |
| 352 int retval = entry_points.initialize_module(pp_module(), &GetInterface); | 370 int retval = entry_points.initialize_module(pp_module(), &GetInterface); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 374 base::UnloadNativeLibrary(library); | 392 base::UnloadNativeLibrary(library); |
| 375 return false; | 393 return false; |
| 376 } | 394 } |
| 377 | 395 |
| 378 // We let InitFromEntryPoints() handle setting the all the internal state | 396 // We let InitFromEntryPoints() handle setting the all the internal state |
| 379 // of the object other than the |library_| reference. | 397 // of the object other than the |library_| reference. |
| 380 library_ = library; | 398 library_ = library; |
| 381 return true; | 399 return true; |
| 382 } | 400 } |
| 383 | 401 |
| 402 bool PluginModule::InitForOutOfProcess(MessageLoop* ipc_message_loop, |
| 403 const IPC::ChannelHandle& handle, |
| 404 base::WaitableEvent* shutdown_event) { |
| 405 const PPB_Var_Deprecated* var_interface = |
| 406 reinterpret_cast<const PPB_Var_Deprecated*>( |
| 407 GetInterface(PPB_VAR_DEPRECATED_INTERFACE)); |
| 408 dispatcher_.reset(new pp::proxy::HostDispatcher(var_interface, |
| 409 pp_module(), &GetInterface)); |
| 410 |
| 411 #if defined(OS_POSIX) |
| 412 // If we received a ChannelHandle, register it now. |
| 413 if (handle.socket.fd >= 0) |
| 414 IPC::AddChannelSocket(handle.name, handle.socket.fd); |
| 415 #endif |
| 416 |
| 417 if (!dispatcher_->InitWithChannel(ipc_message_loop, handle.name, true, |
| 418 shutdown_event)) { |
| 419 dispatcher_.reset(); |
| 420 return false; |
| 421 } |
| 422 |
| 423 bool init_result = false; |
| 424 dispatcher_->Send(new PpapiMsg_InitializeModule(pp_module(), &init_result)); |
| 425 |
| 426 if (!init_result) { |
| 427 // TODO(brettw) does the module get unloaded in this case? |
| 428 dispatcher_.reset(); |
| 429 return false; |
| 430 } |
| 431 return true; |
| 432 } |
| 433 |
| 384 // static | 434 // static |
| 385 bool PluginModule::LoadEntryPoints(const base::NativeLibrary& library, | 435 bool PluginModule::LoadEntryPoints(const base::NativeLibrary& library, |
| 386 EntryPoints* entry_points) { | 436 EntryPoints* entry_points) { |
| 387 | |
| 388 entry_points->get_interface = | 437 entry_points->get_interface = |
| 389 reinterpret_cast<PPP_GetInterfaceFunc>( | 438 reinterpret_cast<PPP_GetInterfaceFunc>( |
| 390 base::GetFunctionPointerFromNativeLibrary(library, | 439 base::GetFunctionPointerFromNativeLibrary(library, |
| 391 "PPP_GetInterface")); | 440 "PPP_GetInterface")); |
| 392 if (!entry_points->get_interface) { | 441 if (!entry_points->get_interface) { |
| 393 LOG(WARNING) << "No PPP_GetInterface in plugin library"; | 442 LOG(WARNING) << "No PPP_GetInterface in plugin library"; |
| 394 return false; | 443 return false; |
| 395 } | 444 } |
| 396 | 445 |
| 397 entry_points->initialize_module = | 446 entry_points->initialize_module = |
| (...skipping 16 matching lines...) Expand all Loading... |
| 414 } | 463 } |
| 415 | 464 |
| 416 PluginInstance* PluginModule::CreateInstance(PluginDelegate* delegate) { | 465 PluginInstance* PluginModule::CreateInstance(PluginDelegate* delegate) { |
| 417 const PPP_Instance* plugin_instance_interface = | 466 const PPP_Instance* plugin_instance_interface = |
| 418 reinterpret_cast<const PPP_Instance*>(GetPluginInterface( | 467 reinterpret_cast<const PPP_Instance*>(GetPluginInterface( |
| 419 PPP_INSTANCE_INTERFACE)); | 468 PPP_INSTANCE_INTERFACE)); |
| 420 if (!plugin_instance_interface) { | 469 if (!plugin_instance_interface) { |
| 421 LOG(WARNING) << "Plugin doesn't support instance interface, failing."; | 470 LOG(WARNING) << "Plugin doesn't support instance interface, failing."; |
| 422 return NULL; | 471 return NULL; |
| 423 } | 472 } |
| 424 return new PluginInstance(delegate, this, plugin_instance_interface); | 473 PluginInstance* instance = new PluginInstance(delegate, this, |
| 474 plugin_instance_interface); |
| 475 if (dispatcher_.get()) { |
| 476 pp::proxy::HostDispatcher::SetForInstance(instance->pp_instance(), |
| 477 dispatcher_.get()); |
| 478 } |
| 479 return instance; |
| 425 } | 480 } |
| 426 | 481 |
| 427 PluginInstance* PluginModule::GetSomeInstance() const { | 482 PluginInstance* PluginModule::GetSomeInstance() const { |
| 428 // This will generally crash later if there is not actually any instance to | 483 // This will generally crash later if there is not actually any instance to |
| 429 // return, so we force a crash now to make bugs easier to track down. | 484 // return, so we force a crash now to make bugs easier to track down. |
| 430 CHECK(!instances_.empty()); | 485 CHECK(!instances_.empty()); |
| 431 return *instances_.begin(); | 486 return *instances_.begin(); |
| 432 } | 487 } |
| 433 | 488 |
| 434 const void* PluginModule::GetPluginInterface(const char* name) const { | 489 const void* PluginModule::GetPluginInterface(const char* name) const { |
| 490 if (dispatcher_.get()) |
| 491 return dispatcher_->GetProxiedInterface(name); |
| 492 |
| 493 // In-process plugins. |
| 435 if (!entry_points_.get_interface) | 494 if (!entry_points_.get_interface) |
| 436 return NULL; | 495 return NULL; |
| 437 return entry_points_.get_interface(name); | 496 return entry_points_.get_interface(name); |
| 438 } | 497 } |
| 439 | 498 |
| 440 void PluginModule::InstanceCreated(PluginInstance* instance) { | 499 void PluginModule::InstanceCreated(PluginInstance* instance) { |
| 441 instances_.insert(instance); | 500 instances_.insert(instance); |
| 442 } | 501 } |
| 443 | 502 |
| 444 void PluginModule::InstanceDeleted(PluginInstance* instance) { | 503 void PluginModule::InstanceDeleted(PluginInstance* instance) { |
| 504 pp::proxy::HostDispatcher::RemoveForInstance(instance->pp_instance()); |
| 445 instances_.erase(instance); | 505 instances_.erase(instance); |
| 446 } | 506 } |
| 447 | 507 |
| 448 void PluginModule::AddNPObjectVar(ObjectVar* object_var) { | 508 void PluginModule::AddNPObjectVar(ObjectVar* object_var) { |
| 449 DCHECK(np_object_to_object_var_.find(object_var->np_object()) == | 509 DCHECK(np_object_to_object_var_.find(object_var->np_object()) == |
| 450 np_object_to_object_var_.end()) << "ObjectVar already in map"; | 510 np_object_to_object_var_.end()) << "ObjectVar already in map"; |
| 451 np_object_to_object_var_[object_var->np_object()] = object_var; | 511 np_object_to_object_var_[object_var->np_object()] = object_var; |
| 452 } | 512 } |
| 453 | 513 |
| 454 void PluginModule::RemoveNPObjectVar(ObjectVar* object_var) { | 514 void PluginModule::RemoveNPObjectVar(ObjectVar* object_var) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 479 live_plugin_objects_.insert(plugin_object); | 539 live_plugin_objects_.insert(plugin_object); |
| 480 } | 540 } |
| 481 | 541 |
| 482 void PluginModule::RemovePluginObject(PluginObject* plugin_object) { | 542 void PluginModule::RemovePluginObject(PluginObject* plugin_object) { |
| 483 // Don't actually verify that the object is in the set since during module | 543 // Don't actually verify that the object is in the set since during module |
| 484 // deletion we'll be in the process of freeing them. | 544 // deletion we'll be in the process of freeing them. |
| 485 live_plugin_objects_.erase(plugin_object); | 545 live_plugin_objects_.erase(plugin_object); |
| 486 } | 546 } |
| 487 | 547 |
| 488 } // namespace pepper | 548 } // namespace pepper |
| OLD | NEW |