| OLD | NEW |
| 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 <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "content/browser/browsing_data/clear_site_data_throttle.h" | 10 #include "content/browser/browsing_data/clear_site_data_throttle.h" |
| 11 #include "content/browser/devtools/render_frame_devtools_agent_host.h" | 11 #include "content/browser/devtools/render_frame_devtools_agent_host.h" |
| 12 #include "content/browser/frame_host/ancestor_throttle.h" |
| 12 #include "content/browser/frame_host/frame_tree_node.h" | 13 #include "content/browser/frame_host/frame_tree_node.h" |
| 13 #include "content/browser/frame_host/navigator.h" | 14 #include "content/browser/frame_host/navigator.h" |
| 14 #include "content/browser/frame_host/navigator_delegate.h" | 15 #include "content/browser/frame_host/navigator_delegate.h" |
| 15 #include "content/browser/service_worker/service_worker_context_wrapper.h" | 16 #include "content/browser/service_worker/service_worker_context_wrapper.h" |
| 16 #include "content/common/frame_messages.h" | 17 #include "content/common/frame_messages.h" |
| 17 #include "content/common/resource_request_body_impl.h" | 18 #include "content/common/resource_request_body_impl.h" |
| 18 #include "content/public/browser/content_browser_client.h" | 19 #include "content/public/browser/content_browser_client.h" |
| 19 #include "content/public/common/browser_side_navigation_policy.h" | 20 #include "content/public/common/browser_side_navigation_policy.h" |
| 20 #include "content/public/common/content_client.h" | 21 #include "content/public/common/content_client.h" |
| 21 #include "net/url_request/redirect_info.h" | 22 #include "net/url_request/redirect_info.h" |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 | 242 |
| 242 if (result != NavigationThrottle::DEFER) | 243 if (result != NavigationThrottle::DEFER) |
| 243 RunCompleteCallback(result); | 244 RunCompleteCallback(result); |
| 244 } | 245 } |
| 245 | 246 |
| 246 void NavigationHandleImpl::CancelDeferredNavigation( | 247 void NavigationHandleImpl::CancelDeferredNavigation( |
| 247 NavigationThrottle::ThrottleCheckResult result) { | 248 NavigationThrottle::ThrottleCheckResult result) { |
| 248 DCHECK(state_ == DEFERRING_START || state_ == DEFERRING_REDIRECT); | 249 DCHECK(state_ == DEFERRING_START || state_ == DEFERRING_REDIRECT); |
| 249 DCHECK(result == NavigationThrottle::CANCEL_AND_IGNORE || | 250 DCHECK(result == NavigationThrottle::CANCEL_AND_IGNORE || |
| 250 result == NavigationThrottle::CANCEL); | 251 result == NavigationThrottle::CANCEL); |
| 251 state_ = CANCELING; | 252 state_ = CANCELING_REQUEST; |
| 252 RunCompleteCallback(result); | 253 RunCompleteCallback(result); |
| 253 } | 254 } |
| 254 | 255 |
| 255 void NavigationHandleImpl::RegisterThrottleForTesting( | 256 void NavigationHandleImpl::RegisterThrottleForTesting( |
| 256 std::unique_ptr<NavigationThrottle> navigation_throttle) { | 257 std::unique_ptr<NavigationThrottle> navigation_throttle) { |
| 257 throttles_.push_back(std::move(navigation_throttle)); | 258 throttles_.push_back(std::move(navigation_throttle)); |
| 258 } | 259 } |
| 259 | 260 |
| 260 NavigationThrottle::ThrottleCheckResult | 261 NavigationThrottle::ThrottleCheckResult |
| 261 NavigationHandleImpl::CallWillStartRequestForTesting( | 262 NavigationHandleImpl::CallWillStartRequestForTesting( |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 446 DCHECK(state_ != DEFERRING_START || next_index_ != 0); | 447 DCHECK(state_ != DEFERRING_START || next_index_ != 0); |
| 447 for (size_t i = next_index_; i < throttles_.size(); ++i) { | 448 for (size_t i = next_index_; i < throttles_.size(); ++i) { |
| 448 NavigationThrottle::ThrottleCheckResult result = | 449 NavigationThrottle::ThrottleCheckResult result = |
| 449 throttles_[i]->WillStartRequest(); | 450 throttles_[i]->WillStartRequest(); |
| 450 switch (result) { | 451 switch (result) { |
| 451 case NavigationThrottle::PROCEED: | 452 case NavigationThrottle::PROCEED: |
| 452 continue; | 453 continue; |
| 453 | 454 |
| 454 case NavigationThrottle::CANCEL: | 455 case NavigationThrottle::CANCEL: |
| 455 case NavigationThrottle::CANCEL_AND_IGNORE: | 456 case NavigationThrottle::CANCEL_AND_IGNORE: |
| 457 state_ = CANCELING_REQUEST; |
| 458 return result; |
| 459 |
| 456 case NavigationThrottle::BLOCK_REQUEST: | 460 case NavigationThrottle::BLOCK_REQUEST: |
| 457 state_ = CANCELING; | 461 state_ = CANCELING_RESPONSE; |
| 458 return result; | 462 return result; |
| 459 | 463 |
| 460 case NavigationThrottle::DEFER: | 464 case NavigationThrottle::DEFER: |
| 461 state_ = DEFERRING_START; | 465 state_ = DEFERRING_START; |
| 462 next_index_ = i + 1; | 466 next_index_ = i + 1; |
| 463 return result; | 467 return result; |
| 468 |
| 469 case NavigationThrottle::BLOCK_RESPONSE: |
| 470 NOTREACHED(); |
| 464 } | 471 } |
| 465 } | 472 } |
| 466 next_index_ = 0; | 473 next_index_ = 0; |
| 467 state_ = WILL_SEND_REQUEST; | 474 state_ = WILL_SEND_REQUEST; |
| 468 return NavigationThrottle::PROCEED; | 475 return NavigationThrottle::PROCEED; |
| 469 } | 476 } |
| 470 | 477 |
| 471 NavigationThrottle::ThrottleCheckResult | 478 NavigationThrottle::ThrottleCheckResult |
| 472 NavigationHandleImpl::CheckWillRedirectRequest() { | 479 NavigationHandleImpl::CheckWillRedirectRequest() { |
| 473 DCHECK(state_ == WILL_REDIRECT_REQUEST || state_ == DEFERRING_REDIRECT); | 480 DCHECK(state_ == WILL_REDIRECT_REQUEST || state_ == DEFERRING_REDIRECT); |
| 474 DCHECK(state_ != WILL_REDIRECT_REQUEST || next_index_ == 0); | 481 DCHECK(state_ != WILL_REDIRECT_REQUEST || next_index_ == 0); |
| 475 DCHECK(state_ != DEFERRING_REDIRECT || next_index_ != 0); | 482 DCHECK(state_ != DEFERRING_REDIRECT || next_index_ != 0); |
| 476 for (size_t i = next_index_; i < throttles_.size(); ++i) { | 483 for (size_t i = next_index_; i < throttles_.size(); ++i) { |
| 477 NavigationThrottle::ThrottleCheckResult result = | 484 NavigationThrottle::ThrottleCheckResult result = |
| 478 throttles_[i]->WillRedirectRequest(); | 485 throttles_[i]->WillRedirectRequest(); |
| 479 switch (result) { | 486 switch (result) { |
| 480 case NavigationThrottle::PROCEED: | 487 case NavigationThrottle::PROCEED: |
| 481 continue; | 488 continue; |
| 482 | 489 |
| 483 case NavigationThrottle::CANCEL: | 490 case NavigationThrottle::CANCEL: |
| 484 case NavigationThrottle::CANCEL_AND_IGNORE: | 491 case NavigationThrottle::CANCEL_AND_IGNORE: |
| 485 state_ = CANCELING; | 492 state_ = CANCELING_REQUEST; |
| 486 return result; | 493 return result; |
| 487 | 494 |
| 488 case NavigationThrottle::DEFER: | 495 case NavigationThrottle::DEFER: |
| 489 state_ = DEFERRING_REDIRECT; | 496 state_ = DEFERRING_REDIRECT; |
| 490 next_index_ = i + 1; | 497 next_index_ = i + 1; |
| 491 return result; | 498 return result; |
| 492 | 499 |
| 493 case NavigationThrottle::BLOCK_REQUEST: | 500 case NavigationThrottle::BLOCK_REQUEST: |
| 501 case NavigationThrottle::BLOCK_RESPONSE: |
| 494 NOTREACHED(); | 502 NOTREACHED(); |
| 495 } | 503 } |
| 496 } | 504 } |
| 497 next_index_ = 0; | 505 next_index_ = 0; |
| 498 state_ = WILL_REDIRECT_REQUEST; | 506 state_ = WILL_REDIRECT_REQUEST; |
| 499 | 507 |
| 500 // Notify the delegate that a redirect was encountered and will be followed. | 508 // Notify the delegate that a redirect was encountered and will be followed. |
| 501 if (GetDelegate()) | 509 if (GetDelegate()) |
| 502 GetDelegate()->DidRedirectNavigation(this); | 510 GetDelegate()->DidRedirectNavigation(this); |
| 503 | 511 |
| 504 return NavigationThrottle::PROCEED; | 512 return NavigationThrottle::PROCEED; |
| 505 } | 513 } |
| 506 | 514 |
| 507 NavigationThrottle::ThrottleCheckResult | 515 NavigationThrottle::ThrottleCheckResult |
| 508 NavigationHandleImpl::CheckWillProcessResponse() { | 516 NavigationHandleImpl::CheckWillProcessResponse() { |
| 509 DCHECK(state_ == WILL_PROCESS_RESPONSE || state_ == DEFERRING_RESPONSE); | 517 DCHECK(state_ == WILL_PROCESS_RESPONSE || state_ == DEFERRING_RESPONSE); |
| 510 DCHECK(state_ != WILL_PROCESS_RESPONSE || next_index_ == 0); | 518 DCHECK(state_ != WILL_PROCESS_RESPONSE || next_index_ == 0); |
| 511 DCHECK(state_ != DEFERRING_RESPONSE || next_index_ != 0); | 519 DCHECK(state_ != DEFERRING_RESPONSE || next_index_ != 0); |
| 512 for (size_t i = next_index_; i < throttles_.size(); ++i) { | 520 for (size_t i = next_index_; i < throttles_.size(); ++i) { |
| 513 NavigationThrottle::ThrottleCheckResult result = | 521 NavigationThrottle::ThrottleCheckResult result = |
| 514 throttles_[i]->WillProcessResponse(); | 522 throttles_[i]->WillProcessResponse(); |
| 515 switch (result) { | 523 switch (result) { |
| 516 case NavigationThrottle::PROCEED: | 524 case NavigationThrottle::PROCEED: |
| 517 continue; | 525 continue; |
| 518 | 526 |
| 519 case NavigationThrottle::CANCEL: | 527 case NavigationThrottle::CANCEL: |
| 520 case NavigationThrottle::CANCEL_AND_IGNORE: | 528 case NavigationThrottle::CANCEL_AND_IGNORE: |
| 521 state_ = CANCELING; | 529 state_ = CANCELING_REQUEST; |
| 530 return result; |
| 531 |
| 532 case NavigationThrottle::BLOCK_RESPONSE: |
| 533 state_ = CANCELING_RESPONSE; |
| 522 return result; | 534 return result; |
| 523 | 535 |
| 524 case NavigationThrottle::DEFER: | 536 case NavigationThrottle::DEFER: |
| 525 state_ = DEFERRING_RESPONSE; | 537 state_ = DEFERRING_RESPONSE; |
| 526 next_index_ = i + 1; | 538 next_index_ = i + 1; |
| 527 return result; | 539 return result; |
| 528 | 540 |
| 529 case NavigationThrottle::BLOCK_REQUEST: | 541 case NavigationThrottle::BLOCK_REQUEST: |
| 530 NOTREACHED(); | 542 NOTREACHED(); |
| 531 } | 543 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 547 | 559 |
| 548 // No code after running the callback, as it might have resulted in our | 560 // No code after running the callback, as it might have resulted in our |
| 549 // destruction. | 561 // destruction. |
| 550 } | 562 } |
| 551 | 563 |
| 552 void NavigationHandleImpl::RegisterNavigationThrottles() { | 564 void NavigationHandleImpl::RegisterNavigationThrottles() { |
| 553 // Register the navigation throttles. The ScopedVector returned by | 565 // Register the navigation throttles. The ScopedVector returned by |
| 554 // GetNavigationThrottles is not assigned to throttles_ directly because it | 566 // GetNavigationThrottles is not assigned to throttles_ directly because it |
| 555 // would overwrite any throttle previously added with | 567 // would overwrite any throttle previously added with |
| 556 // RegisterThrottleForTesting. | 568 // RegisterThrottleForTesting. |
| 569 |
| 557 ScopedVector<NavigationThrottle> throttles_to_register = | 570 ScopedVector<NavigationThrottle> throttles_to_register = |
| 558 GetContentClient()->browser()->CreateThrottlesForNavigation(this); | 571 GetContentClient()->browser()->CreateThrottlesForNavigation(this); |
| 572 |
| 559 std::unique_ptr<NavigationThrottle> devtools_throttle = | 573 std::unique_ptr<NavigationThrottle> devtools_throttle = |
| 560 RenderFrameDevToolsAgentHost::CreateThrottleForNavigation(this); | 574 RenderFrameDevToolsAgentHost::CreateThrottleForNavigation(this); |
| 561 if (devtools_throttle) | 575 if (devtools_throttle) |
| 562 throttles_to_register.push_back(std::move(devtools_throttle)); | 576 throttles_to_register.push_back(std::move(devtools_throttle)); |
| 563 | 577 |
| 564 std::unique_ptr<NavigationThrottle> clear_site_data_throttle = | 578 std::unique_ptr<NavigationThrottle> clear_site_data_throttle = |
| 565 ClearSiteDataThrottle::CreateThrottleForNavigation(this); | 579 ClearSiteDataThrottle::CreateThrottleForNavigation(this); |
| 566 if (clear_site_data_throttle) | 580 if (clear_site_data_throttle) |
| 567 throttles_to_register.push_back(std::move(clear_site_data_throttle)); | 581 throttles_to_register.push_back(std::move(clear_site_data_throttle)); |
| 568 | 582 |
| 583 std::unique_ptr<content::NavigationThrottle> ancestor_throttle = |
| 584 content::AncestorThrottle::MaybeCreateThrottleFor(this); |
| 585 if (ancestor_throttle) |
| 586 throttles_.push_back(std::move(ancestor_throttle)); |
| 587 |
| 569 if (throttles_to_register.size() > 0) { | 588 if (throttles_to_register.size() > 0) { |
| 570 throttles_.insert(throttles_.begin(), throttles_to_register.begin(), | 589 throttles_.insert(throttles_.begin(), throttles_to_register.begin(), |
| 571 throttles_to_register.end()); | 590 throttles_to_register.end()); |
| 572 throttles_to_register.weak_clear(); | 591 throttles_to_register.weak_clear(); |
| 573 } | 592 } |
| 574 } | 593 } |
| 575 | 594 |
| 576 } // namespace content | 595 } // namespace content |
| OLD | NEW |