| 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 "content/browser/browser_plugin/browser_plugin_guest.h" | 5 #include "content/browser/browser_plugin/browser_plugin_guest.h" | 
| 6 | 6 | 
| 7 #include <algorithm> | 7 #include <algorithm> | 
| 8 | 8 | 
| 9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" | 
| 10 #include "base/pickle.h" | 10 #include "base/pickle.h" | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 24 #include "content/common/browser_plugin/browser_plugin_messages.h" | 24 #include "content/common/browser_plugin/browser_plugin_messages.h" | 
| 25 #include "content/common/content_constants_internal.h" | 25 #include "content/common/content_constants_internal.h" | 
| 26 #include "content/common/drag_messages.h" | 26 #include "content/common/drag_messages.h" | 
| 27 #include "content/common/frame_messages.h" | 27 #include "content/common/frame_messages.h" | 
| 28 #include "content/common/host_shared_bitmap_manager.h" | 28 #include "content/common/host_shared_bitmap_manager.h" | 
| 29 #include "content/common/input_messages.h" | 29 #include "content/common/input_messages.h" | 
| 30 #include "content/common/view_messages.h" | 30 #include "content/common/view_messages.h" | 
| 31 #include "content/public/browser/browser_context.h" | 31 #include "content/public/browser/browser_context.h" | 
| 32 #include "content/public/browser/browser_plugin_guest_manager.h" | 32 #include "content/public/browser/browser_plugin_guest_manager.h" | 
| 33 #include "content/public/browser/content_browser_client.h" | 33 #include "content/public/browser/content_browser_client.h" | 
| 34 #include "content/public/browser/guest_sizer.h" | 34 #include "content/public/browser/guest_host.h" | 
| 35 #include "content/public/browser/render_widget_host_view.h" | 35 #include "content/public/browser/render_widget_host_view.h" | 
| 36 #include "content/public/browser/user_metrics.h" | 36 #include "content/public/browser/user_metrics.h" | 
| 37 #include "content/public/browser/web_contents_observer.h" | 37 #include "content/public/browser/web_contents_observer.h" | 
| 38 #include "content/public/common/drop_data.h" | 38 #include "content/public/common/drop_data.h" | 
| 39 #include "ui/gfx/geometry/size_conversions.h" | 39 #include "ui/gfx/geometry/size_conversions.h" | 
| 40 | 40 | 
| 41 #if defined(OS_MACOSX) | 41 #if defined(OS_MACOSX) | 
| 42 #include "content/browser/browser_plugin/browser_plugin_popup_menu_helper_mac.h" | 42 #include "content/browser/browser_plugin/browser_plugin_popup_menu_helper_mac.h" | 
| 43 #endif | 43 #endif | 
| 44 | 44 | 
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 92       guest_proxy_routing_id_(MSG_ROUTING_NONE), | 92       guest_proxy_routing_id_(MSG_ROUTING_NONE), | 
| 93       last_drag_status_(blink::WebDragStatusUnknown), | 93       last_drag_status_(blink::WebDragStatusUnknown), | 
| 94       seen_embedder_system_drag_ended_(false), | 94       seen_embedder_system_drag_ended_(false), | 
| 95       seen_embedder_drag_source_ended_at_(false), | 95       seen_embedder_drag_source_ended_at_(false), | 
| 96       delegate_(delegate), | 96       delegate_(delegate), | 
| 97       weak_ptr_factory_(this) { | 97       weak_ptr_factory_(this) { | 
| 98   DCHECK(web_contents); | 98   DCHECK(web_contents); | 
| 99   DCHECK(delegate); | 99   DCHECK(delegate); | 
| 100   RecordAction(base::UserMetricsAction("BrowserPlugin.Guest.Create")); | 100   RecordAction(base::UserMetricsAction("BrowserPlugin.Guest.Create")); | 
| 101   web_contents->SetBrowserPluginGuest(this); | 101   web_contents->SetBrowserPluginGuest(this); | 
| 102   delegate->RegisterDestructionCallback( | 102   delegate->SetGuestHost(this); | 
| 103       base::Bind(&BrowserPluginGuest::WillDestroy, AsWeakPtr())); | 103 } | 
| 104   delegate->SetGuestSizer(this); | 104 | 
|  | 105 int BrowserPluginGuest::GetGuestProxyRoutingID() { | 
|  | 106   if (guest_proxy_routing_id_ != MSG_ROUTING_NONE) | 
|  | 107     return guest_proxy_routing_id_; | 
|  | 108 | 
|  | 109   // Create a swapped out RenderView for the guest in the embedder renderer | 
|  | 110   // process, so that the embedder can access the guest's window object. | 
|  | 111   // On reattachment, we can reuse the same swapped out RenderView because | 
|  | 112   // the embedder process will always be the same even if the embedder | 
|  | 113   // WebContents changes. | 
|  | 114   // | 
|  | 115   // TODO(fsamuel): Make sure this works for transferring guests across | 
|  | 116   // owners in different processes. We probably need to clear the | 
|  | 117   // |guest_proxy_routing_id_| and perform any necessary cleanup on Detach | 
|  | 118   // to enable this. | 
|  | 119   SiteInstance* owner_site_instance = owner_web_contents_->GetSiteInstance(); | 
|  | 120   guest_proxy_routing_id_ = | 
|  | 121       GetWebContents()->CreateSwappedOutRenderView(owner_site_instance); | 
|  | 122 | 
|  | 123   return guest_proxy_routing_id_; | 
|  | 124 } | 
|  | 125 | 
|  | 126 int BrowserPluginGuest::LoadURLWithParams( | 
|  | 127     const NavigationController::LoadURLParams& load_params) { | 
|  | 128   GetWebContents()->GetController().LoadURLWithParams(load_params); | 
|  | 129   return GetGuestProxyRoutingID(); | 
| 105 } | 130 } | 
| 106 | 131 | 
| 107 void BrowserPluginGuest::SizeContents(const gfx::Size& new_size) { | 132 void BrowserPluginGuest::SizeContents(const gfx::Size& new_size) { | 
| 108   GetWebContents()->GetView()->SizeContents(new_size); | 133   GetWebContents()->GetView()->SizeContents(new_size); | 
| 109 } | 134 } | 
| 110 | 135 | 
|  | 136 void BrowserPluginGuest::WillDestroy() { | 
|  | 137   is_in_destruction_ = true; | 
|  | 138   owner_web_contents_ = nullptr; | 
|  | 139   attached_ = false; | 
|  | 140 } | 
|  | 141 | 
| 111 void BrowserPluginGuest::Init() { | 142 void BrowserPluginGuest::Init() { | 
| 112   if (initialized_) | 143   if (initialized_) | 
| 113     return; | 144     return; | 
| 114   initialized_ = true; | 145   initialized_ = true; | 
| 115 | 146 | 
| 116   // TODO(fsamuel): Initiailization prior to attachment should be behind a | 147   // TODO(fsamuel): Initiailization prior to attachment should be behind a | 
| 117   // command line flag once we introduce experimental guest types that rely on | 148   // command line flag once we introduce experimental guest types that rely on | 
| 118   // this functionality. | 149   // this functionality. | 
| 119   if (!delegate_->CanRunInDetachedState()) | 150   if (!delegate_->CanRunInDetachedState()) | 
| 120     return; | 151     return; | 
| 121 | 152 | 
| 122   WebContentsImpl* owner_web_contents = static_cast<WebContentsImpl*>( | 153   WebContentsImpl* owner_web_contents = static_cast<WebContentsImpl*>( | 
| 123       delegate_->GetOwnerWebContents()); | 154       delegate_->GetOwnerWebContents()); | 
|  | 155   owner_web_contents->CreateBrowserPluginEmbedderIfNecessary(); | 
| 124   InitInternal(BrowserPluginHostMsg_Attach_Params(), owner_web_contents); | 156   InitInternal(BrowserPluginHostMsg_Attach_Params(), owner_web_contents); | 
| 125 } | 157 } | 
| 126 | 158 | 
| 127 void BrowserPluginGuest::WillDestroy() { |  | 
| 128   is_in_destruction_ = true; |  | 
| 129   owner_web_contents_ = nullptr; |  | 
| 130   attached_ = false; |  | 
| 131 } |  | 
| 132 |  | 
| 133 base::WeakPtr<BrowserPluginGuest> BrowserPluginGuest::AsWeakPtr() { | 159 base::WeakPtr<BrowserPluginGuest> BrowserPluginGuest::AsWeakPtr() { | 
| 134   return weak_ptr_factory_.GetWeakPtr(); | 160   return weak_ptr_factory_.GetWeakPtr(); | 
| 135 } | 161 } | 
| 136 | 162 | 
| 137 void BrowserPluginGuest::SetFocus(RenderWidgetHost* rwh, | 163 void BrowserPluginGuest::SetFocus(RenderWidgetHost* rwh, | 
| 138                                   bool focused, | 164                                   bool focused, | 
| 139                                   blink::WebFocusType focus_type) { | 165                                   blink::WebFocusType focus_type) { | 
| 140   focused_ = focused; | 166   focused_ = focused; | 
| 141   if (!rwh) | 167   if (!rwh) | 
| 142     return; | 168     return; | 
| (...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 613       web_contents_view->CreateViewForWidget( | 639       web_contents_view->CreateViewForWidget( | 
| 614           web_contents()->GetRenderViewHost(), true); | 640           web_contents()->GetRenderViewHost(), true); | 
| 615     } | 641     } | 
| 616   } | 642   } | 
| 617 | 643 | 
| 618   InitInternal(params, embedder_web_contents); | 644   InitInternal(params, embedder_web_contents); | 
| 619 | 645 | 
| 620   attached_ = true; | 646   attached_ = true; | 
| 621   SendQueuedMessages(); | 647   SendQueuedMessages(); | 
| 622 | 648 | 
| 623   // Create a swapped out RenderView for the guest in the embedder render | 649   delegate_->DidAttach(GetGuestProxyRoutingID()); | 
| 624   // process, so that the embedder can access the guest's window object. |  | 
| 625   // On reattachment, we can reuse the same swapped out RenderView because |  | 
| 626   // the embedder process will always be the same even if the embedder |  | 
| 627   // WebContents changes. |  | 
| 628   if (guest_proxy_routing_id_ == MSG_ROUTING_NONE) { |  | 
| 629     guest_proxy_routing_id_ = |  | 
| 630         GetWebContents()->CreateSwappedOutRenderView( |  | 
| 631             owner_web_contents_->GetSiteInstance()); |  | 
| 632   } |  | 
| 633 |  | 
| 634   delegate_->DidAttach(guest_proxy_routing_id_); |  | 
| 635 | 650 | 
| 636   has_render_view_ = true; | 651   has_render_view_ = true; | 
| 637 | 652 | 
| 638   // Enable input method for guest if it's enabled for the embedder. | 653   // Enable input method for guest if it's enabled for the embedder. | 
| 639   if (static_cast<RenderViewHostImpl*>( | 654   if (static_cast<RenderViewHostImpl*>( | 
| 640       owner_web_contents_->GetRenderViewHost())->input_method_active()) { | 655       owner_web_contents_->GetRenderViewHost())->input_method_active()) { | 
| 641     RenderViewHostImpl* guest_rvh = static_cast<RenderViewHostImpl*>( | 656     RenderViewHostImpl* guest_rvh = static_cast<RenderViewHostImpl*>( | 
| 642         GetWebContents()->GetRenderViewHost()); | 657         GetWebContents()->GetRenderViewHost()); | 
| 643     guest_rvh->SetInputMethodActive(true); | 658     guest_rvh->SetInputMethodActive(true); | 
| 644   } | 659   } | 
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 887 void BrowserPluginGuest::OnImeCompositionRangeChanged( | 902 void BrowserPluginGuest::OnImeCompositionRangeChanged( | 
| 888       const gfx::Range& range, | 903       const gfx::Range& range, | 
| 889       const std::vector<gfx::Rect>& character_bounds) { | 904       const std::vector<gfx::Rect>& character_bounds) { | 
| 890   static_cast<RenderWidgetHostViewBase*>( | 905   static_cast<RenderWidgetHostViewBase*>( | 
| 891       web_contents()->GetRenderWidgetHostView())->ImeCompositionRangeChanged( | 906       web_contents()->GetRenderWidgetHostView())->ImeCompositionRangeChanged( | 
| 892           range, character_bounds); | 907           range, character_bounds); | 
| 893 } | 908 } | 
| 894 #endif | 909 #endif | 
| 895 | 910 | 
| 896 }  // namespace content | 911 }  // namespace content | 
| OLD | NEW | 
|---|