diff options
author | nasko@chromium.org <nasko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-21 20:23:37 +0000 |
---|---|---|
committer | nasko@chromium.org <nasko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-21 20:23:37 +0000 |
commit | 039b84a4289dc5e816ed645c127129a97c060c9a (patch) | |
tree | bb8ed286bf70521ec6fafeb8d5252e92219be49e /content/browser | |
parent | 477e5843d5bac53f7ea89fa2f7ee694378825739 (diff) | |
download | chromium_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')
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())); } } |