| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/browser/api/web_request/web_request_api.h" | 5 #include "extensions/browser/api/web_request/web_request_api.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <memory> | 10 #include <memory> |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |