summaryrefslogtreecommitdiffstats
path: root/content/browser
diff options
context:
space:
mode:
Diffstat (limited to 'content/browser')
-rw-r--r--content/browser/renderer_host/browser_render_process_host.cc8
-rw-r--r--content/browser/renderer_host/browser_render_process_host.h3
-rw-r--r--content/browser/renderer_host/gpu_message_filter.cc14
-rw-r--r--content/browser/renderer_host/gpu_message_filter.h8
-rw-r--r--content/browser/renderer_host/mock_render_process_host.cc5
-rw-r--r--content/browser/renderer_host/mock_render_process_host.h3
-rw-r--r--content/browser/renderer_host/render_process_host.h9
-rw-r--r--content/browser/renderer_host/render_view_host.cc4
-rw-r--r--content/browser/renderer_host/render_widget_helper.cc21
-rw-r--r--content/browser/renderer_host/render_widget_helper.h13
-rw-r--r--content/browser/renderer_host/render_widget_host.cc17
-rw-r--r--content/browser/renderer_host/render_widget_host.h2
-rw-r--r--content/browser/renderer_host/render_widget_host_unittest.cc8
-rw-r--r--content/browser/renderer_host/test_render_view_host.cc2
-rw-r--r--content/browser/tab_contents/interstitial_page.cc2
-rw-r--r--content/browser/tab_contents/render_view_host_manager.cc2
16 files changed, 102 insertions, 19 deletions
diff --git a/content/browser/renderer_host/browser_render_process_host.cc b/content/browser/renderer_host/browser_render_process_host.cc
index 1c2d42d..0ced958 100644
--- a/content/browser/renderer_host/browser_render_process_host.cc
+++ b/content/browser/renderer_host/browser_render_process_host.cc
@@ -364,7 +364,7 @@ void BrowserRenderProcessHost::CreateMessageFilters() {
channel_->AddFilter(
GeolocationDispatcherHost::New(
id(), profile()->GetGeolocationPermissionContext()));
- channel_->AddFilter(new GpuMessageFilter(id()));
+ channel_->AddFilter(new GpuMessageFilter(id(), widget_helper_.get()));
channel_->AddFilter(new PepperFileMessageFilter(id(), profile()));
channel_->AddFilter(
new PepperMessageFilter(&profile()->GetResourceContext()));
@@ -715,6 +715,12 @@ void BrowserRenderProcessHost::ClearTransportDIBCache() {
cached_dibs_.clear();
}
+void BrowserRenderProcessHost::SetCompositingSurface(
+ int render_widget_id,
+ gfx::PluginWindowHandle compositing_surface) {
+ widget_helper_->SetCompositingSurface(render_widget_id, compositing_surface);
+}
+
bool BrowserRenderProcessHost::Send(IPC::Message* msg) {
if (!channel_.get()) {
if (!is_initialized_) {
diff --git a/content/browser/renderer_host/browser_render_process_host.h b/content/browser/renderer_host/browser_render_process_host.h
index c41c489..880809d 100644
--- a/content/browser/renderer_host/browser_render_process_host.h
+++ b/content/browser/renderer_host/browser_render_process_host.h
@@ -61,6 +61,9 @@ class BrowserRenderProcessHost : public RenderProcessHost,
virtual bool FastShutdownIfPossible();
virtual base::ProcessHandle GetHandle();
virtual TransportDIB* GetTransportDIB(TransportDIB::Id dib_id);
+ virtual void SetCompositingSurface(
+ int render_widget_id,
+ gfx::PluginWindowHandle compositing_surface);
// IPC::Channel::Sender via RenderProcessHost.
virtual bool Send(IPC::Message* msg);
diff --git a/content/browser/renderer_host/gpu_message_filter.cc b/content/browser/renderer_host/gpu_message_filter.cc
index ce028b6..600de33 100644
--- a/content/browser/renderer_host/gpu_message_filter.cc
+++ b/content/browser/renderer_host/gpu_message_filter.cc
@@ -10,11 +10,14 @@
#include "base/callback.h"
#include "content/browser/gpu/gpu_process_host.h"
+#include "content/browser/renderer_host/render_widget_helper.h"
#include "content/common/gpu/gpu_messages.h"
-GpuMessageFilter::GpuMessageFilter(int render_process_id)
+GpuMessageFilter::GpuMessageFilter(int render_process_id,
+ RenderWidgetHelper* render_widget_helper)
: gpu_host_id_(0),
- render_process_id_(render_process_id) {
+ render_process_id_(render_process_id),
+ render_widget_helper_(render_widget_helper) {
}
// WeakPtrs to a GpuMessageFilter need to be Invalidated from
@@ -153,12 +156,15 @@ void GpuMessageFilter::OnEstablishGpuChannel(
}
void GpuMessageFilter::OnCreateViewCommandBuffer(
- gfx::PluginWindowHandle compositing_surface,
int32 render_view_id,
const GPUCreateCommandBufferConfig& init_params,
IPC::Message* reply) {
GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_);
- if (!host) {
+
+ gfx::PluginWindowHandle compositing_surface =
+ render_widget_helper_->LookupCompositingSurface(render_view_id);
+
+ if (!host || compositing_surface == gfx::kNullPluginWindow) {
// TODO(apatrick): Eventually, this IPC message will be routed to a
// GpuProcessStub with a particular routing ID. The error will be set if
// the GpuProcessStub with that routing ID is not in the MessageRouter.
diff --git a/content/browser/renderer_host/gpu_message_filter.h b/content/browser/renderer_host/gpu_message_filter.h
index 7246f5a..d4e3651 100644
--- a/content/browser/renderer_host/gpu_message_filter.h
+++ b/content/browser/renderer_host/gpu_message_filter.h
@@ -6,6 +6,7 @@
#define CONTENT_BROWSER_RENDERER_HOST_GPU_MESSAGE_FILTER_H_
#pragma once
+#include "base/memory/ref_counted.h"
#include "content/browser/browser_message_filter.h"
#include "content/common/gpu/gpu_process_launch_causes.h"
#include "ui/gfx/native_widget_types.h"
@@ -14,6 +15,7 @@ class GpuProcessHost;
class GpuProcessHostUIShim;
struct GPUCreateCommandBufferConfig;
struct GPUInfo;
+class RenderWidgetHelper;
namespace IPC {
struct ChannelHandle;
@@ -25,7 +27,8 @@ struct ChannelHandle;
class GpuMessageFilter : public BrowserMessageFilter,
public base::SupportsWeakPtr<GpuMessageFilter> {
public:
- explicit GpuMessageFilter(int render_process_id);
+ GpuMessageFilter(int render_process_id,
+ RenderWidgetHelper* render_widget_helper);
// BrowserMessageFilter methods:
virtual bool OnMessageReceived(const IPC::Message& message,
@@ -41,7 +44,6 @@ class GpuMessageFilter : public BrowserMessageFilter,
void OnEstablishGpuChannel(content::CauseForGpuLaunch,
IPC::Message* reply);
void OnCreateViewCommandBuffer(
- gfx::PluginWindowHandle compositing_surface,
int32 render_view_id,
const GPUCreateCommandBufferConfig& init_params,
IPC::Message* reply);
@@ -49,6 +51,8 @@ class GpuMessageFilter : public BrowserMessageFilter,
int gpu_host_id_;
int render_process_id_;
+ scoped_refptr<RenderWidgetHelper> render_widget_helper_;
+
DISALLOW_COPY_AND_ASSIGN(GpuMessageFilter);
};
diff --git a/content/browser/renderer_host/mock_render_process_host.cc b/content/browser/renderer_host/mock_render_process_host.cc
index 2cbfd89..4b27ce3 100644
--- a/content/browser/renderer_host/mock_render_process_host.cc
+++ b/content/browser/renderer_host/mock_render_process_host.cc
@@ -103,6 +103,11 @@ TransportDIB* MockRenderProcessHost::GetTransportDIB(TransportDIB::Id dib_id) {
return transport_dib_;
}
+void MockRenderProcessHost::SetCompositingSurface(
+ int render_widget_id,
+ gfx::PluginWindowHandle compositing_surface) {
+}
+
bool MockRenderProcessHost::OnMessageReceived(const IPC::Message& msg) {
return false;
}
diff --git a/content/browser/renderer_host/mock_render_process_host.h b/content/browser/renderer_host/mock_render_process_host.h
index e4ae3db..a785129 100644
--- a/content/browser/renderer_host/mock_render_process_host.h
+++ b/content/browser/renderer_host/mock_render_process_host.h
@@ -52,6 +52,9 @@ class MockRenderProcessHost : public RenderProcessHost {
virtual bool FastShutdownIfPossible();
virtual base::ProcessHandle GetHandle();
virtual TransportDIB* GetTransportDIB(TransportDIB::Id dib_id);
+ virtual void SetCompositingSurface(
+ int render_widget_id,
+ gfx::PluginWindowHandle compositing_surface);
// IPC::Channel::Sender via RenderProcessHost.
virtual bool Send(IPC::Message* msg);
diff --git a/content/browser/renderer_host/render_process_host.h b/content/browser/renderer_host/render_process_host.h
index c5b45e0..5035cd4 100644
--- a/content/browser/renderer_host/render_process_host.h
+++ b/content/browser/renderer_host/render_process_host.h
@@ -14,6 +14,7 @@
#include "base/process_util.h"
#include "base/time.h"
#include "ipc/ipc_channel_proxy.h"
+#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/surface/transport_dib.h"
class Profile;
@@ -226,6 +227,14 @@ class RenderProcessHost : public IPC::Channel::Sender,
// still owns the returned DIB.
virtual TransportDIB* GetTransportDIB(TransportDIB::Id dib_id) = 0;
+ // RenderWidgetHost / compositing surface mapping functions ------------------
+
+ // Set a mapping from a RenderWidgetHost to a compositing surface. Pass a null
+ // handle to remove the mapping.
+ virtual void SetCompositingSurface(
+ int render_widget_id,
+ gfx::PluginWindowHandle compositing_surface) = 0;
+
// Static management functions -----------------------------------------------
// Flag to run the renderer in process. This is primarily
diff --git a/content/browser/renderer_host/render_view_host.cc b/content/browser/renderer_host/render_view_host.cc
index 59d65e2..5030cc6 100644
--- a/content/browser/renderer_host/render_view_host.cc
+++ b/content/browser/renderer_host/render_view_host.cc
@@ -161,9 +161,11 @@ bool RenderViewHost::CreateRenderView(const string16& frame_name) {
renderer_initialized_ = true;
+ process()->SetCompositingSurface(routing_id(),
+ GetCompositingSurface());
+
ViewMsg_New_Params params;
params.parent_window = GetNativeViewId();
- params.compositing_surface = GetCompositingSurface();
params.renderer_preferences =
delegate_->GetRendererPrefs(process()->profile());
params.web_preferences = delegate_->GetWebkitPrefs();
diff --git a/content/browser/renderer_host/render_widget_helper.cc b/content/browser/renderer_host/render_widget_helper.cc
index f297110..cbfa094 100644
--- a/content/browser/renderer_host/render_widget_helper.cc
+++ b/content/browser/renderer_host/render_widget_helper.cc
@@ -333,3 +333,24 @@ void RenderWidgetHelper::ClearAllocatedDIBs() {
allocated_dibs_.clear();
}
#endif
+
+void RenderWidgetHelper::SetCompositingSurface(
+ int render_widget_id,
+ gfx::PluginWindowHandle compositing_surface) {
+ base::AutoLock locked(view_compositing_surface_map_lock_);
+ if (compositing_surface != gfx::kNullPluginWindow)
+ view_compositing_surface_map_[render_widget_id] = compositing_surface;
+ else
+ view_compositing_surface_map_.erase(render_widget_id);
+}
+
+gfx::PluginWindowHandle RenderWidgetHelper::LookupCompositingSurface(
+ int render_widget_id) {
+ base::AutoLock locked(view_compositing_surface_map_lock_);
+ ViewCompositingSurfaceMap::iterator it =
+ view_compositing_surface_map_.find(render_widget_id);
+ if (it == view_compositing_surface_map_.end())
+ return gfx::kNullPluginWindow;
+
+ return it->second;
+}
diff --git a/content/browser/renderer_host/render_widget_helper.h b/content/browser/renderer_host/render_widget_helper.h
index 0c7f695..cab0947 100644
--- a/content/browser/renderer_host/render_widget_helper.h
+++ b/content/browser/renderer_host/render_widget_helper.h
@@ -16,6 +16,7 @@
#include "base/synchronization/waitable_event.h"
#include "content/common/window_container_type.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupType.h"
+#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/surface/transport_dib.h"
namespace IPC {
@@ -117,6 +118,10 @@ class RenderWidgetHelper
TransportDIB* MapTransportDIB(TransportDIB::Id dib_id);
#endif
+ // Set a mapping from a RenderWidgetHost to a compositing surface. Pass a null
+ // handle to remove the mapping.
+ void SetCompositingSurface(int render_widget_id,
+ gfx::PluginWindowHandle compositing_surface);
// IO THREAD ONLY -----------------------------------------------------------
@@ -145,6 +150,9 @@ class RenderWidgetHelper
void FreeTransportDIB(TransportDIB::Id dib_id);
#endif
+ // Lookup the compositing surface corresponding to a widget ID.
+ gfx::PluginWindowHandle LookupCompositingSurface(int render_widget_id);
+
private:
// A class used to proxy a paint message. PaintMsgProxy objects are created
// on the IO thread and destroyed on the UI thread.
@@ -200,6 +208,11 @@ class RenderWidgetHelper
UpdateMsgProxyMap pending_paints_;
base::Lock pending_paints_lock_;
+ // Maps from view ID to compositing surface.
+ typedef std::map<int, gfx::PluginWindowHandle> ViewCompositingSurfaceMap;
+ ViewCompositingSurfaceMap view_compositing_surface_map_;
+ base::Lock view_compositing_surface_map_lock_;
+
int render_process_id_;
// Event used to implement WaitForUpdateMsg.
diff --git a/content/browser/renderer_host/render_widget_host.cc b/content/browser/renderer_host/render_widget_host.cc
index b962f6e..4e01606 100644
--- a/content/browser/renderer_host/render_widget_host.cc
+++ b/content/browser/renderer_host/render_widget_host.cc
@@ -98,12 +98,21 @@ RenderWidgetHost::RenderWidgetHost(RenderProcessHost* process,
}
RenderWidgetHost::~RenderWidgetHost() {
+ SetView(NULL);
+
// Clear our current or cached backing store if either remains.
BackingStoreManager::RemoveBackingStore(this);
process_->Release(routing_id_);
}
+void RenderWidgetHost::SetView(RenderWidgetHostView* view) {
+ view_ = view;
+
+ if (!view_)
+ process_->SetCompositingSurface(routing_id_, gfx::kNullPluginWindow);
+}
+
gfx::NativeViewId RenderWidgetHost::GetNativeViewId() {
if (view_)
return gfx::IdFromNativeView(view_->GetNativeView());
@@ -127,9 +136,11 @@ void RenderWidgetHost::Init() {
renderer_initialized_ = true;
+ process_->SetCompositingSurface(routing_id_,
+ GetCompositingSurface());
+
// Send the ack along with the information on placement.
- Send(new ViewMsg_CreatingNew_ACK(
- routing_id_, GetNativeViewId(), GetCompositingSurface()));
+ Send(new ViewMsg_CreatingNew_ACK(routing_id_, GetNativeViewId()));
WasResized();
}
@@ -363,7 +374,7 @@ void RenderWidgetHost::LostCapture() {
void RenderWidgetHost::ViewDestroyed() {
// TODO(evanm): tracking this may no longer be necessary;
// eliminate this function if so.
- view_ = NULL;
+ SetView(NULL);
}
void RenderWidgetHost::SetIsLoading(bool is_loading) {
diff --git a/content/browser/renderer_host/render_widget_host.h b/content/browser/renderer_host/render_widget_host.h
index 80f1bc4b..947ef2b 100644
--- a/content/browser/renderer_host/render_widget_host.h
+++ b/content/browser/renderer_host/render_widget_host.h
@@ -144,7 +144,7 @@ class RenderWidgetHost : public IPC::Channel::Listener,
// RenderWidget is being destroyed or the render process crashed. You should
// never cache this pointer since it can become NULL if the renderer crashes,
// instead you should always ask for it using the accessor.
- void set_view(RenderWidgetHostView* view) { view_ = view; }
+ void SetView(RenderWidgetHostView* view);
RenderWidgetHostView* view() const { return view_; }
RenderProcessHost* process() const { return process_; }
diff --git a/content/browser/renderer_host/render_widget_host_unittest.cc b/content/browser/renderer_host/render_widget_host_unittest.cc
index 0018fe5..17c8108 100644
--- a/content/browser/renderer_host/render_widget_host_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_unittest.cc
@@ -260,7 +260,7 @@ class RenderWidgetHostTest : public testing::Test {
process_ = new RenderWidgetHostProcess(profile_.get());
host_.reset(new MockRenderWidgetHost(process_, 1));
view_.reset(new TestView(host_.get()));
- host_->set_view(view_.get());
+ host_->SetView(view_.get());
host_->Init();
}
void TearDown() {
@@ -416,13 +416,13 @@ TEST_F(RenderWidgetHostTest, ResizeThenCrash) {
// Simulate a renderer crash before the update message. Ensure all the
// resize ack logic is cleared. Must clear the view first so it doesn't get
// deleted.
- host_->set_view(NULL);
+ host_->SetView(NULL);
host_->RendererExited(base::TERMINATION_STATUS_PROCESS_CRASHED, -1);
EXPECT_FALSE(host_->resize_ack_pending_);
EXPECT_EQ(gfx::Size(), host_->in_flight_size_);
// Reset the view so we can exit the test cleanly.
- host_->set_view(view_.get());
+ host_->SetView(view_.get());
}
// Tests setting custom background
@@ -430,7 +430,7 @@ TEST_F(RenderWidgetHostTest, Background) {
#if !defined(OS_MACOSX)
scoped_ptr<RenderWidgetHostView> view(
RenderWidgetHostView::CreateViewForWidget(host_.get()));
- host_->set_view(view.get());
+ host_->SetView(view.get());
// Create a checkerboard background to test with.
gfx::CanvasSkia canvas(4, 4, true);
diff --git a/content/browser/renderer_host/test_render_view_host.cc b/content/browser/renderer_host/test_render_view_host.cc
index 6a6b512..00b29ac 100644
--- a/content/browser/renderer_host/test_render_view_host.cc
+++ b/content/browser/renderer_host/test_render_view_host.cc
@@ -51,7 +51,7 @@ TestRenderViewHost::TestRenderViewHost(SiteInstance* instance,
// For normal RenderViewHosts, this is freed when |Shutdown()| is called.
// For TestRenderViewHost, the view is explicitly deleted in the destructor
// below, because TestRenderWidgetHostView::Destroy() doesn't |delete this|.
- set_view(new TestRenderWidgetHostView(this));
+ SetView(new TestRenderWidgetHostView(this));
}
TestRenderViewHost::~TestRenderViewHost() {
diff --git a/content/browser/tab_contents/interstitial_page.cc b/content/browser/tab_contents/interstitial_page.cc
index 85edfb9..07c661b 100644
--- a/content/browser/tab_contents/interstitial_page.cc
+++ b/content/browser/tab_contents/interstitial_page.cc
@@ -426,7 +426,7 @@ TabContentsView* InterstitialPage::CreateTabContentsView() {
TabContentsView* tab_contents_view = tab()->view();
RenderWidgetHostView* view =
tab_contents_view->CreateViewForWidget(render_view_host_);
- render_view_host_->set_view(view);
+ render_view_host_->SetView(view);
render_view_host_->AllowBindings(BindingsPolicy::DOM_AUTOMATION);
render_view_host_->CreateRenderView(string16());
diff --git a/content/browser/tab_contents/render_view_host_manager.cc b/content/browser/tab_contents/render_view_host_manager.cc
index 48133e4..1a49d4d 100644
--- a/content/browser/tab_contents/render_view_host_manager.cc
+++ b/content/browser/tab_contents/render_view_host_manager.cc
@@ -814,7 +814,7 @@ void RenderViewHostManager::SwapInRenderViewHost(RenderViewHost* rvh) {
// Remove old RenderWidgetHostView with mocked out methods so it can be
// replaced with a new one that's a child of |delegate_|'s view.
scoped_ptr<RenderWidgetHostView> old_view(render_view_host_->view());
- render_view_host_->set_view(NULL);
+ render_view_host_->SetView(NULL);
delegate_->CreateViewAndSetSizeForRVH(render_view_host_);
render_view_host_->ActivateDeferredPluginHandles();
// If the view is gone, then this RenderViewHost died while it was hidden.