1 // Copyright (c) 2011 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/command_line.h"
6 #include "base/stringprintf.h"
7 #include "base/utf_string_conversions.h"
8 #include "chrome/browser/autocomplete/autocomplete_edit.h"
9 #include "chrome/browser/autocomplete/autocomplete_edit_view.h"
10 #include "chrome/browser/content_settings/host_content_settings_map.h"
11 #include "chrome/browser/instant/instant_controller.h"
12 #include "chrome/browser/instant/instant_loader.h"
13 #include "chrome/browser/instant/instant_loader_manager.h"
14 #include "chrome/browser/profiles/profile.h"
15 #include "chrome/browser/search_engines/template_url.h"
16 #include "chrome/browser/search_engines/template_url_model.h"
17 #include "chrome/browser/ui/browser.h"
18 #include "chrome/browser/ui/browser_list.h"
19 #include "chrome/browser/ui/browser_window.h"
20 #include "chrome/browser/ui/omnibox/location_bar.h"
21 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
22 #include "chrome/common/url_constants.h"
23 #include "chrome/test/in_process_browser_test.h"
24 #include "chrome/test/ui_test_utils.h"
25 #include "content/browser/renderer_host/render_view_host.h"
26 #include "content/browser/renderer_host/render_widget_host_view.h"
27 #include "content/browser/tab_contents/tab_contents.h"
28
29 #define EXPECT_STR_EQ(ascii, utf16) \
30 EXPECT_EQ(ASCIIToWide(ascii), UTF16ToWide(utf16))
31
32 class InstantTest : public InProcessBrowserTest {
33 public:
InstantTest()34 InstantTest()
35 : location_bar_(NULL),
36 preview_(NULL) {
37 set_show_window(true);
38 EnableDOMAutomation();
39 }
40
EnableInstant()41 void EnableInstant() {
42 InstantController::Enable(browser()->profile());
43 }
44
SetupInstantProvider(const std::string & page)45 void SetupInstantProvider(const std::string& page) {
46 TemplateURLModel* model = browser()->profile()->GetTemplateURLModel();
47 ASSERT_TRUE(model);
48
49 if (!model->loaded()) {
50 model->Load();
51 ui_test_utils::WaitForNotification(
52 NotificationType::TEMPLATE_URL_MODEL_LOADED);
53 }
54
55 ASSERT_TRUE(model->loaded());
56
57 // TemplateURLModel takes ownership of this.
58 TemplateURL* template_url = new TemplateURL();
59
60 std::string url = StringPrintf(
61 "http://%s:%d/files/instant/%s?q={searchTerms}",
62 test_server()->host_port_pair().host().c_str(),
63 test_server()->host_port_pair().port(),
64 page.c_str());
65 template_url->SetURL(url, 0, 0);
66 template_url->SetInstantURL(url, 0, 0);
67 template_url->set_keyword(ASCIIToUTF16("foo"));
68 template_url->set_short_name(ASCIIToUTF16("foo"));
69
70 model->Add(template_url);
71 model->SetDefaultSearchProvider(template_url);
72 }
73
FindLocationBar()74 void FindLocationBar() {
75 if (location_bar_)
76 return;
77 location_bar_ = browser()->window()->GetLocationBar();
78 ASSERT_TRUE(location_bar_);
79 }
80
GetPendingPreviewContents()81 TabContentsWrapper* GetPendingPreviewContents() {
82 return browser()->instant()->GetPendingPreviewContents();
83 }
84
85 // Type a character to get instant to trigger.
SetupLocationBar()86 void SetupLocationBar() {
87 FindLocationBar();
88 // "a" triggers the "about:" provider. "b" begins the "bing.com" keyword.
89 // "c" might someday trigger a "chrome:" provider.
90 location_bar_->location_entry()->SetUserText(ASCIIToUTF16("d"));
91 }
92
93 // Waits for preview to be shown.
WaitForPreviewToNavigate(bool use_current)94 void WaitForPreviewToNavigate(bool use_current) {
95 InstantController* instant = browser()->instant();
96 ASSERT_TRUE(instant);
97 TabContentsWrapper* tab = use_current ?
98 instant->GetPreviewContents() : GetPendingPreviewContents();
99 ASSERT_TRUE(tab);
100 preview_ = tab->tab_contents();
101 ASSERT_TRUE(preview_);
102 ui_test_utils::WaitForNavigation(&preview_->controller());
103 }
104
105 // Wait for instant to load and ensure it is in the state we expect.
SetupPreview()106 void SetupPreview() {
107 // Wait for the preview to navigate.
108 WaitForPreviewToNavigate(true);
109
110 ASSERT_TRUE(browser()->instant()->IsShowingInstant());
111 ASSERT_FALSE(browser()->instant()->is_displayable());
112 ASSERT_TRUE(browser()->instant()->is_active());
113
114 // When the page loads, the initial searchBox values are set and only a
115 // resize will have been sent.
116 ASSERT_EQ("true 0 0 0 1 d false d false 1 1",
117 GetSearchStateAsString(preview_, false));
118 }
119
SetLocationBarText(const std::string & text)120 void SetLocationBarText(const std::string& text) {
121 ASSERT_NO_FATAL_FAILURE(FindLocationBar());
122 location_bar_->location_entry()->SetUserText(UTF8ToUTF16(text));
123 ui_test_utils::WaitForNotification(
124 NotificationType::INSTANT_CONTROLLER_SHOWN);
125 }
126
GetSuggestion() const127 const string16& GetSuggestion() const {
128 return browser()->instant()->loader_manager_->
129 current_loader()->complete_suggested_text_;
130 }
131
SendKey(ui::KeyboardCode key)132 void SendKey(ui::KeyboardCode key) {
133 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
134 browser(), key, false, false, false, false));
135 }
136
SetSuggestionsJavascriptArgument(TabContents * tab_contents,const std::string & argument)137 void SetSuggestionsJavascriptArgument(TabContents* tab_contents,
138 const std::string& argument) {
139 std::string script = StringPrintf(
140 "window.setSuggestionsArgument = %s;", argument.c_str());
141 ASSERT_TRUE(ui_test_utils::ExecuteJavaScript(
142 tab_contents->render_view_host(),
143 std::wstring(),
144 UTF8ToWide(script)));
145 }
146
GetStringFromJavascript(TabContents * tab_contents,const std::string & function,std::string * result)147 bool GetStringFromJavascript(TabContents* tab_contents,
148 const std::string& function,
149 std::string* result) {
150 std::string script = StringPrintf(
151 "window.domAutomationController.send(%s)", function.c_str());
152 return ui_test_utils::ExecuteJavaScriptAndExtractString(
153 tab_contents->render_view_host(),
154 std::wstring(), UTF8ToWide(script), result);
155 }
156
GetIntFromJavascript(TabContents * tab_contents,const std::string & function,int * result)157 bool GetIntFromJavascript(TabContents* tab_contents,
158 const std::string& function,
159 int* result) {
160 std::string script = StringPrintf(
161 "window.domAutomationController.send(%s)", function.c_str());
162 return ui_test_utils::ExecuteJavaScriptAndExtractInt(
163 tab_contents->render_view_host(),
164 std::wstring(), UTF8ToWide(script), result);
165 }
166
GetBoolFromJavascript(TabContents * tab_contents,const std::string & function,bool * result)167 bool GetBoolFromJavascript(TabContents* tab_contents,
168 const std::string& function,
169 bool* result) {
170 std::string script = StringPrintf(
171 "window.domAutomationController.send(%s)", function.c_str());
172 return ui_test_utils::ExecuteJavaScriptAndExtractBool(
173 tab_contents->render_view_host(),
174 std::wstring(), UTF8ToWide(script), result);
175 }
176
177 // Returns the state of the search box as a string. This consists of the
178 // following:
179 // window.chrome.sv
180 // window.onsubmitcalls
181 // window.oncancelcalls
182 // window.onchangecalls
183 // window.onresizecalls
184 // window.beforeLoadSearchBox.value
185 // window.beforeLoadSearchBox.verbatim
186 // window.chrome.searchBox.value
187 // window.chrome.searchBox.verbatim
188 // window.chrome.searchBox.selectionStart
189 // window.chrome.searchBox.selectionEnd
190 // If determining any of the values fails, the value is 'fail'.
191 //
192 // If |use_last| is true, then the last searchBox values are used instead of
193 // the current. Set |use_last| to true when testing OnSubmit/OnCancel.
GetSearchStateAsString(TabContents * tab_contents,bool use_last)194 std::string GetSearchStateAsString(TabContents* tab_contents,
195 bool use_last) {
196 bool sv = false;
197 int onsubmitcalls = 0;
198 int oncancelcalls = 0;
199 int onchangecalls = 0;
200 int onresizecalls = 0;
201 int selection_start = 0;
202 int selection_end = 0;
203 std::string before_load_value;
204 bool before_load_verbatim = false;
205 std::string value;
206 bool verbatim = false;
207
208 if (!GetBoolFromJavascript(tab_contents, "window.chrome.sv", &sv) ||
209 !GetIntFromJavascript(tab_contents, "window.onsubmitcalls",
210 &onsubmitcalls) ||
211 !GetIntFromJavascript(tab_contents, "window.oncancelcalls",
212 &oncancelcalls) ||
213 !GetIntFromJavascript(tab_contents, "window.onchangecalls",
214 &onchangecalls) ||
215 !GetIntFromJavascript(tab_contents, "window.onresizecalls",
216 &onresizecalls) ||
217 !GetStringFromJavascript(
218 tab_contents, "window.beforeLoadSearchBox.value",
219 &before_load_value) ||
220 !GetBoolFromJavascript(
221 tab_contents, "window.beforeLoadSearchBox.verbatim",
222 &before_load_verbatim)) {
223 return "fail";
224 }
225
226 if (use_last &&
227 (!GetStringFromJavascript(tab_contents, "window.lastSearchBox.value",
228 &value) ||
229 !GetBoolFromJavascript(tab_contents, "window.lastSearchBox.verbatim",
230 &verbatim) ||
231 !GetIntFromJavascript(tab_contents,
232 "window.lastSearchBox.selectionStart",
233 &selection_start) ||
234 !GetIntFromJavascript(tab_contents,
235 "window.lastSearchBox.selectionEnd",
236 &selection_end))) {
237 return "fail";
238 }
239
240 if (!use_last &&
241 (!GetStringFromJavascript(tab_contents, "window.searchBox.value",
242 &value) ||
243 !GetBoolFromJavascript(tab_contents, "window.searchBox.verbatim",
244 &verbatim) ||
245 !GetIntFromJavascript(tab_contents,
246 "window.searchBox.selectionStart",
247 &selection_start) ||
248 !GetIntFromJavascript(tab_contents,
249 "window.searchBox.selectionEnd",
250 &selection_end))) {
251 return "fail";
252 }
253
254 return StringPrintf("%s %d %d %d %d %s %s %s %s %d %d",
255 sv ? "true" : "false",
256 onsubmitcalls,
257 oncancelcalls,
258 onchangecalls,
259 onresizecalls,
260 before_load_value.c_str(),
261 before_load_verbatim ? "true" : "false",
262 value.c_str(),
263 verbatim ? "true" : "false",
264 selection_start,
265 selection_end);
266 }
267
CheckStringValueFromJavascript(const std::string & expected,const std::string & function,TabContents * tab_contents)268 void CheckStringValueFromJavascript(
269 const std::string& expected,
270 const std::string& function,
271 TabContents* tab_contents) {
272 std::string result;
273 ASSERT_TRUE(GetStringFromJavascript(tab_contents, function, &result));
274 ASSERT_EQ(expected, result);
275 }
276
CheckBoolValueFromJavascript(bool expected,const std::string & function,TabContents * tab_contents)277 void CheckBoolValueFromJavascript(
278 bool expected,
279 const std::string& function,
280 TabContents* tab_contents) {
281 bool result;
282 ASSERT_TRUE(GetBoolFromJavascript(tab_contents, function, &result));
283 ASSERT_EQ(expected, result);
284 }
285
CheckIntValueFromJavascript(int expected,const std::string & function,TabContents * tab_contents)286 void CheckIntValueFromJavascript(
287 int expected,
288 const std::string& function,
289 TabContents* tab_contents) {
290 int result;
291 ASSERT_TRUE(GetIntFromJavascript(tab_contents, function, &result));
292 ASSERT_EQ(expected, result);
293 }
294
295 // Sends a message to the renderer and waits for the response to come back to
296 // the browser.
WaitForMessageToBeProcessedByRenderer(TabContentsWrapper * tab)297 void WaitForMessageToBeProcessedByRenderer(TabContentsWrapper* tab) {
298 ASSERT_NO_FATAL_FAILURE(
299 CheckBoolValueFromJavascript(true, "true", tab->tab_contents()));
300 }
301
302 protected:
303 LocationBar* location_bar_;
304 TabContents* preview_;
305 };
306
307 // TODO(tonyg): Add the following tests:
308 // - Test that the search box API is not populated for pages other than the
309 // default search provider.
310 // - Test resize events.
311
312 // Verify that the onchange event is dispatched upon typing in the box.
IN_PROC_BROWSER_TEST_F(InstantTest,OnChangeEvent)313 IN_PROC_BROWSER_TEST_F(InstantTest, OnChangeEvent) {
314 ASSERT_TRUE(test_server()->Start());
315 EnableInstant();
316 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html"));
317 ASSERT_NO_FATAL_FAILURE(SetupLocationBar());
318 ASSERT_NO_FATAL_FAILURE(SetupPreview());
319
320 ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def"));
321
322 ASSERT_EQ(ASCIIToUTF16("defghi"), location_bar_->location_entry()->GetText());
323
324 // Make sure the url that will get committed when we press enter matches that
325 // of the default search provider.
326 const TemplateURL* default_turl =
327 browser()->profile()->GetTemplateURLModel()->GetDefaultSearchProvider();
328 ASSERT_TRUE(default_turl);
329 ASSERT_TRUE(default_turl->url());
330 EXPECT_EQ(default_turl->url()->ReplaceSearchTerms(
331 *default_turl, ASCIIToUTF16("defghi"), 0, string16()),
332 browser()->instant()->GetCurrentURL().spec());
333
334 // Check that the value is reflected and onchange is called.
335 EXPECT_EQ("true 0 0 1 2 d false def false 3 3",
336 GetSearchStateAsString(preview_, true));
337 }
338
IN_PROC_BROWSER_TEST_F(InstantTest,SetSuggestionsArrayOfStrings)339 IN_PROC_BROWSER_TEST_F(InstantTest, SetSuggestionsArrayOfStrings) {
340 ASSERT_TRUE(test_server()->Start());
341 EnableInstant();
342 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html"));
343 ASSERT_NO_FATAL_FAILURE(SetupLocationBar());
344 ASSERT_NO_FATAL_FAILURE(SetupPreview());
345
346 SetSuggestionsJavascriptArgument(preview_, "['defgh', 'unused']");
347 ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def"));
348 EXPECT_STR_EQ("defgh", GetSuggestion());
349 }
350
IN_PROC_BROWSER_TEST_F(InstantTest,SetSuggestionsEmptyArray)351 IN_PROC_BROWSER_TEST_F(InstantTest, SetSuggestionsEmptyArray) {
352 ASSERT_TRUE(test_server()->Start());
353 EnableInstant();
354 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html"));
355 ASSERT_NO_FATAL_FAILURE(SetupLocationBar());
356 ASSERT_NO_FATAL_FAILURE(SetupPreview());
357
358 SetSuggestionsJavascriptArgument(preview_, "[]");
359 ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def"));
360 EXPECT_STR_EQ("", GetSuggestion());
361 }
362
IN_PROC_BROWSER_TEST_F(InstantTest,SetSuggestionsValidJson)363 IN_PROC_BROWSER_TEST_F(InstantTest, SetSuggestionsValidJson) {
364 ASSERT_TRUE(test_server()->Start());
365 EnableInstant();
366 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html"));
367 ASSERT_NO_FATAL_FAILURE(SetupLocationBar());
368 ASSERT_NO_FATAL_FAILURE(SetupPreview());
369
370 SetSuggestionsJavascriptArgument(
371 preview_,
372 "{suggestions:[{value:'defghij'},{value:'unused'}]}");
373 ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def"));
374 EXPECT_STR_EQ("defghij", GetSuggestion());
375 }
376
IN_PROC_BROWSER_TEST_F(InstantTest,SetSuggestionsInvalidSuggestions)377 IN_PROC_BROWSER_TEST_F(InstantTest, SetSuggestionsInvalidSuggestions) {
378 ASSERT_TRUE(test_server()->Start());
379 EnableInstant();
380 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html"));
381 ASSERT_NO_FATAL_FAILURE(SetupLocationBar());
382 ASSERT_NO_FATAL_FAILURE(SetupPreview());
383
384 SetSuggestionsJavascriptArgument(
385 preview_,
386 "{suggestions:{value:'defghi'}}");
387 ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def"));
388 EXPECT_STR_EQ("", GetSuggestion());
389 }
390
IN_PROC_BROWSER_TEST_F(InstantTest,SetSuggestionsEmptyJson)391 IN_PROC_BROWSER_TEST_F(InstantTest, SetSuggestionsEmptyJson) {
392 ASSERT_TRUE(test_server()->Start());
393 EnableInstant();
394 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html"));
395 ASSERT_NO_FATAL_FAILURE(SetupLocationBar());
396 ASSERT_NO_FATAL_FAILURE(SetupPreview());
397
398 SetSuggestionsJavascriptArgument(preview_, "{}");
399 ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def"));
400 EXPECT_STR_EQ("", GetSuggestion());
401 }
402
IN_PROC_BROWSER_TEST_F(InstantTest,SetSuggestionsEmptySuggestions)403 IN_PROC_BROWSER_TEST_F(InstantTest, SetSuggestionsEmptySuggestions) {
404 ASSERT_TRUE(test_server()->Start());
405 EnableInstant();
406 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html"));
407 ASSERT_NO_FATAL_FAILURE(SetupLocationBar());
408 ASSERT_NO_FATAL_FAILURE(SetupPreview());
409
410 SetSuggestionsJavascriptArgument(preview_, "{suggestions:[]}");
411 ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def"));
412 EXPECT_STR_EQ("", GetSuggestion());
413 }
414
IN_PROC_BROWSER_TEST_F(InstantTest,SetSuggestionsEmptySuggestion)415 IN_PROC_BROWSER_TEST_F(InstantTest, SetSuggestionsEmptySuggestion) {
416 ASSERT_TRUE(test_server()->Start());
417 EnableInstant();
418 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html"));
419 ASSERT_NO_FATAL_FAILURE(SetupLocationBar());
420 ASSERT_NO_FATAL_FAILURE(SetupPreview());
421
422 SetSuggestionsJavascriptArgument(preview_, "{suggestions:[{}]}");
423 ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def"));
424 EXPECT_STR_EQ("", GetSuggestion());
425 }
426
427 // Verify instant preview is shown correctly for a non-search query.
IN_PROC_BROWSER_TEST_F(InstantTest,ShowPreviewNonSearch)428 IN_PROC_BROWSER_TEST_F(InstantTest, ShowPreviewNonSearch) {
429 ASSERT_TRUE(test_server()->Start());
430 EnableInstant();
431 GURL url(test_server()->GetURL("files/instant/empty.html"));
432 ASSERT_NO_FATAL_FAILURE(SetLocationBarText(url.spec()));
433 // The preview should be active and showing.
434 ASSERT_TRUE(browser()->instant()->is_active());
435 ASSERT_TRUE(browser()->instant()->is_displayable());
436 ASSERT_TRUE(browser()->instant()->IsCurrent());
437 ASSERT_TRUE(browser()->instant()->GetPreviewContents());
438 RenderWidgetHostView* rwhv =
439 browser()->instant()->GetPreviewContents()->tab_contents()->
440 GetRenderWidgetHostView();
441 ASSERT_TRUE(rwhv);
442 ASSERT_TRUE(rwhv->IsShowing());
443 }
444
445 // Transition from non-search to search and make sure everything is shown
446 // correctly.
IN_PROC_BROWSER_TEST_F(InstantTest,NonSearchToSearch)447 IN_PROC_BROWSER_TEST_F(InstantTest, NonSearchToSearch) {
448 ASSERT_TRUE(test_server()->Start());
449 EnableInstant();
450 GURL url(test_server()->GetURL("files/instant/empty.html"));
451 ASSERT_NO_FATAL_FAILURE(SetLocationBarText(url.spec()));
452 // The preview should be active and showing.
453 ASSERT_TRUE(browser()->instant()->is_active());
454 ASSERT_TRUE(browser()->instant()->is_displayable());
455 TabContentsWrapper* initial_tab = browser()->instant()->GetPreviewContents();
456 ASSERT_TRUE(initial_tab);
457 RenderWidgetHostView* rwhv =
458 initial_tab->tab_contents()->GetRenderWidgetHostView();
459 ASSERT_TRUE(rwhv);
460 ASSERT_TRUE(rwhv->IsShowing());
461
462 // Now type in some search text.
463 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html"));
464 location_bar_->location_entry()->SetUserText(ASCIIToUTF16("def"));
465
466 // Wait for the preview to navigate.
467 ASSERT_NO_FATAL_FAILURE(WaitForPreviewToNavigate(false));
468
469 // The controller is still determining if the provider really supports
470 // instant. As a result the tabcontents should not have changed.
471 TabContentsWrapper* current_tab = browser()->instant()->GetPreviewContents();
472 ASSERT_EQ(current_tab, initial_tab);
473 // The preview should still be showing.
474 rwhv = current_tab->tab_contents()->GetRenderWidgetHostView();
475 ASSERT_TRUE(rwhv);
476 ASSERT_TRUE(rwhv->IsShowing());
477
478 // Use MightSupportInstant as the controller is still determining if the
479 // page supports instant and hasn't actually commited yet.
480 EXPECT_TRUE(browser()->instant()->MightSupportInstant());
481
482 // Instant should still be active.
483 EXPECT_TRUE(browser()->instant()->is_active());
484 EXPECT_TRUE(browser()->instant()->is_displayable());
485
486 // Because we're waiting on the page, instant isn't current.
487 ASSERT_FALSE(browser()->instant()->IsCurrent());
488
489 // Bounce a message to the renderer so that we know the instant has gotten a
490 // response back from the renderer as to whether the page supports instant.
491 ASSERT_NO_FATAL_FAILURE(
492 WaitForMessageToBeProcessedByRenderer(GetPendingPreviewContents()));
493
494 // Reset the user text so that the page is told the text changed. We should be
495 // able to nuke this once 66104 is fixed.
496 location_bar_->location_entry()->SetUserText(ASCIIToUTF16("defg"));
497
498 // Wait for the renderer to process it.
499 ASSERT_NO_FATAL_FAILURE(
500 WaitForMessageToBeProcessedByRenderer(GetPendingPreviewContents()));
501
502 // We should have gotten a response back from the renderer that resulted in
503 // committing.
504 ASSERT_FALSE(GetPendingPreviewContents());
505 ASSERT_TRUE(browser()->instant()->is_active());
506 ASSERT_TRUE(browser()->instant()->is_displayable());
507 TabContentsWrapper* new_tab = browser()->instant()->GetPreviewContents();
508 ASSERT_TRUE(new_tab);
509 ASSERT_NE(new_tab, initial_tab);
510 RenderWidgetHostView* new_rwhv =
511 new_tab->tab_contents()->GetRenderWidgetHostView();
512 ASSERT_TRUE(new_rwhv);
513 ASSERT_NE(new_rwhv, rwhv);
514 ASSERT_TRUE(new_rwhv->IsShowing());
515 }
516
517 // Makes sure that if the server doesn't support the instant API we don't show
518 // anything.
519 #if defined(OS_MACOSX) || defined(OS_LINUX)
520 // Showing as flaky on Mac and Linux.
521 // http://crbug.com/70860
522 #define MAYBE_SearchServerDoesntSupportInstant \
523 DISABLED_SearchServerDoesntSupportInstant
524 #else
525 #define MAYBE_SearchServerDoesntSupportInstant \
526 SearchServerDoesntSupportInstant
527 #endif
IN_PROC_BROWSER_TEST_F(InstantTest,MAYBE_SearchServerDoesntSupportInstant)528 IN_PROC_BROWSER_TEST_F(InstantTest, MAYBE_SearchServerDoesntSupportInstant) {
529 ASSERT_TRUE(test_server()->Start());
530 EnableInstant();
531 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("empty.html"));
532 ASSERT_NO_FATAL_FAILURE(FindLocationBar());
533 location_bar_->location_entry()->SetUserText(ASCIIToUTF16("d"));
534 ASSERT_TRUE(browser()->instant());
535 // Because we typed in a search string we should think we're showing instant
536 // results.
537 EXPECT_TRUE(browser()->instant()->IsShowingInstant());
538 // But because we're waiting to determine if the page really supports instant
539 // we shouldn't be showing the preview.
540 EXPECT_FALSE(browser()->instant()->is_displayable());
541 // But instant should still be active.
542 EXPECT_TRUE(browser()->instant()->is_active());
543
544 // When the response comes back that the page doesn't support instant the tab
545 // should be closed.
546 ui_test_utils::WaitForNotification(NotificationType::TAB_CLOSED);
547 EXPECT_FALSE(browser()->instant()->IsShowingInstant());
548 EXPECT_FALSE(browser()->instant()->is_displayable());
549 EXPECT_TRUE(browser()->instant()->is_active());
550 EXPECT_FALSE(browser()->instant()->IsCurrent());
551 }
552
553 // Verifies transitioning from loading a non-search string to a search string
554 // with the provider not supporting instant works (meaning we don't display
555 // anything).
556 #if defined(OS_MACOSX) || defined(OS_LINUX)
557 // Showing as flaky on Mac and Linux/ChromeOS
558 // http://crbug.com/70810
559 #define MAYBE_NonSearchToSearchDoesntSupportInstant \
560 DISABLED_NonSearchToSearchDoesntSupportInstant
561 #else
562 #define MAYBE_NonSearchToSearchDoesntSupportInstant \
563 NonSearchToSearchDoesntSupportInstant
564 #endif
IN_PROC_BROWSER_TEST_F(InstantTest,MAYBE_NonSearchToSearchDoesntSupportInstant)565 IN_PROC_BROWSER_TEST_F(InstantTest,
566 MAYBE_NonSearchToSearchDoesntSupportInstant) {
567 ASSERT_TRUE(test_server()->Start());
568 EnableInstant();
569 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("empty.html"));
570 GURL url(test_server()->GetURL("files/instant/empty.html"));
571 ASSERT_NO_FATAL_FAILURE(SetLocationBarText(url.spec()));
572 // The preview should be active and showing.
573 ASSERT_TRUE(browser()->instant()->is_displayable());
574 ASSERT_TRUE(browser()->instant()->is_active());
575 TabContentsWrapper* initial_tab = browser()->instant()->GetPreviewContents();
576 ASSERT_TRUE(initial_tab);
577 RenderWidgetHostView* rwhv =
578 initial_tab->tab_contents()->GetRenderWidgetHostView();
579 ASSERT_TRUE(rwhv);
580 ASSERT_TRUE(rwhv->IsShowing());
581
582 // Now type in some search text.
583 location_bar_->location_entry()->SetUserText(ASCIIToUTF16("d"));
584
585 // Instant should still be live.
586 ASSERT_TRUE(browser()->instant()->is_displayable());
587 ASSERT_TRUE(browser()->instant()->is_active());
588 // Because we typed in a search string we should think we're showing instant
589 // results.
590 EXPECT_TRUE(browser()->instant()->MightSupportInstant());
591 // Instant should not be current (it's still loading).
592 EXPECT_FALSE(browser()->instant()->IsCurrent());
593
594 // When the response comes back that the page doesn't support instant the tab
595 // should be closed.
596 ui_test_utils::WaitForNotification(NotificationType::TAB_CLOSED);
597 EXPECT_FALSE(browser()->instant()->IsShowingInstant());
598 EXPECT_FALSE(browser()->instant()->is_displayable());
599 // But because the omnibox is still open, instant should be active.
600 ASSERT_TRUE(browser()->instant()->is_active());
601 }
602
603 // Verifies the page was told a non-zero height.
IN_PROC_BROWSER_TEST_F(InstantTest,ValidHeight)604 IN_PROC_BROWSER_TEST_F(InstantTest, ValidHeight) {
605 ASSERT_TRUE(test_server()->Start());
606 EnableInstant();
607 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html"));
608 ASSERT_NO_FATAL_FAILURE(SetupLocationBar());
609 ASSERT_NO_FATAL_FAILURE(SetupPreview());
610
611 ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def"));
612
613 int height;
614
615 // searchBox height is not yet set during initial load.
616 ASSERT_TRUE(GetIntFromJavascript(preview_,
617 "window.beforeLoadSearchBox.height",
618 &height));
619 EXPECT_EQ(0, height);
620
621 // searchBox height is available by the time the page loads.
622 ASSERT_TRUE(GetIntFromJavascript(preview_,
623 "window.chrome.searchBox.height",
624 &height));
625 EXPECT_GT(height, 0);
626 }
627
628 // Verifies that if the server returns a 403 we don't show the preview and
629 // query the host again.
IN_PROC_BROWSER_TEST_F(InstantTest,HideOn403)630 IN_PROC_BROWSER_TEST_F(InstantTest, HideOn403) {
631 ASSERT_TRUE(test_server()->Start());
632 EnableInstant();
633 GURL url(test_server()->GetURL("files/instant/403.html"));
634 ASSERT_NO_FATAL_FAILURE(FindLocationBar());
635 location_bar_->location_entry()->SetUserText(UTF8ToUTF16(url.spec()));
636 // The preview shouldn't be showing, but it should be loading.
637 ASSERT_TRUE(browser()->instant()->GetPreviewContents());
638 ASSERT_TRUE(browser()->instant()->is_active());
639 ASSERT_FALSE(browser()->instant()->is_displayable());
640
641 // When instant sees the 403, it should close the tab.
642 ui_test_utils::WaitForNotification(NotificationType::TAB_CLOSED);
643 ASSERT_FALSE(browser()->instant()->GetPreviewContents());
644 ASSERT_TRUE(browser()->instant()->is_active());
645 ASSERT_FALSE(browser()->instant()->is_displayable());
646
647 // Try loading another url on the server. Instant shouldn't create a new tab
648 // as the server returned 403.
649 GURL url2(test_server()->GetURL("files/instant/empty.html"));
650 location_bar_->location_entry()->SetUserText(UTF8ToUTF16(url2.spec()));
651 ASSERT_FALSE(browser()->instant()->GetPreviewContents());
652 ASSERT_TRUE(browser()->instant()->is_active());
653 ASSERT_FALSE(browser()->instant()->is_displayable());
654 }
655
656 // Verify that the onsubmit event is dispatched upon pressing enter.
IN_PROC_BROWSER_TEST_F(InstantTest,OnSubmitEvent)657 IN_PROC_BROWSER_TEST_F(InstantTest, OnSubmitEvent) {
658 ASSERT_TRUE(test_server()->Start());
659 EnableInstant();
660 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html"));
661
662 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
663 ASSERT_NO_FATAL_FAILURE(SetupLocationBar());
664 ASSERT_NO_FATAL_FAILURE(SetupPreview());
665
666 ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def"));
667 ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_RETURN));
668
669 // Check that the preview contents have been committed.
670 ASSERT_FALSE(browser()->instant()->GetPreviewContents());
671 ASSERT_FALSE(browser()->instant()->is_active());
672 TabContents* contents = browser()->GetSelectedTabContents();
673 ASSERT_TRUE(contents);
674
675 // Check that the value is reflected and onsubmit is called.
676 EXPECT_EQ("true 1 0 1 2 d false defghi true 3 3",
677 GetSearchStateAsString(preview_, true));
678
679 // Make sure the searchbox values were reset.
680 EXPECT_EQ("true 1 0 1 2 d false false 0 0",
681 GetSearchStateAsString(preview_, false));
682 }
683
684 // Verify that the oncancel event is dispatched upon losing focus.
IN_PROC_BROWSER_TEST_F(InstantTest,OnCancelEvent)685 IN_PROC_BROWSER_TEST_F(InstantTest, OnCancelEvent) {
686 ASSERT_TRUE(test_server()->Start());
687 EnableInstant();
688 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html"));
689
690 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
691 ASSERT_NO_FATAL_FAILURE(SetupLocationBar());
692 ASSERT_NO_FATAL_FAILURE(SetupPreview());
693
694 ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def"));
695 ASSERT_NO_FATAL_FAILURE(ui_test_utils::ClickOnView(browser(),
696 VIEW_ID_TAB_CONTAINER));
697
698 // Check that the preview contents have been committed.
699 ASSERT_FALSE(browser()->instant()->GetPreviewContents());
700 ASSERT_FALSE(browser()->instant()->is_active());
701 TabContents* contents = browser()->GetSelectedTabContents();
702 ASSERT_TRUE(contents);
703
704 // Check that the value is reflected and oncancel is called.
705 EXPECT_EQ("true 0 1 1 2 d false def false 3 3",
706 GetSearchStateAsString(preview_, true));
707
708 // Make sure the searchbox values were reset.
709 EXPECT_EQ("true 0 1 1 2 d false false 0 0",
710 GetSearchStateAsString(preview_, false));
711 }
712
713 // Make sure about:crash is shown.
IN_PROC_BROWSER_TEST_F(InstantTest,ShowAboutCrash)714 IN_PROC_BROWSER_TEST_F(InstantTest, ShowAboutCrash) {
715 ASSERT_TRUE(test_server()->Start());
716 EnableInstant();
717
718 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
719
720 ASSERT_NO_FATAL_FAILURE(SetLocationBarText(chrome::kAboutCrashURL));
721
722 // If we get here it means the preview was shown. If we time out, it means the
723 // preview was never shown.
724 }
725
IN_PROC_BROWSER_TEST_F(InstantTest,InstantCompleteNever)726 IN_PROC_BROWSER_TEST_F(InstantTest, InstantCompleteNever) {
727 ASSERT_TRUE(test_server()->Start());
728 EnableInstant();
729 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html"));
730 ASSERT_NO_FATAL_FAILURE(SetupLocationBar());
731 ASSERT_NO_FATAL_FAILURE(SetupPreview());
732
733 SetSuggestionsJavascriptArgument(
734 preview_,
735 "{suggestions:[{value:'defghij'}],complete_behavior:'never'}");
736 ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def"));
737 EXPECT_STR_EQ("defghij", GetSuggestion());
738 AutocompleteEditModel* edit_model = location_bar_->location_entry()->model();
739 EXPECT_EQ(INSTANT_COMPLETE_NEVER, edit_model->instant_complete_behavior());
740 ASSERT_EQ(ASCIIToUTF16("def"), location_bar_->location_entry()->GetText());
741 }
742
IN_PROC_BROWSER_TEST_F(InstantTest,InstantCompleteDelayed)743 IN_PROC_BROWSER_TEST_F(InstantTest, InstantCompleteDelayed) {
744 ASSERT_TRUE(test_server()->Start());
745 EnableInstant();
746 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html"));
747 ASSERT_NO_FATAL_FAILURE(SetupLocationBar());
748 ASSERT_NO_FATAL_FAILURE(SetupPreview());
749
750 SetSuggestionsJavascriptArgument(
751 preview_,
752 "{suggestions:[{value:'defghij'}],complete_behavior:'delayed'}");
753 ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def"));
754 EXPECT_STR_EQ("defghij", GetSuggestion());
755 AutocompleteEditModel* edit_model = location_bar_->location_entry()->model();
756 EXPECT_EQ(INSTANT_COMPLETE_DELAYED, edit_model->instant_complete_behavior());
757 ASSERT_EQ(ASCIIToUTF16("def"), location_bar_->location_entry()->GetText());
758 }
759
760 // Make sure the renderer doesn't crash if javascript is blocked.
IN_PROC_BROWSER_TEST_F(InstantTest,DontCrashOnBlockedJS)761 IN_PROC_BROWSER_TEST_F(InstantTest, DontCrashOnBlockedJS) {
762 browser()->profile()->GetHostContentSettingsMap()->SetDefaultContentSetting(
763 CONTENT_SETTINGS_TYPE_JAVASCRIPT, CONTENT_SETTING_BLOCK);
764 ASSERT_TRUE(test_server()->Start());
765 EnableInstant();
766 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html"));
767 ASSERT_NO_FATAL_FAILURE(SetupLocationBar());
768 // Wait for notification that the instant API has been determined.
769 ui_test_utils::WaitForNotification(
770 NotificationType::INSTANT_SUPPORT_DETERMINED);
771 // As long as we get the notification we're good (the renderer didn't crash).
772 }
773
IN_PROC_BROWSER_TEST_F(InstantTest,DownloadOnEnter)774 IN_PROC_BROWSER_TEST_F(InstantTest, DownloadOnEnter) {
775 ASSERT_TRUE(test_server()->Start());
776 EnableInstant();
777 // Make sure the browser window is the front most window.
778 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
779 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html"));
780 ASSERT_NO_FATAL_FAILURE(FindLocationBar());
781 GURL url(test_server()->GetURL("files/instant/empty.html"));
782 location_bar_->location_entry()->SetUserText(UTF8ToUTF16(url.spec()));
783 printf("0\n");
784 ASSERT_NO_FATAL_FAILURE(WaitForPreviewToNavigate(true));
785 url = test_server()->GetURL("files/instant/download.zip");
786 location_bar_->location_entry()->SetUserText(UTF8ToUTF16(url.spec()));
787 // Wait for the load to fail (because instant disables downloads).
788 printf("1\n");
789 ui_test_utils::WaitForNotification(
790 NotificationType::FAIL_PROVISIONAL_LOAD_WITH_ERROR);
791
792 printf("2\n");
793 ui_test_utils::WindowedNotificationObserver download_observer(
794 NotificationType::DOWNLOAD_INITIATED,
795 NotificationService::AllSources());
796 ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_RETURN));
797 printf("3\n");
798 download_observer.Wait();
799 printf("4\n");
800
801 // And we should end up at about:blank.
802 TabContents* contents = browser()->GetSelectedTabContents();
803 ASSERT_TRUE(contents);
804 EXPECT_EQ("about:blank",
805 contents->controller().GetLastCommittedEntry()->url().spec());
806 if (contents->controller().pending_entry()) {
807 // If there is a pending entry, the url should correspond to the download.
808 EXPECT_EQ(url.spec(),
809 contents->controller().pending_entry()->url().spec());
810 }
811 }
812
813 // Makes sure window.chrome.searchbox doesn't persist when a new page is loaded.
IN_PROC_BROWSER_TEST_F(InstantTest,DontPersistSearchbox)814 IN_PROC_BROWSER_TEST_F(InstantTest, DontPersistSearchbox) {
815 ASSERT_TRUE(test_server()->Start());
816 EnableInstant();
817 ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html"));
818
819 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
820 ASSERT_NO_FATAL_FAILURE(SetupLocationBar());
821 ASSERT_NO_FATAL_FAILURE(SetupPreview());
822
823 ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def"));
824 ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_RETURN));
825
826 // Check that the preview contents have been committed.
827 ASSERT_FALSE(browser()->instant()->GetPreviewContents());
828 ASSERT_FALSE(browser()->instant()->is_active());
829
830 TabContents* contents = browser()->GetSelectedTabContents();
831 ASSERT_TRUE(contents);
832
833 // Navigate to a new URL. This should reset the searchbox values.
834 ui_test_utils::NavigateToURL(
835 browser(),
836 GURL(test_server()->GetURL("files/instant/empty.html")));
837 bool result;
838 ASSERT_TRUE(GetBoolFromJavascript(
839 browser()->GetSelectedTabContents(),
840 "window.chrome.searchBox.value.length == 0",
841 &result));
842 EXPECT_TRUE(result);
843 }
844