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 "webkit/plugins/ppapi/ppapi_plugin_instance.h" | 5 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback_helpers.h" | 8 #include "base/callback_helpers.h" |
9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 #include "ppapi/c/dev/ppp_zoom_dev.h" | 24 #include "ppapi/c/dev/ppp_zoom_dev.h" |
25 #include "ppapi/c/pp_rect.h" | 25 #include "ppapi/c/pp_rect.h" |
26 #include "ppapi/c/ppb_audio_config.h" | 26 #include "ppapi/c/ppb_audio_config.h" |
27 #include "ppapi/c/ppb_core.h" | 27 #include "ppapi/c/ppb_core.h" |
28 #include "ppapi/c/ppb_gamepad.h" | 28 #include "ppapi/c/ppb_gamepad.h" |
29 #include "ppapi/c/ppp_input_event.h" | 29 #include "ppapi/c/ppp_input_event.h" |
30 #include "ppapi/c/ppp_instance.h" | 30 #include "ppapi/c/ppp_instance.h" |
31 #include "ppapi/c/ppp_messaging.h" | 31 #include "ppapi/c/ppp_messaging.h" |
32 #include "ppapi/c/ppp_mouse_lock.h" | 32 #include "ppapi/c/ppp_mouse_lock.h" |
33 #include "ppapi/c/private/ppp_instance_private.h" | 33 #include "ppapi/c/private/ppp_instance_private.h" |
| 34 #include "ppapi/shared_impl/ppapi_permissions.h" |
34 #include "ppapi/shared_impl/ppapi_preferences.h" | 35 #include "ppapi/shared_impl/ppapi_preferences.h" |
35 #include "ppapi/shared_impl/ppb_gamepad_shared.h" | 36 #include "ppapi/shared_impl/ppb_gamepad_shared.h" |
36 #include "ppapi/shared_impl/ppb_input_event_shared.h" | 37 #include "ppapi/shared_impl/ppb_input_event_shared.h" |
37 #include "ppapi/shared_impl/ppb_url_util_shared.h" | 38 #include "ppapi/shared_impl/ppb_url_util_shared.h" |
38 #include "ppapi/shared_impl/ppb_view_shared.h" | 39 #include "ppapi/shared_impl/ppb_view_shared.h" |
39 #include "ppapi/shared_impl/ppp_instance_combined.h" | 40 #include "ppapi/shared_impl/ppp_instance_combined.h" |
40 #include "ppapi/shared_impl/resource.h" | 41 #include "ppapi/shared_impl/resource.h" |
41 #include "ppapi/shared_impl/scoped_pp_resource.h" | 42 #include "ppapi/shared_impl/scoped_pp_resource.h" |
42 #include "ppapi/shared_impl/time_conversion.h" | 43 #include "ppapi/shared_impl/time_conversion.h" |
43 #include "ppapi/shared_impl/url_request_info_data.h" | 44 #include "ppapi/shared_impl/url_request_info_data.h" |
(...skipping 2407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2451 components); | 2452 components); |
2452 } | 2453 } |
2453 | 2454 |
2454 PP_Var PluginInstance::GetPluginInstanceURL( | 2455 PP_Var PluginInstance::GetPluginInstanceURL( |
2455 PP_Instance instance, | 2456 PP_Instance instance, |
2456 PP_URLComponents_Dev* components) { | 2457 PP_URLComponents_Dev* components) { |
2457 return ::ppapi::PPB_URLUtil_Shared::GenerateURLReturn(plugin_url_, | 2458 return ::ppapi::PPB_URLUtil_Shared::GenerateURLReturn(plugin_url_, |
2458 components); | 2459 components); |
2459 } | 2460 } |
2460 | 2461 |
2461 PP_NaClResult PluginInstance::ResetAsProxied( | 2462 PP_ExternalPluginResult PluginInstance::ResetAsProxied( |
2462 scoped_refptr<PluginModule> module) { | 2463 scoped_refptr<PluginModule> module) { |
2463 // Save the original module and switch over to the new one now that this | 2464 // Save the original module and switch over to the new one now that this |
2464 // plugin is using the IPC-based proxy. | 2465 // plugin is using the IPC-based proxy. |
2465 original_module_ = module_; | 2466 original_module_ = module_; |
2466 module_ = module; | 2467 module_ = module; |
2467 | 2468 |
2468 // Don't send any messages to the plugin until DidCreate() has finished. | 2469 // Don't send any messages to the plugin until DidCreate() has finished. |
2469 message_channel_->QueueJavaScriptMessages(); | 2470 message_channel_->QueueJavaScriptMessages(); |
2470 | 2471 |
2471 // For NaCl instances, remember the NaCl plugin instance interface, so we | 2472 // For NaCl instances, remember the NaCl plugin instance interface, so we |
2472 // can shut it down by calling its DidDestroy in our Delete() method. | 2473 // can shut it down by calling its DidDestroy in our Delete() method. |
2473 original_instance_interface_.reset(instance_interface_.release()); | 2474 original_instance_interface_.reset(instance_interface_.release()); |
2474 | 2475 |
2475 base::Callback<const void*(const char*)> get_plugin_interface_func = | 2476 base::Callback<const void*(const char*)> get_plugin_interface_func = |
2476 base::Bind(&PluginModule::GetPluginInterface, module_.get()); | 2477 base::Bind(&PluginModule::GetPluginInterface, module_.get()); |
2477 PPP_Instance_Combined* ppp_instance_combined = | 2478 PPP_Instance_Combined* ppp_instance_combined = |
2478 PPP_Instance_Combined::Create(get_plugin_interface_func); | 2479 PPP_Instance_Combined::Create(get_plugin_interface_func); |
2479 if (!ppp_instance_combined) { | 2480 if (!ppp_instance_combined) { |
2480 // The proxy must support at least one usable PPP_Instance interface. | 2481 // The proxy must support at least one usable PPP_Instance interface. |
2481 // While this could be a failure to implement the interface in the NaCl | 2482 // While this could be a failure to implement the interface in the NaCl |
2482 // module, it is more likely that the NaCl process has crashed. Either | 2483 // module, it is more likely that the NaCl process has crashed. Either |
2483 // way, report that module initialization failed. | 2484 // way, report that module initialization failed. |
2484 return PP_NACL_ERROR_MODULE; | 2485 return PP_EXTERNAL_PLUGIN_ERROR_MODULE; |
2485 } | 2486 } |
2486 | 2487 |
2487 instance_interface_.reset(ppp_instance_combined); | 2488 instance_interface_.reset(ppp_instance_combined); |
2488 // Clear all PPP interfaces we may have cached. | 2489 // Clear all PPP interfaces we may have cached. |
2489 plugin_find_interface_ = NULL; | 2490 plugin_find_interface_ = NULL; |
2490 plugin_input_event_interface_ = NULL; | 2491 plugin_input_event_interface_ = NULL; |
2491 checked_for_plugin_input_event_interface_ = false; | 2492 checked_for_plugin_input_event_interface_ = false; |
2492 plugin_messaging_interface_ = NULL; | 2493 plugin_messaging_interface_ = NULL; |
2493 checked_for_plugin_messaging_interface_ = false; | 2494 checked_for_plugin_messaging_interface_ = false; |
2494 plugin_mouse_lock_interface_ = NULL; | 2495 plugin_mouse_lock_interface_ = NULL; |
2495 plugin_pdf_interface_ = NULL; | 2496 plugin_pdf_interface_ = NULL; |
2496 checked_for_plugin_pdf_interface_ = false; | 2497 checked_for_plugin_pdf_interface_ = false; |
2497 plugin_private_interface_ = NULL; | 2498 plugin_private_interface_ = NULL; |
2498 plugin_selection_interface_ = NULL; | 2499 plugin_selection_interface_ = NULL; |
2499 plugin_textinput_interface_ = NULL; | 2500 plugin_textinput_interface_ = NULL; |
2500 plugin_zoom_interface_ = NULL; | 2501 plugin_zoom_interface_ = NULL; |
2501 | 2502 |
2502 // Re-send the DidCreate event via the proxy. | 2503 // Re-send the DidCreate event via the proxy. |
2503 scoped_ptr<const char*[]> argn_array(StringVectorToArgArray(argn_)); | 2504 scoped_ptr<const char*[]> argn_array(StringVectorToArgArray(argn_)); |
2504 scoped_ptr<const char*[]> argv_array(StringVectorToArgArray(argv_)); | 2505 scoped_ptr<const char*[]> argv_array(StringVectorToArgArray(argv_)); |
2505 if (!instance_interface_->DidCreate(pp_instance(), argn_.size(), | 2506 if (!instance_interface_->DidCreate(pp_instance(), argn_.size(), |
2506 argn_array.get(), argv_array.get())) | 2507 argn_array.get(), argv_array.get())) |
2507 return PP_NACL_ERROR_INSTANCE; | 2508 return PP_EXTERNAL_PLUGIN_ERROR_INSTANCE; |
2508 message_channel_->StopQueueingJavaScriptMessages(); | 2509 message_channel_->StopQueueingJavaScriptMessages(); |
2509 | 2510 |
2510 // Clear sent_initial_did_change_view_ and cancel any pending DidChangeView | 2511 // Clear sent_initial_did_change_view_ and cancel any pending DidChangeView |
2511 // event. This way, SendDidChangeView will send the "current" view | 2512 // event. This way, SendDidChangeView will send the "current" view |
2512 // immediately (before other events like HandleDocumentLoad). | 2513 // immediately (before other events like HandleDocumentLoad). |
2513 sent_initial_did_change_view_ = false; | 2514 sent_initial_did_change_view_ = false; |
2514 view_change_weak_ptr_factory_.InvalidateWeakPtrs(); | 2515 view_change_weak_ptr_factory_.InvalidateWeakPtrs(); |
2515 SendDidChangeView(); | 2516 SendDidChangeView(); |
2516 | 2517 |
2517 DCHECK(nacl_document_load_); | 2518 DCHECK(nacl_document_load_); |
2518 nacl_document_load_ = false; | 2519 nacl_document_load_ = false; |
2519 if (!nacl_document_response_.isNull()) { | 2520 if (!nacl_document_response_.isNull()) { |
2520 document_loader_ = NULL; | 2521 document_loader_ = NULL; |
2521 // Pass the response to the new proxy. | 2522 // Pass the response to the new proxy. |
2522 HandleDocumentLoad(nacl_document_response_); | 2523 HandleDocumentLoad(nacl_document_response_); |
2523 nacl_document_response_ = WebKit::WebURLResponse(); | 2524 nacl_document_response_ = WebKit::WebURLResponse(); |
2524 // Replay any document load events we've received to the real loader. | 2525 // Replay any document load events we've received to the real loader. |
2525 nacl_document_loader_->ReplayReceivedData(document_loader_); | 2526 nacl_document_loader_->ReplayReceivedData(document_loader_); |
2526 nacl_document_loader_.reset(NULL); | 2527 nacl_document_loader_.reset(NULL); |
2527 } | 2528 } |
2528 | 2529 |
2529 return PP_NACL_OK; | 2530 return PP_EXTERNAL_PLUGIN_OK; |
2530 } | 2531 } |
2531 | 2532 |
2532 bool PluginInstance::IsValidInstanceOf(PluginModule* module) { | 2533 bool PluginInstance::IsValidInstanceOf(PluginModule* module) { |
2533 DCHECK(module); | 2534 DCHECK(module); |
2534 return module == module_.get() || | 2535 return module == module_.get() || |
2535 module == original_module_.get(); | 2536 module == original_module_.get(); |
2536 } | 2537 } |
2537 | 2538 |
2538 NPP PluginInstance::instanceNPP() { | 2539 NPP PluginInstance::instanceNPP() { |
2539 return npp_.get(); | 2540 return npp_.get(); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2577 return 0; | 2578 return 0; |
2578 | 2579 |
2579 skia::PlatformCanvas* canvas = image_data->GetPlatformCanvas(); | 2580 skia::PlatformCanvas* canvas = image_data->GetPlatformCanvas(); |
2580 // Note: Do not SkBitmap::copyTo the canvas bitmap directly because it will | 2581 // Note: Do not SkBitmap::copyTo the canvas bitmap directly because it will |
2581 // ignore the allocated pixels in shared memory and re-allocate a new buffer. | 2582 // ignore the allocated pixels in shared memory and re-allocate a new buffer. |
2582 canvas->writePixels(image_skia_rep.sk_bitmap(), 0, 0); | 2583 canvas->writePixels(image_skia_rep.sk_bitmap(), 0, 0); |
2583 | 2584 |
2584 return image_data->GetReference(); | 2585 return image_data->GetReference(); |
2585 } | 2586 } |
2586 | 2587 |
| 2588 base::FilePath PluginInstance::GetModulePath() { |
| 2589 return module_->path(); |
| 2590 } |
| 2591 |
| 2592 PP_ExternalPluginResult PluginInstance::SwitchToOutOfProcessProxy( |
| 2593 const base::FilePath& file_path, |
| 2594 ::ppapi::PpapiPermissions permissions, |
| 2595 const IPC::ChannelHandle& channel_handle, |
| 2596 base::ProcessId plugin_pid, |
| 2597 int plugin_child_id) { |
| 2598 // Create a new module for each instance of the external plugin that is using |
| 2599 // the IPC based out-of-process proxy. We can't use the existing module, |
| 2600 // because it is configured for the in-process plugin, and we must keep it |
| 2601 // that way to allow the page to create other instances. |
| 2602 scoped_refptr<webkit::ppapi::PluginModule> external_plugin_module( |
| 2603 module_->CreateModuleForExternalPluginInstance()); |
| 2604 |
| 2605 content::RendererPpapiHost* renderer_ppapi_host = |
| 2606 delegate_->CreateExternalPluginModule( |
| 2607 external_plugin_module, |
| 2608 file_path, |
| 2609 permissions, |
| 2610 channel_handle, |
| 2611 plugin_pid, |
| 2612 plugin_child_id); |
| 2613 if (!renderer_ppapi_host) { |
| 2614 DLOG(ERROR) << "CreateExternalPluginModule() failed"; |
| 2615 return PP_EXTERNAL_PLUGIN_ERROR_MODULE; |
| 2616 } |
| 2617 |
| 2618 // Finally, switch the instance to the proxy. |
| 2619 return external_plugin_module->InitAsProxiedExternalPlugin(this); |
| 2620 } |
| 2621 |
2587 void PluginInstance::DoSetCursor(WebCursorInfo* cursor) { | 2622 void PluginInstance::DoSetCursor(WebCursorInfo* cursor) { |
2588 cursor_.reset(cursor); | 2623 cursor_.reset(cursor); |
2589 if (fullscreen_container_) { | 2624 if (fullscreen_container_) { |
2590 fullscreen_container_->DidChangeCursor(*cursor); | 2625 fullscreen_container_->DidChangeCursor(*cursor); |
2591 } else { | 2626 } else { |
2592 delegate()->DidChangeCursor(this, *cursor); | 2627 delegate()->DidChangeCursor(this, *cursor); |
2593 } | 2628 } |
2594 } | 2629 } |
2595 | 2630 |
2596 bool PluginInstance::CanAccessMainFrame() const { | 2631 bool PluginInstance::CanAccessMainFrame() const { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2647 screen_size_for_fullscreen_ = gfx::Size(); | 2682 screen_size_for_fullscreen_ = gfx::Size(); |
2648 WebElement element = container_->element(); | 2683 WebElement element = container_->element(); |
2649 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_); | 2684 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_); |
2650 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_); | 2685 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_); |
2651 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_); | 2686 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_); |
2652 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_); | 2687 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_); |
2653 } | 2688 } |
2654 | 2689 |
2655 } // namespace ppapi | 2690 } // namespace ppapi |
2656 } // namespace webkit | 2691 } // namespace webkit |
OLD | NEW |