Revert of Add button to add new FSP services to Files app. (patchset #8 id:140001...
[chromium-blink-merge.git] / chrome / browser / ui / omnibox / omnibox_edit_unittest.cc
blobe0250700b1dd213e4443a8f70c0330535f84f298
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;
19 namespace {
21 class TestingOmniboxView : public OmniboxView {
22 public:
23 explicit TestingOmniboxView(OmniboxEditController* controller)
24 : OmniboxView(NULL, controller, NULL) {}
26 // OmniboxView:
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 {
41 text_ = display_text;
43 void SetWindowTextAndCaretPos(const base::string16& text,
44 size_t caret_pos,
45 bool update_popup,
46 bool notify_text_changed) override {
47 text_ = text;
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 {
61 text_ = display_text;
63 bool OnInlineAutocompleteTextMaybeChanged(const base::string16& display_text,
64 size_t user_text_length) override {
65 const bool text_changed = text_ != display_text;
66 text_ = display_text;
67 inline_autocomplete_text_ = display_text.substr(user_text_length);
68 return text_changed;
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_;
92 private:
93 base::string16 text_;
94 base::string16 inline_autocomplete_text_;
96 DISALLOW_COPY_AND_ASSIGN(TestingOmniboxView);
99 class TestingOmniboxEditController : public OmniboxEditController {
100 public:
101 explicit TestingOmniboxEditController(ToolbarModel* toolbar_model)
102 : OmniboxEditController(NULL),
103 toolbar_model_(toolbar_model) {
106 protected:
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_;
119 private:
120 ToolbarModel* toolbar_model_;
122 DISALLOW_COPY_AND_ASSIGN(TestingOmniboxEditController);
125 } // namespace
127 class AutocompleteEditTest : public ::testing::Test {
128 public:
129 TestToolbarModel* toolbar_model() { return &toolbar_model_; }
131 private:
132 TestToolbarModel toolbar_model_;
135 // Tests various permutations of AutocompleteModel::AdjustTextForCopy.
136 TEST_F(AutocompleteEditTest, AdjustTextForCopy) {
137 struct Data {
138 const char* perm_text;
139 const int sel_start;
140 const bool is_all_selected;
141 const char* input;
142 const char* expected_output;
143 const bool write_url;
144 const char* expected_url;
145 const bool extracted_search_terms;
146 } input[] = {
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",
149 false },
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/",
153 false },
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",
157 false },
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
169 // https.
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/",
177 false },
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,
187 "", true },
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);
209 GURL url;
210 bool write_url;
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;
215 if (write_url)
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());
247 model.Revert();
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());