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 = |