Chromium Code Reviews| Index: chrome/browser/net/chrome_network_delegate.cc |
| diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/chrome_network_delegate.cc |
| index 595ad4b005ce278c89deea5cefeefd4b7206709f..90e500332f91b189d29b98b460547f02bfc680ae 100644 |
| --- a/chrome/browser/net/chrome_network_delegate.cc |
| +++ b/chrome/browser/net/chrome_network_delegate.cc |
| @@ -5,14 +5,19 @@ |
| #include "chrome/browser/net/chrome_network_delegate.h" |
| #include "base/logging.h" |
| +#include "chrome/browser/browser_process.h" |
| #include "chrome/browser/custom_handlers/protocol_handler_registry.h" |
| #include "chrome/browser/extensions/api/webrequest/webrequest_api.h" |
| #include "chrome/browser/extensions/extension_event_router_forwarder.h" |
| #include "chrome/browser/extensions/extension_info_map.h" |
| +#include "chrome/browser/extensions/extension_process_manager.h" |
| #include "chrome/browser/extensions/extension_proxy_api.h" |
| #include "chrome/browser/prefs/pref_member.h" |
| +#include "chrome/browser/profiles/profile_manager.h" |
| #include "chrome/browser/task_manager/task_manager.h" |
| #include "chrome/common/pref_names.h" |
| +#include "content/browser/renderer_host/render_view_host.h" |
| +#include "content/browser/renderer_host/resource_dispatcher_host.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "net/base/host_port_pair.h" |
| #include "net/base/net_errors.h" |
| @@ -45,6 +50,44 @@ void ForwardProxyErrors(net::URLRequest* request, |
| } |
| } |
| +enum RequestStatus { REQUEST_STARTED, REQUEST_DONE }; |
| + |
| +// Notifies the ExtensionProcessManager that a request has started or stopped |
| +// for a particular RenderView. |
| +void NotifyEPMRequestStatus(RequestStatus status, |
| + void* profile_id, |
| + int process_id, |
| + int render_view_id) { |
| + Profile* profile = reinterpret_cast<Profile*>(profile_id); |
|
Yoyo Zhou
2012/03/02 03:10:46
Might be a good idea to DCHECK we're on the UI thr
Matt Perry
2012/03/02 20:25:21
Done.
|
| + if (!g_browser_process->profile_manager()->IsValidProfile(profile)) |
| + return; |
| + |
| + RenderViewHost* render_view_host = |
| + RenderViewHost::FromID(process_id, render_view_id); |
| + if (render_view_host) { |
| + if (status == REQUEST_STARTED) { |
| + profile->GetExtensionProcessManager()->OnNetworkRequestStarted( |
| + render_view_host); |
| + } else if (status == REQUEST_DONE) { |
| + profile->GetExtensionProcessManager()->OnNetworkRequestDone( |
| + render_view_host); |
| + } else { |
| + NOTREACHED(); |
| + } |
| + } |
| +} |
| + |
| +void ForwardRequestStatus( |
| + RequestStatus status, net::URLRequest* request, void* profile_id) { |
| + int process_id, render_view_id; |
| + if (ResourceDispatcherHost::RenderViewForRequest( |
| + request, &process_id, &render_view_id)) { |
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| + base::Bind(&NotifyEPMRequestStatus, |
| + status, profile_id, process_id, render_view_id)); |
| + } |
| +} |
| + |
| } // namespace |
| ChromeNetworkDelegate::ChromeNetworkDelegate( |
| @@ -92,6 +135,8 @@ int ChromeNetworkDelegate::OnBeforeURLRequest( |
| } |
| #endif |
| + ForwardRequestStatus(REQUEST_STARTED, request, profile_); |
| + |
| if (!enable_referrers_->GetValue()) |
| request->set_referrer(std::string()); |
| return ExtensionWebRequestEventRouter::GetInstance()->OnBeforeRequest( |
| @@ -160,6 +205,8 @@ void ChromeNetworkDelegate::OnCompleted(net::URLRequest* request, |
| NOTREACHED(); |
| } |
| ForwardProxyErrors(request, event_router_.get(), profile_); |
| + |
| + ForwardRequestStatus(REQUEST_DONE, request, profile_); |
| } |
| void ChromeNetworkDelegate::OnURLRequestDestroyed(net::URLRequest* request) { |