- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / omnibox / omnibox_api_browsertest.cc
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.
4
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"
19
20 IN_PROC_BROWSER_TEST_F(OmniboxApiTest, Basic) {
21   ASSERT_TRUE(RunExtensionTest("omnibox")) << message_;
22
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()));
27
28   AutocompleteController* autocomplete_controller =
29       GetAutocompleteController(browser());
30
31   // Test that our extension's keyword is suggested to us when we partially type
32   // it.
33   {
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());
40
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);
49
50     match = result.match_at(1);
51     EXPECT_EQ(ASCIIToUTF16("keyword"), match.keyword);
52   }
53
54   // Test that our extension can send suggestions back to us.
55   {
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());
62
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);
69
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());
92
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());
97
98     EXPECT_EQ(0u,
99               result.match_at(1).contents_class[0].offset);
100     EXPECT_EQ(ACMatchClassification::NONE,
101               result.match_at(1).contents_class[0].style);
102
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);
107
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);
112
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);
117
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);
122
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);
127
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);
133   }
134
135   // Flaky, see http://crbug.com/167158
136   /*
137   {
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();
148   }
149   */
150 }
151
152 IN_PROC_BROWSER_TEST_F(OmniboxApiTest, OnInputEntered) {
153   ASSERT_TRUE(RunExtensionTest("omnibox")) << message_;
154   ui_test_utils::WaitForTemplateURLServiceToLoad(
155       TemplateURLServiceFactory::GetForProfile(browser()->profile()));
156
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();
165
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(
171       CURRENT_TAB,
172       false); // Not for drop operation.
173   WaitForAutocompleteDone(autocomplete_controller);
174   EXPECT_TRUE(autocomplete_controller->done());
175   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
176
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());
182
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(
188       NEW_FOREGROUND_TAB,
189       false); // Not for drop operation.
190   WaitForAutocompleteDone(autocomplete_controller);
191   EXPECT_TRUE(autocomplete_controller->done());
192   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
193 }
194
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());
203
204   ASSERT_TRUE(RunExtensionTestIncognito("omnibox")) << message_;
205
206   // Open an incognito window and wait for the incognito extension process to
207   // respond.
208   Browser* incognito_browser = CreateIncognitoBrowser();
209   ASSERT_TRUE(catcher_incognito.GetNextResult()) << catcher_incognito.message();
210
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()));
215
216   LocationBar* location_bar = GetLocationBar(incognito_browser);
217   AutocompleteController* autocomplete_controller =
218       GetAutocompleteController(incognito_browser);
219
220   // Test that we get the incognito-specific suggestions.
221   {
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());
228
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);
237   }
238
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.
242   {
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();
251   }
252 }