| 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 f2a0f74dd0be0d5abaa9a5ac17b99f8c89617c12..1c73384073a88e2f3c83c85ae258cf1a047baf98 100644
|
| --- a/content/browser/browser_plugin/browser_plugin_guest.cc
|
| +++ b/content/browser/browser_plugin/browser_plugin_guest.cc
|
| @@ -87,6 +87,7 @@ BrowserPluginGuest::BrowserPluginGuest(bool has_render_view,
|
| last_text_input_type_(ui::TEXT_INPUT_TYPE_NONE),
|
| last_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT),
|
| last_can_compose_inline_(true),
|
| + guest_proxy_routing_id_(MSG_ROUTING_NONE),
|
| delegate_(delegate),
|
| weak_ptr_factory_(this) {
|
| DCHECK(web_contents);
|
| @@ -134,10 +135,6 @@ bool BrowserPluginGuest::LockMouse(bool allowed) {
|
| return embedder_web_contents()->GotResponseToLockMouseRequest(allowed);
|
| }
|
|
|
| -void BrowserPluginGuest::Destroy() {
|
| - delegate_->Destroy();
|
| -}
|
| -
|
| WebContentsImpl* BrowserPluginGuest::CreateNewGuestWindow(
|
| const WebContents::CreateParams& params) {
|
| WebContentsImpl* new_contents =
|
| @@ -175,7 +172,6 @@ bool BrowserPluginGuest::OnMessageReceivedFromEmbedder(
|
| IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_ImeSetComposition,
|
| OnImeSetComposition)
|
| IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_LockMouse_ACK, OnLockMouseAck)
|
| - IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_PluginDestroyed, OnPluginDestroyed)
|
| IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_ReclaimCompositorResources,
|
| OnReclaimCompositorResources)
|
| IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_ResizeGuest, OnResizeGuest)
|
| @@ -200,13 +196,15 @@ void BrowserPluginGuest::Initialize(
|
| 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(embedder_web_contents_->GetView());
|
| +
|
| // Once a BrowserPluginGuest has an embedder WebContents, it's considered to
|
| // be attached.
|
| embedder_web_contents_ = embedder_web_contents;
|
| -
|
| - WebContentsViewGuest* new_view =
|
| - static_cast<WebContentsViewGuest*>(GetWebContents()->GetView());
|
| - new_view->OnGuestInitialized(embedder_web_contents->GetView());
|
| + new_view->OnGuestAttached(embedder_web_contents->GetView());
|
|
|
| RendererPreferences* renderer_prefs =
|
| GetWebContents()->GetMutableRendererPrefs();
|
| @@ -336,7 +334,6 @@ void BrowserPluginGuest::SwapCompositorFrame(
|
| guest_params.output_surface_id = output_surface_id;
|
| guest_params.producing_route_id = host_routing_id;
|
| guest_params.producing_host_id = host_process_id;
|
| -
|
| SendMessageToEmbedder(
|
| new BrowserPluginMsg_CompositorFrameSwapped(
|
| browser_plugin_instance_id(), guest_params));
|
| @@ -454,7 +451,6 @@ bool BrowserPluginGuest::ShouldForwardToBrowserPluginGuest(
|
| case BrowserPluginHostMsg_ImeConfirmComposition::ID:
|
| case BrowserPluginHostMsg_ImeSetComposition::ID:
|
| case BrowserPluginHostMsg_LockMouse_ACK::ID:
|
| - case BrowserPluginHostMsg_PluginDestroyed::ID:
|
| case BrowserPluginHostMsg_ReclaimCompositorResources::ID:
|
| case BrowserPluginHostMsg_ResizeGuest::ID:
|
| case BrowserPluginHostMsg_SetEditCommandsForNextKeyEvent::ID:
|
| @@ -520,20 +516,21 @@ void BrowserPluginGuest::Attach(
|
| int browser_plugin_instance_id,
|
| WebContentsImpl* embedder_web_contents,
|
| const BrowserPluginHostMsg_Attach_Params& params) {
|
| - if (attached())
|
| - return;
|
| -
|
| delegate_->WillAttach(embedder_web_contents, browser_plugin_instance_id);
|
|
|
| // If a RenderView has already been created for this new window, then we need
|
| // to initialize the browser-side state now so that the RenderFrameHostManager
|
| // does not create a new RenderView on navigation.
|
| if (has_render_view_) {
|
| + // This will trigger a callback to RenderViewReady after a round-trip IPC.
|
| static_cast<RenderViewHostImpl*>(
|
| GetWebContents()->GetRenderViewHost())->Init();
|
| - WebContentsViewGuest* new_view =
|
| + WebContentsViewGuest* web_contents_view =
|
| static_cast<WebContentsViewGuest*>(GetWebContents()->GetView());
|
| - new_view->CreateViewForWidget(web_contents()->GetRenderViewHost());
|
| + if (!web_contents()->GetRenderViewHost()->GetView()) {
|
| + web_contents_view->CreateViewForWidget(
|
| + web_contents()->GetRenderViewHost());
|
| + }
|
| }
|
|
|
| Initialize(browser_plugin_instance_id, params, embedder_web_contents);
|
| @@ -542,11 +539,18 @@ void BrowserPluginGuest::Attach(
|
|
|
| // Create a swapped out RenderView for the guest in the embedder render
|
| // process, so that the embedder can access the guest's window object.
|
| - int guest_routing_id =
|
| - GetWebContents()->CreateSwappedOutRenderView(
|
| - embedder_web_contents_->GetSiteInstance());
|
| + // On reattachment, we can reuse the same swapped out RenderView because
|
| + // the embedder process will always be the same even if the embedder
|
| + // WebContents changes.
|
| + if (guest_proxy_routing_id_ == MSG_ROUTING_NONE) {
|
| + guest_proxy_routing_id_ =
|
| + GetWebContents()->CreateSwappedOutRenderView(
|
| + embedder_web_contents_->GetSiteInstance());
|
| + }
|
| +
|
| + delegate_->DidAttach(guest_proxy_routing_id_);
|
|
|
| - delegate_->DidAttach(guest_routing_id);
|
| + has_render_view_ = true;
|
|
|
| RecordAction(base::UserMetricsAction("BrowserPlugin.Guest.Attached"));
|
| }
|
| @@ -660,10 +664,6 @@ void BrowserPluginGuest::OnLockMouseAck(int browser_plugin_instance_id,
|
| mouse_locked_ = true;
|
| }
|
|
|
| -void BrowserPluginGuest::OnPluginDestroyed(int browser_plugin_instance_id) {
|
| - Destroy();
|
| -}
|
| -
|
| void BrowserPluginGuest::OnResizeGuest(
|
| int browser_plugin_instance_id,
|
| const BrowserPluginHostMsg_ResizeGuest_Params& params) {
|
|
|