summaryrefslogtreecommitdiffstats
path: root/chrome/browser/instant/instant_browsertest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/instant/instant_browsertest.cc')
-rw-r--r--chrome/browser/instant/instant_browsertest.cc248
1 files changed, 248 insertions, 0 deletions
diff --git a/chrome/browser/instant/instant_browsertest.cc b/chrome/browser/instant/instant_browsertest.cc
new file mode 100644
index 0000000..ec4fc69
--- /dev/null
+++ b/chrome/browser/instant/instant_browsertest.cc
@@ -0,0 +1,248 @@
+// 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.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/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();
+ 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)
+#define MAYBE_OnSubmitEvent 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));
+}