[Password manager] Temporarily add some CHECKs to investigate a crash
[chromium-blink-merge.git] / chrome / browser / ui / autofill / card_unmask_prompt_view_browsertest.cc
blob5795d034c209e07e5bc5a2a70bfa8b8ec12822bc
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/bind.h"
6 #include "base/guid.h"
7 #include "base/message_loop/message_loop.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "chrome/browser/autofill/risk_util.h"
10 #include "chrome/browser/ui/autofill/card_unmask_prompt_controller_impl.h"
11 #include "chrome/browser/ui/autofill/card_unmask_prompt_view_tester.h"
12 #include "chrome/browser/ui/browser.h"
13 #include "chrome/browser/ui/tabs/tab_strip_model.h"
14 #include "chrome/test/base/in_process_browser_test.h"
15 #include "components/autofill/core/browser/autofill_test_utils.h"
16 #include "components/autofill/core/browser/card_unmask_delegate.h"
17 #include "components/user_prefs/user_prefs.h"
18 #include "content/public/browser/web_contents.h"
19 #include "content/public/test/test_utils.h"
21 namespace autofill {
23 namespace {
25 class TestCardUnmaskDelegate : public CardUnmaskDelegate {
26 public:
27 TestCardUnmaskDelegate() : weak_factory_(this) {}
29 virtual ~TestCardUnmaskDelegate() {}
31 // CardUnmaskDelegate implementation.
32 void OnUnmaskResponse(const UnmaskResponse& response) override {
33 response_ = response;
35 void OnUnmaskPromptClosed() override {}
37 base::WeakPtr<TestCardUnmaskDelegate> GetWeakPtr() {
38 return weak_factory_.GetWeakPtr();
41 UnmaskResponse response() { return response_; }
43 private:
44 UnmaskResponse response_;
46 base::WeakPtrFactory<TestCardUnmaskDelegate> weak_factory_;
48 DISALLOW_COPY_AND_ASSIGN(TestCardUnmaskDelegate);
51 class TestCardUnmaskPromptController : public CardUnmaskPromptControllerImpl {
52 public:
53 TestCardUnmaskPromptController(
54 content::WebContents* contents,
55 scoped_refptr<content::MessageLoopRunner> runner)
56 : CardUnmaskPromptControllerImpl(contents,
57 base::Bind(&LoadRiskData, 0, contents),
58 user_prefs::UserPrefs::Get(contents->GetBrowserContext()), false),
59 runner_(runner),
60 weak_factory_(this) {}
62 // CardUnmaskPromptControllerImpl implementation.
63 base::TimeDelta GetSuccessMessageDuration() const override {
64 return base::TimeDelta::FromMilliseconds(10);
67 void LoadRiskFingerprint() override {
68 OnDidLoadRiskFingerprint("risk_data");
71 base::WeakPtr<TestCardUnmaskPromptController> GetWeakPtr() {
72 return weak_factory_.GetWeakPtr();
75 using CardUnmaskPromptControllerImpl::view;
77 private:
78 scoped_refptr<content::MessageLoopRunner> runner_;
79 base::WeakPtrFactory<TestCardUnmaskPromptController> weak_factory_;
81 DISALLOW_COPY_AND_ASSIGN(TestCardUnmaskPromptController);
84 class CardUnmaskPromptViewBrowserTest : public InProcessBrowserTest {
85 public:
86 CardUnmaskPromptViewBrowserTest() : InProcessBrowserTest() {}
88 ~CardUnmaskPromptViewBrowserTest() override {}
90 void SetUpOnMainThread() override {
91 runner_ = new content::MessageLoopRunner;
92 controller_.reset(new TestCardUnmaskPromptController(
93 browser()->tab_strip_model()->GetActiveWebContents(), runner_));
94 delegate_.reset(new TestCardUnmaskDelegate());
97 void FreeDelegate() { delegate_.reset(); }
99 TestCardUnmaskPromptController* controller() { return controller_.get(); }
100 TestCardUnmaskDelegate* delegate() { return delegate_.get(); }
102 protected:
103 // This member must outlive the controller.
104 scoped_refptr<content::MessageLoopRunner> runner_;
106 private:
107 scoped_ptr<TestCardUnmaskPromptController> controller_;
108 scoped_ptr<TestCardUnmaskDelegate> delegate_;
110 DISALLOW_COPY_AND_ASSIGN(CardUnmaskPromptViewBrowserTest);
113 IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest, DisplayUI) {
114 controller()->ShowPrompt(test::GetMaskedServerCard(),
115 delegate()->GetWeakPtr());
118 // TODO(bondd): bring up on Mac.
119 #if !defined(OS_MACOSX)
120 // Makes sure the user can close the dialog while the verification success
121 // message is showing.
122 IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest,
123 EarlyCloseAfterSuccess) {
124 controller()->ShowPrompt(test::GetMaskedServerCard(),
125 delegate()->GetWeakPtr());
126 controller()->OnUnmaskResponse(base::ASCIIToUTF16("123"),
127 base::ASCIIToUTF16("10"),
128 base::ASCIIToUTF16("19"), false);
129 EXPECT_EQ(base::ASCIIToUTF16("123"), delegate()->response().cvc);
130 controller()->OnVerificationResult(AutofillClient::SUCCESS);
132 // Simulate the user clicking [x] before the "Success!" message disappears.
133 CardUnmaskPromptViewTester::For(controller()->view())->Close();
134 // Wait a little while; there should be no crash.
135 base::MessageLoop::current()->PostDelayedTask(
136 FROM_HERE, base::Bind(&content::MessageLoopRunner::Quit,
137 base::Unretained(runner_.get())),
138 2 * controller()->GetSuccessMessageDuration());
139 runner_->Run();
141 #endif
143 // Makes sure the tab can be closed while the dialog is showing.
144 // https://crbug.com/484376
145 IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest,
146 CloseTabWhileDialogShowing) {
147 controller()->ShowPrompt(test::GetMaskedServerCard(),
148 delegate()->GetWeakPtr());
149 // Simulate AutofillManager (the delegate in production code) being destroyed
150 // before CardUnmaskPromptViewBridge::OnConstrainedWindowClosed() is called.
151 FreeDelegate();
152 browser()->tab_strip_model()->GetActiveWebContents()->Close();
154 content::RunAllPendingInMessageLoop();
157 } // namespace
159 } // namespace autofill