| 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/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 // static | 42 // static |
| 43 BrowserPluginHostFactory* BrowserPluginGuest::factory_ = NULL; | 43 BrowserPluginHostFactory* BrowserPluginGuest::factory_ = NULL; |
| 44 | 44 |
| 45 BrowserPluginGuest::BrowserPluginGuest( | 45 BrowserPluginGuest::BrowserPluginGuest( |
| 46 int instance_id, | 46 int instance_id, |
| 47 WebContentsImpl* web_contents, | 47 WebContentsImpl* web_contents, |
| 48 const BrowserPluginHostMsg_CreateGuest_Params& params) | 48 const BrowserPluginHostMsg_CreateGuest_Params& params) |
| 49 : WebContentsObserver(web_contents), | 49 : WebContentsObserver(web_contents), |
| 50 embedder_web_contents_(NULL), | 50 embedder_web_contents_(NULL), |
| 51 instance_id_(instance_id), | 51 instance_id_(instance_id), |
| 52 #if defined(OS_WIN) | 52 damage_buffer_sequence_id_(0), |
| 53 damage_buffer_size_(0), | 53 damage_buffer_size_(0), |
| 54 remote_damage_buffer_handle_(0), | |
| 55 #endif | |
| 56 damage_buffer_scale_factor_(1.0f), | 54 damage_buffer_scale_factor_(1.0f), |
| 57 pending_update_counter_(0), | 55 pending_update_counter_(0), |
| 58 guest_hang_timeout_( | 56 guest_hang_timeout_( |
| 59 base::TimeDelta::FromMilliseconds(kHungRendererDelayMs)), | 57 base::TimeDelta::FromMilliseconds(kHungRendererDelayMs)), |
| 60 focused_(params.focused), | 58 focused_(params.focused), |
| 61 visible_(params.visible), | 59 visible_(params.visible), |
| 62 auto_size_enabled_(params.auto_size_params.enable), | 60 auto_size_enabled_(params.auto_size_params.enable), |
| 63 max_auto_size_(params.auto_size_params.max_size), | 61 max_auto_size_(params.auto_size_params.max_size), |
| 64 min_auto_size_(params.auto_size_params.min_size) { | 62 min_auto_size_(params.auto_size_params.min_size) { |
| 65 DCHECK(web_contents); | 63 DCHECK(web_contents); |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 | 265 |
| 268 void BrowserPluginGuest::Resize( | 266 void BrowserPluginGuest::Resize( |
| 269 RenderViewHost* embedder_rvh, | 267 RenderViewHost* embedder_rvh, |
| 270 const BrowserPluginHostMsg_ResizeGuest_Params& params) { | 268 const BrowserPluginHostMsg_ResizeGuest_Params& params) { |
| 271 // BrowserPlugin manages resize flow control itself and does not depend | 269 // BrowserPlugin manages resize flow control itself and does not depend |
| 272 // on RenderWidgetHost's mechanisms for flow control, so we reset those flags | 270 // on RenderWidgetHost's mechanisms for flow control, so we reset those flags |
| 273 // here. | 271 // here. |
| 274 RenderWidgetHostImpl* render_widget_host = | 272 RenderWidgetHostImpl* render_widget_host = |
| 275 RenderWidgetHostImpl::From(web_contents()->GetRenderViewHost()); | 273 RenderWidgetHostImpl::From(web_contents()->GetRenderViewHost()); |
| 276 render_widget_host->ResetSizeAndRepaintPendingFlags(); | 274 render_widget_host->ResetSizeAndRepaintPendingFlags(); |
| 277 if (!TransportDIB::is_valid_id(params.damage_buffer_id)) { | 275 if (!base::SharedMemory::IsHandleValid(params.damage_buffer_handle)) { |
| 278 // Invalid transport dib, so just resize the WebContents. | 276 // Invalid damage buffer, so just resize the WebContents. |
| 279 if (!params.view_size.IsEmpty()) | 277 if (!params.view_size.IsEmpty()) |
| 280 web_contents()->GetView()->SizeContents(params.view_size); | 278 web_contents()->GetView()->SizeContents(params.view_size); |
| 281 return; | 279 return; |
| 282 } | 280 } |
| 283 TransportDIB* damage_buffer = | 281 SetDamageBuffer(params); |
| 284 GetDamageBufferFromEmbedder(embedder_rvh, params); | |
| 285 SetDamageBuffer(damage_buffer, | |
| 286 #if defined(OS_WIN) | |
| 287 params.damage_buffer_size, | |
| 288 params.damage_buffer_id.handle, | |
| 289 #endif | |
| 290 params.view_size, | |
| 291 params.scale_factor); | |
| 292 web_contents()->GetView()->SizeContents(params.view_size); | 282 web_contents()->GetView()->SizeContents(params.view_size); |
| 293 } | 283 } |
| 294 | 284 |
| 295 TransportDIB* BrowserPluginGuest::GetDamageBufferFromEmbedder( | 285 base::SharedMemory* BrowserPluginGuest::GetDamageBufferFromEmbedder( |
| 296 RenderViewHost* embedder_rvh, | |
| 297 const BrowserPluginHostMsg_ResizeGuest_Params& params) { | 286 const BrowserPluginHostMsg_ResizeGuest_Params& params) { |
| 298 TransportDIB* damage_buffer = NULL; | |
| 299 #if defined(OS_WIN) | 287 #if defined(OS_WIN) |
| 300 // On Windows we need to duplicate the handle from the remote process. | 288 base::ProcessHandle handle = |
| 301 HANDLE section; | 289 embedder_web_contents_->GetRenderProcessHost()->GetHandle(); |
| 302 DuplicateHandle(embedder_rvh->GetProcess()->GetHandle(), | 290 scoped_ptr<base::SharedMemory> shared_buf( |
| 303 params.damage_buffer_id.handle, | 291 new base::SharedMemory(params.damage_buffer_handle, false, handle)); |
| 304 GetCurrentProcess(), | 292 #elif defined(OS_POSIX) |
| 305 §ion, | 293 scoped_ptr<base::SharedMemory> shared_buf( |
| 306 STANDARD_RIGHTS_REQUIRED | FILE_MAP_READ | FILE_MAP_WRITE, | 294 new base::SharedMemory(params.damage_buffer_handle, false)); |
| 307 FALSE, | 295 #endif |
| 308 0); | 296 if (!shared_buf->Map(params.damage_buffer_size)) { |
| 309 damage_buffer = TransportDIB::Map(section); | 297 NOTREACHED(); |
| 310 #elif defined(OS_MACOSX) | 298 return NULL; |
| 311 // On OSX, we need the handle to map the transport dib. | 299 } |
| 312 damage_buffer = TransportDIB::Map(params.damage_buffer_handle); | 300 return shared_buf.release(); |
| 313 #elif defined(OS_ANDROID) | |
| 314 damage_buffer = TransportDIB::Map(params.damage_buffer_id); | |
| 315 #elif defined(OS_POSIX) | |
| 316 damage_buffer = TransportDIB::Map(params.damage_buffer_id.shmkey); | |
| 317 #endif // defined(OS_POSIX) | |
| 318 DCHECK(damage_buffer); | |
| 319 return damage_buffer; | |
| 320 } | 301 } |
| 321 | 302 |
| 322 void BrowserPluginGuest::SetDamageBuffer( | 303 void BrowserPluginGuest::SetDamageBuffer( |
| 323 TransportDIB* damage_buffer, | 304 const BrowserPluginHostMsg_ResizeGuest_Params& params) { |
| 324 #if defined(OS_WIN) | 305 damage_buffer_.reset(GetDamageBufferFromEmbedder(params)); |
| 325 int damage_buffer_size, | |
| 326 TransportDIB::Handle remote_handle, | |
| 327 #endif | |
| 328 const gfx::Size& damage_view_size, | |
| 329 float scale_factor) { | |
| 330 // Sanity check: Verify that we've correctly shared the damage buffer memory | 306 // Sanity check: Verify that we've correctly shared the damage buffer memory |
| 331 // between the embedder and browser processes. | 307 // between the embedder and browser processes. |
| 332 DCHECK(*static_cast<unsigned int*>(damage_buffer->memory()) == 0xdeadbeef); | 308 DCHECK(*static_cast<unsigned int*>(damage_buffer_->memory()) == 0xdeadbeef); |
| 333 damage_buffer_.reset(damage_buffer); | 309 damage_buffer_sequence_id_ = params.damage_buffer_sequence_id; |
| 334 #if defined(OS_WIN) | 310 damage_buffer_size_ = params.damage_buffer_size; |
| 335 damage_buffer_size_ = damage_buffer_size; | 311 damage_view_size_ = params.view_size; |
| 336 remote_damage_buffer_handle_ = remote_handle; | 312 damage_buffer_scale_factor_ = params.scale_factor; |
| 337 #endif | |
| 338 damage_view_size_ = damage_view_size; | |
| 339 damage_buffer_scale_factor_ = scale_factor; | |
| 340 } | 313 } |
| 341 | 314 |
| 342 gfx::Point BrowserPluginGuest::GetScreenCoordinates( | 315 gfx::Point BrowserPluginGuest::GetScreenCoordinates( |
| 343 const gfx::Point& relative_position) const { | 316 const gfx::Point& relative_position) const { |
| 344 gfx::Point screen_pos(relative_position); | 317 gfx::Point screen_pos(relative_position); |
| 345 screen_pos += guest_window_rect_.OffsetFromOrigin(); | 318 screen_pos += guest_window_rect_.OffsetFromOrigin(); |
| 346 return screen_pos; | 319 return screen_pos; |
| 347 } | 320 } |
| 348 | 321 |
| 349 int BrowserPluginGuest::embedder_routing_id() const { | 322 int BrowserPluginGuest::embedder_routing_id() const { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 // buffer's scale factor. | 363 // buffer's scale factor. |
| 391 // The scaling change can happen due to asynchronous updates of the DPI on a | 364 // The scaling change can happen due to asynchronous updates of the DPI on a |
| 392 // resolution change. | 365 // resolution change. |
| 393 if (((auto_size_enabled_ && InAutoSizeBounds(params.view_size)) || | 366 if (((auto_size_enabled_ && InAutoSizeBounds(params.view_size)) || |
| 394 (params.view_size.width() == damage_view_size().width() && | 367 (params.view_size.width() == damage_view_size().width() && |
| 395 params.view_size.height() == damage_view_size().height())) && | 368 params.view_size.height() == damage_view_size().height())) && |
| 396 params.scale_factor == damage_buffer_scale_factor()) { | 369 params.scale_factor == damage_buffer_scale_factor()) { |
| 397 TransportDIB* dib = render_view_host->GetProcess()-> | 370 TransportDIB* dib = render_view_host->GetProcess()-> |
| 398 GetTransportDIB(params.bitmap); | 371 GetTransportDIB(params.bitmap); |
| 399 if (dib) { | 372 if (dib) { |
| 373 size_t guest_damage_buffer_size = |
| 400 #if defined(OS_WIN) | 374 #if defined(OS_WIN) |
| 401 size_t guest_damage_buffer_size = params.bitmap_rect.width() * | 375 params.bitmap_rect.width() * |
| 402 params.bitmap_rect.height() * 4; | 376 params.bitmap_rect.height() * 4; |
| 377 #else |
| 378 dib->size(); |
| 379 #endif |
| 403 size_t embedder_damage_buffer_size = damage_buffer_size_; | 380 size_t embedder_damage_buffer_size = damage_buffer_size_; |
| 404 #else | |
| 405 size_t guest_damage_buffer_size = dib->size(); | |
| 406 size_t embedder_damage_buffer_size = damage_buffer_->size(); | |
| 407 #endif | |
| 408 void* guest_memory = dib->memory(); | 381 void* guest_memory = dib->memory(); |
| 409 void* embedder_memory = damage_buffer_->memory(); | 382 void* embedder_memory = damage_buffer_->memory(); |
| 410 size_t size = std::min(guest_damage_buffer_size, | 383 size_t size = std::min(guest_damage_buffer_size, |
| 411 embedder_damage_buffer_size); | 384 embedder_damage_buffer_size); |
| 412 memcpy(embedder_memory, guest_memory, size); | 385 memcpy(embedder_memory, guest_memory, size); |
| 413 } | 386 } |
| 414 } | 387 } |
| 415 BrowserPluginMsg_UpdateRect_Params relay_params; | 388 BrowserPluginMsg_UpdateRect_Params relay_params; |
| 416 #if defined(OS_MACOSX) | 389 relay_params.damage_buffer_sequence_id = damage_buffer_sequence_id_; |
| 417 relay_params.damage_buffer_identifier = damage_buffer_->id(); | |
| 418 #elif defined(OS_WIN) | |
| 419 // On Windows, the handle used locally differs from the handle received from | |
| 420 // the embedder process, since we duplicate the remote handle. | |
| 421 relay_params.damage_buffer_identifier = remote_damage_buffer_handle_; | |
| 422 #else | |
| 423 relay_params.damage_buffer_identifier = damage_buffer_->handle(); | |
| 424 #endif | |
| 425 relay_params.bitmap_rect = params.bitmap_rect; | 390 relay_params.bitmap_rect = params.bitmap_rect; |
| 426 relay_params.scroll_delta = params.scroll_delta; | 391 relay_params.scroll_delta = params.scroll_delta; |
| 427 relay_params.scroll_rect = params.scroll_rect; | 392 relay_params.scroll_rect = params.scroll_rect; |
| 428 relay_params.copy_rects = params.copy_rects; | 393 relay_params.copy_rects = params.copy_rects; |
| 429 relay_params.view_size = params.view_size; | 394 relay_params.view_size = params.view_size; |
| 430 relay_params.scale_factor = params.scale_factor; | 395 relay_params.scale_factor = params.scale_factor; |
| 431 relay_params.is_resize_ack = ViewHostMsg_UpdateRect_Flags::is_resize_ack( | 396 relay_params.is_resize_ack = ViewHostMsg_UpdateRect_Flags::is_resize_ack( |
| 432 params.flags); | 397 params.flags); |
| 433 | 398 |
| 434 // We need to send the ACK to the same render_view_host that issued | 399 // We need to send the ACK to the same render_view_host that issued |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 660 default: | 625 default: |
| 661 break; | 626 break; |
| 662 } | 627 } |
| 663 } | 628 } |
| 664 | 629 |
| 665 void BrowserPluginGuest::SendMessageToEmbedder(IPC::Message* msg) { | 630 void BrowserPluginGuest::SendMessageToEmbedder(IPC::Message* msg) { |
| 666 embedder_web_contents_->Send(msg); | 631 embedder_web_contents_->Send(msg); |
| 667 } | 632 } |
| 668 | 633 |
| 669 } // namespace content | 634 } // namespace content |
| OLD | NEW |