| // Copyright 2013 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 <stddef.h> |
| |
| #include "base/strings/string_util.h" |
| #include "chrome/browser/chrome_notification_types.h" |
| #include "chrome/browser/search/instant_service.h" |
| #include "chrome/browser/search/instant_service_factory.h" |
| #include "chrome/browser/search/search.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/browser_commands.h" |
| #include "chrome/browser/ui/search/instant_test_utils.h" |
| #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| #include "chrome/common/search/search_types.h" |
| #include "chrome/common/url_constants.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| #include "chrome/test/base/interactive_test_utils.h" |
| #include "chrome/test/base/ui_test_utils.h" |
| #include "components/omnibox/browser/omnibox_edit_model.h" |
| #include "components/omnibox/common/omnibox_focus_state.h" |
| #include "components/search/search.h" |
| #include "content/public/browser/navigation_controller.h" |
| #include "content/public/browser/navigation_entry.h" |
| #include "content/public/browser/notification_service.h" |
| #include "content/public/browser/render_process_host.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/test/browser_test_utils.h" |
| #include "net/base/network_change_notifier.h" |
| #include "net/dns/mock_host_resolver.h" |
| #include "url/gurl.h" |
| |
| // !!! IMPORTANT !!! |
| // These tests are run against a mock GWS using the web-page-replay system. |
| // If you change a test, you MUST re-record the mock GWS session. |
| // See: src/chrome/test/data/search/tools/instant_extended_manual_tests.py |
| // for details. |
| |
| // Instant extended tests that need to be run manually because they need to |
| // talk to the external network. All tests in this file should be marked as |
| // "MANUAL_" unless they are disabled. |
| class InstantExtendedManualTest : public InProcessBrowserTest, |
| public InstantTestBase { |
| public: |
| InstantExtendedManualTest() { |
| host_resolver_proc_ = new net::RuleBasedHostResolverProc(NULL); |
| host_resolver_proc_->AllowDirectLookup("*"); |
| scoped_host_resolver_proc_.reset( |
| new net::ScopedDefaultHostResolverProc(host_resolver_proc_.get())); |
| } |
| |
| ~InstantExtendedManualTest() override { |
| scoped_host_resolver_proc_.reset(); |
| host_resolver_proc_ = NULL; |
| } |
| |
| void SetUpOnMainThread() override { |
| const testing::TestInfo* const test_info = |
| testing::UnitTest::GetInstance()->current_test_info(); |
| ASSERT_TRUE(base::StartsWith(test_info->name(), "MANUAL_", |
| base::CompareCase::SENSITIVE) || |
| base::StartsWith(test_info->name(), "DISABLED_", |
| base::CompareCase::SENSITIVE)); |
| // Make IsOffline() return false so we don't try to use the local NTP. |
| disable_network_change_notifier_.reset( |
| new net::NetworkChangeNotifier::DisableForTest()); |
| } |
| |
| void TearDownOnMainThread() override { |
| disable_network_change_notifier_.reset(); |
| } |
| |
| protected: |
| content::WebContents* active_tab() { |
| return browser()->tab_strip_model()->GetActiveWebContents(); |
| } |
| |
| bool IsGooglePage(content::WebContents* contents) { |
| bool is_google = false; |
| if (!GetBoolFromJS(contents, "!!window.google", &is_google)) |
| return false; |
| return is_google; |
| } |
| |
| private: |
| scoped_refptr<net::RuleBasedHostResolverProc> host_resolver_proc_; |
| std::unique_ptr<net::ScopedDefaultHostResolverProc> |
| scoped_host_resolver_proc_; |
| std::unique_ptr<net::NetworkChangeNotifier::DisableForTest> |
| disable_network_change_notifier_; |
| }; |
| |
| IN_PROC_BROWSER_TEST_F(InstantExtendedManualTest, MANUAL_SearchesFromFakebox) { |
| set_browser(browser()); |
| |
| FocusOmnibox(); |
| // Open a new tab page. |
| content::WindowedNotificationObserver observer( |
| content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
| content::NotificationService::AllSources()); |
| ui_test_utils::NavigateToURLWithDisposition( |
| browser(), GURL(chrome::kChromeUINewTabURL), |
| WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE); |
| observer.Wait(); |
| content::WebContents* active_tab = |
| browser()->tab_strip_model()->GetActiveWebContents(); |
| ASSERT_TRUE(IsGooglePage(active_tab)); |
| |
| // Click in the fakebox and expect invisible focus. |
| ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER); |
| bool fakebox_is_present = false; |
| content::WindowedNotificationObserver focus_observer( |
| chrome::NOTIFICATION_OMNIBOX_FOCUS_CHANGED, |
| content::NotificationService::AllSources()); |
| ASSERT_TRUE(GetBoolFromJS(active_tab, "!!document.querySelector('#fkbx')", |
| &fakebox_is_present)); |
| ASSERT_TRUE(fakebox_is_present); |
| ASSERT_TRUE(content::ExecuteScript( |
| active_tab, "document.querySelector('#fkbx').click()")); |
| focus_observer.Wait(); |
| EXPECT_EQ(OMNIBOX_FOCUS_INVISIBLE, omnibox()->model()->focus_state()); |
| |
| // Type "test". |
| const ui::KeyboardCode query[] = { |
| ui::VKEY_T, ui::VKEY_E, ui::VKEY_S, ui::VKEY_T, |
| ui::VKEY_UNKNOWN |
| }; |
| for (size_t i = 0; query[i] != ui::VKEY_UNKNOWN; i++) { |
| ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), query[i], |
| false, false, false, false)); |
| } |
| |
| // The omnibox should say "test" and have visible focus. |
| EXPECT_EQ("test", GetOmniboxText()); |
| EXPECT_EQ(OMNIBOX_FOCUS_VISIBLE, omnibox()->model()->focus_state()); |
| |
| // Pressing enter should search for [test]. |
| const base::string16& search_title = |
| base::ASCIIToUTF16("test - Google Search"); |
| content::TitleWatcher title_watcher(active_tab, search_title); |
| PressEnterAndWaitForNavigation(); |
| EXPECT_EQ(search_title, title_watcher.WaitAndGetTitle()); |
| } |