OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |