Index: chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc |
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc |
index d4bb9e71f6d0b316071fd605bb040bd2f99634f2..08f78fdd2d0ad7bb726826307e97f91816f79355 100644 |
--- a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc |
+++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc |
@@ -6,6 +6,7 @@ |
#include "base/prefs/pref_service.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/test/statistics_delta_reader.h" |
+#include "base/time/time.h" |
#include "chrome/browser/ui/passwords/manage_passwords_bubble.h" |
#include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h" |
#include "chrome/browser/ui/passwords/manage_passwords_icon.h" |
@@ -23,6 +24,26 @@ |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+namespace { |
+ |
+const int64 kSlowNavigationDelayInMS = 2000; |
+const int64 kQuickNavigationDelayInMS = 500; |
+ |
+class MockElapsedTimer : public base::ElapsedTimer { |
+ public: |
+ MockElapsedTimer() {} |
+ virtual base::TimeDelta Elapsed() const OVERRIDE { return delta_; } |
+ |
+ void Advance(int64 ms) { delta_ = base::TimeDelta::FromMilliseconds(ms); } |
+ |
+ private: |
+ base::TimeDelta delta_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MockElapsedTimer); |
+}; |
+ |
+} // namespace |
+ |
class ManagePasswordsUIControllerTest : public ChromeRenderViewHostTestHarness { |
public: |
ManagePasswordsUIControllerTest() {} |
@@ -99,6 +120,54 @@ TEST_F(ManagePasswordsUIControllerTest, PasswordSubmitted) { |
EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE, mock.state()); |
} |
+TEST_F(ManagePasswordsUIControllerTest, QuickNavigations) { |
+ password_manager::StubPasswordManagerClient client; |
+ password_manager::StubPasswordManagerDriver driver; |
+ password_manager::PasswordFormManager* test_form_manager = |
+ new password_manager::PasswordFormManager( |
+ NULL, &client, &driver, test_form(), false); |
+ controller()->OnPasswordSubmitted(test_form_manager); |
+ ManagePasswordsIconMock mock; |
+ controller()->UpdateIconAndBubbleState(&mock); |
+ EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE, mock.state()); |
+ |
+ // Fake-navigate within a second. We expect the bubble's state to persist |
+ // if a navigation occurs too quickly for a user to reasonably have been |
+ // able to interact with the bubble. This happens on `accounts.google.com`, |
+ // for instance. |
+ scoped_ptr<MockElapsedTimer> timer(new MockElapsedTimer()); |
+ timer->Advance(kQuickNavigationDelayInMS); |
+ controller()->SetTimer(timer.release()); |
+ controller()->DidNavigateMainFrame(content::LoadCommittedDetails(), |
+ content::FrameNavigateParams()); |
+ controller()->UpdateIconAndBubbleState(&mock); |
+ |
+ EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE, mock.state()); |
+} |
+ |
+TEST_F(ManagePasswordsUIControllerTest, SlowNavigations) { |
+ password_manager::StubPasswordManagerClient client; |
+ password_manager::StubPasswordManagerDriver driver; |
+ password_manager::PasswordFormManager* test_form_manager = |
+ new password_manager::PasswordFormManager( |
+ NULL, &client, &driver, test_form(), false); |
+ controller()->OnPasswordSubmitted(test_form_manager); |
+ ManagePasswordsIconMock mock; |
+ controller()->UpdateIconAndBubbleState(&mock); |
+ EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE, mock.state()); |
+ |
+ // Fake-navigate after a second. We expect the bubble's state to be reset |
+ // if a navigation occurs after this limit. |
+ scoped_ptr<MockElapsedTimer> timer(new MockElapsedTimer()); |
+ timer->Advance(kSlowNavigationDelayInMS); |
+ controller()->SetTimer(timer.release()); |
+ controller()->DidNavigateMainFrame(content::LoadCommittedDetails(), |
+ content::FrameNavigateParams()); |
+ controller()->UpdateIconAndBubbleState(&mock); |
+ |
+ EXPECT_EQ(password_manager::ui::INACTIVE_STATE, mock.state()); |
+} |
+ |
TEST_F(ManagePasswordsUIControllerTest, PasswordSubmittedToNonWebbyURL) { |
// Navigate to a non-webby URL, then see what happens! |
content::WebContentsTester::For(web_contents()) |