| 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/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 #include "ui/events/keycodes/keyboard_codes.h" | 48 #include "ui/events/keycodes/keyboard_codes.h" |
| 49 #include "ui/gfx/geometry/point.h" | 49 #include "ui/gfx/geometry/point.h" |
| 50 | 50 |
| 51 | 51 |
| 52 // NavigationObserver --------------------------------------------------------- | 52 // NavigationObserver --------------------------------------------------------- |
| 53 | 53 |
| 54 namespace { | 54 namespace { |
| 55 | 55 |
| 56 // Observer that waits for navigation to complete and for the password infobar | 56 // Observer that waits for navigation to complete and for the password infobar |
| 57 // to be shown. | 57 // to be shown. |
| 58 class NavigationObserver : public content::WebContentsObserver, | 58 class NavigationObserver : public content::WebContentsObserver { |
| 59 public infobars::InfoBarManager::Observer { | |
| 60 public: | 59 public: |
| 61 explicit NavigationObserver(content::WebContents* web_contents) | 60 explicit NavigationObserver(content::WebContents* web_contents) |
| 62 : content::WebContentsObserver(web_contents), | 61 : content::WebContentsObserver(web_contents), |
| 63 message_loop_runner_(new content::MessageLoopRunner), | 62 message_loop_runner_(new content::MessageLoopRunner) {} |
| 64 infobar_shown_(false), | |
| 65 infobar_removed_(false), | |
| 66 should_automatically_accept_infobar_(true), | |
| 67 infobar_service_(InfoBarService::FromWebContents(web_contents)) { | |
| 68 infobar_service_->AddObserver(this); | |
| 69 } | |
| 70 | 63 |
| 71 virtual ~NavigationObserver() { | 64 virtual ~NavigationObserver() {} |
| 72 if (infobar_service_) | |
| 73 infobar_service_->RemoveObserver(this); | |
| 74 } | |
| 75 | 65 |
| 76 // Normally Wait() will not return until a main frame navigation occurs. | 66 // Normally Wait() will not return until a main frame navigation occurs. |
| 77 // If a path is set, Wait() will return after this path has been seen, | 67 // If a path is set, Wait() will return after this path has been seen, |
| 78 // regardless of the frame that navigated. Useful for multi-frame pages. | 68 // regardless of the frame that navigated. Useful for multi-frame pages. |
| 79 void SetPathToWaitFor(const std::string& path) { | 69 void SetPathToWaitFor(const std::string& path) { |
| 80 wait_for_path_ = path; | 70 wait_for_path_ = path; |
| 81 } | 71 } |
| 82 | 72 |
| 83 // content::WebContentsObserver: | 73 // content::WebContentsObserver: |
| 84 virtual void DidFinishLoad(content::RenderFrameHost* render_frame_host, | 74 virtual void DidFinishLoad(content::RenderFrameHost* render_frame_host, |
| 85 const GURL& validated_url) OVERRIDE { | 75 const GURL& validated_url) OVERRIDE { |
| 86 if (!wait_for_path_.empty()) { | 76 if (!wait_for_path_.empty()) { |
| 87 if (validated_url.path() == wait_for_path_) | 77 if (validated_url.path() == wait_for_path_) |
| 88 message_loop_runner_->Quit(); | 78 message_loop_runner_->Quit(); |
| 89 } else if (!render_frame_host->GetParent()) { | 79 } else if (!render_frame_host->GetParent()) { |
| 90 message_loop_runner_->Quit(); | 80 message_loop_runner_->Quit(); |
| 91 } | 81 } |
| 92 } | 82 } |
| 93 | 83 |
| 94 bool infobar_shown() const { return infobar_shown_; } | 84 void Wait() { message_loop_runner_->Run(); } |
| 95 bool infobar_removed() const { return infobar_removed_; } | |
| 96 | 85 |
| 97 void disable_should_automatically_accept_infobar() { | 86 private: |
| 98 should_automatically_accept_infobar_ = false; | 87 std::string wait_for_path_; |
| 88 scoped_refptr<content::MessageLoopRunner> message_loop_runner_; |
| 89 |
| 90 DISALLOW_COPY_AND_ASSIGN(NavigationObserver); |
| 91 }; |
| 92 |
| 93 // Observes the save password prompt (bubble or infobar) for a specified |
| 94 // WebContents, keeps track of whether or not it is currently shown, and allows |
| 95 // accepting saving passwords through it. |
| 96 class PromptObserver { |
| 97 public: |
| 98 virtual ~PromptObserver() {} |
| 99 |
| 100 // Checks if the prompt is being currently shown. |
| 101 virtual bool IsShowingPrompt() const = 0; |
| 102 |
| 103 // Expecting that the prompt is shown, saves the password. Checks that the |
| 104 // prompt is no longer visible afterwards. |
| 105 void Accept() const { |
| 106 EXPECT_TRUE(IsShowingPrompt()); |
| 107 AcceptImpl(); |
| 99 } | 108 } |
| 100 | 109 |
| 101 void Wait() { | 110 // Chooses the right implementation of PromptObserver and creates an instance |
| 102 message_loop_runner_->Run(); | 111 // of it. |
| 112 static scoped_ptr<PromptObserver> Create(content::WebContents* web_contents); |
| 113 |
| 114 protected: |
| 115 PromptObserver() {} |
| 116 |
| 117 // Accepts the password. The implementation can assume that the prompt is |
| 118 // currently shown, but is required to verify that the prompt is eventually |
| 119 // closed. |
| 120 virtual void AcceptImpl() const = 0; |
| 121 |
| 122 private: |
| 123 DISALLOW_COPY_AND_ASSIGN(PromptObserver); |
| 124 }; |
| 125 |
| 126 class InfoBarObserver : public PromptObserver, |
| 127 public infobars::InfoBarManager::Observer { |
| 128 public: |
| 129 explicit InfoBarObserver(content::WebContents* web_contents) |
| 130 : infobar_is_being_shown_(false), |
| 131 infobar_service_(InfoBarService::FromWebContents(web_contents)) { |
| 132 infobar_service_->AddObserver(this); |
| 133 } |
| 134 |
| 135 virtual ~InfoBarObserver() { |
| 136 if (infobar_service_) |
| 137 infobar_service_->RemoveObserver(this); |
| 103 } | 138 } |
| 104 | 139 |
| 105 private: | 140 private: |
| 141 // PromptObserver: |
| 142 virtual bool IsShowingPrompt() const OVERRIDE { |
| 143 return infobar_is_being_shown_; |
| 144 } |
| 145 |
| 146 virtual void AcceptImpl() const OVERRIDE { |
| 147 EXPECT_EQ(1u, infobar_service_->infobar_count()); |
| 148 if (!infobar_service_->infobar_count()) |
| 149 return; // Let the test finish to gather possibly more diagnostics. |
| 150 |
| 151 // ConfirmInfoBarDelegate::Accept returning true means the infobar is |
| 152 // immediately closed. Checking the return value is preferred to testing |
| 153 // IsShowingPrompt() here, for it avoids the delay until the closing |
| 154 // notification is received. |
| 155 EXPECT_TRUE(infobar_service_->infobar_at(0) |
| 156 ->delegate() |
| 157 ->AsConfirmInfoBarDelegate() |
| 158 ->Accept()); |
| 159 } |
| 160 |
| 106 // infobars::InfoBarManager::Observer: | 161 // infobars::InfoBarManager::Observer: |
| 107 virtual void OnInfoBarAdded(infobars::InfoBar* infobar) OVERRIDE { | 162 virtual void OnInfoBarAdded(infobars::InfoBar* infobar) OVERRIDE { |
| 108 if (should_automatically_accept_infobar_) { | 163 infobar_is_being_shown_ = true; |
| 109 infobar_service_->infobar_at(0)->delegate()-> | |
| 110 AsConfirmInfoBarDelegate()->Accept(); | |
| 111 } | |
| 112 infobar_shown_ = true; | |
| 113 } | 164 } |
| 114 | 165 |
| 115 virtual void OnInfoBarRemoved(infobars::InfoBar* infobar, | 166 virtual void OnInfoBarRemoved(infobars::InfoBar* infobar, |
| 116 bool animate) OVERRIDE { | 167 bool animate) OVERRIDE { |
| 117 infobar_removed_ = true; | 168 infobar_is_being_shown_ = false; |
| 118 } | 169 } |
| 119 | 170 |
| 120 virtual void OnManagerShuttingDown( | 171 virtual void OnManagerShuttingDown( |
| 121 infobars::InfoBarManager* manager) OVERRIDE { | 172 infobars::InfoBarManager* manager) OVERRIDE { |
| 122 ASSERT_EQ(infobar_service_, manager); | 173 ASSERT_EQ(infobar_service_, manager); |
| 123 infobar_service_->RemoveObserver(this); | 174 infobar_service_->RemoveObserver(this); |
| 124 infobar_service_ = NULL; | 175 infobar_service_ = NULL; |
| 125 } | 176 } |
| 126 | 177 |
| 127 std::string wait_for_path_; | 178 bool infobar_is_being_shown_; |
| 128 scoped_refptr<content::MessageLoopRunner> message_loop_runner_; | |
| 129 bool infobar_shown_; | |
| 130 bool infobar_removed_; | |
| 131 // If |should_automatically_accept_infobar_| is true, then whenever the test | |
| 132 // sees an infobar added, it will click its accepting button. Default = true. | |
| 133 bool should_automatically_accept_infobar_; | |
| 134 InfoBarService* infobar_service_; | 179 InfoBarService* infobar_service_; |
| 135 | 180 |
| 136 DISALLOW_COPY_AND_ASSIGN(NavigationObserver); | 181 DISALLOW_COPY_AND_ASSIGN(InfoBarObserver); |
| 137 }; | 182 }; |
| 138 | 183 |
| 184 class BubbleObserver : public PromptObserver { |
| 185 public: |
| 186 explicit BubbleObserver(content::WebContents* web_contents) |
| 187 : ui_controller_( |
| 188 ManagePasswordsUIController::FromWebContents(web_contents)) {} |
| 189 |
| 190 virtual ~BubbleObserver() {} |
| 191 |
| 192 private: |
| 193 // PromptObserver: |
| 194 virtual bool IsShowingPrompt() const OVERRIDE { |
| 195 return ui_controller_->PasswordPendingUserDecision(); |
| 196 } |
| 197 |
| 198 virtual void AcceptImpl() const OVERRIDE { |
| 199 ui_controller_->SavePassword(); |
| 200 EXPECT_FALSE(IsShowingPrompt()); |
| 201 } |
| 202 |
| 203 ManagePasswordsUIController* const ui_controller_; |
| 204 |
| 205 DISALLOW_COPY_AND_ASSIGN(BubbleObserver); |
| 206 }; |
| 207 |
| 208 // static |
| 209 scoped_ptr<PromptObserver> PromptObserver::Create( |
| 210 content::WebContents* web_contents) { |
| 211 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { |
| 212 return scoped_ptr<PromptObserver>(new BubbleObserver(web_contents)); |
| 213 } else { |
| 214 return scoped_ptr<PromptObserver>(new InfoBarObserver(web_contents)); |
| 215 } |
| 216 } |
| 217 |
| 139 // Handles |request| to "/basic_auth". If "Authorization" header is present, | 218 // Handles |request| to "/basic_auth". If "Authorization" header is present, |
| 140 // responds with a non-empty HTTP 200 page (regardless of its value). Otherwise | 219 // responds with a non-empty HTTP 200 page (regardless of its value). Otherwise |
| 141 // serves a Basic Auth challenge. | 220 // serves a Basic Auth challenge. |
| 142 scoped_ptr<net::test_server::HttpResponse> HandleTestAuthRequest( | 221 scoped_ptr<net::test_server::HttpResponse> HandleTestAuthRequest( |
| 143 const net::test_server::HttpRequest& request) { | 222 const net::test_server::HttpRequest& request) { |
| 144 if (!StartsWithASCII(request.relative_url, "/basic_auth", true)) | 223 if (!StartsWithASCII(request.relative_url, "/basic_auth", true)) |
| 145 return scoped_ptr<net::test_server::HttpResponse>(); | 224 return scoped_ptr<net::test_server::HttpResponse>(); |
| 146 | 225 |
| 147 if (ContainsKey(request.headers, "Authorization")) { | 226 if (ContainsKey(request.headers, "Authorization")) { |
| 148 scoped_ptr<net::test_server::BasicHttpResponse> http_response( | 227 scoped_ptr<net::test_server::BasicHttpResponse> http_response( |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 | 268 |
| 190 protected: | 269 protected: |
| 191 content::WebContents* WebContents() { | 270 content::WebContents* WebContents() { |
| 192 return browser()->tab_strip_model()->GetActiveWebContents(); | 271 return browser()->tab_strip_model()->GetActiveWebContents(); |
| 193 } | 272 } |
| 194 | 273 |
| 195 content::RenderViewHost* RenderViewHost() { | 274 content::RenderViewHost* RenderViewHost() { |
| 196 return WebContents()->GetRenderViewHost(); | 275 return WebContents()->GetRenderViewHost(); |
| 197 } | 276 } |
| 198 | 277 |
| 199 ManagePasswordsUIController* ui_controller() { | |
| 200 return ManagePasswordsUIController::FromWebContents(WebContents()); | |
| 201 } | |
| 202 | |
| 203 // Wrapper around ui_test_utils::NavigateToURL that waits until | 278 // Wrapper around ui_test_utils::NavigateToURL that waits until |
| 204 // DidFinishLoad() fires. Normally this function returns after | 279 // DidFinishLoad() fires. Normally this function returns after |
| 205 // DidStopLoading(), which caused flakiness as the NavigationObserver | 280 // DidStopLoading(), which caused flakiness as the NavigationObserver |
| 206 // would sometimes see the DidFinishLoad event from a previous navigation and | 281 // would sometimes see the DidFinishLoad event from a previous navigation and |
| 207 // return immediately. | 282 // return immediately. |
| 208 void NavigateToFile(const std::string& path) { | 283 void NavigateToFile(const std::string& path) { |
| 209 if (!embedded_test_server()->Started()) | 284 if (!embedded_test_server()->Started()) |
| 210 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | 285 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
| 211 | 286 |
| 212 ASSERT_FALSE(CommandLine::ForCurrentProcess()->HasSwitch( | 287 ASSERT_FALSE(CommandLine::ForCurrentProcess()->HasSwitch( |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 297 } | 372 } |
| 298 | 373 |
| 299 // Actual tests --------------------------------------------------------------- | 374 // Actual tests --------------------------------------------------------------- |
| 300 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 375 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, |
| 301 PromptForNormalSubmit) { | 376 PromptForNormalSubmit) { |
| 302 NavigateToFile("/password/password_form.html"); | 377 NavigateToFile("/password/password_form.html"); |
| 303 | 378 |
| 304 // Fill a form and submit through a <input type="submit"> button. Nothing | 379 // Fill a form and submit through a <input type="submit"> button. Nothing |
| 305 // special. | 380 // special. |
| 306 NavigationObserver observer(WebContents()); | 381 NavigationObserver observer(WebContents()); |
| 382 scoped_ptr<PromptObserver> prompt_observer( |
| 383 PromptObserver::Create(WebContents())); |
| 307 std::string fill_and_submit = | 384 std::string fill_and_submit = |
| 308 "document.getElementById('username_field').value = 'temp';" | 385 "document.getElementById('username_field').value = 'temp';" |
| 309 "document.getElementById('password_field').value = 'random';" | 386 "document.getElementById('password_field').value = 'random';" |
| 310 "document.getElementById('input_submit_button').click()"; | 387 "document.getElementById('input_submit_button').click()"; |
| 311 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 388 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 312 observer.Wait(); | 389 observer.Wait(); |
| 313 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 390 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 314 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | |
| 315 } else { | |
| 316 EXPECT_TRUE(observer.infobar_shown()); | |
| 317 } | |
| 318 } | 391 } |
| 319 | 392 |
| 320 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 393 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, |
| 321 PromptForSubmitWithInPageNavigation) { | 394 PromptForSubmitWithInPageNavigation) { |
| 322 NavigateToFile("/password/password_navigate_before_submit.html"); | 395 NavigateToFile("/password/password_navigate_before_submit.html"); |
| 323 | 396 |
| 324 // Fill a form and submit through a <input type="submit"> button. Nothing | 397 // Fill a form and submit through a <input type="submit"> button. Nothing |
| 325 // special. The form does an in-page navigation before submitting. | 398 // special. The form does an in-page navigation before submitting. |
| 326 NavigationObserver observer(WebContents()); | 399 NavigationObserver observer(WebContents()); |
| 400 scoped_ptr<PromptObserver> prompt_observer( |
| 401 PromptObserver::Create(WebContents())); |
| 327 std::string fill_and_submit = | 402 std::string fill_and_submit = |
| 328 "document.getElementById('username_field').value = 'temp';" | 403 "document.getElementById('username_field').value = 'temp';" |
| 329 "document.getElementById('password_field').value = 'random';" | 404 "document.getElementById('password_field').value = 'random';" |
| 330 "document.getElementById('input_submit_button').click()"; | 405 "document.getElementById('input_submit_button').click()"; |
| 331 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 406 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 332 observer.Wait(); | 407 observer.Wait(); |
| 333 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 408 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 334 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | |
| 335 } else { | |
| 336 EXPECT_TRUE(observer.infobar_shown()); | |
| 337 } | |
| 338 } | 409 } |
| 339 | 410 |
| 340 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 411 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, |
| 341 LoginSuccessWithUnrelatedForm) { | 412 LoginSuccessWithUnrelatedForm) { |
| 342 // Log in, see a form on the landing page. That form is not related to the | 413 // Log in, see a form on the landing page. That form is not related to the |
| 343 // login form (=has a different action), so we should offer saving the | 414 // login form (=has a different action), so we should offer saving the |
| 344 // password. | 415 // password. |
| 345 NavigateToFile("/password/password_form.html"); | 416 NavigateToFile("/password/password_form.html"); |
| 346 | 417 |
| 347 NavigationObserver observer(WebContents()); | 418 NavigationObserver observer(WebContents()); |
| 419 scoped_ptr<PromptObserver> prompt_observer( |
| 420 PromptObserver::Create(WebContents())); |
| 348 std::string fill_and_submit = | 421 std::string fill_and_submit = |
| 349 "document.getElementById('username_unrelated').value = 'temp';" | 422 "document.getElementById('username_unrelated').value = 'temp';" |
| 350 "document.getElementById('password_unrelated').value = 'random';" | 423 "document.getElementById('password_unrelated').value = 'random';" |
| 351 "document.getElementById('submit_unrelated').click()"; | 424 "document.getElementById('submit_unrelated').click()"; |
| 352 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 425 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 353 observer.Wait(); | 426 observer.Wait(); |
| 354 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 427 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 355 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | |
| 356 } else { | |
| 357 EXPECT_TRUE(observer.infobar_shown()); | |
| 358 } | |
| 359 } | 428 } |
| 360 | 429 |
| 361 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, LoginFailed) { | 430 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, LoginFailed) { |
| 362 // Log in, see a form on the landing page. That form is not related to the | 431 // Log in, see a form on the landing page. That form is not related to the |
| 363 // login form (=has a different action), so we should offer saving the | 432 // login form (=has a different action), so we should offer saving the |
| 364 // password. | 433 // password. |
| 365 NavigateToFile("/password/password_form.html"); | 434 NavigateToFile("/password/password_form.html"); |
| 366 | 435 |
| 367 NavigationObserver observer(WebContents()); | 436 NavigationObserver observer(WebContents()); |
| 437 scoped_ptr<PromptObserver> prompt_observer( |
| 438 PromptObserver::Create(WebContents())); |
| 368 std::string fill_and_submit = | 439 std::string fill_and_submit = |
| 369 "document.getElementById('username_failed').value = 'temp';" | 440 "document.getElementById('username_failed').value = 'temp';" |
| 370 "document.getElementById('password_failed').value = 'random';" | 441 "document.getElementById('password_failed').value = 'random';" |
| 371 "document.getElementById('submit_failed').click()"; | 442 "document.getElementById('submit_failed').click()"; |
| 372 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 443 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 373 observer.Wait(); | 444 observer.Wait(); |
| 374 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 445 EXPECT_FALSE(prompt_observer->IsShowingPrompt()); |
| 375 EXPECT_FALSE(ui_controller()->PasswordPendingUserDecision()); | |
| 376 } else { | |
| 377 EXPECT_FALSE(observer.infobar_shown()); | |
| 378 } | |
| 379 } | 446 } |
| 380 | 447 |
| 381 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, Redirects) { | 448 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, Redirects) { |
| 382 NavigateToFile("/password/password_form.html"); | 449 NavigateToFile("/password/password_form.html"); |
| 383 | 450 |
| 384 // Fill a form and submit through a <input type="submit"> button. The form | 451 // Fill a form and submit through a <input type="submit"> button. The form |
| 385 // points to a redirection page. | 452 // points to a redirection page. |
| 386 NavigationObserver observer(WebContents()); | 453 NavigationObserver observer(WebContents()); |
| 454 scoped_ptr<PromptObserver> prompt_observer( |
| 455 PromptObserver::Create(WebContents())); |
| 387 std::string fill_and_submit = | 456 std::string fill_and_submit = |
| 388 "document.getElementById('username_redirect').value = 'temp';" | 457 "document.getElementById('username_redirect').value = 'temp';" |
| 389 "document.getElementById('password_redirect').value = 'random';" | 458 "document.getElementById('password_redirect').value = 'random';" |
| 390 "document.getElementById('submit_redirect').click()"; | 459 "document.getElementById('submit_redirect').click()"; |
| 391 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 460 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 392 observer.disable_should_automatically_accept_infobar(); | |
| 393 observer.Wait(); | 461 observer.Wait(); |
| 394 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 462 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 395 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | |
| 396 } else { | |
| 397 EXPECT_TRUE(observer.infobar_shown()); | |
| 398 } | |
| 399 | 463 |
| 400 // The redirection page now redirects via Javascript. We check that the | 464 // The redirection page now redirects via Javascript. We check that the |
| 401 // infobar stays. | 465 // infobar stays. |
| 402 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), | 466 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), |
| 403 "window.location.href = 'done.html';")); | 467 "window.location.href = 'done.html';")); |
| 404 observer.Wait(); | 468 observer.Wait(); |
| 405 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 469 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 406 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | |
| 407 } else { | |
| 408 EXPECT_FALSE(observer.infobar_removed()); | |
| 409 } | |
| 410 } | 470 } |
| 411 | 471 |
| 412 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 472 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, |
| 413 PromptForSubmitUsingJavaScript) { | 473 PromptForSubmitUsingJavaScript) { |
| 414 NavigateToFile("/password/password_form.html"); | 474 NavigateToFile("/password/password_form.html"); |
| 415 | 475 |
| 416 // Fill a form and submit using <button> that calls submit() on the form. | 476 // Fill a form and submit using <button> that calls submit() on the form. |
| 417 // This should work regardless of the type of element, as long as submit() is | 477 // This should work regardless of the type of element, as long as submit() is |
| 418 // called. | 478 // called. |
| 419 NavigationObserver observer(WebContents()); | 479 NavigationObserver observer(WebContents()); |
| 480 scoped_ptr<PromptObserver> prompt_observer( |
| 481 PromptObserver::Create(WebContents())); |
| 420 std::string fill_and_submit = | 482 std::string fill_and_submit = |
| 421 "document.getElementById('username_field').value = 'temp';" | 483 "document.getElementById('username_field').value = 'temp';" |
| 422 "document.getElementById('password_field').value = 'random';" | 484 "document.getElementById('password_field').value = 'random';" |
| 423 "document.getElementById('submit_button').click()"; | 485 "document.getElementById('submit_button').click()"; |
| 424 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 486 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 425 observer.Wait(); | 487 observer.Wait(); |
| 426 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 488 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 427 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | |
| 428 } else { | |
| 429 EXPECT_TRUE(observer.infobar_shown()); | |
| 430 } | |
| 431 } | 489 } |
| 432 | 490 |
| 433 // Flaky: crbug.com/301547, observed on win and mac. Probably happens on all | 491 // Flaky: crbug.com/301547, observed on win and mac. Probably happens on all |
| 434 // platforms. | 492 // platforms. |
| 435 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 493 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, |
| 436 DISABLED_PromptForDynamicForm) { | 494 DISABLED_PromptForDynamicForm) { |
| 437 NavigateToFile("/password/dynamic_password_form.html"); | 495 NavigateToFile("/password/dynamic_password_form.html"); |
| 438 | 496 |
| 439 // Fill the dynamic password form and submit. | 497 // Fill the dynamic password form and submit. |
| 440 NavigationObserver observer(WebContents()); | 498 NavigationObserver observer(WebContents()); |
| 499 scoped_ptr<PromptObserver> prompt_observer( |
| 500 PromptObserver::Create(WebContents())); |
| 441 std::string fill_and_submit = | 501 std::string fill_and_submit = |
| 442 "document.getElementById('create_form_button').click();" | 502 "document.getElementById('create_form_button').click();" |
| 443 "window.setTimeout(function() {" | 503 "window.setTimeout(function() {" |
| 444 " document.dynamic_form.username.value = 'tempro';" | 504 " document.dynamic_form.username.value = 'tempro';" |
| 445 " document.dynamic_form.password.value = 'random';" | 505 " document.dynamic_form.password.value = 'random';" |
| 446 " document.dynamic_form.submit();" | 506 " document.dynamic_form.submit();" |
| 447 "}, 0)"; | 507 "}, 0)"; |
| 448 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 508 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 449 observer.Wait(); | 509 observer.Wait(); |
| 450 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 510 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 451 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | |
| 452 } else { | |
| 453 EXPECT_TRUE(observer.infobar_shown()); | |
| 454 } | |
| 455 } | 511 } |
| 456 | 512 |
| 457 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, NoPromptForNavigation) { | 513 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, NoPromptForNavigation) { |
| 458 NavigateToFile("/password/password_form.html"); | 514 NavigateToFile("/password/password_form.html"); |
| 459 | 515 |
| 460 // Don't fill the password form, just navigate away. Shouldn't prompt. | 516 // Don't fill the password form, just navigate away. Shouldn't prompt. |
| 461 NavigationObserver observer(WebContents()); | 517 NavigationObserver observer(WebContents()); |
| 518 scoped_ptr<PromptObserver> prompt_observer( |
| 519 PromptObserver::Create(WebContents())); |
| 462 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), | 520 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), |
| 463 "window.location.href = 'done.html';")); | 521 "window.location.href = 'done.html';")); |
| 464 observer.Wait(); | 522 observer.Wait(); |
| 465 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 523 EXPECT_FALSE(prompt_observer->IsShowingPrompt()); |
| 466 EXPECT_FALSE(ui_controller()->PasswordPendingUserDecision()); | |
| 467 } else { | |
| 468 EXPECT_FALSE(observer.infobar_shown()); | |
| 469 } | |
| 470 } | 524 } |
| 471 | 525 |
| 472 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 526 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, |
| 473 NoPromptForSubFrameNavigation) { | 527 NoPromptForSubFrameNavigation) { |
| 474 NavigateToFile("/password/multi_frames.html"); | 528 NavigateToFile("/password/multi_frames.html"); |
| 475 | 529 |
| 476 // If you are filling out a password form in one frame and a different frame | 530 // If you are filling out a password form in one frame and a different frame |
| 477 // navigates, this should not trigger the infobar. | 531 // navigates, this should not trigger the infobar. |
| 478 NavigationObserver observer(WebContents()); | 532 NavigationObserver observer(WebContents()); |
| 533 scoped_ptr<PromptObserver> prompt_observer( |
| 534 PromptObserver::Create(WebContents())); |
| 479 observer.SetPathToWaitFor("/password/done.html"); | 535 observer.SetPathToWaitFor("/password/done.html"); |
| 480 std::string fill = | 536 std::string fill = |
| 481 "var first_frame = document.getElementById('first_frame');" | 537 "var first_frame = document.getElementById('first_frame');" |
| 482 "var frame_doc = first_frame.contentDocument;" | 538 "var frame_doc = first_frame.contentDocument;" |
| 483 "frame_doc.getElementById('username_field').value = 'temp';" | 539 "frame_doc.getElementById('username_field').value = 'temp';" |
| 484 "frame_doc.getElementById('password_field').value = 'random';"; | 540 "frame_doc.getElementById('password_field').value = 'random';"; |
| 485 std::string navigate_frame = | 541 std::string navigate_frame = |
| 486 "var second_iframe = document.getElementById('second_frame');" | 542 "var second_iframe = document.getElementById('second_frame');" |
| 487 "second_iframe.contentWindow.location.href = 'done.html';"; | 543 "second_iframe.contentWindow.location.href = 'done.html';"; |
| 488 | 544 |
| 489 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill)); | 545 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill)); |
| 490 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), navigate_frame)); | 546 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), navigate_frame)); |
| 491 observer.Wait(); | 547 observer.Wait(); |
| 492 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 548 EXPECT_FALSE(prompt_observer->IsShowingPrompt()); |
| 493 EXPECT_FALSE(ui_controller()->PasswordPendingUserDecision()); | |
| 494 } else { | |
| 495 EXPECT_FALSE(observer.infobar_shown()); | |
| 496 } | |
| 497 } | 549 } |
| 498 | 550 |
| 499 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 551 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, |
| 500 PromptAfterSubmitWithSubFrameNavigation) { | 552 PromptAfterSubmitWithSubFrameNavigation) { |
| 501 NavigateToFile("/password/multi_frames.html"); | 553 NavigateToFile("/password/multi_frames.html"); |
| 502 | 554 |
| 503 // Make sure that we prompt to save password even if a sub-frame navigation | 555 // Make sure that we prompt to save password even if a sub-frame navigation |
| 504 // happens first. | 556 // happens first. |
| 505 NavigationObserver observer(WebContents()); | 557 NavigationObserver observer(WebContents()); |
| 558 scoped_ptr<PromptObserver> prompt_observer( |
| 559 PromptObserver::Create(WebContents())); |
| 506 observer.SetPathToWaitFor("/password/done.html"); | 560 observer.SetPathToWaitFor("/password/done.html"); |
| 507 std::string navigate_frame = | 561 std::string navigate_frame = |
| 508 "var second_iframe = document.getElementById('second_frame');" | 562 "var second_iframe = document.getElementById('second_frame');" |
| 509 "second_iframe.contentWindow.location.href = 'other.html';"; | 563 "second_iframe.contentWindow.location.href = 'other.html';"; |
| 510 std::string fill_and_submit = | 564 std::string fill_and_submit = |
| 511 "var first_frame = document.getElementById('first_frame');" | 565 "var first_frame = document.getElementById('first_frame');" |
| 512 "var frame_doc = first_frame.contentDocument;" | 566 "var frame_doc = first_frame.contentDocument;" |
| 513 "frame_doc.getElementById('username_field').value = 'temp';" | 567 "frame_doc.getElementById('username_field').value = 'temp';" |
| 514 "frame_doc.getElementById('password_field').value = 'random';" | 568 "frame_doc.getElementById('password_field').value = 'random';" |
| 515 "frame_doc.getElementById('input_submit_button').click();"; | 569 "frame_doc.getElementById('input_submit_button').click();"; |
| 516 | 570 |
| 517 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), navigate_frame)); | 571 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), navigate_frame)); |
| 518 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 572 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 519 observer.Wait(); | 573 observer.Wait(); |
| 520 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 574 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 521 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | |
| 522 } else { | |
| 523 EXPECT_TRUE(observer.infobar_shown()); | |
| 524 } | |
| 525 } | 575 } |
| 526 | 576 |
| 527 IN_PROC_BROWSER_TEST_F( | 577 IN_PROC_BROWSER_TEST_F( |
| 528 PasswordManagerBrowserTest, | 578 PasswordManagerBrowserTest, |
| 529 NoPromptForFailedLoginFromMainFrameWithMultiFramesInPage) { | 579 NoPromptForFailedLoginFromMainFrameWithMultiFramesInPage) { |
| 530 NavigateToFile("/password/multi_frames.html"); | 580 NavigateToFile("/password/multi_frames.html"); |
| 531 | 581 |
| 532 // Make sure that we don't prompt to save the password for a failed login | 582 // Make sure that we don't prompt to save the password for a failed login |
| 533 // from the main frame with multiple frames in the same page. | 583 // from the main frame with multiple frames in the same page. |
| 534 NavigationObserver observer(WebContents()); | 584 NavigationObserver observer(WebContents()); |
| 585 scoped_ptr<PromptObserver> prompt_observer( |
| 586 PromptObserver::Create(WebContents())); |
| 535 std::string fill_and_submit = | 587 std::string fill_and_submit = |
| 536 "document.getElementById('username_failed').value = 'temp';" | 588 "document.getElementById('username_failed').value = 'temp';" |
| 537 "document.getElementById('password_failed').value = 'random';" | 589 "document.getElementById('password_failed').value = 'random';" |
| 538 "document.getElementById('submit_failed').click();"; | 590 "document.getElementById('submit_failed').click();"; |
| 539 | 591 |
| 540 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 592 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 541 observer.Wait(); | 593 observer.Wait(); |
| 542 EXPECT_FALSE(observer.infobar_shown()); | 594 EXPECT_FALSE(prompt_observer->IsShowingPrompt()); |
| 543 } | 595 } |
| 544 | 596 |
| 545 IN_PROC_BROWSER_TEST_F( | 597 IN_PROC_BROWSER_TEST_F( |
| 546 PasswordManagerBrowserTest, | 598 PasswordManagerBrowserTest, |
| 547 NoPromptForFailedLoginFromSubFrameWithMultiFramesInPage) { | 599 NoPromptForFailedLoginFromSubFrameWithMultiFramesInPage) { |
| 548 NavigateToFile("/password/multi_frames.html"); | 600 NavigateToFile("/password/multi_frames.html"); |
| 549 | 601 |
| 550 // Make sure that we don't prompt to save the password for a failed login | 602 // Make sure that we don't prompt to save the password for a failed login |
| 551 // from a sub-frame with multiple frames in the same page. | 603 // from a sub-frame with multiple frames in the same page. |
| 552 NavigationObserver observer(WebContents()); | 604 NavigationObserver observer(WebContents()); |
| 605 scoped_ptr<PromptObserver> prompt_observer( |
| 606 PromptObserver::Create(WebContents())); |
| 553 std::string fill_and_submit = | 607 std::string fill_and_submit = |
| 554 "var first_frame = document.getElementById('first_frame');" | 608 "var first_frame = document.getElementById('first_frame');" |
| 555 "var frame_doc = first_frame.contentDocument;" | 609 "var frame_doc = first_frame.contentDocument;" |
| 556 "frame_doc.getElementById('username_failed').value = 'temp';" | 610 "frame_doc.getElementById('username_failed').value = 'temp';" |
| 557 "frame_doc.getElementById('password_failed').value = 'random';" | 611 "frame_doc.getElementById('password_failed').value = 'random';" |
| 558 "frame_doc.getElementById('submit_failed').click();" | 612 "frame_doc.getElementById('submit_failed').click();" |
| 559 "window.parent.location.href = 'multi_frames.html';"; | 613 "window.parent.location.href = 'multi_frames.html';"; |
| 560 | 614 |
| 561 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 615 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 562 observer.Wait(); | 616 observer.Wait(); |
| 563 EXPECT_FALSE(observer.infobar_shown()); | 617 EXPECT_FALSE(prompt_observer->IsShowingPrompt()); |
| 564 } | 618 } |
| 565 | 619 |
| 566 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 620 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, PromptForXHRSubmit) { |
| 567 PromptForXHRSubmit) { | |
| 568 #if defined(OS_WIN) && defined(USE_ASH) | 621 #if defined(OS_WIN) && defined(USE_ASH) |
| 569 // Disable this test in Metro+Ash for now (http://crbug.com/262796). | 622 // Disable this test in Metro+Ash for now (http://crbug.com/262796). |
| 570 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) | 623 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) |
| 571 return; | 624 return; |
| 572 #endif | 625 #endif |
| 573 NavigateToFile("/password/password_xhr_submit.html"); | 626 NavigateToFile("/password/password_xhr_submit.html"); |
| 574 | 627 |
| 575 // Verify that we show the save password prompt if a form returns false | 628 // Verify that we show the save password prompt if a form returns false |
| 576 // in its onsubmit handler but instead logs in/navigates via XHR. | 629 // in its onsubmit handler but instead logs in/navigates via XHR. |
| 577 // Note that calling 'submit()' on a form with javascript doesn't call | 630 // Note that calling 'submit()' on a form with javascript doesn't call |
| 578 // the onsubmit handler, so we click the submit button instead. | 631 // the onsubmit handler, so we click the submit button instead. |
| 579 NavigationObserver observer(WebContents()); | 632 NavigationObserver observer(WebContents()); |
| 633 scoped_ptr<PromptObserver> prompt_observer( |
| 634 PromptObserver::Create(WebContents())); |
| 580 std::string fill_and_submit = | 635 std::string fill_and_submit = |
| 581 "document.getElementById('username_field').value = 'temp';" | 636 "document.getElementById('username_field').value = 'temp';" |
| 582 "document.getElementById('password_field').value = 'random';" | 637 "document.getElementById('password_field').value = 'random';" |
| 583 "document.getElementById('submit_button').click()"; | 638 "document.getElementById('submit_button').click()"; |
| 584 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 639 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 585 observer.Wait(); | 640 observer.Wait(); |
| 586 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 641 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 587 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | |
| 588 } else { | |
| 589 EXPECT_TRUE(observer.infobar_shown()); | |
| 590 } | |
| 591 } | 642 } |
| 592 | 643 |
| 593 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 644 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, |
| 594 PromptForXHRWithoutOnSubmit) { | 645 PromptForXHRWithoutOnSubmit) { |
| 595 NavigateToFile("/password/password_xhr_submit.html"); | 646 NavigateToFile("/password/password_xhr_submit.html"); |
| 596 | 647 |
| 597 // Verify that if XHR navigation occurs and the form is properly filled out, | 648 // Verify that if XHR navigation occurs and the form is properly filled out, |
| 598 // we try and save the password even though onsubmit hasn't been called. | 649 // we try and save the password even though onsubmit hasn't been called. |
| 599 NavigationObserver observer(WebContents()); | 650 NavigationObserver observer(WebContents()); |
| 651 scoped_ptr<PromptObserver> prompt_observer( |
| 652 PromptObserver::Create(WebContents())); |
| 600 std::string fill_and_navigate = | 653 std::string fill_and_navigate = |
| 601 "document.getElementById('username_field').value = 'temp';" | 654 "document.getElementById('username_field').value = 'temp';" |
| 602 "document.getElementById('password_field').value = 'random';" | 655 "document.getElementById('password_field').value = 'random';" |
| 603 "send_xhr()"; | 656 "send_xhr()"; |
| 604 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_navigate)); | 657 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_navigate)); |
| 605 observer.Wait(); | 658 observer.Wait(); |
| 606 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 659 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 607 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | |
| 608 } else { | |
| 609 EXPECT_TRUE(observer.infobar_shown()); | |
| 610 } | |
| 611 } | 660 } |
| 612 | 661 |
| 613 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 662 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, NoPromptIfLinkClicked) { |
| 614 NoPromptIfLinkClicked) { | |
| 615 NavigateToFile("/password/password_form.html"); | 663 NavigateToFile("/password/password_form.html"); |
| 616 | 664 |
| 617 // Verify that if the user takes a direct action to leave the page, we don't | 665 // Verify that if the user takes a direct action to leave the page, we don't |
| 618 // prompt to save the password even if the form is already filled out. | 666 // prompt to save the password even if the form is already filled out. |
| 619 NavigationObserver observer(WebContents()); | 667 NavigationObserver observer(WebContents()); |
| 668 scoped_ptr<PromptObserver> prompt_observer( |
| 669 PromptObserver::Create(WebContents())); |
| 620 std::string fill_and_click_link = | 670 std::string fill_and_click_link = |
| 621 "document.getElementById('username_field').value = 'temp';" | 671 "document.getElementById('username_field').value = 'temp';" |
| 622 "document.getElementById('password_field').value = 'random';" | 672 "document.getElementById('password_field').value = 'random';" |
| 623 "document.getElementById('link').click();"; | 673 "document.getElementById('link').click();"; |
| 624 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_click_link)); | 674 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_click_link)); |
| 625 observer.Wait(); | 675 observer.Wait(); |
| 626 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 676 EXPECT_FALSE(prompt_observer->IsShowingPrompt()); |
| 627 EXPECT_FALSE(ui_controller()->PasswordPendingUserDecision()); | |
| 628 } else { | |
| 629 EXPECT_FALSE(observer.infobar_shown()); | |
| 630 } | |
| 631 } | 677 } |
| 632 | 678 |
| 633 // TODO(jam): http://crbug.com/350550 | 679 // TODO(jam): http://crbug.com/350550 |
| 634 #if !defined(OS_WIN) | 680 #if !defined(OS_WIN) |
| 635 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 681 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, |
| 636 VerifyPasswordGenerationUpload) { | 682 VerifyPasswordGenerationUpload) { |
| 637 // Prevent Autofill requests from actually going over the wire. | 683 // Prevent Autofill requests from actually going over the wire. |
| 638 net::TestURLFetcherFactory factory; | 684 net::TestURLFetcherFactory factory; |
| 639 // Disable Autofill requesting access to AddressBook data. This causes | 685 // Disable Autofill requesting access to AddressBook data. This causes |
| 640 // the test to hang on Mac. | 686 // the test to hang on Mac. |
| 641 autofill::test::DisableSystemServices(browser()->profile()->GetPrefs()); | 687 autofill::test::DisableSystemServices(browser()->profile()->GetPrefs()); |
| 642 | 688 |
| 643 // Visit a signup form. | 689 // Visit a signup form. |
| 644 NavigateToFile("/password/signup_form.html"); | 690 NavigateToFile("/password/signup_form.html"); |
| 645 | 691 |
| 646 // Enter a password and save it. | 692 // Enter a password and save it. |
| 647 NavigationObserver first_observer(WebContents()); | 693 NavigationObserver first_observer(WebContents()); |
| 694 scoped_ptr<PromptObserver> prompt_observer( |
| 695 PromptObserver::Create(WebContents())); |
| 648 std::string fill_and_submit = | 696 std::string fill_and_submit = |
| 649 "document.getElementById('other_info').value = 'stuff';" | 697 "document.getElementById('other_info').value = 'stuff';" |
| 650 "document.getElementById('username_field').value = 'my_username';" | 698 "document.getElementById('username_field').value = 'my_username';" |
| 651 "document.getElementById('password_field').value = 'password';" | 699 "document.getElementById('password_field').value = 'password';" |
| 652 "document.getElementById('input_submit_button').click()"; | 700 "document.getElementById('input_submit_button').click()"; |
| 653 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 701 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 654 | 702 |
| 655 first_observer.Wait(); | 703 first_observer.Wait(); |
| 656 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 704 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 657 ASSERT_TRUE(ui_controller()->PasswordPendingUserDecision()); | 705 prompt_observer->Accept(); |
| 658 ui_controller()->SavePassword(); | |
| 659 } else { | |
| 660 ASSERT_TRUE(first_observer.infobar_shown()); | |
| 661 } | |
| 662 | 706 |
| 663 // Now navigate to a login form that has similar HTML markup. | 707 // Now navigate to a login form that has similar HTML markup. |
| 664 NavigateToFile("/password/password_form.html"); | 708 NavigateToFile("/password/password_form.html"); |
| 665 | 709 |
| 666 // Simulate a user click to force an autofill of the form's DOM value, not | 710 // Simulate a user click to force an autofill of the form's DOM value, not |
| 667 // just the suggested value. | 711 // just the suggested value. |
| 668 content::SimulateMouseClick( | 712 content::SimulateMouseClick( |
| 669 WebContents(), 0, blink::WebMouseEvent::ButtonLeft); | 713 WebContents(), 0, blink::WebMouseEvent::ButtonLeft); |
| 670 | 714 |
| 671 // The form should be filled with the previously submitted username. | 715 // The form should be filled with the previously submitted username. |
| 672 std::string get_username = | 716 std::string get_username = |
| 673 "window.domAutomationController.send(" | 717 "window.domAutomationController.send(" |
| 674 "document.getElementById('username_field').value);"; | 718 "document.getElementById('username_field').value);"; |
| 675 std::string actual_username; | 719 std::string actual_username; |
| 676 ASSERT_TRUE(content::ExecuteScriptAndExtractString(RenderViewHost(), | 720 ASSERT_TRUE(content::ExecuteScriptAndExtractString(RenderViewHost(), |
| 677 get_username, | 721 get_username, |
| 678 &actual_username)); | 722 &actual_username)); |
| 679 ASSERT_EQ("my_username", actual_username); | 723 ASSERT_EQ("my_username", actual_username); |
| 680 | 724 |
| 681 // Submit the form and verify that there is no infobar (as the password | 725 // Submit the form and verify that there is no infobar (as the password |
| 682 // has already been saved). | 726 // has already been saved). |
| 683 NavigationObserver second_observer(WebContents()); | 727 NavigationObserver second_observer(WebContents()); |
| 728 scoped_ptr<PromptObserver> second_prompt_observer( |
| 729 PromptObserver::Create(WebContents())); |
| 684 std::string submit_form = | 730 std::string submit_form = |
| 685 "document.getElementById('input_submit_button').click()"; | 731 "document.getElementById('input_submit_button').click()"; |
| 686 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), submit_form)); | 732 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), submit_form)); |
| 687 second_observer.Wait(); | 733 second_observer.Wait(); |
| 688 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 734 EXPECT_FALSE(second_prompt_observer->IsShowingPrompt()); |
| 689 EXPECT_FALSE(ui_controller()->PasswordPendingUserDecision()); | |
| 690 } else { | |
| 691 EXPECT_FALSE(second_observer.infobar_shown()); | |
| 692 } | |
| 693 | 735 |
| 694 // Verify that we sent a ping to Autofill saying that the original form | 736 // Verify that we sent a ping to Autofill saying that the original form |
| 695 // was likely an account creation form since it has more than 2 text input | 737 // was likely an account creation form since it has more than 2 text input |
| 696 // fields and was used for the first time on a different form. | 738 // fields and was used for the first time on a different form. |
| 697 base::HistogramBase* upload_histogram = | 739 base::HistogramBase* upload_histogram = |
| 698 base::StatisticsRecorder::FindHistogram( | 740 base::StatisticsRecorder::FindHistogram( |
| 699 "PasswordGeneration.UploadStarted"); | 741 "PasswordGeneration.UploadStarted"); |
| 700 ASSERT_TRUE(upload_histogram); | 742 ASSERT_TRUE(upload_histogram); |
| 701 scoped_ptr<base::HistogramSamples> snapshot = | 743 scoped_ptr<base::HistogramSamples> snapshot = |
| 702 upload_histogram->SnapshotSamples(); | 744 upload_histogram->SnapshotSamples(); |
| 703 EXPECT_EQ(0, snapshot->GetCount(0 /* failure */)); | 745 EXPECT_EQ(0, snapshot->GetCount(0 /* failure */)); |
| 704 EXPECT_EQ(1, snapshot->GetCount(1 /* success */)); | 746 EXPECT_EQ(1, snapshot->GetCount(1 /* success */)); |
| 705 } | 747 } |
| 706 #endif | 748 #endif |
| 707 | 749 |
| 708 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, PromptForSubmitFromIframe) { | 750 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, PromptForSubmitFromIframe) { |
| 709 NavigateToFile("/password/password_submit_from_iframe.html"); | 751 NavigateToFile("/password/password_submit_from_iframe.html"); |
| 710 | 752 |
| 711 // Submit a form in an iframe, then cause the whole page to navigate without a | 753 // Submit a form in an iframe, then cause the whole page to navigate without a |
| 712 // user gesture. We expect the save password prompt to be shown here, because | 754 // user gesture. We expect the save password prompt to be shown here, because |
| 713 // some pages use such iframes for login forms. | 755 // some pages use such iframes for login forms. |
| 714 NavigationObserver observer(WebContents()); | 756 NavigationObserver observer(WebContents()); |
| 757 scoped_ptr<PromptObserver> prompt_observer( |
| 758 PromptObserver::Create(WebContents())); |
| 715 std::string fill_and_submit = | 759 std::string fill_and_submit = |
| 716 "var iframe = document.getElementById('test_iframe');" | 760 "var iframe = document.getElementById('test_iframe');" |
| 717 "var iframe_doc = iframe.contentDocument;" | 761 "var iframe_doc = iframe.contentDocument;" |
| 718 "iframe_doc.getElementById('username_field').value = 'temp';" | 762 "iframe_doc.getElementById('username_field').value = 'temp';" |
| 719 "iframe_doc.getElementById('password_field').value = 'random';" | 763 "iframe_doc.getElementById('password_field').value = 'random';" |
| 720 "iframe_doc.getElementById('submit_button').click()"; | 764 "iframe_doc.getElementById('submit_button').click()"; |
| 721 | 765 |
| 722 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 766 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 723 observer.Wait(); | 767 observer.Wait(); |
| 724 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 768 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 725 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | |
| 726 } else { | |
| 727 EXPECT_TRUE(observer.infobar_shown()); | |
| 728 } | |
| 729 } | 769 } |
| 730 | 770 |
| 731 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 771 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, |
| 732 PromptForInputElementWithoutName) { | 772 PromptForInputElementWithoutName) { |
| 733 // Check that the prompt is shown for forms where input elements lack the | 773 // Check that the prompt is shown for forms where input elements lack the |
| 734 // "name" attribute but the "id" is present. | 774 // "name" attribute but the "id" is present. |
| 735 NavigateToFile("/password/password_form.html"); | 775 NavigateToFile("/password/password_form.html"); |
| 736 | 776 |
| 737 NavigationObserver observer(WebContents()); | 777 NavigationObserver observer(WebContents()); |
| 778 scoped_ptr<PromptObserver> prompt_observer( |
| 779 PromptObserver::Create(WebContents())); |
| 738 std::string fill_and_submit = | 780 std::string fill_and_submit = |
| 739 "document.getElementById('username_field_no_name').value = 'temp';" | 781 "document.getElementById('username_field_no_name').value = 'temp';" |
| 740 "document.getElementById('password_field_no_name').value = 'random';" | 782 "document.getElementById('password_field_no_name').value = 'random';" |
| 741 "document.getElementById('input_submit_button_no_name').click()"; | 783 "document.getElementById('input_submit_button_no_name').click()"; |
| 742 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 784 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 743 observer.Wait(); | 785 observer.Wait(); |
| 744 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 786 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 745 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | |
| 746 } else { | |
| 747 EXPECT_TRUE(observer.infobar_shown()); | |
| 748 } | |
| 749 } | 787 } |
| 750 | 788 |
| 751 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 789 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, |
| 752 PromptForInputElementWithoutId) { | 790 PromptForInputElementWithoutId) { |
| 753 // Check that the prompt is shown for forms where input elements lack the | 791 // Check that the prompt is shown for forms where input elements lack the |
| 754 // "id" attribute but the "name" attribute is present. | 792 // "id" attribute but the "name" attribute is present. |
| 755 NavigateToFile("/password/password_form.html"); | 793 NavigateToFile("/password/password_form.html"); |
| 756 | 794 |
| 757 NavigationObserver observer(WebContents()); | 795 NavigationObserver observer(WebContents()); |
| 796 scoped_ptr<PromptObserver> prompt_observer( |
| 797 PromptObserver::Create(WebContents())); |
| 758 std::string fill_and_submit = | 798 std::string fill_and_submit = |
| 759 "document.getElementsByName('username_field_no_id')[0].value = 'temp';" | 799 "document.getElementsByName('username_field_no_id')[0].value = 'temp';" |
| 760 "document.getElementsByName('password_field_no_id')[0].value = 'random';" | 800 "document.getElementsByName('password_field_no_id')[0].value = 'random';" |
| 761 "document.getElementsByName('input_submit_button_no_id')[0].click()"; | 801 "document.getElementsByName('input_submit_button_no_id')[0].click()"; |
| 762 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 802 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 763 observer.Wait(); | 803 observer.Wait(); |
| 764 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 804 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 765 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | |
| 766 } else { | |
| 767 EXPECT_TRUE(observer.infobar_shown()); | |
| 768 } | |
| 769 } | 805 } |
| 770 | 806 |
| 771 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 807 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, |
| 772 NoPromptForInputElementWithoutIdAndName) { | 808 NoPromptForInputElementWithoutIdAndName) { |
| 773 // Check that no prompt is shown for forms where the input fields lack both | 809 // Check that no prompt is shown for forms where the input fields lack both |
| 774 // the "id" and the "name" attributes. | 810 // the "id" and the "name" attributes. |
| 775 NavigateToFile("/password/password_form.html"); | 811 NavigateToFile("/password/password_form.html"); |
| 776 | 812 |
| 777 NavigationObserver observer(WebContents()); | 813 NavigationObserver observer(WebContents()); |
| 814 scoped_ptr<PromptObserver> prompt_observer( |
| 815 PromptObserver::Create(WebContents())); |
| 778 std::string fill_and_submit = | 816 std::string fill_and_submit = |
| 779 "var form = document.getElementById('testform_elements_no_id_no_name');" | 817 "var form = document.getElementById('testform_elements_no_id_no_name');" |
| 780 "var username = form.children[0];" | 818 "var username = form.children[0];" |
| 781 "username.value = 'temp';" | 819 "username.value = 'temp';" |
| 782 "var password = form.children[1];" | 820 "var password = form.children[1];" |
| 783 "password.value = 'random';" | 821 "password.value = 'random';" |
| 784 "form.children[2].click()"; // form.children[2] is the submit button. | 822 "form.children[2].click()"; // form.children[2] is the submit button. |
| 785 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 823 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 786 observer.Wait(); | 824 observer.Wait(); |
| 787 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 825 EXPECT_FALSE(prompt_observer->IsShowingPrompt()); |
| 788 EXPECT_FALSE(ui_controller()->PasswordPendingUserDecision()); | |
| 789 } else { | |
| 790 EXPECT_FALSE(observer.infobar_shown()); | |
| 791 } | |
| 792 } | 826 } |
| 793 | 827 |
| 794 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, DeleteFrameBeforeSubmit) { | 828 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, DeleteFrameBeforeSubmit) { |
| 795 NavigateToFile("/password/multi_frames.html"); | 829 NavigateToFile("/password/multi_frames.html"); |
| 796 | 830 |
| 797 NavigationObserver observer(WebContents()); | 831 NavigationObserver observer(WebContents()); |
| 798 // Make sure we save some password info from an iframe and then destroy it. | 832 // Make sure we save some password info from an iframe and then destroy it. |
| 799 std::string save_and_remove = | 833 std::string save_and_remove = |
| 800 "var first_frame = document.getElementById('first_frame');" | 834 "var first_frame = document.getElementById('first_frame');" |
| 801 "var frame_doc = first_frame.contentDocument;" | 835 "var frame_doc = first_frame.contentDocument;" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 823 // Click on a link to open a new tab, then switch back to the first one. | 857 // Click on a link to open a new tab, then switch back to the first one. |
| 824 EXPECT_EQ(1, browser()->tab_strip_model()->count()); | 858 EXPECT_EQ(1, browser()->tab_strip_model()->count()); |
| 825 std::string click = | 859 std::string click = |
| 826 "document.getElementById('testlink').click();"; | 860 "document.getElementById('testlink').click();"; |
| 827 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), click)); | 861 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), click)); |
| 828 EXPECT_EQ(2, browser()->tab_strip_model()->count()); | 862 EXPECT_EQ(2, browser()->tab_strip_model()->count()); |
| 829 browser()->tab_strip_model()->ActivateTabAt(0, false); | 863 browser()->tab_strip_model()->ActivateTabAt(0, false); |
| 830 | 864 |
| 831 // Fill in the credentials, and make sure they are saved. | 865 // Fill in the credentials, and make sure they are saved. |
| 832 NavigationObserver form_submit_observer(WebContents()); | 866 NavigationObserver form_submit_observer(WebContents()); |
| 867 scoped_ptr<PromptObserver> prompt_observer( |
| 868 PromptObserver::Create(WebContents())); |
| 833 std::string fill_and_submit = | 869 std::string fill_and_submit = |
| 834 "document.getElementById('username_field').value = 'temp';" | 870 "document.getElementById('username_field').value = 'temp';" |
| 835 "document.getElementById('password_field').value = 'random';" | 871 "document.getElementById('password_field').value = 'random';" |
| 836 "document.getElementById('input_submit_button').click();"; | 872 "document.getElementById('input_submit_button').click();"; |
| 837 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 873 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 838 form_submit_observer.Wait(); | 874 form_submit_observer.Wait(); |
| 839 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 875 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 840 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | 876 prompt_observer->Accept(); |
| 841 ui_controller()->SavePassword(); | |
| 842 } else { | |
| 843 EXPECT_TRUE(form_submit_observer.infobar_shown()); | |
| 844 } | |
| 845 | 877 |
| 846 // Reload the original page to have the saved credentials autofilled. | 878 // Reload the original page to have the saved credentials autofilled. |
| 847 NavigationObserver reload_observer(WebContents()); | 879 NavigationObserver reload_observer(WebContents()); |
| 848 NavigateToFile("/password/form_and_link.html"); | 880 NavigateToFile("/password/form_and_link.html"); |
| 849 reload_observer.Wait(); | 881 reload_observer.Wait(); |
| 850 | 882 |
| 851 // Wait until the username is filled, to make sure autofill kicked in. | 883 // Wait until the username is filled, to make sure autofill kicked in. |
| 852 WaitForElementValue("username_field", "temp"); | 884 WaitForElementValue("username_field", "temp"); |
| 853 // Now check that the password is not accessible yet. | 885 // Now check that the password is not accessible yet. |
| 854 CheckElementValue("password_field", ""); | 886 CheckElementValue("password_field", ""); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 866 // RenderWidgetHostViewGuest::ProcessAckedTouchEvent is, and | 898 // RenderWidgetHostViewGuest::ProcessAckedTouchEvent is, and |
| 867 // ProcessAckedTouchEvent is what triggers the translation of touch events to | 899 // ProcessAckedTouchEvent is what triggers the translation of touch events to |
| 868 // gesture events. | 900 // gesture events. |
| 869 #if defined(USE_AURA) | 901 #if defined(USE_AURA) |
| 870 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 902 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, |
| 871 PasswordValueAccessibleOnSubmit) { | 903 PasswordValueAccessibleOnSubmit) { |
| 872 NavigateToFile("/password/form_and_link.html"); | 904 NavigateToFile("/password/form_and_link.html"); |
| 873 | 905 |
| 874 // Fill in the credentials, and make sure they are saved. | 906 // Fill in the credentials, and make sure they are saved. |
| 875 NavigationObserver form_submit_observer(WebContents()); | 907 NavigationObserver form_submit_observer(WebContents()); |
| 908 scoped_ptr<PromptObserver> prompt_observer( |
| 909 PromptObserver::Create(WebContents())); |
| 876 std::string fill_and_submit = | 910 std::string fill_and_submit = |
| 877 "document.getElementById('username_field').value = 'temp';" | 911 "document.getElementById('username_field').value = 'temp';" |
| 878 "document.getElementById('password_field').value = 'random_secret';" | 912 "document.getElementById('password_field').value = 'random_secret';" |
| 879 "document.getElementById('input_submit_button').click();"; | 913 "document.getElementById('input_submit_button').click();"; |
| 880 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 914 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 881 form_submit_observer.Wait(); | 915 form_submit_observer.Wait(); |
| 882 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 916 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 883 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | 917 prompt_observer->Accept(); |
| 884 ui_controller()->SavePassword(); | |
| 885 } else { | |
| 886 EXPECT_TRUE(form_submit_observer.infobar_shown()); | |
| 887 } | |
| 888 | 918 |
| 889 // Reload the original page to have the saved credentials autofilled. | 919 // Reload the original page to have the saved credentials autofilled. |
| 890 NavigationObserver reload_observer(WebContents()); | 920 NavigationObserver reload_observer(WebContents()); |
| 891 NavigateToFile("/password/form_and_link.html"); | 921 NavigateToFile("/password/form_and_link.html"); |
| 892 reload_observer.Wait(); | 922 reload_observer.Wait(); |
| 893 | 923 |
| 894 NavigationObserver submit_observer(WebContents()); | 924 NavigationObserver submit_observer(WebContents()); |
| 895 // Submit the form via a tap on the submit button. The button is placed at 0, | 925 // Submit the form via a tap on the submit button. The button is placed at 0, |
| 896 // 100, and has height 300 and width 700. | 926 // 100, and has height 300 and width 700. |
| 897 content::SimulateTapAt(WebContents(), gfx::Point(350, 250)); | 927 content::SimulateTapAt(WebContents(), gfx::Point(350, 250)); |
| 898 submit_observer.Wait(); | 928 submit_observer.Wait(); |
| 899 std::string query = WebContents()->GetURL().query(); | 929 std::string query = WebContents()->GetURL().query(); |
| 900 EXPECT_NE(std::string::npos, query.find("random_secret")) << query; | 930 EXPECT_NE(std::string::npos, query.find("random_secret")) << query; |
| 901 } | 931 } |
| 902 #endif | 932 #endif |
| 903 | 933 |
| 904 // Test fix for crbug.com/338650. | 934 // Test fix for crbug.com/338650. |
| 905 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 935 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, |
| 906 DontPromptForPasswordFormWithDefaultValue) { | 936 DontPromptForPasswordFormWithDefaultValue) { |
| 907 NavigateToFile("/password/password_form_with_default_value.html"); | 937 NavigateToFile("/password/password_form_with_default_value.html"); |
| 908 | 938 |
| 909 // Don't prompt if we navigate away even if there is a password value since | 939 // Don't prompt if we navigate away even if there is a password value since |
| 910 // it's not coming from the user. | 940 // it's not coming from the user. |
| 911 NavigationObserver observer(WebContents()); | 941 NavigationObserver observer(WebContents()); |
| 942 scoped_ptr<PromptObserver> prompt_observer( |
| 943 PromptObserver::Create(WebContents())); |
| 912 NavigateToFile("/password/done.html"); | 944 NavigateToFile("/password/done.html"); |
| 913 observer.Wait(); | 945 observer.Wait(); |
| 914 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 946 EXPECT_FALSE(prompt_observer->IsShowingPrompt()); |
| 915 EXPECT_FALSE(ui_controller()->PasswordPendingUserDecision()); | |
| 916 } else { | |
| 917 EXPECT_FALSE(observer.infobar_shown()); | |
| 918 } | |
| 919 } | 947 } |
| 920 | 948 |
| 921 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 949 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, |
| 922 PromptWhenEnableAutomaticPasswordSavingSwitchIsNotSet) { | 950 PromptWhenEnableAutomaticPasswordSavingSwitchIsNotSet) { |
| 923 NavigateToFile("/password/password_form.html"); | 951 NavigateToFile("/password/password_form.html"); |
| 924 | 952 |
| 925 // Fill a form and submit through a <input type="submit"> button. | 953 // Fill a form and submit through a <input type="submit"> button. |
| 926 NavigationObserver observer(WebContents()); | 954 NavigationObserver observer(WebContents()); |
| 955 scoped_ptr<PromptObserver> prompt_observer( |
| 956 PromptObserver::Create(WebContents())); |
| 927 std::string fill_and_submit = | 957 std::string fill_and_submit = |
| 928 "document.getElementById('username_field').value = 'temp';" | 958 "document.getElementById('username_field').value = 'temp';" |
| 929 "document.getElementById('password_field').value = 'random';" | 959 "document.getElementById('password_field').value = 'random';" |
| 930 "document.getElementById('input_submit_button').click()"; | 960 "document.getElementById('input_submit_button').click()"; |
| 931 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 961 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 932 observer.Wait(); | 962 observer.Wait(); |
| 933 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 963 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 934 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | |
| 935 } else { | |
| 936 EXPECT_TRUE(observer.infobar_shown()); | |
| 937 } | |
| 938 } | 964 } |
| 939 | 965 |
| 940 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 966 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, |
| 941 DontPromptWhenEnableAutomaticPasswordSavingSwitchIsSet) { | 967 DontPromptWhenEnableAutomaticPasswordSavingSwitchIsSet) { |
| 942 password_manager::TestPasswordStore* password_store = | 968 password_manager::TestPasswordStore* password_store = |
| 943 static_cast<password_manager::TestPasswordStore*>( | 969 static_cast<password_manager::TestPasswordStore*>( |
| 944 PasswordStoreFactory::GetForProfile(browser()->profile(), | 970 PasswordStoreFactory::GetForProfile(browser()->profile(), |
| 945 Profile::IMPLICIT_ACCESS).get()); | 971 Profile::IMPLICIT_ACCESS).get()); |
| 946 | 972 |
| 947 EXPECT_TRUE(password_store->IsEmpty()); | 973 EXPECT_TRUE(password_store->IsEmpty()); |
| 948 | 974 |
| 949 NavigateToFile("/password/password_form.html"); | 975 NavigateToFile("/password/password_form.html"); |
| 950 | 976 |
| 951 // Add the enable-automatic-password-saving switch. | 977 // Add the enable-automatic-password-saving switch. |
| 952 CommandLine::ForCurrentProcess()->AppendSwitch( | 978 CommandLine::ForCurrentProcess()->AppendSwitch( |
| 953 password_manager::switches::kEnableAutomaticPasswordSaving); | 979 password_manager::switches::kEnableAutomaticPasswordSaving); |
| 954 | 980 |
| 955 // Fill a form and submit through a <input type="submit"> button. | 981 // Fill a form and submit through a <input type="submit"> button. |
| 956 NavigationObserver observer(WebContents()); | 982 NavigationObserver observer(WebContents()); |
| 983 scoped_ptr<PromptObserver> prompt_observer( |
| 984 PromptObserver::Create(WebContents())); |
| 957 // Make sure that the only passwords saved are the auto-saved ones. | 985 // Make sure that the only passwords saved are the auto-saved ones. |
| 958 observer.disable_should_automatically_accept_infobar(); | |
| 959 std::string fill_and_submit = | 986 std::string fill_and_submit = |
| 960 "document.getElementById('username_field').value = 'temp';" | 987 "document.getElementById('username_field').value = 'temp';" |
| 961 "document.getElementById('password_field').value = 'random';" | 988 "document.getElementById('password_field').value = 'random';" |
| 962 "document.getElementById('input_submit_button').click()"; | 989 "document.getElementById('input_submit_button').click()"; |
| 963 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 990 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 964 observer.Wait(); | 991 observer.Wait(); |
| 965 if (chrome::VersionInfo::GetChannel() == | 992 if (chrome::VersionInfo::GetChannel() == |
| 966 chrome::VersionInfo::CHANNEL_UNKNOWN) { | 993 chrome::VersionInfo::CHANNEL_UNKNOWN) { |
| 967 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 994 // Passwords getting auto-saved, no prompt. |
| 968 EXPECT_FALSE(ui_controller()->PasswordPendingUserDecision()); | 995 EXPECT_FALSE(prompt_observer->IsShowingPrompt()); |
| 969 } else { | |
| 970 EXPECT_FALSE(observer.infobar_shown()); | |
| 971 } | |
| 972 EXPECT_FALSE(password_store->IsEmpty()); | 996 EXPECT_FALSE(password_store->IsEmpty()); |
| 973 } else { | 997 } else { |
| 974 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 998 // Prompt shown, and no passwords saved automatically. |
| 975 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | 999 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 976 } else { | |
| 977 EXPECT_TRUE(observer.infobar_shown()); | |
| 978 } | |
| 979 EXPECT_TRUE(password_store->IsEmpty()); | 1000 EXPECT_TRUE(password_store->IsEmpty()); |
| 980 } | 1001 } |
| 981 } | 1002 } |
| 982 | 1003 |
| 983 // Test fix for crbug.com/368690. | 1004 // Test fix for crbug.com/368690. |
| 984 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, NoPromptWhenReloading) { | 1005 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, NoPromptWhenReloading) { |
| 985 NavigateToFile("/password/password_form.html"); | 1006 NavigateToFile("/password/password_form.html"); |
| 986 | 1007 |
| 987 std::string fill = | 1008 std::string fill = |
| 988 "document.getElementById('username_redirect').value = 'temp';" | 1009 "document.getElementById('username_redirect').value = 'temp';" |
| 989 "document.getElementById('password_redirect').value = 'random';"; | 1010 "document.getElementById('password_redirect').value = 'random';"; |
| 990 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill)); | 1011 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill)); |
| 991 | 1012 |
| 992 NavigationObserver observer(WebContents()); | 1013 NavigationObserver observer(WebContents()); |
| 1014 scoped_ptr<PromptObserver> prompt_observer( |
| 1015 PromptObserver::Create(WebContents())); |
| 993 GURL url = embedded_test_server()->GetURL("/password/password_form.html"); | 1016 GURL url = embedded_test_server()->GetURL("/password/password_form.html"); |
| 994 chrome::NavigateParams params(browser(), url, | 1017 chrome::NavigateParams params(browser(), url, |
| 995 content::PAGE_TRANSITION_RELOAD); | 1018 content::PAGE_TRANSITION_RELOAD); |
| 996 ui_test_utils::NavigateToURL(¶ms); | 1019 ui_test_utils::NavigateToURL(¶ms); |
| 997 observer.Wait(); | 1020 observer.Wait(); |
| 998 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 1021 EXPECT_FALSE(prompt_observer->IsShowingPrompt()); |
| 999 EXPECT_FALSE(ui_controller()->PasswordPendingUserDecision()); | |
| 1000 } else { | |
| 1001 EXPECT_FALSE(observer.infobar_shown()); | |
| 1002 } | |
| 1003 } | 1022 } |
| 1004 | 1023 |
| 1005 // Test that if a form gets dynamically added between the form parsing and | 1024 // Test that if a form gets dynamically added between the form parsing and |
| 1006 // rendering, and while the main frame still loads, it still is registered, and | 1025 // rendering, and while the main frame still loads, it still is registered, and |
| 1007 // thus saving passwords from it works. | 1026 // thus saving passwords from it works. |
| 1008 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, | 1027 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, |
| 1009 FormsAddedBetweenParsingAndRendering) { | 1028 FormsAddedBetweenParsingAndRendering) { |
| 1010 NavigateToFile("/password/between_parsing_and_rendering.html"); | 1029 NavigateToFile("/password/between_parsing_and_rendering.html"); |
| 1011 | 1030 |
| 1012 NavigationObserver observer(WebContents()); | 1031 NavigationObserver observer(WebContents()); |
| 1032 scoped_ptr<PromptObserver> prompt_observer( |
| 1033 PromptObserver::Create(WebContents())); |
| 1013 std::string submit = | 1034 std::string submit = |
| 1014 "document.getElementById('username').value = 'temp';" | 1035 "document.getElementById('username').value = 'temp';" |
| 1015 "document.getElementById('password').value = 'random';" | 1036 "document.getElementById('password').value = 'random';" |
| 1016 "document.getElementById('submit-button').click();"; | 1037 "document.getElementById('submit-button').click();"; |
| 1017 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), submit)); | 1038 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), submit)); |
| 1018 observer.Wait(); | 1039 observer.Wait(); |
| 1019 | 1040 |
| 1020 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 1041 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 1021 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | |
| 1022 } else { | |
| 1023 EXPECT_TRUE(observer.infobar_shown()); | |
| 1024 } | |
| 1025 } | 1042 } |
| 1026 | 1043 |
| 1027 // Test that if there was no previous page load then the PasswordManagerDriver | 1044 // Test that if there was no previous page load then the PasswordManagerDriver |
| 1028 // does not think that there were SSL errors on the current page. The test opens | 1045 // does not think that there were SSL errors on the current page. The test opens |
| 1029 // a new tab with a URL for which the embedded test server issues a basic auth | 1046 // a new tab with a URL for which the embedded test server issues a basic auth |
| 1030 // challenge. | 1047 // challenge. |
| 1031 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, NoLastLoadGoodLastLoad) { | 1048 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest, NoLastLoadGoodLastLoad) { |
| 1032 // Teach the embedded server to handle requests by issuing the basic auth | 1049 // Teach the embedded server to handle requests by issuing the basic auth |
| 1033 // challenge. | 1050 // challenge. |
| 1034 embedded_test_server()->RegisterRequestHandler( | 1051 embedded_test_server()->RegisterRequestHandler( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1050 // authentication. | 1067 // authentication. |
| 1051 ui_test_utils::NavigateToURLWithDisposition( | 1068 ui_test_utils::NavigateToURLWithDisposition( |
| 1052 browser(), | 1069 browser(), |
| 1053 embedded_test_server()->GetURL("/basic_auth"), | 1070 embedded_test_server()->GetURL("/basic_auth"), |
| 1054 NEW_FOREGROUND_TAB, | 1071 NEW_FOREGROUND_TAB, |
| 1055 ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); | 1072 ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); |
| 1056 | 1073 |
| 1057 content::NavigationController* nav_controller = | 1074 content::NavigationController* nav_controller = |
| 1058 &WebContents()->GetController(); | 1075 &WebContents()->GetController(); |
| 1059 NavigationObserver nav_observer(WebContents()); | 1076 NavigationObserver nav_observer(WebContents()); |
| 1077 scoped_ptr<PromptObserver> prompt_observer( |
| 1078 PromptObserver::Create(WebContents())); |
| 1060 WindowedAuthNeededObserver auth_needed_observer(nav_controller); | 1079 WindowedAuthNeededObserver auth_needed_observer(nav_controller); |
| 1061 auth_needed_observer.Wait(); | 1080 auth_needed_observer.Wait(); |
| 1062 | 1081 |
| 1063 WindowedAuthSuppliedObserver auth_supplied_observer(nav_controller); | 1082 WindowedAuthSuppliedObserver auth_supplied_observer(nav_controller); |
| 1064 // Offer valid credentials on the auth challenge. | 1083 // Offer valid credentials on the auth challenge. |
| 1065 ASSERT_EQ(1u, login_observer.handlers().size()); | 1084 ASSERT_EQ(1u, login_observer.handlers().size()); |
| 1066 LoginHandler* handler = *login_observer.handlers().begin(); | 1085 LoginHandler* handler = *login_observer.handlers().begin(); |
| 1067 ASSERT_TRUE(handler); | 1086 ASSERT_TRUE(handler); |
| 1068 // Any username/password will work. | 1087 // Any username/password will work. |
| 1069 handler->SetAuth(base::UTF8ToUTF16("user"), base::UTF8ToUTF16("pwd")); | 1088 handler->SetAuth(base::UTF8ToUTF16("user"), base::UTF8ToUTF16("pwd")); |
| 1070 auth_supplied_observer.Wait(); | 1089 auth_supplied_observer.Wait(); |
| 1071 | 1090 |
| 1072 // The password manager should be working correctly. | 1091 // The password manager should be working correctly. |
| 1073 nav_observer.Wait(); | 1092 nav_observer.Wait(); |
| 1074 if (ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()) { | 1093 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 1075 EXPECT_TRUE(ui_controller()->PasswordPendingUserDecision()); | 1094 prompt_observer->Accept(); |
| 1076 ui_controller()->SavePassword(); | 1095 |
| 1077 } else { | |
| 1078 EXPECT_TRUE(nav_observer.infobar_shown()); | |
| 1079 } | |
| 1080 // Spin the message loop to make sure the password store had a chance to save | 1096 // Spin the message loop to make sure the password store had a chance to save |
| 1081 // the password. | 1097 // the password. |
| 1082 base::RunLoop run_loop; | 1098 base::RunLoop run_loop; |
| 1083 run_loop.RunUntilIdle(); | 1099 run_loop.RunUntilIdle(); |
| 1084 EXPECT_FALSE(password_store->IsEmpty()); | 1100 EXPECT_FALSE(password_store->IsEmpty()); |
| 1085 } | 1101 } |
| OLD | NEW |