OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "base/metrics/histogram_samples.h" | 5 #include "base/metrics/histogram_samples.h" |
6 #include "base/prefs/pref_service.h" | 6 #include "base/prefs/pref_service.h" |
7 #include "base/strings/utf_string_conversions.h" | 7 #include "base/strings/utf_string_conversions.h" |
8 #include "base/test/statistics_delta_reader.h" | 8 #include "base/test/statistics_delta_reader.h" |
| 9 #include "base/time/time.h" |
9 #include "chrome/browser/ui/passwords/manage_passwords_bubble.h" | 10 #include "chrome/browser/ui/passwords/manage_passwords_bubble.h" |
10 #include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h" | 11 #include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h" |
11 #include "chrome/browser/ui/passwords/manage_passwords_icon.h" | 12 #include "chrome/browser/ui/passwords/manage_passwords_icon.h" |
12 #include "chrome/browser/ui/passwords/manage_passwords_icon_mock.h" | 13 #include "chrome/browser/ui/passwords/manage_passwords_icon_mock.h" |
13 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller_mock.h" | 14 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller_mock.h" |
14 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | 15 #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
15 #include "chrome/test/base/testing_profile.h" | 16 #include "chrome/test/base/testing_profile.h" |
16 #include "components/autofill/core/common/password_form.h" | 17 #include "components/autofill/core/common/password_form.h" |
17 #include "components/password_manager/core/browser/password_form_manager.h" | 18 #include "components/password_manager/core/browser/password_form_manager.h" |
18 #include "components/password_manager/core/browser/stub_password_manager_client.
h" | 19 #include "components/password_manager/core/browser/stub_password_manager_client.
h" |
19 #include "components/password_manager/core/browser/stub_password_manager_driver.
h" | 20 #include "components/password_manager/core/browser/stub_password_manager_driver.
h" |
20 #include "components/password_manager/core/common/password_manager_ui.h" | 21 #include "components/password_manager/core/common/password_manager_ui.h" |
21 #include "content/public/test/test_browser_thread_bundle.h" | 22 #include "content/public/test/test_browser_thread_bundle.h" |
22 #include "content/public/test/web_contents_tester.h" | 23 #include "content/public/test/web_contents_tester.h" |
23 #include "testing/gmock/include/gmock/gmock.h" | 24 #include "testing/gmock/include/gmock/gmock.h" |
24 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
25 | 26 |
| 27 namespace { |
| 28 |
| 29 const int64 kSlowNavigationDelayInMS = 2000; |
| 30 const int64 kQuickNavigationDelayInMS = 500; |
| 31 |
| 32 class MockElapsedTimer : public base::ElapsedTimer { |
| 33 public: |
| 34 MockElapsedTimer() {} |
| 35 virtual base::TimeDelta Elapsed() const OVERRIDE { return delta_; } |
| 36 |
| 37 void Advance(int64 ms) { delta_ = base::TimeDelta::FromMilliseconds(ms); } |
| 38 |
| 39 private: |
| 40 base::TimeDelta delta_; |
| 41 |
| 42 DISALLOW_COPY_AND_ASSIGN(MockElapsedTimer); |
| 43 }; |
| 44 |
| 45 } // namespace |
| 46 |
26 class ManagePasswordsUIControllerTest : public ChromeRenderViewHostTestHarness { | 47 class ManagePasswordsUIControllerTest : public ChromeRenderViewHostTestHarness { |
27 public: | 48 public: |
28 ManagePasswordsUIControllerTest() {} | 49 ManagePasswordsUIControllerTest() {} |
29 | 50 |
30 virtual void SetUp() OVERRIDE { | 51 virtual void SetUp() OVERRIDE { |
31 ChromeRenderViewHostTestHarness::SetUp(); | 52 ChromeRenderViewHostTestHarness::SetUp(); |
32 | 53 |
33 // Create the test UIController here so that it's bound to | 54 // Create the test UIController here so that it's bound to |
34 // |test_web_contents_|, and will be retrieved correctly via | 55 // |test_web_contents_|, and will be retrieved correctly via |
35 // ManagePasswordsUIController::FromWebContents in |controller()|. | 56 // ManagePasswordsUIController::FromWebContents in |controller()|. |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 // TODO(mkwst): This should be the value of test_form().origin, but | 113 // TODO(mkwst): This should be the value of test_form().origin, but |
93 // it's being masked by the stub implementation of | 114 // it's being masked by the stub implementation of |
94 // ManagePasswordsUIControllerMock::PendingCredentials. | 115 // ManagePasswordsUIControllerMock::PendingCredentials. |
95 EXPECT_EQ(GURL::EmptyGURL(), controller()->origin()); | 116 EXPECT_EQ(GURL::EmptyGURL(), controller()->origin()); |
96 | 117 |
97 ManagePasswordsIconMock mock; | 118 ManagePasswordsIconMock mock; |
98 controller()->UpdateIconAndBubbleState(&mock); | 119 controller()->UpdateIconAndBubbleState(&mock); |
99 EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE, mock.state()); | 120 EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE, mock.state()); |
100 } | 121 } |
101 | 122 |
| 123 TEST_F(ManagePasswordsUIControllerTest, QuickNavigations) { |
| 124 password_manager::StubPasswordManagerClient client; |
| 125 password_manager::StubPasswordManagerDriver driver; |
| 126 password_manager::PasswordFormManager* test_form_manager = |
| 127 new password_manager::PasswordFormManager( |
| 128 NULL, &client, &driver, test_form(), false); |
| 129 controller()->OnPasswordSubmitted(test_form_manager); |
| 130 ManagePasswordsIconMock mock; |
| 131 controller()->UpdateIconAndBubbleState(&mock); |
| 132 EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE, mock.state()); |
| 133 |
| 134 // Fake-navigate within a second. We expect the bubble's state to persist |
| 135 // if a navigation occurs too quickly for a user to reasonably have been |
| 136 // able to interact with the bubble. This happens on `accounts.google.com`, |
| 137 // for instance. |
| 138 scoped_ptr<MockElapsedTimer> timer(new MockElapsedTimer()); |
| 139 timer->Advance(kQuickNavigationDelayInMS); |
| 140 controller()->SetTimer(timer.release()); |
| 141 controller()->DidNavigateMainFrame(content::LoadCommittedDetails(), |
| 142 content::FrameNavigateParams()); |
| 143 controller()->UpdateIconAndBubbleState(&mock); |
| 144 |
| 145 EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE, mock.state()); |
| 146 } |
| 147 |
| 148 TEST_F(ManagePasswordsUIControllerTest, SlowNavigations) { |
| 149 password_manager::StubPasswordManagerClient client; |
| 150 password_manager::StubPasswordManagerDriver driver; |
| 151 password_manager::PasswordFormManager* test_form_manager = |
| 152 new password_manager::PasswordFormManager( |
| 153 NULL, &client, &driver, test_form(), false); |
| 154 controller()->OnPasswordSubmitted(test_form_manager); |
| 155 ManagePasswordsIconMock mock; |
| 156 controller()->UpdateIconAndBubbleState(&mock); |
| 157 EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE, mock.state()); |
| 158 |
| 159 // Fake-navigate after a second. We expect the bubble's state to be reset |
| 160 // if a navigation occurs after this limit. |
| 161 scoped_ptr<MockElapsedTimer> timer(new MockElapsedTimer()); |
| 162 timer->Advance(kSlowNavigationDelayInMS); |
| 163 controller()->SetTimer(timer.release()); |
| 164 controller()->DidNavigateMainFrame(content::LoadCommittedDetails(), |
| 165 content::FrameNavigateParams()); |
| 166 controller()->UpdateIconAndBubbleState(&mock); |
| 167 |
| 168 EXPECT_EQ(password_manager::ui::INACTIVE_STATE, mock.state()); |
| 169 } |
| 170 |
102 TEST_F(ManagePasswordsUIControllerTest, PasswordSubmittedToNonWebbyURL) { | 171 TEST_F(ManagePasswordsUIControllerTest, PasswordSubmittedToNonWebbyURL) { |
103 // Navigate to a non-webby URL, then see what happens! | 172 // Navigate to a non-webby URL, then see what happens! |
104 content::WebContentsTester::For(web_contents()) | 173 content::WebContentsTester::For(web_contents()) |
105 ->NavigateAndCommit(GURL("chrome://sign-in")); | 174 ->NavigateAndCommit(GURL("chrome://sign-in")); |
106 | 175 |
107 password_manager::StubPasswordManagerClient client; | 176 password_manager::StubPasswordManagerClient client; |
108 password_manager::StubPasswordManagerDriver driver; | 177 password_manager::StubPasswordManagerDriver driver; |
109 password_manager::PasswordFormManager* test_form_manager = | 178 password_manager::PasswordFormManager* test_form_manager = |
110 new password_manager::PasswordFormManager( | 179 new password_manager::PasswordFormManager( |
111 NULL, &client, &driver, test_form(), false); | 180 NULL, &client, &driver, test_form(), false); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 | 259 |
191 EXPECT_EQ(password_manager::ui::BLACKLIST_STATE, controller()->state()); | 260 EXPECT_EQ(password_manager::ui::BLACKLIST_STATE, controller()->state()); |
192 EXPECT_FALSE(controller()->PasswordPendingUserDecision()); | 261 EXPECT_FALSE(controller()->PasswordPendingUserDecision()); |
193 EXPECT_EQ(test_form().origin, controller()->origin()); | 262 EXPECT_EQ(test_form().origin, controller()->origin()); |
194 | 263 |
195 ManagePasswordsIconMock mock; | 264 ManagePasswordsIconMock mock; |
196 controller()->UpdateIconAndBubbleState(&mock); | 265 controller()->UpdateIconAndBubbleState(&mock); |
197 EXPECT_EQ(password_manager::ui::BLACKLIST_STATE, mock.state()); | 266 EXPECT_EQ(password_manager::ui::BLACKLIST_STATE, mock.state()); |
198 } | 267 } |
199 | 268 |
OLD | NEW |