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

Side by Side Diff: content/browser/frame_host/navigation_handle_impl.cc

Issue 2867833002: NavigationThrottle: allow customization of net::Error when blocking
Patch Set: Rebase Created 3 years, 7 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "content/browser/frame_host/navigation_handle_impl.h" 5 #include "content/browser/frame_host/navigation_handle_impl.h"
6 6
7 #include <iterator> 7 #include <iterator>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "content/browser/appcache/appcache_navigation_handle.h" 10 #include "content/browser/appcache/appcache_navigation_handle.h"
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 result = CheckWillRedirectRequest(); 347 result = CheckWillRedirectRequest();
348 } else { 348 } else {
349 result = CheckWillProcessResponse(); 349 result = CheckWillProcessResponse();
350 350
351 // If the navigation is about to proceed after having been deferred while 351 // If the navigation is about to proceed after having been deferred while
352 // processing the response, then it's ready to commit. Determine which 352 // processing the response, then it's ready to commit. Determine which
353 // RenderFrameHost should render the response, based on its site (after any 353 // RenderFrameHost should render the response, based on its site (after any
354 // redirects). 354 // redirects).
355 // Note: if MaybeTransferAndProceed returns false, this means that this 355 // Note: if MaybeTransferAndProceed returns false, this means that this
356 // NavigationHandle was deleted, so return immediately. 356 // NavigationHandle was deleted, so return immediately.
357 if (result == NavigationThrottle::PROCEED && !MaybeTransferAndProceed()) 357 if (result.action() == NavigationThrottle::PROCEED &&
358 !MaybeTransferAndProceed())
358 return; 359 return;
359 } 360 }
360 361
361 if (result != NavigationThrottle::DEFER) { 362 if (result.action() != NavigationThrottle::DEFER) {
362 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this, 363 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
363 "Resuming"); 364 "Resuming");
364 RunCompleteCallback(result); 365 RunCompleteCallback(result);
365 } 366 }
366 } 367 }
367 368
368 void NavigationHandleImpl::CancelDeferredNavigation( 369 void NavigationHandleImpl::CancelDeferredNavigation(
369 NavigationThrottle::ThrottleCheckResult result) { 370 NavigationThrottle::ThrottleCheckResult result) {
370 DCHECK(state_ == DEFERRING_START || 371 DCHECK(state_ == DEFERRING_START ||
371 state_ == DEFERRING_REDIRECT || 372 state_ == DEFERRING_REDIRECT ||
372 state_ == DEFERRING_RESPONSE); 373 state_ == DEFERRING_RESPONSE);
373 DCHECK(result == NavigationThrottle::CANCEL_AND_IGNORE || 374 DCHECK(result.action() == NavigationThrottle::CANCEL_AND_IGNORE ||
374 result == NavigationThrottle::CANCEL); 375 result.action() == NavigationThrottle::CANCEL);
375 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this, 376 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
376 "CancelDeferredNavigation"); 377 "CancelDeferredNavigation");
377 state_ = CANCELING; 378 state_ = CANCELING;
378 RunCompleteCallback(result); 379 RunCompleteCallback(result);
379 } 380 }
380 381
381 void NavigationHandleImpl::RegisterThrottleForTesting( 382 void NavigationHandleImpl::RegisterThrottleForTesting(
382 std::unique_ptr<NavigationThrottle> navigation_throttle) { 383 std::unique_ptr<NavigationThrottle> navigation_throttle) {
383 throttles_.push_back(std::move(navigation_throttle)); 384 throttles_.push_back(std::move(navigation_throttle));
384 } 385 }
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
562 563
563 RegisterNavigationThrottles(); 564 RegisterNavigationThrottles();
564 565
565 if (IsBrowserSideNavigationEnabled()) 566 if (IsBrowserSideNavigationEnabled())
566 navigation_ui_data_ = GetDelegate()->GetNavigationUIData(this); 567 navigation_ui_data_ = GetDelegate()->GetNavigationUIData(this);
567 568
568 // Notify each throttle of the request. 569 // Notify each throttle of the request.
569 NavigationThrottle::ThrottleCheckResult result = CheckWillStartRequest(); 570 NavigationThrottle::ThrottleCheckResult result = CheckWillStartRequest();
570 571
571 // If the navigation is not deferred, run the callback. 572 // If the navigation is not deferred, run the callback.
572 if (result != NavigationThrottle::DEFER) { 573 if (result.action() != NavigationThrottle::DEFER) {
573 TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this, 574 TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this,
574 "StartRequest", "result", result); 575 "StartRequest", "result", result.action());
575 RunCompleteCallback(result); 576 RunCompleteCallback(result);
576 } 577 }
577 } 578 }
578 579
579 void NavigationHandleImpl::WillRedirectRequest( 580 void NavigationHandleImpl::WillRedirectRequest(
580 const GURL& new_url, 581 const GURL& new_url,
581 const std::string& new_method, 582 const std::string& new_method,
582 const GURL& new_referrer_url, 583 const GURL& new_referrer_url,
583 bool new_is_external_protocol, 584 bool new_is_external_protocol,
584 scoped_refptr<net::HttpResponseHeaders> response_headers, 585 scoped_refptr<net::HttpResponseHeaders> response_headers,
(...skipping 27 matching lines...) Expand all
612 if (IsSelfReferentialURL()) { 613 if (IsSelfReferentialURL()) {
613 state_ = CANCELING; 614 state_ = CANCELING;
614 RunCompleteCallback(NavigationThrottle::CANCEL); 615 RunCompleteCallback(NavigationThrottle::CANCEL);
615 return; 616 return;
616 } 617 }
617 618
618 // Notify each throttle of the request. 619 // Notify each throttle of the request.
619 NavigationThrottle::ThrottleCheckResult result = CheckWillRedirectRequest(); 620 NavigationThrottle::ThrottleCheckResult result = CheckWillRedirectRequest();
620 621
621 // If the navigation is not deferred, run the callback. 622 // If the navigation is not deferred, run the callback.
622 if (result != NavigationThrottle::DEFER) { 623 if (result.action() != NavigationThrottle::DEFER) {
623 TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this, 624 TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this,
624 "RedirectRequest", "result", result); 625 "RedirectRequest", "result", result.action());
625 RunCompleteCallback(result); 626 RunCompleteCallback(result);
626 } 627 }
627 } 628 }
628 629
629 void NavigationHandleImpl::WillProcessResponse( 630 void NavigationHandleImpl::WillProcessResponse(
630 RenderFrameHostImpl* render_frame_host, 631 RenderFrameHostImpl* render_frame_host,
631 scoped_refptr<net::HttpResponseHeaders> response_headers, 632 scoped_refptr<net::HttpResponseHeaders> response_headers,
632 net::HttpResponseInfo::ConnectionInfo connection_info, 633 net::HttpResponseInfo::ConnectionInfo connection_info,
633 const SSLStatus& ssl_status, 634 const SSLStatus& ssl_status,
634 const GlobalRequestID& request_id, 635 const GlobalRequestID& request_id,
(...skipping 19 matching lines...) Expand all
654 transfer_callback_ = transfer_callback; 655 transfer_callback_ = transfer_callback;
655 656
656 // Notify each throttle of the response. 657 // Notify each throttle of the response.
657 NavigationThrottle::ThrottleCheckResult result = CheckWillProcessResponse(); 658 NavigationThrottle::ThrottleCheckResult result = CheckWillProcessResponse();
658 659
659 // If the navigation is done processing the response, then it's ready to 660 // If the navigation is done processing the response, then it's ready to
660 // commit. Determine which RenderFrameHost should render the response, based 661 // commit. Determine which RenderFrameHost should render the response, based
661 // on its site (after any redirects). 662 // on its site (after any redirects).
662 // Note: if MaybeTransferAndProceed returns false, this means that this 663 // Note: if MaybeTransferAndProceed returns false, this means that this
663 // NavigationHandle was deleted, so return immediately. 664 // NavigationHandle was deleted, so return immediately.
664 if (result == NavigationThrottle::PROCEED && !MaybeTransferAndProceed()) 665 if (result.action() == NavigationThrottle::PROCEED &&
666 !MaybeTransferAndProceed())
665 return; 667 return;
666 668
667 // If the navigation is not deferred, run the callback. 669 // If the navigation is not deferred, run the callback.
668 if (result != NavigationThrottle::DEFER) { 670 if (result.action() != NavigationThrottle::DEFER) {
669 TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this, 671 TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this,
670 "ProcessResponse", "result", result); 672 "ProcessResponse", "result", result.action());
671 RunCompleteCallback(result); 673 RunCompleteCallback(result);
672 } 674 }
673 } 675 }
674 676
675 void NavigationHandleImpl::ReadyToCommitNavigation( 677 void NavigationHandleImpl::ReadyToCommitNavigation(
676 RenderFrameHostImpl* render_frame_host) { 678 RenderFrameHostImpl* render_frame_host) {
677 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this, 679 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
678 "ReadyToCommitNavigation"); 680 "ReadyToCommitNavigation");
679 681
680 DCHECK(!render_frame_host_ || render_frame_host_ == render_frame_host); 682 DCHECK(!render_frame_host_ || render_frame_host_ == render_frame_host);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
743 NavigationHandleImpl::CheckWillStartRequest() { 745 NavigationHandleImpl::CheckWillStartRequest() {
744 DCHECK(state_ == WILL_SEND_REQUEST || state_ == DEFERRING_START); 746 DCHECK(state_ == WILL_SEND_REQUEST || state_ == DEFERRING_START);
745 DCHECK(state_ != WILL_SEND_REQUEST || next_index_ == 0); 747 DCHECK(state_ != WILL_SEND_REQUEST || next_index_ == 0);
746 DCHECK(state_ != DEFERRING_START || next_index_ != 0); 748 DCHECK(state_ != DEFERRING_START || next_index_ != 0);
747 for (size_t i = next_index_; i < throttles_.size(); ++i) { 749 for (size_t i = next_index_; i < throttles_.size(); ++i) {
748 NavigationThrottle::ThrottleCheckResult result = 750 NavigationThrottle::ThrottleCheckResult result =
749 throttles_[i]->WillStartRequest(); 751 throttles_[i]->WillStartRequest();
750 TRACE_EVENT_ASYNC_STEP_INTO0( 752 TRACE_EVENT_ASYNC_STEP_INTO0(
751 "navigation", "NavigationHandle", this, 753 "navigation", "NavigationHandle", this,
752 base::StringPrintf("CheckWillStartRequest: %s: %d", 754 base::StringPrintf("CheckWillStartRequest: %s: %d",
753 throttles_[i]->GetNameForLogging(), result)); 755 throttles_[i]->GetNameForLogging(),
754 switch (result) { 756 result.action()));
757 switch (result.action()) {
755 case NavigationThrottle::PROCEED: 758 case NavigationThrottle::PROCEED:
756 continue; 759 continue;
757 760
758 case NavigationThrottle::BLOCK_REQUEST: 761 case NavigationThrottle::BLOCK_REQUEST:
759 case NavigationThrottle::CANCEL: 762 case NavigationThrottle::CANCEL:
760 case NavigationThrottle::CANCEL_AND_IGNORE: 763 case NavigationThrottle::CANCEL_AND_IGNORE:
761 state_ = CANCELING; 764 state_ = CANCELING;
762 return result; 765 return result;
763 766
764 case NavigationThrottle::DEFER: 767 case NavigationThrottle::DEFER:
(...skipping 16 matching lines...) Expand all
781 DCHECK(state_ == WILL_REDIRECT_REQUEST || state_ == DEFERRING_REDIRECT); 784 DCHECK(state_ == WILL_REDIRECT_REQUEST || state_ == DEFERRING_REDIRECT);
782 DCHECK(state_ != WILL_REDIRECT_REQUEST || next_index_ == 0); 785 DCHECK(state_ != WILL_REDIRECT_REQUEST || next_index_ == 0);
783 DCHECK(state_ != DEFERRING_REDIRECT || next_index_ != 0); 786 DCHECK(state_ != DEFERRING_REDIRECT || next_index_ != 0);
784 787
785 for (size_t i = next_index_; i < throttles_.size(); ++i) { 788 for (size_t i = next_index_; i < throttles_.size(); ++i) {
786 NavigationThrottle::ThrottleCheckResult result = 789 NavigationThrottle::ThrottleCheckResult result =
787 throttles_[i]->WillRedirectRequest(); 790 throttles_[i]->WillRedirectRequest();
788 TRACE_EVENT_ASYNC_STEP_INTO0( 791 TRACE_EVENT_ASYNC_STEP_INTO0(
789 "navigation", "NavigationHandle", this, 792 "navigation", "NavigationHandle", this,
790 base::StringPrintf("CheckWillRedirectRequest: %s: %d", 793 base::StringPrintf("CheckWillRedirectRequest: %s: %d",
791 throttles_[i]->GetNameForLogging(), result)); 794 throttles_[i]->GetNameForLogging(),
792 switch (result) { 795 result.action()));
796 switch (result.action()) {
793 case NavigationThrottle::PROCEED: 797 case NavigationThrottle::PROCEED:
794 continue; 798 continue;
795 799
796 case NavigationThrottle::BLOCK_REQUEST: 800 case NavigationThrottle::BLOCK_REQUEST:
797 CHECK(IsBrowserSideNavigationEnabled()) 801 CHECK(IsBrowserSideNavigationEnabled())
798 << "BLOCK_REQUEST must not be used on redirect without PlzNavigate"; 802 << "BLOCK_REQUEST must not be used on redirect without PlzNavigate";
799 case NavigationThrottle::CANCEL: 803 case NavigationThrottle::CANCEL:
800 case NavigationThrottle::CANCEL_AND_IGNORE: 804 case NavigationThrottle::CANCEL_AND_IGNORE:
801 state_ = CANCELING; 805 state_ = CANCELING;
802 return result; 806 return result;
(...skipping 22 matching lines...) Expand all
825 DCHECK(state_ == WILL_PROCESS_RESPONSE || state_ == DEFERRING_RESPONSE); 829 DCHECK(state_ == WILL_PROCESS_RESPONSE || state_ == DEFERRING_RESPONSE);
826 DCHECK(state_ != WILL_PROCESS_RESPONSE || next_index_ == 0); 830 DCHECK(state_ != WILL_PROCESS_RESPONSE || next_index_ == 0);
827 DCHECK(state_ != DEFERRING_RESPONSE || next_index_ != 0); 831 DCHECK(state_ != DEFERRING_RESPONSE || next_index_ != 0);
828 832
829 for (size_t i = next_index_; i < throttles_.size(); ++i) { 833 for (size_t i = next_index_; i < throttles_.size(); ++i) {
830 NavigationThrottle::ThrottleCheckResult result = 834 NavigationThrottle::ThrottleCheckResult result =
831 throttles_[i]->WillProcessResponse(); 835 throttles_[i]->WillProcessResponse();
832 TRACE_EVENT_ASYNC_STEP_INTO0( 836 TRACE_EVENT_ASYNC_STEP_INTO0(
833 "navigation", "NavigationHandle", this, 837 "navigation", "NavigationHandle", this,
834 base::StringPrintf("CheckWillProcessResponse: %s: %d", 838 base::StringPrintf("CheckWillProcessResponse: %s: %d",
835 throttles_[i]->GetNameForLogging(), result)); 839 throttles_[i]->GetNameForLogging(),
836 switch (result) { 840 result.action()));
841 switch (result.action()) {
837 case NavigationThrottle::PROCEED: 842 case NavigationThrottle::PROCEED:
838 continue; 843 continue;
839 844
840 case NavigationThrottle::CANCEL: 845 case NavigationThrottle::CANCEL:
841 case NavigationThrottle::CANCEL_AND_IGNORE: 846 case NavigationThrottle::CANCEL_AND_IGNORE:
842 case NavigationThrottle::BLOCK_RESPONSE: 847 case NavigationThrottle::BLOCK_RESPONSE:
843 state_ = CANCELING; 848 state_ = CANCELING;
844 return result; 849 return result;
845 850
846 case NavigationThrottle::DEFER: 851 case NavigationThrottle::DEFER:
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
946 transition_, should_replace_current_entry_); 951 transition_, should_replace_current_entry_);
947 if (!weak_self) 952 if (!weak_self)
948 return false; 953 return false;
949 } 954 }
950 955
951 return true; 956 return true;
952 } 957 }
953 958
954 void NavigationHandleImpl::RunCompleteCallback( 959 void NavigationHandleImpl::RunCompleteCallback(
955 NavigationThrottle::ThrottleCheckResult result) { 960 NavigationThrottle::ThrottleCheckResult result) {
956 DCHECK(result != NavigationThrottle::DEFER); 961 DCHECK(result.action() != NavigationThrottle::DEFER);
957 962
958 ThrottleChecksFinishedCallback callback = complete_callback_; 963 ThrottleChecksFinishedCallback callback = complete_callback_;
959 complete_callback_.Reset(); 964 complete_callback_.Reset();
960 965
961 if (!complete_callback_for_testing_.is_null()) { 966 if (!complete_callback_for_testing_.is_null()) {
962 complete_callback_for_testing_.Run(result); 967 complete_callback_for_testing_.Run(result);
963 complete_callback_for_testing_.Reset(); 968 complete_callback_for_testing_.Reset();
964 } 969 }
965 970
966 if (!callback.is_null()) 971 if (!callback.is_null())
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1047 if (node->current_url().EqualsIgnoringRef(url_)) { 1052 if (node->current_url().EqualsIgnoringRef(url_)) {
1048 if (found_self_reference) 1053 if (found_self_reference)
1049 return true; 1054 return true;
1050 found_self_reference = true; 1055 found_self_reference = true;
1051 } 1056 }
1052 } 1057 }
1053 return false; 1058 return false;
1054 } 1059 }
1055 1060
1056 } // namespace content 1061 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698