Chromium Code Reviews| Index: content/browser/browser_plugin/browser_plugin_guest.cc |
| diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc |
| index dba54f42cd8bc1f63b9653d47c433e538ce93aa3..eadc30dbd9914f041a10454a306b47dcbb474a04 100644 |
| --- a/content/browser/browser_plugin/browser_plugin_guest.cc |
| +++ b/content/browser/browser_plugin/browser_plugin_guest.cc |
| @@ -72,7 +72,7 @@ BrowserPluginGuest::BrowserPluginGuest(bool has_render_view, |
| WebContentsImpl* web_contents, |
| BrowserPluginGuestDelegate* delegate) |
| : WebContentsObserver(web_contents), |
| - owner_web_contents_(NULL), |
| + owner_web_contents_(nullptr), |
| attached_(false), |
| browser_plugin_instance_id_(browser_plugin::kInstanceIDNone), |
| guest_device_scale_factor_(1.0f), |
| @@ -84,6 +84,7 @@ BrowserPluginGuest::BrowserPluginGuest(bool has_render_view, |
| is_full_page_plugin_(false), |
| has_render_view_(has_render_view), |
| is_in_destruction_(false), |
| + initialized_(false), |
| last_text_input_type_(ui::TEXT_INPUT_TYPE_NONE), |
| last_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), |
| last_input_flags_(0), |
| @@ -99,6 +100,19 @@ BrowserPluginGuest::BrowserPluginGuest(bool has_render_view, |
| base::Bind(&BrowserPluginGuest::WillDestroy, AsWeakPtr())); |
| } |
| +void BrowserPluginGuest::Init() { |
| + if (initialized_) |
| + return; |
| + initialized_ = true; |
| + |
| + if (!delegate_->CanRunInDetachedState()) |
|
lazyboy
2014/12/04 16:51:13
Add a todo saying we should guard this with WTFram
Fady Samuel
2014/12/04 20:54:44
Done.
|
| + return; |
| + |
| + WebContentsImpl* owner_web_contents = static_cast<WebContentsImpl*>( |
| + delegate_->GetOwnerWebContents()); |
| + InitInternal(BrowserPluginHostMsg_Attach_Params(), owner_web_contents); |
| +} |
| + |
| void BrowserPluginGuest::WillDestroy() { |
| is_in_destruction_ = true; |
| owner_web_contents_ = NULL; |
| @@ -193,26 +207,30 @@ bool BrowserPluginGuest::OnMessageReceivedFromEmbedder( |
| return handled; |
| } |
| -void BrowserPluginGuest::Initialize( |
| - int browser_plugin_instance_id, |
| +void BrowserPluginGuest::InitInternal( |
| const BrowserPluginHostMsg_Attach_Params& params, |
| - WebContentsImpl* embedder_web_contents) { |
| - browser_plugin_instance_id_ = browser_plugin_instance_id; |
| + WebContentsImpl* owner_web_contents) { |
| focused_ = params.focused; |
| + OnSetFocus(0, focused_); |
| + |
| guest_visible_ = params.visible; |
| + UpdateVisibility(); |
| + |
| is_full_page_plugin_ = params.is_full_page_plugin; |
| guest_window_rect_ = gfx::Rect(params.origin, |
| params.resize_guest_params.view_size); |
| - WebContentsViewGuest* new_view = |
| - static_cast<WebContentsViewGuest*>(GetWebContents()->GetView()); |
| - if (attached()) |
| - new_view->OnGuestDetached(owner_web_contents_->GetView()); |
| + if (owner_web_contents_ != owner_web_contents) { |
| + WebContentsViewGuest* new_view = |
| + static_cast<WebContentsViewGuest*>(GetWebContents()->GetView()); |
| + if (owner_web_contents_) |
| + new_view->OnGuestDetached(owner_web_contents_->GetView()); |
| - // Once a BrowserPluginGuest has an embedder WebContents, it's considered to |
| - // be attached. |
| - owner_web_contents_ = embedder_web_contents; |
| - new_view->OnGuestAttached(owner_web_contents_->GetView()); |
| + // Once a BrowserPluginGuest has an embedder WebContents, it's considered to |
| + // be attached. |
| + owner_web_contents_ = owner_web_contents; |
| + new_view->OnGuestAttached(owner_web_contents_->GetView()); |
| + } |
| RendererPreferences* renderer_prefs = |
| GetWebContents()->GetMutableRendererPrefs(); |
| @@ -238,7 +256,8 @@ void BrowserPluginGuest::Initialize( |
| embedder_visibility_observer_.reset(new EmbedderVisibilityObserver(this)); |
| - OnResizeGuest(browser_plugin_instance_id_, params.resize_guest_params); |
| + // The instance ID does not matter here. |
| + OnResizeGuest(browser_plugin::kInstanceIDNone, params.resize_guest_params); |
| // TODO(chrishtr): this code is wrong. The navigate_on_drag_drop field will |
| // be reset again the next time preferences are updated. |
| @@ -320,14 +339,15 @@ void BrowserPluginGuest::SwapCompositorFrame( |
| last_seen_view_size_ = view_size; |
| } |
| - FrameMsg_CompositorFrameSwapped_Params guest_params; |
| - frame->AssignTo(&guest_params.frame); |
| - guest_params.output_surface_id = output_surface_id; |
| - guest_params.producing_route_id = host_routing_id; |
| - guest_params.producing_host_id = host_process_id; |
| + pending_frame_.reset(new FrameMsg_CompositorFrameSwapped_Params()); |
| + frame->AssignTo(&pending_frame_->frame); |
| + pending_frame_->output_surface_id = output_surface_id; |
| + pending_frame_->producing_route_id = host_routing_id; |
| + pending_frame_->producing_host_id = host_process_id; |
| + |
| SendMessageToEmbedder( |
| new BrowserPluginMsg_CompositorFrameSwapped( |
| - browser_plugin_instance_id(), guest_params)); |
| + browser_plugin_instance_id(), *pending_frame_)); |
| } |
| void BrowserPluginGuest::SetContentsOpaque(bool opaque) { |
| @@ -513,6 +533,16 @@ void BrowserPluginGuest::Attach( |
| int browser_plugin_instance_id, |
| WebContentsImpl* embedder_web_contents, |
| const BrowserPluginHostMsg_Attach_Params& params) { |
| + browser_plugin_instance_id_ = browser_plugin_instance_id; |
| + if (pending_frame_) { |
|
lazyboy
2014/12/04 16:51:12
Add a not when this can happen.
Fady Samuel
2014/12/04 20:54:44
Done.
|
| + cc::CompositorFrameAck ack; |
| + RenderWidgetHostImpl::SendSwapCompositorFrameAck( |
| + pending_frame_->producing_route_id, |
| + pending_frame_->output_surface_id, |
| + pending_frame_->producing_host_id, |
| + ack); |
| + pending_frame_.reset(); |
| + } |
| delegate_->WillAttach(embedder_web_contents, browser_plugin_instance_id, |
| params.is_full_page_plugin); |
| @@ -531,7 +561,7 @@ void BrowserPluginGuest::Attach( |
| } |
| } |
| - Initialize(browser_plugin_instance_id, params, embedder_web_contents); |
| + InitInternal(params, embedder_web_contents); |
| attached_ = true; |
| SendQueuedMessages(); |
| @@ -561,6 +591,7 @@ void BrowserPluginGuest::OnCompositorFrameSwappedACK( |
| params.output_surface_id, |
| params.producing_host_id, |
| params.ack); |
| + pending_frame_.reset(); |
| } |
| void BrowserPluginGuest::OnDetach(int browser_plugin_instance_id) { |
| @@ -675,7 +706,7 @@ void BrowserPluginGuest::OnLockMouseAck(int browser_plugin_instance_id, |
| } |
| void BrowserPluginGuest::OnResizeGuest( |
| - int browser_plugin_instance_id, |
| + int /* unused */, |
|
lazyboy
2014/12/04 16:51:13
nit: This is not consistent in this file, revert t
Fady Samuel
2014/12/04 20:54:44
Done.
|
| const BrowserPluginHostMsg_ResizeGuest_Params& params) { |
| // If we are setting the size for the first time before navigating then |
| // BrowserPluginGuest does not yet have a RenderViewHost. |