// Copyright (c) 2010 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_view.h" #include "chrome/browser/browser_list.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_window.h" #include "chrome/browser/instant/instant_controller.h" #include "chrome/browser/location_bar.h" #include "chrome/browser/profile.h" #include "chrome/browser/renderer_host/render_view_host.h" #include "chrome/browser/search_engines/template_url.h" #include "chrome/browser/search_engines/template_url_model.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/browser/tab_contents_wrapper.h" #include "chrome/browser/ui/browser.h" #include "chrome/common/chrome_switches.h" #include "chrome/test/in_process_browser_test.h" #include "chrome/test/ui_test_utils.h" class InstantTest : public InProcessBrowserTest { public: InstantTest() : location_bar_(NULL), preview_(NULL) { EnableDOMAutomation(); } 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(UTF8ToWide("foo")); template_url->set_short_name(UTF8ToWide("foo")); model->Add(template_url); model->SetDefaultSearchProvider(template_url); } // Type a character to get instant to trigger. void SetupLocationBar() { location_bar_ = browser()->window()->GetLocationBar(); ASSERT_TRUE(location_bar_); location_bar_->location_entry()->SetUserText(L"a"); } // Wait for instant to load and ensure it is in the state we expect. void SetupPreview() { preview_ = browser()->instant()->GetPreviewContents()->tab_contents(); ASSERT_TRUE(preview_); ui_test_utils::WaitForNavigation(&preview_->controller()); // Verify the initial setup of the search box. ASSERT_TRUE(browser()->instant()); EXPECT_TRUE(browser()->instant()->IsShowingInstant()); EXPECT_FALSE(browser()->instant()->is_active()); // When the page loads, the initial searchBox values are set and no events // have been called. EXPECT_NO_FATAL_FAILURE(CheckBoolValueFromJavascript( true, "window.chrome.sv", preview_)); EXPECT_NO_FATAL_FAILURE(CheckIntValueFromJavascript( 0, "window.onsubmitcalls", preview_)); EXPECT_NO_FATAL_FAILURE(CheckIntValueFromJavascript( 0, "window.oncancelcalls", preview_)); EXPECT_NO_FATAL_FAILURE(CheckIntValueFromJavascript( 0, "window.onchangecalls", preview_)); EXPECT_NO_FATAL_FAILURE(CheckIntValueFromJavascript( 0, "window.onresizecalls", preview_)); EXPECT_NO_FATAL_FAILURE(CheckStringValueFromJavascript( "a", "window.chrome.searchBox.value", preview_)); EXPECT_NO_FATAL_FAILURE(CheckBoolValueFromJavascript( false, "window.chrome.searchBox.verbatim", preview_)); } void SetLocationBarText(const std::wstring& text) { ASSERT_TRUE(location_bar_); location_bar_->location_entry()->SetUserText(text); ui_test_utils::WaitForNotification( NotificationType::INSTANT_CONTROLLER_SHOWN); } void SendKey(app::KeyboardCode key) { ASSERT_TRUE(ui_test_utils::SendKeyPressSync( browser(), key, false, false, false, false)); } void CheckStringValueFromJavascript( const std::string& expected, const std::string& function, TabContents* tab_contents) { std::string script = StringPrintf( "window.domAutomationController.send(%s)", function.c_str()); std::string result; ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( tab_contents->render_view_host(), std::wstring(), UTF8ToWide(script), &result)); EXPECT_EQ(expected, result); } void CheckBoolValueFromJavascript( bool expected, const std::string& function, TabContents* tab_contents) { std::string script = StringPrintf( "window.domAutomationController.send(%s)", function.c_str()); bool result; ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( tab_contents->render_view_host(), std::wstring(), UTF8ToWide(script), &result)); EXPECT_EQ(expected, result); } void CheckIntValueFromJavascript( int expected, const std::string& function, TabContents* tab_contents) { std::string script = StringPrintf( "window.domAutomationController.send(%s)", function.c_str()); int result; ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractInt( tab_contents->render_view_host(), std::wstring(), UTF8ToWide(script), &result)); EXPECT_EQ(expected, result); } protected: virtual void SetUpCommandLine(CommandLine* command_line) { command_line->AppendSwitch(switches::kEnablePredictiveInstant); } LocationBar* location_bar_; TabContents* preview_; }; // TODO(tonyg): Add the following tests: // 1. Test that setSuggestions() works. // 2. Test that the search box API is not populated for pages other than the // default search provider. // 3. Test resize events. #if defined(OS_WIN) #define MAYBE_OnChangeEvent OnChangeEvent #else #define MAYBE_OnChangeEvent DISABLED_OnChangeEvent #endif // Verify that the onchange event is dispatched upon typing in the box. IN_PROC_BROWSER_TEST_F(InstantTest, MAYBE_OnChangeEvent) { ASSERT_TRUE(test_server()->Start()); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); ASSERT_NO_FATAL_FAILURE(SetupPreview()); ASSERT_NO_FATAL_FAILURE(SetLocationBarText(L"abc")); // Check that the value is reflected and onchange is called. EXPECT_NO_FATAL_FAILURE(CheckStringValueFromJavascript( "abc", "window.chrome.searchBox.value", preview_)); EXPECT_NO_FATAL_FAILURE(CheckBoolValueFromJavascript( false, "window.chrome.searchBox.verbatim", preview_)); EXPECT_NO_FATAL_FAILURE(CheckIntValueFromJavascript( 1, "window.onchangecalls", preview_)); } #if defined(OS_WIN) // Disabled, http://crbug.com/62940. #define MAYBE_OnSubmitEvent DISABLED_OnSubmitEvent #else #define MAYBE_OnSubmitEvent DISABLED_OnSubmitEvent #endif // Verify that the onsubmit event is dispatched upon pressing enter. IN_PROC_BROWSER_TEST_F(InstantTest, MAYBE_OnSubmitEvent) { ASSERT_TRUE(test_server()->Start()); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); ASSERT_NO_FATAL_FAILURE(SetupPreview()); ASSERT_NO_FATAL_FAILURE(SetLocationBarText(L"abc")); ASSERT_NO_FATAL_FAILURE(SendKey(app::VKEY_RETURN)); // Check that the preview contents have been committed. ASSERT_FALSE(browser()->instant()->GetPreviewContents()); TabContents* contents = browser()->GetSelectedTabContents(); ASSERT_TRUE(contents); // Check that the value is reflected and onsubmit is called. EXPECT_NO_FATAL_FAILURE(CheckBoolValueFromJavascript( true, "window.chrome.sv", contents)); EXPECT_NO_FATAL_FAILURE(CheckStringValueFromJavascript( "abc", "window.chrome.searchBox.value", contents)); EXPECT_NO_FATAL_FAILURE(CheckBoolValueFromJavascript( true, "window.chrome.searchBox.verbatim", contents)); EXPECT_NO_FATAL_FAILURE(CheckIntValueFromJavascript( 1, "window.onsubmitcalls", contents)); } #if defined(OS_WIN) #define MAYBE_OnCancelEvent OnCancelEvent #else #define MAYBE_OnCancelEvent DISABLED_OnCancelEvent #endif // Verify that the oncancel event is dispatched upon losing focus. IN_PROC_BROWSER_TEST_F(InstantTest, MAYBE_OnCancelEvent) { ASSERT_TRUE(test_server()->Start()); ASSERT_NO_FATAL_FAILURE(SetupInstantProvider("search.html")); ASSERT_NO_FATAL_FAILURE(SetupLocationBar()); ASSERT_NO_FATAL_FAILURE(SetupPreview()); ASSERT_NO_FATAL_FAILURE(SetLocationBarText(L"abc")); 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()); TabContents* contents = browser()->GetSelectedTabContents(); ASSERT_TRUE(contents); // Check that the value is reflected and oncancel is called. EXPECT_NO_FATAL_FAILURE(CheckBoolValueFromJavascript( true, "window.chrome.sv", contents)); EXPECT_NO_FATAL_FAILURE(CheckStringValueFromJavascript( "abc", "window.chrome.searchBox.value", contents)); EXPECT_NO_FATAL_FAILURE(CheckBoolValueFromJavascript( false, "window.chrome.searchBox.verbatim", contents)); EXPECT_NO_FATAL_FAILURE(CheckIntValueFromJavascript( 1, "window.oncancelcalls", contents)); }