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/string16.h"
6 #include "base/strings/utf_string_conversions.h"
7 #include "chrome/browser/autocomplete/autocomplete_controller.h"
8 #include "chrome/browser/autocomplete/autocomplete_input.h"
9 #include "chrome/browser/autocomplete/autocomplete_match.h"
10 #include "chrome/browser/autocomplete/autocomplete_result.h"
11 #include "chrome/browser/extensions/api/omnibox/omnibox_api_testbase.h"
12 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/search_engines/template_url_service_factory.h"
14 #include "chrome/browser/ui/browser.h"
15 #include "chrome/browser/ui/omnibox/location_bar.h"
16 #include "chrome/browser/ui/omnibox/omnibox_view.h"
17 #include "chrome/test/base/ui_test_utils.h"
18 #include "ui/base/window_open_disposition.h"
20 IN_PROC_BROWSER_TEST_F(OmniboxApiTest, Basic) {
21 ASSERT_TRUE(RunExtensionTest("omnibox")) << message_;
23 // The results depend on the TemplateURLService being loaded. Make sure it is
24 // loaded so that the autocomplete results are consistent.
25 ui_test_utils::WaitForTemplateURLServiceToLoad(
26 TemplateURLServiceFactory::GetForProfile(browser()->profile()));
28 AutocompleteController* autocomplete_controller =
29 GetAutocompleteController(browser());
31 // Test that our extension's keyword is suggested to us when we partially type
34 autocomplete_controller->Start(
35 AutocompleteInput(ASCIIToUTF16("keywor"), string16::npos, string16(),
36 GURL(), AutocompleteInput::NEW_TAB_PAGE, true, false,
37 true, AutocompleteInput::ALL_MATCHES));
38 WaitForAutocompleteDone(autocomplete_controller);
39 EXPECT_TRUE(autocomplete_controller->done());
41 // Now, peek into the controller to see if it has the results we expect.
42 // First result should be to search for what was typed, second should be to
43 // enter "extension keyword" mode.
44 const AutocompleteResult& result = autocomplete_controller->result();
45 ASSERT_EQ(2U, result.size()) << AutocompleteResultAsString(result);
46 AutocompleteMatch match = result.match_at(0);
47 EXPECT_EQ(AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, match.type);
48 EXPECT_FALSE(match.deletable);
50 match = result.match_at(1);
51 EXPECT_EQ(ASCIIToUTF16("keyword"), match.keyword);
54 // Test that our extension can send suggestions back to us.
56 autocomplete_controller->Start(
57 AutocompleteInput(ASCIIToUTF16("keyword suggestio"), string16::npos,
58 string16(), GURL(), AutocompleteInput::NEW_TAB_PAGE,
59 true, false, true, AutocompleteInput::ALL_MATCHES));
60 WaitForAutocompleteDone(autocomplete_controller);
61 EXPECT_TRUE(autocomplete_controller->done());
63 // Now, peek into the controller to see if it has the results we expect.
64 // First result should be to invoke the keyword with what we typed, 2-4
65 // should be to invoke with suggestions from the extension, and the last
66 // should be to search for what we typed.
67 const AutocompleteResult& result = autocomplete_controller->result();
68 ASSERT_EQ(5U, result.size()) << AutocompleteResultAsString(result);
70 EXPECT_EQ(ASCIIToUTF16("keyword"), result.match_at(0).keyword);
71 EXPECT_EQ(ASCIIToUTF16("keyword suggestio"),
72 result.match_at(0).fill_into_edit);
73 EXPECT_EQ(AutocompleteMatchType::SEARCH_OTHER_ENGINE,
74 result.match_at(0).type);
75 EXPECT_EQ(AutocompleteProvider::TYPE_KEYWORD,
76 result.match_at(0).provider->type());
77 EXPECT_EQ(ASCIIToUTF16("keyword"), result.match_at(1).keyword);
78 EXPECT_EQ(ASCIIToUTF16("keyword suggestion1"),
79 result.match_at(1).fill_into_edit);
80 EXPECT_EQ(AutocompleteProvider::TYPE_KEYWORD,
81 result.match_at(1).provider->type());
82 EXPECT_EQ(ASCIIToUTF16("keyword"), result.match_at(2).keyword);
83 EXPECT_EQ(ASCIIToUTF16("keyword suggestion2"),
84 result.match_at(2).fill_into_edit);
85 EXPECT_EQ(AutocompleteProvider::TYPE_KEYWORD,
86 result.match_at(2).provider->type());
87 EXPECT_EQ(ASCIIToUTF16("keyword"), result.match_at(3).keyword);
88 EXPECT_EQ(ASCIIToUTF16("keyword suggestion3"),
89 result.match_at(3).fill_into_edit);
90 EXPECT_EQ(AutocompleteProvider::TYPE_KEYWORD,
91 result.match_at(3).provider->type());
93 string16 description =
94 ASCIIToUTF16("Description with style: <match>, [dim], (url till end)");
95 EXPECT_EQ(description, result.match_at(1).contents);
96 ASSERT_EQ(6u, result.match_at(1).contents_class.size());
99 result.match_at(1).contents_class[0].offset);
100 EXPECT_EQ(ACMatchClassification::NONE,
101 result.match_at(1).contents_class[0].style);
103 EXPECT_EQ(description.find('<'),
104 result.match_at(1).contents_class[1].offset);
105 EXPECT_EQ(ACMatchClassification::MATCH,
106 result.match_at(1).contents_class[1].style);
108 EXPECT_EQ(description.find('>') + 1u,
109 result.match_at(1).contents_class[2].offset);
110 EXPECT_EQ(ACMatchClassification::NONE,
111 result.match_at(1).contents_class[2].style);
113 EXPECT_EQ(description.find('['),
114 result.match_at(1).contents_class[3].offset);
115 EXPECT_EQ(ACMatchClassification::DIM,
116 result.match_at(1).contents_class[3].style);
118 EXPECT_EQ(description.find(']') + 1u,
119 result.match_at(1).contents_class[4].offset);
120 EXPECT_EQ(ACMatchClassification::NONE,
121 result.match_at(1).contents_class[4].style);
123 EXPECT_EQ(description.find('('),
124 result.match_at(1).contents_class[5].offset);
125 EXPECT_EQ(ACMatchClassification::URL,
126 result.match_at(1).contents_class[5].style);
128 AutocompleteMatch match = result.match_at(4);
129 EXPECT_EQ(AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, match.type);
130 EXPECT_EQ(AutocompleteProvider::TYPE_SEARCH,
131 result.match_at(4).provider->type());
132 EXPECT_FALSE(match.deletable);
135 // Flaky, see http://crbug.com/167158
138 LocationBar* location_bar = GetLocationBar(browser());
139 ResultCatcher catcher;
140 OmniboxView* omnibox_view = location_bar->GetLocationEntry();
141 omnibox_view->OnBeforePossibleChange();
142 omnibox_view->SetUserText(ASCIIToUTF16("keyword command"));
143 omnibox_view->OnAfterPossibleChange();
144 location_bar->AcceptInput();
145 // This checks that the keyword provider (via javascript)
146 // gets told to navigate to the string "command".
147 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
152 IN_PROC_BROWSER_TEST_F(OmniboxApiTest, OnInputEntered) {
153 ASSERT_TRUE(RunExtensionTest("omnibox")) << message_;
154 ui_test_utils::WaitForTemplateURLServiceToLoad(
155 TemplateURLServiceFactory::GetForProfile(browser()->profile()));
157 LocationBar* location_bar = GetLocationBar(browser());
158 OmniboxView* omnibox_view = location_bar->GetLocationEntry();
159 ResultCatcher catcher;
160 AutocompleteController* autocomplete_controller =
161 GetAutocompleteController(browser());
162 omnibox_view->OnBeforePossibleChange();
163 omnibox_view->SetUserText(ASCIIToUTF16("keyword command"));
164 omnibox_view->OnAfterPossibleChange();
166 autocomplete_controller->Start(
167 AutocompleteInput(ASCIIToUTF16("keyword command"), string16::npos,
168 string16(), GURL(), AutocompleteInput::NEW_TAB_PAGE,
169 true, false, true, AutocompleteInput::ALL_MATCHES));
170 location_bar->GetLocationEntry()->model()->AcceptInput(
172 false); // Not for drop operation.
173 WaitForAutocompleteDone(autocomplete_controller);
174 EXPECT_TRUE(autocomplete_controller->done());
175 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
177 omnibox_view->OnBeforePossibleChange();
178 omnibox_view->SetUserText(ASCIIToUTF16("keyword newtab"));
179 omnibox_view->OnAfterPossibleChange();
180 WaitForAutocompleteDone(autocomplete_controller);
181 EXPECT_TRUE(autocomplete_controller->done());
183 autocomplete_controller->Start(
184 AutocompleteInput(ASCIIToUTF16("keyword newtab"), string16::npos,
185 string16(), GURL(), AutocompleteInput::NEW_TAB_PAGE,
186 true, false, true, AutocompleteInput::ALL_MATCHES));
187 location_bar->GetLocationEntry()->model()->AcceptInput(
189 false); // Not for drop operation.
190 WaitForAutocompleteDone(autocomplete_controller);
191 EXPECT_TRUE(autocomplete_controller->done());
192 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
195 // Tests that we get suggestions from and send input to the incognito context
196 // of an incognito split mode extension.
197 // http://crbug.com/100927
198 // Test is flaky: http://crbug.com/101219
199 IN_PROC_BROWSER_TEST_F(OmniboxApiTest, DISABLED_IncognitoSplitMode) {
200 ResultCatcher catcher_incognito;
201 catcher_incognito.RestrictToProfile(
202 browser()->profile()->GetOffTheRecordProfile());
204 ASSERT_TRUE(RunExtensionTestIncognito("omnibox")) << message_;
206 // Open an incognito window and wait for the incognito extension process to
208 Browser* incognito_browser = CreateIncognitoBrowser();
209 ASSERT_TRUE(catcher_incognito.GetNextResult()) << catcher_incognito.message();
211 // The results depend on the TemplateURLService being loaded. Make sure it is
212 // loaded so that the autocomplete results are consistent.
213 ui_test_utils::WaitForTemplateURLServiceToLoad(
214 TemplateURLServiceFactory::GetForProfile(browser()->profile()));
216 LocationBar* location_bar = GetLocationBar(incognito_browser);
217 AutocompleteController* autocomplete_controller =
218 GetAutocompleteController(incognito_browser);
220 // Test that we get the incognito-specific suggestions.
222 autocomplete_controller->Start(
223 AutocompleteInput(ASCIIToUTF16("keyword suggestio"), string16::npos,
224 string16(), GURL(), AutocompleteInput::NEW_TAB_PAGE,
225 true, false, true, AutocompleteInput::ALL_MATCHES));
226 WaitForAutocompleteDone(autocomplete_controller);
227 EXPECT_TRUE(autocomplete_controller->done());
229 // First result should be to invoke the keyword with what we typed, 2-4
230 // should be to invoke with suggestions from the extension, and the last
231 // should be to search for what we typed.
232 const AutocompleteResult& result = autocomplete_controller->result();
233 ASSERT_EQ(5U, result.size()) << AutocompleteResultAsString(result);
234 ASSERT_FALSE(result.match_at(0).keyword.empty());
235 EXPECT_EQ(ASCIIToUTF16("keyword suggestion3 incognito"),
236 result.match_at(3).fill_into_edit);
239 // Test that our input is sent to the incognito context. The test will do a
240 // text comparison and succeed only if "command incognito" is sent to the
241 // incognito context.
243 ResultCatcher catcher;
244 autocomplete_controller->Start(
245 AutocompleteInput(ASCIIToUTF16("keyword command incognito"),
246 string16::npos, string16(), GURL(),
247 AutocompleteInput::NEW_TAB_PAGE, true, false, true,
248 AutocompleteInput::ALL_MATCHES));
249 location_bar->AcceptInput();
250 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();