| Index: content/renderer/browser_plugin/browser_plugin.cc
|
| ===================================================================
|
| --- content/renderer/browser_plugin/browser_plugin.cc (revision 182101)
|
| +++ content/renderer/browser_plugin/browser_plugin.cc (working copy)
|
| @@ -106,8 +106,7 @@
|
| render_view_(render_view->AsWeakPtr()),
|
| render_view_routing_id_(render_view->GetRoutingID()),
|
| container_(NULL),
|
| - current_damage_buffer_(NULL),
|
| - pending_damage_buffer_(NULL),
|
| + damage_buffer_sequence_id_(0),
|
| sad_guest_(NULL),
|
| guest_crashed_(false),
|
| navigate_src_sent_(false),
|
| @@ -134,10 +133,8 @@
|
| }
|
|
|
| BrowserPlugin::~BrowserPlugin() {
|
| - if (current_damage_buffer_)
|
| - FreeDamageBuffer(¤t_damage_buffer_);
|
| - if (pending_damage_buffer_)
|
| - FreeDamageBuffer(&pending_damage_buffer_);
|
| + current_damage_buffer_.reset();
|
| + pending_damage_buffer_.reset();
|
| browser_plugin_manager()->RemoveBrowserPlugin(instance_id_);
|
| browser_plugin_manager()->Send(
|
| new BrowserPluginHostMsg_PluginDestroyed(
|
| @@ -146,10 +143,8 @@
|
| }
|
|
|
| void BrowserPlugin::Cleanup() {
|
| - if (current_damage_buffer_)
|
| - FreeDamageBuffer(¤t_damage_buffer_);
|
| - if (pending_damage_buffer_)
|
| - FreeDamageBuffer(&pending_damage_buffer_);
|
| + current_damage_buffer_.reset();
|
| + pending_damage_buffer_.reset();
|
| }
|
|
|
| bool BrowserPlugin::OnMessageReceived(const IPC::Message& message) {
|
| @@ -216,9 +211,8 @@
|
| create_guest_params.persist_storage = persist_storage_;
|
| create_guest_params.focused = ShouldGuestBeFocused();
|
| create_guest_params.visible = visible_;
|
| - pending_damage_buffer_ =
|
| - GetDamageBufferWithSizeParams(&create_guest_params.auto_size_params,
|
| - &create_guest_params.resize_guest_params);
|
| + GetDamageBufferWithSizeParams(&create_guest_params.auto_size_params,
|
| + &create_guest_params.resize_guest_params);
|
| browser_plugin_manager()->Send(
|
| new BrowserPluginHostMsg_CreateGuest(
|
| render_view_routing_id_,
|
| @@ -269,8 +263,7 @@
|
| return;
|
| BrowserPluginHostMsg_AutoSize_Params auto_size_params;
|
| BrowserPluginHostMsg_ResizeGuest_Params resize_guest_params;
|
| - pending_damage_buffer_ =
|
| - GetDamageBufferWithSizeParams(&auto_size_params, &resize_guest_params);
|
| + GetDamageBufferWithSizeParams(&auto_size_params, &resize_guest_params);
|
| browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetAutoSize(
|
| render_view_routing_id_,
|
| instance_id_,
|
| @@ -289,23 +282,18 @@
|
| TriggerEvent(kEventSizeChanged, &props);
|
| }
|
|
|
| -#if defined(OS_MACOSX)
|
| -bool BrowserPlugin::DamageBufferMatches(
|
| - const TransportDIB* damage_buffer,
|
| - const TransportDIB::Id& other_damage_buffer_id) {
|
| - if (!damage_buffer)
|
| - return false;
|
| - return damage_buffer->id() == other_damage_buffer_id;
|
| +// static
|
| +bool BrowserPlugin::UsesDamageBuffer(
|
| + const BrowserPluginMsg_UpdateRect_Params& params) {
|
| + return params.damage_buffer_sequence_id != 0;
|
| }
|
| -#else
|
| -bool BrowserPlugin::DamageBufferMatches(
|
| - const TransportDIB* damage_buffer,
|
| - const TransportDIB::Handle& other_damage_buffer_handle) {
|
| - if (!damage_buffer)
|
| +
|
| +bool BrowserPlugin::UsesPendingDamageBuffer(
|
| + const BrowserPluginMsg_UpdateRect_Params& params) {
|
| + if (!pending_damage_buffer_.get())
|
| return false;
|
| - return damage_buffer->handle() == other_damage_buffer_handle;
|
| + return damage_buffer_sequence_id_ == params.damage_buffer_sequence_id;
|
| }
|
| -#endif
|
|
|
| void BrowserPlugin::OnAdvanceFocus(int instance_id, bool reverse) {
|
| DCHECK(render_view_);
|
| @@ -434,8 +422,7 @@
|
| // damage buffer then we know the guest will no longer use the current
|
| // damage buffer. At this point, we drop the current damage buffer, and
|
| // mark the pending damage buffer as the current damage buffer.
|
| - if (DamageBufferMatches(pending_damage_buffer_,
|
| - params.damage_buffer_identifier)) {
|
| + if (UsesPendingDamageBuffer(params)) {
|
| SwapDamageBuffers();
|
| use_new_damage_buffer = true;
|
| }
|
| @@ -451,9 +438,8 @@
|
| // If we have no pending damage buffer, then the guest has not caught up
|
| // with the BrowserPlugin container. We now tell the guest about the new
|
| // container size.
|
| - pending_damage_buffer_ =
|
| - GetDamageBufferWithSizeParams(&auto_size_params,
|
| - &resize_guest_params);
|
| + GetDamageBufferWithSizeParams(&auto_size_params,
|
| + &resize_guest_params);
|
| }
|
| browser_plugin_manager()->Send(new BrowserPluginHostMsg_UpdateRect_ACK(
|
| render_view_routing_id_,
|
| @@ -508,7 +494,7 @@
|
| for (unsigned i = 0; i < params.copy_rects.size(); i++) {
|
| backing_store_->PaintToBackingStore(params.bitmap_rect,
|
| params.copy_rects,
|
| - current_damage_buffer_);
|
| + current_damage_buffer_->memory());
|
| }
|
| // Invalidate the container.
|
| // If the BrowserPlugin is scheduled to be deleted, then container_ will be
|
| @@ -869,36 +855,18 @@
|
| }
|
|
|
| BrowserPluginHostMsg_ResizeGuest_Params params;
|
| - pending_damage_buffer_ =
|
| - PopulateResizeGuestParameters(¶ms, gfx::Size(width(), height()));
|
| + PopulateResizeGuestParameters(¶ms, gfx::Size(width(), height()));
|
| browser_plugin_manager()->Send(new BrowserPluginHostMsg_ResizeGuest(
|
| render_view_routing_id_,
|
| instance_id_,
|
| params));
|
| }
|
|
|
| -void BrowserPlugin::FreeDamageBuffer(TransportDIB** damage_buffer) {
|
| - DCHECK(damage_buffer);
|
| - DCHECK(*damage_buffer);
|
| -#if defined(OS_MACOSX)
|
| - // We don't need to (nor should we) send ViewHostMsg_FreeTransportDIB
|
| - // message to the browser to free the damage buffer since we manage the
|
| - // damage buffer ourselves.
|
| - delete *damage_buffer;
|
| -#else
|
| - RenderProcess::current()->FreeTransportDIB(*damage_buffer);
|
| - *damage_buffer = NULL;
|
| -#endif
|
| -}
|
| -
|
| void BrowserPlugin::SwapDamageBuffers() {
|
| - if (current_damage_buffer_)
|
| - FreeDamageBuffer(¤t_damage_buffer_);
|
| - current_damage_buffer_ = pending_damage_buffer_;
|
| - pending_damage_buffer_ = NULL;
|
| + current_damage_buffer_.reset(pending_damage_buffer_.release());
|
| }
|
|
|
| -TransportDIB* BrowserPlugin::PopulateResizeGuestParameters(
|
| +void BrowserPlugin::PopulateResizeGuestParameters(
|
| BrowserPluginHostMsg_ResizeGuest_Params* params,
|
| const gfx::Size& view_size) {
|
| const size_t stride = skia::PlatformCanvasStrideForWidth(view_size.width());
|
| @@ -911,60 +879,66 @@
|
| GetDeviceScaleFactor() *
|
| GetDeviceScaleFactor()));
|
|
|
| - TransportDIB* new_damage_buffer = CreateTransportDIB(size);
|
| - params->damage_buffer_id = new_damage_buffer->id();
|
| -#if defined(OS_MACOSX)
|
| - // |damage_buffer_id| is not enough to retrieve the damage buffer (on browser
|
| - // side) since we don't let the browser cache the damage buffer. We need a
|
| - // handle to the damage buffer for this.
|
| - params->damage_buffer_handle = new_damage_buffer->handle();
|
| -#endif
|
| -#if defined(OS_WIN)
|
| params->damage_buffer_size = size;
|
| -#endif
|
| params->view_size = view_size;
|
| params->scale_factor = GetDeviceScaleFactor();
|
| - return new_damage_buffer;
|
| + pending_damage_buffer_.reset(
|
| + CreateDamageBuffer(size, ¶ms->damage_buffer_handle));
|
| + if (!pending_damage_buffer_.get())
|
| + NOTREACHED();
|
| + params->damage_buffer_sequence_id = ++damage_buffer_sequence_id_;
|
| }
|
|
|
| -TransportDIB* BrowserPlugin::GetDamageBufferWithSizeParams(
|
| +void BrowserPlugin::GetDamageBufferWithSizeParams(
|
| BrowserPluginHostMsg_AutoSize_Params* auto_size_params,
|
| BrowserPluginHostMsg_ResizeGuest_Params* resize_guest_params) {
|
| PopulateAutoSizeParameters(auto_size_params);
|
| gfx::Size view_size = auto_size_params->enable ? auto_size_params->max_size :
|
| gfx::Size(width(), height());
|
| if (view_size.IsEmpty())
|
| - return NULL;
|
| - return PopulateResizeGuestParameters(resize_guest_params, view_size);
|
| + return;
|
| + PopulateResizeGuestParameters(resize_guest_params, view_size);
|
| }
|
|
|
| -TransportDIB* BrowserPlugin::CreateTransportDIB(const size_t size) {
|
| -#if defined(OS_MACOSX)
|
| - TransportDIB::Handle handle;
|
| - // On OSX we don't let the browser manage the transport dib. We manage the
|
| - // deletion of the dib in FreeDamageBuffer().
|
| - IPC::Message* msg = new ViewHostMsg_AllocTransportDIB(
|
| - size,
|
| - false, // cache in browser.
|
| - &handle);
|
| - TransportDIB* new_damage_buffer = NULL;
|
| - if (browser_plugin_manager()->Send(msg) && handle.fd >= 0)
|
| - new_damage_buffer = TransportDIB::Map(handle);
|
| -#else
|
| - TransportDIB* new_damage_buffer =
|
| - RenderProcess::current()->CreateTransportDIB(size);
|
| -#endif
|
| - if (!new_damage_buffer)
|
| - NOTREACHED() << "Unable to create damage buffer";
|
| -#if defined(OS_WIN)
|
| - // Windows does not map the buffer by default.
|
| - CHECK(new_damage_buffer->Map());
|
| -#endif
|
| - DCHECK(new_damage_buffer->memory());
|
| +#if defined(OS_POSIX)
|
| +base::SharedMemory* BrowserPlugin::CreateDamageBuffer(
|
| + const size_t size,
|
| + base::SharedMemoryHandle* damage_buffer_handle) {
|
| + scoped_ptr<base::SharedMemory> shared_buf(
|
| + content::RenderThread::Get()->HostAllocateSharedMemoryBuffer(
|
| + size).release());
|
| +
|
| + if (shared_buf.get()) {
|
| + if (shared_buf->Map(size)) {
|
| + // Insert the magic word.
|
| + *static_cast<unsigned int*>(shared_buf->memory()) = 0xdeadbeef;
|
| + shared_buf->ShareToProcess(base::GetCurrentProcessHandle(),
|
| + damage_buffer_handle);
|
| + return shared_buf.release();
|
| + }
|
| + }
|
| + NOTREACHED();
|
| + return NULL;
|
| +}
|
| +#elif defined(OS_WIN)
|
| +base::SharedMemory* BrowserPlugin::CreateDamageBuffer(
|
| + const size_t size,
|
| + base::SharedMemoryHandle* damage_buffer_handle) {
|
| + scoped_ptr<base::SharedMemory> shared_buf(new base::SharedMemory());
|
| +
|
| + if (!shared_buf->CreateAndMapAnonymous(size)) {
|
| + NOTREACHED() << "Buffer allocation failed";
|
| + return NULL;
|
| + }
|
| // Insert the magic word.
|
| - *static_cast<unsigned int*>(new_damage_buffer->memory()) = 0xdeadbeef;
|
| - return new_damage_buffer;
|
| + *static_cast<unsigned int*>(shared_buf->memory()) = 0xdeadbeef;
|
| + if (shared_buf->ShareToProcess(base::GetCurrentProcessHandle(),
|
| + damage_buffer_handle))
|
| + return shared_buf.release();
|
| + NOTREACHED();
|
| + return NULL;
|
| }
|
| +#endif
|
|
|
| void BrowserPlugin::updateFocus(bool focused) {
|
| if (plugin_focused_ == focused)
|
|
|