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.
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"
25 class TestCardUnmaskDelegate
: public CardUnmaskDelegate
{
27 TestCardUnmaskDelegate() : weak_factory_(this) {}
29 virtual ~TestCardUnmaskDelegate() {}
31 // CardUnmaskDelegate implementation.
32 void OnUnmaskResponse(const UnmaskResponse
& response
) override
{
35 void OnUnmaskPromptClosed() override
{}
37 base::WeakPtr
<TestCardUnmaskDelegate
> GetWeakPtr() {
38 return weak_factory_
.GetWeakPtr();
41 UnmaskResponse
response() { return response_
; }
44 UnmaskResponse response_
;
46 base::WeakPtrFactory
<TestCardUnmaskDelegate
> weak_factory_
;
48 DISALLOW_COPY_AND_ASSIGN(TestCardUnmaskDelegate
);
51 class TestCardUnmaskPromptController
: public CardUnmaskPromptControllerImpl
{
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),
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
;
78 scoped_refptr
<content::MessageLoopRunner
> runner_
;
79 base::WeakPtrFactory
<TestCardUnmaskPromptController
> weak_factory_
;
81 DISALLOW_COPY_AND_ASSIGN(TestCardUnmaskPromptController
);
84 class CardUnmaskPromptViewBrowserTest
: public InProcessBrowserTest
{
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(); }
103 // This member must outlive the controller.
104 scoped_refptr
<content::MessageLoopRunner
> runner_
;
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());
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.
152 browser()->tab_strip_model()->GetActiveWebContents()->Close();
154 content::RunAllPendingInMessageLoop();
159 } // namespace autofill