| 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 <utility> | 11 #include <utility> |
| 11 #include <vector> | 12 #include <vector> |
| 12 | 13 |
| 13 #include "base/bind.h" | 14 #include "base/bind.h" |
| 14 #include "base/bind_helpers.h" | 15 #include "base/bind_helpers.h" |
| 15 #include "base/json/json_writer.h" | 16 #include "base/json/json_writer.h" |
| 16 #include "base/lazy_instance.h" | 17 #include "base/lazy_instance.h" |
| 17 #include "base/macros.h" | 18 #include "base/macros.h" |
| 18 #include "base/memory/scoped_ptr.h" | |
| 19 #include "base/metrics/histogram.h" | 19 #include "base/metrics/histogram.h" |
| 20 #include "base/strings/string_number_conversions.h" | 20 #include "base/strings/string_number_conversions.h" |
| 21 #include "base/strings/string_util.h" | 21 #include "base/strings/string_util.h" |
| 22 #include "base/strings/utf_string_conversions.h" | 22 #include "base/strings/utf_string_conversions.h" |
| 23 #include "base/time/time.h" | 23 #include "base/time/time.h" |
| 24 #include "base/values.h" | 24 #include "base/values.h" |
| 25 #include "content/public/browser/browser_thread.h" | 25 #include "content/public/browser/browser_thread.h" |
| 26 #include "content/public/browser/resource_request_info.h" | 26 #include "content/public/browser/resource_request_info.h" |
| 27 #include "content/public/browser/user_metrics.h" | 27 #include "content/public/browser/user_metrics.h" |
| 28 #include "content/public/common/child_process_host.h" | 28 #include "content/public/common/child_process_host.h" |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 // |extension_id| identifies the extension that sends and receives the event. | 227 // |extension_id| identifies the extension that sends and receives the event. |
| 228 // |is_web_view_guest| indicates whether the action is for a <webview>. | 228 // |is_web_view_guest| indicates whether the action is for a <webview>. |
| 229 // |web_view_info| is a struct containing information about the <webview> | 229 // |web_view_info| is a struct containing information about the <webview> |
| 230 // embedder. | 230 // embedder. |
| 231 // |event_details| is passed to the event listener. | 231 // |event_details| is passed to the event listener. |
| 232 void SendOnMessageEventOnUI( | 232 void SendOnMessageEventOnUI( |
| 233 void* browser_context_id, | 233 void* browser_context_id, |
| 234 const std::string& extension_id, | 234 const std::string& extension_id, |
| 235 bool is_web_view_guest, | 235 bool is_web_view_guest, |
| 236 const WebViewRendererState::WebViewInfo& web_view_info, | 236 const WebViewRendererState::WebViewInfo& web_view_info, |
| 237 scoped_ptr<WebRequestEventDetails> event_details) { | 237 std::unique_ptr<WebRequestEventDetails> event_details) { |
| 238 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 238 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 239 | 239 |
| 240 content::BrowserContext* browser_context = | 240 content::BrowserContext* browser_context = |
| 241 reinterpret_cast<content::BrowserContext*>(browser_context_id); | 241 reinterpret_cast<content::BrowserContext*>(browser_context_id); |
| 242 if (!ExtensionsBrowserClient::Get()->IsValidContext(browser_context)) | 242 if (!ExtensionsBrowserClient::Get()->IsValidContext(browser_context)) |
| 243 return; | 243 return; |
| 244 | 244 |
| 245 scoped_ptr<base::ListValue> event_args(new base::ListValue); | 245 std::unique_ptr<base::ListValue> event_args(new base::ListValue); |
| 246 event_details->DetermineFrameIdOnUI(); | 246 event_details->DetermineFrameIdOnUI(); |
| 247 event_args->Append(event_details->GetAndClearDict()); | 247 event_args->Append(event_details->GetAndClearDict()); |
| 248 | 248 |
| 249 EventRouter* event_router = EventRouter::Get(browser_context); | 249 EventRouter* event_router = EventRouter::Get(browser_context); |
| 250 | 250 |
| 251 EventFilteringInfo event_filtering_info; | 251 EventFilteringInfo event_filtering_info; |
| 252 | 252 |
| 253 events::HistogramValue histogram_value = events::UNKNOWN; | 253 events::HistogramValue histogram_value = events::UNKNOWN; |
| 254 std::string event_name; | 254 std::string event_name; |
| 255 // The instance ID uniquely identifies a <webview> instance within an embedder | 255 // The instance ID uniquely identifies a <webview> instance within an embedder |
| 256 // process. We use a filter here so that only event listeners for a particular | 256 // process. We use a filter here so that only event listeners for a particular |
| 257 // <webview> will fire. | 257 // <webview> will fire. |
| 258 if (is_web_view_guest) { | 258 if (is_web_view_guest) { |
| 259 event_filtering_info.SetInstanceID(web_view_info.instance_id); | 259 event_filtering_info.SetInstanceID(web_view_info.instance_id); |
| 260 histogram_value = events::WEB_VIEW_INTERNAL_ON_MESSAGE; | 260 histogram_value = events::WEB_VIEW_INTERNAL_ON_MESSAGE; |
| 261 event_name = webview::kEventMessage; | 261 event_name = webview::kEventMessage; |
| 262 } else { | 262 } else { |
| 263 histogram_value = events::DECLARATIVE_WEB_REQUEST_ON_MESSAGE; | 263 histogram_value = events::DECLARATIVE_WEB_REQUEST_ON_MESSAGE; |
| 264 event_name = declarative_keys::kOnMessage; | 264 event_name = declarative_keys::kOnMessage; |
| 265 } | 265 } |
| 266 | 266 |
| 267 scoped_ptr<Event> event(new Event( | 267 std::unique_ptr<Event> event(new Event( |
| 268 histogram_value, event_name, std::move(event_args), browser_context, | 268 histogram_value, event_name, std::move(event_args), browser_context, |
| 269 GURL(), EventRouter::USER_GESTURE_UNKNOWN, event_filtering_info)); | 269 GURL(), EventRouter::USER_GESTURE_UNKNOWN, event_filtering_info)); |
| 270 event_router->DispatchEventToExtension(extension_id, std::move(event)); | 270 event_router->DispatchEventToExtension(extension_id, std::move(event)); |
| 271 } | 271 } |
| 272 | 272 |
| 273 void RemoveEventListenerOnIOThread( | 273 void RemoveEventListenerOnIOThread( |
| 274 void* browser_context, | 274 void* browser_context, |
| 275 const std::string& extension_id, | 275 const std::string& extension_id, |
| 276 const std::string& sub_event_name, | 276 const std::string& sub_event_name, |
| 277 int embedder_process_id, | 277 int embedder_process_id, |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 587 void* browser_context, | 587 void* browser_context, |
| 588 int rules_registry_id, | 588 int rules_registry_id, |
| 589 scoped_refptr<WebRequestRulesRegistry> rules_registry) { | 589 scoped_refptr<WebRequestRulesRegistry> rules_registry) { |
| 590 RulesRegistryKey key(browser_context, rules_registry_id); | 590 RulesRegistryKey key(browser_context, rules_registry_id); |
| 591 if (rules_registry.get()) | 591 if (rules_registry.get()) |
| 592 rules_registries_[key] = rules_registry; | 592 rules_registries_[key] = rules_registry; |
| 593 else | 593 else |
| 594 rules_registries_.erase(key); | 594 rules_registries_.erase(key); |
| 595 } | 595 } |
| 596 | 596 |
| 597 scoped_ptr<WebRequestEventDetails> | 597 std::unique_ptr<WebRequestEventDetails> |
| 598 ExtensionWebRequestEventRouter::CreateEventDetails( | 598 ExtensionWebRequestEventRouter::CreateEventDetails( |
| 599 const net::URLRequest* request, | 599 const net::URLRequest* request, |
| 600 int extra_info_spec) { | 600 int extra_info_spec) { |
| 601 scoped_ptr<WebRequestEventDetails> event_details( | 601 std::unique_ptr<WebRequestEventDetails> event_details( |
| 602 new WebRequestEventDetails(request, extra_info_spec)); | 602 new WebRequestEventDetails(request, extra_info_spec)); |
| 603 | 603 |
| 604 int render_frame_id = -1; | 604 int render_frame_id = -1; |
| 605 int render_process_id = -1; | 605 int render_process_id = -1; |
| 606 int tab_id = -1; | 606 int tab_id = -1; |
| 607 ExtensionApiFrameIdMap::FrameData frame_data; | 607 ExtensionApiFrameIdMap::FrameData frame_data; |
| 608 if (content::ResourceRequestInfo::GetRenderFrameForRequest( | 608 if (content::ResourceRequestInfo::GetRenderFrameForRequest( |
| 609 request, &render_process_id, &render_frame_id) && | 609 request, &render_process_id, &render_frame_id) && |
| 610 ExtensionApiFrameIdMap::Get()->GetCachedFrameDataOnIO( | 610 ExtensionApiFrameIdMap::Get()->GetCachedFrameDataOnIO( |
| 611 render_process_id, render_frame_id, &frame_data)) { | 611 render_process_id, render_frame_id, &frame_data)) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 639 ProcessDeclarativeRules(browser_context, extension_info_map, | 639 ProcessDeclarativeRules(browser_context, extension_info_map, |
| 640 web_request::OnBeforeRequest::kEventName, request, | 640 web_request::OnBeforeRequest::kEventName, request, |
| 641 ON_BEFORE_REQUEST, NULL); | 641 ON_BEFORE_REQUEST, NULL); |
| 642 | 642 |
| 643 int extra_info_spec = 0; | 643 int extra_info_spec = 0; |
| 644 EventListeners listeners = GetMatchingListeners( | 644 EventListeners listeners = GetMatchingListeners( |
| 645 browser_context, extension_info_map, | 645 browser_context, extension_info_map, |
| 646 web_request::OnBeforeRequest::kEventName, request, &extra_info_spec); | 646 web_request::OnBeforeRequest::kEventName, request, &extra_info_spec); |
| 647 if (!listeners.empty() && | 647 if (!listeners.empty() && |
| 648 !GetAndSetSignaled(request->identifier(), kOnBeforeRequest)) { | 648 !GetAndSetSignaled(request->identifier(), kOnBeforeRequest)) { |
| 649 scoped_ptr<WebRequestEventDetails> event_details( | 649 std::unique_ptr<WebRequestEventDetails> event_details( |
| 650 CreateEventDetails(request, extra_info_spec)); | 650 CreateEventDetails(request, extra_info_spec)); |
| 651 event_details->SetRequestBody(request); | 651 event_details->SetRequestBody(request); |
| 652 | 652 |
| 653 initialize_blocked_requests |= DispatchEvent( | 653 initialize_blocked_requests |= DispatchEvent( |
| 654 browser_context, request, listeners, std::move(event_details)); | 654 browser_context, request, listeners, std::move(event_details)); |
| 655 } | 655 } |
| 656 | 656 |
| 657 if (!initialize_blocked_requests) | 657 if (!initialize_blocked_requests) |
| 658 return net::OK; // Nobody saw a reason for modifying the request. | 658 return net::OK; // Nobody saw a reason for modifying the request. |
| 659 | 659 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 688 initialize_blocked_requests |= ProcessDeclarativeRules( | 688 initialize_blocked_requests |= ProcessDeclarativeRules( |
| 689 browser_context, extension_info_map, keys::kOnBeforeSendHeadersEvent, | 689 browser_context, extension_info_map, keys::kOnBeforeSendHeadersEvent, |
| 690 request, ON_BEFORE_SEND_HEADERS, NULL); | 690 request, ON_BEFORE_SEND_HEADERS, NULL); |
| 691 | 691 |
| 692 int extra_info_spec = 0; | 692 int extra_info_spec = 0; |
| 693 EventListeners listeners = GetMatchingListeners( | 693 EventListeners listeners = GetMatchingListeners( |
| 694 browser_context, extension_info_map, keys::kOnBeforeSendHeadersEvent, | 694 browser_context, extension_info_map, keys::kOnBeforeSendHeadersEvent, |
| 695 request, &extra_info_spec); | 695 request, &extra_info_spec); |
| 696 if (!listeners.empty() && | 696 if (!listeners.empty() && |
| 697 !GetAndSetSignaled(request->identifier(), kOnBeforeSendHeaders)) { | 697 !GetAndSetSignaled(request->identifier(), kOnBeforeSendHeaders)) { |
| 698 scoped_ptr<WebRequestEventDetails> event_details( | 698 std::unique_ptr<WebRequestEventDetails> event_details( |
| 699 CreateEventDetails(request, extra_info_spec)); | 699 CreateEventDetails(request, extra_info_spec)); |
| 700 event_details->SetRequestHeaders(*headers); | 700 event_details->SetRequestHeaders(*headers); |
| 701 | 701 |
| 702 initialize_blocked_requests |= DispatchEvent( | 702 initialize_blocked_requests |= DispatchEvent( |
| 703 browser_context, request, listeners, std::move(event_details)); | 703 browser_context, request, listeners, std::move(event_details)); |
| 704 } | 704 } |
| 705 | 705 |
| 706 if (!initialize_blocked_requests) | 706 if (!initialize_blocked_requests) |
| 707 return net::OK; // Nobody saw a reason for modifying the request. | 707 return net::OK; // Nobody saw a reason for modifying the request. |
| 708 | 708 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 736 | 736 |
| 737 ClearSignaled(request->identifier(), kOnBeforeRedirect); | 737 ClearSignaled(request->identifier(), kOnBeforeRedirect); |
| 738 | 738 |
| 739 int extra_info_spec = 0; | 739 int extra_info_spec = 0; |
| 740 EventListeners listeners = GetMatchingListeners( | 740 EventListeners listeners = GetMatchingListeners( |
| 741 browser_context, extension_info_map, keys::kOnSendHeadersEvent, request, | 741 browser_context, extension_info_map, keys::kOnSendHeadersEvent, request, |
| 742 &extra_info_spec); | 742 &extra_info_spec); |
| 743 if (listeners.empty()) | 743 if (listeners.empty()) |
| 744 return; | 744 return; |
| 745 | 745 |
| 746 scoped_ptr<WebRequestEventDetails> event_details( | 746 std::unique_ptr<WebRequestEventDetails> event_details( |
| 747 CreateEventDetails(request, extra_info_spec)); | 747 CreateEventDetails(request, extra_info_spec)); |
| 748 event_details->SetRequestHeaders(headers); | 748 event_details->SetRequestHeaders(headers); |
| 749 | 749 |
| 750 DispatchEvent(browser_context, request, listeners, std::move(event_details)); | 750 DispatchEvent(browser_context, request, listeners, std::move(event_details)); |
| 751 } | 751 } |
| 752 | 752 |
| 753 int ExtensionWebRequestEventRouter::OnHeadersReceived( | 753 int ExtensionWebRequestEventRouter::OnHeadersReceived( |
| 754 void* browser_context, | 754 void* browser_context, |
| 755 const InfoMap* extension_info_map, | 755 const InfoMap* extension_info_map, |
| 756 net::URLRequest* request, | 756 net::URLRequest* request, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 767 browser_context, extension_info_map, keys::kOnHeadersReceivedEvent, | 767 browser_context, extension_info_map, keys::kOnHeadersReceivedEvent, |
| 768 request, ON_HEADERS_RECEIVED, original_response_headers); | 768 request, ON_HEADERS_RECEIVED, original_response_headers); |
| 769 | 769 |
| 770 int extra_info_spec = 0; | 770 int extra_info_spec = 0; |
| 771 EventListeners listeners = GetMatchingListeners( | 771 EventListeners listeners = GetMatchingListeners( |
| 772 browser_context, extension_info_map, keys::kOnHeadersReceivedEvent, | 772 browser_context, extension_info_map, keys::kOnHeadersReceivedEvent, |
| 773 request, &extra_info_spec); | 773 request, &extra_info_spec); |
| 774 | 774 |
| 775 if (!listeners.empty() && | 775 if (!listeners.empty() && |
| 776 !GetAndSetSignaled(request->identifier(), kOnHeadersReceived)) { | 776 !GetAndSetSignaled(request->identifier(), kOnHeadersReceived)) { |
| 777 scoped_ptr<WebRequestEventDetails> event_details( | 777 std::unique_ptr<WebRequestEventDetails> event_details( |
| 778 CreateEventDetails(request, extra_info_spec)); | 778 CreateEventDetails(request, extra_info_spec)); |
| 779 event_details->SetResponseHeaders(request, original_response_headers); | 779 event_details->SetResponseHeaders(request, original_response_headers); |
| 780 | 780 |
| 781 initialize_blocked_requests |= DispatchEvent( | 781 initialize_blocked_requests |= DispatchEvent( |
| 782 browser_context, request, listeners, std::move(event_details)); | 782 browser_context, request, listeners, std::move(event_details)); |
| 783 } | 783 } |
| 784 | 784 |
| 785 if (!initialize_blocked_requests) | 785 if (!initialize_blocked_requests) |
| 786 return net::OK; // Nobody saw a reason for modifying the request. | 786 return net::OK; // Nobody saw a reason for modifying the request. |
| 787 | 787 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 819 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; | 819 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; |
| 820 } | 820 } |
| 821 | 821 |
| 822 int extra_info_spec = 0; | 822 int extra_info_spec = 0; |
| 823 EventListeners listeners = GetMatchingListeners( | 823 EventListeners listeners = GetMatchingListeners( |
| 824 browser_context, extension_info_map, keys::kOnAuthRequiredEvent, request, | 824 browser_context, extension_info_map, keys::kOnAuthRequiredEvent, request, |
| 825 &extra_info_spec); | 825 &extra_info_spec); |
| 826 if (listeners.empty()) | 826 if (listeners.empty()) |
| 827 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; | 827 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; |
| 828 | 828 |
| 829 scoped_ptr<WebRequestEventDetails> event_details( | 829 std::unique_ptr<WebRequestEventDetails> event_details( |
| 830 CreateEventDetails(request, extra_info_spec)); | 830 CreateEventDetails(request, extra_info_spec)); |
| 831 event_details->SetResponseHeaders(request, request->response_headers()); | 831 event_details->SetResponseHeaders(request, request->response_headers()); |
| 832 event_details->SetAuthInfo(auth_info); | 832 event_details->SetAuthInfo(auth_info); |
| 833 | 833 |
| 834 if (DispatchEvent(browser_context, request, listeners, | 834 if (DispatchEvent(browser_context, request, listeners, |
| 835 std::move(event_details))) { | 835 std::move(event_details))) { |
| 836 BlockedRequest& blocked_request = blocked_requests_[request->identifier()]; | 836 BlockedRequest& blocked_request = blocked_requests_[request->identifier()]; |
| 837 blocked_request.event = kOnAuthRequired; | 837 blocked_request.event = kOnAuthRequired; |
| 838 blocked_request.is_incognito |= IsIncognitoBrowserContext(browser_context); | 838 blocked_request.is_incognito |= IsIncognitoBrowserContext(browser_context); |
| 839 blocked_request.request = request; | 839 blocked_request.request = request; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 861 ClearSignaled(request->identifier(), kOnSendHeaders); | 861 ClearSignaled(request->identifier(), kOnSendHeaders); |
| 862 ClearSignaled(request->identifier(), kOnHeadersReceived); | 862 ClearSignaled(request->identifier(), kOnHeadersReceived); |
| 863 | 863 |
| 864 int extra_info_spec = 0; | 864 int extra_info_spec = 0; |
| 865 EventListeners listeners = GetMatchingListeners( | 865 EventListeners listeners = GetMatchingListeners( |
| 866 browser_context, extension_info_map, keys::kOnBeforeRedirectEvent, | 866 browser_context, extension_info_map, keys::kOnBeforeRedirectEvent, |
| 867 request, &extra_info_spec); | 867 request, &extra_info_spec); |
| 868 if (listeners.empty()) | 868 if (listeners.empty()) |
| 869 return; | 869 return; |
| 870 | 870 |
| 871 scoped_ptr<WebRequestEventDetails> event_details( | 871 std::unique_ptr<WebRequestEventDetails> event_details( |
| 872 CreateEventDetails(request, extra_info_spec)); | 872 CreateEventDetails(request, extra_info_spec)); |
| 873 event_details->SetResponseHeaders(request, request->response_headers()); | 873 event_details->SetResponseHeaders(request, request->response_headers()); |
| 874 event_details->SetResponseSource(request); | 874 event_details->SetResponseSource(request); |
| 875 event_details->SetString(keys::kRedirectUrlKey, new_location.spec()); | 875 event_details->SetString(keys::kRedirectUrlKey, new_location.spec()); |
| 876 | 876 |
| 877 DispatchEvent(browser_context, request, listeners, std::move(event_details)); | 877 DispatchEvent(browser_context, request, listeners, std::move(event_details)); |
| 878 } | 878 } |
| 879 | 879 |
| 880 void ExtensionWebRequestEventRouter::OnResponseStarted( | 880 void ExtensionWebRequestEventRouter::OnResponseStarted( |
| 881 void* browser_context, | 881 void* browser_context, |
| 882 const InfoMap* extension_info_map, | 882 const InfoMap* extension_info_map, |
| 883 net::URLRequest* request) { | 883 net::URLRequest* request) { |
| 884 if (ShouldHideEvent(browser_context, extension_info_map, request)) | 884 if (ShouldHideEvent(browser_context, extension_info_map, request)) |
| 885 return; | 885 return; |
| 886 | 886 |
| 887 // OnResponseStarted is even triggered, when the request was cancelled. | 887 // OnResponseStarted is even triggered, when the request was cancelled. |
| 888 if (request->status().status() != net::URLRequestStatus::SUCCESS) | 888 if (request->status().status() != net::URLRequestStatus::SUCCESS) |
| 889 return; | 889 return; |
| 890 | 890 |
| 891 int extra_info_spec = 0; | 891 int extra_info_spec = 0; |
| 892 EventListeners listeners = GetMatchingListeners( | 892 EventListeners listeners = GetMatchingListeners( |
| 893 browser_context, extension_info_map, keys::kOnResponseStartedEvent, | 893 browser_context, extension_info_map, keys::kOnResponseStartedEvent, |
| 894 request, &extra_info_spec); | 894 request, &extra_info_spec); |
| 895 if (listeners.empty()) | 895 if (listeners.empty()) |
| 896 return; | 896 return; |
| 897 | 897 |
| 898 scoped_ptr<WebRequestEventDetails> event_details( | 898 std::unique_ptr<WebRequestEventDetails> event_details( |
| 899 CreateEventDetails(request, extra_info_spec)); | 899 CreateEventDetails(request, extra_info_spec)); |
| 900 event_details->SetResponseHeaders(request, request->response_headers()); | 900 event_details->SetResponseHeaders(request, request->response_headers()); |
| 901 event_details->SetResponseSource(request); | 901 event_details->SetResponseSource(request); |
| 902 | 902 |
| 903 DispatchEvent(browser_context, request, listeners, std::move(event_details)); | 903 DispatchEvent(browser_context, request, listeners, std::move(event_details)); |
| 904 } | 904 } |
| 905 | 905 |
| 906 void ExtensionWebRequestEventRouter::OnCompleted( | 906 void ExtensionWebRequestEventRouter::OnCompleted( |
| 907 void* browser_context, | 907 void* browser_context, |
| 908 const InfoMap* extension_info_map, | 908 const InfoMap* extension_info_map, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 926 | 926 |
| 927 ClearPendingCallbacks(request); | 927 ClearPendingCallbacks(request); |
| 928 | 928 |
| 929 int extra_info_spec = 0; | 929 int extra_info_spec = 0; |
| 930 EventListeners listeners = | 930 EventListeners listeners = |
| 931 GetMatchingListeners(browser_context, extension_info_map, | 931 GetMatchingListeners(browser_context, extension_info_map, |
| 932 keys::kOnCompletedEvent, request, &extra_info_spec); | 932 keys::kOnCompletedEvent, request, &extra_info_spec); |
| 933 if (listeners.empty()) | 933 if (listeners.empty()) |
| 934 return; | 934 return; |
| 935 | 935 |
| 936 scoped_ptr<WebRequestEventDetails> event_details( | 936 std::unique_ptr<WebRequestEventDetails> event_details( |
| 937 CreateEventDetails(request, extra_info_spec)); | 937 CreateEventDetails(request, extra_info_spec)); |
| 938 event_details->SetResponseHeaders(request, request->response_headers()); | 938 event_details->SetResponseHeaders(request, request->response_headers()); |
| 939 event_details->SetResponseSource(request); | 939 event_details->SetResponseSource(request); |
| 940 | 940 |
| 941 DispatchEvent(browser_context, request, listeners, std::move(event_details)); | 941 DispatchEvent(browser_context, request, listeners, std::move(event_details)); |
| 942 } | 942 } |
| 943 | 943 |
| 944 void ExtensionWebRequestEventRouter::OnErrorOccurred( | 944 void ExtensionWebRequestEventRouter::OnErrorOccurred( |
| 945 void* browser_context, | 945 void* browser_context, |
| 946 const InfoMap* extension_info_map, | 946 const InfoMap* extension_info_map, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 966 | 966 |
| 967 ClearPendingCallbacks(request); | 967 ClearPendingCallbacks(request); |
| 968 | 968 |
| 969 int extra_info_spec = 0; | 969 int extra_info_spec = 0; |
| 970 EventListeners listeners = GetMatchingListeners( | 970 EventListeners listeners = GetMatchingListeners( |
| 971 browser_context, extension_info_map, | 971 browser_context, extension_info_map, |
| 972 web_request::OnErrorOccurred::kEventName, request, &extra_info_spec); | 972 web_request::OnErrorOccurred::kEventName, request, &extra_info_spec); |
| 973 if (listeners.empty()) | 973 if (listeners.empty()) |
| 974 return; | 974 return; |
| 975 | 975 |
| 976 scoped_ptr<WebRequestEventDetails> event_details( | 976 std::unique_ptr<WebRequestEventDetails> event_details( |
| 977 CreateEventDetails(request, extra_info_spec)); | 977 CreateEventDetails(request, extra_info_spec)); |
| 978 if (started) | 978 if (started) |
| 979 event_details->SetResponseSource(request); | 979 event_details->SetResponseSource(request); |
| 980 else | 980 else |
| 981 event_details->SetBoolean(keys::kFromCache, request->was_cached()); | 981 event_details->SetBoolean(keys::kFromCache, request->was_cached()); |
| 982 event_details->SetString(keys::kErrorKey, | 982 event_details->SetString(keys::kErrorKey, |
| 983 net::ErrorToString(request->status().error())); | 983 net::ErrorToString(request->status().error())); |
| 984 | 984 |
| 985 DispatchEvent(browser_context, request, listeners, std::move(event_details)); | 985 DispatchEvent(browser_context, request, listeners, std::move(event_details)); |
| 986 } | 986 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 998 | 998 |
| 999 void ExtensionWebRequestEventRouter::ClearPendingCallbacks( | 999 void ExtensionWebRequestEventRouter::ClearPendingCallbacks( |
| 1000 const net::URLRequest* request) { | 1000 const net::URLRequest* request) { |
| 1001 blocked_requests_.erase(request->identifier()); | 1001 blocked_requests_.erase(request->identifier()); |
| 1002 } | 1002 } |
| 1003 | 1003 |
| 1004 bool ExtensionWebRequestEventRouter::DispatchEvent( | 1004 bool ExtensionWebRequestEventRouter::DispatchEvent( |
| 1005 void* browser_context, | 1005 void* browser_context, |
| 1006 net::URLRequest* request, | 1006 net::URLRequest* request, |
| 1007 const std::vector<const EventListener*>& listeners, | 1007 const std::vector<const EventListener*>& listeners, |
| 1008 scoped_ptr<WebRequestEventDetails> event_details) { | 1008 std::unique_ptr<WebRequestEventDetails> event_details) { |
| 1009 // TODO(mpcomplete): Consider consolidating common (extension_id,json_args) | 1009 // TODO(mpcomplete): Consider consolidating common (extension_id,json_args) |
| 1010 // pairs into a single message sent to a list of sub_event_names. | 1010 // pairs into a single message sent to a list of sub_event_names. |
| 1011 int num_handlers_blocking = 0; | 1011 int num_handlers_blocking = 0; |
| 1012 | 1012 |
| 1013 scoped_ptr<std::vector<EventListener>> listeners_to_dispatch( | 1013 std::unique_ptr<std::vector<EventListener>> listeners_to_dispatch( |
| 1014 new std::vector<EventListener>()); | 1014 new std::vector<EventListener>()); |
| 1015 listeners_to_dispatch->reserve(listeners.size()); | 1015 listeners_to_dispatch->reserve(listeners.size()); |
| 1016 for (const EventListener* listener : listeners) { | 1016 for (const EventListener* listener : listeners) { |
| 1017 listeners_to_dispatch->push_back(*listener); | 1017 listeners_to_dispatch->push_back(*listener); |
| 1018 if (listener->extra_info_spec & | 1018 if (listener->extra_info_spec & |
| 1019 (ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) { | 1019 (ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) { |
| 1020 listener->blocked_requests.insert(request->identifier()); | 1020 listener->blocked_requests.insert(request->identifier()); |
| 1021 // If this is the first delegate blocking the request, go ahead and log | 1021 // If this is the first delegate blocking the request, go ahead and log |
| 1022 // it. | 1022 // it. |
| 1023 if (num_handlers_blocking == 0) { | 1023 if (num_handlers_blocking == 0) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1043 blocked_request.num_handlers_blocking += num_handlers_blocking; | 1043 blocked_request.num_handlers_blocking += num_handlers_blocking; |
| 1044 blocked_request.blocking_time = base::Time::Now(); | 1044 blocked_request.blocking_time = base::Time::Now(); |
| 1045 return true; | 1045 return true; |
| 1046 } | 1046 } |
| 1047 | 1047 |
| 1048 return false; | 1048 return false; |
| 1049 } | 1049 } |
| 1050 | 1050 |
| 1051 void ExtensionWebRequestEventRouter::DispatchEventToListeners( | 1051 void ExtensionWebRequestEventRouter::DispatchEventToListeners( |
| 1052 void* browser_context, | 1052 void* browser_context, |
| 1053 scoped_ptr<std::vector<EventListener>> listeners, | 1053 std::unique_ptr<std::vector<EventListener>> listeners, |
| 1054 scoped_ptr<WebRequestEventDetails> event_details) { | 1054 std::unique_ptr<WebRequestEventDetails> event_details) { |
| 1055 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1055 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1056 DCHECK(listeners.get()); | 1056 DCHECK(listeners.get()); |
| 1057 DCHECK_GT(listeners->size(), 0UL); | 1057 DCHECK_GT(listeners->size(), 0UL); |
| 1058 DCHECK(event_details.get()); | 1058 DCHECK(event_details.get()); |
| 1059 | 1059 |
| 1060 std::string event_name = | 1060 std::string event_name = |
| 1061 EventRouter::GetBaseEventName((*listeners)[0].sub_event_name); | 1061 EventRouter::GetBaseEventName((*listeners)[0].sub_event_name); |
| 1062 DCHECK(IsWebRequestEvent(event_name)); | 1062 DCHECK(IsWebRequestEvent(event_name)); |
| 1063 | 1063 |
| 1064 const std::set<EventListener>& event_listeners = | 1064 const std::set<EventListener>& event_listeners = |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1077 continue; | 1077 continue; |
| 1078 listener = cross_event_listeners->find(target); | 1078 listener = cross_event_listeners->find(target); |
| 1079 if (listener == cross_event_listeners->end()) | 1079 if (listener == cross_event_listeners->end()) |
| 1080 continue; | 1080 continue; |
| 1081 } | 1081 } |
| 1082 | 1082 |
| 1083 if (!listener->ipc_sender.get()) | 1083 if (!listener->ipc_sender.get()) |
| 1084 continue; | 1084 continue; |
| 1085 | 1085 |
| 1086 // Filter out the optional keys that this listener didn't request. | 1086 // Filter out the optional keys that this listener didn't request. |
| 1087 scoped_ptr<base::ListValue> args_filtered(new base::ListValue); | 1087 std::unique_ptr<base::ListValue> args_filtered(new base::ListValue); |
| 1088 args_filtered->Append( | 1088 args_filtered->Append( |
| 1089 event_details->GetFilteredDict(listener->extra_info_spec)); | 1089 event_details->GetFilteredDict(listener->extra_info_spec)); |
| 1090 | 1090 |
| 1091 EventRouter::DispatchEventToSender( | 1091 EventRouter::DispatchEventToSender( |
| 1092 listener->ipc_sender.get(), browser_context, listener->extension_id, | 1092 listener->ipc_sender.get(), browser_context, listener->extension_id, |
| 1093 listener->histogram_value, listener->sub_event_name, | 1093 listener->histogram_value, listener->sub_event_name, |
| 1094 std::move(args_filtered), EventRouter::USER_GESTURE_UNKNOWN, | 1094 std::move(args_filtered), EventRouter::USER_GESTURE_UNKNOWN, |
| 1095 EventFilteringInfo()); | 1095 EventFilteringInfo()); |
| 1096 } | 1096 } |
| 1097 } | 1097 } |
| (...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1485 return helpers::CalculateOnAuthRequiredDelta( | 1485 return helpers::CalculateOnAuthRequiredDelta( |
| 1486 response->extension_id, response->extension_install_time, | 1486 response->extension_id, response->extension_install_time, |
| 1487 response->cancel, &response->auth_credentials); | 1487 response->cancel, &response->auth_credentials); |
| 1488 default: | 1488 default: |
| 1489 NOTREACHED(); | 1489 NOTREACHED(); |
| 1490 return nullptr; | 1490 return nullptr; |
| 1491 } | 1491 } |
| 1492 } | 1492 } |
| 1493 | 1493 |
| 1494 base::Value* SerializeResponseHeaders(const helpers::ResponseHeaders& headers) { | 1494 base::Value* SerializeResponseHeaders(const helpers::ResponseHeaders& headers) { |
| 1495 scoped_ptr<base::ListValue> serialized_headers(new base::ListValue()); | 1495 std::unique_ptr<base::ListValue> serialized_headers(new base::ListValue()); |
| 1496 for (const auto& it : headers) { | 1496 for (const auto& it : headers) { |
| 1497 serialized_headers->Append( | 1497 serialized_headers->Append( |
| 1498 helpers::CreateHeaderDictionary(it.first, it.second)); | 1498 helpers::CreateHeaderDictionary(it.first, it.second)); |
| 1499 } | 1499 } |
| 1500 return serialized_headers.release(); | 1500 return serialized_headers.release(); |
| 1501 } | 1501 } |
| 1502 | 1502 |
| 1503 // Convert a RequestCookieModifications/ResponseCookieModifications object to a | 1503 // Convert a RequestCookieModifications/ResponseCookieModifications object to a |
| 1504 // base::ListValue which summarizes the changes made. This is templated since | 1504 // base::ListValue which summarizes the changes made. This is templated since |
| 1505 // the two types (request/response) are different but contain essentially the | 1505 // the two types (request/response) are different but contain essentially the |
| 1506 // same fields. | 1506 // same fields. |
| 1507 template <typename CookieType> | 1507 template <typename CookieType> |
| 1508 base::ListValue* SummarizeCookieModifications( | 1508 base::ListValue* SummarizeCookieModifications( |
| 1509 const std::vector<linked_ptr<CookieType>>& modifications) { | 1509 const std::vector<linked_ptr<CookieType>>& modifications) { |
| 1510 scoped_ptr<base::ListValue> cookie_modifications(new base::ListValue()); | 1510 std::unique_ptr<base::ListValue> cookie_modifications(new base::ListValue()); |
| 1511 for (const auto& it : modifications) { | 1511 for (const auto& it : modifications) { |
| 1512 scoped_ptr<base::DictionaryValue> summary(new base::DictionaryValue()); | 1512 std::unique_ptr<base::DictionaryValue> summary(new base::DictionaryValue()); |
| 1513 const CookieType& mod = *(it.get()); | 1513 const CookieType& mod = *(it.get()); |
| 1514 switch (mod.type) { | 1514 switch (mod.type) { |
| 1515 case helpers::ADD: | 1515 case helpers::ADD: |
| 1516 summary->SetString(activity_log::kCookieModificationTypeKey, | 1516 summary->SetString(activity_log::kCookieModificationTypeKey, |
| 1517 activity_log::kCookieModificationAdd); | 1517 activity_log::kCookieModificationAdd); |
| 1518 break; | 1518 break; |
| 1519 case helpers::EDIT: | 1519 case helpers::EDIT: |
| 1520 summary->SetString(activity_log::kCookieModificationTypeKey, | 1520 summary->SetString(activity_log::kCookieModificationTypeKey, |
| 1521 activity_log::kCookieModificationEdit); | 1521 activity_log::kCookieModificationEdit); |
| 1522 break; | 1522 break; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1545 *mod.modification->name); | 1545 *mod.modification->name); |
| 1546 } | 1546 } |
| 1547 } | 1547 } |
| 1548 cookie_modifications->Append(summary.release()); | 1548 cookie_modifications->Append(summary.release()); |
| 1549 } | 1549 } |
| 1550 return cookie_modifications.release(); | 1550 return cookie_modifications.release(); |
| 1551 } | 1551 } |
| 1552 | 1552 |
| 1553 // Converts an EventResponseDelta object to a dictionary value suitable for the | 1553 // Converts an EventResponseDelta object to a dictionary value suitable for the |
| 1554 // activity log. | 1554 // activity log. |
| 1555 scoped_ptr<base::DictionaryValue> SummarizeResponseDelta( | 1555 std::unique_ptr<base::DictionaryValue> SummarizeResponseDelta( |
| 1556 const std::string& event_name, | 1556 const std::string& event_name, |
| 1557 const helpers::EventResponseDelta& delta) { | 1557 const helpers::EventResponseDelta& delta) { |
| 1558 scoped_ptr<base::DictionaryValue> details(new base::DictionaryValue()); | 1558 std::unique_ptr<base::DictionaryValue> details(new base::DictionaryValue()); |
| 1559 if (delta.cancel) | 1559 if (delta.cancel) |
| 1560 details->SetBoolean(activity_log::kCancelKey, true); | 1560 details->SetBoolean(activity_log::kCancelKey, true); |
| 1561 if (!delta.new_url.is_empty()) | 1561 if (!delta.new_url.is_empty()) |
| 1562 details->SetString(activity_log::kNewUrlKey, delta.new_url.spec()); | 1562 details->SetString(activity_log::kNewUrlKey, delta.new_url.spec()); |
| 1563 | 1563 |
| 1564 scoped_ptr<base::ListValue> modified_headers(new base::ListValue()); | 1564 std::unique_ptr<base::ListValue> modified_headers(new base::ListValue()); |
| 1565 net::HttpRequestHeaders::Iterator iter(delta.modified_request_headers); | 1565 net::HttpRequestHeaders::Iterator iter(delta.modified_request_headers); |
| 1566 while (iter.GetNext()) { | 1566 while (iter.GetNext()) { |
| 1567 modified_headers->Append( | 1567 modified_headers->Append( |
| 1568 helpers::CreateHeaderDictionary(iter.name(), iter.value())); | 1568 helpers::CreateHeaderDictionary(iter.name(), iter.value())); |
| 1569 } | 1569 } |
| 1570 if (!modified_headers->empty()) { | 1570 if (!modified_headers->empty()) { |
| 1571 details->Set(activity_log::kModifiedRequestHeadersKey, | 1571 details->Set(activity_log::kModifiedRequestHeadersKey, |
| 1572 modified_headers.release()); | 1572 modified_headers.release()); |
| 1573 } | 1573 } |
| 1574 | 1574 |
| 1575 scoped_ptr<base::ListValue> deleted_headers(new base::ListValue()); | 1575 std::unique_ptr<base::ListValue> deleted_headers(new base::ListValue()); |
| 1576 deleted_headers->AppendStrings(delta.deleted_request_headers); | 1576 deleted_headers->AppendStrings(delta.deleted_request_headers); |
| 1577 if (!deleted_headers->empty()) { | 1577 if (!deleted_headers->empty()) { |
| 1578 details->Set(activity_log::kDeletedRequestHeadersKey, | 1578 details->Set(activity_log::kDeletedRequestHeadersKey, |
| 1579 deleted_headers.release()); | 1579 deleted_headers.release()); |
| 1580 } | 1580 } |
| 1581 | 1581 |
| 1582 if (!delta.added_response_headers.empty()) { | 1582 if (!delta.added_response_headers.empty()) { |
| 1583 details->Set(activity_log::kAddedRequestHeadersKey, | 1583 details->Set(activity_log::kAddedRequestHeadersKey, |
| 1584 SerializeResponseHeaders(delta.added_response_headers)); | 1584 SerializeResponseHeaders(delta.added_response_headers)); |
| 1585 } | 1585 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1603 } | 1603 } |
| 1604 | 1604 |
| 1605 } // namespace | 1605 } // namespace |
| 1606 | 1606 |
| 1607 void ExtensionWebRequestEventRouter::LogExtensionActivity( | 1607 void ExtensionWebRequestEventRouter::LogExtensionActivity( |
| 1608 void* browser_context_id, | 1608 void* browser_context_id, |
| 1609 bool is_incognito, | 1609 bool is_incognito, |
| 1610 const std::string& extension_id, | 1610 const std::string& extension_id, |
| 1611 const GURL& url, | 1611 const GURL& url, |
| 1612 const std::string& api_call, | 1612 const std::string& api_call, |
| 1613 scoped_ptr<base::DictionaryValue> details) { | 1613 std::unique_ptr<base::DictionaryValue> details) { |
| 1614 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 1614 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| 1615 BrowserThread::PostTask( | 1615 BrowserThread::PostTask( |
| 1616 BrowserThread::UI, | 1616 BrowserThread::UI, |
| 1617 FROM_HERE, | 1617 FROM_HERE, |
| 1618 base::Bind(&ExtensionWebRequestEventRouter::LogExtensionActivity, | 1618 base::Bind(&ExtensionWebRequestEventRouter::LogExtensionActivity, |
| 1619 base::Unretained(this), | 1619 base::Unretained(this), |
| 1620 browser_context_id, | 1620 browser_context_id, |
| 1621 is_incognito, | 1621 is_incognito, |
| 1622 extension_id, | 1622 extension_id, |
| 1623 url, | 1623 url, |
| 1624 api_call, | 1624 api_call, |
| 1625 base::Passed(&details))); | 1625 base::Passed(&details))); |
| 1626 } else { | 1626 } else { |
| 1627 if (web_request_event_router_delegate_) { | 1627 if (web_request_event_router_delegate_) { |
| 1628 web_request_event_router_delegate_->LogExtensionActivity( | 1628 web_request_event_router_delegate_->LogExtensionActivity( |
| 1629 reinterpret_cast<content::BrowserContext*>(browser_context_id), | 1629 reinterpret_cast<content::BrowserContext*>(browser_context_id), |
| 1630 is_incognito, extension_id, url, api_call, std::move(details)); | 1630 is_incognito, extension_id, url, api_call, std::move(details)); |
| 1631 } | 1631 } |
| 1632 } | 1632 } |
| 1633 } | 1633 } |
| 1634 | 1634 |
| 1635 void ExtensionWebRequestEventRouter::DecrementBlockCount( | 1635 void ExtensionWebRequestEventRouter::DecrementBlockCount( |
| 1636 void* browser_context, | 1636 void* browser_context, |
| 1637 const std::string& extension_id, | 1637 const std::string& extension_id, |
| 1638 const std::string& event_name, | 1638 const std::string& event_name, |
| 1639 uint64_t request_id, | 1639 uint64_t request_id, |
| 1640 EventResponse* response) { | 1640 EventResponse* response) { |
| 1641 scoped_ptr<EventResponse> response_scoped(response); | 1641 std::unique_ptr<EventResponse> response_scoped(response); |
| 1642 | 1642 |
| 1643 // It's possible that this request was deleted, or cancelled by a previous | 1643 // It's possible that this request was deleted, or cancelled by a previous |
| 1644 // event handler. If so, ignore this response. | 1644 // event handler. If so, ignore this response. |
| 1645 auto it = blocked_requests_.find(request_id); | 1645 auto it = blocked_requests_.find(request_id); |
| 1646 if (it == blocked_requests_.end()) | 1646 if (it == blocked_requests_.end()) |
| 1647 return; | 1647 return; |
| 1648 | 1648 |
| 1649 BlockedRequest& blocked_request = it->second; | 1649 BlockedRequest& blocked_request = it->second; |
| 1650 int num_handlers_blocking = --blocked_request.num_handlers_blocking; | 1650 int num_handlers_blocking = --blocked_request.num_handlers_blocking; |
| 1651 CHECK_GE(num_handlers_blocking, 0); | 1651 CHECK_GE(num_handlers_blocking, 0); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1697 } | 1697 } |
| 1698 } | 1698 } |
| 1699 | 1699 |
| 1700 void ExtensionWebRequestEventRouter::SendMessages( | 1700 void ExtensionWebRequestEventRouter::SendMessages( |
| 1701 void* browser_context, | 1701 void* browser_context, |
| 1702 const BlockedRequest& blocked_request) { | 1702 const BlockedRequest& blocked_request) { |
| 1703 const helpers::EventResponseDeltas& deltas = blocked_request.response_deltas; | 1703 const helpers::EventResponseDeltas& deltas = blocked_request.response_deltas; |
| 1704 for (const auto& delta : deltas) { | 1704 for (const auto& delta : deltas) { |
| 1705 const std::set<std::string>& messages = delta->messages_to_extension; | 1705 const std::set<std::string>& messages = delta->messages_to_extension; |
| 1706 for (const std::string& message : messages) { | 1706 for (const std::string& message : messages) { |
| 1707 scoped_ptr<WebRequestEventDetails> event_details( | 1707 std::unique_ptr<WebRequestEventDetails> event_details( |
| 1708 CreateEventDetails(blocked_request.request, /* extra_info_spec */ 0)); | 1708 CreateEventDetails(blocked_request.request, /* extra_info_spec */ 0)); |
| 1709 WebViewRendererState::WebViewInfo web_view_info; | 1709 WebViewRendererState::WebViewInfo web_view_info; |
| 1710 bool is_web_view_guest = GetWebViewInfo(blocked_request.request, | 1710 bool is_web_view_guest = GetWebViewInfo(blocked_request.request, |
| 1711 &web_view_info); | 1711 &web_view_info); |
| 1712 event_details->SetString(keys::kMessageKey, message); | 1712 event_details->SetString(keys::kMessageKey, message); |
| 1713 event_details->SetString(keys::kStageKey, | 1713 event_details->SetString(keys::kStageKey, |
| 1714 GetRequestStageAsString(blocked_request.event)); | 1714 GetRequestStageAsString(blocked_request.event)); |
| 1715 | 1715 |
| 1716 BrowserThread::PostTask( | 1716 BrowserThread::PostTask( |
| 1717 BrowserThread::UI, FROM_HERE, | 1717 BrowserThread::UI, FROM_HERE, |
| (...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2113 profile_id(), extension_id_safe())); | 2113 profile_id(), extension_id_safe())); |
| 2114 } | 2114 } |
| 2115 | 2115 |
| 2116 return true; | 2116 return true; |
| 2117 } | 2117 } |
| 2118 | 2118 |
| 2119 void WebRequestInternalEventHandledFunction::RespondWithError( | 2119 void WebRequestInternalEventHandledFunction::RespondWithError( |
| 2120 const std::string& event_name, | 2120 const std::string& event_name, |
| 2121 const std::string& sub_event_name, | 2121 const std::string& sub_event_name, |
| 2122 uint64_t request_id, | 2122 uint64_t request_id, |
| 2123 scoped_ptr<ExtensionWebRequestEventRouter::EventResponse> response, | 2123 std::unique_ptr<ExtensionWebRequestEventRouter::EventResponse> response, |
| 2124 const std::string& error) { | 2124 const std::string& error) { |
| 2125 error_ = error; | 2125 error_ = error; |
| 2126 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( | 2126 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( |
| 2127 profile_id(), | 2127 profile_id(), |
| 2128 extension_id_safe(), | 2128 extension_id_safe(), |
| 2129 event_name, | 2129 event_name, |
| 2130 sub_event_name, | 2130 sub_event_name, |
| 2131 request_id, | 2131 request_id, |
| 2132 response.release()); | 2132 response.release()); |
| 2133 } | 2133 } |
| 2134 | 2134 |
| 2135 bool WebRequestInternalEventHandledFunction::RunSync() { | 2135 bool WebRequestInternalEventHandledFunction::RunSync() { |
| 2136 std::string event_name; | 2136 std::string event_name; |
| 2137 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); | 2137 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); |
| 2138 | 2138 |
| 2139 std::string sub_event_name; | 2139 std::string sub_event_name; |
| 2140 EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &sub_event_name)); | 2140 EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &sub_event_name)); |
| 2141 | 2141 |
| 2142 std::string request_id_str; | 2142 std::string request_id_str; |
| 2143 EXTENSION_FUNCTION_VALIDATE(args_->GetString(2, &request_id_str)); | 2143 EXTENSION_FUNCTION_VALIDATE(args_->GetString(2, &request_id_str)); |
| 2144 uint64_t request_id; | 2144 uint64_t request_id; |
| 2145 EXTENSION_FUNCTION_VALIDATE(base::StringToUint64(request_id_str, | 2145 EXTENSION_FUNCTION_VALIDATE(base::StringToUint64(request_id_str, |
| 2146 &request_id)); | 2146 &request_id)); |
| 2147 | 2147 |
| 2148 scoped_ptr<ExtensionWebRequestEventRouter::EventResponse> response; | 2148 std::unique_ptr<ExtensionWebRequestEventRouter::EventResponse> response; |
| 2149 if (HasOptionalArgument(3)) { | 2149 if (HasOptionalArgument(3)) { |
| 2150 base::DictionaryValue* value = NULL; | 2150 base::DictionaryValue* value = NULL; |
| 2151 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(3, &value)); | 2151 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(3, &value)); |
| 2152 | 2152 |
| 2153 if (!value->empty()) { | 2153 if (!value->empty()) { |
| 2154 base::Time install_time = | 2154 base::Time install_time = |
| 2155 extension_info_map()->GetInstallTime(extension_id_safe()); | 2155 extension_info_map()->GetInstallTime(extension_id_safe()); |
| 2156 response.reset(new ExtensionWebRequestEventRouter::EventResponse( | 2156 response.reset(new ExtensionWebRequestEventRouter::EventResponse( |
| 2157 extension_id_safe(), install_time)); | 2157 extension_id_safe(), install_time)); |
| 2158 } | 2158 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2189 if (has_request_headers || has_response_headers) { | 2189 if (has_request_headers || has_response_headers) { |
| 2190 if (has_request_headers && has_response_headers) { | 2190 if (has_request_headers && has_response_headers) { |
| 2191 // Allow only one of the keys, not both. | 2191 // Allow only one of the keys, not both. |
| 2192 RespondWithError(event_name, sub_event_name, request_id, | 2192 RespondWithError(event_name, sub_event_name, request_id, |
| 2193 std::move(response), | 2193 std::move(response), |
| 2194 keys::kInvalidHeaderKeyCombination); | 2194 keys::kInvalidHeaderKeyCombination); |
| 2195 return false; | 2195 return false; |
| 2196 } | 2196 } |
| 2197 | 2197 |
| 2198 base::ListValue* headers_value = NULL; | 2198 base::ListValue* headers_value = NULL; |
| 2199 scoped_ptr<net::HttpRequestHeaders> request_headers; | 2199 std::unique_ptr<net::HttpRequestHeaders> request_headers; |
| 2200 scoped_ptr<helpers::ResponseHeaders> response_headers; | 2200 std::unique_ptr<helpers::ResponseHeaders> response_headers; |
| 2201 if (has_request_headers) { | 2201 if (has_request_headers) { |
| 2202 request_headers.reset(new net::HttpRequestHeaders()); | 2202 request_headers.reset(new net::HttpRequestHeaders()); |
| 2203 EXTENSION_FUNCTION_VALIDATE(value->GetList(keys::kRequestHeadersKey, | 2203 EXTENSION_FUNCTION_VALIDATE(value->GetList(keys::kRequestHeadersKey, |
| 2204 &headers_value)); | 2204 &headers_value)); |
| 2205 } else { | 2205 } else { |
| 2206 response_headers.reset(new helpers::ResponseHeaders()); | 2206 response_headers.reset(new helpers::ResponseHeaders()); |
| 2207 EXTENSION_FUNCTION_VALIDATE(value->GetList(keys::kResponseHeadersKey, | 2207 EXTENSION_FUNCTION_VALIDATE(value->GetList(keys::kResponseHeadersKey, |
| 2208 &headers_value)); | 2208 &headers_value)); |
| 2209 } | 2209 } |
| 2210 | 2210 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2295 // Continue gracefully. | 2295 // Continue gracefully. |
| 2296 RunSync(); | 2296 RunSync(); |
| 2297 } | 2297 } |
| 2298 | 2298 |
| 2299 bool WebRequestHandlerBehaviorChangedFunction::RunSync() { | 2299 bool WebRequestHandlerBehaviorChangedFunction::RunSync() { |
| 2300 helpers::ClearCacheOnNavigation(); | 2300 helpers::ClearCacheOnNavigation(); |
| 2301 return true; | 2301 return true; |
| 2302 } | 2302 } |
| 2303 | 2303 |
| 2304 } // namespace extensions | 2304 } // namespace extensions |
| OLD | NEW |