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

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

Issue 2830353003: Tracing for NavigationHandle lifetime and state. (Closed)
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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 redirect_chain_(redirect_chain), 113 redirect_chain_(redirect_chain),
114 is_download_(false), 114 is_download_(false),
115 is_stream_(false), 115 is_stream_(false),
116 started_from_context_menu_(started_from_context_menu), 116 started_from_context_menu_(started_from_context_menu),
117 reload_type_(ReloadType::NONE), 117 reload_type_(ReloadType::NONE),
118 restore_type_(RestoreType::NONE), 118 restore_type_(RestoreType::NONE),
119 navigation_type_(NAVIGATION_TYPE_UNKNOWN), 119 navigation_type_(NAVIGATION_TYPE_UNKNOWN),
120 should_check_main_world_csp_(should_check_main_world_csp), 120 should_check_main_world_csp_(should_check_main_world_csp),
121 is_form_submission_(is_form_submission), 121 is_form_submission_(is_form_submission),
122 weak_factory_(this) { 122 weak_factory_(this) {
123 TRACE_EVENT_ASYNC_BEGIN2("navigation", "NavigationHandle", this,
124 "frame_tree_node",
125 frame_tree_node_->frame_tree_node_id(), "url",
126 url_.possibly_invalid_spec());
123 DCHECK(!navigation_start.is_null()); 127 DCHECK(!navigation_start.is_null());
124 if (redirect_chain_.empty()) 128 if (redirect_chain_.empty())
125 redirect_chain_.push_back(url); 129 redirect_chain_.push_back(url);
126 130
127 starting_site_instance_ = 131 starting_site_instance_ =
128 frame_tree_node_->current_frame_host()->GetSiteInstance(); 132 frame_tree_node_->current_frame_host()->GetSiteInstance();
129 133
130 if (pending_nav_entry_id_) { 134 if (pending_nav_entry_id_) {
131 NavigationControllerImpl* nav_controller = 135 NavigationControllerImpl* nav_controller =
132 static_cast<NavigationControllerImpl*>( 136 static_cast<NavigationControllerImpl*>(
(...skipping 14 matching lines...) Expand all
147 } 151 }
148 152
149 if (!IsRendererDebugURL(url_)) 153 if (!IsRendererDebugURL(url_))
150 GetDelegate()->DidStartNavigation(this); 154 GetDelegate()->DidStartNavigation(this);
151 155
152 if (IsInMainFrame()) { 156 if (IsInMainFrame()) {
153 TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP1( 157 TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP1(
154 "navigation", "Navigation StartToCommit", this, 158 "navigation", "Navigation StartToCommit", this,
155 navigation_start, "Initial URL", url_.spec()); 159 navigation_start, "Initial URL", url_.spec());
156 } 160 }
161
162 if (is_same_page_) {
163 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
164 "Same document");
165 }
157 } 166 }
158 167
159 NavigationHandleImpl::~NavigationHandleImpl() { 168 NavigationHandleImpl::~NavigationHandleImpl() {
160 // Transfer requests that have not matched up with another navigation request 169 // Transfer requests that have not matched up with another navigation request
161 // from the renderer need to be cleaned up. These are marked as protected in 170 // from the renderer need to be cleaned up. These are marked as protected in
162 // the RDHI, so they do not get cancelled when frames are destroyed. 171 // the RDHI, so they do not get cancelled when frames are destroyed.
163 if (is_transferring()) { 172 if (is_transferring()) {
164 BrowserThread::PostTask( 173 BrowserThread::PostTask(
165 BrowserThread::IO, FROM_HERE, 174 BrowserThread::IO, FROM_HERE,
166 base::Bind(&NotifyAbandonedTransferNavigation, GetGlobalRequestID())); 175 base::Bind(&NotifyAbandonedTransferNavigation, GetGlobalRequestID()));
167 } 176 }
168 177
169 if (!IsRendererDebugURL(url_)) 178 if (!IsRendererDebugURL(url_))
170 GetDelegate()->DidFinishNavigation(this); 179 GetDelegate()->DidFinishNavigation(this);
171 180
172 // Cancel the navigation on the IO thread if the NavigationHandle is being 181 // Cancel the navigation on the IO thread if the NavigationHandle is being
173 // destroyed in the middle of the NavigationThrottles checks. 182 // destroyed in the middle of the NavigationThrottles checks.
174 if (!IsBrowserSideNavigationEnabled() && !complete_callback_.is_null()) 183 if (!IsBrowserSideNavigationEnabled() && !complete_callback_.is_null())
175 RunCompleteCallback(NavigationThrottle::CANCEL_AND_IGNORE); 184 RunCompleteCallback(NavigationThrottle::CANCEL_AND_IGNORE);
176 185
177 if (IsInMainFrame()) { 186 if (IsInMainFrame()) {
178 TRACE_EVENT_ASYNC_END2("navigation", "Navigation StartToCommit", this, 187 TRACE_EVENT_ASYNC_END2("navigation", "Navigation StartToCommit", this,
179 "URL", url_.spec(), "Net Error Code", 188 "URL", url_.spec(), "Net Error Code",
180 net_error_code_); 189 net_error_code_);
181 } 190 }
191 TRACE_EVENT_ASYNC_END0("navigation", "NavigationHandle", this);
182 } 192 }
183 193
184 NavigatorDelegate* NavigationHandleImpl::GetDelegate() const { 194 NavigatorDelegate* NavigationHandleImpl::GetDelegate() const {
185 return frame_tree_node_->navigator()->GetDelegate(); 195 return frame_tree_node_->navigator()->GetDelegate();
186 } 196 }
187 197
188 const GURL& NavigationHandleImpl::GetURL() { 198 const GURL& NavigationHandleImpl::GetURL() {
189 return url_; 199 return url_;
190 } 200 }
191 201
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 net::HostPortPair NavigationHandleImpl::GetSocketAddress() { 330 net::HostPortPair NavigationHandleImpl::GetSocketAddress() {
321 DCHECK(state_ == DID_COMMIT || state_ == DID_COMMIT_ERROR_PAGE); 331 DCHECK(state_ == DID_COMMIT || state_ == DID_COMMIT_ERROR_PAGE);
322 return socket_address_; 332 return socket_address_;
323 } 333 }
324 334
325 void NavigationHandleImpl::Resume() { 335 void NavigationHandleImpl::Resume() {
326 if (state_ != DEFERRING_START && state_ != DEFERRING_REDIRECT && 336 if (state_ != DEFERRING_START && state_ != DEFERRING_REDIRECT &&
327 state_ != DEFERRING_RESPONSE) { 337 state_ != DEFERRING_RESPONSE) {
328 return; 338 return;
329 } 339 }
340 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
341 "Resume");
330 342
331 NavigationThrottle::ThrottleCheckResult result = NavigationThrottle::DEFER; 343 NavigationThrottle::ThrottleCheckResult result = NavigationThrottle::DEFER;
332 if (state_ == DEFERRING_START) { 344 if (state_ == DEFERRING_START) {
333 result = CheckWillStartRequest(); 345 result = CheckWillStartRequest();
334 } else if (state_ == DEFERRING_REDIRECT) { 346 } else if (state_ == DEFERRING_REDIRECT) {
335 result = CheckWillRedirectRequest(); 347 result = CheckWillRedirectRequest();
336 } else { 348 } else {
337 result = CheckWillProcessResponse(); 349 result = CheckWillProcessResponse();
338 350
339 // 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
340 // processing the response, then it's ready to commit. Determine which 352 // processing the response, then it's ready to commit. Determine which
341 // RenderFrameHost should render the response, based on its site (after any 353 // RenderFrameHost should render the response, based on its site (after any
342 // redirects). 354 // redirects).
343 // Note: if MaybeTransferAndProceed returns false, this means that this 355 // Note: if MaybeTransferAndProceed returns false, this means that this
344 // NavigationHandle was deleted, so return immediately. 356 // NavigationHandle was deleted, so return immediately.
345 if (result == NavigationThrottle::PROCEED && !MaybeTransferAndProceed()) 357 if (result == NavigationThrottle::PROCEED && !MaybeTransferAndProceed())
346 return; 358 return;
347 } 359 }
348 360
349 if (result != NavigationThrottle::DEFER) 361 if (result != NavigationThrottle::DEFER) {
362 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
363 "Resuming");
350 RunCompleteCallback(result); 364 RunCompleteCallback(result);
365 }
351 } 366 }
352 367
353 void NavigationHandleImpl::CancelDeferredNavigation( 368 void NavigationHandleImpl::CancelDeferredNavigation(
354 NavigationThrottle::ThrottleCheckResult result) { 369 NavigationThrottle::ThrottleCheckResult result) {
355 DCHECK(state_ == DEFERRING_START || 370 DCHECK(state_ == DEFERRING_START ||
356 state_ == DEFERRING_REDIRECT || 371 state_ == DEFERRING_REDIRECT ||
357 state_ == DEFERRING_RESPONSE); 372 state_ == DEFERRING_RESPONSE);
358 DCHECK(result == NavigationThrottle::CANCEL_AND_IGNORE || 373 DCHECK(result == NavigationThrottle::CANCEL_AND_IGNORE ||
359 result == NavigationThrottle::CANCEL); 374 result == NavigationThrottle::CANCEL);
375 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
376 "CancelDeferredNavigation");
360 state_ = CANCELING; 377 state_ = CANCELING;
361 RunCompleteCallback(result); 378 RunCompleteCallback(result);
362 } 379 }
363 380
364 void NavigationHandleImpl::RegisterThrottleForTesting( 381 void NavigationHandleImpl::RegisterThrottleForTesting(
365 std::unique_ptr<NavigationThrottle> navigation_throttle) { 382 std::unique_ptr<NavigationThrottle> navigation_throttle) {
366 throttles_.push_back(std::move(navigation_throttle)); 383 throttles_.push_back(std::move(navigation_throttle));
367 } 384 }
368 385
369 NavigationThrottle::ThrottleCheckResult 386 NavigationThrottle::ThrottleCheckResult
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 void NavigationHandleImpl::WillStartRequest( 521 void NavigationHandleImpl::WillStartRequest(
505 const std::string& method, 522 const std::string& method,
506 scoped_refptr<content::ResourceRequestBodyImpl> resource_request_body, 523 scoped_refptr<content::ResourceRequestBodyImpl> resource_request_body,
507 const Referrer& sanitized_referrer, 524 const Referrer& sanitized_referrer,
508 bool has_user_gesture, 525 bool has_user_gesture,
509 ui::PageTransition transition, 526 ui::PageTransition transition,
510 bool is_external_protocol, 527 bool is_external_protocol,
511 RequestContextType request_context_type, 528 RequestContextType request_context_type,
512 blink::WebMixedContentContextType mixed_content_context_type, 529 blink::WebMixedContentContextType mixed_content_context_type,
513 const ThrottleChecksFinishedCallback& callback) { 530 const ThrottleChecksFinishedCallback& callback) {
531 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
532 "WillStartRequest");
514 if (method != "POST") 533 if (method != "POST")
515 DCHECK(!resource_request_body); 534 DCHECK(!resource_request_body);
516 535
517 // Update the navigation parameters. 536 // Update the navigation parameters.
518 method_ = method; 537 method_ = method;
519 if (method_ == "POST") 538 if (method_ == "POST")
520 resource_request_body_ = resource_request_body; 539 resource_request_body_ = resource_request_body;
521 has_user_gesture_ = has_user_gesture; 540 has_user_gesture_ = has_user_gesture;
522 transition_ = transition; 541 transition_ = transition;
523 // Mirrors the logic in RenderFrameImpl::SendDidCommitProvisionalLoad. 542 // Mirrors the logic in RenderFrameImpl::SendDidCommitProvisionalLoad.
(...skipping 19 matching lines...) Expand all
543 562
544 RegisterNavigationThrottles(); 563 RegisterNavigationThrottles();
545 564
546 if (IsBrowserSideNavigationEnabled()) 565 if (IsBrowserSideNavigationEnabled())
547 navigation_ui_data_ = GetDelegate()->GetNavigationUIData(this); 566 navigation_ui_data_ = GetDelegate()->GetNavigationUIData(this);
548 567
549 // Notify each throttle of the request. 568 // Notify each throttle of the request.
550 NavigationThrottle::ThrottleCheckResult result = CheckWillStartRequest(); 569 NavigationThrottle::ThrottleCheckResult result = CheckWillStartRequest();
551 570
552 // If the navigation is not deferred, run the callback. 571 // If the navigation is not deferred, run the callback.
553 if (result != NavigationThrottle::DEFER) 572 if (result != NavigationThrottle::DEFER) {
573 TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this,
574 "StartRequest", "result", result);
554 RunCompleteCallback(result); 575 RunCompleteCallback(result);
576 }
555 } 577 }
556 578
557 void NavigationHandleImpl::WillRedirectRequest( 579 void NavigationHandleImpl::WillRedirectRequest(
558 const GURL& new_url, 580 const GURL& new_url,
559 const std::string& new_method, 581 const std::string& new_method,
560 const GURL& new_referrer_url, 582 const GURL& new_referrer_url,
561 bool new_is_external_protocol, 583 bool new_is_external_protocol,
562 scoped_refptr<net::HttpResponseHeaders> response_headers, 584 scoped_refptr<net::HttpResponseHeaders> response_headers,
563 net::HttpResponseInfo::ConnectionInfo connection_info, 585 net::HttpResponseInfo::ConnectionInfo connection_info,
564 const ThrottleChecksFinishedCallback& callback) { 586 const ThrottleChecksFinishedCallback& callback) {
587 TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this,
588 "WillRedirectRequest", "url",
589 new_url.possibly_invalid_spec());
590
565 // Update the navigation parameters. 591 // Update the navigation parameters.
566 url_ = new_url; 592 url_ = new_url;
567 method_ = new_method; 593 method_ = new_method;
568 594
569 if (!(transition_ & ui::PAGE_TRANSITION_CLIENT_REDIRECT)) { 595 if (!(transition_ & ui::PAGE_TRANSITION_CLIENT_REDIRECT)) {
570 sanitized_referrer_.url = new_referrer_url; 596 sanitized_referrer_.url = new_referrer_url;
571 sanitized_referrer_ = 597 sanitized_referrer_ =
572 Referrer::SanitizeForRequest(url_, sanitized_referrer_); 598 Referrer::SanitizeForRequest(url_, sanitized_referrer_);
573 } 599 }
574 600
(...skipping 11 matching lines...) Expand all
586 if (IsSelfReferentialURL()) { 612 if (IsSelfReferentialURL()) {
587 state_ = CANCELING; 613 state_ = CANCELING;
588 RunCompleteCallback(NavigationThrottle::CANCEL); 614 RunCompleteCallback(NavigationThrottle::CANCEL);
589 return; 615 return;
590 } 616 }
591 617
592 // Notify each throttle of the request. 618 // Notify each throttle of the request.
593 NavigationThrottle::ThrottleCheckResult result = CheckWillRedirectRequest(); 619 NavigationThrottle::ThrottleCheckResult result = CheckWillRedirectRequest();
594 620
595 // If the navigation is not deferred, run the callback. 621 // If the navigation is not deferred, run the callback.
596 if (result != NavigationThrottle::DEFER) 622 if (result != NavigationThrottle::DEFER) {
623 TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this,
624 "RedirectRequest", "result", result);
597 RunCompleteCallback(result); 625 RunCompleteCallback(result);
626 }
598 } 627 }
599 628
600 void NavigationHandleImpl::WillProcessResponse( 629 void NavigationHandleImpl::WillProcessResponse(
601 RenderFrameHostImpl* render_frame_host, 630 RenderFrameHostImpl* render_frame_host,
602 scoped_refptr<net::HttpResponseHeaders> response_headers, 631 scoped_refptr<net::HttpResponseHeaders> response_headers,
603 net::HttpResponseInfo::ConnectionInfo connection_info, 632 net::HttpResponseInfo::ConnectionInfo connection_info,
604 const SSLStatus& ssl_status, 633 const SSLStatus& ssl_status,
605 const GlobalRequestID& request_id, 634 const GlobalRequestID& request_id,
606 bool should_replace_current_entry, 635 bool should_replace_current_entry,
607 bool is_download, 636 bool is_download,
608 bool is_stream, 637 bool is_stream,
609 const base::Closure& transfer_callback, 638 const base::Closure& transfer_callback,
610 const ThrottleChecksFinishedCallback& callback) { 639 const ThrottleChecksFinishedCallback& callback) {
640 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
641 "WillProcessResponse");
642
611 DCHECK(!render_frame_host_ || render_frame_host_ == render_frame_host); 643 DCHECK(!render_frame_host_ || render_frame_host_ == render_frame_host);
612 render_frame_host_ = render_frame_host; 644 render_frame_host_ = render_frame_host;
613 response_headers_ = response_headers; 645 response_headers_ = response_headers;
614 connection_info_ = connection_info; 646 connection_info_ = connection_info;
615 request_id_ = request_id; 647 request_id_ = request_id;
616 should_replace_current_entry_ = should_replace_current_entry; 648 should_replace_current_entry_ = should_replace_current_entry;
617 is_download_ = is_download; 649 is_download_ = is_download;
618 is_stream_ = is_stream; 650 is_stream_ = is_stream;
619 state_ = WILL_PROCESS_RESPONSE; 651 state_ = WILL_PROCESS_RESPONSE;
620 ssl_status_ = ssl_status; 652 ssl_status_ = ssl_status;
621 complete_callback_ = callback; 653 complete_callback_ = callback;
622 transfer_callback_ = transfer_callback; 654 transfer_callback_ = transfer_callback;
623 655
624 // Notify each throttle of the response. 656 // Notify each throttle of the response.
625 NavigationThrottle::ThrottleCheckResult result = CheckWillProcessResponse(); 657 NavigationThrottle::ThrottleCheckResult result = CheckWillProcessResponse();
626 658
627 // If the navigation is done processing the response, then it's ready to 659 // If the navigation is done processing the response, then it's ready to
628 // commit. Determine which RenderFrameHost should render the response, based 660 // commit. Determine which RenderFrameHost should render the response, based
629 // on its site (after any redirects). 661 // on its site (after any redirects).
630 // Note: if MaybeTransferAndProceed returns false, this means that this 662 // Note: if MaybeTransferAndProceed returns false, this means that this
631 // NavigationHandle was deleted, so return immediately. 663 // NavigationHandle was deleted, so return immediately.
632 if (result == NavigationThrottle::PROCEED && !MaybeTransferAndProceed()) 664 if (result == NavigationThrottle::PROCEED && !MaybeTransferAndProceed())
633 return; 665 return;
634 666
635 // If the navigation is not deferred, run the callback. 667 // If the navigation is not deferred, run the callback.
636 if (result != NavigationThrottle::DEFER) 668 if (result != NavigationThrottle::DEFER) {
669 TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this,
670 "ProcessResponse", "result", result);
637 RunCompleteCallback(result); 671 RunCompleteCallback(result);
672 }
638 } 673 }
639 674
640 void NavigationHandleImpl::ReadyToCommitNavigation( 675 void NavigationHandleImpl::ReadyToCommitNavigation(
641 RenderFrameHostImpl* render_frame_host) { 676 RenderFrameHostImpl* render_frame_host) {
677 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
678 "ReadyToCommitNavigation");
679
642 DCHECK(!render_frame_host_ || render_frame_host_ == render_frame_host); 680 DCHECK(!render_frame_host_ || render_frame_host_ == render_frame_host);
643 render_frame_host_ = render_frame_host; 681 render_frame_host_ = render_frame_host;
644 state_ = READY_TO_COMMIT; 682 state_ = READY_TO_COMMIT;
645 683
646 if (!IsRendererDebugURL(url_) && !IsSameDocument()) 684 if (!IsRendererDebugURL(url_) && !IsSameDocument())
647 GetDelegate()->ReadyToCommitNavigation(this); 685 GetDelegate()->ReadyToCommitNavigation(this);
648 } 686 }
649 687
650 void NavigationHandleImpl::DidCommitNavigation( 688 void NavigationHandleImpl::DidCommitNavigation(
651 const FrameHostMsg_DidCommitProvisionalLoad_Params& params, 689 const FrameHostMsg_DidCommitProvisionalLoad_Params& params,
(...skipping 19 matching lines...) Expand all
671 709
672 DCHECK(!IsInMainFrame() || navigation_entry_committed) 710 DCHECK(!IsInMainFrame() || navigation_entry_committed)
673 << "Only subframe navigations can get here without changing the " 711 << "Only subframe navigations can get here without changing the "
674 << "NavigationEntry"; 712 << "NavigationEntry";
675 subframe_entry_committed_ = navigation_entry_committed; 713 subframe_entry_committed_ = navigation_entry_committed;
676 714
677 // If an error page reloads, net_error_code might be 200 but we still want to 715 // If an error page reloads, net_error_code might be 200 but we still want to
678 // count it as an error page. 716 // count it as an error page.
679 if (params.base_url.spec() == kUnreachableWebDataURL || 717 if (params.base_url.spec() == kUnreachableWebDataURL ||
680 net_error_code_ != net::OK) { 718 net_error_code_ != net::OK) {
719 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
720 "DidCommitNavigation: error page");
681 state_ = DID_COMMIT_ERROR_PAGE; 721 state_ = DID_COMMIT_ERROR_PAGE;
682 } else { 722 } else {
723 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
724 "DidCommitNavigation");
683 state_ = DID_COMMIT; 725 state_ = DID_COMMIT;
684 } 726 }
685 } 727 }
686 728
687 void NavigationHandleImpl::Transfer() { 729 void NavigationHandleImpl::Transfer() {
688 DCHECK(!IsBrowserSideNavigationEnabled()); 730 DCHECK(!IsBrowserSideNavigationEnabled());
689 // This is an actual transfer. Inform the NavigationResourceThrottle. This 731 // This is an actual transfer. Inform the NavigationResourceThrottle. This
690 // will allow to mark the URLRequest as transferring. When it is marked as 732 // will allow to mark the URLRequest as transferring. When it is marked as
691 // transferring, the URLRequest can no longer be cancelled by its original 733 // transferring, the URLRequest can no longer be cancelled by its original
692 // RenderFrame. Instead it will persist until being picked up by the transfer 734 // RenderFrame. Instead it will persist until being picked up by the transfer
693 // RenderFrame, even if the original RenderFrame is destroyed. 735 // RenderFrame, even if the original RenderFrame is destroyed.
694 // Note: |transfer_callback_| can be null in unit tests. 736 // Note: |transfer_callback_| can be null in unit tests.
695 if (!transfer_callback_.is_null()) 737 if (!transfer_callback_.is_null())
696 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, transfer_callback_); 738 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, transfer_callback_);
697 transfer_callback_.Reset(); 739 transfer_callback_.Reset();
698 } 740 }
699 741
700 NavigationThrottle::ThrottleCheckResult 742 NavigationThrottle::ThrottleCheckResult
701 NavigationHandleImpl::CheckWillStartRequest() { 743 NavigationHandleImpl::CheckWillStartRequest() {
702 DCHECK(state_ == WILL_SEND_REQUEST || state_ == DEFERRING_START); 744 DCHECK(state_ == WILL_SEND_REQUEST || state_ == DEFERRING_START);
703 DCHECK(state_ != WILL_SEND_REQUEST || next_index_ == 0); 745 DCHECK(state_ != WILL_SEND_REQUEST || next_index_ == 0);
704 DCHECK(state_ != DEFERRING_START || next_index_ != 0); 746 DCHECK(state_ != DEFERRING_START || next_index_ != 0);
705 for (size_t i = next_index_; i < throttles_.size(); ++i) { 747 for (size_t i = next_index_; i < throttles_.size(); ++i) {
706 NavigationThrottle::ThrottleCheckResult result = 748 NavigationThrottle::ThrottleCheckResult result =
707 throttles_[i]->WillStartRequest(); 749 throttles_[i]->WillStartRequest();
750 TRACE_EVENT_ASYNC_STEP_INTO0(
751 "navigation", "NavigationHandle", this,
752 base::StringPrintf("CheckWillStartRequest: %s: %d",
753 throttles_[i]->GetNameForLogging(), result));
708 switch (result) { 754 switch (result) {
709 case NavigationThrottle::PROCEED: 755 case NavigationThrottle::PROCEED:
710 continue; 756 continue;
711 757
712 case NavigationThrottle::BLOCK_REQUEST: 758 case NavigationThrottle::BLOCK_REQUEST:
713 case NavigationThrottle::CANCEL: 759 case NavigationThrottle::CANCEL:
714 case NavigationThrottle::CANCEL_AND_IGNORE: 760 case NavigationThrottle::CANCEL_AND_IGNORE:
715 state_ = CANCELING; 761 state_ = CANCELING;
716 return result; 762 return result;
717 763
718 case NavigationThrottle::DEFER: 764 case NavigationThrottle::DEFER:
719 state_ = DEFERRING_START; 765 state_ = DEFERRING_START;
720 next_index_ = i + 1; 766 next_index_ = i + 1;
721 return result; 767 return result;
722 768
723 case NavigationThrottle::BLOCK_RESPONSE: 769 case NavigationThrottle::BLOCK_RESPONSE:
724 NOTREACHED(); 770 NOTREACHED();
725 } 771 }
726 } 772 }
727 next_index_ = 0; 773 next_index_ = 0;
728 state_ = WILL_SEND_REQUEST; 774 state_ = WILL_SEND_REQUEST;
775
729 return NavigationThrottle::PROCEED; 776 return NavigationThrottle::PROCEED;
730 } 777 }
731 778
732 NavigationThrottle::ThrottleCheckResult 779 NavigationThrottle::ThrottleCheckResult
733 NavigationHandleImpl::CheckWillRedirectRequest() { 780 NavigationHandleImpl::CheckWillRedirectRequest() {
734 DCHECK(state_ == WILL_REDIRECT_REQUEST || state_ == DEFERRING_REDIRECT); 781 DCHECK(state_ == WILL_REDIRECT_REQUEST || state_ == DEFERRING_REDIRECT);
735 DCHECK(state_ != WILL_REDIRECT_REQUEST || next_index_ == 0); 782 DCHECK(state_ != WILL_REDIRECT_REQUEST || next_index_ == 0);
736 DCHECK(state_ != DEFERRING_REDIRECT || next_index_ != 0); 783 DCHECK(state_ != DEFERRING_REDIRECT || next_index_ != 0);
784
737 for (size_t i = next_index_; i < throttles_.size(); ++i) { 785 for (size_t i = next_index_; i < throttles_.size(); ++i) {
738 NavigationThrottle::ThrottleCheckResult result = 786 NavigationThrottle::ThrottleCheckResult result =
739 throttles_[i]->WillRedirectRequest(); 787 throttles_[i]->WillRedirectRequest();
788 TRACE_EVENT_ASYNC_STEP_INTO0(
789 "navigation", "NavigationHandle", this,
790 base::StringPrintf("CheckWillRedirectRequest: %s: %d",
791 throttles_[i]->GetNameForLogging(), result));
740 switch (result) { 792 switch (result) {
741 case NavigationThrottle::PROCEED: 793 case NavigationThrottle::PROCEED:
742 continue; 794 continue;
743 795
744 case NavigationThrottle::BLOCK_REQUEST: 796 case NavigationThrottle::BLOCK_REQUEST:
745 CHECK(IsBrowserSideNavigationEnabled()) 797 CHECK(IsBrowserSideNavigationEnabled())
746 << "BLOCK_REQUEST must not be used on redirect without PlzNavigate"; 798 << "BLOCK_REQUEST must not be used on redirect without PlzNavigate";
747 case NavigationThrottle::CANCEL: 799 case NavigationThrottle::CANCEL:
748 case NavigationThrottle::CANCEL_AND_IGNORE: 800 case NavigationThrottle::CANCEL_AND_IGNORE:
749 state_ = CANCELING; 801 state_ = CANCELING;
(...skipping 16 matching lines...) Expand all
766 GetDelegate()->DidRedirectNavigation(this); 818 GetDelegate()->DidRedirectNavigation(this);
767 819
768 return NavigationThrottle::PROCEED; 820 return NavigationThrottle::PROCEED;
769 } 821 }
770 822
771 NavigationThrottle::ThrottleCheckResult 823 NavigationThrottle::ThrottleCheckResult
772 NavigationHandleImpl::CheckWillProcessResponse() { 824 NavigationHandleImpl::CheckWillProcessResponse() {
773 DCHECK(state_ == WILL_PROCESS_RESPONSE || state_ == DEFERRING_RESPONSE); 825 DCHECK(state_ == WILL_PROCESS_RESPONSE || state_ == DEFERRING_RESPONSE);
774 DCHECK(state_ != WILL_PROCESS_RESPONSE || next_index_ == 0); 826 DCHECK(state_ != WILL_PROCESS_RESPONSE || next_index_ == 0);
775 DCHECK(state_ != DEFERRING_RESPONSE || next_index_ != 0); 827 DCHECK(state_ != DEFERRING_RESPONSE || next_index_ != 0);
828
776 for (size_t i = next_index_; i < throttles_.size(); ++i) { 829 for (size_t i = next_index_; i < throttles_.size(); ++i) {
777 NavigationThrottle::ThrottleCheckResult result = 830 NavigationThrottle::ThrottleCheckResult result =
778 throttles_[i]->WillProcessResponse(); 831 throttles_[i]->WillProcessResponse();
832 TRACE_EVENT_ASYNC_STEP_INTO0(
833 "navigation", "NavigationHandle", this,
834 base::StringPrintf("CheckWillProcessResponse: %s: %d",
835 throttles_[i]->GetNameForLogging(), result));
779 switch (result) { 836 switch (result) {
780 case NavigationThrottle::PROCEED: 837 case NavigationThrottle::PROCEED:
781 continue; 838 continue;
782 839
783 case NavigationThrottle::CANCEL: 840 case NavigationThrottle::CANCEL:
784 case NavigationThrottle::CANCEL_AND_IGNORE: 841 case NavigationThrottle::CANCEL_AND_IGNORE:
785 case NavigationThrottle::BLOCK_RESPONSE: 842 case NavigationThrottle::BLOCK_RESPONSE:
786 state_ = CANCELING; 843 state_ = CANCELING;
787 return result; 844 return result;
788 845
789 case NavigationThrottle::DEFER: 846 case NavigationThrottle::DEFER:
790 state_ = DEFERRING_RESPONSE; 847 state_ = DEFERRING_RESPONSE;
791 next_index_ = i + 1; 848 next_index_ = i + 1;
792 return result; 849 return result;
793 850
794 case NavigationThrottle::BLOCK_REQUEST: 851 case NavigationThrottle::BLOCK_REQUEST:
795 NOTREACHED(); 852 NOTREACHED();
796 } 853 }
797 } 854 }
798 next_index_ = 0; 855 next_index_ = 0;
799 state_ = WILL_PROCESS_RESPONSE; 856 state_ = WILL_PROCESS_RESPONSE;
857
800 return NavigationThrottle::PROCEED; 858 return NavigationThrottle::PROCEED;
801 } 859 }
802 860
803 bool NavigationHandleImpl::MaybeTransferAndProceed() { 861 bool NavigationHandleImpl::MaybeTransferAndProceed() {
804 DCHECK_EQ(WILL_PROCESS_RESPONSE, state_); 862 DCHECK_EQ(WILL_PROCESS_RESPONSE, state_);
805 863
806 // Check if the navigation should transfer. This may result in the 864 // Check if the navigation should transfer. This may result in the
807 // destruction of this NavigationHandle, and the cancellation of the request. 865 // destruction of this NavigationHandle, and the cancellation of the request.
808 if (!MaybeTransferAndProceedInternal()) 866 if (!MaybeTransferAndProceedInternal())
809 return false; 867 return false;
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
989 if (node->current_url().EqualsIgnoringRef(url_)) { 1047 if (node->current_url().EqualsIgnoringRef(url_)) {
990 if (found_self_reference) 1048 if (found_self_reference)
991 return true; 1049 return true;
992 found_self_reference = true; 1050 found_self_reference = true;
993 } 1051 }
994 } 1052 }
995 return false; 1053 return false;
996 } 1054 }
997 1055
998 } // namespace content 1056 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698