Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(40)

Side by Side Diff: chrome/browser/password_manager/password_manager_browsertest.cc

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

Powered by Google App Engine
This is Rietveld 408576698