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

Unified Diff: content/browser/renderer_host/render_widget_helper.cc

Issue 9980016: Delete background tab IOSurfaces on Mac. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed auto-resize and fullscreen toggle Created 8 years, 8 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/browser/renderer_host/render_widget_helper.cc
diff --git a/content/browser/renderer_host/render_widget_helper.cc b/content/browser/renderer_host/render_widget_helper.cc
index 86395659010b08f94a70615f238ce6fe4bb60f9b..2290b4ea362f67c09b08bde8229bc6b18965d24f 100644
--- a/content/browser/renderer_host/render_widget_helper.cc
+++ b/content/browser/renderer_host/render_widget_helper.cc
@@ -7,24 +7,40 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/eintr_wrapper.h"
+#include "base/lazy_instance.h"
#include "base/threading/thread.h"
#include "content/browser/gpu/gpu_surface_tracker.h"
#include "content/browser/renderer_host/render_process_host_impl.h"
#include "content/browser/renderer_host/render_view_host_impl.h"
#include "content/browser/renderer_host/resource_dispatcher_host_impl.h"
#include "content/common/view_messages.h"
-#include "content/public/browser/browser_thread.h"
using content::BrowserThread;
using content::RenderViewHostImpl;
using content::ResourceDispatcherHostImpl;
-// A helper used with DidReceiveUpdateMsg that we hold a pointer to in
+namespace {
+
+typedef std::map<int, RenderWidgetHelper*> WidgetHelperMap;
+base::LazyInstance<WidgetHelperMap> g_widget_helpers =
+ LAZY_INSTANCE_INITIALIZER;
+
+void AddWidgetHelper(int render_process_id,
+ const scoped_refptr<RenderWidgetHelper>& widget_helper) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ // We don't care if RenderWidgetHelpers overwrite an existing process_id. Just
+ // want this to be up to date.
+ g_widget_helpers.Get()[render_process_id] = widget_helper.get();
+}
+
+} // namespace
+
+// A helper used with DidReceiveBackingStoreMsg that we hold a pointer to in
// pending_paints_.
-class RenderWidgetHelper::UpdateMsgProxy {
+class RenderWidgetHelper::BackingStoreMsgProxy {
public:
- UpdateMsgProxy(RenderWidgetHelper* h, const IPC::Message& m);
- ~UpdateMsgProxy();
+ BackingStoreMsgProxy(RenderWidgetHelper* h, const IPC::Message& m);
+ ~BackingStoreMsgProxy();
void Run();
void Cancel() { cancelled_ = true; }
@@ -35,26 +51,26 @@ class RenderWidgetHelper::UpdateMsgProxy {
IPC::Message message_;
bool cancelled_; // If true, then the message will not be dispatched.
- DISALLOW_COPY_AND_ASSIGN(UpdateMsgProxy);
+ DISALLOW_COPY_AND_ASSIGN(BackingStoreMsgProxy);
};
-RenderWidgetHelper::UpdateMsgProxy::UpdateMsgProxy(
+RenderWidgetHelper::BackingStoreMsgProxy::BackingStoreMsgProxy(
RenderWidgetHelper* h, const IPC::Message& m)
: helper_(h),
message_(m),
cancelled_(false) {
}
-RenderWidgetHelper::UpdateMsgProxy::~UpdateMsgProxy() {
+RenderWidgetHelper::BackingStoreMsgProxy::~BackingStoreMsgProxy() {
// If the paint message was never dispatched, then we need to let the
// helper know that we are going away.
if (!cancelled_ && helper_)
- helper_->OnDiscardUpdateMsg(this);
+ helper_->OnDiscardBackingStoreMsg(this);
}
-void RenderWidgetHelper::UpdateMsgProxy::Run() {
+void RenderWidgetHelper::BackingStoreMsgProxy::Run() {
if (!cancelled_) {
- helper_->OnDispatchUpdateMsg(this);
+ helper_->OnDispatchBackingStoreMsg(this);
helper_ = NULL;
}
}
@@ -70,6 +86,9 @@ RenderWidgetHelper::RenderWidgetHelper()
}
RenderWidgetHelper::~RenderWidgetHelper() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ g_widget_helpers.Get().erase(render_process_id_);
+
// The elements of pending_paints_ each hold an owning reference back to this
// object, so we should not be destroyed unless pending_paints_ is empty!
DCHECK(pending_paints_.empty());
@@ -84,12 +103,26 @@ void RenderWidgetHelper::Init(
ResourceDispatcherHostImpl* resource_dispatcher_host) {
render_process_id_ = render_process_id;
resource_dispatcher_host_ = resource_dispatcher_host;
+
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(&AddWidgetHelper,
+ render_process_id_, make_scoped_refptr(this)));
}
int RenderWidgetHelper::GetNextRoutingID() {
return next_routing_id_.GetNext() + 1;
}
+// static
+RenderWidgetHelper* RenderWidgetHelper::FromProcessHostID(
+ int render_process_host_id) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ WidgetHelperMap::const_iterator ci = g_widget_helpers.Get().find(
+ render_process_host_id);
+ return (ci == g_widget_helpers.Get().end())? NULL : ci->second;
+}
+
void RenderWidgetHelper::CancelResourceRequests(int render_widget_id) {
if (render_process_id_ == -1)
return;
@@ -110,19 +143,21 @@ void RenderWidgetHelper::SimulateSwapOutACK(
params));
}
-bool RenderWidgetHelper::WaitForUpdateMsg(int render_widget_id,
- const base::TimeDelta& max_delay,
- IPC::Message* msg) {
+bool RenderWidgetHelper::WaitForBackingStoreMsg(
+ int render_widget_id,
+ const base::TimeDelta& max_delay,
+ IPC::Message* msg) {
base::TimeTicks time_start = base::TimeTicks::Now();
for (;;) {
- UpdateMsgProxy* proxy = NULL;
+ BackingStoreMsgProxy* proxy = NULL;
{
base::AutoLock lock(pending_paints_lock_);
- UpdateMsgProxyMap::iterator it = pending_paints_.find(render_widget_id);
+ BackingStoreMsgProxyMap::iterator it =
+ pending_paints_.find(render_widget_id);
if (it != pending_paints_.end()) {
- UpdateMsgProxyQueue &queue = it->second;
+ BackingStoreMsgProxyQueue &queue = it->second;
DCHECK(!queue.empty());
proxy = queue.front();
@@ -154,10 +189,10 @@ bool RenderWidgetHelper::WaitForUpdateMsg(int render_widget_id,
return false;
}
-void RenderWidgetHelper::DidReceiveUpdateMsg(const IPC::Message& msg) {
+void RenderWidgetHelper::DidReceiveBackingStoreMsg(const IPC::Message& msg) {
int render_widget_id = msg.routing_id();
- UpdateMsgProxy* proxy = new UpdateMsgProxy(this, msg);
+ BackingStoreMsgProxy* proxy = new BackingStoreMsgProxy(this, msg);
{
base::AutoLock lock(pending_paints_lock_);
@@ -170,19 +205,20 @@ void RenderWidgetHelper::DidReceiveUpdateMsg(const IPC::Message& msg) {
event_.Signal();
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
- base::Bind(&UpdateMsgProxy::Run, base::Owned(proxy)));
+ base::Bind(&BackingStoreMsgProxy::Run, base::Owned(proxy)));
}
-void RenderWidgetHelper::OnDiscardUpdateMsg(UpdateMsgProxy* proxy) {
+void RenderWidgetHelper::OnDiscardBackingStoreMsg(BackingStoreMsgProxy* proxy) {
const IPC::Message& msg = proxy->message();
// Remove the proxy from the map now that we are going to handle it normally.
{
base::AutoLock lock(pending_paints_lock_);
- UpdateMsgProxyMap::iterator it = pending_paints_.find(msg.routing_id());
+ BackingStoreMsgProxyMap::iterator it =
+ pending_paints_.find(msg.routing_id());
DCHECK(it != pending_paints_.end());
- UpdateMsgProxyQueue &queue = it->second;
+ BackingStoreMsgProxyQueue &queue = it->second;
DCHECK(queue.front() == proxy);
queue.pop_front();
@@ -191,8 +227,9 @@ void RenderWidgetHelper::OnDiscardUpdateMsg(UpdateMsgProxy* proxy) {
}
}
-void RenderWidgetHelper::OnDispatchUpdateMsg(UpdateMsgProxy* proxy) {
- OnDiscardUpdateMsg(proxy);
+void RenderWidgetHelper::OnDispatchBackingStoreMsg(
+ BackingStoreMsgProxy* proxy) {
+ OnDiscardBackingStoreMsg(proxy);
// It is reasonable for the host to no longer exist.
content::RenderProcessHost* host =
« no previous file with comments | « content/browser/renderer_host/render_widget_helper.h ('k') | content/browser/renderer_host/render_widget_host_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698