Chromium Code Reviews| Index: extensions/browser/api/web_request/web_request_api.cc |
| diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc |
| index b81023248535d3064adaf563327f06568d444b64..0c3fb78717d20ac09b539d4cc93826101816c520 100644 |
| --- a/extensions/browser/api/web_request/web_request_api.cc |
| +++ b/extensions/browser/api/web_request/web_request_api.cc |
| @@ -87,7 +87,21 @@ namespace web_request = api::web_request; |
| namespace { |
| +// Describes the action taken by the Web Request API for a given stage of a web |
| +// request. |
| +// These values are written to logs. New enum values can be added, but existing |
| +// enum values must never be renumbered or deleted and reused. |
| +enum RequestAction { |
| + CANCEL = 0, |
| + REDIRECT = 1, |
| + MODIFY_REQUEST_HEADERS = 2, |
| + MODIFY_RESPONSE_HEADERS = 3, |
| + SET_AUTH_CREDENTIALS = 4, |
| + MAX |
| +}; |
| + |
| const char kWebRequestEventPrefix[] = "webRequest."; |
| +const char kWebRequestActionUMA[] = "Extensions.WebRequestAction"; |
| // List of all the webRequest events. |
| const char* const kWebRequestEvents[] = { |
| @@ -1800,6 +1814,8 @@ int ExtensionWebRequestEventRouter::ExecuteDeltas( |
| base::Time::Now() - blocked_request.blocking_time; |
| request_time_tracker_->IncrementTotalBlockTime(request_id, block_time); |
| + bool request_headers_modified = false; |
| + bool response_headers_modified = false; |
| bool credentials_set = false; |
| deltas.sort(&helpers::InDecreasingExtensionInstallationTimeOrder); |
| @@ -1817,17 +1833,15 @@ int ExtensionWebRequestEventRouter::ExecuteDeltas( |
| } else if (blocked_request.event == kOnBeforeSendHeaders) { |
| CHECK(!blocked_request.callback.is_null()); |
| helpers::MergeOnBeforeSendHeadersResponses( |
| - blocked_request.response_deltas, |
| - blocked_request.request_headers, |
| - &warnings, |
| - blocked_request.net_log); |
| + blocked_request.response_deltas, blocked_request.request_headers, |
| + &warnings, blocked_request.net_log, &request_headers_modified); |
| } else if (blocked_request.event == kOnHeadersReceived) { |
| CHECK(!blocked_request.callback.is_null()); |
| helpers::MergeOnHeadersReceivedResponses( |
| blocked_request.request->url(), blocked_request.response_deltas, |
| blocked_request.original_response_headers.get(), |
| blocked_request.override_response_headers, blocked_request.new_url, |
| - &warnings, blocked_request.net_log); |
| + &warnings, blocked_request.net_log, &response_headers_modified); |
| } else if (blocked_request.event == kOnAuthRequired) { |
| CHECK(blocked_request.callback.is_null()); |
| CHECK(!blocked_request.auth_callback.is_null()); |
| @@ -1850,11 +1864,39 @@ int ExtensionWebRequestEventRouter::ExecuteDeltas( |
| browser_context, warnings)); |
| } |
| - if (canceled) { |
| + const bool redirected = |
| + blocked_request.new_url && !blocked_request.new_url->is_empty(); |
| + |
| + if (canceled) |
| request_time_tracker_->SetRequestCanceled(request_id); |
| - } else if (blocked_request.new_url && |
| - !blocked_request.new_url->is_empty()) { |
| + else if (redirected) |
| request_time_tracker_->SetRequestRedirected(request_id); |
| + |
| + // Log UMA metrics. Note: We are not necessarily concerned with the final |
| + // action taken. Instead we are interested in how frequently the different |
| + // actions are used by extensions. |
|
Devlin
2017/02/25 18:39:34
nit: Might be worth explicitly calling out that mu
karandeepb
2017/02/28 00:56:45
Done.
|
| + if (canceled) { |
| + UMA_HISTOGRAM_ENUMERATION(kWebRequestActionUMA, RequestAction::CANCEL, |
| + RequestAction::MAX); |
|
Ilya Sherman
2017/02/27 19:29:25
Please create a wrapper for emitting to this histo
karandeepb
2017/02/28 00:56:45
Done.
|
| + } |
| + if (redirected) { |
| + UMA_HISTOGRAM_ENUMERATION(kWebRequestActionUMA, RequestAction::REDIRECT, |
| + RequestAction::MAX); |
| + } |
| + if (request_headers_modified) { |
| + UMA_HISTOGRAM_ENUMERATION(kWebRequestActionUMA, |
| + RequestAction::MODIFY_REQUEST_HEADERS, |
| + RequestAction::MAX); |
| + } |
| + if (response_headers_modified) { |
| + UMA_HISTOGRAM_ENUMERATION(kWebRequestActionUMA, |
| + RequestAction::MODIFY_RESPONSE_HEADERS, |
| + RequestAction::MAX); |
| + } |
| + if (credentials_set) { |
| + UMA_HISTOGRAM_ENUMERATION(kWebRequestActionUMA, |
| + RequestAction::SET_AUTH_CREDENTIALS, |
| + RequestAction::MAX); |
| } |
| // This triggers onErrorOccurred if canceled is true. |