// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/command_line.h" #include "base/stringprintf.h" #include "base/utf_string_conversions.h" #include "chrome/browser/autocomplete/autocomplete_edit.h" #include "chrome/browser/autocomplete/autocomplete_edit_view.h" #include "chrome/browser/content_settings/host_content_settings_map.h" #include "chrome/browser/instant/instant_controller.h" #include "chrome/browser/instant/instant_loader.h" #include "chrome/browser/instant/instant_loader_manager.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/search_engines/template_url.h" #include "chrome/browser/search_engines/template_url_model.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/omnibox/location_bar.h" #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" #include "chrome/common/url_constants.h" #include "chrome/test/in_process_browser_test.h" #include "chrome/test/ui_test_utils.h" #include "content/browser/renderer_host/render_view_host.h" #include "content/browser/renderer_host/render_widget_host_view.h" #include "content/browser/tab_contents/tab_contents.h" #define EXPECT_STR_EQ(ascii, utf16) \ EXPECT_EQ(ASCIIToWide(ascii), UTF16ToWide(utf16)) class InstantTest : public InProcessBrowserTest { public: InstantTest() : location_bar_(NULL), preview_(NULL) { set_show_window(true); EnableDOMAutomation(); } void EnableInstant() { InstantController::Enable(browser()->profile()); } void SetupInstantProvider(const std::string& page) { TemplateURLModel* model = browser()->profile()->GetTemplateURLModel(); ASSERT_TRUE(model); if (!model->loaded()) { model->Load(); ui_test_utils::WaitForNotification( NotificationType::TEMPLATE_URL_MODEL_LOADED); } ASSERT_TRUE(model->loaded()); // TemplateURLModel takes ownership of this. TemplateURL* template_url = new TemplateURL(); std::string url = StringPrintf( "http://%s:%d/files/instant/%s?q={searchTerms}", test_server()->host_port_pair().host().c_str(), test_server()->host_port_pair().port(), page.c_str()); template_url->SetURL(url, 0, 0); template_url->SetInstantURL(url, 0, 0); template_url->set_keyword(ASCIIToUTF16("foo")); template_url->set_short_name(ASCIIToUTF16("foo")); model->Add(template_url); model->SetDefaultSearchProvider(template_url); } void FindLocationBar() { if (location_bar_) return; location_bar_ = browser()->window()->GetLocationBar(); ASSERT_TRUE(location_bar_); } TabContentsWrapper* GetPendingPreviewContents() { return browser()->instant()->GetPendingPreviewContents(); } // Type a character to get instant to trigger. void SetupLocationBar() { FindLocationBar(); // "a" triggers the "about:" provider. "b" begins the "bing.com" keyword. // "c" might someday trigger a "chrome:" provider. location_bar_->location_entry()->SetUserText(ASCIIToUTF16("d")); } // Waits for preview to be shown. void WaitForPreviewToNavigate(bool use_current) { InstantController* instant = browser()->instant(); ASSERT_TRUE(instant); TabContentsWrapper* tab = use_current ? instant->GetPreviewContents() : GetPendingPreviewContents(); ASSERT_TRUE(tab); preview_ = tab->tab_contents(); ASSERT_TRUE(preview_); ui_test_utils::WaitForNavigation(&preview_->controller()); } // Wait for instant to load and ensure it is in the state we expect. void SetupPreview() { // Wait for the preview to navigate. WaitForPreviewToNavigate(true); ASSERT_TRUE(browser()->instant()->IsShowingInstant()); ASSERT_FALSE(browser()->instant()->is_displayable()); ASSERT_TRUE(browser()->instant()->is_active()); // When the page loads, the initial searchBox values are set and only a // resize will have been sent. ASSERT_EQ("true 0 0 0 1 d false d false 1 1", GetSearchStateAsString(preview_, false)); } void SetLocationBarText(const std::string& text) { ASSERT_NO_FATAL_FAILURE(FindLocationBar()); location_bar_->location_entry()->SetUserText(UTF8ToUTF16(text)); ui_test_utils::WaitForNotification( NotificationType::INSTANT_CONTROLLER_SHOWN); } const string16& GetSuggestion() const { return browser()->instant()->loader_manager_-> current_loader()->complete_suggested_text_; } void SendKey(ui::KeyboardCode key) { ASSERT_TRUE(ui_test_utils::SendKeyPressSync( browser(), key, false, false, false, false)); } void SetSuggestionsJavascriptArgument(TabContents* tab_contents, const std::string& argument) { std::string script = StringPrintf( "window.setSuggestionsArgument = %s;", argument.c_str()); ASSERT_TRUE(ui_test_utils::ExecuteJavaScript( tab_contents->render_view_host(), std::wstring(), UTF8ToWide(script))); } bool GetStringFromJavascript(TabContents* tab_contents, const std::string& function, std::string* result) { std::string script = StringPrintf( "window.domAutomationController.send(%s)", function.c_str()); return ui_test_utils::ExecuteJavaScriptAndExtractString( tab_contents->render_view_host(), std::wstring(), UTF8ToWide(script), result); } bool GetIntFromJavascript(TabContents* tab_contents, const std::string& function, int* result) { std::string script = StringPrintf( "window.domAutomationController.send(%s)", function.c_str()); return ui_test_utils::ExecuteJavaScriptAndExtractInt( tab_contents->render_view_host(), std::wstring(), UTF8ToWide(script), result); } bool GetBoolFromJavascript(TabContents* tab_contents, const std::string& function, bool* result) { std::string script = StringPrintf( "window.domAutomationController.send(%s)", function.c_str()); return ui_test_utils::ExecuteJavaScriptAndExtractBool( tab_contents->render_view_host(), std::wstring(), UTF8ToWide(script), result); } // Returns the state of the search box as a string. This consists of the // following: // window.chrome.sv // window.onsubmitcalls // window.oncancelcalls // window.onchangecalls // window.onresizecalls // window.beforeLoadSearchBox.value // window.beforeLoadSearchBox.verbatim // window.chrome.searchBox.value // window.chrome.searchBox.verbatim // window.chrome.searchBox.selectionStart // window.chrome.searchBox.selectionEnd // If determining any of the values fails, the value is 'fail'. // // If |use_last| is true, then the last searchBox values are used instead of // the current. Set |use_last| to true when testing OnSubmit/OnCancel. std::string GetSearchStateAsString(TabContents* tab_contents, bool use_last) { bool sv = false; int onsubmitcalls = 0; int oncancelcalls = 0; int onchangecalls = 0; int onresizecalls = 0; int selection_start = 0; int selection_end = 0; std::string before_load_value; bool before_load_verbatim = false; std::string value; bool verbatim = false; if (!GetBoolFromJavascript(tab_contents, "window.chrome.sv", &sv) || !GetIntFromJavascript(tab_contents, "window.onsubmitcalls", &onsubmitcalls) || !GetIntFromJavascript(tab_contents, "window.oncancelcalls", &oncancelcalls) || !GetIntFromJavascript(tab_contents, "window.onchangecalls", &onchangecalls) || !GetIntFromJavascript(tab_contents, "window.onresizecalls", &onresizecalls) || !GetStringFromJavascript( tab_contents, "window.beforeLoadSearchBox.value", &before_load_value) || !GetBoolFromJavascript( tab_contents, "window.beforeLoadSearchBox.verbatim", &before_load_verbatim)) { return "fail"; } if (use_last && (!GetStringFromJavascript(tab_contents, "window.lastSearchBox.value", &value) || !GetBoolFromJavascript(tab_contents, "window.lastSearchBox.verbatim", &verbatim) || !GetIntFromJavascript(tab_contents, "window.lastSearchBox.selectionStart", &selection_start) || !GetIntFromJavascript(tab_contents, "window.lastSearchBox.selectionEnd", &selection_end))) { return "fail"; } if (!use_last && (!GetStringFromJavascript(tab_contents, "window.searchBox.value", &value) || !GetBoolFromJavascript(tab_contents, "window.searchBox.verbatim", &verbatim) || !GetIntFromJavascript(tab_contents, "window.searchBox.selectionStart", &selection_start) || !GetIntFromJavascript(tab_contents, "window.searchBox.selectionEnd", &selection_end))) { return "fail"; } return StringPrintf("%s %d %d %d %d %s %s %s %s %d %d", sv ? "true" : "false", onsubmitcalls, oncancelcalls, onchangecalls, onresizecalls, before_load_value.c_str(), before_load_verbatim ? "true" : "false", value.c_str(), verbatim ? "true" : "false", selection_start, selection_end); } void CheckStringValueFromJavascript( const std::string& expected, const std::string& function, TabContents* tab_contents) { std::string result; ASSERT_TRUE(GetStringFromJavascript(tab_contents, function, &result)); ASSERT_EQ(expected, result); } void CheckBoolValueFromJavascript( bool expected, const std::string& function, TabContents* tab_contents) { bool result; ASSERT_TRUE(GetBoolFromJavascript(tab_contents, function, &result)); ASSERT_EQ(expected, result); } void CheckIntValueFromJavascript( int expected, const std::string& function, TabContents* tab_contents) { int result; ASSERT_TRUE(GetIntFromJavascript(tab_contents, function, &result)); ASSERT_EQ(expected, result); } // Sends a message to the renderer and waits for the response to come back to // the browser. void WaitForMessageToBeProcessedByRenderer(TabContentsWrapper* tab) { ASSERT_NO_FATAL_FAILURE( CheckBoolValueFromJavascript(true, "true", tab->tab_contents())); } protected: LocationBar* location_bar_; TabContents* preview_; }; // TODO(tonyg): Add the following tests: // - Test that the search box API is not populated for pages other than the // default search provider. // - Test resize events. // Verify that the onchange event is dispatched upon typing in the box. IN_PROC_BROWSER_TEST_F(InstantTest, OnChangeEvent) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); ASSERT_NO_FATAL_FAILURE(SetupPreview()); ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def")); ASSERT_EQ(ASCIIToUTF16("defghi"), location_bar_->location_entry()->GetText()); // Make sure the url that will get committed when we press enter matches that // of the default search provider. const TemplateURL* default_turl = browser()->profile()->GetTemplateURLModel()->GetDefaultSearchProvider(); ASSERT_TRUE(default_turl); ASSERT_TRUE(default_turl->url()); EXPECT_EQ(default_turl->url()->ReplaceSearchTerms( *default_turl, ASCIIToUTF16("defghi"), 0, string16()), browser()->instant()->GetCurrentURL().spec()); // Check that the value is reflected and onchange is called. EXPECT_EQ("true 0 0 1 2 d false def false 3 3", GetSearchStateAsString(preview_, true)); } IN_PROC_BROWSER_TEST_F(InstantTest, SetSuggestionsArrayOfStrings) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); ASSERT_NO_FATAL_FAILURE(SetupPreview()); SetSuggestionsJavascriptArgument(preview_, "['defgh', 'unused']"); ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def")); EXPECT_STR_EQ("defgh", GetSuggestion()); } IN_PROC_BROWSER_TEST_F(InstantTest, SetSuggestionsEmptyArray) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); ASSERT_NO_FATAL_FAILURE(SetupPreview()); SetSuggestionsJavascriptArgument(preview_, "[]"); ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def")); EXPECT_STR_EQ("", GetSuggestion()); } IN_PROC_BROWSER_TEST_F(InstantTest, SetSuggestionsValidJson) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); ASSERT_NO_FATAL_FAILURE(SetupPreview()); SetSuggestionsJavascriptArgument( preview_, "{suggestions:[{value:'defghij'},{value:'unused'}]}"); ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def")); EXPECT_STR_EQ("defghij", GetSuggestion()); } IN_PROC_BROWSER_TEST_F(InstantTest, SetSuggestionsInvalidSuggestions) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); ASSERT_NO_FATAL_FAILURE(SetupPreview()); SetSuggestionsJavascriptArgument( preview_, "{suggestions:{value:'defghi'}}"); ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def")); EXPECT_STR_EQ("", GetSuggestion()); } IN_PROC_BROWSER_TEST_F(InstantTest, SetSuggestionsEmptyJson) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); ASSERT_NO_FATAL_FAILURE(SetupPreview()); SetSuggestionsJavascriptArgument(preview_, "{}"); ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def")); EXPECT_STR_EQ("", GetSuggestion()); } IN_PROC_BROWSER_TEST_F(InstantTest, SetSuggestionsEmptySuggestions) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); ASSERT_NO_FATAL_FAILURE(SetupPreview()); SetSuggestionsJavascriptArgument(preview_, "{suggestions:[]}"); ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def")); EXPECT_STR_EQ("", GetSuggestion()); } IN_PROC_BROWSER_TEST_F(InstantTest, SetSuggestionsEmptySuggestion) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); ASSERT_NO_FATAL_FAILURE(SetupPreview()); SetSuggestionsJavascriptArgument(preview_, "{suggestions:[{}]}"); ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def")); EXPECT_STR_EQ("", GetSuggestion()); } // Verify instant preview is shown correctly for a non-search query. IN_PROC_BROWSER_TEST_F(InstantTest, ShowPreviewNonSearch) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); GURL url(test_server()->GetURL("files/instant/empty.html")); ASSERT_NO_FATAL_FAILURE(SetLocationBarText(url.spec())); // The preview should be active and showing. ASSERT_TRUE(browser()->instant()->is_active()); ASSERT_TRUE(browser()->instant()->is_displayable()); ASSERT_TRUE(browser()->instant()->IsCurrent()); ASSERT_TRUE(browser()->instant()->GetPreviewContents()); RenderWidgetHostView* rwhv = browser()->instant()->GetPreviewContents()->tab_contents()-> GetRenderWidgetHostView(); ASSERT_TRUE(rwhv); ASSERT_TRUE(rwhv->IsShowing()); } // Transition from non-search to search and make sure everything is shown // correctly. IN_PROC_BROWSER_TEST_F(InstantTest, NonSearchToSearch) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); GURL url(test_server()->GetURL("files/instant/empty.html")); ASSERT_NO_FATAL_FAILURE(SetLocationBarText(url.spec())); // The preview should be active and showing. ASSERT_TRUE(browser()->instant()->is_active()); ASSERT_TRUE(browser()->instant()->is_displayable()); TabContentsWrapper* initial_tab = browser()->instant()->GetPreviewContents(); ASSERT_TRUE(initial_tab); RenderWidgetHostView* rwhv = initial_tab->tab_contents()->GetRenderWidgetHostView(); ASSERT_TRUE(rwhv); ASSERT_TRUE(rwhv->IsShowing()); // Now type in some search text. ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); location_bar_->location_entry()->SetUserText(ASCIIToUTF16("def")); // Wait for the preview to navigate. ASSERT_NO_FATAL_FAILURE(WaitForPreviewToNavigate(false)); // The controller is still determining if the provider really supports // instant. As a result the tabcontents should not have changed. TabContentsWrapper* current_tab = browser()->instant()->GetPreviewContents(); ASSERT_EQ(current_tab, initial_tab); // The preview should still be showing. rwhv = current_tab->tab_contents()->GetRenderWidgetHostView(); ASSERT_TRUE(rwhv); ASSERT_TRUE(rwhv->IsShowing()); // Use MightSupportInstant as the controller is still determining if the // page supports instant and hasn't actually commited yet. EXPECT_TRUE(browser()->instant()->MightSupportInstant()); // Instant should still be active. EXPECT_TRUE(browser()->instant()->is_active()); EXPECT_TRUE(browser()->instant()->is_displayable()); // Because we're waiting on the page, instant isn't current. ASSERT_FALSE(browser()->instant()->IsCurrent()); // Bounce a message to the renderer so that we know the instant has gotten a // response back from the renderer as to whether the page supports instant. ASSERT_NO_FATAL_FAILURE( WaitForMessageToBeProcessedByRenderer(GetPendingPreviewContents())); // Reset the user text so that the page is told the text changed. We should be // able to nuke this once 66104 is fixed. location_bar_->location_entry()->SetUserText(ASCIIToUTF16("defg")); // Wait for the renderer to process it. ASSERT_NO_FATAL_FAILURE( WaitForMessageToBeProcessedByRenderer(GetPendingPreviewContents())); // We should have gotten a response back from the renderer that resulted in // committing. ASSERT_FALSE(GetPendingPreviewContents()); ASSERT_TRUE(browser()->instant()->is_active()); ASSERT_TRUE(browser()->instant()->is_displayable()); TabContentsWrapper* new_tab = browser()->instant()->GetPreviewContents(); ASSERT_TRUE(new_tab); ASSERT_NE(new_tab, initial_tab); RenderWidgetHostView* new_rwhv = new_tab->tab_contents()->GetRenderWidgetHostView(); ASSERT_TRUE(new_rwhv); ASSERT_NE(new_rwhv, rwhv); ASSERT_TRUE(new_rwhv->IsShowing()); } // Makes sure that if the server doesn't support the instant API we don't show // anything. #if defined(OS_MACOSX) || defined(OS_LINUX) // Showing as flaky on Mac and Linux. // http://crbug.com/70860 #define MAYBE_SearchServerDoesntSupportInstant \ DISABLED_SearchServerDoesntSupportInstant #else #define MAYBE_SearchServerDoesntSupportInstant \ SearchServerDoesntSupportInstant #endif IN_PROC_BROWSER_TEST_F(InstantTest, MAYBE_SearchServerDoesntSupportInstant) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("empty.html")); ASSERT_NO_FATAL_FAILURE(FindLocationBar()); location_bar_->location_entry()->SetUserText(ASCIIToUTF16("d")); ASSERT_TRUE(browser()->instant()); // Because we typed in a search string we should think we're showing instant // results. EXPECT_TRUE(browser()->instant()->IsShowingInstant()); // But because we're waiting to determine if the page really supports instant // we shouldn't be showing the preview. EXPECT_FALSE(browser()->instant()->is_displayable()); // But instant should still be active. EXPECT_TRUE(browser()->instant()->is_active()); // When the response comes back that the page doesn't support instant the tab // should be closed. ui_test_utils::WaitForNotification(NotificationType::TAB_CLOSED); EXPECT_FALSE(browser()->instant()->IsShowingInstant()); EXPECT_FALSE(browser()->instant()->is_displayable()); EXPECT_TRUE(browser()->instant()->is_active()); EXPECT_FALSE(browser()->instant()->IsCurrent()); } // Verifies transitioning from loading a non-search string to a search string // with the provider not supporting instant works (meaning we don't display // anything). #if defined(OS_MACOSX) || defined(OS_LINUX) // Showing as flaky on Mac and Linux/ChromeOS // http://crbug.com/70810 #define MAYBE_NonSearchToSearchDoesntSupportInstant \ DISABLED_NonSearchToSearchDoesntSupportInstant #else #define MAYBE_NonSearchToSearchDoesntSupportInstant \ NonSearchToSearchDoesntSupportInstant #endif IN_PROC_BROWSER_TEST_F(InstantTest, MAYBE_NonSearchToSearchDoesntSupportInstant) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("empty.html")); GURL url(test_server()->GetURL("files/instant/empty.html")); ASSERT_NO_FATAL_FAILURE(SetLocationBarText(url.spec())); // The preview should be active and showing. ASSERT_TRUE(browser()->instant()->is_displayable()); ASSERT_TRUE(browser()->instant()->is_active()); TabContentsWrapper* initial_tab = browser()->instant()->GetPreviewContents(); ASSERT_TRUE(initial_tab); RenderWidgetHostView* rwhv = initial_tab->tab_contents()->GetRenderWidgetHostView(); ASSERT_TRUE(rwhv); ASSERT_TRUE(rwhv->IsShowing()); // Now type in some search text. location_bar_->location_entry()->SetUserText(ASCIIToUTF16("d")); // Instant should still be live. ASSERT_TRUE(browser()->instant()->is_displayable()); ASSERT_TRUE(browser()->instant()->is_active()); // Because we typed in a search string we should think we're showing instant // results. EXPECT_TRUE(browser()->instant()->MightSupportInstant()); // Instant should not be current (it's still loading). EXPECT_FALSE(browser()->instant()->IsCurrent()); // When the response comes back that the page doesn't support instant the tab // should be closed. ui_test_utils::WaitForNotification(NotificationType::TAB_CLOSED); EXPECT_FALSE(browser()->instant()->IsShowingInstant()); EXPECT_FALSE(browser()->instant()->is_displayable()); // But because the omnibox is still open, instant should be active. ASSERT_TRUE(browser()->instant()->is_active()); } // Verifies the page was told a non-zero height. IN_PROC_BROWSER_TEST_F(InstantTest, ValidHeight) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); ASSERT_NO_FATAL_FAILURE(SetupPreview()); ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def")); int height; // searchBox height is not yet set during initial load. ASSERT_TRUE(GetIntFromJavascript(preview_, "window.beforeLoadSearchBox.height", &height)); EXPECT_EQ(0, height); // searchBox height is available by the time the page loads. ASSERT_TRUE(GetIntFromJavascript(preview_, "window.chrome.searchBox.height", &height)); EXPECT_GT(height, 0); } // Verifies that if the server returns a 403 we don't show the preview and // query the host again. IN_PROC_BROWSER_TEST_F(InstantTest, HideOn403) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); GURL url(test_server()->GetURL("files/instant/403.html")); ASSERT_NO_FATAL_FAILURE(FindLocationBar()); location_bar_->location_entry()->SetUserText(UTF8ToUTF16(url.spec())); // The preview shouldn't be showing, but it should be loading. ASSERT_TRUE(browser()->instant()->GetPreviewContents()); ASSERT_TRUE(browser()->instant()->is_active()); ASSERT_FALSE(browser()->instant()->is_displayable()); // When instant sees the 403, it should close the tab. ui_test_utils::WaitForNotification(NotificationType::TAB_CLOSED); ASSERT_FALSE(browser()->instant()->GetPreviewContents()); ASSERT_TRUE(browser()->instant()->is_active()); ASSERT_FALSE(browser()->instant()->is_displayable()); // Try loading another url on the server. Instant shouldn't create a new tab // as the server returned 403. GURL url2(test_server()->GetURL("files/instant/empty.html")); location_bar_->location_entry()->SetUserText(UTF8ToUTF16(url2.spec())); ASSERT_FALSE(browser()->instant()->GetPreviewContents()); ASSERT_TRUE(browser()->instant()->is_active()); ASSERT_FALSE(browser()->instant()->is_displayable()); } // Verify that the onsubmit event is dispatched upon pressing enter. IN_PROC_BROWSER_TEST_F(InstantTest, OnSubmitEvent) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); ASSERT_NO_FATAL_FAILURE(SetupPreview()); ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def")); ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_RETURN)); // Check that the preview contents have been committed. ASSERT_FALSE(browser()->instant()->GetPreviewContents()); ASSERT_FALSE(browser()->instant()->is_active()); TabContents* contents = browser()->GetSelectedTabContents(); ASSERT_TRUE(contents); // Check that the value is reflected and onsubmit is called. EXPECT_EQ("true 1 0 1 2 d false defghi true 3 3", GetSearchStateAsString(preview_, true)); // Make sure the searchbox values were reset. EXPECT_EQ("true 1 0 1 2 d false false 0 0", GetSearchStateAsString(preview_, false)); } // Verify that the oncancel event is dispatched upon losing focus. IN_PROC_BROWSER_TEST_F(InstantTest, OnCancelEvent) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); ASSERT_NO_FATAL_FAILURE(SetupPreview()); ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def")); ASSERT_NO_FATAL_FAILURE(ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER)); // Check that the preview contents have been committed. ASSERT_FALSE(browser()->instant()->GetPreviewContents()); ASSERT_FALSE(browser()->instant()->is_active()); TabContents* contents = browser()->GetSelectedTabContents(); ASSERT_TRUE(contents); // Check that the value is reflected and oncancel is called. EXPECT_EQ("true 0 1 1 2 d false def false 3 3", GetSearchStateAsString(preview_, true)); // Make sure the searchbox values were reset. EXPECT_EQ("true 0 1 1 2 d false false 0 0", GetSearchStateAsString(preview_, false)); } // Make sure about:crash is shown. IN_PROC_BROWSER_TEST_F(InstantTest, ShowAboutCrash) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); ASSERT_NO_FATAL_FAILURE(SetLocationBarText(chrome::kAboutCrashURL)); // If we get here it means the preview was shown. If we time out, it means the // preview was never shown. } IN_PROC_BROWSER_TEST_F(InstantTest, InstantCompleteNever) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); ASSERT_NO_FATAL_FAILURE(SetupPreview()); SetSuggestionsJavascriptArgument( preview_, "{suggestions:[{value:'defghij'}],complete_behavior:'never'}"); ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def")); EXPECT_STR_EQ("defghij", GetSuggestion()); AutocompleteEditModel* edit_model = location_bar_->location_entry()->model(); EXPECT_EQ(INSTANT_COMPLETE_NEVER, edit_model->instant_complete_behavior()); ASSERT_EQ(ASCIIToUTF16("def"), location_bar_->location_entry()->GetText()); } IN_PROC_BROWSER_TEST_F(InstantTest, InstantCompleteDelayed) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); ASSERT_NO_FATAL_FAILURE(SetupPreview()); SetSuggestionsJavascriptArgument( preview_, "{suggestions:[{value:'defghij'}],complete_behavior:'delayed'}"); ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def")); EXPECT_STR_EQ("defghij", GetSuggestion()); AutocompleteEditModel* edit_model = location_bar_->location_entry()->model(); EXPECT_EQ(INSTANT_COMPLETE_DELAYED, edit_model->instant_complete_behavior()); ASSERT_EQ(ASCIIToUTF16("def"), location_bar_->location_entry()->GetText()); } // Make sure the renderer doesn't crash if javascript is blocked. IN_PROC_BROWSER_TEST_F(InstantTest, DontCrashOnBlockedJS) { browser()->profile()->GetHostContentSettingsMap()->SetDefaultContentSetting( CONTENT_SETTINGS_TYPE_JAVASCRIPT, CONTENT_SETTING_BLOCK); ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); // Wait for notification that the instant API has been determined. ui_test_utils::WaitForNotification( NotificationType::INSTANT_SUPPORT_DETERMINED); // As long as we get the notification we're good (the renderer didn't crash). } IN_PROC_BROWSER_TEST_F(InstantTest, DownloadOnEnter) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); // Make sure the browser window is the front most window. ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_NO_FATAL_FAILURE(FindLocationBar()); GURL url(test_server()->GetURL("files/instant/empty.html")); location_bar_->location_entry()->SetUserText(UTF8ToUTF16(url.spec())); printf("0\n"); ASSERT_NO_FATAL_FAILURE(WaitForPreviewToNavigate(true)); url = test_server()->GetURL("files/instant/download.zip"); location_bar_->location_entry()->SetUserText(UTF8ToUTF16(url.spec())); // Wait for the load to fail (because instant disables downloads). printf("1\n"); ui_test_utils::WaitForNotification( NotificationType::FAIL_PROVISIONAL_LOAD_WITH_ERROR); printf("2\n"); ui_test_utils::WindowedNotificationObserver download_observer( NotificationType::DOWNLOAD_INITIATED, NotificationService::AllSources()); ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_RETURN)); printf("3\n"); download_observer.Wait(); printf("4\n"); // And we should end up at about:blank. TabContents* contents = browser()->GetSelectedTabContents(); ASSERT_TRUE(contents); EXPECT_EQ("about:blank", contents->controller().GetLastCommittedEntry()->url().spec()); if (contents->controller().pending_entry()) { // If there is a pending entry, the url should correspond to the download. EXPECT_EQ(url.spec(), contents->controller().pending_entry()->url().spec()); } } // Makes sure window.chrome.searchbox doesn't persist when a new page is loaded. IN_PROC_BROWSER_TEST_F(InstantTest, DontPersistSearchbox) { ASSERT_TRUE(test_server()->Start()); EnableInstant(); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); ASSERT_NO_FATAL_FAILURE(SetupPreview()); ASSERT_NO_FATAL_FAILURE(SetLocationBarText("def")); ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_RETURN)); // Check that the preview contents have been committed. ASSERT_FALSE(browser()->instant()->GetPreviewContents()); ASSERT_FALSE(browser()->instant()->is_active()); TabContents* contents = browser()->GetSelectedTabContents(); ASSERT_TRUE(contents); // Navigate to a new URL. This should reset the searchbox values. ui_test_utils::NavigateToURL( browser(), GURL(test_server()->GetURL("files/instant/empty.html"))); bool result; ASSERT_TRUE(GetBoolFromJavascript( browser()->GetSelectedTabContents(), "window.chrome.searchBox.value.length == 0", &result)); EXPECT_TRUE(result); }