1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
|
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/prefs/pref_service.h"
#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ui/autofill/generated_credit_card_bubble_controller.h"
#include "chrome/browser/ui/autofill/test_generated_credit_card_bubble_controller.h"
#include "chrome/browser/ui/autofill/test_generated_credit_card_bubble_view.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/testing_profile.h"
#include "components/autofill/core/browser/autofill_test_utils.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "content/public/test/web_contents_tester.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/page_transition_types.h"
#include "ui/gfx/range/range.h"
#if defined(OS_WIN)
#include "ui/base/win/scoped_ole_initializer.h"
#endif
namespace autofill {
namespace {
base::string16 BackingCard() {
return base::ASCIIToUTF16("Visa - 1111");
}
base::string16 FrontingCard() {
return base::ASCIIToUTF16("Mastercard - 4444");
}
base::string16 RangeOfString(const base::string16& string,
const gfx::Range& range) {
return string.substr(range.start(), range.end() - range.start());
}
class GeneratedCreditCardBubbleControllerTest : public testing::Test {
public:
GeneratedCreditCardBubbleControllerTest()
: test_web_contents_(
content::WebContentsTester::CreateTestWebContents(
&profile_, NULL)) {}
void SetUp() override {
// Attaches immediately to |test_web_contents_| so a test version will exist
// before a non-test version can be created.
new TestGeneratedCreditCardBubbleController(test_web_contents_.get());
ASSERT_TRUE(controller()->IsInstalled());
}
protected:
TestGeneratedCreditCardBubbleController* controller() {
return static_cast<TestGeneratedCreditCardBubbleController*>(
TestGeneratedCreditCardBubbleController::FromWebContents(
test_web_contents_.get()));
}
int GeneratedCardBubbleTimesShown() {
return profile_.GetPrefs()->GetInteger(
::prefs::kAutofillGeneratedCardBubbleTimesShown);
}
void Show() {
ASSERT_TRUE(controller()->IsInstalled());
TestGeneratedCreditCardBubbleController::Show(test_web_contents_.get(),
FrontingCard(),
BackingCard());
}
void NavigateWithTransition(ui::PageTransition trans) {
content::WebContentsTester::For(test_web_contents_.get())->TestDidNavigate(
test_web_contents_->GetMainFrame(), 1, GURL("about:blank"), trans);
}
private:
content::TestBrowserThreadBundle thread_bundle_;
#if defined(OS_WIN)
// Without this there will be drag and drop failures. http://crbug.com/227221
ui::ScopedOleInitializer ole_initializer_;
#endif
TestingProfile profile_;
scoped_ptr<content::WebContents> test_web_contents_;
};
} // namespace
TEST_F(GeneratedCreditCardBubbleControllerTest, GeneratedCardBubbleTimesShown) {
ASSERT_EQ(0, GeneratedCardBubbleTimesShown());
// Ensure that showing the generated card UI bumps the persistent count.
Show();
EXPECT_EQ(1, GeneratedCardBubbleTimesShown());
EXPECT_TRUE(controller()->GetTestingBubble()->showing());
Show();
Show();
EXPECT_EQ(3, GeneratedCardBubbleTimesShown());
EXPECT_TRUE(controller()->GetTestingBubble()->showing());
}
TEST_F(GeneratedCreditCardBubbleControllerTest, TitleText) {
Show();
EXPECT_FALSE(controller()->TitleText().empty());
}
TEST_F(GeneratedCreditCardBubbleControllerTest, ContentsText) {
// Ensure that while showing the generated card UI that the bubble's text
// contains "Visa - 1111" and "Mastercard - 4444".
Show();
base::string16 contents_text = controller()->ContentsText();
EXPECT_NE(base::string16::npos, contents_text.find(BackingCard()));
EXPECT_NE(base::string16::npos, contents_text.find(FrontingCard()));
// Make sure that |bubble_text_| is regenerated the same way in |Setup()|.
Show();
EXPECT_EQ(contents_text, controller()->ContentsText());
}
TEST_F(GeneratedCreditCardBubbleControllerTest, ContentsTextRanges) {
// Check that the highlighted ranges in the bubble's text are correct.
Show();
const base::string16& contents_text = controller()->ContentsText();
const std::vector<TextRange>& ranges = controller()->ContentsTextRanges();
ASSERT_EQ(3U, ranges.size());
EXPECT_EQ(FrontingCard(), RangeOfString(contents_text, ranges[0].range));
EXPECT_FALSE(ranges[0].is_link);
EXPECT_EQ(BackingCard(), RangeOfString(contents_text, ranges[1].range));
EXPECT_FALSE(ranges[1].is_link);
EXPECT_TRUE(ranges[2].is_link);
Show();
EXPECT_EQ(ranges, controller()->ContentsTextRanges());
}
TEST_F(GeneratedCreditCardBubbleControllerTest, AnchorIcon) {
Show();
EXPECT_FALSE(controller()->AnchorIcon().IsEmpty());
}
TEST_F(GeneratedCreditCardBubbleControllerTest, HideOnLinkClick) {
EXPECT_FALSE(controller()->GetTestingBubble());
Show();
EXPECT_TRUE(controller()->GetTestingBubble()->showing());
// However, if the user clicks a link the bubble should hide.
NavigateWithTransition(ui::PAGE_TRANSITION_LINK);
EXPECT_FALSE(controller());
}
TEST_F(GeneratedCreditCardBubbleControllerTest, StayOnSomeNavigations) {
EXPECT_FALSE(controller()->GetTestingBubble());
Show();
EXPECT_TRUE(controller()->GetTestingBubble()->showing());
// If the user reloads or the page redirects or submits a form, the bubble
// should stay showing.
NavigateWithTransition(ui::PAGE_TRANSITION_CLIENT_REDIRECT);
NavigateWithTransition(ui::PAGE_TRANSITION_FORM_SUBMIT);
NavigateWithTransition(ui::PAGE_TRANSITION_RELOAD);
EXPECT_TRUE(controller()->GetTestingBubble()->showing());
}
} // namespace autofill
|