Index: content/browser/browser_plugin/browser_plugin_guest.cc |
=================================================================== |
--- content/browser/browser_plugin/browser_plugin_guest.cc (revision 182101) |
+++ content/browser/browser_plugin/browser_plugin_guest.cc (working copy) |
@@ -49,10 +49,8 @@ |
: WebContentsObserver(web_contents), |
embedder_web_contents_(NULL), |
instance_id_(instance_id), |
-#if defined(OS_WIN) |
+ damage_buffer_sequence_id_(0), |
damage_buffer_size_(0), |
- remote_damage_buffer_handle_(0), |
-#endif |
damage_buffer_scale_factor_(1.0f), |
pending_update_counter_(0), |
guest_hang_timeout_( |
@@ -274,69 +272,44 @@ |
RenderWidgetHostImpl* render_widget_host = |
RenderWidgetHostImpl::From(web_contents()->GetRenderViewHost()); |
render_widget_host->ResetSizeAndRepaintPendingFlags(); |
- if (!TransportDIB::is_valid_id(params.damage_buffer_id)) { |
- // Invalid transport dib, so just resize the WebContents. |
+ if (!base::SharedMemory::IsHandleValid(params.damage_buffer_handle)) { |
+ // Invalid damage buffer, so just resize the WebContents. |
if (!params.view_size.IsEmpty()) |
web_contents()->GetView()->SizeContents(params.view_size); |
return; |
} |
- TransportDIB* damage_buffer = |
- GetDamageBufferFromEmbedder(embedder_rvh, params); |
- SetDamageBuffer(damage_buffer, |
-#if defined(OS_WIN) |
- params.damage_buffer_size, |
- params.damage_buffer_id.handle, |
-#endif |
- params.view_size, |
- params.scale_factor); |
+ SetDamageBuffer(params); |
web_contents()->GetView()->SizeContents(params.view_size); |
} |
-TransportDIB* BrowserPluginGuest::GetDamageBufferFromEmbedder( |
- RenderViewHost* embedder_rvh, |
+base::SharedMemory* BrowserPluginGuest::GetDamageBufferFromEmbedder( |
const BrowserPluginHostMsg_ResizeGuest_Params& params) { |
- TransportDIB* damage_buffer = NULL; |
#if defined(OS_WIN) |
- // On Windows we need to duplicate the handle from the remote process. |
- HANDLE section; |
- DuplicateHandle(embedder_rvh->GetProcess()->GetHandle(), |
- params.damage_buffer_id.handle, |
- GetCurrentProcess(), |
- §ion, |
- STANDARD_RIGHTS_REQUIRED | FILE_MAP_READ | FILE_MAP_WRITE, |
- FALSE, |
- 0); |
- damage_buffer = TransportDIB::Map(section); |
-#elif defined(OS_MACOSX) |
- // On OSX, we need the handle to map the transport dib. |
- damage_buffer = TransportDIB::Map(params.damage_buffer_handle); |
-#elif defined(OS_ANDROID) |
- damage_buffer = TransportDIB::Map(params.damage_buffer_id); |
-#elif defined(OS_POSIX) |
- damage_buffer = TransportDIB::Map(params.damage_buffer_id.shmkey); |
-#endif // defined(OS_POSIX) |
- DCHECK(damage_buffer); |
- return damage_buffer; |
+ base::ProcessHandle handle = |
+ embedder_web_contents_->GetRenderProcessHost()->GetHandle(); |
+ scoped_ptr<base::SharedMemory> shared_buf( |
+ new base::SharedMemory(params.damage_buffer_handle, false, handle)); |
+ #elif defined(OS_POSIX) |
+ scoped_ptr<base::SharedMemory> shared_buf( |
+ new base::SharedMemory(params.damage_buffer_handle, false)); |
+#endif |
+ if (!shared_buf->Map(params.damage_buffer_size)) { |
+ NOTREACHED(); |
+ return NULL; |
+ } |
+ return shared_buf.release(); |
} |
void BrowserPluginGuest::SetDamageBuffer( |
- TransportDIB* damage_buffer, |
-#if defined(OS_WIN) |
- int damage_buffer_size, |
- TransportDIB::Handle remote_handle, |
-#endif |
- const gfx::Size& damage_view_size, |
- float scale_factor) { |
+ const BrowserPluginHostMsg_ResizeGuest_Params& params) { |
+ damage_buffer_.reset(GetDamageBufferFromEmbedder(params)); |
// Sanity check: Verify that we've correctly shared the damage buffer memory |
// between the embedder and browser processes. |
- DCHECK(*static_cast<unsigned int*>(damage_buffer->memory()) == 0xdeadbeef); |
- damage_buffer_.reset(damage_buffer); |
-#if defined(OS_WIN) |
- damage_buffer_size_ = damage_buffer_size; |
- remote_damage_buffer_handle_ = remote_handle; |
-#endif |
- damage_view_size_ = damage_view_size; |
- damage_buffer_scale_factor_ = scale_factor; |
+ DCHECK(*static_cast<unsigned int*>(damage_buffer_->memory()) == 0xdeadbeef); |
+ damage_buffer_sequence_id_ = params.damage_buffer_sequence_id; |
+ damage_buffer_size_ = params.damage_buffer_size; |
+ damage_view_size_ = params.view_size; |
+ damage_buffer_scale_factor_ = params.scale_factor; |
} |
gfx::Point BrowserPluginGuest::GetScreenCoordinates( |
@@ -397,14 +370,14 @@ |
TransportDIB* dib = render_view_host->GetProcess()-> |
GetTransportDIB(params.bitmap); |
if (dib) { |
+ size_t guest_damage_buffer_size = |
#if defined(OS_WIN) |
- size_t guest_damage_buffer_size = params.bitmap_rect.width() * |
- params.bitmap_rect.height() * 4; |
- size_t embedder_damage_buffer_size = damage_buffer_size_; |
+ params.bitmap_rect.width() * |
+ params.bitmap_rect.height() * 4; |
#else |
- size_t guest_damage_buffer_size = dib->size(); |
- size_t embedder_damage_buffer_size = damage_buffer_->size(); |
+ dib->size(); |
#endif |
+ size_t embedder_damage_buffer_size = damage_buffer_size_; |
void* guest_memory = dib->memory(); |
void* embedder_memory = damage_buffer_->memory(); |
size_t size = std::min(guest_damage_buffer_size, |
@@ -413,15 +386,7 @@ |
} |
} |
BrowserPluginMsg_UpdateRect_Params relay_params; |
-#if defined(OS_MACOSX) |
- relay_params.damage_buffer_identifier = damage_buffer_->id(); |
-#elif defined(OS_WIN) |
- // On Windows, the handle used locally differs from the handle received from |
- // the embedder process, since we duplicate the remote handle. |
- relay_params.damage_buffer_identifier = remote_damage_buffer_handle_; |
-#else |
- relay_params.damage_buffer_identifier = damage_buffer_->handle(); |
-#endif |
+ relay_params.damage_buffer_sequence_id = damage_buffer_sequence_id_; |
relay_params.bitmap_rect = params.bitmap_rect; |
relay_params.scroll_delta = params.scroll_delta; |
relay_params.scroll_rect = params.scroll_rect; |