| 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 851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 862 event_details->SetResponseHeaders(request, request->response_headers()); | 862 event_details->SetResponseHeaders(request, request->response_headers()); |
| 863 event_details->SetResponseSource(request); | 863 event_details->SetResponseSource(request); |
| 864 event_details->SetString(keys::kRedirectUrlKey, new_location.spec()); | 864 event_details->SetString(keys::kRedirectUrlKey, new_location.spec()); |
| 865 | 865 |
| 866 DispatchEvent(browser_context, request, listeners, std::move(event_details)); | 866 DispatchEvent(browser_context, request, listeners, std::move(event_details)); |
| 867 } | 867 } |
| 868 | 868 |
| 869 void ExtensionWebRequestEventRouter::OnResponseStarted( | 869 void ExtensionWebRequestEventRouter::OnResponseStarted( |
| 870 void* browser_context, | 870 void* browser_context, |
| 871 const InfoMap* extension_info_map, | 871 const InfoMap* extension_info_map, |
| 872 net::URLRequest* request) { | 872 net::URLRequest* request, |
| 873 int net_error) { |
| 874 DCHECK_NE(net::ERR_IO_PENDING, net_error); |
| 875 |
| 873 if (ShouldHideEvent(browser_context, extension_info_map, request)) | 876 if (ShouldHideEvent(browser_context, extension_info_map, request)) |
| 874 return; | 877 return; |
| 875 | 878 |
| 876 // OnResponseStarted is even triggered, when the request was cancelled. | 879 // OnResponseStarted is even triggered, when the request was cancelled. |
| 877 if (request->status().status() != net::URLRequestStatus::SUCCESS) | 880 if (net_error != net::OK) |
| 878 return; | 881 return; |
| 879 | 882 |
| 880 int extra_info_spec = 0; | 883 int extra_info_spec = 0; |
| 881 EventListeners listeners = GetMatchingListeners( | 884 EventListeners listeners = GetMatchingListeners( |
| 882 browser_context, extension_info_map, keys::kOnResponseStartedEvent, | 885 browser_context, extension_info_map, keys::kOnResponseStartedEvent, |
| 883 request, &extra_info_spec); | 886 request, &extra_info_spec); |
| 884 if (listeners.empty()) | 887 if (listeners.empty()) |
| 885 return; | 888 return; |
| 886 | 889 |
| 887 std::unique_ptr<WebRequestEventDetails> event_details( | 890 std::unique_ptr<WebRequestEventDetails> event_details( |
| 888 CreateEventDetails(request, extra_info_spec)); | 891 CreateEventDetails(request, extra_info_spec)); |
| 889 event_details->SetResponseHeaders(request, request->response_headers()); | 892 event_details->SetResponseHeaders(request, request->response_headers()); |
| 890 event_details->SetResponseSource(request); | 893 event_details->SetResponseSource(request); |
| 891 | 894 |
| 892 DispatchEvent(browser_context, request, listeners, std::move(event_details)); | 895 DispatchEvent(browser_context, request, listeners, std::move(event_details)); |
| 893 } | 896 } |
| 894 | 897 |
| 898 // Deprecated. |
| 899 // TODO(maksims): Remove this. |
| 900 void ExtensionWebRequestEventRouter::OnResponseStarted( |
| 901 void* browser_context, |
| 902 const InfoMap* extension_info_map, |
| 903 net::URLRequest* request) { |
| 904 OnResponseStarted(browser_context, extension_info_map, request, |
| 905 request->status().error()); |
| 906 } |
| 907 |
| 895 void ExtensionWebRequestEventRouter::OnCompleted( | 908 void ExtensionWebRequestEventRouter::OnCompleted( |
| 896 void* browser_context, | 909 void* browser_context, |
| 897 const InfoMap* extension_info_map, | 910 const InfoMap* extension_info_map, |
| 898 net::URLRequest* request) { | 911 net::URLRequest* request, |
| 912 int net_error) { |
| 899 // We hide events from the system context as well as sensitive requests. | 913 // We hide events from the system context as well as sensitive requests. |
| 900 // However, if the request first became sensitive after redirecting we have | 914 // However, if the request first became sensitive after redirecting we have |
| 901 // already signaled it and thus we have to signal the end of it. This is | 915 // already signaled it and thus we have to signal the end of it. This is |
| 902 // risk-free because the handler cannot modify the request now. | 916 // risk-free because the handler cannot modify the request now. |
| 903 if (!browser_context || | 917 if (!browser_context || |
| 904 (WebRequestPermissions::HideRequest(extension_info_map, request) && | 918 (WebRequestPermissions::HideRequest(extension_info_map, request) && |
| 905 !WasSignaled(*request))) { | 919 !WasSignaled(*request))) { |
| 906 return; | 920 return; |
| 907 } | 921 } |
| 908 | 922 |
| 909 request_time_tracker_->LogRequestEndTime(request->identifier(), | 923 request_time_tracker_->LogRequestEndTime(request->identifier(), |
| 910 base::Time::Now()); | 924 base::Time::Now()); |
| 911 | 925 |
| 912 DCHECK(request->status().status() == net::URLRequestStatus::SUCCESS); | 926 DCHECK_EQ(net::OK, net_error); |
| 913 | 927 |
| 914 DCHECK(!GetAndSetSignaled(request->identifier(), kOnCompleted)); | 928 DCHECK(!GetAndSetSignaled(request->identifier(), kOnCompleted)); |
| 915 | 929 |
| 916 ClearPendingCallbacks(request); | 930 ClearPendingCallbacks(request); |
| 917 | 931 |
| 918 int extra_info_spec = 0; | 932 int extra_info_spec = 0; |
| 919 EventListeners listeners = | 933 EventListeners listeners = |
| 920 GetMatchingListeners(browser_context, extension_info_map, | 934 GetMatchingListeners(browser_context, extension_info_map, |
| 921 keys::kOnCompletedEvent, request, &extra_info_spec); | 935 keys::kOnCompletedEvent, request, &extra_info_spec); |
| 922 if (listeners.empty()) | 936 if (listeners.empty()) |
| 923 return; | 937 return; |
| 924 | 938 |
| 925 std::unique_ptr<WebRequestEventDetails> event_details( | 939 std::unique_ptr<WebRequestEventDetails> event_details( |
| 926 CreateEventDetails(request, extra_info_spec)); | 940 CreateEventDetails(request, extra_info_spec)); |
| 927 event_details->SetResponseHeaders(request, request->response_headers()); | 941 event_details->SetResponseHeaders(request, request->response_headers()); |
| 928 event_details->SetResponseSource(request); | 942 event_details->SetResponseSource(request); |
| 929 | 943 |
| 930 DispatchEvent(browser_context, request, listeners, std::move(event_details)); | 944 DispatchEvent(browser_context, request, listeners, std::move(event_details)); |
| 931 } | 945 } |
| 932 | 946 |
| 947 // Deprecated. |
| 948 // TODO(maksims): Remove this. |
| 949 void ExtensionWebRequestEventRouter::OnCompleted( |
| 950 void* browser_context, |
| 951 const InfoMap* extension_info_map, |
| 952 net::URLRequest* request) { |
| 953 OnCompleted(browser_context, extension_info_map, request, |
| 954 request->status().error()); |
| 955 } |
| 956 |
| 933 void ExtensionWebRequestEventRouter::OnErrorOccurred( | 957 void ExtensionWebRequestEventRouter::OnErrorOccurred( |
| 934 void* browser_context, | 958 void* browser_context, |
| 935 const InfoMap* extension_info_map, | 959 const InfoMap* extension_info_map, |
| 936 net::URLRequest* request, | 960 net::URLRequest* request, |
| 937 bool started) { | 961 bool started, |
| 962 int net_error) { |
| 938 // We hide events from the system context as well as sensitive requests. | 963 // We hide events from the system context as well as sensitive requests. |
| 939 // However, if the request first became sensitive after redirecting we have | 964 // However, if the request first became sensitive after redirecting we have |
| 940 // already signaled it and thus we have to signal the end of it. This is | 965 // already signaled it and thus we have to signal the end of it. This is |
| 941 // risk-free because the handler cannot modify the request now. | 966 // risk-free because the handler cannot modify the request now. |
| 942 if (!browser_context || | 967 if (!browser_context || |
| 943 (WebRequestPermissions::HideRequest(extension_info_map, request) && | 968 (WebRequestPermissions::HideRequest(extension_info_map, request) && |
| 944 !WasSignaled(*request))) { | 969 !WasSignaled(*request))) { |
| 945 return; | 970 return; |
| 946 } | 971 } |
| 947 | 972 |
| 948 request_time_tracker_->LogRequestEndTime(request->identifier(), | 973 request_time_tracker_->LogRequestEndTime(request->identifier(), |
| 949 base::Time::Now()); | 974 base::Time::Now()); |
| 950 | 975 |
| 951 DCHECK(request->status().status() == net::URLRequestStatus::FAILED || | 976 DCHECK_NE(net::OK, net_error); |
| 952 request->status().status() == net::URLRequestStatus::CANCELED); | 977 DCHECK_NE(net::ERR_IO_PENDING, net_error); |
| 953 | 978 |
| 954 DCHECK(!GetAndSetSignaled(request->identifier(), kOnErrorOccurred)); | 979 DCHECK(!GetAndSetSignaled(request->identifier(), kOnErrorOccurred)); |
| 955 | 980 |
| 956 ClearPendingCallbacks(request); | 981 ClearPendingCallbacks(request); |
| 957 | 982 |
| 958 int extra_info_spec = 0; | 983 int extra_info_spec = 0; |
| 959 EventListeners listeners = GetMatchingListeners( | 984 EventListeners listeners = GetMatchingListeners( |
| 960 browser_context, extension_info_map, | 985 browser_context, extension_info_map, |
| 961 web_request::OnErrorOccurred::kEventName, request, &extra_info_spec); | 986 web_request::OnErrorOccurred::kEventName, request, &extra_info_spec); |
| 962 if (listeners.empty()) | 987 if (listeners.empty()) |
| 963 return; | 988 return; |
| 964 | 989 |
| 965 std::unique_ptr<WebRequestEventDetails> event_details( | 990 std::unique_ptr<WebRequestEventDetails> event_details( |
| 966 CreateEventDetails(request, extra_info_spec)); | 991 CreateEventDetails(request, extra_info_spec)); |
| 967 if (started) | 992 if (started) |
| 968 event_details->SetResponseSource(request); | 993 event_details->SetResponseSource(request); |
| 969 else | 994 else |
| 970 event_details->SetBoolean(keys::kFromCache, request->was_cached()); | 995 event_details->SetBoolean(keys::kFromCache, request->was_cached()); |
| 971 event_details->SetString(keys::kErrorKey, | 996 event_details->SetString(keys::kErrorKey, net::ErrorToString(net_error)); |
| 972 net::ErrorToString(request->status().error())); | |
| 973 | 997 |
| 974 DispatchEvent(browser_context, request, listeners, std::move(event_details)); | 998 DispatchEvent(browser_context, request, listeners, std::move(event_details)); |
| 975 } | 999 } |
| 976 | 1000 |
| 1001 void ExtensionWebRequestEventRouter::OnErrorOccurred( |
| 1002 void* browser_context, |
| 1003 const InfoMap* extension_info_map, |
| 1004 net::URLRequest* request, |
| 1005 bool started) { |
| 1006 OnErrorOccurred(browser_context, extension_info_map, request, started, |
| 1007 request->status().error()); |
| 1008 } |
| 1009 |
| 977 void ExtensionWebRequestEventRouter::OnURLRequestDestroyed( | 1010 void ExtensionWebRequestEventRouter::OnURLRequestDestroyed( |
| 978 void* browser_context, | 1011 void* browser_context, |
| 979 const net::URLRequest* request) { | 1012 const net::URLRequest* request) { |
| 980 ClearPendingCallbacks(request); | 1013 ClearPendingCallbacks(request); |
| 981 | 1014 |
| 982 signaled_requests_.erase(request->identifier()); | 1015 signaled_requests_.erase(request->identifier()); |
| 983 | 1016 |
| 984 request_time_tracker_->LogRequestEndTime(request->identifier(), | 1017 request_time_tracker_->LogRequestEndTime(request->identifier(), |
| 985 base::Time::Now()); | 1018 base::Time::Now()); |
| 986 } | 1019 } |
| (...skipping 1265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2252 RunWithValidation()->Execute(); | 2285 RunWithValidation()->Execute(); |
| 2253 } | 2286 } |
| 2254 | 2287 |
| 2255 ExtensionFunction::ResponseAction | 2288 ExtensionFunction::ResponseAction |
| 2256 WebRequestHandlerBehaviorChangedFunction::Run() { | 2289 WebRequestHandlerBehaviorChangedFunction::Run() { |
| 2257 helpers::ClearCacheOnNavigation(); | 2290 helpers::ClearCacheOnNavigation(); |
| 2258 return RespondNow(NoArguments()); | 2291 return RespondNow(NoArguments()); |
| 2259 } | 2292 } |
| 2260 | 2293 |
| 2261 } // namespace extensions | 2294 } // namespace extensions |
| OLD | NEW |