summaryrefslogtreecommitdiffstats
path: root/content/browser
diff options
context:
space:
mode:
authornasko@chromium.org <nasko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-21 20:23:37 +0000
committernasko@chromium.org <nasko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-21 20:23:37 +0000
commit039b84a4289dc5e816ed645c127129a97c060c9a (patch)
treebb8ed286bf70521ec6fafeb8d5252e92219be49e /content/browser
parent477e5843d5bac53f7ea89fa2f7ee694378825739 (diff)
downloadchromium_src-039b84a4289dc5e816ed645c127129a97c060c9a.zip
chromium_src-039b84a4289dc5e816ed645c127129a97c060c9a.tar.gz
chromium_src-039b84a4289dc5e816ed645c127129a97c060c9a.tar.bz2
Refactor RenderProcessHost to use IPC::Listener instead of RenderWidgetHost
BUG=248160 Review URL: https://chromiumcodereview.appspot.com/16431010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@207913 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser')
-rw-r--r--content/browser/accessibility/accessibility_ui.cc24
-rw-r--r--content/browser/accessibility/browser_accessibility_state_impl.cc23
-rw-r--r--content/browser/devtools/render_view_devtools_agent_host.cc45
-rw-r--r--content/browser/gpu/gpu_process_host.cc6
-rw-r--r--content/browser/gpu/gpu_process_host_ui_shim.cc13
-rw-r--r--content/browser/renderer_host/media/web_contents_video_capture_device.cc4
-rw-r--r--content/browser/renderer_host/render_process_host_impl.cc120
-rw-r--r--content/browser/renderer_host/render_process_host_impl.h16
-rw-r--r--content/browser/renderer_host/render_view_host_impl.cc15
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.cc50
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.h3
-rw-r--r--content/browser/worker_host/worker_service_impl.cc29
12 files changed, 162 insertions, 186 deletions
diff --git a/content/browser/accessibility/accessibility_ui.cc b/content/browser/accessibility/accessibility_ui.cc
index f4044b6..585be68 100644
--- a/content/browser/accessibility/accessibility_ui.cc
+++ b/content/browser/accessibility/accessibility_ui.cc
@@ -91,28 +91,16 @@ void SendTargetsData(
const WebUIDataSource::GotDataCallback& callback) {
scoped_ptr<base::ListValue> rvh_list(new base::ListValue());
- for (RenderProcessHost::iterator it(RenderProcessHost::AllHostsIterator());
- !it.IsAtEnd(); it.Advance()) {
- RenderProcessHost* render_process_host = it.GetCurrentValue();
- DCHECK(render_process_host);
-
+ RenderWidgetHost::List widgets = RenderWidgetHost::GetRenderWidgetHosts();
+ for (size_t i = 0; i < widgets.size(); ++i) {
// Ignore processes that don't have a connection, such as crashed tabs.
- if (!render_process_host->HasConnection())
+ if (!widgets[i]->GetProcess()->HasConnection())
continue;
-
- RenderProcessHost::RenderWidgetHostsIterator rwh_it(
- render_process_host->GetRenderWidgetHostsIterator());
- for (; !rwh_it.IsAtEnd(); rwh_it.Advance()) {
- const RenderWidgetHost* rwh = rwh_it.GetCurrentValue();
- DCHECK(rwh);
- if (!rwh || !rwh->IsRenderView())
+ if (!widgets[i]->IsRenderView())
continue;
- RenderViewHost* rvh =
- RenderViewHost::From(const_cast<RenderWidgetHost*>(rwh));
-
- rvh_list->Append(BuildTargetDescriptor(rvh));
- }
+ RenderViewHost* rvh = RenderViewHost::From(widgets[i]);
+ rvh_list->Append(BuildTargetDescriptor(rvh));
}
scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue());
diff --git a/content/browser/accessibility/browser_accessibility_state_impl.cc b/content/browser/accessibility/browser_accessibility_state_impl.cc
index 92bc94e..d2f081a 100644
--- a/content/browser/accessibility/browser_accessibility_state_impl.cc
+++ b/content/browser/accessibility/browser_accessibility_state_impl.cc
@@ -128,27 +128,16 @@ void BrowserAccessibilityStateImpl::SetAccessibilityMode(
if (accessibility_mode_ == mode)
return;
accessibility_mode_ = mode;
- for (RenderProcessHost::iterator it(RenderProcessHost::AllHostsIterator());
- !it.IsAtEnd(); it.Advance()) {
- RenderProcessHost* render_process_host = it.GetCurrentValue();
- DCHECK(render_process_host);
+ RenderWidgetHost::List widgets = RenderWidgetHost::GetRenderWidgetHosts();
+ for (size_t i = 0; i < widgets.size(); ++i) {
// Ignore processes that don't have a connection, such as crashed tabs.
- if (!render_process_host->HasConnection())
+ if (!widgets[i]->GetProcess()->HasConnection())
+ continue;
+ if (!widgets[i]->IsRenderView())
continue;
- for (RenderProcessHost::RenderWidgetHostsIterator rwit(
- render_process_host->GetRenderWidgetHostsIterator());
- !rwit.IsAtEnd();
- rwit.Advance()) {
- RenderWidgetHost* rwh = const_cast<RenderWidgetHost*>(
- rwit.GetCurrentValue());
- DCHECK(rwh);
- if (!rwh || !rwh->IsRenderView())
- continue;
- RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(rwh);
- rwhi->SetAccessibilityMode(mode);
- }
+ RenderWidgetHostImpl::From(widgets[i])->SetAccessibilityMode(mode);
}
}
diff --git a/content/browser/devtools/render_view_devtools_agent_host.cc b/content/browser/devtools/render_view_devtools_agent_host.cc
index 39698d3..51cee3c 100644
--- a/content/browser/devtools/render_view_devtools_agent_host.cc
+++ b/content/browser/devtools/render_view_devtools_agent_host.cc
@@ -120,37 +120,26 @@ void DevToolsAgentHost::ConnectRenderViewHost(const std::string& cookie,
//static
std::vector<RenderViewHost*> DevToolsAgentHost::GetValidRenderViewHosts() {
std::vector<RenderViewHost*> result;
- for (RenderProcessHost::iterator it(RenderProcessHost::AllHostsIterator());
- !it.IsAtEnd(); it.Advance()) {
- RenderProcessHost* render_process_host = it.GetCurrentValue();
- DCHECK(render_process_host);
-
+ RenderWidgetHost::List widgets = RenderWidgetHost::GetRenderWidgetHosts();
+ for (size_t i = 0; i < widgets.size(); ++i) {
// Ignore processes that don't have a connection, such as crashed contents.
- if (!render_process_host->HasConnection())
+ if (!widgets[i]->GetProcess()->HasConnection())
+ continue;
+ if (!widgets[i]->IsRenderView())
continue;
- RenderProcessHost::RenderWidgetHostsIterator rwit(
- render_process_host->GetRenderWidgetHostsIterator());
- for (; !rwit.IsAtEnd(); rwit.Advance()) {
- const RenderWidgetHost* widget = rwit.GetCurrentValue();
- DCHECK(widget);
- if (!widget || !widget->IsRenderView())
- continue;
-
- RenderViewHost* rvh =
- RenderViewHost::From(const_cast<RenderWidgetHost*>(widget));
- // Don't report swapped out views.
- if (static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out())
- continue;
-
- WebContents* web_contents = WebContents::FromRenderViewHost(rvh);
- // Don't report a RenderViewHost if it is not the current RenderViewHost
- // for some WebContents.
- if (!web_contents || rvh != web_contents->GetRenderViewHost())
- continue;
-
- result.push_back(rvh);
- }
+ RenderViewHost* rvh = RenderViewHost::From(widgets[i]);
+ // Don't report swapped out views.
+ if (static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out())
+ continue;
+
+ WebContents* web_contents = WebContents::FromRenderViewHost(rvh);
+ // Don't report a RenderViewHost if it is not the current RenderViewHost
+ // for some WebContents.
+ if (!web_contents || rvh != web_contents->GetRenderViewHost())
+ continue;
+
+ result.push_back(rvh);
}
return result;
}
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc
index 3952542..0f7a214 100644
--- a/content/browser/gpu/gpu_process_host.cc
+++ b/content/browser/gpu/gpu_process_host.cc
@@ -133,10 +133,8 @@ void AcceleratedSurfaceBuffersSwappedCompletedForRenderer(
RenderWidgetHostImpl::CompositorFrameDrawn(latency_info);
return;
}
- RenderProcessHost* host = RenderProcessHost::FromID(render_process_id);
- if (!host)
- return;
- RenderWidgetHost* rwh = host->GetRenderWidgetHostByID(render_widget_id);
+ RenderWidgetHost* rwh =
+ RenderWidgetHost::FromID(render_process_id, render_widget_id);
if (!rwh)
return;
RenderWidgetHostImpl::From(rwh)->AcknowledgeSwapBuffersToRenderer();
diff --git a/content/browser/gpu/gpu_process_host_ui_shim.cc b/content/browser/gpu/gpu_process_host_ui_shim.cc
index 6d822b4..8732e30 100644
--- a/content/browser/gpu/gpu_process_host_ui_shim.cc
+++ b/content/browser/gpu/gpu_process_host_ui_shim.cc
@@ -90,11 +90,8 @@ RenderWidgetHostViewPort* GetRenderWidgetHostViewFromSurfaceID(
surface_id, &render_process_id, &render_widget_id))
return NULL;
- RenderProcessHost* process = RenderProcessHost::FromID(render_process_id);
- if (!process)
- return NULL;
-
- RenderWidgetHost* host = process->GetRenderWidgetHostByID(render_widget_id);
+ RenderWidgetHost* host =
+ RenderWidgetHost::FromID(render_process_id, render_widget_id);
return host ? RenderWidgetHostViewPort::FromRWHV(host->GetView()) : NULL;
}
@@ -231,10 +228,8 @@ void GpuProcessHostUIShim::OnUpdateVSyncParameters(int surface_id,
surface_id, &render_process_id, &render_widget_id)) {
return;
}
- RenderProcessHost* host = RenderProcessHost::FromID(render_process_id);
- if (!host)
- return;
- RenderWidgetHost* rwh = host->GetRenderWidgetHostByID(render_widget_id);
+ RenderWidgetHost* rwh =
+ RenderWidgetHost::FromID(render_process_id, render_widget_id);
if (!rwh)
return;
RenderWidgetHostImpl::From(rwh)->UpdateVSyncParameters(timebase, interval);
diff --git a/content/browser/renderer_host/media/web_contents_video_capture_device.cc b/content/browser/renderer_host/media/web_contents_video_capture_device.cc
index f3e6e24..42868c0 100644
--- a/content/browser/renderer_host/media/web_contents_video_capture_device.cc
+++ b/content/browser/renderer_host/media/web_contents_video_capture_device.cc
@@ -873,8 +873,8 @@ RenderWidgetHost* CaptureMachine::GetTarget() {
RenderWidgetHost* rwh = NULL;
if (fullscreen_widget_id_ != MSG_ROUTING_NONE) {
RenderProcessHost* process = web_contents()->GetRenderProcessHost();
- rwh = process ? process->GetRenderWidgetHostByID(fullscreen_widget_id_)
- : NULL;
+ if (process)
+ rwh = RenderWidgetHost::FromID(process->GetID(), fullscreen_widget_id_);
} else {
rwh = web_contents()->GetRenderViewHost();
}
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index e57b93a..7773a25 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -105,6 +105,7 @@
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_types.h"
#include "content/public/browser/render_process_host_factory.h"
+#include "content/public/browser/render_widget_host.h"
#include "content/public/browser/resource_context.h"
#include "content/public/browser/user_metrics.h"
#include "content/public/common/content_constants.h"
@@ -708,11 +709,40 @@ int RenderProcessHostImpl::GetNextRoutingID() {
return widget_helper_->GetNextRoutingID();
}
+
void RenderProcessHostImpl::ResumeDeferredNavigation(
const GlobalRequestID& request_id) {
widget_helper_->ResumeDeferredNavigation(request_id);
}
+void RenderProcessHostImpl::AddRoute(
+ int32 routing_id,
+ IPC::Listener* listener) {
+ listeners_.AddWithID(listener, routing_id);
+}
+
+void RenderProcessHostImpl::RemoveRoute(int32 routing_id) {
+ DCHECK(listeners_.Lookup(routing_id) != NULL);
+ listeners_.Remove(routing_id);
+
+#if defined(OS_WIN)
+ // Dump the handle table if handle auditing is enabled.
+ const CommandLine& browser_command_line =
+ *CommandLine::ForCurrentProcess();
+ if (browser_command_line.HasSwitch(switches::kAuditHandles) ||
+ browser_command_line.HasSwitch(switches::kAuditAllHandles)) {
+ DumpHandles();
+
+ // We wait to close the channels until the child process has finished
+ // dumping handles and sends us ChildProcessHostMsg_DumpHandlesDone.
+ return;
+ }
+#endif
+ // Keep the one renderer thread around forever in single process mode.
+ if (!run_renderer_in_process())
+ Cleanup();
+}
+
bool RenderProcessHostImpl::WaitForBackingStoreMsg(
int render_widget_id,
const base::TimeDelta& max_delay,
@@ -1186,9 +1216,9 @@ bool RenderProcessHostImpl::OnMessageReceived(const IPC::Message& msg) {
return true;
}
- // Dispatch incoming messages to the appropriate RenderView/WidgetHost.
- RenderWidgetHost* rwh = render_widget_hosts_.Lookup(msg.routing_id());
- if (!rwh) {
+ // Dispatch incoming messages to the appropriate IPC::Listener.
+ IPC::Listener* listener = listeners_.Lookup(msg.routing_id());
+ if (!listener) {
if (msg.is_sync()) {
// The listener has gone away, so we must respond or else the caller will
// hang waiting for a reply.
@@ -1206,7 +1236,7 @@ bool RenderProcessHostImpl::OnMessageReceived(const IPC::Message& msg) {
IPC_END_MESSAGE_MAP_EX()
return true;
}
- return RenderWidgetHostImpl::From(rwh)->OnMessageReceived(msg);
+ return listener->OnMessageReceived(msg);
}
void RenderProcessHostImpl::OnChannelConnected(int32 peer_pid) {
@@ -1241,11 +1271,6 @@ bool RenderProcessHostImpl::HasConnection() const {
return channel_.get() != NULL;
}
-RenderWidgetHost* RenderProcessHostImpl::GetRenderWidgetHostByID(
- int routing_id) {
- return render_widget_hosts_.Lookup(routing_id);
-}
-
void RenderProcessHostImpl::SetIgnoreInputEvents(bool ignore_input_events) {
ignore_input_events_ = ignore_input_events;
}
@@ -1254,36 +1279,9 @@ bool RenderProcessHostImpl::IgnoreInputEvents() const {
return ignore_input_events_;
}
-void RenderProcessHostImpl::Attach(RenderWidgetHost* host,
- int routing_id) {
- render_widget_hosts_.AddWithID(host, routing_id);
-}
-
-void RenderProcessHostImpl::Release(int routing_id) {
- DCHECK(render_widget_hosts_.Lookup(routing_id) != NULL);
- render_widget_hosts_.Remove(routing_id);
-
-#if defined(OS_WIN)
- // Dump the handle table if handle auditing is enabled.
- const CommandLine& browser_command_line =
- *CommandLine::ForCurrentProcess();
- if (browser_command_line.HasSwitch(switches::kAuditHandles) ||
- browser_command_line.HasSwitch(switches::kAuditAllHandles)) {
- DumpHandles();
-
- // We wait to close the channels until the child process has finished
- // dumping handles and sends us ChildProcessHostMsg_DumpHandlesDone.
- return;
- }
-#endif
- // Keep the one renderer thread around forever in single process mode.
- if (!run_renderer_in_process())
- Cleanup();
-}
-
void RenderProcessHostImpl::Cleanup() {
// When no other owners of this object, we can delete ourselves
- if (render_widget_hosts_.IsEmpty()) {
+ if (listeners_.IsEmpty()) {
DCHECK_EQ(0, pending_views_);
NotificationService::current()->Notify(
NOTIFICATION_RENDERER_PROCESS_TERMINATED,
@@ -1344,13 +1342,8 @@ IPC::ChannelProxy* RenderProcessHostImpl::GetChannel() {
return channel_.get();
}
-RenderProcessHost::RenderWidgetHostsIterator
- RenderProcessHostImpl::GetRenderWidgetHostsIterator() {
- return RenderWidgetHostsIterator(&render_widget_hosts_);
-}
-
bool RenderProcessHostImpl::FastShutdownForPageCount(size_t count) {
- if (render_widget_hosts_.size() == count)
+ if (static_cast<size_t>(GetActiveViewCount()) == count)
return FastShutdownIfPossible();
return false;
}
@@ -1605,13 +1598,14 @@ void RenderProcessHostImpl::ProcessDied(bool already_dead) {
channel_.reset();
gpu_message_filter_ = NULL;
- IDMap<RenderWidgetHost>::iterator iter(&render_widget_hosts_);
- while (!iter.IsAtEnd()) {
- RenderWidgetHostImpl::From(iter.GetCurrentValue())->OnMessageReceived(
- ViewHostMsg_RenderViewGone(iter.GetCurrentKey(),
+ RenderWidgetHost::List widgets = RenderWidgetHost::GetRenderWidgetHosts();
+ for (size_t i = 0; i < widgets.size(); ++i) {
+ if (widgets[i]->GetProcess()->GetID() != GetID())
+ continue;
+ RenderWidgetHostImpl::From(widgets[i])->OnMessageReceived(
+ ViewHostMsg_RenderViewGone(widgets[i]->GetRoutingID(),
static_cast<int>(status),
exit_code));
- iter.Advance();
}
ClearTransportDIBCache();
@@ -1622,23 +1616,20 @@ void RenderProcessHostImpl::ProcessDied(bool already_dead) {
int RenderProcessHostImpl::GetActiveViewCount() {
int num_active_views = 0;
- for (RenderWidgetHostsIterator iter = GetRenderWidgetHostsIterator();
- !iter.IsAtEnd();
- iter.Advance()) {
- const RenderWidgetHost* widget = iter.GetCurrentValue();
- DCHECK(widget);
- if (!widget)
+ RenderWidgetHost::List widgets = RenderWidgetHost::GetRenderWidgetHosts();
+ for (size_t i = 0; i < widgets.size(); ++i) {
+ // Count only RenderWidgetHosts in this process.
+ if (widgets[i]->GetProcess()->GetID() != GetID())
continue;
// All RenderWidgetHosts are swapped in.
- if (!widget->IsRenderView()) {
+ if (!widgets[i]->IsRenderView()) {
num_active_views++;
continue;
}
// Don't count swapped out views.
- RenderViewHost* rvh =
- RenderViewHost::From(const_cast<RenderWidgetHost*>(widget));
+ RenderViewHost* rvh = RenderViewHost::From(widgets[i]);
if (!static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out())
num_active_views++;
}
@@ -1771,17 +1762,16 @@ void RenderProcessHostImpl::OnCompositorSurfaceBuffersSwappedNoHost(
}
void RenderProcessHostImpl::OnGpuSwitching() {
- for (RenderWidgetHostsIterator iter = GetRenderWidgetHostsIterator();
- !iter.IsAtEnd();
- iter.Advance()) {
- const RenderWidgetHost* widget = iter.GetCurrentValue();
- DCHECK(widget);
- if (!widget || !widget->IsRenderView())
+ RenderWidgetHost::List widgets = RenderWidgetHost::GetRenderWidgetHosts();
+ for (size_t i = 0; i < widgets.size(); ++i) {
+ if (!widgets[i]->IsRenderView())
continue;
- RenderViewHost* rvh =
- RenderViewHost::From(const_cast<RenderWidgetHost*>(widget));
+ // Skip widgets in other processes.
+ if (widgets[i]->GetProcess()->GetID() != GetID())
+ continue;
+ RenderViewHost* rvh = RenderViewHost::From(widgets[i]);
rvh->UpdateWebkitPreferences(rvh->GetWebkitPreferences());
}
}
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index 4669fc3..34f6c2f 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -76,6 +76,8 @@ class CONTENT_EXPORT RenderProcessHostImpl
virtual void EnableSendQueue() OVERRIDE;
virtual bool Init() OVERRIDE;
virtual int GetNextRoutingID() OVERRIDE;
+ virtual void AddRoute(int32 routing_id, IPC::Listener* listener) OVERRIDE;
+ virtual void RemoveRoute(int32 routing_id) OVERRIDE;
virtual bool WaitForBackingStoreMsg(int render_widget_id,
const base::TimeDelta& max_delay,
IPC::Message* msg) OVERRIDE;
@@ -95,20 +97,14 @@ class CONTENT_EXPORT RenderProcessHostImpl
StoragePartition* partition) const OVERRIDE;
virtual int GetID() const OVERRIDE;
virtual bool HasConnection() const OVERRIDE;
- virtual RenderWidgetHost* GetRenderWidgetHostByID(int routing_id)
- OVERRIDE;
virtual void SetIgnoreInputEvents(bool ignore_input_events) OVERRIDE;
virtual bool IgnoreInputEvents() const OVERRIDE;
- virtual void Attach(RenderWidgetHost* host, int routing_id)
- OVERRIDE;
- virtual void Release(int routing_id) OVERRIDE;
virtual void Cleanup() OVERRIDE;
virtual void AddPendingView() OVERRIDE;
virtual void RemovePendingView() OVERRIDE;
virtual void SetSuddenTerminationAllowed(bool enabled) OVERRIDE;
virtual bool SuddenTerminationAllowed() const OVERRIDE;
virtual IPC::ChannelProxy* GetChannel() OVERRIDE;
- virtual RenderWidgetHostsIterator GetRenderWidgetHostsIterator() OVERRIDE;
virtual bool FastShutdownForPageCount(size_t count) OVERRIDE;
virtual bool FastShutdownStarted() const OVERRIDE;
virtual base::TimeDelta GetChildProcessIdleTime() const OVERRIDE;
@@ -185,10 +181,6 @@ class CONTENT_EXPORT RenderProcessHostImpl
// browser_process.h)
scoped_ptr<IPC::ChannelProxy> channel_;
- // The registered render widget hosts. When this list is empty or all NULL,
- // we should delete ourselves
- IDMap<RenderWidgetHost> render_widget_hosts_;
-
// True if fast shutdown has been performed on this RPH.
bool fast_shutdown_started_;
@@ -235,6 +227,10 @@ class CONTENT_EXPORT RenderProcessHostImpl
virtual void OnGpuSwitching() OVERRIDE;
+ // The registered IPC listener objects. When this list is empty, we should
+ // delete ourselves.
+ IDMap<IPC::Listener> listeners_;
+
// The count of currently visible widgets. Since the host can be a container
// for multiple widgets, it uses this count to determine when it should be
// backgrounded.
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index 2adf7a1..4c5456b 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -118,10 +118,8 @@ g_created_callbacks = LAZY_INSTANCE_INITIALIZER;
// static
RenderViewHost* RenderViewHost::FromID(int render_process_id,
int render_view_id) {
- RenderProcessHost* process = RenderProcessHost::FromID(render_process_id);
- if (!process)
- return NULL;
- RenderWidgetHost* widget = process->GetRenderWidgetHostByID(render_view_id);
+ RenderWidgetHost* widget =
+ RenderWidgetHost::FromID(render_process_id, render_view_id);
if (!widget || !widget->IsRenderView())
return NULL;
return static_cast<RenderViewHostImpl*>(RenderWidgetHostImpl::From(widget));
@@ -480,10 +478,11 @@ void RenderViewHostImpl::WasSwappedOut() {
// Count the number of widget hosts for the process, which is equivalent to
// views using the process as of this writing.
- RenderProcessHost::RenderWidgetHostsIterator iter(
- GetProcess()->GetRenderWidgetHostsIterator());
- for (; !iter.IsAtEnd(); iter.Advance())
- ++views;
+ RenderWidgetHost::List widgets = RenderWidgetHost::GetRenderWidgetHosts();
+ for (size_t i = 0; i < widgets.size(); ++i) {
+ if (widgets[i]->GetProcess()->GetID() == GetProcess()->GetID())
+ ++views;
+ }
if (!RenderProcessHost::run_renderer_in_process() &&
process_handle && views <= 1) {
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index dae4864..f37ec19f 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -10,6 +10,7 @@
#include "base/auto_reset.h"
#include "base/bind.h"
#include "base/command_line.h"
+#include "base/containers/hash_tables.h"
#include "base/debug/trace_event.h"
#include "base/i18n/rtl.h"
#include "base/lazy_instance.h"
@@ -117,6 +118,12 @@ g_created_callbacks = LAZY_INSTANCE_INITIALIZER;
} // namespace
+typedef std::pair<int32, int32> RenderWidgetHostID;
+typedef base::hash_map<RenderWidgetHostID, RenderWidgetHostImpl*>
+ RoutingIDWidgetMap;
+static base::LazyInstance<RoutingIDWidgetMap> g_routing_id_widget_map =
+ LAZY_INSTANCE_INITIALIZER;
+
// static
void RenderWidgetHost::RemoveAllBackingStores() {
BackingStoreManager::RemoveAllBackingStores();
@@ -196,7 +203,9 @@ RenderWidgetHostImpl::RenderWidgetHostImpl(RenderWidgetHostDelegate* delegate,
is_threaded_compositing_enabled_ = IsThreadedCompositingEnabled();
- process_->Attach(this, routing_id_);
+ g_routing_id_widget_map.Get().insert(std::make_pair(
+ RenderWidgetHostID(process->GetID(), routing_id_), this));
+ process_->AddRoute(routing_id_, this);
// Because the widget initializes as is_hidden_ == false,
// tell the process host that we're alive.
process_->WidgetRestored();
@@ -223,13 +232,44 @@ RenderWidgetHostImpl::~RenderWidgetHostImpl() {
GpuSurfaceTracker::Get()->RemoveSurface(surface_id_);
surface_id_ = 0;
- process_->Release(routing_id_);
+ process_->RemoveRoute(routing_id_);
+ g_routing_id_widget_map.Get().erase(
+ RenderWidgetHostID(process_->GetID(), routing_id_));
if (delegate_)
delegate_->RenderWidgetDeleted(this);
}
// static
+RenderWidgetHost* RenderWidgetHost::FromID(
+ int32 process_id,
+ int32 routing_id) {
+ return RenderWidgetHostImpl::FromID(process_id, routing_id);
+}
+
+// static
+RenderWidgetHostImpl* RenderWidgetHostImpl::FromID(
+ int32 process_id,
+ int32 routing_id) {
+ RoutingIDWidgetMap* widgets = g_routing_id_widget_map.Pointer();
+ RoutingIDWidgetMap::iterator it = widgets->find(
+ RenderWidgetHostID(process_id, routing_id));
+ return it == widgets->end() ? NULL : it->second;
+}
+
+// static
+std::vector<RenderWidgetHost*> RenderWidgetHost::GetRenderWidgetHosts() {
+ std::vector<RenderWidgetHost*> hosts;
+ RoutingIDWidgetMap* widgets = g_routing_id_widget_map.Pointer();
+ for (RoutingIDWidgetMap::const_iterator it = widgets->begin();
+ it != widgets->end();
+ ++it) {
+ hosts.push_back(it->second);
+ }
+ return hosts;
+}
+
+// static
RenderWidgetHostImpl* RenderWidgetHostImpl::From(RenderWidgetHost* rwh) {
return rwh->AsRenderWidgetHostImpl();
}
@@ -2554,10 +2594,8 @@ void RenderWidgetHostImpl::CompositorFrameDrawn(
// Matches with GetLatencyComponentId
int routing_id = b->first.second & 0xffffffff;
int process_id = (b->first.second >> 32) & 0xffffffff;
- RenderProcessHost* host = RenderProcessHost::FromID(process_id);
- if (!host)
- continue;
- RenderWidgetHost* rwh = host->GetRenderWidgetHostByID(routing_id);
+ RenderWidgetHost* rwh =
+ RenderWidgetHost::FromID(process_id, routing_id);
if (!rwh)
continue;
RenderWidgetHostImpl::From(rwh)->FrameSwapped(latency_info);
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h
index b79eea6..997b47d 100644
--- a/content/browser/renderer_host/render_widget_host_impl.h
+++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -94,6 +94,9 @@ class CONTENT_EXPORT RenderWidgetHostImpl : virtual public RenderWidgetHost,
int routing_id);
virtual ~RenderWidgetHostImpl();
+ // Similar to RenderWidgetHost::FromID, but returning the Impl object.
+ static RenderWidgetHostImpl* FromID(int32 process_id, int32 routing_id);
+
// Use RenderWidgetHostImpl::From(rwh) to downcast a
// RenderWidgetHost to a RenderWidgetHostImpl. Internally, this
// uses RenderWidgetHost::AsRenderWidgetHostImpl().
diff --git a/content/browser/worker_host/worker_service_impl.cc b/content/browser/worker_host/worker_service_impl.cc
index d1eead2..5fb8e62 100644
--- a/content/browser/worker_host/worker_service_impl.cc
+++ b/content/browser/worker_host/worker_service_impl.cc
@@ -110,25 +110,16 @@ void WorkerPrioritySetter::GatherVisibleIDsAndUpdateWorkerPriorities() {
new std::set<std::pair<int, int> >();
// Gather up all the visible renderer process/view pairs
- for (RenderProcessHost::iterator it =
- RenderProcessHost::AllHostsIterator();
- !it.IsAtEnd(); it.Advance()) {
- RenderProcessHost* render_process_host = it.GetCurrentValue();
- if (render_process_host->VisibleWidgetCount()) {
- for (RenderProcessHost::RenderWidgetHostsIterator rit =
- render_process_host->GetRenderWidgetHostsIterator(); !rit.IsAtEnd();
- rit.Advance()) {
- RenderWidgetHost* render_widget =
- render_process_host->GetRenderWidgetHostByID(rit.GetCurrentKey());
- if (render_widget) {
- RenderWidgetHostView* render_view = render_widget->GetView();
- if (render_view && render_view->IsShowing()) {
- visible_renderer_ids->insert(
- std::pair<int, int>(render_process_host->GetID(),
- render_widget->GetRoutingID()));
- }
- }
- }
+ RenderWidgetHost::List widgets = RenderWidgetHost::GetRenderWidgetHosts();
+ for (size_t i = 0; i < widgets.size(); ++i) {
+ if (widgets[i]->GetProcess()->VisibleWidgetCount() == 0)
+ continue;
+
+ RenderWidgetHostView* render_view = widgets[i]->GetView();
+ if (render_view && render_view->IsShowing()) {
+ visible_renderer_ids->insert(
+ std::pair<int, int>(widgets[i]->GetProcess()->GetID(),
+ widgets[i]->GetRoutingID()));
}
}