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_embedder.h" | 5 #include "content/browser/browser_plugin/browser_plugin_embedder.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
11 #include "base/time.h" | 11 #include "base/time.h" |
12 #include "content/browser/browser_plugin/browser_plugin_embedder_helper.h" | 12 #include "content/browser/browser_plugin/browser_plugin_embedder_helper.h" |
13 #include "content/browser/browser_plugin/browser_plugin_guest.h" | 13 #include "content/browser/browser_plugin/browser_plugin_guest.h" |
14 #include "content/browser/browser_plugin/browser_plugin_host_factory.h" | 14 #include "content/browser/browser_plugin/browser_plugin_host_factory.h" |
15 #include "content/browser/renderer_host/render_view_host_impl.h" | 15 #include "content/browser/renderer_host/render_view_host_impl.h" |
16 #include "content/browser/web_contents/web_contents_impl.h" | 16 #include "content/browser/web_contents/web_contents_impl.h" |
| 17 #include "content/common/browser_plugin_messages.h" |
17 #include "content/public/browser/notification_details.h" | 18 #include "content/public/browser/notification_details.h" |
18 #include "content/public/browser/notification_service.h" | 19 #include "content/public/browser/notification_service.h" |
19 #include "content/public/browser/notification_source.h" | 20 #include "content/public/browser/notification_source.h" |
20 #include "content/public/browser/notification_types.h" | 21 #include "content/public/browser/notification_types.h" |
21 #include "content/public/browser/web_contents_view.h" | 22 #include "content/public/browser/web_contents_view.h" |
22 #include "content/public/common/url_constants.h" | 23 #include "content/public/common/url_constants.h" |
23 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" | 24 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" |
24 #include "ui/gfx/size.h" | 25 #include "ui/gfx/size.h" |
25 #include "ui/surface/transport_dib.h" | 26 #include "ui/surface/transport_dib.h" |
26 | 27 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 return NULL; | 70 return NULL; |
70 } | 71 } |
71 | 72 |
72 void BrowserPluginEmbedder::AddGuest(int instance_id, | 73 void BrowserPluginEmbedder::AddGuest(int instance_id, |
73 WebContents* guest_web_contents) { | 74 WebContents* guest_web_contents) { |
74 DCHECK(guest_web_contents_by_instance_id_.find(instance_id) == | 75 DCHECK(guest_web_contents_by_instance_id_.find(instance_id) == |
75 guest_web_contents_by_instance_id_.end()); | 76 guest_web_contents_by_instance_id_.end()); |
76 guest_web_contents_by_instance_id_[instance_id] = guest_web_contents; | 77 guest_web_contents_by_instance_id_[instance_id] = guest_web_contents; |
77 } | 78 } |
78 | 79 |
79 void BrowserPluginEmbedder::NavigateGuest(RenderViewHost* render_view_host, | 80 void BrowserPluginEmbedder::NavigateGuest( |
80 int instance_id, | 81 RenderViewHost* render_view_host, |
81 const std::string& src, | 82 int instance_id, |
82 const gfx::Size& size) { | 83 const std::string& src, |
| 84 const BrowserPluginHostMsg_ResizeGuest_Params& resize_params) { |
83 BrowserPluginGuest* guest = GetGuestByInstanceID(instance_id); | 85 BrowserPluginGuest* guest = GetGuestByInstanceID(instance_id); |
84 WebContentsImpl* guest_web_contents = NULL; | 86 WebContentsImpl* guest_web_contents = NULL; |
85 GURL url(src); | 87 GURL url(src); |
86 if (!guest) { | 88 if (!guest) { |
87 const std::string& host = | 89 const std::string& host = |
88 render_view_host->GetSiteInstance()->GetSiteURL().host(); | 90 render_view_host->GetSiteInstance()->GetSiteURL().host(); |
89 guest_web_contents = WebContentsImpl::CreateGuest( | 91 guest_web_contents = WebContentsImpl::CreateGuest( |
90 web_contents()->GetBrowserContext(), | 92 web_contents()->GetBrowserContext(), |
91 host, | 93 host, |
92 instance_id); | 94 instance_id); |
(...skipping 25 matching lines...) Expand all Loading... |
118 // non-empty page, the action is considered no-op. | 120 // non-empty page, the action is considered no-op. |
119 // TODO(lazyboy): The js shim for browser-plugin might need to reflect empty | 121 // TODO(lazyboy): The js shim for browser-plugin might need to reflect empty |
120 // src ignoring in the shadow DOM element: http://crbug.com/149001. | 122 // src ignoring in the shadow DOM element: http://crbug.com/149001. |
121 if (!src.empty()) { | 123 if (!src.empty()) { |
122 guest_web_contents->GetController().LoadURL(url, | 124 guest_web_contents->GetController().LoadURL(url, |
123 Referrer(), | 125 Referrer(), |
124 PAGE_TRANSITION_AUTO_SUBFRAME, | 126 PAGE_TRANSITION_AUTO_SUBFRAME, |
125 std::string()); | 127 std::string()); |
126 } | 128 } |
127 | 129 |
128 if (!size.IsEmpty()) | 130 // Resize the guest if the resize parameter was set from the renderer. |
129 guest_web_contents->GetView()->SizeContents(size); | 131 ResizeGuest(render_view_host, instance_id, resize_params); |
130 } | 132 } |
131 | 133 |
132 void BrowserPluginEmbedder::UpdateRectACK(int instance_id, | 134 void BrowserPluginEmbedder::UpdateRectACK(int instance_id, |
133 int message_id, | 135 int message_id, |
134 const gfx::Size& size) { | 136 const gfx::Size& size) { |
135 BrowserPluginGuest* guest = GetGuestByInstanceID(instance_id); | 137 BrowserPluginGuest* guest = GetGuestByInstanceID(instance_id); |
136 if (guest) | 138 if (guest) |
137 guest->UpdateRectACK(message_id, size); | 139 guest->UpdateRectACK(message_id, size); |
138 } | 140 } |
139 | 141 |
140 void BrowserPluginEmbedder::ResizeGuest(int instance_id, | 142 void BrowserPluginEmbedder::ResizeGuest( |
141 TransportDIB* damage_buffer, | 143 RenderViewHost* render_view_host, |
142 #if defined(OS_WIN) | 144 int instance_id, |
143 int damage_buffer_size, | 145 const BrowserPluginHostMsg_ResizeGuest_Params& params) { |
144 #endif | |
145 int width, | |
146 int height, | |
147 bool resize_pending, | |
148 float scale_factor) { | |
149 BrowserPluginGuest* guest = GetGuestByInstanceID(instance_id); | 146 BrowserPluginGuest* guest = GetGuestByInstanceID(instance_id); |
150 if (!guest) | 147 if (!guest) |
151 return; | 148 return; |
152 WebContentsImpl* guest_web_contents = | 149 WebContentsImpl* guest_web_contents = |
153 static_cast<WebContentsImpl*>(guest->GetWebContents()); | 150 static_cast<WebContentsImpl*>(guest->GetWebContents()); |
| 151 |
| 152 if (!TransportDIB::is_valid_id(params.damage_buffer_id)) { |
| 153 // Invalid transport dib, so just resize the WebContents. |
| 154 if (params.width && params.height) { |
| 155 guest_web_contents->GetView()->SizeContents(gfx::Size(params.width, |
| 156 params.height)); |
| 157 } |
| 158 return; |
| 159 } |
| 160 |
| 161 TransportDIB* damage_buffer = GetDamageBuffer(render_view_host, params); |
154 guest->SetDamageBuffer(damage_buffer, | 162 guest->SetDamageBuffer(damage_buffer, |
155 #if defined(OS_WIN) | 163 #if defined(OS_WIN) |
156 damage_buffer_size, | 164 params.damage_buffer_size, |
157 #endif | 165 #endif |
158 gfx::Size(width, height), | 166 gfx::Size(params.width, params.height), |
159 scale_factor); | 167 params.scale_factor); |
160 if (!resize_pending) | 168 if (!params.resize_pending) { |
161 guest_web_contents->GetView()->SizeContents(gfx::Size(width, height)); | 169 guest_web_contents->GetView()->SizeContents(gfx::Size(params.width, |
| 170 params.height)); |
| 171 } |
| 172 } |
| 173 |
| 174 TransportDIB* BrowserPluginEmbedder::GetDamageBuffer( |
| 175 RenderViewHost* render_view_host, |
| 176 const BrowserPluginHostMsg_ResizeGuest_Params& params) { |
| 177 TransportDIB* damage_buffer = NULL; |
| 178 #if defined(OS_WIN) |
| 179 // On Windows we need to duplicate the handle from the remote process. |
| 180 HANDLE section; |
| 181 DuplicateHandle(render_view_host->GetProcess()->GetHandle(), |
| 182 params.damage_buffer_id.handle, |
| 183 GetCurrentProcess(), |
| 184 §ion, |
| 185 STANDARD_RIGHTS_REQUIRED | FILE_MAP_READ | FILE_MAP_WRITE, |
| 186 FALSE, |
| 187 0); |
| 188 damage_buffer = TransportDIB::Map(section); |
| 189 #elif defined(OS_MACOSX) |
| 190 // On OSX, we need the handle to map the transport dib. |
| 191 damage_buffer = TransportDIB::Map(params.damage_buffer_handle); |
| 192 #elif defined(OS_ANDROID) |
| 193 damage_buffer = TransportDIB::Map(params.damage_buffer_id); |
| 194 #elif defined(OS_POSIX) |
| 195 damage_buffer = TransportDIB::Map(params.damage_buffer_id.shmkey); |
| 196 #endif // defined(OS_POSIX) |
| 197 DCHECK(damage_buffer); |
| 198 return damage_buffer; |
162 } | 199 } |
163 | 200 |
164 void BrowserPluginEmbedder::SetFocus(int instance_id, | 201 void BrowserPluginEmbedder::SetFocus(int instance_id, |
165 bool focused) { | 202 bool focused) { |
166 BrowserPluginGuest* guest = GetGuestByInstanceID(instance_id); | 203 BrowserPluginGuest* guest = GetGuestByInstanceID(instance_id); |
167 if (guest) | 204 if (guest) |
168 guest->SetFocus(focused); | 205 guest->SetFocus(focused); |
169 } | 206 } |
170 | 207 |
171 void BrowserPluginEmbedder::DestroyGuests() { | 208 void BrowserPluginEmbedder::DestroyGuests() { |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 bool visible = *Details<bool>(details).ptr(); | 285 bool visible = *Details<bool>(details).ptr(); |
249 WebContentsVisibilityChanged(visible); | 286 WebContentsVisibilityChanged(visible); |
250 break; | 287 break; |
251 } | 288 } |
252 default: | 289 default: |
253 NOTREACHED() << "Unexpected notification type: " << type; | 290 NOTREACHED() << "Unexpected notification type: " << type; |
254 } | 291 } |
255 } | 292 } |
256 | 293 |
257 } // namespace content | 294 } // namespace content |
OLD | NEW |