Chromium Code Reviews| Index: chrome/browser/captive_portal/captive_portal_browsertest.cc |
| diff --git a/chrome/browser/captive_portal/captive_portal_browsertest.cc b/chrome/browser/captive_portal/captive_portal_browsertest.cc |
| index 092962675f82a6dfe5ed84656d93fbe031386ee8..bad3517a4203c717ece6071bf70a5081dd8146a7 100644 |
| --- a/chrome/browser/captive_portal/captive_portal_browsertest.cc |
| +++ b/chrome/browser/captive_portal/captive_portal_browsertest.cc |
| @@ -17,6 +17,7 @@ |
| #include "base/macros.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/path_service.h" |
| +#include "base/scoped_observer.h" |
| #include "base/sequence_checker.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/values.h" |
| @@ -37,6 +38,7 @@ |
| #include "chrome/browser/ui/browser_navigator_params.h" |
| #include "chrome/browser/ui/tab_contents/tab_contents_iterator.h" |
| #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| +#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" |
| #include "chrome/common/chrome_paths.h" |
| #include "chrome/common/pref_names.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| @@ -893,6 +895,43 @@ void AddHstsHost(net::URLRequestContextGetter* context_getter, |
| transport_security_state->AddHSTS(host, expiry, include_subdomains); |
| } |
| +class TabActivationWaiter : public TabStripModelObserver { |
| + public: |
| + explicit TabActivationWaiter(TabStripModel* tab_strip_model) |
| + : number_of_unconsumed_active_tab_changes_(0), scoped_observer_(this) { |
| + scoped_observer_.Add(tab_strip_model); |
| + } |
| + |
| + void WaitUntilActiveTabChanges() { |
|
mmenke
2017/07/06 16:10:34
Suggestion: Wait for a single change, and fail if
Łukasz Anforowicz
2017/07/06 16:46:56
Good point. Done.
|
| + if (number_of_unconsumed_active_tab_changes_ == 0) { |
| + // Wait until TabStripModelObserver::ActiveTabChanged will get called. |
| + message_loop_runner_ = new content::MessageLoopRunner; |
| + message_loop_runner_->Run(); |
| + } |
| + |
| + // "consume" one tab activation event. |
| + DCHECK_LT(0, number_of_unconsumed_active_tab_changes_); |
| + number_of_unconsumed_active_tab_changes_--; |
| + } |
| + |
| + // TabStripModelObserver overrides. |
| + void ActiveTabChanged(content::WebContents* old_contents, |
| + content::WebContents* new_contents, |
| + int index, |
| + int reason) override { |
| + number_of_unconsumed_active_tab_changes_++; |
| + if (message_loop_runner_) |
| + message_loop_runner_->Quit(); |
| + } |
| + |
| + private: |
| + scoped_refptr<content::MessageLoopRunner> message_loop_runner_; |
| + int number_of_unconsumed_active_tab_changes_; |
| + ScopedObserver<TabStripModel, TabActivationWaiter> scoped_observer_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(TabActivationWaiter); |
| +}; |
| + |
| } // namespace |
| class CaptivePortalBrowserTest : public InProcessBrowserTest { |
| @@ -1536,8 +1575,8 @@ void CaptivePortalBrowserTest::NavigateLoginTab(Browser* browser, |
| ASSERT_TRUE(IsLoginTab(browser->tab_strip_model()->GetActiveWebContents())); |
| // Do the navigation. |
| - EXPECT_TRUE(content::ExecuteScript(tab_strip_model->GetActiveWebContents(), |
| - "submitForm()")); |
| + content::ExecuteUnmodifiedScript(tab_strip_model->GetActiveWebContents(), |
| + "submitForm()"); |
| portal_observer.WaitForResults(1); |
| navigation_observer.WaitForNavigations(1); |
| @@ -1582,8 +1621,8 @@ void CaptivePortalBrowserTest::Login(Browser* browser, |
| ASSERT_TRUE(IsLoginTab(tab_strip_model->GetWebContentsAt(login_tab_index))); |
| // Trigger a navigation. |
| - EXPECT_TRUE(content::ExecuteScript(tab_strip_model->GetActiveWebContents(), |
| - "submitForm()")); |
| + content::ExecuteUnmodifiedScript(tab_strip_model->GetActiveWebContents(), |
| + "submitForm()"); |
| portal_observer.WaitForResults(1); |
| @@ -1624,8 +1663,8 @@ void CaptivePortalBrowserTest::LoginCertError(Browser* browser) { |
| ASSERT_TRUE(IsLoginTab(tab_strip_model->GetWebContentsAt(login_tab_index))); |
| // Trigger a navigation. |
| - EXPECT_TRUE(content::ExecuteScript(tab_strip_model->GetActiveWebContents(), |
| - "submitForm()")); |
| + content::ExecuteUnmodifiedScript(tab_strip_model->GetActiveWebContents(), |
| + "submitForm()"); |
| // The captive portal tab navigation will trigger a captive portal check, |
| // and reloading the original tab will bring up the interstitial page again, |
| @@ -1977,8 +2016,11 @@ IN_PROC_BROWSER_TEST_F(CaptivePortalBrowserTest, |
| EXPECT_TRUE(WaitForRenderFrameReady(rfh)); |
| const char kClickConnectButtonJS[] = |
| "document.getElementById('primary-button').click();"; |
| - EXPECT_TRUE( |
| - content::ExecuteScript(rfh, kClickConnectButtonJS)); |
| + { |
| + TabActivationWaiter tab_activation_waiter(tab_strip_model); |
| + content::ExecuteUnmodifiedScript(rfh, kClickConnectButtonJS); |
| + tab_activation_waiter.WaitUntilActiveTabChanges(); |
| + } |
| EXPECT_EQ(login_tab_index, tab_strip_model->active_index()); |
| // For completeness, close the login tab and try clicking |Connect| again. |
| @@ -1990,8 +2032,7 @@ IN_PROC_BROWSER_TEST_F(CaptivePortalBrowserTest, |
| tab_strip_model->CloseWebContentsAt(tab_strip_model->active_index(), 0)); |
| destroyed_watcher.Wait(); |
| MultiNavigationObserver navigation_observer; |
| - EXPECT_TRUE( |
| - content::ExecuteScript(rfh, kClickConnectButtonJS)); |
| + content::ExecuteUnmodifiedScript(rfh, kClickConnectButtonJS); |
| navigation_observer.WaitForNavigations(1); |
| EXPECT_EQ(login_tab_index, tab_strip_model->active_index()); |