Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1784)

Unified Diff: content/renderer/browser_plugin/browser_plugin.cc

Issue 10965048: [BrowserTag] Send dib info with NavigateGuest message, (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix OSX (this CL exposes this): manage transport dibs on mac ourselves, instead of letting browser … Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/browser_plugin/browser_plugin.cc
diff --git a/content/renderer/browser_plugin/browser_plugin.cc b/content/renderer/browser_plugin/browser_plugin.cc
index 536f568a097a10c1fc530603ce702027d6b25285..3ecc3f6d94109e26d78920842e2415bddd33b7dc 100644
--- a/content/renderer/browser_plugin/browser_plugin.cc
+++ b/content/renderer/browser_plugin/browser_plugin.cc
@@ -11,6 +11,7 @@
#endif
#include "base/utf_string_conversions.h"
#include "content/common/browser_plugin_messages.h"
+#include "content/common/view_messages.h"
#include "content/public/common/content_client.h"
#include "content/public/renderer/content_renderer_client.h"
#include "content/renderer/browser_plugin/browser_plugin_bindings.h"
@@ -71,10 +72,7 @@ BrowserPlugin::BrowserPlugin(
}
BrowserPlugin::~BrowserPlugin() {
- if (damage_buffer_) {
- RenderProcess::current()->FreeTransportDIB(damage_buffer_);
- damage_buffer_ = NULL;
- }
+ FreeDamageBuffer();
RemoveEventListeners();
BrowserPluginManager::Get()->RemoveBrowserPlugin(instance_id_);
BrowserPluginManager::Get()->Send(
@@ -84,10 +82,7 @@ BrowserPlugin::~BrowserPlugin() {
}
void BrowserPlugin::Cleanup() {
- if (damage_buffer_) {
- RenderProcess::current()->FreeTransportDIB(damage_buffer_);
- damage_buffer_ = NULL;
- }
+ FreeDamageBuffer();
}
std::string BrowserPlugin::GetSrcAttribute() const {
@@ -98,12 +93,15 @@ void BrowserPlugin::SetSrcAttribute(const std::string& src) {
if (src == src_ && !guest_crashed_)
return;
if (!src.empty() || navigate_src_sent_) {
+ scoped_ptr<BrowserPluginHostMsg_ResizeGuest_Params> params(
+ GetPendingResizeParams());
+ DCHECK(!params->resize_pending);
BrowserPluginManager::Get()->Send(
new BrowserPluginHostMsg_NavigateGuest(
render_view_->GetRoutingID(),
instance_id_,
src,
- gfx::Size(width(), height())));
+ *params));
// Record that we sent a NavigateGuest message to embedder. Once we send
// such a message, subsequent SetSrcAttribute() calls must always send
// NavigateGuest messages to the embedder (even if |src| is empty), so
@@ -412,11 +410,6 @@ void BrowserPlugin::updateGeometry(
old_height == window_rect.height) {
return;
}
- // Until an actual navigation occurs, there is no browser side embedder
- // present to notify about geometry updates. In this case, after we've updated
- // the BrowserPlugin's state we are done and can return immediately.
- if (!navigate_src_sent_)
- return;
const size_t stride = skia::PlatformCanvas::StrideForWidth(window_rect.width);
// Make sure the size of the damage buffer is at least four bytes so that we
@@ -430,45 +423,92 @@ void BrowserPlugin::updateGeometry(
// Don't drop the old damage buffer until after we've made sure that the
// browser process has dropped it.
+#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 defined(OS_WIN)
- size_t allocation_granularity = base::SysInfo::VMAllocationGranularity();
- size_t shared_mem_size = size / allocation_granularity + 1;
- shared_mem_size = shared_mem_size * allocation_granularity;
-
- base::SharedMemory shared_mem;
- if (!shared_mem.CreateAnonymous(shared_mem_size))
- NOTREACHED() << "Unable to create shared memory of size:" << size;
- new_damage_buffer = TransportDIB::Map(shared_mem.handle());
+ if (RenderThreadImpl::current()->Send(msg) && handle.fd >= 0)
+ new_damage_buffer = TransportDIB::Map(handle);
#else
- new_damage_buffer = RenderProcess::current()->CreateTransportDIB(size);
+ 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());
// Insert the magic word.
*static_cast<unsigned int*>(new_damage_buffer->memory()) = 0xdeadbeef;
- BrowserPluginHostMsg_ResizeGuest_Params params;
- params.damage_buffer_id = new_damage_buffer->id();
+ pending_resize_params_.reset();
+
+ scoped_ptr<BrowserPluginHostMsg_ResizeGuest_Params> params(
+ new BrowserPluginHostMsg_ResizeGuest_Params);
+ params->damage_buffer_id = new_damage_buffer->id();
+#if defined(OS_MACOSX)
+ params->damage_buffer_handle = new_damage_buffer->handle();
+#endif
#if defined(OS_WIN)
- params.damage_buffer_size = size;
+ params->damage_buffer_size = size;
#endif
- params.width = window_rect.width;
- params.height = window_rect.height;
- params.resize_pending = resize_pending_;
- params.scale_factor = GetDeviceScaleFactor();
- BrowserPluginManager::Get()->Send(new BrowserPluginHostMsg_ResizeGuest(
- render_view_->GetRoutingID(),
- instance_id_,
- params));
- resize_pending_ = true;
+ params->width = window_rect.width;
+ params->height = window_rect.height;
+ params->resize_pending = resize_pending_;
+ params->scale_factor = GetDeviceScaleFactor();
+
+ if (navigate_src_sent_) {
+ BrowserPluginManager::Get()->Send(new BrowserPluginHostMsg_ResizeGuest(
+ render_view_->GetRoutingID(),
+ instance_id_,
+ *params));
+ resize_pending_ = true;
+ } else {
+ // Until an actual navigation occurs, there is no browser side embedder
+ // present to notify about geometry updates. In this case, after we've
+ // updated the BrowserPlugin's state we are done and we do not send a resize
+ // message to the browser.
+ pending_resize_params_.reset(params.release());
+ }
+ FreeDamageBuffer();
+ damage_buffer_ = new_damage_buffer;
+}
+void BrowserPlugin::FreeDamageBuffer() {
if (damage_buffer_) {
+#if defined(OS_MACOSX)
+ delete damage_buffer_;
Fady Samuel 2012/09/28 18:31:46 Please add a comment explaining why we don't need
lazyboy 2012/09/28 19:05:02 Done.
+#else
RenderProcess::current()->FreeTransportDIB(damage_buffer_);
damage_buffer_ = NULL;
+#endif
+ }
+}
+
+BrowserPluginHostMsg_ResizeGuest_Params*
+ BrowserPlugin::GetPendingResizeParams() {
+ if (pending_resize_params_.get()) {
+ resize_pending_ = true;
+ return pending_resize_params_.release();
+ } else {
+ BrowserPluginHostMsg_ResizeGuest_Params* params =
+ new BrowserPluginHostMsg_ResizeGuest_Params;
+
+ // We don't have a pending resize to send, so we send an invalid transport
+ // dib Id.
+ params->damage_buffer_id = TransportDIB::Id();
+ params->width = width();
+ params->height = height();
+ params->resize_pending = false;
+ return params;
}
- damage_buffer_ = new_damage_buffer;
}
void BrowserPlugin::updateFocus(bool focused) {
« no previous file with comments | « content/renderer/browser_plugin/browser_plugin.h ('k') | content/renderer/browser_plugin/browser_plugin_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698