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

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

Issue 2335133003: PlzNavigate: support the WebRequest API (Closed)
Patch Set: Added missing comment Created 4 years, 3 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>
11 #include <utility> 11 #include <utility>
12 #include <vector> 12 #include <vector>
13 13
14 #include "base/bind.h" 14 #include "base/bind.h"
15 #include "base/bind_helpers.h" 15 #include "base/bind_helpers.h"
16 #include "base/json/json_writer.h" 16 #include "base/json/json_writer.h"
17 #include "base/lazy_instance.h" 17 #include "base/lazy_instance.h"
18 #include "base/macros.h" 18 #include "base/macros.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/browser_side_navigation_policy.h"
28 #include "content/public/common/child_process_host.h" 29 #include "content/public/common/child_process_host.h"
29 #include "extensions/browser/api/activity_log/web_request_constants.h" 30 #include "extensions/browser/api/activity_log/web_request_constants.h"
30 #include "extensions/browser/api/declarative/rules_registry_service.h" 31 #include "extensions/browser/api/declarative/rules_registry_service.h"
31 #include "extensions/browser/api/declarative_webrequest/request_stage.h" 32 #include "extensions/browser/api/declarative_webrequest/request_stage.h"
32 #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h" 33 #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h"
33 #include "extensions/browser/api/declarative_webrequest/webrequest_rules_registr y.h" 34 #include "extensions/browser/api/declarative_webrequest/webrequest_rules_registr y.h"
34 #include "extensions/browser/api/extensions_api_client.h" 35 #include "extensions/browser/api/extensions_api_client.h"
35 #include "extensions/browser/api/web_request/web_request_api_constants.h" 36 #include "extensions/browser/api/web_request/web_request_api_constants.h"
36 #include "extensions/browser/api/web_request/web_request_api_helpers.h" 37 #include "extensions/browser/api/web_request/web_request_api_helpers.h"
37 #include "extensions/browser/api/web_request/web_request_event_details.h" 38 #include "extensions/browser/api/web_request/web_request_event_details.h"
38 #include "extensions/browser/api/web_request/web_request_event_router_delegate.h " 39 #include "extensions/browser/api/web_request/web_request_event_router_delegate.h "
39 #include "extensions/browser/api/web_request/web_request_time_tracker.h" 40 #include "extensions/browser/api/web_request/web_request_time_tracker.h"
40 #include "extensions/browser/api_activity_monitor.h" 41 #include "extensions/browser/api_activity_monitor.h"
41 #include "extensions/browser/event_router.h" 42 #include "extensions/browser/event_router.h"
43 #include "extensions/browser/extension_navigation_ui_data.h"
42 #include "extensions/browser/extension_prefs.h" 44 #include "extensions/browser/extension_prefs.h"
43 #include "extensions/browser/extension_registry.h" 45 #include "extensions/browser/extension_registry.h"
44 #include "extensions/browser/extension_system.h" 46 #include "extensions/browser/extension_system.h"
45 #include "extensions/browser/extensions_browser_client.h" 47 #include "extensions/browser/extensions_browser_client.h"
46 #include "extensions/browser/guest_view/guest_view_events.h" 48 #include "extensions/browser/guest_view/guest_view_events.h"
47 #include "extensions/browser/guest_view/web_view/web_view_constants.h" 49 #include "extensions/browser/guest_view/web_view/web_view_constants.h"
48 #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" 50 #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h"
49 #include "extensions/browser/info_map.h" 51 #include "extensions/browser/info_map.h"
50 #include "extensions/browser/io_thread_extension_message_filter.h" 52 #include "extensions/browser/io_thread_extension_message_filter.h"
51 #include "extensions/browser/runtime_data.h" 53 #include "extensions/browser/runtime_data.h"
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after
548 int extra_info_spec) { 550 int extra_info_spec) {
549 std::unique_ptr<WebRequestEventDetails> event_details( 551 std::unique_ptr<WebRequestEventDetails> event_details(
550 new WebRequestEventDetails(request, extra_info_spec)); 552 new WebRequestEventDetails(request, extra_info_spec));
551 553
552 return event_details; 554 return event_details;
553 } 555 }
554 556
555 int ExtensionWebRequestEventRouter::OnBeforeRequest( 557 int ExtensionWebRequestEventRouter::OnBeforeRequest(
556 void* browser_context, 558 void* browser_context,
557 const InfoMap* extension_info_map, 559 const InfoMap* extension_info_map,
560 ExtensionNavigationUIData* navigation_ui_data,
558 net::URLRequest* request, 561 net::URLRequest* request,
559 const net::CompletionCallback& callback, 562 const net::CompletionCallback& callback,
560 GURL* new_url) { 563 GURL* new_url) {
561 if (ShouldHideEvent(browser_context, extension_info_map, request)) 564 if (ShouldHideEvent(browser_context, extension_info_map, request))
562 return net::OK; 565 return net::OK;
563 566
564 if (IsPageLoad(request)) 567 if (IsPageLoad(request))
565 NotifyPageLoad(); 568 NotifyPageLoad();
566 569
567 request_time_tracker_->LogRequestStartTime(request->identifier(), 570 request_time_tracker_->LogRequestStartTime(request->identifier(),
(...skipping 12 matching lines...) Expand all
580 int extra_info_spec = 0; 583 int extra_info_spec = 0;
581 RawListeners listeners = GetMatchingListeners( 584 RawListeners listeners = GetMatchingListeners(
582 browser_context, extension_info_map, 585 browser_context, extension_info_map,
583 web_request::OnBeforeRequest::kEventName, request, &extra_info_spec); 586 web_request::OnBeforeRequest::kEventName, request, &extra_info_spec);
584 if (!listeners.empty() && 587 if (!listeners.empty() &&
585 !GetAndSetSignaled(request->identifier(), kOnBeforeRequest)) { 588 !GetAndSetSignaled(request->identifier(), kOnBeforeRequest)) {
586 std::unique_ptr<WebRequestEventDetails> event_details( 589 std::unique_ptr<WebRequestEventDetails> event_details(
587 CreateEventDetails(request, extra_info_spec)); 590 CreateEventDetails(request, extra_info_spec));
588 event_details->SetRequestBody(request); 591 event_details->SetRequestBody(request);
589 592
590 initialize_blocked_requests |= DispatchEvent( 593 initialize_blocked_requests |=
591 browser_context, request, listeners, std::move(event_details)); 594 DispatchEvent(browser_context, request, listeners, navigation_ui_data,
595 std::move(event_details));
592 } 596 }
593 597
594 if (!initialize_blocked_requests) 598 if (!initialize_blocked_requests)
595 return net::OK; // Nobody saw a reason for modifying the request. 599 return net::OK; // Nobody saw a reason for modifying the request.
596 600
597 BlockedRequest& blocked_request = blocked_requests_[request->identifier()]; 601 BlockedRequest& blocked_request = blocked_requests_[request->identifier()];
598 blocked_request.event = kOnBeforeRequest; 602 blocked_request.event = kOnBeforeRequest;
599 blocked_request.is_incognito |= IsIncognitoBrowserContext(browser_context); 603 blocked_request.is_incognito |= IsIncognitoBrowserContext(browser_context);
600 blocked_request.request = request; 604 blocked_request.request = request;
601 blocked_request.callback = callback; 605 blocked_request.callback = callback;
602 blocked_request.new_url = new_url; 606 blocked_request.new_url = new_url;
603 blocked_request.net_log = &request->net_log(); 607 blocked_request.net_log = &request->net_log();
604 608
605 if (blocked_request.num_handlers_blocking == 0) { 609 if (blocked_request.num_handlers_blocking == 0) {
606 // If there are no blocking handlers, only the declarative rules tried 610 // If there are no blocking handlers, only the declarative rules tried
607 // to modify the request and we can respond synchronously. 611 // to modify the request and we can respond synchronously.
608 return ExecuteDeltas(browser_context, request->identifier(), 612 return ExecuteDeltas(browser_context, request->identifier(),
609 false /* call_callback*/); 613 false /* call_callback*/);
610 } 614 }
611 return net::ERR_IO_PENDING; 615 return net::ERR_IO_PENDING;
612 } 616 }
613 617
614 int ExtensionWebRequestEventRouter::OnBeforeSendHeaders( 618 int ExtensionWebRequestEventRouter::OnBeforeSendHeaders(
615 void* browser_context, 619 void* browser_context,
616 const InfoMap* extension_info_map, 620 const InfoMap* extension_info_map,
621 ExtensionNavigationUIData* navigation_ui_data,
617 net::URLRequest* request, 622 net::URLRequest* request,
618 const net::CompletionCallback& callback, 623 const net::CompletionCallback& callback,
619 net::HttpRequestHeaders* headers) { 624 net::HttpRequestHeaders* headers) {
620 if (ShouldHideEvent(browser_context, extension_info_map, request)) 625 if (ShouldHideEvent(browser_context, extension_info_map, request))
621 return net::OK; 626 return net::OK;
622 627
623 bool initialize_blocked_requests = false; 628 bool initialize_blocked_requests = false;
624 629
625 initialize_blocked_requests |= ProcessDeclarativeRules( 630 initialize_blocked_requests |= ProcessDeclarativeRules(
626 browser_context, extension_info_map, keys::kOnBeforeSendHeadersEvent, 631 browser_context, extension_info_map, keys::kOnBeforeSendHeadersEvent,
627 request, ON_BEFORE_SEND_HEADERS, NULL); 632 request, ON_BEFORE_SEND_HEADERS, NULL);
628 633
629 int extra_info_spec = 0; 634 int extra_info_spec = 0;
630 RawListeners listeners = GetMatchingListeners( 635 RawListeners listeners = GetMatchingListeners(
631 browser_context, extension_info_map, keys::kOnBeforeSendHeadersEvent, 636 browser_context, extension_info_map, keys::kOnBeforeSendHeadersEvent,
632 request, &extra_info_spec); 637 request, &extra_info_spec);
633 if (!listeners.empty() && 638 if (!listeners.empty() &&
634 !GetAndSetSignaled(request->identifier(), kOnBeforeSendHeaders)) { 639 !GetAndSetSignaled(request->identifier(), kOnBeforeSendHeaders)) {
635 std::unique_ptr<WebRequestEventDetails> event_details( 640 std::unique_ptr<WebRequestEventDetails> event_details(
636 CreateEventDetails(request, extra_info_spec)); 641 CreateEventDetails(request, extra_info_spec));
637 event_details->SetRequestHeaders(*headers); 642 event_details->SetRequestHeaders(*headers);
638 643
639 initialize_blocked_requests |= DispatchEvent( 644 initialize_blocked_requests |=
640 browser_context, request, listeners, std::move(event_details)); 645 DispatchEvent(browser_context, request, listeners, navigation_ui_data,
646 std::move(event_details));
641 } 647 }
642 648
643 if (!initialize_blocked_requests) 649 if (!initialize_blocked_requests)
644 return net::OK; // Nobody saw a reason for modifying the request. 650 return net::OK; // Nobody saw a reason for modifying the request.
645 651
646 BlockedRequest& blocked_request = blocked_requests_[request->identifier()]; 652 BlockedRequest& blocked_request = blocked_requests_[request->identifier()];
647 blocked_request.event = kOnBeforeSendHeaders; 653 blocked_request.event = kOnBeforeSendHeaders;
648 blocked_request.is_incognito |= IsIncognitoBrowserContext(browser_context); 654 blocked_request.is_incognito |= IsIncognitoBrowserContext(browser_context);
649 blocked_request.request = request; 655 blocked_request.request = request;
650 blocked_request.callback = callback; 656 blocked_request.callback = callback;
651 blocked_request.request_headers = headers; 657 blocked_request.request_headers = headers;
652 blocked_request.net_log = &request->net_log(); 658 blocked_request.net_log = &request->net_log();
653 659
654 if (blocked_request.num_handlers_blocking == 0) { 660 if (blocked_request.num_handlers_blocking == 0) {
655 // If there are no blocking handlers, only the declarative rules tried 661 // If there are no blocking handlers, only the declarative rules tried
656 // to modify the request and we can respond synchronously. 662 // to modify the request and we can respond synchronously.
657 return ExecuteDeltas(browser_context, request->identifier(), 663 return ExecuteDeltas(browser_context, request->identifier(),
658 false /* call_callback*/); 664 false /* call_callback*/);
659 } 665 }
660 return net::ERR_IO_PENDING; 666 return net::ERR_IO_PENDING;
661 } 667 }
662 668
663 void ExtensionWebRequestEventRouter::OnSendHeaders( 669 void ExtensionWebRequestEventRouter::OnSendHeaders(
664 void* browser_context, 670 void* browser_context,
665 const InfoMap* extension_info_map, 671 const InfoMap* extension_info_map,
672 ExtensionNavigationUIData* navigation_ui_data,
666 net::URLRequest* request, 673 net::URLRequest* request,
667 const net::HttpRequestHeaders& headers) { 674 const net::HttpRequestHeaders& headers) {
668 if (ShouldHideEvent(browser_context, extension_info_map, request)) 675 if (ShouldHideEvent(browser_context, extension_info_map, request))
669 return; 676 return;
670 677
671 if (GetAndSetSignaled(request->identifier(), kOnSendHeaders)) 678 if (GetAndSetSignaled(request->identifier(), kOnSendHeaders))
672 return; 679 return;
673 680
674 ClearSignaled(request->identifier(), kOnBeforeRedirect); 681 ClearSignaled(request->identifier(), kOnBeforeRedirect);
675 682
676 int extra_info_spec = 0; 683 int extra_info_spec = 0;
677 RawListeners listeners = GetMatchingListeners( 684 RawListeners listeners = GetMatchingListeners(
678 browser_context, extension_info_map, keys::kOnSendHeadersEvent, request, 685 browser_context, extension_info_map, keys::kOnSendHeadersEvent, request,
679 &extra_info_spec); 686 &extra_info_spec);
680 if (listeners.empty()) 687 if (listeners.empty())
681 return; 688 return;
682 689
683 std::unique_ptr<WebRequestEventDetails> event_details( 690 std::unique_ptr<WebRequestEventDetails> event_details(
684 CreateEventDetails(request, extra_info_spec)); 691 CreateEventDetails(request, extra_info_spec));
685 event_details->SetRequestHeaders(headers); 692 event_details->SetRequestHeaders(headers);
686 693
687 DispatchEvent(browser_context, request, listeners, std::move(event_details)); 694 DispatchEvent(browser_context, request, listeners, navigation_ui_data,
695 std::move(event_details));
688 } 696 }
689 697
690 int ExtensionWebRequestEventRouter::OnHeadersReceived( 698 int ExtensionWebRequestEventRouter::OnHeadersReceived(
691 void* browser_context, 699 void* browser_context,
692 const InfoMap* extension_info_map, 700 const InfoMap* extension_info_map,
701 ExtensionNavigationUIData* navigation_ui_data,
693 net::URLRequest* request, 702 net::URLRequest* request,
694 const net::CompletionCallback& callback, 703 const net::CompletionCallback& callback,
695 const net::HttpResponseHeaders* original_response_headers, 704 const net::HttpResponseHeaders* original_response_headers,
696 scoped_refptr<net::HttpResponseHeaders>* override_response_headers, 705 scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
697 GURL* allowed_unsafe_redirect_url) { 706 GURL* allowed_unsafe_redirect_url) {
698 if (ShouldHideEvent(browser_context, extension_info_map, request)) 707 if (ShouldHideEvent(browser_context, extension_info_map, request))
699 return net::OK; 708 return net::OK;
700 709
701 bool initialize_blocked_requests = false; 710 bool initialize_blocked_requests = false;
702 711
703 initialize_blocked_requests |= ProcessDeclarativeRules( 712 initialize_blocked_requests |= ProcessDeclarativeRules(
704 browser_context, extension_info_map, keys::kOnHeadersReceivedEvent, 713 browser_context, extension_info_map, keys::kOnHeadersReceivedEvent,
705 request, ON_HEADERS_RECEIVED, original_response_headers); 714 request, ON_HEADERS_RECEIVED, original_response_headers);
706 715
707 int extra_info_spec = 0; 716 int extra_info_spec = 0;
708 RawListeners listeners = GetMatchingListeners( 717 RawListeners listeners = GetMatchingListeners(
709 browser_context, extension_info_map, keys::kOnHeadersReceivedEvent, 718 browser_context, extension_info_map, keys::kOnHeadersReceivedEvent,
710 request, &extra_info_spec); 719 request, &extra_info_spec);
711 720
712 if (!listeners.empty() && 721 if (!listeners.empty() &&
713 !GetAndSetSignaled(request->identifier(), kOnHeadersReceived)) { 722 !GetAndSetSignaled(request->identifier(), kOnHeadersReceived)) {
714 std::unique_ptr<WebRequestEventDetails> event_details( 723 std::unique_ptr<WebRequestEventDetails> event_details(
715 CreateEventDetails(request, extra_info_spec)); 724 CreateEventDetails(request, extra_info_spec));
716 event_details->SetResponseHeaders(request, original_response_headers); 725 event_details->SetResponseHeaders(request, original_response_headers);
717 726
718 initialize_blocked_requests |= DispatchEvent( 727 initialize_blocked_requests |=
719 browser_context, request, listeners, std::move(event_details)); 728 DispatchEvent(browser_context, request, listeners, navigation_ui_data,
729 std::move(event_details));
720 } 730 }
721 731
722 if (!initialize_blocked_requests) 732 if (!initialize_blocked_requests)
723 return net::OK; // Nobody saw a reason for modifying the request. 733 return net::OK; // Nobody saw a reason for modifying the request.
724 734
725 BlockedRequest& blocked_request = blocked_requests_[request->identifier()]; 735 BlockedRequest& blocked_request = blocked_requests_[request->identifier()];
726 blocked_request.event = kOnHeadersReceived; 736 blocked_request.event = kOnHeadersReceived;
727 blocked_request.is_incognito |= IsIncognitoBrowserContext(browser_context); 737 blocked_request.is_incognito |= IsIncognitoBrowserContext(browser_context);
728 blocked_request.request = request; 738 blocked_request.request = request;
729 blocked_request.callback = callback; 739 blocked_request.callback = callback;
730 blocked_request.net_log = &request->net_log(); 740 blocked_request.net_log = &request->net_log();
731 blocked_request.override_response_headers = override_response_headers; 741 blocked_request.override_response_headers = override_response_headers;
732 blocked_request.original_response_headers = original_response_headers; 742 blocked_request.original_response_headers = original_response_headers;
733 blocked_request.new_url = allowed_unsafe_redirect_url; 743 blocked_request.new_url = allowed_unsafe_redirect_url;
734 744
735 if (blocked_request.num_handlers_blocking == 0) { 745 if (blocked_request.num_handlers_blocking == 0) {
736 // If there are no blocking handlers, only the declarative rules tried 746 // If there are no blocking handlers, only the declarative rules tried
737 // to modify the request and we can respond synchronously. 747 // to modify the request and we can respond synchronously.
738 return ExecuteDeltas(browser_context, request->identifier(), 748 return ExecuteDeltas(browser_context, request->identifier(),
739 false /* call_callback*/); 749 false /* call_callback*/);
740 } 750 }
741 return net::ERR_IO_PENDING; 751 return net::ERR_IO_PENDING;
742 } 752 }
743 753
744 net::NetworkDelegate::AuthRequiredResponse 754 net::NetworkDelegate::AuthRequiredResponse
745 ExtensionWebRequestEventRouter::OnAuthRequired( 755 ExtensionWebRequestEventRouter::OnAuthRequired(
746 void* browser_context, 756 void* browser_context,
747 const InfoMap* extension_info_map, 757 const InfoMap* extension_info_map,
758 ExtensionNavigationUIData* navigation_ui_data,
748 net::URLRequest* request, 759 net::URLRequest* request,
749 const net::AuthChallengeInfo& auth_info, 760 const net::AuthChallengeInfo& auth_info,
750 const net::NetworkDelegate::AuthCallback& callback, 761 const net::NetworkDelegate::AuthCallback& callback,
751 net::AuthCredentials* credentials) { 762 net::AuthCredentials* credentials) {
752 // No browser_context means that this is for authentication challenges in the 763 // No browser_context means that this is for authentication challenges in the
753 // system context. Skip in that case. Also skip sensitive requests. 764 // system context. Skip in that case. Also skip sensitive requests.
754 if (!browser_context || 765 if (!browser_context ||
755 WebRequestPermissions::HideRequest(extension_info_map, request)) { 766 WebRequestPermissions::HideRequest(extension_info_map, request)) {
756 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; 767 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION;
757 } 768 }
758 769
759 int extra_info_spec = 0; 770 int extra_info_spec = 0;
760 RawListeners listeners = GetMatchingListeners( 771 RawListeners listeners = GetMatchingListeners(
761 browser_context, extension_info_map, keys::kOnAuthRequiredEvent, request, 772 browser_context, extension_info_map, keys::kOnAuthRequiredEvent, request,
762 &extra_info_spec); 773 &extra_info_spec);
763 if (listeners.empty()) 774 if (listeners.empty())
764 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; 775 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION;
765 776
766 std::unique_ptr<WebRequestEventDetails> event_details( 777 std::unique_ptr<WebRequestEventDetails> event_details(
767 CreateEventDetails(request, extra_info_spec)); 778 CreateEventDetails(request, extra_info_spec));
768 event_details->SetResponseHeaders(request, request->response_headers()); 779 event_details->SetResponseHeaders(request, request->response_headers());
769 event_details->SetAuthInfo(auth_info); 780 event_details->SetAuthInfo(auth_info);
770 781
771 if (DispatchEvent(browser_context, request, listeners, 782 if (DispatchEvent(browser_context, request, listeners, navigation_ui_data,
772 std::move(event_details))) { 783 std::move(event_details))) {
773 BlockedRequest& blocked_request = blocked_requests_[request->identifier()]; 784 BlockedRequest& blocked_request = blocked_requests_[request->identifier()];
774 blocked_request.event = kOnAuthRequired; 785 blocked_request.event = kOnAuthRequired;
775 blocked_request.is_incognito |= IsIncognitoBrowserContext(browser_context); 786 blocked_request.is_incognito |= IsIncognitoBrowserContext(browser_context);
776 blocked_request.request = request; 787 blocked_request.request = request;
777 blocked_request.auth_callback = callback; 788 blocked_request.auth_callback = callback;
778 blocked_request.auth_credentials = credentials; 789 blocked_request.auth_credentials = credentials;
779 blocked_request.net_log = &request->net_log(); 790 blocked_request.net_log = &request->net_log();
780 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_IO_PENDING; 791 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_IO_PENDING;
781 } 792 }
782 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; 793 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION;
783 } 794 }
784 795
785 void ExtensionWebRequestEventRouter::OnBeforeRedirect( 796 void ExtensionWebRequestEventRouter::OnBeforeRedirect(
786 void* browser_context, 797 void* browser_context,
787 const InfoMap* extension_info_map, 798 const InfoMap* extension_info_map,
799 ExtensionNavigationUIData* navigation_ui_data,
788 net::URLRequest* request, 800 net::URLRequest* request,
789 const GURL& new_location) { 801 const GURL& new_location) {
790 if (ShouldHideEvent(browser_context, extension_info_map, request)) 802 if (ShouldHideEvent(browser_context, extension_info_map, request))
791 return; 803 return;
792 804
793 if (GetAndSetSignaled(request->identifier(), kOnBeforeRedirect)) 805 if (GetAndSetSignaled(request->identifier(), kOnBeforeRedirect))
794 return; 806 return;
795 807
796 ClearSignaled(request->identifier(), kOnBeforeRequest); 808 ClearSignaled(request->identifier(), kOnBeforeRequest);
797 ClearSignaled(request->identifier(), kOnBeforeSendHeaders); 809 ClearSignaled(request->identifier(), kOnBeforeSendHeaders);
798 ClearSignaled(request->identifier(), kOnSendHeaders); 810 ClearSignaled(request->identifier(), kOnSendHeaders);
799 ClearSignaled(request->identifier(), kOnHeadersReceived); 811 ClearSignaled(request->identifier(), kOnHeadersReceived);
800 812
801 int extra_info_spec = 0; 813 int extra_info_spec = 0;
802 RawListeners listeners = GetMatchingListeners( 814 RawListeners listeners = GetMatchingListeners(
803 browser_context, extension_info_map, keys::kOnBeforeRedirectEvent, 815 browser_context, extension_info_map, keys::kOnBeforeRedirectEvent,
804 request, &extra_info_spec); 816 request, &extra_info_spec);
805 if (listeners.empty()) 817 if (listeners.empty())
806 return; 818 return;
807 819
808 std::unique_ptr<WebRequestEventDetails> event_details( 820 std::unique_ptr<WebRequestEventDetails> event_details(
809 CreateEventDetails(request, extra_info_spec)); 821 CreateEventDetails(request, extra_info_spec));
810 event_details->SetResponseHeaders(request, request->response_headers()); 822 event_details->SetResponseHeaders(request, request->response_headers());
811 event_details->SetResponseSource(request); 823 event_details->SetResponseSource(request);
812 event_details->SetString(keys::kRedirectUrlKey, new_location.spec()); 824 event_details->SetString(keys::kRedirectUrlKey, new_location.spec());
813 825
814 DispatchEvent(browser_context, request, listeners, std::move(event_details)); 826 DispatchEvent(browser_context, request, listeners, navigation_ui_data,
827 std::move(event_details));
815 } 828 }
816 829
817 void ExtensionWebRequestEventRouter::OnResponseStarted( 830 void ExtensionWebRequestEventRouter::OnResponseStarted(
818 void* browser_context, 831 void* browser_context,
819 const InfoMap* extension_info_map, 832 const InfoMap* extension_info_map,
833 ExtensionNavigationUIData* navigation_ui_data,
820 net::URLRequest* request, 834 net::URLRequest* request,
821 int net_error) { 835 int net_error) {
822 DCHECK_NE(net::ERR_IO_PENDING, net_error); 836 DCHECK_NE(net::ERR_IO_PENDING, net_error);
823 837
824 if (ShouldHideEvent(browser_context, extension_info_map, request)) 838 if (ShouldHideEvent(browser_context, extension_info_map, request))
825 return; 839 return;
826 840
827 // OnResponseStarted is even triggered, when the request was cancelled. 841 // OnResponseStarted is even triggered, when the request was cancelled.
828 if (net_error != net::OK) 842 if (net_error != net::OK)
829 return; 843 return;
830 844
831 int extra_info_spec = 0; 845 int extra_info_spec = 0;
832 RawListeners listeners = GetMatchingListeners( 846 RawListeners listeners = GetMatchingListeners(
833 browser_context, extension_info_map, keys::kOnResponseStartedEvent, 847 browser_context, extension_info_map, keys::kOnResponseStartedEvent,
834 request, &extra_info_spec); 848 request, &extra_info_spec);
835 if (listeners.empty()) 849 if (listeners.empty())
836 return; 850 return;
837 851
838 std::unique_ptr<WebRequestEventDetails> event_details( 852 std::unique_ptr<WebRequestEventDetails> event_details(
839 CreateEventDetails(request, extra_info_spec)); 853 CreateEventDetails(request, extra_info_spec));
840 event_details->SetResponseHeaders(request, request->response_headers()); 854 event_details->SetResponseHeaders(request, request->response_headers());
841 event_details->SetResponseSource(request); 855 event_details->SetResponseSource(request);
842 856
843 DispatchEvent(browser_context, request, listeners, std::move(event_details)); 857 DispatchEvent(browser_context, request, listeners, navigation_ui_data,
858 std::move(event_details));
844 } 859 }
845 860
846 // Deprecated. 861 // Deprecated.
847 // TODO(maksims): Remove this. 862 // TODO(maksims): Remove this.
848 void ExtensionWebRequestEventRouter::OnResponseStarted( 863 void ExtensionWebRequestEventRouter::OnResponseStarted(
849 void* browser_context, 864 void* browser_context,
850 const InfoMap* extension_info_map, 865 const InfoMap* extension_info_map,
866 ExtensionNavigationUIData* navigation_ui_data,
851 net::URLRequest* request) { 867 net::URLRequest* request) {
852 OnResponseStarted(browser_context, extension_info_map, request, 868 OnResponseStarted(browser_context, extension_info_map, navigation_ui_data,
853 request->status().error()); 869 request, request->status().error());
854 } 870 }
855 871
856 void ExtensionWebRequestEventRouter::OnCompleted( 872 void ExtensionWebRequestEventRouter::OnCompleted(
857 void* browser_context, 873 void* browser_context,
858 const InfoMap* extension_info_map, 874 const InfoMap* extension_info_map,
875 ExtensionNavigationUIData* navigation_ui_data,
859 net::URLRequest* request, 876 net::URLRequest* request,
860 int net_error) { 877 int net_error) {
861 // We hide events from the system context as well as sensitive requests. 878 // We hide events from the system context as well as sensitive requests.
862 // However, if the request first became sensitive after redirecting we have 879 // However, if the request first became sensitive after redirecting we have
863 // already signaled it and thus we have to signal the end of it. This is 880 // already signaled it and thus we have to signal the end of it. This is
864 // risk-free because the handler cannot modify the request now. 881 // risk-free because the handler cannot modify the request now.
865 if (!browser_context || 882 if (!browser_context ||
866 (WebRequestPermissions::HideRequest(extension_info_map, request) && 883 (WebRequestPermissions::HideRequest(extension_info_map, request) &&
867 !WasSignaled(*request))) { 884 !WasSignaled(*request))) {
868 return; 885 return;
(...skipping 13 matching lines...) Expand all
882 GetMatchingListeners(browser_context, extension_info_map, 899 GetMatchingListeners(browser_context, extension_info_map,
883 keys::kOnCompletedEvent, request, &extra_info_spec); 900 keys::kOnCompletedEvent, request, &extra_info_spec);
884 if (listeners.empty()) 901 if (listeners.empty())
885 return; 902 return;
886 903
887 std::unique_ptr<WebRequestEventDetails> event_details( 904 std::unique_ptr<WebRequestEventDetails> event_details(
888 CreateEventDetails(request, extra_info_spec)); 905 CreateEventDetails(request, extra_info_spec));
889 event_details->SetResponseHeaders(request, request->response_headers()); 906 event_details->SetResponseHeaders(request, request->response_headers());
890 event_details->SetResponseSource(request); 907 event_details->SetResponseSource(request);
891 908
892 DispatchEvent(browser_context, request, listeners, std::move(event_details)); 909 DispatchEvent(browser_context, request, listeners, navigation_ui_data,
910 std::move(event_details));
893 } 911 }
894 912
895 // Deprecated. 913 // Deprecated.
896 // TODO(maksims): Remove this. 914 // TODO(maksims): Remove this.
897 void ExtensionWebRequestEventRouter::OnCompleted( 915 void ExtensionWebRequestEventRouter::OnCompleted(
898 void* browser_context, 916 void* browser_context,
899 const InfoMap* extension_info_map, 917 const InfoMap* extension_info_map,
918 ExtensionNavigationUIData* navigation_ui_data,
900 net::URLRequest* request) { 919 net::URLRequest* request) {
901 OnCompleted(browser_context, extension_info_map, request, 920 OnCompleted(browser_context, extension_info_map, navigation_ui_data, request,
902 request->status().error()); 921 request->status().error());
903 } 922 }
904 923
905 void ExtensionWebRequestEventRouter::OnErrorOccurred( 924 void ExtensionWebRequestEventRouter::OnErrorOccurred(
906 void* browser_context, 925 void* browser_context,
907 const InfoMap* extension_info_map, 926 const InfoMap* extension_info_map,
927 ExtensionNavigationUIData* navigation_ui_data,
908 net::URLRequest* request, 928 net::URLRequest* request,
909 bool started, 929 bool started,
910 int net_error) { 930 int net_error) {
911 // We hide events from the system context as well as sensitive requests. 931 // We hide events from the system context as well as sensitive requests.
912 // However, if the request first became sensitive after redirecting we have 932 // However, if the request first became sensitive after redirecting we have
913 // already signaled it and thus we have to signal the end of it. This is 933 // already signaled it and thus we have to signal the end of it. This is
914 // risk-free because the handler cannot modify the request now. 934 // risk-free because the handler cannot modify the request now.
915 if (!browser_context || 935 if (!browser_context ||
916 (WebRequestPermissions::HideRequest(extension_info_map, request) && 936 (WebRequestPermissions::HideRequest(extension_info_map, request) &&
917 !WasSignaled(*request))) { 937 !WasSignaled(*request))) {
(...skipping 18 matching lines...) Expand all
936 return; 956 return;
937 957
938 std::unique_ptr<WebRequestEventDetails> event_details( 958 std::unique_ptr<WebRequestEventDetails> event_details(
939 CreateEventDetails(request, extra_info_spec)); 959 CreateEventDetails(request, extra_info_spec));
940 if (started) 960 if (started)
941 event_details->SetResponseSource(request); 961 event_details->SetResponseSource(request);
942 else 962 else
943 event_details->SetBoolean(keys::kFromCache, request->was_cached()); 963 event_details->SetBoolean(keys::kFromCache, request->was_cached());
944 event_details->SetString(keys::kErrorKey, net::ErrorToString(net_error)); 964 event_details->SetString(keys::kErrorKey, net::ErrorToString(net_error));
945 965
946 DispatchEvent(browser_context, request, listeners, std::move(event_details)); 966 DispatchEvent(browser_context, request, listeners, navigation_ui_data,
967 std::move(event_details));
947 } 968 }
948 969
949 void ExtensionWebRequestEventRouter::OnErrorOccurred( 970 void ExtensionWebRequestEventRouter::OnErrorOccurred(
950 void* browser_context, 971 void* browser_context,
951 const InfoMap* extension_info_map, 972 const InfoMap* extension_info_map,
973 ExtensionNavigationUIData* navigation_ui_data,
952 net::URLRequest* request, 974 net::URLRequest* request,
953 bool started) { 975 bool started) {
954 OnErrorOccurred(browser_context, extension_info_map, request, started, 976 OnErrorOccurred(browser_context, extension_info_map, navigation_ui_data,
955 request->status().error()); 977 request, started, request->status().error());
956 } 978 }
957 979
958 void ExtensionWebRequestEventRouter::OnURLRequestDestroyed( 980 void ExtensionWebRequestEventRouter::OnURLRequestDestroyed(
959 void* browser_context, 981 void* browser_context,
960 const net::URLRequest* request) { 982 const net::URLRequest* request) {
961 ClearPendingCallbacks(request); 983 ClearPendingCallbacks(request);
962 984
963 signaled_requests_.erase(request->identifier()); 985 signaled_requests_.erase(request->identifier());
964 986
965 request_time_tracker_->LogRequestEndTime(request->identifier(), 987 request_time_tracker_->LogRequestEndTime(request->identifier(),
966 base::Time::Now()); 988 base::Time::Now());
967 } 989 }
968 990
969 void ExtensionWebRequestEventRouter::ClearPendingCallbacks( 991 void ExtensionWebRequestEventRouter::ClearPendingCallbacks(
970 const net::URLRequest* request) { 992 const net::URLRequest* request) {
971 blocked_requests_.erase(request->identifier()); 993 blocked_requests_.erase(request->identifier());
972 } 994 }
973 995
974 bool ExtensionWebRequestEventRouter::DispatchEvent( 996 bool ExtensionWebRequestEventRouter::DispatchEvent(
975 void* browser_context, 997 void* browser_context,
976 net::URLRequest* request, 998 net::URLRequest* request,
977 const RawListeners& listeners, 999 const RawListeners& listeners,
1000 ExtensionNavigationUIData* navigation_ui_data,
978 std::unique_ptr<WebRequestEventDetails> event_details) { 1001 std::unique_ptr<WebRequestEventDetails> event_details) {
979 // TODO(mpcomplete): Consider consolidating common (extension_id,json_args) 1002 // TODO(mpcomplete): Consider consolidating common (extension_id,json_args)
980 // pairs into a single message sent to a list of sub_event_names. 1003 // pairs into a single message sent to a list of sub_event_names.
981 int num_handlers_blocking = 0; 1004 int num_handlers_blocking = 0;
982 1005
983 std::unique_ptr<ListenerIDs> listeners_to_dispatch(new ListenerIDs); 1006 std::unique_ptr<ListenerIDs> listeners_to_dispatch(new ListenerIDs);
984 listeners_to_dispatch->reserve(listeners.size()); 1007 listeners_to_dispatch->reserve(listeners.size());
985 for (EventListener* listener : listeners) { 1008 for (EventListener* listener : listeners) {
986 listeners_to_dispatch->push_back(listener->id); 1009 listeners_to_dispatch->push_back(listener->id);
987 if (listener->extra_info_spec & 1010 if (listener->extra_info_spec &
988 (ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) { 1011 (ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) {
989 listener->blocked_requests.insert(request->identifier()); 1012 listener->blocked_requests.insert(request->identifier());
990 // If this is the first delegate blocking the request, go ahead and log 1013 // If this is the first delegate blocking the request, go ahead and log
991 // it. 1014 // it.
992 if (num_handlers_blocking == 0) { 1015 if (num_handlers_blocking == 0) {
993 std::string delegate_info = l10n_util::GetStringFUTF8( 1016 std::string delegate_info = l10n_util::GetStringFUTF8(
994 IDS_LOAD_STATE_PARAMETER_EXTENSION, 1017 IDS_LOAD_STATE_PARAMETER_EXTENSION,
995 base::UTF8ToUTF16(listener->extension_name)); 1018 base::UTF8ToUTF16(listener->extension_name));
996 // LobAndReport allows extensions that block requests to be displayed in 1019 // LobAndReport allows extensions that block requests to be displayed in
997 // the load status bar. 1020 // the load status bar.
998 request->LogAndReportBlockedBy(delegate_info.c_str()); 1021 request->LogAndReportBlockedBy(delegate_info.c_str());
999 } 1022 }
1000 ++num_handlers_blocking; 1023 ++num_handlers_blocking;
1001 } 1024 }
1002 } 1025 }
1003 1026
1004 event_details.release()->DetermineFrameDataOnIO(base::Bind( 1027 // PlzNavigate: if this request corresponds to a navigation, use the
1005 &ExtensionWebRequestEventRouter::DispatchEventToListeners, AsWeakPtr(), 1028 // NavigationUIData that was provided to the navigation on the UI thread to
1006 browser_context, base::Passed(&listeners_to_dispatch))); 1029 // get the FrameData.
1030 // For subresources loads, the request is first received on the IO thread,
1031 // therefore a construct such as the NavigationUIData cannot be used. Instead,
1032 // use the map of FrameData with the ids of the renderer that sent the
1033 // request.
1034 // Note: it's possible for ResourceRequestInfo to be null in certain cases
1035 // (eg when created by a URLFetcher instead of the ResourceDispatcherHost).
1036 const content::ResourceRequestInfo* info =
1037 content::ResourceRequestInfo::ForRequest(request);
1038 if (content::IsBrowserSideNavigationEnabled() && info &&
1039 IsResourceTypeFrame(info->GetResourceType())) {
1040 DCHECK(navigation_ui_data);
1041 event_details->SetFrameData(navigation_ui_data->frame_data());
1042 DispatchEventToListeners(browser_context, std::move(listeners_to_dispatch),
1043 std::move(event_details));
1044 } else {
1045 event_details.release()->DetermineFrameDataOnIO(base::Bind(
1046 &ExtensionWebRequestEventRouter::DispatchEventToListeners, AsWeakPtr(),
1047 browser_context, base::Passed(&listeners_to_dispatch)));
1048 }
1007 1049
1008 if (num_handlers_blocking > 0) { 1050 if (num_handlers_blocking > 0) {
1009 BlockedRequest& blocked_request = blocked_requests_[request->identifier()]; 1051 BlockedRequest& blocked_request = blocked_requests_[request->identifier()];
1010 blocked_request.request = request; 1052 blocked_request.request = request;
1011 blocked_request.is_incognito |= IsIncognitoBrowserContext(browser_context); 1053 blocked_request.is_incognito |= IsIncognitoBrowserContext(browser_context);
1012 blocked_request.num_handlers_blocking += num_handlers_blocking; 1054 blocked_request.num_handlers_blocking += num_handlers_blocking;
1013 blocked_request.blocking_time = base::Time::Now(); 1055 blocked_request.blocking_time = base::Time::Now();
1014 return true; 1056 return true;
1015 } 1057 }
1016 1058
(...skipping 1245 matching lines...) Expand 10 before | Expand all | Expand 10 after
2262 // Since EventListeners are segmented by browser_context, check that 2304 // Since EventListeners are segmented by browser_context, check that
2263 // last, as it is exceedingly unlikely to be different. 2305 // last, as it is exceedingly unlikely to be different.
2264 return extension_id == that.extension_id && 2306 return extension_id == that.extension_id &&
2265 sub_event_name == that.sub_event_name && 2307 sub_event_name == that.sub_event_name &&
2266 web_view_instance_id == that.web_view_instance_id && 2308 web_view_instance_id == that.web_view_instance_id &&
2267 embedder_process_id == that.embedder_process_id && 2309 embedder_process_id == that.embedder_process_id &&
2268 browser_context == that.browser_context; 2310 browser_context == that.browser_context;
2269 } 2311 }
2270 2312
2271 } // namespace extensions 2313 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698