Chromium Code Reviews| 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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 78 namespace helpers = extension_web_request_api_helpers; | 78 namespace helpers = extension_web_request_api_helpers; |
| 79 namespace keys = extension_web_request_api_constants; | 79 namespace keys = extension_web_request_api_constants; |
| 80 | 80 |
| 81 namespace extensions { | 81 namespace extensions { |
| 82 | 82 |
| 83 namespace declarative_keys = declarative_webrequest_constants; | 83 namespace declarative_keys = declarative_webrequest_constants; |
| 84 namespace web_request = api::web_request; | 84 namespace web_request = api::web_request; |
| 85 | 85 |
| 86 namespace { | 86 namespace { |
| 87 | 87 |
| 88 // Describes the action taken by the Web Request API for a given stage of a web | |
| 89 // request. | |
| 90 // These values are written to logs. New enum values can be added, but existing | |
| 91 // enum values must never be renumbered or deleted and reused. | |
| 92 enum RequestAction { | |
| 93 CANCEL = 0, | |
| 94 REDIRECT = 1, | |
| 95 MODIFY_REQUEST_HEADERS = 2, | |
| 96 MODIFY_REQUEST_COOKIES = 3, | |
| 97 MODIFY_RESPONSE_HEADERS = 4, | |
| 98 MODIFY_RESPONSE_COOKIES = 5, | |
| 99 SET_AUTH_CREDENTIALS = 6, | |
| 100 MAX | |
| 101 }; | |
| 102 | |
| 88 const char kWebRequestEventPrefix[] = "webRequest."; | 103 const char kWebRequestEventPrefix[] = "webRequest."; |
| 104 const char kWebRequestActionUMA[] = "Extensions.WebRequestAction"; | |
| 89 | 105 |
| 90 // List of all the webRequest events. | 106 // List of all the webRequest events. |
| 91 const char* const kWebRequestEvents[] = { | 107 const char* const kWebRequestEvents[] = { |
| 92 keys::kOnBeforeRedirectEvent, | 108 keys::kOnBeforeRedirectEvent, |
| 93 web_request::OnBeforeRequest::kEventName, | 109 web_request::OnBeforeRequest::kEventName, |
| 94 keys::kOnBeforeSendHeadersEvent, | 110 keys::kOnBeforeSendHeadersEvent, |
| 95 keys::kOnCompletedEvent, | 111 keys::kOnCompletedEvent, |
| 96 web_request::OnErrorOccurred::kEventName, | 112 web_request::OnErrorOccurred::kEventName, |
| 97 keys::kOnSendHeadersEvent, | 113 keys::kOnSendHeadersEvent, |
| 98 keys::kOnAuthRequiredEvent, | 114 keys::kOnAuthRequiredEvent, |
| (...skipping 1678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1777 | 1793 |
| 1778 BrowserThread::PostTask( | 1794 BrowserThread::PostTask( |
| 1779 BrowserThread::UI, FROM_HERE, | 1795 BrowserThread::UI, FROM_HERE, |
| 1780 base::Bind(&SendOnMessageEventOnUI, browser_context, | 1796 base::Bind(&SendOnMessageEventOnUI, browser_context, |
| 1781 delta->extension_id, is_web_view_guest, | 1797 delta->extension_id, is_web_view_guest, |
| 1782 web_view_instance_id, base::Passed(&event_details))); | 1798 web_view_instance_id, base::Passed(&event_details))); |
| 1783 } | 1799 } |
| 1784 } | 1800 } |
| 1785 } | 1801 } |
| 1786 | 1802 |
| 1787 int ExtensionWebRequestEventRouter::ExecuteDeltas( | 1803 int ExtensionWebRequestEventRouter::ExecuteDeltas( |
|
karandeepb
2017/02/23 21:31:05
This will also include modifications done via the
| |
| 1788 void* browser_context, | 1804 void* browser_context, |
| 1789 uint64_t request_id, | 1805 uint64_t request_id, |
| 1790 ExtensionNavigationUIData* navigation_ui_data, | 1806 ExtensionNavigationUIData* navigation_ui_data, |
| 1791 bool call_callback) { | 1807 bool call_callback) { |
| 1792 BlockedRequest& blocked_request = blocked_requests_[request_id]; | 1808 BlockedRequest& blocked_request = blocked_requests_[request_id]; |
| 1793 CHECK_EQ(0, blocked_request.num_handlers_blocking); | 1809 CHECK_EQ(0, blocked_request.num_handlers_blocking); |
| 1794 helpers::EventResponseDeltas& deltas = blocked_request.response_deltas; | 1810 helpers::EventResponseDeltas& deltas = blocked_request.response_deltas; |
| 1795 base::TimeDelta block_time = | 1811 base::TimeDelta block_time = |
| 1796 base::Time::Now() - blocked_request.blocking_time; | 1812 base::Time::Now() - blocked_request.blocking_time; |
| 1797 request_time_tracker_->IncrementTotalBlockTime(request_id, block_time); | 1813 request_time_tracker_->IncrementTotalBlockTime(request_id, block_time); |
| 1798 | 1814 |
| 1799 bool credentials_set = false; | 1815 bool credentials_set = false; |
| 1800 | 1816 |
| 1801 deltas.sort(&helpers::InDecreasingExtensionInstallationTimeOrder); | 1817 deltas.sort(&helpers::InDecreasingExtensionInstallationTimeOrder); |
| 1802 | 1818 |
| 1803 bool canceled = false; | 1819 bool canceled = false; |
| 1804 helpers::MergeCancelOfResponses(blocked_request.response_deltas, &canceled, | 1820 helpers::MergeCancelOfResponses(blocked_request.response_deltas, &canceled, |
| 1805 blocked_request.net_log); | 1821 blocked_request.net_log); |
| 1806 | 1822 |
| 1807 WarningSet warnings; | 1823 WarningSet warnings; |
| 1808 if (blocked_request.event == kOnBeforeRequest) { | 1824 if (blocked_request.event == kOnBeforeRequest) { |
| 1809 CHECK(!blocked_request.callback.is_null()); | 1825 CHECK(!blocked_request.callback.is_null()); |
| 1810 helpers::MergeOnBeforeRequestResponses( | 1826 helpers::MergeOnBeforeRequestResponses( |
| 1811 blocked_request.response_deltas, | 1827 blocked_request.response_deltas, |
| 1812 blocked_request.new_url, | 1828 blocked_request.new_url, |
| 1813 &warnings, | 1829 &warnings, |
| 1814 blocked_request.net_log); | 1830 blocked_request.net_log); |
| 1815 } else if (blocked_request.event == kOnBeforeSendHeaders) { | 1831 } else if (blocked_request.event == kOnBeforeSendHeaders) { |
| 1816 CHECK(!blocked_request.callback.is_null()); | 1832 CHECK(!blocked_request.callback.is_null()); |
| 1833 bool request_headers_modified = false; | |
| 1834 bool request_cookies_modified = false; | |
| 1817 helpers::MergeOnBeforeSendHeadersResponses( | 1835 helpers::MergeOnBeforeSendHeadersResponses( |
| 1818 blocked_request.response_deltas, | 1836 blocked_request.response_deltas, blocked_request.request_headers, |
| 1819 blocked_request.request_headers, | 1837 &warnings, blocked_request.net_log, &request_headers_modified, |
| 1820 &warnings, | 1838 &request_cookies_modified); |
| 1821 blocked_request.net_log); | 1839 if (request_headers_modified) |
| 1840 UMA_HISTOGRAM_ENUMERATION(kWebRequestActionUMA, | |
| 1841 RequestAction::MODIFY_REQUEST_HEADERS, | |
| 1842 RequestAction::MAX); | |
| 1843 if (request_cookies_modified) | |
| 1844 UMA_HISTOGRAM_ENUMERATION(kWebRequestActionUMA, | |
| 1845 RequestAction::MODIFY_REQUEST_COOKIES, | |
| 1846 RequestAction::MAX); | |
| 1822 } else if (blocked_request.event == kOnHeadersReceived) { | 1847 } else if (blocked_request.event == kOnHeadersReceived) { |
| 1823 CHECK(!blocked_request.callback.is_null()); | 1848 CHECK(!blocked_request.callback.is_null()); |
| 1849 bool response_headers_modified = false; | |
| 1850 bool response_cookies_modified = false; | |
| 1824 helpers::MergeOnHeadersReceivedResponses( | 1851 helpers::MergeOnHeadersReceivedResponses( |
| 1825 blocked_request.response_deltas, | 1852 blocked_request.response_deltas, |
| 1826 blocked_request.original_response_headers.get(), | 1853 blocked_request.original_response_headers.get(), |
| 1827 blocked_request.override_response_headers, | 1854 blocked_request.override_response_headers, blocked_request.new_url, |
| 1828 blocked_request.new_url, | 1855 &warnings, blocked_request.net_log, &response_headers_modified, |
| 1829 &warnings, | 1856 &response_cookies_modified); |
| 1830 blocked_request.net_log); | 1857 if (response_headers_modified) |
| 1858 UMA_HISTOGRAM_ENUMERATION(kWebRequestActionUMA, | |
| 1859 RequestAction::MODIFY_RESPONSE_HEADERS, | |
| 1860 RequestAction::MAX); | |
| 1861 if (response_cookies_modified) | |
| 1862 UMA_HISTOGRAM_ENUMERATION(kWebRequestActionUMA, | |
| 1863 RequestAction::MODIFY_RESPONSE_COOKIES, | |
| 1864 RequestAction::MAX); | |
| 1831 } else if (blocked_request.event == kOnAuthRequired) { | 1865 } else if (blocked_request.event == kOnAuthRequired) { |
| 1832 CHECK(blocked_request.callback.is_null()); | 1866 CHECK(blocked_request.callback.is_null()); |
| 1833 CHECK(!blocked_request.auth_callback.is_null()); | 1867 CHECK(!blocked_request.auth_callback.is_null()); |
| 1834 credentials_set = helpers::MergeOnAuthRequiredResponses( | 1868 credentials_set = helpers::MergeOnAuthRequiredResponses( |
| 1835 blocked_request.response_deltas, | 1869 blocked_request.response_deltas, |
| 1836 blocked_request.auth_credentials, | 1870 blocked_request.auth_credentials, |
| 1837 &warnings, | 1871 &warnings, |
| 1838 blocked_request.net_log); | 1872 blocked_request.net_log); |
| 1839 } else { | 1873 } else { |
| 1840 NOTREACHED(); | 1874 NOTREACHED(); |
| 1841 } | 1875 } |
| 1842 | 1876 |
| 1843 SendMessages(browser_context, blocked_request, navigation_ui_data); | 1877 SendMessages(browser_context, blocked_request, navigation_ui_data); |
| 1844 | 1878 |
| 1845 if (!warnings.empty()) { | 1879 if (!warnings.empty()) { |
| 1846 BrowserThread::PostTask( | 1880 BrowserThread::PostTask( |
| 1847 BrowserThread::UI, | 1881 BrowserThread::UI, |
| 1848 FROM_HERE, | 1882 FROM_HERE, |
| 1849 base::Bind(&WarningService::NotifyWarningsOnUI, | 1883 base::Bind(&WarningService::NotifyWarningsOnUI, |
| 1850 browser_context, warnings)); | 1884 browser_context, warnings)); |
| 1851 } | 1885 } |
| 1852 | 1886 |
| 1853 if (canceled) { | 1887 if (canceled) { |
| 1854 request_time_tracker_->SetRequestCanceled(request_id); | 1888 request_time_tracker_->SetRequestCanceled(request_id); |
| 1855 } else if (blocked_request.new_url && | 1889 UMA_HISTOGRAM_ENUMERATION(kWebRequestActionUMA, RequestAction::CANCEL, |
| 1856 !blocked_request.new_url->is_empty()) { | 1890 RequestAction::MAX); |
| 1891 } else if (blocked_request.new_url && !blocked_request.new_url->is_empty()) { | |
| 1857 request_time_tracker_->SetRequestRedirected(request_id); | 1892 request_time_tracker_->SetRequestRedirected(request_id); |
| 1893 UMA_HISTOGRAM_ENUMERATION(kWebRequestActionUMA, RequestAction::REDIRECT, | |
| 1894 RequestAction::MAX); | |
| 1895 } else if (credentials_set) { | |
| 1896 UMA_HISTOGRAM_ENUMERATION(kWebRequestActionUMA, | |
| 1897 RequestAction::SET_AUTH_CREDENTIALS, | |
| 1898 RequestAction::MAX); | |
| 1858 } | 1899 } |
| 1859 | 1900 |
| 1860 // This triggers onErrorOccurred if canceled is true. | 1901 // This triggers onErrorOccurred if canceled is true. |
| 1861 int rv = canceled ? net::ERR_BLOCKED_BY_CLIENT : net::OK; | 1902 int rv = canceled ? net::ERR_BLOCKED_BY_CLIENT : net::OK; |
| 1862 | 1903 |
| 1863 if (!blocked_request.callback.is_null()) { | 1904 if (!blocked_request.callback.is_null()) { |
| 1864 net::CompletionCallback callback = blocked_request.callback; | 1905 net::CompletionCallback callback = blocked_request.callback; |
| 1865 // Ensure that request is removed before callback because the callback | 1906 // Ensure that request is removed before callback because the callback |
| 1866 // might trigger the next event. | 1907 // might trigger the next event. |
| 1867 blocked_requests_.erase(request_id); | 1908 blocked_requests_.erase(request_id); |
| (...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2390 // Since EventListeners are segmented by browser_context, check that | 2431 // Since EventListeners are segmented by browser_context, check that |
| 2391 // last, as it is exceedingly unlikely to be different. | 2432 // last, as it is exceedingly unlikely to be different. |
| 2392 return extension_id == that.extension_id && | 2433 return extension_id == that.extension_id && |
| 2393 sub_event_name == that.sub_event_name && | 2434 sub_event_name == that.sub_event_name && |
| 2394 web_view_instance_id == that.web_view_instance_id && | 2435 web_view_instance_id == that.web_view_instance_id && |
| 2395 embedder_process_id == that.embedder_process_id && | 2436 embedder_process_id == that.embedder_process_id && |
| 2396 browser_context == that.browser_context; | 2437 browser_context == that.browser_context; |
| 2397 } | 2438 } |
| 2398 | 2439 |
| 2399 } // namespace extensions | 2440 } // namespace extensions |
| OLD | NEW |