diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-12 01:55:13 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-12 01:55:13 +0000 |
commit | 4566f13fe843c0821dbce19d7ea5e8aece8afe4a (patch) | |
tree | 586c6006431604f6b159daca30fcdfe4913ad996 /chrome/browser/renderer_host | |
parent | 3f366001f70b1ef4b8884796970cefb0769c469f (diff) | |
download | chromium_src-4566f13fe843c0821dbce19d7ea5e8aece8afe4a.zip chromium_src-4566f13fe843c0821dbce19d7ea5e8aece8afe4a.tar.gz chromium_src-4566f13fe843c0821dbce19d7ea5e8aece8afe4a.tar.bz2 |
Stop having renderers use both pids and a monotonically increasing "host_id". This allows ResourceDispatcher to be used by child processes other than renderers. I've done minor related cleanup on the way to make the code simpler.
Review URL: http://codereview.chromium.org/42054
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@11509 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/renderer_host')
11 files changed, 109 insertions, 106 deletions
diff --git a/chrome/browser/renderer_host/async_resource_handler.cc b/chrome/browser/renderer_host/async_resource_handler.cc index 650c7c3..73aa227 100644 --- a/chrome/browser/renderer_host/async_resource_handler.cc +++ b/chrome/browser/renderer_host/async_resource_handler.cc @@ -35,15 +35,15 @@ class SharedIOBuffer : public net::IOBuffer { AsyncResourceHandler::AsyncResourceHandler( ResourceDispatcherHost::Receiver* receiver, - int render_process_host_id, + int process_id, int routing_id, - base::ProcessHandle render_process, + base::ProcessHandle process_handle, const GURL& url, ResourceDispatcherHost* resource_dispatcher_host) : receiver_(receiver), - render_process_host_id_(render_process_host_id), + process_id_(process_id), routing_id_(routing_id), - render_process_(render_process), + process_handle_(process_handle), rdh_(resource_dispatcher_host) { } @@ -91,18 +91,18 @@ bool AsyncResourceHandler::OnReadCompleted(int request_id, int* bytes_read) { return true; DCHECK(read_buffer_.get()); - if (!rdh_->WillSendData(render_process_host_id_, request_id)) { + if (!rdh_->WillSendData(process_id_, request_id)) { // We should not send this data now, we have too many pending requests. return true; } base::SharedMemoryHandle handle; - if (!read_buffer_->shared_memory()->GiveToProcess(render_process_, &handle)) { + if (!read_buffer_->shared_memory()->GiveToProcess(process_handle_, &handle)) { // We wrongfully incremented the pending data count. Fake an ACK message // to fix this. We can't move this call above the WillSendData because // it's killing our read_buffer_, and we don't want that when we pause // the request. - rdh_->OnDataReceivedACK(render_process_host_id_, request_id); + rdh_->OnDataReceivedACK(process_id_, request_id); // We just unmapped the memory. read_buffer_ = NULL; return false; diff --git a/chrome/browser/renderer_host/async_resource_handler.h b/chrome/browser/renderer_host/async_resource_handler.h index 7407e6d..cfb9fc5 100644 --- a/chrome/browser/renderer_host/async_resource_handler.h +++ b/chrome/browser/renderer_host/async_resource_handler.h @@ -18,9 +18,9 @@ class SharedIOBuffer; class AsyncResourceHandler : public ResourceHandler { public: AsyncResourceHandler(ResourceDispatcherHost::Receiver* receiver, - int render_process_host_id, + int process_id, int routing_id, - base::ProcessHandle render_process, + base::ProcessHandle process_handle, const GURL& url, ResourceDispatcherHost* resource_dispatcher_host); @@ -45,9 +45,9 @@ class AsyncResourceHandler : public ResourceHandler { scoped_refptr<SharedIOBuffer> read_buffer_; ResourceDispatcherHost::Receiver* receiver_; - int render_process_host_id_; + int process_id_; int routing_id_; - base::ProcessHandle render_process_; + base::ProcessHandle process_handle_; ResourceDispatcherHost* rdh_; DISALLOW_COPY_AND_ASSIGN(AsyncResourceHandler); diff --git a/chrome/browser/renderer_host/browser_render_process_host.cc b/chrome/browser/renderer_host/browser_render_process_host.cc index fd5ba33..a3171e3 100644 --- a/chrome/browser/renderer_host/browser_render_process_host.cc +++ b/chrome/browser/renderer_host/browser_render_process_host.cc @@ -128,12 +128,7 @@ BrowserRenderProcessHost::BrowserRenderProcessHost(Profile* profile) ALLOW_THIS_IN_INITIALIZER_LIST(cached_dibs_cleaner_( base::TimeDelta::FromSeconds(5), this, &BrowserRenderProcessHost::ClearTransportDIBCache)) { - DCHECK(host_id() >= 0); // We use a negative host_id_ in destruction. - widget_helper_ = new RenderWidgetHelper( - host_id(), g_browser_process->resource_dispatcher_host()); - - CacheManagerHost::GetInstance()->Add(host_id()); - RendererSecurityPolicy::GetInstance()->Add(host_id()); + widget_helper_ = new RenderWidgetHelper(); PrefService* prefs = profile->GetPrefs(); prefs->AddPrefObserver(prefs::kBlockPopups, this); @@ -151,9 +146,10 @@ BrowserRenderProcessHost::BrowserRenderProcessHost(Profile* profile) } BrowserRenderProcessHost::~BrowserRenderProcessHost() { - // Some tests hold BrowserRenderProcessHost in a scoped_ptr, so we must call - // Unregister here as well as in response to Release(). - Unregister(); + if (pid() >= 0) { + CacheManagerHost::GetInstance()->Remove(pid()); + RendererSecurityPolicy::GetInstance()->Remove(pid()); + } // We may have some unsent messages at this point, but that's OK. channel_.reset(); @@ -192,7 +188,6 @@ bool BrowserRenderProcessHost::Init() { audio_renderer_host_.get(), PluginService::GetInstance(), g_browser_process->print_job_manager(), - host_id(), profile(), widget_helper_, profile()->GetSpellChecker()); @@ -306,6 +301,7 @@ bool BrowserRenderProcessHost::Init() { cmd_line.AppendSwitchWithValue(switches::kUserDataDir, profile_path); + int process_id; bool run_in_process = run_renderer_in_process(); if (run_in_process) { // Crank up a thread and run the initialization there. With the way that @@ -323,6 +319,14 @@ bool BrowserRenderProcessHost::Init() { base::Thread::Options options; options.message_loop_type = MessageLoop::TYPE_IO; in_process_renderer_->StartWithOptions(options); + + // We need a "renderer pid", but we don't have one when there's no renderer + // process. So pick a value that won't clash with other child process pids. + // Linux has PID_MAX_LIMIT which is 2^22. Windows always uses pids that are + // divisible by 4. So... + static int next_pid = 4 * 1024 * 1024; + next_pid += 3; + process_id = next_pid; } else { #if defined(OS_WIN) if (in_sandbox) { @@ -405,8 +409,15 @@ bool BrowserRenderProcessHost::Init() { return false; process_.set_handle(process); } + + process_id = process_.pid(); } + SetProcessID(process_id); + resource_message_filter->Init(pid()); + CacheManagerHost::GetInstance()->Add(pid()); + RendererSecurityPolicy::GetInstance()->Add(pid()); + // Now that the process is created, set it's backgrounding accordingly. SetBackgrounded(backgrounded_); @@ -771,17 +782,6 @@ void BrowserRenderProcessHost::OnChannelError() { // TODO(darin): clean this up } -void BrowserRenderProcessHost::Unregister() { - // RenderProcessHost::Unregister will clean up the host_id_, so we must - // do our cleanup that uses that variable before we call it. - if (host_id() >= 0) { - CacheManagerHost::GetInstance()->Remove(host_id()); - RendererSecurityPolicy::GetInstance()->Remove(host_id()); - } - - RenderProcessHost::Unregister(); -} - void BrowserRenderProcessHost::OnPageContents(const GURL& url, int32 page_id, const std::wstring& contents) { @@ -796,7 +796,7 @@ void BrowserRenderProcessHost::OnPageContents(const GURL& url, void BrowserRenderProcessHost::OnUpdatedCacheStats( const CacheManager::UsageStats& stats) { - CacheManagerHost::GetInstance()->ObserveStats(host_id(), stats); + CacheManagerHost::GetInstance()->ObserveStats(pid(), stats); } void BrowserRenderProcessHost::SetBackgrounded(bool backgrounded) { diff --git a/chrome/browser/renderer_host/browser_render_process_host.h b/chrome/browser/renderer_host/browser_render_process_host.h index 556bbfc..7e149ce 100644 --- a/chrome/browser/renderer_host/browser_render_process_host.h +++ b/chrome/browser/renderer_host/browser_render_process_host.h @@ -87,9 +87,6 @@ class BrowserRenderProcessHost : public RenderProcessHost, const NotificationDetails& details); private: - // RenderProcessHost implementation (protected portion). - virtual void Unregister(); - // Control message handlers. void OnPageContents(const GURL& url, int32 page_id, const std::wstring& contents); diff --git a/chrome/browser/renderer_host/render_process_host.cc b/chrome/browser/renderer_host/render_process_host.cc index ad44ac8..8cafe1e 100644 --- a/chrome/browser/renderer_host/render_process_host.cc +++ b/chrome/browser/renderer_host/render_process_host.cc @@ -52,8 +52,6 @@ unsigned int GetMaxRendererProcessCount() { // Returns true if the given host is suitable for launching a new view // associated with the given profile. -// TODO(jabdelmalek): do we want to avoid processes with hung renderers -// or with a large memory consumption? static bool IsSuitableHost(Profile* profile, RenderProcessHost* host) { return host->profile() == profile; } @@ -68,8 +66,8 @@ bool RenderProcessHost::run_renderer_in_process_ = false; RenderProcessHost::RenderProcessHost(Profile* profile) : max_page_id_(-1), notified_termination_(false), + pid_(-1), profile_(profile) { - host_id_ = all_hosts.Add(this); } RenderProcessHost::~RenderProcessHost() { @@ -97,7 +95,10 @@ void RenderProcessHost::Release(int listener_id) { Details<bool>(&close_expected)); notified_termination_ = true; } - Unregister(); + if (pid_ >= 0) { + all_hosts.Remove(pid_); + pid_ = -1; + } MessageLoop::current()->DeleteSoon(FROM_HERE, this); } } @@ -167,9 +168,12 @@ RenderProcessHost* RenderProcessHost::GetExistingProcessHost(Profile* profile) { return NULL; } -void RenderProcessHost::Unregister() { - if (host_id_ >= 0) { - all_hosts.Remove(host_id_); - host_id_ = -1; +void RenderProcessHost::SetProcessID(int pid) { + if (pid_ != -1) { + // This object is being reused after a renderer crash. Remove the old pid. + all_hosts.Remove(pid_); } + + pid_ = pid; + all_hosts.AddWithID(this, pid); } diff --git a/chrome/browser/renderer_host/render_process_host.h b/chrome/browser/renderer_host/render_process_host.h index 4f8179c..6e59166 100644 --- a/chrome/browser/renderer_host/render_process_host.h +++ b/chrome/browser/renderer_host/render_process_host.h @@ -33,10 +33,10 @@ class RenderProcessHost : public IPC::Channel::Sender, // Returns the user profile associated with this renderer process. Profile* profile() const { return profile_; } - // Returns the unique identifier for this host. This can be used later in + // Returns the process id for this host. This can be used later in // a call to FromID() to get back to this object (this is used to avoid // sending non-threadsafe pointers to other threads). - int host_id() const { return host_id_; } + int pid() const { return pid_; } // Returns the process object associated with the child process. In certain // tests or single-process mode, this will actually represent the current @@ -172,13 +172,8 @@ class RenderProcessHost : public IPC::Channel::Sender, static RenderProcessHost* GetExistingProcessHost(Profile* profile); protected: - // Unregister this object from all globals that reference it. - // This would naturally be part of the destructor, but we destruct - // asynchronously. - // - // This can be overridden by derived classes to add their own unregister code, - // but you should be sure to always call this one AT THE END of your own. - virtual void Unregister(); + // Sets the process of this object, so that others access it using FromID. + void SetProcessID(int pid); base::Process process_; @@ -198,7 +193,7 @@ class RenderProcessHost : public IPC::Channel::Sender, bool notified_termination_; private: - int host_id_; + int pid_; Profile* profile_; diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc index 155f6a3..734fd6d 100644 --- a/chrome/browser/renderer_host/render_view_host.cc +++ b/chrome/browser/renderer_host/render_view_host.cc @@ -121,7 +121,7 @@ RenderViewHost::~RenderViewHost() { // Be sure to clean up any leftover state from cross-site requests. Singleton<CrossSiteRequestManager>()->SetHasPendingCrossSiteRequest( - process()->host_id(), routing_id(), false); + process()->pid(), routing_id(), false); NotificationService::current()->Notify( NotificationType::RENDER_VIEW_HOST_DELETED, @@ -141,6 +141,11 @@ bool RenderViewHost::CreateRenderView() { DCHECK(process()->channel()); DCHECK(process()->profile()); + if (enabled_bindings_ & BindingsPolicy::DOM_UI) { + RendererSecurityPolicy::GetInstance()->GrantDOMUIBindings( + process()->pid()); + } + renderer_initialized_ = true; #if defined(OS_WIN) @@ -201,7 +206,7 @@ void RenderViewHost::NavigateToEntry(const NavigationEntry& entry, MakeNavigateParams(entry, is_reload, ¶ms); RendererSecurityPolicy::GetInstance()->GrantRequestURL( - process()->host_id(), params.url); + process()->pid(), params.url); DoNavigate(new ViewMsg_Navigate(routing_id(), params)); } @@ -214,7 +219,7 @@ void RenderViewHost::NavigateToURL(const GURL& url) { params.reload = false; RendererSecurityPolicy::GetInstance()->GrantRequestURL( - process()->host_id(), params.url); + process()->pid(), params.url); DoNavigate(new ViewMsg_Navigate(routing_id(), params)); } @@ -276,8 +281,7 @@ void RenderViewHost::FirePageBeforeUnload() { } void RenderViewHost::FirePageUnload() { - ClosePage(site_instance()->process_host_id(), - routing_id()); + ClosePage(process()->pid(), routing_id()); } // static @@ -317,7 +321,7 @@ void RenderViewHost::ClosePage(int new_render_process_host_id, void RenderViewHost::SetHasPendingCrossSiteRequest(bool has_pending_request, int request_id) { Singleton<CrossSiteRequestManager>()->SetHasPendingCrossSiteRequest( - process()->host_id(), routing_id(), has_pending_request); + process()->pid(), routing_id(), has_pending_request); pending_request_id_ = request_id; } @@ -387,13 +391,12 @@ void RenderViewHost::DragTargetDragEnter(const WebDropData& drop_data, const gfx::Point& client_pt, const gfx::Point& screen_pt) { // Grant the renderer the ability to load the drop_data. RendererSecurityPolicy* policy = RendererSecurityPolicy::GetInstance(); - policy->GrantRequestURL(process()->host_id(), drop_data.url); + policy->GrantRequestURL(process()->pid(), drop_data.url); for (std::vector<std::wstring>::const_iterator iter(drop_data.filenames.begin()); iter != drop_data.filenames.end(); ++iter) { - policy->GrantRequestURL(process()->host_id(), - net::FilePathToFileURL(*iter)); - policy->GrantUploadFile(process()->host_id(), *iter); + policy->GrantRequestURL(process()->pid(), net::FilePathToFileURL(*iter)); + policy->GrantUploadFile(process()->pid(), *iter); } Send(new ViewMsg_DragTargetDragEnter(routing_id(), drop_data, client_pt, screen_pt)); @@ -544,14 +547,12 @@ void RenderViewHost::CopyImageAt(int x, int y) { } void RenderViewHost::InspectElementAt(int x, int y) { - RendererSecurityPolicy::GetInstance()->GrantInspectElement( - process()->host_id()); + RendererSecurityPolicy::GetInstance()->GrantInspectElement(process()->pid()); Send(new ViewMsg_InspectElement(routing_id(), x, y)); } void RenderViewHost::ShowJavaScriptConsole() { - RendererSecurityPolicy::GetInstance()->GrantInspectElement( - process()->host_id()); + RendererSecurityPolicy::GetInstance()->GrantInspectElement(process()->pid()); Send(new ViewMsg_ShowJavaScriptConsole(routing_id())); } @@ -585,8 +586,6 @@ void RenderViewHost::AllowExternalHostBindings() { void RenderViewHost::AllowDOMUIBindings() { DCHECK(!renderer_initialized_); enabled_bindings_ |= BindingsPolicy::DOM_UI; - RendererSecurityPolicy::GetInstance()->GrantDOMUIBindings( - process()->host_id()); } void RenderViewHost::AllowExtensionBindings() { @@ -629,7 +628,7 @@ void RenderViewHost::InstallMissingPlugin() { } void RenderViewHost::FileSelected(const std::wstring& path) { - RendererSecurityPolicy::GetInstance()->GrantUploadFile(process()->host_id(), + RendererSecurityPolicy::GetInstance()->GrantUploadFile(process()->pid(), path); std::vector<std::wstring> files; files.push_back(path); @@ -641,7 +640,7 @@ void RenderViewHost::MultiFilesSelected( for (std::vector<std::wstring>::const_iterator file = files.begin(); file != files.end(); ++file) { RendererSecurityPolicy::GetInstance()->GrantUploadFile( - process()->host_id(), *file); + process()->pid(), *file); } Send(new ViewMsg_RunFileChooserResponse(routing_id(), files)); } @@ -864,7 +863,7 @@ void RenderViewHost::OnMsgNavigate(const IPC::Message& msg) { Read(&msg, &iter, &validated_params)) return; - const int renderer_id = process()->host_id(); + const int renderer_id = process()->pid(); RendererSecurityPolicy* policy = RendererSecurityPolicy::GetInstance(); // Without this check, an evil renderer can trick the browser into creating // a navigation entry for a banned URL. If the user clicks the back button @@ -953,7 +952,7 @@ void RenderViewHost::OnMsgDidStartProvisionalLoadForFrame(bool is_main_frame, const GURL& url) { GURL validated_url(url); FilterURL(RendererSecurityPolicy::GetInstance(), - process()->host_id(), &validated_url); + process()->pid(), &validated_url); delegate_->DidStartProvisionalLoadForFrame(this, is_main_frame, validated_url); @@ -966,7 +965,7 @@ void RenderViewHost::OnMsgDidFailProvisionalLoadWithError( bool showing_repost_interstitial) { GURL validated_url(url); FilterURL(RendererSecurityPolicy::GetInstance(), - process()->host_id(), &validated_url); + process()->pid(), &validated_url); delegate_->DidFailProvisionalLoadWithError(this, is_main_frame, error_code, validated_url, @@ -1011,7 +1010,7 @@ void RenderViewHost::OnMsgContextMenu(const ContextMenuParams& params) { // Validate the URLs in |params|. If the renderer can't request the URLs // directly, don't show them in the context menu. ContextMenuParams validated_params(params); - const int renderer_id = process()->host_id(); + const int renderer_id = process()->pid(); RendererSecurityPolicy* policy = RendererSecurityPolicy::GetInstance(); FilterURL(policy, renderer_id, &validated_params.link_url); @@ -1027,7 +1026,7 @@ void RenderViewHost::OnMsgOpenURL(const GURL& url, WindowOpenDisposition disposition) { GURL validated_url(url); FilterURL(RendererSecurityPolicy::GetInstance(), - process()->host_id(), &validated_url); + process()->pid(), &validated_url); delegate_->RequestOpenURL(validated_url, referrer, disposition); } @@ -1040,7 +1039,7 @@ void RenderViewHost::OnMsgDomOperationResponse( void RenderViewHost::OnMsgDOMUISend( const std::string& message, const std::string& content) { if (!RendererSecurityPolicy::GetInstance()-> - HasDOMUIBindings(process()->host_id())) { + HasDOMUIBindings(process()->pid())) { NOTREACHED() << "Blocked unauthorized use of DOMUIBindings."; return; } diff --git a/chrome/browser/renderer_host/render_widget_helper.cc b/chrome/browser/renderer_host/render_widget_helper.cc index 561ef18..9cf1172 100644 --- a/chrome/browser/renderer_host/render_widget_helper.cc +++ b/chrome/browser/renderer_host/render_widget_helper.cc @@ -41,9 +41,8 @@ class RenderWidgetHelper::PaintMsgProxy : public Task { DISALLOW_COPY_AND_ASSIGN(PaintMsgProxy); }; -RenderWidgetHelper::RenderWidgetHelper( - int render_process_id, ResourceDispatcherHost* resource_dispatcher_host) - : render_process_id_(render_process_id), +RenderWidgetHelper::RenderWidgetHelper() + : render_process_id_(-1), ui_loop_(MessageLoop::current()), #if defined(OS_WIN) event_(CreateEvent(NULL, FALSE /* auto-reset */, FALSE, NULL)), @@ -51,7 +50,7 @@ RenderWidgetHelper::RenderWidgetHelper( event_(false /* auto-reset */, false), #endif block_popups_(false), - resource_dispatcher_host_(resource_dispatcher_host) { + resource_dispatcher_host_(NULL) { } RenderWidgetHelper::~RenderWidgetHelper() { @@ -64,12 +63,19 @@ RenderWidgetHelper::~RenderWidgetHelper() { #endif } +void RenderWidgetHelper::Init( + int render_process_id, + ResourceDispatcherHost* resource_dispatcher_host) { + render_process_id_ = render_process_id; + resource_dispatcher_host_ = resource_dispatcher_host; +} + int RenderWidgetHelper::GetNextRoutingID() { return next_routing_id_.GetNext() + 1; } void RenderWidgetHelper::CancelResourceRequests(int render_widget_id) { - if (g_browser_process->io_thread()) { + if (g_browser_process->io_thread() && render_process_id_ != -1) { g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(this, &RenderWidgetHelper::OnCancelResourceRequests, diff --git a/chrome/browser/renderer_host/render_widget_helper.h b/chrome/browser/renderer_host/render_widget_helper.h index a3aa321..193a09c 100644 --- a/chrome/browser/renderer_host/render_widget_helper.h +++ b/chrome/browser/renderer_host/render_widget_helper.h @@ -86,10 +86,12 @@ class ResourceDispatcherHost; class RenderWidgetHelper : public base::RefCountedThreadSafe<RenderWidgetHelper> { public: - RenderWidgetHelper(int render_process_id, - ResourceDispatcherHost* resource_dispatcher_host); + RenderWidgetHelper(); ~RenderWidgetHelper(); + void Init(int render_process_id, + ResourceDispatcherHost* resource_dispatcher_host); + // Gets the next available routing id. This is thread safe. int GetNextRoutingID(); diff --git a/chrome/browser/renderer_host/resource_message_filter.cc b/chrome/browser/renderer_host/resource_message_filter.cc index 9783936..02ae30a 100644 --- a/chrome/browser/renderer_host/resource_message_filter.cc +++ b/chrome/browser/renderer_host/resource_message_filter.cc @@ -56,21 +56,21 @@ namespace { class ContextMenuMessageDispatcher : public Task { public: ContextMenuMessageDispatcher( - int render_process_host_id, + int render_process_id, const ViewHostMsg_ContextMenu& context_menu_message) - : render_process_host_id_(render_process_host_id), + : render_process_id_(render_process_id), context_menu_message_(context_menu_message) { } void Run() { RenderProcessHost* host = - RenderProcessHost::FromID(render_process_host_id_); + RenderProcessHost::FromID(render_process_id_); if (host) host->OnMessageReceived(context_menu_message_); } private: - int render_process_host_id_; + int render_process_id_; const ViewHostMsg_ContextMenu context_menu_message_; DISALLOW_COPY_AND_ASSIGN(ContextMenuMessageDispatcher); @@ -102,7 +102,6 @@ ResourceMessageFilter::ResourceMessageFilter( AudioRendererHost* audio_renderer_host, PluginService* plugin_service, printing::PrintJobManager* print_job_manager, - int render_process_host_id, Profile* profile, RenderWidgetHelper* render_widget_helper, SpellChecker* spellchecker) @@ -110,7 +109,7 @@ ResourceMessageFilter::ResourceMessageFilter( resource_dispatcher_host_(resource_dispatcher_host), plugin_service_(plugin_service), print_job_manager_(print_job_manager), - render_process_host_id_(render_process_host_id), + render_process_id_(-1), spellchecker_(spellchecker), ALLOW_THIS_IN_INITIALIZER_LIST(resolve_proxy_msg_helper_(this, NULL)), render_handle_(NULL), @@ -138,6 +137,11 @@ ResourceMessageFilter::~ResourceMessageFilter() { Source<Profile>(static_cast<Profile*>(profile_))); } +void ResourceMessageFilter::Init(int render_process_id) { + render_process_id_ = render_process_id; + render_widget_helper_->Init(render_process_id, resource_dispatcher_host_); +} + // Called on the IPC thread: void ResourceMessageFilter::OnFilterAdded(IPC::Channel* channel) { channel_ = channel; @@ -165,7 +169,7 @@ void ResourceMessageFilter::OnChannelClosing() { // Unhook us from all pending network requests so they don't get sent to a // deleted object. - resource_dispatcher_host_->CancelRequestsForProcess(render_process_host_id_); + resource_dispatcher_host_->CancelRequestsForProcess(render_process_id_); // Unhook AudioRendererHost. audio_renderer_host_->IPCChannelClosing(); @@ -295,7 +299,7 @@ void ResourceMessageFilter::OnReceiveContextMenuMsg(const IPC::Message& msg) { // Create a new ViewHostMsg_ContextMenu message. const ViewHostMsg_ContextMenu context_menu_message(msg.routing_id(), params); render_widget_helper_->ui_loop()->PostTask(FROM_HERE, - new ContextMenuMessageDispatcher(render_process_host_id_, + new ContextMenuMessageDispatcher(render_process_id_, context_menu_message)); } @@ -332,7 +336,7 @@ void ResourceMessageFilter::OnRequestResource( resource_dispatcher_host_->BeginRequest(this, ChildProcessInfo::RENDER_PROCESS, render_handle_, - render_process_host_id_, + render_process_id_, message.routing_id(), request_id, request, @@ -341,17 +345,16 @@ void ResourceMessageFilter::OnRequestResource( } void ResourceMessageFilter::OnDataReceivedACK(int request_id) { - resource_dispatcher_host_->OnDataReceivedACK(render_process_host_id_, - request_id); + resource_dispatcher_host_->OnDataReceivedACK(render_process_id_, request_id); } void ResourceMessageFilter::OnUploadProgressACK(int request_id) { - resource_dispatcher_host_->OnUploadProgressACK(render_process_host_id_, + resource_dispatcher_host_->OnUploadProgressACK(render_process_id_, request_id); } void ResourceMessageFilter::OnCancelRequest(int request_id) { - resource_dispatcher_host_->CancelRequest(render_process_host_id_, request_id, + resource_dispatcher_host_->CancelRequest(render_process_id_, request_id, true); } @@ -368,7 +371,7 @@ void ResourceMessageFilter::OnSyncLoad( resource_dispatcher_host_->BeginRequest(this, ChildProcessInfo::RENDER_PROCESS, render_handle_, - render_process_host_id_, + render_process_id_, sync_result->routing_id(), request_id, request, @@ -516,7 +519,7 @@ void ResourceMessageFilter::OnDownloadUrl(const IPC::Message& message, const GURL& referrer) { resource_dispatcher_host_->BeginDownload(url, referrer, - render_process_host_id_, + render_process_id_, message.routing_id(), request_context_); } diff --git a/chrome/browser/renderer_host/resource_message_filter.h b/chrome/browser/renderer_host/resource_message_filter.h index 55ce1be..10a12ed 100644 --- a/chrome/browser/renderer_host/resource_message_filter.h +++ b/chrome/browser/renderer_host/resource_message_filter.h @@ -68,12 +68,13 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter, AudioRendererHost* audio_renderer_host, PluginService* plugin_service, printing::PrintJobManager* print_job_manager, - int render_process_host_id, Profile* profile, RenderWidgetHelper* render_widget_helper, SpellChecker* spellchecker); virtual ~ResourceMessageFilter(); + void Init(int render_process_id); + // IPC::ChannelProxy::MessageFilter methods: virtual void OnFilterAdded(IPC::Channel* channel); virtual void OnChannelConnected(int32 peer_pid); @@ -86,10 +87,6 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter, // Access to the spell checker. SpellChecker* spellchecker() { return spellchecker_.get(); } - int render_process_host_id() const { return render_process_host_id_;} - - base::ProcessHandle renderer_handle() const { return render_handle_;} - // NotificationObserver implementation. virtual void Observe(NotificationType type, const NotificationSource& source, @@ -239,7 +236,7 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter, // used by the ResourceDispatcherHost to look up the TabContents that // originated URLRequest. Since the RenderProcessHost can be destroyed // before this object, we only hold an ID for lookup. - int render_process_host_id_; + int render_process_id_; // Our spellchecker object. scoped_refptr<SpellChecker> spellchecker_; |