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 |