Index: chrome/browser/extensions/extension_webrequest_api.cc |
diff --git a/chrome/browser/extensions/extension_webrequest_api.cc b/chrome/browser/extensions/extension_webrequest_api.cc |
index 38441515dc1554a0f8d177dea19739146b422545..e9b32e5fdf2c54159315bdce6e384d35495b13dd 100644 |
--- a/chrome/browser/extensions/extension_webrequest_api.cc |
+++ b/chrome/browser/extensions/extension_webrequest_api.cc |
@@ -17,6 +17,7 @@ |
#include "chrome/browser/extensions/extension_service.h" |
#include "chrome/browser/extensions/extension_tab_id_map.h" |
#include "chrome/browser/extensions/extension_webrequest_api_constants.h" |
+#include "chrome/browser/extensions/extension_webrequest_time_tracker.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/renderer_host/chrome_render_message_filter.h" |
#include "chrome/common/extensions/extension.h" |
@@ -431,7 +432,8 @@ ExtensionWebRequestEventRouter* ExtensionWebRequestEventRouter::GetInstance() { |
return Singleton<ExtensionWebRequestEventRouter>::get(); |
} |
-ExtensionWebRequestEventRouter::ExtensionWebRequestEventRouter() { |
+ExtensionWebRequestEventRouter::ExtensionWebRequestEventRouter() |
+ : request_time_tracker_(new ExtensionWebRequestTimeTracker) { |
} |
ExtensionWebRequestEventRouter::~ExtensionWebRequestEventRouter() { |
@@ -450,6 +452,10 @@ int ExtensionWebRequestEventRouter::OnBeforeRequest( |
if (!HasWebRequestScheme(request->url())) |
return net::OK; |
+ request_time_tracker_->LogRequestStartTime(request->identifier(), |
+ base::Time::Now(), |
+ request->url()); |
+ |
bool is_main_frame = false; |
int64 frame_id = -1; |
int frame_id_for_extension = -1; |
@@ -734,6 +740,9 @@ void ExtensionWebRequestEventRouter::OnCompleted( |
if (!HasWebRequestScheme(request->url())) |
return; |
+ request_time_tracker_->LogRequestEndTime(request->identifier(), |
+ base::Time::Now()); |
+ |
DCHECK(request->status().status() == net::URLRequestStatus::SUCCESS); |
DCHECK(!GetAndSetSignaled(request->identifier(), kOnCompleted)); |
@@ -785,6 +794,9 @@ void ExtensionWebRequestEventRouter::OnErrorOccurred( |
if (!HasWebRequestScheme(request->url())) |
return; |
+ request_time_tracker_->LogRequestEndTime(request->identifier(), |
+ base::Time::Now()); |
+ |
DCHECK(request->status().status() == net::URLRequestStatus::FAILED || |
request->status().status() == net::URLRequestStatus::CANCELED); |
@@ -821,6 +833,9 @@ void ExtensionWebRequestEventRouter::OnURLRequestDestroyed( |
void* profile, net::URLRequest* request) { |
blocked_requests_.erase(request->identifier()); |
signaled_requests_.erase(request->identifier()); |
+ |
+ request_time_tracker_->LogRequestEndTime(request->identifier(), |
+ base::Time::Now()); |
} |
bool ExtensionWebRequestEventRouter::DispatchEvent( |
@@ -893,7 +908,7 @@ void ExtensionWebRequestEventRouter::OnEventHandled( |
if (found != listeners_[profile][event_name].end()) |
found->blocked_requests.erase(request_id); |
- DecrementBlockCount(profile, event_name, request_id, response); |
+ DecrementBlockCount(profile, extension_id, event_name, request_id, response); |
} |
void ExtensionWebRequestEventRouter::AddEventListener( |
@@ -949,7 +964,7 @@ void ExtensionWebRequestEventRouter::RemoveEventListener( |
// Unblock any request that this event listener may have been blocking. |
for (std::set<uint64>::iterator it = found->blocked_requests.begin(); |
it != found->blocked_requests.end(); ++it) { |
- DecrementBlockCount(profile, event_name, *it, NULL); |
+ DecrementBlockCount(profile, extension_id, event_name, *it, NULL); |
} |
listeners_[profile][event_name].erase(listener); |
@@ -1237,6 +1252,7 @@ void ExtensionWebRequestEventRouter::MergeOnBeforeSendHeadersResponses( |
void ExtensionWebRequestEventRouter::DecrementBlockCount( |
void* profile, |
+ const std::string& extension_id, |
const std::string& event_name, |
uint64 request_id, |
EventResponse* response) { |
@@ -1256,11 +1272,13 @@ void ExtensionWebRequestEventRouter::DecrementBlockCount( |
CalculateDelta(&blocked_request, response)); |
} |
+ base::TimeDelta block_time = |
+ base::Time::Now() - blocked_request.blocking_time; |
+ request_time_tracker_->IncrementExtensionBlockTime( |
+ extension_id, request_id, block_time); |
+ |
if (num_handlers_blocking == 0) { |
- // TODO(mpcomplete): it would be better if we accumulated the blocking times |
- // for a given request over all events. |
- HISTOGRAM_TIMES("Extensions.NetworkDelay", |
- base::Time::Now() - blocked_request.blocking_time); |
+ request_time_tracker_->IncrementTotalBlockTime(request_id, block_time); |
EventResponseDeltas::iterator i; |
EventResponseDeltas& deltas = blocked_request.response_deltas; |
@@ -1300,6 +1318,13 @@ void ExtensionWebRequestEventRouter::DecrementBlockCount( |
"modifications."; |
} |
+ if (canceled) { |
+ request_time_tracker_->SetRequestCanceled(request_id); |
+ } else if (blocked_request.new_url && |
+ !blocked_request.new_url->is_empty()) { |
+ request_time_tracker_->SetRequestRedirected(request_id); |
+ } |
+ |
// This signals a failed request to subscribers of onErrorOccurred in case |
// a request is cancelled because net::ERR_EMPTY_RESPONSE cannot be |
// distinguished from a regular failure. |