1 // Copyright (c) 2012 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/strings/utf_string_conversions.h"
6 #include "chrome/browser/autocomplete/autocomplete_classifier_factory.h"
7 #include "chrome/browser/search_engines/template_url_service_factory.h"
8 #include "chrome/browser/ui/omnibox/omnibox_edit_controller.h"
9 #include "chrome/browser/ui/omnibox/omnibox_edit_model.h"
10 #include "chrome/browser/ui/omnibox/omnibox_view.h"
11 #include "chrome/browser/ui/toolbar/test_toolbar_model.h"
12 #include "chrome/test/base/testing_profile.h"
13 #include "testing/gtest/include/gtest/gtest.h"
15 using base::ASCIIToUTF16
;
16 using base::UTF8ToUTF16
;
17 using content::WebContents
;
21 class TestingOmniboxView
: public OmniboxView
{
23 explicit TestingOmniboxView(OmniboxEditController
* controller
)
24 : OmniboxView(NULL
, controller
, NULL
) {}
27 void SaveStateToTab(WebContents
* tab
) override
{}
28 void OnTabChanged(const WebContents
* web_contents
) override
{}
29 void ResetTabState(WebContents
* web_contents
) override
{}
30 void Update() override
{}
31 void UpdatePlaceholderText() override
{}
32 void OpenMatch(const AutocompleteMatch
& match
,
33 WindowOpenDisposition disposition
,
34 const GURL
& alternate_nav_url
,
35 const base::string16
& pasted_text
,
36 size_t selected_line
) override
{}
37 base::string16
GetText() const override
{ return text_
; }
38 void SetUserText(const base::string16
& text
,
39 const base::string16
& display_text
,
40 bool update_popup
) override
{
43 void SetWindowTextAndCaretPos(const base::string16
& text
,
46 bool notify_text_changed
) override
{
49 void SetForcedQuery() override
{}
50 bool IsSelectAll() const override
{ return false; }
51 bool DeleteAtEndPressed() override
{ return false; }
52 void GetSelectionBounds(size_t* start
, size_t* end
) const override
{}
53 void SelectAll(bool reversed
) override
{}
54 void RevertAll() override
{}
55 void UpdatePopup() override
{}
56 void SetFocus() override
{}
57 void ApplyCaretVisibility() override
{}
58 void OnTemporaryTextMaybeChanged(const base::string16
& display_text
,
59 bool save_original_selection
,
60 bool notify_text_changed
) override
{
63 bool OnInlineAutocompleteTextMaybeChanged(const base::string16
& display_text
,
64 size_t user_text_length
) override
{
65 const bool text_changed
= text_
!= display_text
;
67 inline_autocomplete_text_
= display_text
.substr(user_text_length
);
70 void OnInlineAutocompleteTextCleared() override
{
71 inline_autocomplete_text_
.clear();
73 void OnRevertTemporaryText() override
{}
74 void OnBeforePossibleChange() override
{}
75 bool OnAfterPossibleChange() override
{ return false; }
76 gfx::NativeView
GetNativeView() const override
{ return NULL
; }
77 gfx::NativeView
GetRelativeWindowForPopup() const override
{ return NULL
; }
78 void SetGrayTextAutocompletion(const base::string16
& input
) override
{}
79 base::string16
GetGrayTextAutocompletion() const override
{
80 return base::string16();
82 int GetTextWidth() const override
{ return 0; }
83 int GetWidth() const override
{ return 0; }
84 bool IsImeComposing() const override
{ return false; }
85 int GetOmniboxTextLength() const override
{ return 0; }
86 void EmphasizeURLComponents() override
{}
88 const base::string16
& inline_autocomplete_text() const {
89 return inline_autocomplete_text_
;
94 base::string16 inline_autocomplete_text_
;
96 DISALLOW_COPY_AND_ASSIGN(TestingOmniboxView
);
99 class TestingOmniboxEditController
: public OmniboxEditController
{
101 explicit TestingOmniboxEditController(ToolbarModel
* toolbar_model
)
102 : OmniboxEditController(NULL
),
103 toolbar_model_(toolbar_model
) {
107 // OmniboxEditController:
108 void Update(const content::WebContents
* contents
) override
{}
109 void OnChanged() override
{}
110 void OnSetFocus() override
{}
111 void ShowURL() override
{}
112 InstantController
* GetInstant() override
{ return NULL
; }
113 WebContents
* GetWebContents() override
{ return NULL
; }
114 ToolbarModel
* GetToolbarModel() override
{ return toolbar_model_
; }
115 const ToolbarModel
* GetToolbarModel() const override
{
116 return toolbar_model_
;
120 ToolbarModel
* toolbar_model_
;
122 DISALLOW_COPY_AND_ASSIGN(TestingOmniboxEditController
);
127 class AutocompleteEditTest
: public ::testing::Test
{
129 TestToolbarModel
* toolbar_model() { return &toolbar_model_
; }
132 TestToolbarModel toolbar_model_
;
135 // Tests various permutations of AutocompleteModel::AdjustTextForCopy.
136 TEST_F(AutocompleteEditTest
, AdjustTextForCopy
) {
138 const char* perm_text
;
140 const bool is_all_selected
;
142 const char* expected_output
;
143 const bool write_url
;
144 const char* expected_url
;
145 const bool extracted_search_terms
;
147 // Test that http:// is inserted if all text is selected.
148 { "a.de/b", 0, true, "a.de/b", "http://a.de/b", true, "http://a.de/b",
151 // Test that http:// is inserted if the host is selected.
152 { "a.de/b", 0, false, "a.de/", "http://a.de/", true, "http://a.de/",
155 // Tests that http:// is inserted if the path is modified.
156 { "a.de/b", 0, false, "a.de/c", "http://a.de/c", true, "http://a.de/c",
159 // Tests that http:// isn't inserted if the host is modified.
160 { "a.de/b", 0, false, "a.com/b", "a.com/b", false, "", false },
162 // Tests that http:// isn't inserted if the start of the selection is 1.
163 { "a.de/b", 1, false, "a.de/b", "a.de/b", false, "", false },
165 // Tests that http:// isn't inserted if a portion of the host is selected.
166 { "a.de/", 0, false, "a.d", "a.d", false, "", false },
168 // Tests that http:// isn't inserted for an https url after the user nukes
170 { "https://a.com/", 0, false, "a.com/", "a.com/", false, "", false },
172 // Tests that http:// isn't inserted if the user adds to the host.
173 { "a.de/", 0, false, "a.de.com/", "a.de.com/", false, "", false },
175 // Tests that we don't get double http if the user manually inserts http.
176 { "a.de/", 0, false, "http://a.de/", "http://a.de/", true, "http://a.de/",
179 // Makes sure intranet urls get 'http://' prefixed to them.
180 { "b/foo", 0, true, "b/foo", "http://b/foo", true, "http://b/foo", false },
182 // Verifies a search term 'foo' doesn't end up with http.
183 { "www.google.com/search?", 0, false, "foo", "foo", false, "", false },
185 // Makes sure extracted search terms are not modified.
186 { "www.google.com/webhp?", 0, true, "hello world", "hello world", false,
189 TestingOmniboxEditController
controller(toolbar_model());
190 TestingOmniboxView
view(&controller
);
191 TestingProfile profile
;
192 // NOTE: The TemplateURLService must be created before the
193 // AutocompleteClassifier so that the SearchProvider gets a non-NULL
194 // TemplateURLService at construction time.
195 TemplateURLServiceFactory::GetInstance()->SetTestingFactory(
196 &profile
, &TemplateURLServiceFactory::BuildInstanceFor
);
197 AutocompleteClassifierFactory::GetInstance()->SetTestingFactory(
198 &profile
, &AutocompleteClassifierFactory::BuildInstanceFor
);
199 OmniboxEditModel
model(&view
, &controller
, &profile
);
201 for (size_t i
= 0; i
< arraysize(input
); ++i
) {
202 toolbar_model()->set_text(ASCIIToUTF16(input
[i
].perm_text
));
203 model
.UpdatePermanentText();
205 toolbar_model()->set_perform_search_term_replacement(
206 input
[i
].extracted_search_terms
);
208 base::string16 result
= ASCIIToUTF16(input
[i
].input
);
211 model
.AdjustTextForCopy(input
[i
].sel_start
, input
[i
].is_all_selected
,
212 &result
, &url
, &write_url
);
213 EXPECT_EQ(ASCIIToUTF16(input
[i
].expected_output
), result
) << "@: " << i
;
214 EXPECT_EQ(input
[i
].write_url
, write_url
) << " @" << i
;
216 EXPECT_EQ(input
[i
].expected_url
, url
.spec()) << " @" << i
;
220 TEST_F(AutocompleteEditTest
, InlineAutocompleteText
) {
221 TestingOmniboxEditController
controller(toolbar_model());
222 TestingOmniboxView
view(&controller
);
223 TestingProfile profile
;
224 // NOTE: The TemplateURLService must be created before the
225 // AutocompleteClassifier so that the SearchProvider gets a non-NULL
226 // TemplateURLService at construction time.
227 TemplateURLServiceFactory::GetInstance()->SetTestingFactory(
228 &profile
, &TemplateURLServiceFactory::BuildInstanceFor
);
229 AutocompleteClassifierFactory::GetInstance()->SetTestingFactory(
230 &profile
, &AutocompleteClassifierFactory::BuildInstanceFor
);
231 OmniboxEditModel
model(&view
, &controller
, &profile
);
233 // Test if the model updates the inline autocomplete text in the view.
234 EXPECT_EQ(base::string16(), view
.inline_autocomplete_text());
235 model
.SetUserText(UTF8ToUTF16("he"));
236 model
.OnPopupDataChanged(UTF8ToUTF16("llo"), NULL
, base::string16(), false);
237 EXPECT_EQ(UTF8ToUTF16("hello"), view
.GetText());
238 EXPECT_EQ(UTF8ToUTF16("llo"), view
.inline_autocomplete_text());
240 model
.OnAfterPossibleChange(UTF8ToUTF16("he"), UTF8ToUTF16("hel"), 3, 3,
241 false, true, false, true);
242 EXPECT_EQ(base::string16(), view
.inline_autocomplete_text());
243 model
.OnPopupDataChanged(UTF8ToUTF16("lo"), NULL
, base::string16(), false);
244 EXPECT_EQ(UTF8ToUTF16("hello"), view
.GetText());
245 EXPECT_EQ(UTF8ToUTF16("lo"), view
.inline_autocomplete_text());
248 EXPECT_EQ(base::string16(), view
.GetText());
249 EXPECT_EQ(base::string16(), view
.inline_autocomplete_text());
251 model
.SetUserText(UTF8ToUTF16("he"));
252 model
.OnPopupDataChanged(UTF8ToUTF16("llo"), NULL
, base::string16(), false);
253 EXPECT_EQ(UTF8ToUTF16("hello"), view
.GetText());
254 EXPECT_EQ(UTF8ToUTF16("llo"), view
.inline_autocomplete_text());
256 model
.AcceptTemporaryTextAsUserText();
257 EXPECT_EQ(UTF8ToUTF16("hello"), view
.GetText());
258 EXPECT_EQ(base::string16(), view
.inline_autocomplete_text());