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

Side by Side Diff: content/public/test/browser_test_utils.cc

Issue 2396493002: Improve the TestNavigationManager (Closed)
Patch Set: Improve the TestNavigationManager Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/public/test/browser_test_utils.h" 5 #include "content/public/test/browser_test_utils.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <tuple> 8 #include <tuple>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 1627 matching lines...) Expand 10 before | Expand all | Expand 10 after
1638 FrameFocusedObserver::~FrameFocusedObserver() {} 1638 FrameFocusedObserver::~FrameFocusedObserver() {}
1639 1639
1640 void FrameFocusedObserver::Wait() { 1640 void FrameFocusedObserver::Wait() {
1641 impl_->Run(); 1641 impl_->Run();
1642 } 1642 }
1643 1643
1644 TestNavigationManager::TestNavigationManager(WebContents* web_contents, 1644 TestNavigationManager::TestNavigationManager(WebContents* web_contents,
1645 const GURL& url) 1645 const GURL& url)
1646 : WebContentsObserver(web_contents), 1646 : WebContentsObserver(web_contents),
1647 url_(url), 1647 url_(url),
1648 navigation_paused_in_will_start_(false),
1649 navigation_paused_in_will_process_response_(false),
1650 handle_(nullptr), 1648 handle_(nullptr),
1651 handled_navigation_(false), 1649 navigation_paused_(false),
1650 current_state_(NavigationState::INITIAL),
1651 desired_state_(NavigationState::STARTED),
1652 weak_factory_(this) {} 1652 weak_factory_(this) {}
1653 1653
1654 TestNavigationManager::~TestNavigationManager() { 1654 TestNavigationManager::~TestNavigationManager() {
1655 ResumeNavigation(); 1655 if (navigation_paused_)
1656 handle_->Resume();
1656 } 1657 }
1657 1658
1658 bool TestNavigationManager::WaitForWillStartRequest() { 1659 bool TestNavigationManager::WaitForWillStartRequest() {
1659 DCHECK(!did_finish_loop_runner_); 1660 // This is the default desired state. In PlzNavigate, a browser-initiated
1660 if (!handle_ && handled_navigation_) 1661 // navigation can reach this state synchronously, so the TestNavigationManager
1661 return true; 1662 // is set to always pause navigations at WillStartRequest. This ensures the
1662 if (navigation_paused_in_will_start_) 1663 // user can always call WaitForWillStartRequest.
1663 return true; 1664 DCHECK(desired_state_ == NavigationState::STARTED);
1664 DCHECK(!navigation_paused_in_will_process_response_); 1665 return WaitForDesiredState();
1665 will_start_loop_runner_ = new MessageLoopRunner();
1666 will_start_loop_runner_->Run();
1667 will_start_loop_runner_ = nullptr;
1668
1669 // This will only be false if DidFinishNavigation is called before
1670 // OnWillStartRequest, which could occur if a throttle cancels the navigation
1671 // before the TestNavigationManagerThrottle's method is called.
1672 return !handled_navigation_;
1673 } 1666 }
1674 1667
1675 bool TestNavigationManager::WaitForWillProcessResponse() { 1668 bool TestNavigationManager::WaitForResponse() {
1676 DCHECK(!did_finish_loop_runner_); 1669 desired_state_ = NavigationState::RESPONSE;
1677 if (!handle_ && handled_navigation_) 1670 return WaitForDesiredState();
1678 return true;
1679 if (navigation_paused_in_will_process_response_)
1680 return true;
1681 // Ensure the navigation is resumed if the manager paused it previously.
1682 if (navigation_paused_in_will_start_)
1683 ResumeNavigation();
1684 will_process_response_loop_runner_ = new MessageLoopRunner();
1685 will_process_response_loop_runner_->Run();
1686 will_process_response_loop_runner_ = nullptr;
1687
1688 // This will only be false if DidFinishNavigation is called before
1689 // OnWillProcessResponse.
1690 return !handled_navigation_;
1691 } 1671 }
1692 1672
1693 void TestNavigationManager::WaitForNavigationFinished() { 1673 void TestNavigationManager::WaitForNavigationFinished() {
1694 DCHECK(!will_start_loop_runner_); 1674 desired_state_ = NavigationState::FINISHED;
1695 if (!handle_ && handled_navigation_) 1675 WaitForDesiredState();
1696 return;
1697 // Ensure the navigation is resumed if the manager paused it previously.
1698 if (navigation_paused_in_will_start_ ||
1699 navigation_paused_in_will_process_response_) {
1700 ResumeNavigation();
1701 }
1702 did_finish_loop_runner_ = new MessageLoopRunner();
1703 did_finish_loop_runner_->Run();
1704 did_finish_loop_runner_ = nullptr;
1705 } 1676 }
1706 1677
1707 void TestNavigationManager::DidStartNavigation(NavigationHandle* handle) { 1678 void TestNavigationManager::DidStartNavigation(NavigationHandle* handle) {
1708 if (!ShouldMonitorNavigation(handle)) 1679 if (!ShouldMonitorNavigation(handle))
1709 return; 1680 return;
1710 1681
1711 handle_ = handle; 1682 handle_ = handle;
1712 std::unique_ptr<NavigationThrottle> throttle( 1683 std::unique_ptr<NavigationThrottle> throttle(
1713 new TestNavigationManagerThrottle( 1684 new TestNavigationManagerThrottle(
1714 handle_, base::Bind(&TestNavigationManager::OnWillStartRequest, 1685 handle_, base::Bind(&TestNavigationManager::OnWillStartRequest,
1715 weak_factory_.GetWeakPtr()), 1686 weak_factory_.GetWeakPtr()),
1716 base::Bind(&TestNavigationManager::OnWillProcessResponse, 1687 base::Bind(&TestNavigationManager::OnWillProcessResponse,
1717 weak_factory_.GetWeakPtr()))); 1688 weak_factory_.GetWeakPtr())));
1718 handle_->RegisterThrottleForTesting(std::move(throttle)); 1689 handle_->RegisterThrottleForTesting(std::move(throttle));
1719 } 1690 }
1720 1691
1721 void TestNavigationManager::DidFinishNavigation(NavigationHandle* handle) { 1692 void TestNavigationManager::DidFinishNavigation(NavigationHandle* handle) {
1722 if (handle != handle_) 1693 if (handle != handle_)
1723 return; 1694 return;
1695 current_state_ = NavigationState::FINISHED;
1696 navigation_paused_ = false;
1724 handle_ = nullptr; 1697 handle_ = nullptr;
1725 handled_navigation_ = true; 1698 OnNavigationStateChanged();
1726 navigation_paused_in_will_start_ = false;
1727 navigation_paused_in_will_process_response_ = false;
1728
1729 // Resume any clients that are waiting for the end of the navigation. Note
1730 // that |will_start_loop_runner_| can be running if the navigation was
1731 // cancelled while it was deferred.
1732 if (did_finish_loop_runner_)
1733 did_finish_loop_runner_->Quit();
1734 if (will_start_loop_runner_)
1735 will_start_loop_runner_->Quit();
1736 if (will_process_response_loop_runner_)
1737 will_process_response_loop_runner_->Quit();
1738 } 1699 }
1739 1700
1740 void TestNavigationManager::OnWillStartRequest() { 1701 void TestNavigationManager::OnWillStartRequest() {
1741 navigation_paused_in_will_start_ = true; 1702 current_state_ = NavigationState::STARTED;
1742 if (will_start_loop_runner_) 1703 navigation_paused_ = true;
1743 will_start_loop_runner_->Quit(); 1704 OnNavigationStateChanged();
1744
1745 // If waiting for further events in the navigation, resume the navigation.
1746 if (did_finish_loop_runner_ || will_process_response_loop_runner_)
1747 ResumeNavigation();
1748 } 1705 }
1749 1706
1750 void TestNavigationManager::OnWillProcessResponse() { 1707 void TestNavigationManager::OnWillProcessResponse() {
1751 navigation_paused_in_will_process_response_ = true; 1708 current_state_ = NavigationState::RESPONSE;
1752 DCHECK(!will_start_loop_runner_); 1709 navigation_paused_ = true;
1753 if (will_process_response_loop_runner_) 1710 OnNavigationStateChanged();
1754 will_process_response_loop_runner_->Quit();
1755
1756 // If waiting for further events in the navigation, resume the navigation.
1757 if (did_finish_loop_runner_)
1758 ResumeNavigation();
1759 } 1711 }
1760 1712
1761 void TestNavigationManager::ResumeNavigation() { 1713 bool TestNavigationManager::WaitForDesiredState() {
1762 if (!(navigation_paused_in_will_start_ || 1714 // If the desired state has laready been reached, just return.
1763 navigation_paused_in_will_process_response_) || 1715 if (current_state_ == desired_state_)
1764 !handle_) { 1716 return true;
1717
1718 // Resume the navigation if it was paused.
1719 if (navigation_paused_)
1720 handle_->Resume();
1721
1722 // Wait for the desired state if needed.
1723 if (current_state_ < desired_state_) {
1724 DCHECK(!loop_runner_);
1725 loop_runner_ = new MessageLoopRunner();
1726 loop_runner_->Run();
1727 loop_runner_ = nullptr;
1728 }
1729
1730 // Return false if the navigation did not reach the state specified by the
1731 // user.
1732 return current_state_ == desired_state_;
1733 }
1734
1735 void TestNavigationManager::OnNavigationStateChanged() {
1736 // If the state the user was waiting for has been reached, exit the message
1737 // loop.
1738 if (current_state_ >= desired_state_) {
1739 if (loop_runner_)
1740 loop_runner_->Quit();
1765 return; 1741 return;
1766 } 1742 }
1767 navigation_paused_in_will_start_ = false; 1743
1768 navigation_paused_in_will_process_response_ = false; 1744 // Otherwise, the navigation should be resumed if it was previously paused.
1769 handle_->Resume(); 1745 if (navigation_paused_)
1746 handle_->Resume();
1770 } 1747 }
1771 1748
1772 bool TestNavigationManager::ShouldMonitorNavigation(NavigationHandle* handle) { 1749 bool TestNavigationManager::ShouldMonitorNavigation(NavigationHandle* handle) {
1773 if (handle_ || handle->GetURL() != url_) 1750 if (handle_ || handle->GetURL() != url_)
1774 return false; 1751 return false;
1775 if (handled_navigation_) 1752 if (current_state_ != NavigationState::INITIAL)
1776 return false; 1753 return false;
1777 return true; 1754 return true;
1778 } 1755 }
1779 1756
1780 } // namespace content 1757 } // namespace content
OLDNEW
« content/public/test/browser_test_utils.h ('K') | « content/public/test/browser_test_utils.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698