| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 <string> | 5 #include <string> |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/metrics/histogram_samples.h" | 8 #include "base/metrics/histogram_samples.h" |
| 9 #include "base/metrics/statistics_recorder.h" | 9 #include "base/metrics/statistics_recorder.h" |
| 10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 namespace { | 60 namespace { |
| 61 | 61 |
| 62 // Observer that waits for navigation to complete and for the password infobar | 62 // Observer that waits for navigation to complete and for the password infobar |
| 63 // to be shown. | 63 // to be shown. |
| 64 class NavigationObserver : public content::WebContentsObserver { | 64 class NavigationObserver : public content::WebContentsObserver { |
| 65 public: | 65 public: |
| 66 explicit NavigationObserver(content::WebContents* web_contents) | 66 explicit NavigationObserver(content::WebContents* web_contents) |
| 67 : content::WebContentsObserver(web_contents), | 67 : content::WebContentsObserver(web_contents), |
| 68 message_loop_runner_(new content::MessageLoopRunner) {} | 68 message_loop_runner_(new content::MessageLoopRunner) {} |
| 69 | 69 |
| 70 virtual ~NavigationObserver() {} | 70 ~NavigationObserver() override {} |
| 71 | 71 |
| 72 // Normally Wait() will not return until a main frame navigation occurs. | 72 // Normally Wait() will not return until a main frame navigation occurs. |
| 73 // If a path is set, Wait() will return after this path has been seen, | 73 // If a path is set, Wait() will return after this path has been seen, |
| 74 // regardless of the frame that navigated. Useful for multi-frame pages. | 74 // regardless of the frame that navigated. Useful for multi-frame pages. |
| 75 void SetPathToWaitFor(const std::string& path) { | 75 void SetPathToWaitFor(const std::string& path) { |
| 76 wait_for_path_ = path; | 76 wait_for_path_ = path; |
| 77 } | 77 } |
| 78 | 78 |
| 79 // content::WebContentsObserver: | 79 // content::WebContentsObserver: |
| 80 virtual void DidFinishLoad(content::RenderFrameHost* render_frame_host, | 80 void DidFinishLoad(content::RenderFrameHost* render_frame_host, |
| 81 const GURL& validated_url) override { | 81 const GURL& validated_url) override { |
| 82 if (!wait_for_path_.empty()) { | 82 if (!wait_for_path_.empty()) { |
| 83 if (validated_url.path() == wait_for_path_) | 83 if (validated_url.path() == wait_for_path_) |
| 84 message_loop_runner_->Quit(); | 84 message_loop_runner_->Quit(); |
| 85 } else if (!render_frame_host->GetParent()) { | 85 } else if (!render_frame_host->GetParent()) { |
| 86 message_loop_runner_->Quit(); | 86 message_loop_runner_->Quit(); |
| 87 } | 87 } |
| 88 } | 88 } |
| 89 | 89 |
| 90 void Wait() { message_loop_runner_->Run(); } | 90 void Wait() { message_loop_runner_->Run(); } |
| 91 | 91 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 | 131 |
| 132 class InfoBarObserver : public PromptObserver, | 132 class InfoBarObserver : public PromptObserver, |
| 133 public infobars::InfoBarManager::Observer { | 133 public infobars::InfoBarManager::Observer { |
| 134 public: | 134 public: |
| 135 explicit InfoBarObserver(content::WebContents* web_contents) | 135 explicit InfoBarObserver(content::WebContents* web_contents) |
| 136 : infobar_is_being_shown_(false), | 136 : infobar_is_being_shown_(false), |
| 137 infobar_service_(InfoBarService::FromWebContents(web_contents)) { | 137 infobar_service_(InfoBarService::FromWebContents(web_contents)) { |
| 138 infobar_service_->AddObserver(this); | 138 infobar_service_->AddObserver(this); |
| 139 } | 139 } |
| 140 | 140 |
| 141 virtual ~InfoBarObserver() { | 141 ~InfoBarObserver() override { |
| 142 if (infobar_service_) | 142 if (infobar_service_) |
| 143 infobar_service_->RemoveObserver(this); | 143 infobar_service_->RemoveObserver(this); |
| 144 } | 144 } |
| 145 | 145 |
| 146 private: | 146 private: |
| 147 // PromptObserver: | 147 // PromptObserver: |
| 148 virtual bool IsShowingPrompt() const override { | 148 bool IsShowingPrompt() const override { return infobar_is_being_shown_; } |
| 149 return infobar_is_being_shown_; | |
| 150 } | |
| 151 | 149 |
| 152 virtual void AcceptImpl() const override { | 150 void AcceptImpl() const override { |
| 153 EXPECT_EQ(1u, infobar_service_->infobar_count()); | 151 EXPECT_EQ(1u, infobar_service_->infobar_count()); |
| 154 if (!infobar_service_->infobar_count()) | 152 if (!infobar_service_->infobar_count()) |
| 155 return; // Let the test finish to gather possibly more diagnostics. | 153 return; // Let the test finish to gather possibly more diagnostics. |
| 156 | 154 |
| 157 // ConfirmInfoBarDelegate::Accept returning true means the infobar is | 155 // ConfirmInfoBarDelegate::Accept returning true means the infobar is |
| 158 // immediately closed. Checking the return value is preferred to testing | 156 // immediately closed. Checking the return value is preferred to testing |
| 159 // IsShowingPrompt() here, for it avoids the delay until the closing | 157 // IsShowingPrompt() here, for it avoids the delay until the closing |
| 160 // notification is received. | 158 // notification is received. |
| 161 EXPECT_TRUE(infobar_service_->infobar_at(0) | 159 EXPECT_TRUE(infobar_service_->infobar_at(0) |
| 162 ->delegate() | 160 ->delegate() |
| 163 ->AsConfirmInfoBarDelegate() | 161 ->AsConfirmInfoBarDelegate() |
| 164 ->Accept()); | 162 ->Accept()); |
| 165 } | 163 } |
| 166 | 164 |
| 167 // infobars::InfoBarManager::Observer: | 165 // infobars::InfoBarManager::Observer: |
| 168 virtual void OnInfoBarAdded(infobars::InfoBar* infobar) override { | 166 void OnInfoBarAdded(infobars::InfoBar* infobar) override { |
| 169 infobar_is_being_shown_ = true; | 167 infobar_is_being_shown_ = true; |
| 170 } | 168 } |
| 171 | 169 |
| 172 virtual void OnInfoBarRemoved(infobars::InfoBar* infobar, | 170 void OnInfoBarRemoved(infobars::InfoBar* infobar, bool animate) override { |
| 173 bool animate) override { | |
| 174 infobar_is_being_shown_ = false; | 171 infobar_is_being_shown_ = false; |
| 175 } | 172 } |
| 176 | 173 |
| 177 virtual void OnManagerShuttingDown( | 174 void OnManagerShuttingDown(infobars::InfoBarManager* manager) override { |
| 178 infobars::InfoBarManager* manager) override { | |
| 179 ASSERT_EQ(infobar_service_, manager); | 175 ASSERT_EQ(infobar_service_, manager); |
| 180 infobar_service_->RemoveObserver(this); | 176 infobar_service_->RemoveObserver(this); |
| 181 infobar_service_ = NULL; | 177 infobar_service_ = NULL; |
| 182 } | 178 } |
| 183 | 179 |
| 184 bool infobar_is_being_shown_; | 180 bool infobar_is_being_shown_; |
| 185 InfoBarService* infobar_service_; | 181 InfoBarService* infobar_service_; |
| 186 | 182 |
| 187 DISALLOW_COPY_AND_ASSIGN(InfoBarObserver); | 183 DISALLOW_COPY_AND_ASSIGN(InfoBarObserver); |
| 188 }; | 184 }; |
| 189 | 185 |
| 190 class BubbleObserver : public PromptObserver { | 186 class BubbleObserver : public PromptObserver { |
| 191 public: | 187 public: |
| 192 explicit BubbleObserver(content::WebContents* web_contents) | 188 explicit BubbleObserver(content::WebContents* web_contents) |
| 193 : ui_controller_( | 189 : ui_controller_( |
| 194 ManagePasswordsUIController::FromWebContents(web_contents)) {} | 190 ManagePasswordsUIController::FromWebContents(web_contents)) {} |
| 195 | 191 |
| 196 virtual ~BubbleObserver() {} | 192 ~BubbleObserver() override {} |
| 197 | 193 |
| 198 private: | 194 private: |
| 199 // PromptObserver: | 195 // PromptObserver: |
| 200 virtual bool IsShowingPrompt() const override { | 196 bool IsShowingPrompt() const override { |
| 201 return ui_controller_->PasswordPendingUserDecision(); | 197 return ui_controller_->PasswordPendingUserDecision(); |
| 202 } | 198 } |
| 203 | 199 |
| 204 virtual void AcceptImpl() const override { | 200 void AcceptImpl() const override { |
| 205 ui_controller_->SavePassword(); | 201 ui_controller_->SavePassword(); |
| 206 EXPECT_FALSE(IsShowingPrompt()); | 202 EXPECT_FALSE(IsShowingPrompt()); |
| 207 } | 203 } |
| 208 | 204 |
| 209 ManagePasswordsUIController* const ui_controller_; | 205 ManagePasswordsUIController* const ui_controller_; |
| 210 | 206 |
| 211 DISALLOW_COPY_AND_ASSIGN(BubbleObserver); | 207 DISALLOW_COPY_AND_ASSIGN(BubbleObserver); |
| 212 }; | 208 }; |
| 213 | 209 |
| 214 GURL GetFileURL(const char* filename) { | 210 GURL GetFileURL(const char* filename) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 | 253 |
| 258 | 254 |
| 259 // PasswordManagerBrowserTest ------------------------------------------------- | 255 // PasswordManagerBrowserTest ------------------------------------------------- |
| 260 | 256 |
| 261 class PasswordManagerBrowserTest : public InProcessBrowserTest { | 257 class PasswordManagerBrowserTest : public InProcessBrowserTest { |
| 262 public: | 258 public: |
| 263 PasswordManagerBrowserTest() {} | 259 PasswordManagerBrowserTest() {} |
| 264 virtual ~PasswordManagerBrowserTest() {} | 260 virtual ~PasswordManagerBrowserTest() {} |
| 265 | 261 |
| 266 // InProcessBrowserTest: | 262 // InProcessBrowserTest: |
| 267 virtual void SetUpOnMainThread() override { | 263 void SetUpOnMainThread() override { |
| 268 // Use TestPasswordStore to remove a possible race. Normally the | 264 // Use TestPasswordStore to remove a possible race. Normally the |
| 269 // PasswordStore does its database manipulation on the DB thread, which | 265 // PasswordStore does its database manipulation on the DB thread, which |
| 270 // creates a possible race during navigation. Specifically the | 266 // creates a possible race during navigation. Specifically the |
| 271 // PasswordManager will ignore any forms in a page if the load from the | 267 // PasswordManager will ignore any forms in a page if the load from the |
| 272 // PasswordStore has not completed. | 268 // PasswordStore has not completed. |
| 273 PasswordStoreFactory::GetInstance()->SetTestingFactory( | 269 PasswordStoreFactory::GetInstance()->SetTestingFactory( |
| 274 browser()->profile(), TestPasswordStoreService::Build); | 270 browser()->profile(), TestPasswordStoreService::Build); |
| 275 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | 271 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
| 276 ASSERT_FALSE(CommandLine::ForCurrentProcess()->HasSwitch( | 272 ASSERT_FALSE(CommandLine::ForCurrentProcess()->HasSwitch( |
| 277 password_manager::switches::kEnableAutomaticPasswordSaving)); | 273 password_manager::switches::kEnableAutomaticPasswordSaving)); |
| 278 } | 274 } |
| 279 | 275 |
| 280 virtual void TearDownOnMainThread() override { | 276 void TearDownOnMainThread() override { |
| 281 ASSERT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); | 277 ASSERT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); |
| 282 } | 278 } |
| 283 | 279 |
| 284 protected: | 280 protected: |
| 285 content::WebContents* WebContents() { | 281 content::WebContents* WebContents() { |
| 286 return browser()->tab_strip_model()->GetActiveWebContents(); | 282 return browser()->tab_strip_model()->GetActiveWebContents(); |
| 287 } | 283 } |
| 288 | 284 |
| 289 content::RenderViewHost* RenderViewHost() { | 285 content::RenderViewHost* RenderViewHost() { |
| 290 return WebContents()->GetRenderViewHost(); | 286 return WebContents()->GetRenderViewHost(); |
| (...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1273 NavigateToFile("/password/form_with_only_password_field.html"); | 1269 NavigateToFile("/password/form_with_only_password_field.html"); |
| 1274 | 1270 |
| 1275 // Let the user interact with the page, so that DOM gets modification events, | 1271 // Let the user interact with the page, so that DOM gets modification events, |
| 1276 // needed for autofilling fields. | 1272 // needed for autofilling fields. |
| 1277 content::SimulateMouseClickAt( | 1273 content::SimulateMouseClickAt( |
| 1278 WebContents(), 0, blink::WebMouseEvent::ButtonLeft, gfx::Point(1, 1)); | 1274 WebContents(), 0, blink::WebMouseEvent::ButtonLeft, gfx::Point(1, 1)); |
| 1279 | 1275 |
| 1280 // Wait until that interaction causes the password value to be revealed. | 1276 // Wait until that interaction causes the password value to be revealed. |
| 1281 WaitForElementValue("password", "mypassword"); | 1277 WaitForElementValue("password", "mypassword"); |
| 1282 } | 1278 } |
| OLD | NEW |