Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(397)

Side by Side Diff: extensions/browser/api/web_request/web_request_api.cc

Issue 2708923005: Extensions: Add metrics for Web Request API actions. (Closed)
Patch Set: Rename enum WebRequestAction -> RequestAction in histograms.xml to be in line with the implementation. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "extensions/browser/api/web_request/web_request_api.h" 5 #include "extensions/browser/api/web_request/web_request_api.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 namespace helpers = extension_web_request_api_helpers; 80 namespace helpers = extension_web_request_api_helpers;
81 namespace keys = extension_web_request_api_constants; 81 namespace keys = extension_web_request_api_constants;
82 82
83 namespace extensions { 83 namespace extensions {
84 84
85 namespace declarative_keys = declarative_webrequest_constants; 85 namespace declarative_keys = declarative_webrequest_constants;
86 namespace web_request = api::web_request; 86 namespace web_request = api::web_request;
87 87
88 namespace { 88 namespace {
89 89
90 // Describes the action taken by the Web Request API for a given stage of a web
91 // request.
92 // These values are written to logs. New enum values can be added, but existing
93 // enum values must never be renumbered or deleted and reused.
94 enum RequestAction {
95 CANCEL = 0,
96 REDIRECT = 1,
97 MODIFY_REQUEST_HEADERS = 2,
98 MODIFY_RESPONSE_HEADERS = 3,
99 SET_AUTH_CREDENTIALS = 4,
100 MAX
101 };
102
90 const char kWebRequestEventPrefix[] = "webRequest."; 103 const char kWebRequestEventPrefix[] = "webRequest.";
91 104
92 // List of all the webRequest events. 105 // List of all the webRequest events.
93 const char* const kWebRequestEvents[] = { 106 const char* const kWebRequestEvents[] = {
94 keys::kOnBeforeRedirectEvent, 107 keys::kOnBeforeRedirectEvent,
95 web_request::OnBeforeRequest::kEventName, 108 web_request::OnBeforeRequest::kEventName,
96 keys::kOnBeforeSendHeadersEvent, 109 keys::kOnBeforeSendHeadersEvent,
97 keys::kOnCompletedEvent, 110 keys::kOnCompletedEvent,
98 web_request::OnErrorOccurred::kEventName, 111 web_request::OnErrorOccurred::kEventName,
99 keys::kOnSendHeadersEvent, 112 keys::kOnSendHeadersEvent,
(...skipping 23 matching lines...) Expand all
123 return keys::kOnResponseStarted; 136 return keys::kOnResponseStarted;
124 case ExtensionWebRequestEventRouter::kOnErrorOccurred: 137 case ExtensionWebRequestEventRouter::kOnErrorOccurred:
125 return keys::kOnErrorOccurred; 138 return keys::kOnErrorOccurred;
126 case ExtensionWebRequestEventRouter::kOnCompleted: 139 case ExtensionWebRequestEventRouter::kOnCompleted:
127 return keys::kOnCompleted; 140 return keys::kOnCompleted;
128 } 141 }
129 NOTREACHED(); 142 NOTREACHED();
130 return "Not reached"; 143 return "Not reached";
131 } 144 }
132 145
146 void LogRequestAction(RequestAction action) {
147 DCHECK_NE(RequestAction::MAX, action);
148 UMA_HISTOGRAM_ENUMERATION("Extensions.WebRequestAction", action,
149 RequestAction::MAX);
150 }
151
133 bool IsWebRequestEvent(const std::string& event_name) { 152 bool IsWebRequestEvent(const std::string& event_name) {
134 std::string web_request_event_name(event_name); 153 std::string web_request_event_name(event_name);
135 if (base::StartsWith(web_request_event_name, 154 if (base::StartsWith(web_request_event_name,
136 webview::kWebViewEventPrefix, 155 webview::kWebViewEventPrefix,
137 base::CompareCase::SENSITIVE)) { 156 base::CompareCase::SENSITIVE)) {
138 web_request_event_name.replace( 157 web_request_event_name.replace(
139 0, strlen(webview::kWebViewEventPrefix), kWebRequestEventPrefix); 158 0, strlen(webview::kWebViewEventPrefix), kWebRequestEventPrefix);
140 } 159 }
141 auto* const* web_request_events_end = 160 auto* const* web_request_events_end =
142 kWebRequestEvents + arraysize(kWebRequestEvents); 161 kWebRequestEvents + arraysize(kWebRequestEvents);
(...skipping 1650 matching lines...) Expand 10 before | Expand all | Expand 10 after
1793 uint64_t request_id, 1812 uint64_t request_id,
1794 ExtensionNavigationUIData* navigation_ui_data, 1813 ExtensionNavigationUIData* navigation_ui_data,
1795 bool call_callback) { 1814 bool call_callback) {
1796 BlockedRequest& blocked_request = blocked_requests_[request_id]; 1815 BlockedRequest& blocked_request = blocked_requests_[request_id];
1797 CHECK_EQ(0, blocked_request.num_handlers_blocking); 1816 CHECK_EQ(0, blocked_request.num_handlers_blocking);
1798 helpers::EventResponseDeltas& deltas = blocked_request.response_deltas; 1817 helpers::EventResponseDeltas& deltas = blocked_request.response_deltas;
1799 base::TimeDelta block_time = 1818 base::TimeDelta block_time =
1800 base::Time::Now() - blocked_request.blocking_time; 1819 base::Time::Now() - blocked_request.blocking_time;
1801 request_time_tracker_->IncrementTotalBlockTime(request_id, block_time); 1820 request_time_tracker_->IncrementTotalBlockTime(request_id, block_time);
1802 1821
1822 bool request_headers_modified = false;
1823 bool response_headers_modified = false;
1803 bool credentials_set = false; 1824 bool credentials_set = false;
1804 1825
1805 deltas.sort(&helpers::InDecreasingExtensionInstallationTimeOrder); 1826 deltas.sort(&helpers::InDecreasingExtensionInstallationTimeOrder);
1806 1827
1807 bool canceled = false; 1828 bool canceled = false;
1808 helpers::MergeCancelOfResponses(blocked_request.response_deltas, &canceled, 1829 helpers::MergeCancelOfResponses(blocked_request.response_deltas, &canceled,
1809 blocked_request.net_log); 1830 blocked_request.net_log);
1810 1831
1811 WarningSet warnings; 1832 WarningSet warnings;
1812 if (blocked_request.event == kOnBeforeRequest) { 1833 if (blocked_request.event == kOnBeforeRequest) {
1813 CHECK(!blocked_request.callback.is_null()); 1834 CHECK(!blocked_request.callback.is_null());
1814 helpers::MergeOnBeforeRequestResponses( 1835 helpers::MergeOnBeforeRequestResponses(
1815 blocked_request.request->url(), blocked_request.response_deltas, 1836 blocked_request.request->url(), blocked_request.response_deltas,
1816 blocked_request.new_url, &warnings, blocked_request.net_log); 1837 blocked_request.new_url, &warnings, blocked_request.net_log);
1817 } else if (blocked_request.event == kOnBeforeSendHeaders) { 1838 } else if (blocked_request.event == kOnBeforeSendHeaders) {
1818 CHECK(!blocked_request.callback.is_null()); 1839 CHECK(!blocked_request.callback.is_null());
1819 helpers::MergeOnBeforeSendHeadersResponses( 1840 helpers::MergeOnBeforeSendHeadersResponses(
1820 blocked_request.response_deltas, 1841 blocked_request.response_deltas, blocked_request.request_headers,
1821 blocked_request.request_headers, 1842 &warnings, blocked_request.net_log, &request_headers_modified);
1822 &warnings,
1823 blocked_request.net_log);
1824 } else if (blocked_request.event == kOnHeadersReceived) { 1843 } else if (blocked_request.event == kOnHeadersReceived) {
1825 CHECK(!blocked_request.callback.is_null()); 1844 CHECK(!blocked_request.callback.is_null());
1826 helpers::MergeOnHeadersReceivedResponses( 1845 helpers::MergeOnHeadersReceivedResponses(
1827 blocked_request.request->url(), blocked_request.response_deltas, 1846 blocked_request.request->url(), blocked_request.response_deltas,
1828 blocked_request.original_response_headers.get(), 1847 blocked_request.original_response_headers.get(),
1829 blocked_request.override_response_headers, blocked_request.new_url, 1848 blocked_request.override_response_headers, blocked_request.new_url,
1830 &warnings, blocked_request.net_log); 1849 &warnings, blocked_request.net_log, &response_headers_modified);
1831 } else if (blocked_request.event == kOnAuthRequired) { 1850 } else if (blocked_request.event == kOnAuthRequired) {
1832 CHECK(blocked_request.callback.is_null()); 1851 CHECK(blocked_request.callback.is_null());
1833 CHECK(!blocked_request.auth_callback.is_null()); 1852 CHECK(!blocked_request.auth_callback.is_null());
1834 credentials_set = helpers::MergeOnAuthRequiredResponses( 1853 credentials_set = helpers::MergeOnAuthRequiredResponses(
1835 blocked_request.response_deltas, 1854 blocked_request.response_deltas,
1836 blocked_request.auth_credentials, 1855 blocked_request.auth_credentials,
1837 &warnings, 1856 &warnings,
1838 blocked_request.net_log); 1857 blocked_request.net_log);
1839 } else { 1858 } else {
1840 NOTREACHED(); 1859 NOTREACHED();
1841 } 1860 }
1842 1861
1843 SendMessages(browser_context, blocked_request, navigation_ui_data); 1862 SendMessages(browser_context, blocked_request, navigation_ui_data);
1844 1863
1845 if (!warnings.empty()) { 1864 if (!warnings.empty()) {
1846 BrowserThread::PostTask( 1865 BrowserThread::PostTask(
1847 BrowserThread::UI, 1866 BrowserThread::UI,
1848 FROM_HERE, 1867 FROM_HERE,
1849 base::Bind(&WarningService::NotifyWarningsOnUI, 1868 base::Bind(&WarningService::NotifyWarningsOnUI,
1850 browser_context, warnings)); 1869 browser_context, warnings));
1851 } 1870 }
1852 1871
1853 if (canceled) { 1872 const bool redirected =
1873 blocked_request.new_url && !blocked_request.new_url->is_empty();
1874
1875 if (canceled)
1854 request_time_tracker_->SetRequestCanceled(request_id); 1876 request_time_tracker_->SetRequestCanceled(request_id);
1855 } else if (blocked_request.new_url && 1877 else if (redirected)
1856 !blocked_request.new_url->is_empty()) {
1857 request_time_tracker_->SetRequestRedirected(request_id); 1878 request_time_tracker_->SetRequestRedirected(request_id);
1858 } 1879
1880 // Log UMA metrics. Note: We are not necessarily concerned with the final
1881 // action taken. Instead we are interested in how frequently the different
1882 // actions are used by extensions. Hence multiple actions may be logged for a
1883 // single delta execution.
1884 if (canceled)
1885 LogRequestAction(RequestAction::CANCEL);
1886 if (redirected)
1887 LogRequestAction(RequestAction::REDIRECT);
1888 if (request_headers_modified)
1889 LogRequestAction(RequestAction::MODIFY_REQUEST_HEADERS);
1890 if (response_headers_modified)
1891 LogRequestAction(RequestAction::MODIFY_RESPONSE_HEADERS);
1892 if (credentials_set)
1893 LogRequestAction(RequestAction::SET_AUTH_CREDENTIALS);
1859 1894
1860 // This triggers onErrorOccurred if canceled is true. 1895 // This triggers onErrorOccurred if canceled is true.
1861 int rv = canceled ? net::ERR_BLOCKED_BY_CLIENT : net::OK; 1896 int rv = canceled ? net::ERR_BLOCKED_BY_CLIENT : net::OK;
1862 1897
1863 if (!blocked_request.callback.is_null()) { 1898 if (!blocked_request.callback.is_null()) {
1864 net::CompletionCallback callback = blocked_request.callback; 1899 net::CompletionCallback callback = blocked_request.callback;
1865 // Ensure that request is removed before callback because the callback 1900 // Ensure that request is removed before callback because the callback
1866 // might trigger the next event. 1901 // might trigger the next event.
1867 blocked_requests_.erase(request_id); 1902 blocked_requests_.erase(request_id);
1868 if (call_callback) 1903 if (call_callback)
(...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after
2390 // Since EventListeners are segmented by browser_context, check that 2425 // Since EventListeners are segmented by browser_context, check that
2391 // last, as it is exceedingly unlikely to be different. 2426 // last, as it is exceedingly unlikely to be different.
2392 return extension_id == that.extension_id && 2427 return extension_id == that.extension_id &&
2393 sub_event_name == that.sub_event_name && 2428 sub_event_name == that.sub_event_name &&
2394 web_view_instance_id == that.web_view_instance_id && 2429 web_view_instance_id == that.web_view_instance_id &&
2395 embedder_process_id == that.embedder_process_id && 2430 embedder_process_id == that.embedder_process_id &&
2396 browser_context == that.browser_context; 2431 browser_context == that.browser_context;
2397 } 2432 }
2398 2433
2399 } // namespace extensions 2434 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698