Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 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 | 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 "base/guid.h" | 5 #include "base/guid.h" |
| 6 #include "base/message_loop/message_loop.h" | 6 #include "base/message_loop/message_loop.h" |
| 7 #include "base/strings/utf_string_conversions.h" | |
| 7 #include "chrome/browser/ui/autofill/card_unmask_prompt_controller_impl.h" | 8 #include "chrome/browser/ui/autofill/card_unmask_prompt_controller_impl.h" |
| 9 #include "chrome/browser/ui/autofill/card_unmask_prompt_view_tester.h" | |
| 8 #include "chrome/browser/ui/browser.h" | 10 #include "chrome/browser/ui/browser.h" |
| 9 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 11 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 10 #include "chrome/test/base/in_process_browser_test.h" | 12 #include "chrome/test/base/in_process_browser_test.h" |
| 11 #include "components/autofill/core/browser/autofill_test_utils.h" | 13 #include "components/autofill/core/browser/autofill_test_utils.h" |
| 12 #include "components/autofill/core/browser/card_unmask_delegate.h" | 14 #include "components/autofill/core/browser/card_unmask_delegate.h" |
| 13 #include "content/public/browser/web_contents.h" | 15 #include "content/public/browser/web_contents.h" |
| 14 #include "content/public/test/test_utils.h" | 16 #include "content/public/test/test_utils.h" |
| 15 | 17 |
| 16 namespace autofill { | 18 namespace autofill { |
| 17 | 19 |
| 18 namespace { | 20 namespace { |
| 19 | 21 |
| 20 class TestCardUnmaskDelegate : public CardUnmaskDelegate { | 22 class TestCardUnmaskDelegate : public CardUnmaskDelegate { |
| 21 public: | 23 public: |
| 22 TestCardUnmaskDelegate() : weak_factory_(this) {} | 24 TestCardUnmaskDelegate() : weak_factory_(this) {} |
| 23 | 25 |
| 24 virtual ~TestCardUnmaskDelegate() {} | 26 virtual ~TestCardUnmaskDelegate() {} |
| 25 | 27 |
| 26 // CardUnmaskDelegate implementation. | 28 // CardUnmaskDelegate implementation. |
| 27 void OnUnmaskResponse(const UnmaskResponse& response) override {} | 29 void OnUnmaskResponse(const UnmaskResponse& response) override { |
| 30 response_ = response; | |
| 31 } | |
| 28 void OnUnmaskPromptClosed() override {} | 32 void OnUnmaskPromptClosed() override {} |
| 29 | 33 |
| 30 base::WeakPtr<TestCardUnmaskDelegate> GetWeakPtr() { | 34 base::WeakPtr<TestCardUnmaskDelegate> GetWeakPtr() { |
| 31 return weak_factory_.GetWeakPtr(); | 35 return weak_factory_.GetWeakPtr(); |
| 32 } | 36 } |
| 33 | 37 |
| 38 UnmaskResponse response() { return response_; } | |
| 39 | |
| 34 private: | 40 private: |
| 41 UnmaskResponse response_; | |
| 42 | |
| 35 base::WeakPtrFactory<TestCardUnmaskDelegate> weak_factory_; | 43 base::WeakPtrFactory<TestCardUnmaskDelegate> weak_factory_; |
| 36 | 44 |
| 37 DISALLOW_COPY_AND_ASSIGN(TestCardUnmaskDelegate); | 45 DISALLOW_COPY_AND_ASSIGN(TestCardUnmaskDelegate); |
| 38 }; | 46 }; |
| 39 | 47 |
| 40 class TestCardUnmaskPromptController : public CardUnmaskPromptControllerImpl { | 48 class TestCardUnmaskPromptController : public CardUnmaskPromptControllerImpl { |
| 41 public: | 49 public: |
| 42 TestCardUnmaskPromptController( | 50 TestCardUnmaskPromptController( |
| 43 content::WebContents* contents, | 51 content::WebContents* contents, |
| 44 scoped_refptr<content::MessageLoopRunner> runner) | 52 scoped_refptr<content::MessageLoopRunner> runner) |
| 45 : CardUnmaskPromptControllerImpl(contents), | 53 : CardUnmaskPromptControllerImpl(contents), |
| 46 runner_(runner), | 54 runner_(runner), |
| 47 weak_factory_(this) {} | 55 weak_factory_(this) {} |
| 48 | 56 |
| 49 // CardUnmaskPromptControllerImpl implementation. | 57 // CardUnmaskPromptControllerImpl implementation. |
| 50 void OnDidLoadRiskFingerprint(const std::string& risk_data) override { | 58 base::TimeDelta GetSuccessMessageDuration() const override { |
| 51 CardUnmaskPromptControllerImpl::OnDidLoadRiskFingerprint(risk_data); | 59 return base::TimeDelta::FromMilliseconds(10); |
| 52 | |
| 53 // Call Quit() from here rather than from OnUnmaskDialogClosed(). | |
| 54 // FingerprintDataLoader starts several async tasks that take a while to | |
| 55 // complete. If Quit() is called before FingerprintDataLoader is all done | |
| 56 // then LeakTracker will detect that some resources have not been freed | |
| 57 // and cause the browser test to fail. This is not a real leak though - | |
| 58 // normally the async tasks would complete and encounter weak callbacks. | |
| 59 runner_->Quit(); | |
| 60 } | 60 } |
| 61 | 61 |
| 62 void RunMessageLoop() { runner_->Run(); } | 62 void LoadRiskFingerprint() override { |
| 63 OnDidLoadRiskFingerprint(std::string()); | |
| 64 } | |
| 63 | 65 |
| 64 base::WeakPtr<TestCardUnmaskPromptController> GetWeakPtr() { | 66 base::WeakPtr<TestCardUnmaskPromptController> GetWeakPtr() { |
| 65 return weak_factory_.GetWeakPtr(); | 67 return weak_factory_.GetWeakPtr(); |
| 66 } | 68 } |
| 67 | 69 |
| 70 using CardUnmaskPromptControllerImpl::view; | |
| 71 | |
| 68 private: | 72 private: |
| 69 scoped_refptr<content::MessageLoopRunner> runner_; | 73 scoped_refptr<content::MessageLoopRunner> runner_; |
| 70 base::WeakPtrFactory<TestCardUnmaskPromptController> weak_factory_; | 74 base::WeakPtrFactory<TestCardUnmaskPromptController> weak_factory_; |
| 71 | 75 |
| 72 DISALLOW_COPY_AND_ASSIGN(TestCardUnmaskPromptController); | 76 DISALLOW_COPY_AND_ASSIGN(TestCardUnmaskPromptController); |
| 73 }; | 77 }; |
| 74 | 78 |
| 75 class CardUnmaskPromptViewBrowserTest : public InProcessBrowserTest { | 79 class CardUnmaskPromptViewBrowserTest : public InProcessBrowserTest { |
| 76 public: | 80 public: |
| 77 CardUnmaskPromptViewBrowserTest() : InProcessBrowserTest() {} | 81 CardUnmaskPromptViewBrowserTest() : InProcessBrowserTest() {} |
| 78 | 82 |
| 79 ~CardUnmaskPromptViewBrowserTest() override {} | 83 ~CardUnmaskPromptViewBrowserTest() override {} |
| 80 | 84 |
| 81 void SetUpOnMainThread() override { | 85 void SetUpOnMainThread() override { |
| 82 runner_ = new content::MessageLoopRunner; | 86 runner_ = new content::MessageLoopRunner; |
| 83 controller_.reset(new TestCardUnmaskPromptController( | 87 controller_.reset(new TestCardUnmaskPromptController( |
| 84 browser()->tab_strip_model()->GetActiveWebContents(), runner_)); | 88 browser()->tab_strip_model()->GetActiveWebContents(), runner_)); |
| 85 delegate_.reset(new TestCardUnmaskDelegate()); | 89 delegate_.reset(new TestCardUnmaskDelegate()); |
| 86 } | 90 } |
| 87 | 91 |
| 88 TestCardUnmaskPromptController* controller() { return controller_.get(); } | 92 TestCardUnmaskPromptController* controller() { return controller_.get(); } |
| 89 TestCardUnmaskDelegate* delegate() { return delegate_.get(); } | 93 TestCardUnmaskDelegate* delegate() { return delegate_.get(); } |
| 90 | 94 |
| 91 private: | 95 protected: |
| 92 // This member must outlive the controller. | 96 // This member must outlive the controller. |
| 93 scoped_refptr<content::MessageLoopRunner> runner_; | 97 scoped_refptr<content::MessageLoopRunner> runner_; |
| 94 | 98 |
| 99 private: | |
| 95 scoped_ptr<TestCardUnmaskPromptController> controller_; | 100 scoped_ptr<TestCardUnmaskPromptController> controller_; |
| 96 scoped_ptr<TestCardUnmaskDelegate> delegate_; | 101 scoped_ptr<TestCardUnmaskDelegate> delegate_; |
| 97 | 102 |
| 98 DISALLOW_COPY_AND_ASSIGN(CardUnmaskPromptViewBrowserTest); | 103 DISALLOW_COPY_AND_ASSIGN(CardUnmaskPromptViewBrowserTest); |
| 99 }; | 104 }; |
| 100 | 105 |
| 101 IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest, DisplayUI) { | 106 IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest, DisplayUI) { |
| 102 CreditCard credit_card(CreditCard::MASKED_SERVER_CARD, "a123"); | 107 controller()->ShowPrompt(test::GetMaskedServerCard(), |
| 103 test::SetCreditCardInfo(&credit_card, "Bonnie Parker", | 108 delegate()->GetWeakPtr()); |
| 104 "2109" /* Mastercard */, "12", "2012"); | 109 } |
| 105 credit_card.SetTypeForMaskedCard(kMasterCard); | |
| 106 | 110 |
| 107 controller()->ShowPrompt(credit_card, delegate()->GetWeakPtr()); | 111 // TODO(bondd): bring up on Mac. |
| 108 controller()->RunMessageLoop(); | 112 #if !defined(OS_MACOSX) |
| 113 // Makes sure the user can close the dialog while the verification success | |
| 114 // message is showing. | |
| 115 IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest, | |
| 116 EarlyCloseAfterSuccess) { | |
| 117 controller()->ShowPrompt(test::GetMaskedServerCard(), | |
| 118 delegate()->GetWeakPtr()); | |
| 119 controller()->OnUnmaskResponse(base::ASCIIToUTF16("123"), | |
| 120 base::ASCIIToUTF16("10"), | |
| 121 base::ASCIIToUTF16("19"), false); | |
| 122 DCHECK_EQ(delegate()->response().cvc, base::ASCIIToUTF16("123")); | |
| 123 controller()->OnVerificationResult(AutofillClient::SUCCESS); | |
| 124 | |
| 125 // Simulate the user clicking [x] before the "Success!" message disappears. | |
| 126 CardUnmaskPromptViewTester::For(controller()->view())->Close(); | |
| 127 // Wait a little while; there should be no crash. | |
|
groby-ooo-7-16
2015/03/19 23:47:56
I suppose there's no way we can do without a fuzzy
Evan Stade
2015/03/20 00:22:42
The nature of the crash was that a stale closure w
| |
| 128 base::MessageLoop::current()->PostDelayedTask( | |
| 129 FROM_HERE, base::Bind(&content::MessageLoopRunner::Quit, | |
| 130 base::Unretained(runner_.get())), | |
| 131 2 * controller()->GetSuccessMessageDuration()); | |
| 132 runner_->Run(); | |
| 109 } | 133 } |
| 134 #endif | |
| 110 | 135 |
| 111 } // namespace | 136 } // namespace |
| 112 | 137 |
| 113 } // namespace autofill | 138 } // namespace autofill |
| OLD | NEW |