Chromium Code Reviews| Index: chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc |
| diff --git a/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc b/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc |
| index 926efc6c96792342e2bad7c24bf931068b184df3..0ff543b1ec156b7a15797a30fc06a86213071ac8 100644 |
| --- a/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc |
| +++ b/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc |
| @@ -4,7 +4,9 @@ |
| #include "base/guid.h" |
| #include "base/message_loop/message_loop.h" |
| +#include "base/strings/utf_string_conversions.h" |
| #include "chrome/browser/ui/autofill/card_unmask_prompt_controller_impl.h" |
| +#include "chrome/browser/ui/autofill/card_unmask_prompt_view_tester.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| @@ -24,14 +26,20 @@ class TestCardUnmaskDelegate : public CardUnmaskDelegate { |
| virtual ~TestCardUnmaskDelegate() {} |
| // CardUnmaskDelegate implementation. |
| - void OnUnmaskResponse(const UnmaskResponse& response) override {} |
| + void OnUnmaskResponse(const UnmaskResponse& response) override { |
| + response_ = response; |
| + } |
| void OnUnmaskPromptClosed() override {} |
| base::WeakPtr<TestCardUnmaskDelegate> GetWeakPtr() { |
| return weak_factory_.GetWeakPtr(); |
| } |
| + UnmaskResponse response() { return response_; } |
| + |
| private: |
| + UnmaskResponse response_; |
| + |
| base::WeakPtrFactory<TestCardUnmaskDelegate> weak_factory_; |
| DISALLOW_COPY_AND_ASSIGN(TestCardUnmaskDelegate); |
| @@ -47,24 +55,20 @@ class TestCardUnmaskPromptController : public CardUnmaskPromptControllerImpl { |
| weak_factory_(this) {} |
| // CardUnmaskPromptControllerImpl implementation. |
| - void OnDidLoadRiskFingerprint(const std::string& risk_data) override { |
| - CardUnmaskPromptControllerImpl::OnDidLoadRiskFingerprint(risk_data); |
| - |
| - // Call Quit() from here rather than from OnUnmaskDialogClosed(). |
| - // FingerprintDataLoader starts several async tasks that take a while to |
| - // complete. If Quit() is called before FingerprintDataLoader is all done |
| - // then LeakTracker will detect that some resources have not been freed |
| - // and cause the browser test to fail. This is not a real leak though - |
| - // normally the async tasks would complete and encounter weak callbacks. |
| - runner_->Quit(); |
| + base::TimeDelta GetSuccessMessageDuration() const override { |
| + return base::TimeDelta::FromMilliseconds(10); |
| } |
| - void RunMessageLoop() { runner_->Run(); } |
| + void LoadRiskFingerprint() override { |
| + OnDidLoadRiskFingerprint(std::string()); |
| + } |
| base::WeakPtr<TestCardUnmaskPromptController> GetWeakPtr() { |
| return weak_factory_.GetWeakPtr(); |
| } |
| + using CardUnmaskPromptControllerImpl::view; |
| + |
| private: |
| scoped_refptr<content::MessageLoopRunner> runner_; |
| base::WeakPtrFactory<TestCardUnmaskPromptController> weak_factory_; |
| @@ -88,10 +92,11 @@ class CardUnmaskPromptViewBrowserTest : public InProcessBrowserTest { |
| TestCardUnmaskPromptController* controller() { return controller_.get(); } |
| TestCardUnmaskDelegate* delegate() { return delegate_.get(); } |
| - private: |
| + protected: |
| // This member must outlive the controller. |
| scoped_refptr<content::MessageLoopRunner> runner_; |
| + private: |
| scoped_ptr<TestCardUnmaskPromptController> controller_; |
| scoped_ptr<TestCardUnmaskDelegate> delegate_; |
| @@ -99,14 +104,34 @@ class CardUnmaskPromptViewBrowserTest : public InProcessBrowserTest { |
| }; |
| IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest, DisplayUI) { |
| - CreditCard credit_card(CreditCard::MASKED_SERVER_CARD, "a123"); |
| - test::SetCreditCardInfo(&credit_card, "Bonnie Parker", |
| - "2109" /* Mastercard */, "12", "2012"); |
| - credit_card.SetTypeForMaskedCard(kMasterCard); |
| + controller()->ShowPrompt(test::GetMaskedServerCard(), |
| + delegate()->GetWeakPtr()); |
| +} |
| - controller()->ShowPrompt(credit_card, delegate()->GetWeakPtr()); |
| - controller()->RunMessageLoop(); |
| +// TODO(bondd): bring up on Mac. |
| +#if !defined(OS_MACOSX) |
| +// Makes sure the user can close the dialog while the verification success |
| +// message is showing. |
| +IN_PROC_BROWSER_TEST_F(CardUnmaskPromptViewBrowserTest, |
| + EarlyCloseAfterSuccess) { |
| + controller()->ShowPrompt(test::GetMaskedServerCard(), |
| + delegate()->GetWeakPtr()); |
| + controller()->OnUnmaskResponse(base::ASCIIToUTF16("123"), |
| + base::ASCIIToUTF16("10"), |
| + base::ASCIIToUTF16("19"), false); |
| + DCHECK_EQ(delegate()->response().cvc, base::ASCIIToUTF16("123")); |
| + controller()->OnVerificationResult(AutofillClient::SUCCESS); |
| + |
| + // Simulate the user clicking [x] before the "Success!" message disappears. |
| + CardUnmaskPromptViewTester::For(controller()->view())->Close(); |
| + // 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
|
| + base::MessageLoop::current()->PostDelayedTask( |
| + FROM_HERE, base::Bind(&content::MessageLoopRunner::Quit, |
| + base::Unretained(runner_.get())), |
| + 2 * controller()->GetSuccessMessageDuration()); |
| + runner_->Run(); |
| } |
| +#endif |
| } // namespace |