| Index: chrome/browser/instant/instant_browsertest.cc
|
| diff --git a/chrome/browser/instant/instant_browsertest.cc b/chrome/browser/instant/instant_browsertest.cc
|
| index e04f5c2d96844cad2435abfc138e2f9f99e688eb..d1773f37a48903f85836d949951196fb79db48b5 100644
|
| --- a/chrome/browser/instant/instant_browsertest.cc
|
| +++ b/chrome/browser/instant/instant_browsertest.cc
|
| @@ -2,56 +2,72 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#include "base/prefs/pref_service.h"
|
| #include "chrome/browser/content_settings/host_content_settings_map.h"
|
| #include "chrome/browser/history/history_service_factory.h"
|
| -#include "chrome/browser/instant/instant_overlay.h"
|
| +#include "chrome/browser/instant/instant_controller.h"
|
| +#include "chrome/browser/instant/instant_preloader.h"
|
| #include "chrome/browser/instant/instant_service.h"
|
| -#include "chrome/browser/instant/instant_service_factory.h"
|
| #include "chrome/browser/instant/instant_test_utils.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/search_engines/template_url_service.h"
|
| #include "chrome/browser/search_engines/template_url_service_factory.h"
|
| #include "chrome/browser/task_manager/task_manager.h"
|
| #include "chrome/browser/task_manager/task_manager_browsertest_util.h"
|
| -#include "chrome/browser/ui/browser.h"
|
| #include "chrome/browser/ui/browser_commands.h"
|
| -#include "chrome/browser/ui/host_desktop.h"
|
| +#include "chrome/browser/ui/browser_window.h"
|
| +#include "chrome/browser/ui/omnibox/location_bar.h"
|
| #include "chrome/browser/ui/omnibox/omnibox_view.h"
|
| #include "chrome/browser/ui/tabs/tab_strip_model.h"
|
| +#include "chrome/common/pref_names.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 "content/public/browser/render_process_host.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "content/public/test/browser_test_utils.h"
|
| #include "grit/generated_resources.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
|
|
| -class InstantTest : public InProcessBrowserTest, public InstantTestBase {
|
| +// The order of inheritance matters. The InProcessBrowserTest constructor sets
|
| +// up various things that the InstantTestBase constructor depends on.
|
| +class InstantTest : public InProcessBrowserTest,
|
| + public InstantTestBase {
|
| protected:
|
| virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
|
| ASSERT_TRUE(test_server()->Start());
|
| - GURL instant_url = test_server()->GetURL("files/instant.html?");
|
| - InstantTestBase::Init(instant_url);
|
| + set_instant_url(test_server()->GetURL("files/instant.html"));
|
| + }
|
| +
|
| + virtual void SetUpOnMainThread() OVERRIDE {
|
| + set_browser(browser());
|
| + }
|
| +
|
| + void SetupInstant() {
|
| + TemplateURLData template_data;
|
| + template_data.SetURL("http://does/not/exist?q={searchTerms}");
|
| + template_data.instant_url = instant_url().spec();
|
| + SetupDefaultSearchProvider(template_data);
|
| +
|
| + browser()->profile()->GetPrefs()->SetBoolean(prefs::kInstantEnabled, true);
|
| }
|
|
|
| bool UpdateSearchState(content::WebContents* contents) WARN_UNUSED_RESULT {
|
| - return GetIntFromJS(contents, "onvisibilitycalls", &onvisibilitycalls_) &&
|
| - GetIntFromJS(contents, "onchangecalls", &onchangecalls_) &&
|
| - GetIntFromJS(contents, "onsubmitcalls", &onsubmitcalls_) &&
|
| - GetIntFromJS(contents, "oncancelcalls", &oncancelcalls_) &&
|
| - GetIntFromJS(contents, "onresizecalls", &onresizecalls_) &&
|
| + return GetIntFromJS(contents, "numVisibilityEvents",
|
| + &num_visibility_events_) &&
|
| + GetIntFromJS(contents, "numChangeEvents", &num_change_events_) &&
|
| + GetIntFromJS(contents, "numSubmitEvents", &num_submit_events_) &&
|
| + GetIntFromJS(contents, "numCancelEvents", &num_cancel_events_) &&
|
| + GetIntFromJS(contents, "numResizeEvents", &num_resize_events_) &&
|
| GetStringFromJS(contents, "value", &value_) &&
|
| GetBoolFromJS(contents, "verbatim", &verbatim_) &&
|
| GetIntFromJS(contents, "height", &height_);
|
| }
|
|
|
| - int onvisibilitycalls_;
|
| - int onchangecalls_;
|
| - int onsubmitcalls_;
|
| - int oncancelcalls_;
|
| - int onresizecalls_;
|
| + int num_visibility_events_;
|
| + int num_change_events_;
|
| + int num_submit_events_;
|
| + int num_cancel_events_;
|
| + int num_resize_events_;
|
|
|
| std::string value_;
|
| bool verbatim_;
|
| @@ -60,8 +76,6 @@ class InstantTest : public InProcessBrowserTest, public InstantTestBase {
|
|
|
| // Test that Instant is preloaded when the omnibox is focused.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, OmniboxFocusLoadsInstant) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| -
|
| // Explicitly unfocus the omnibox.
|
| EXPECT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
|
| ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER);
|
| @@ -69,53 +83,48 @@ IN_PROC_BROWSER_TEST_F(InstantTest, OmniboxFocusLoadsInstant) {
|
| EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER));
|
| EXPECT_FALSE(omnibox()->model()->has_focus());
|
|
|
| - // Delete any existing overlay.
|
| - instant()->overlay_.reset();
|
| - EXPECT_FALSE(instant()->GetOverlayContents());
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| + EXPECT_FALSE(service()->preloader()->contents());
|
|
|
| - // Refocus the omnibox. The InstantController should've preloaded Instant.
|
| + // Refocus the omnibox. The InstantPreloader should preload an Instant page.
|
| FocusOmniboxAndWaitForInstantSupport();
|
|
|
| EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER));
|
| EXPECT_TRUE(omnibox()->model()->has_focus());
|
|
|
| - content::WebContents* overlay = instant()->GetOverlayContents();
|
| + content::WebContents* overlay = service()->preloader()->contents();
|
| EXPECT_TRUE(overlay);
|
|
|
| // Check that the page supports Instant, but it isn't showing.
|
| - EXPECT_TRUE(instant()->overlay_->supports_instant());
|
| + EXPECT_TRUE(service()->preloader()->supports_instant());
|
| EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_default());
|
| + EXPECT_FALSE(instant()->GetOverlayContents());
|
|
|
| // Adding a new tab shouldn't delete or recreate the overlay; otherwise,
|
| // what's the point of preloading?
|
| AddBlankTabAndShow(browser());
|
| - EXPECT_EQ(overlay, instant()->GetOverlayContents());
|
| + EXPECT_EQ(overlay, service()->preloader()->contents());
|
|
|
| // Unfocusing and refocusing the omnibox should also preserve the overlay.
|
| ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER);
|
| EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER));
|
| + EXPECT_FALSE(omnibox()->model()->has_focus());
|
|
|
| FocusOmnibox();
|
| EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER));
|
| + EXPECT_TRUE(omnibox()->model()->has_focus());
|
|
|
| - EXPECT_EQ(overlay, instant()->GetOverlayContents());
|
| + EXPECT_EQ(overlay, service()->preloader()->contents());
|
|
|
| // Doing a search should also use the same preloaded page.
|
| SetOmniboxTextAndWaitForOverlayToShow("query");
|
| - EXPECT_TRUE(instant()->model()->mode().is_search_suggestions());
|
| + EXPECT_TRUE(instant()->IsOverlayingSearchResults());
|
| EXPECT_EQ(overlay, instant()->GetOverlayContents());
|
| }
|
|
|
| -// Flakes on Windows and Mac: http://crbug.com/170677
|
| -#if defined(OS_WIN) || defined(OS_MACOSX)
|
| -#define MAYBE_OnChangeEvent DISABLED_OnChangeEvent
|
| -#else
|
| -#define MAYBE_OnChangeEvent OnChangeEvent
|
| -#endif
|
| // Test that the onchange event is dispatched upon typing in the omnibox.
|
| -IN_PROC_BROWSER_TEST_F(InstantTest, MAYBE_OnChangeEvent) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| +IN_PROC_BROWSER_TEST_F(InstantTest, OnChangeEvent) {
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| FocusOmniboxAndWaitForInstantSupport();
|
|
|
| // Use the Instant page as the active tab, so we can exploit its visibility
|
| @@ -124,40 +133,43 @@ IN_PROC_BROWSER_TEST_F(InstantTest, MAYBE_OnChangeEvent) {
|
| content::WebContents* active_tab =
|
| browser()->tab_strip_model()->GetActiveWebContents();
|
|
|
| - int active_tab_onvisibilitycalls = -1;
|
| - EXPECT_TRUE(GetIntFromJS(active_tab, "onvisibilitycalls",
|
| - &active_tab_onvisibilitycalls));
|
| - EXPECT_EQ(0, active_tab_onvisibilitycalls);
|
| + int active_tab_events_before = -1;
|
| + EXPECT_TRUE(GetIntFromJS(active_tab, "numVisibilityEvents",
|
| + &active_tab_events_before));
|
|
|
| - // Typing "query" into the omnibox causes one or more onchange events. The
|
| - // page suggested "query suggestion" is inline autocompleted into the omnibox,
|
| - // causing another onchange event.
|
| + // Work around for http://crbug.com/181210.
|
| + EXPECT_TRUE(active_tab_events_before == 0 ||
|
| + active_tab_events_before == 1) << active_tab_events_before;
|
| +
|
| + // Typing "query" into the omnibox causes the first onchange event. The page
|
| + // suggested "query suggestion" is inline autocompleted into the omnibox,
|
| + // causing the second onchange event.
|
| + FocusOmnibox();
|
| SetOmniboxTextAndWaitForOverlayToShow("query");
|
| EXPECT_EQ(ASCIIToUTF16("query suggestion"), omnibox()->GetText());
|
| - int min_onchangecalls = 2;
|
|
|
| EXPECT_TRUE(UpdateSearchState(instant()->GetOverlayContents()));
|
| - EXPECT_LE(min_onchangecalls, onchangecalls_);
|
| - min_onchangecalls = onchangecalls_;
|
| + EXPECT_EQ(2, num_change_events_);
|
|
|
| - // Change the query and confirm more onchange events are sent.
|
| + // Change the query and confirm that a third onchange event is sent. The
|
| + // hardcoded "query suggestion" doesn't start with "search", so no inline
|
| + // autocompletion or fourth onchange event happens.
|
| SetOmniboxText("search");
|
| - ++min_onchangecalls;
|
|
|
| EXPECT_TRUE(UpdateSearchState(instant()->GetOverlayContents()));
|
| - EXPECT_LE(min_onchangecalls, onchangecalls_);
|
| + EXPECT_EQ(3, num_change_events_);
|
|
|
| // The overlay was shown once, and the active tab was never hidden.
|
| - EXPECT_EQ(1, onvisibilitycalls_);
|
| - active_tab_onvisibilitycalls = -1;
|
| - EXPECT_TRUE(GetIntFromJS(active_tab, "onvisibilitycalls",
|
| - &active_tab_onvisibilitycalls));
|
| - EXPECT_EQ(0, active_tab_onvisibilitycalls);
|
| + EXPECT_EQ(1, num_visibility_events_);
|
| + int active_tab_events_after = -1;
|
| + EXPECT_TRUE(GetIntFromJS(active_tab, "numVisibilityEvents",
|
| + &active_tab_events_after));
|
| + EXPECT_EQ(active_tab_events_before, active_tab_events_after);
|
| }
|
|
|
| // Test that the onsubmit event is dispatched upon pressing Enter.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, OnSubmitEvent) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| FocusOmniboxAndWaitForInstantSupport();
|
| SetOmniboxTextAndWaitForOverlayToShow("search");
|
|
|
| @@ -169,10 +181,11 @@ IN_PROC_BROWSER_TEST_F(InstantTest, OnSubmitEvent) {
|
| EXPECT_TRUE(UpdateSearchState(overlay));
|
| EXPECT_EQ("search", value_);
|
| EXPECT_FALSE(verbatim_);
|
| - EXPECT_EQ(0, onsubmitcalls_);
|
| - EXPECT_EQ(1, onvisibilitycalls_);
|
| + EXPECT_LT(0, height_);
|
| + EXPECT_EQ(0, num_submit_events_);
|
| + EXPECT_EQ(1, num_visibility_events_);
|
|
|
| - // Before the commit, the active tab is the NTP (i.e., not Instant).
|
| + // Before the commit, the active tab is a blank page (i.e., not Instant).
|
| content::WebContents* active_tab =
|
| browser()->tab_strip_model()->GetActiveWebContents();
|
| EXPECT_NE(overlay, active_tab);
|
| @@ -185,17 +198,12 @@ IN_PROC_BROWSER_TEST_F(InstantTest, OnSubmitEvent) {
|
|
|
| // After the commit, Instant should not be showing.
|
| EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_default());
|
| -
|
| - // The old overlay is deleted and a new one is created.
|
| - EXPECT_TRUE(instant()->GetOverlayContents());
|
| - EXPECT_NE(instant()->GetOverlayContents(), overlay);
|
|
|
| // Check that the current active tab is indeed what was once the overlay.
|
| EXPECT_EQ(overlay, browser()->tab_strip_model()->GetActiveWebContents());
|
|
|
| - // We should have two navigation entries, one for the NTP, and one for the
|
| - // Instant search that was committed.
|
| + // We should have two navigation entries, one for the blank page, and one for
|
| + // the Instant search that was committed.
|
| EXPECT_EQ(2, overlay->GetController().GetEntryCount());
|
|
|
| // Check that the omnibox contains the Instant URL we loaded.
|
| @@ -203,21 +211,26 @@ IN_PROC_BROWSER_TEST_F(InstantTest, OnSubmitEvent) {
|
|
|
| // Check that the searchbox API values have been reset.
|
| std::string value;
|
| - EXPECT_TRUE(GetStringFromJS(overlay,
|
| - "chrome.embeddedSearch.searchBox.value", &value));
|
| + bool verbatim;
|
| + int height;
|
| + EXPECT_TRUE(GetStringFromJS(overlay, "chrome.searchBox.value", &value));
|
| + EXPECT_TRUE(GetBoolFromJS(overlay, "chrome.searchBox.verbatim", &verbatim));
|
| + EXPECT_TRUE(GetIntFromJS(overlay, "chrome.searchBox.height", &height));
|
| EXPECT_EQ("", value);
|
| + EXPECT_FALSE(verbatim);
|
| + EXPECT_EQ(0, height);
|
|
|
| // However, the page should've correctly received the committed query.
|
| EXPECT_TRUE(UpdateSearchState(overlay));
|
| EXPECT_EQ("search", value_);
|
| EXPECT_TRUE(verbatim_);
|
| - EXPECT_EQ(1, onsubmitcalls_);
|
| - EXPECT_EQ(1, onvisibilitycalls_);
|
| + EXPECT_EQ(1, num_submit_events_);
|
| + EXPECT_EQ(1, num_visibility_events_);
|
| }
|
|
|
| // Test that the oncancel event is dispatched upon clicking on the overlay.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, OnCancelEvent) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| EXPECT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
|
| FocusOmniboxAndWaitForInstantSupport();
|
| SetOmniboxTextAndWaitForOverlayToShow("search");
|
| @@ -230,10 +243,11 @@ IN_PROC_BROWSER_TEST_F(InstantTest, OnCancelEvent) {
|
| EXPECT_TRUE(UpdateSearchState(overlay));
|
| EXPECT_EQ("search", value_);
|
| EXPECT_FALSE(verbatim_);
|
| - EXPECT_EQ(0, oncancelcalls_);
|
| - EXPECT_EQ(1, onvisibilitycalls_);
|
| + EXPECT_LT(0, height_);
|
| + EXPECT_EQ(0, num_cancel_events_);
|
| + EXPECT_EQ(1, num_visibility_events_);
|
|
|
| - // Before the commit, the active tab is the NTP (i.e., not Instant).
|
| + // Before the commit, the active tab is a blank page (i.e., not Instant).
|
| content::WebContents* active_tab =
|
| browser()->tab_strip_model()->GetActiveWebContents();
|
| EXPECT_NE(overlay, active_tab);
|
| @@ -246,17 +260,12 @@ IN_PROC_BROWSER_TEST_F(InstantTest, OnCancelEvent) {
|
|
|
| // After the commit, Instant should not be showing.
|
| EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_default());
|
| -
|
| - // The old overlay is deleted and a new one is created.
|
| - EXPECT_TRUE(instant()->GetOverlayContents());
|
| - EXPECT_NE(instant()->GetOverlayContents(), overlay);
|
|
|
| // Check that the current active tab is indeed what was once the overlay.
|
| EXPECT_EQ(overlay, browser()->tab_strip_model()->GetActiveWebContents());
|
|
|
| - // We should have two navigation entries, one for the NTP, and one for the
|
| - // Instant search that was committed.
|
| + // We should have two navigation entries, one for the blank page, and one for
|
| + // the Instant search that was committed.
|
| EXPECT_EQ(2, overlay->GetController().GetEntryCount());
|
|
|
| // Check that the omnibox contains the Instant URL we loaded.
|
| @@ -264,45 +273,48 @@ IN_PROC_BROWSER_TEST_F(InstantTest, OnCancelEvent) {
|
|
|
| // Check that the searchbox API values have been reset.
|
| std::string value;
|
| - EXPECT_TRUE(GetStringFromJS(overlay,
|
| - "chrome.embeddedSearch.searchBox.value", &value));
|
| + bool verbatim;
|
| + int height;
|
| + EXPECT_TRUE(GetStringFromJS(overlay, "chrome.searchBox.value", &value));
|
| + EXPECT_TRUE(GetBoolFromJS(overlay, "chrome.searchBox.verbatim", &verbatim));
|
| + EXPECT_TRUE(GetIntFromJS(overlay, "chrome.searchBox.height", &height));
|
| EXPECT_EQ("", value);
|
| + EXPECT_FALSE(verbatim);
|
| + EXPECT_EQ(0, height);
|
|
|
| // However, the page should've correctly received the committed query.
|
| EXPECT_TRUE(UpdateSearchState(overlay));
|
| EXPECT_EQ("search", value_);
|
| EXPECT_TRUE(verbatim_);
|
| - EXPECT_EQ(1, oncancelcalls_);
|
| - EXPECT_EQ(1, onvisibilitycalls_);
|
| + EXPECT_EQ(1, num_cancel_events_);
|
| + EXPECT_EQ(1, num_visibility_events_);
|
| }
|
|
|
| -// Test that the onreisze event is dispatched upon typing in the omnibox.
|
| +// Test that the onresize event is dispatched upon typing in the omnibox.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, OnResizeEvent) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| -
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| FocusOmniboxAndWaitForInstantSupport();
|
| + content::WebContents* overlay = service()->preloader()->contents();
|
|
|
| - EXPECT_TRUE(UpdateSearchState(instant()->GetOverlayContents()));
|
| - EXPECT_EQ(0, onresizecalls_);
|
| + EXPECT_TRUE(UpdateSearchState(overlay));
|
| + EXPECT_EQ(0, num_resize_events_);
|
| EXPECT_EQ(0, height_);
|
|
|
| // Type a query into the omnibox. This should cause an onresize() event, with
|
| // a valid (non-zero) height.
|
| SetOmniboxTextAndWaitForOverlayToShow("search");
|
| + EXPECT_EQ(overlay, instant()->GetOverlayContents());
|
|
|
| - EXPECT_TRUE(UpdateSearchState(instant()->GetOverlayContents()));
|
| - EXPECT_EQ(1, onresizecalls_);
|
| + EXPECT_TRUE(UpdateSearchState(overlay));
|
| + EXPECT_EQ(1, num_resize_events_);
|
| EXPECT_LT(0, height_);
|
| }
|
|
|
| // Test that the INSTANT_COMPLETE_NOW behavior works as expected.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionIsCompletedNow) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| FocusOmniboxAndWaitForInstantSupport();
|
|
|
| - // Tell the JS to request the given behavior.
|
| - EXPECT_TRUE(ExecuteScript("behavior = 'now'"));
|
| -
|
| // Type a query, causing the hardcoded "query suggestion" to be returned.
|
| SetOmniboxTextAndWaitForOverlayToShow("query");
|
|
|
| @@ -318,36 +330,14 @@ IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionIsCompletedNow) {
|
| EXPECT_EQ(ASCIIToUTF16(""), omnibox()->GetInstantSuggestion());
|
| }
|
|
|
| -// Test that the INSTANT_COMPLETE_NEVER behavior works as expected.
|
| -IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionIsCompletedNever) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| - FocusOmniboxAndWaitForInstantSupport();
|
| -
|
| - // Tell the JS to request the given behavior.
|
| - EXPECT_TRUE(ExecuteScript("behavior = 'never'"));
|
| -
|
| - // Type a query, causing the hardcoded "query suggestion" to be returned.
|
| - SetOmniboxTextAndWaitForOverlayToShow("query");
|
| -
|
| - // Get what's showing in the omnibox, and what's highlighted.
|
| - string16 text = omnibox()->GetText();
|
| - size_t start = 0, end = 0;
|
| - omnibox()->GetSelectionBounds(&start, &end);
|
| - if (start > end)
|
| - std::swap(start, end);
|
| -
|
| - EXPECT_EQ(ASCIIToUTF16("query"), text);
|
| - EXPECT_EQ(ASCIIToUTF16(""), text.substr(start, end - start));
|
| - EXPECT_EQ(ASCIIToUTF16(" suggestion"), omnibox()->GetInstantSuggestion());
|
| -}
|
| -
|
| // Test that a valid suggestion is accepted.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionIsValidObject) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| FocusOmniboxAndWaitForInstantSupport();
|
|
|
| // Tell the JS to use the given suggestion.
|
| - EXPECT_TRUE(ExecuteScript("suggestion = [ { value: 'query completion' } ]"));
|
| + EXPECT_TRUE(content::ExecuteScript(service()->preloader()->contents(),
|
| + "suggestion = { suggestions: [ { value: 'query completion' } ] }"));
|
|
|
| // Type a query, causing "query completion" to be returned as the suggestion.
|
| SetOmniboxTextAndWaitForOverlayToShow("query");
|
| @@ -356,11 +346,12 @@ IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionIsValidObject) {
|
|
|
| // Test that an invalid suggestion is rejected.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionIsInvalidObject) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| FocusOmniboxAndWaitForInstantSupport();
|
|
|
| // Tell the JS to use an object in an invalid format.
|
| - EXPECT_TRUE(ExecuteScript("suggestion = { value: 'query completion' }"));
|
| + EXPECT_TRUE(content::ExecuteScript(service()->preloader()->contents(),
|
| + "suggestion = { suggestions: { value: 'query completion' } }"));
|
|
|
| // Type a query, but expect no suggestion.
|
| SetOmniboxTextAndWaitForOverlayToShow("query");
|
| @@ -369,29 +360,34 @@ IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionIsInvalidObject) {
|
|
|
| // Test that various forms of empty suggestions are rejected.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionIsEmpty) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| FocusOmniboxAndWaitForInstantSupport();
|
|
|
| - EXPECT_TRUE(ExecuteScript("suggestion = {}"));
|
| + EXPECT_TRUE(content::ExecuteScript(service()->preloader()->contents(),
|
| + "suggestion = {}"));
|
| SetOmniboxTextAndWaitForOverlayToShow("query");
|
| EXPECT_EQ(ASCIIToUTF16("query"), omnibox()->GetText());
|
|
|
| omnibox()->RevertAll();
|
| + WaitForInstantSupport();
|
|
|
| - EXPECT_TRUE(ExecuteScript("suggestion = []"));
|
| + EXPECT_TRUE(content::ExecuteScript(service()->preloader()->contents(),
|
| + "suggestion = []"));
|
| SetOmniboxTextAndWaitForOverlayToShow("query sugg");
|
| EXPECT_EQ(ASCIIToUTF16("query sugg"), omnibox()->GetText());
|
|
|
| omnibox()->RevertAll();
|
| + WaitForInstantSupport();
|
|
|
| - EXPECT_TRUE(ExecuteScript("suggestion = [{}]"));
|
| + EXPECT_TRUE(content::ExecuteScript(service()->preloader()->contents(),
|
| + "suggestion = [{}]"));
|
| SetOmniboxTextAndWaitForOverlayToShow("query suggest");
|
| EXPECT_EQ(ASCIIToUTF16("query suggest"), omnibox()->GetText());
|
| }
|
|
|
| // Test that Instant doesn't process URLs.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, RejectsURLs) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| FocusOmniboxAndWaitForInstantSupport();
|
|
|
| // Note that we are not actually navigating to these URLs yet. We are just
|
| @@ -399,25 +395,20 @@ IN_PROC_BROWSER_TEST_F(InstantTest, RejectsURLs) {
|
| // Instant doesn't try to process them.
|
| SetOmniboxText(content::kChromeUICrashURL);
|
| EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_default());
|
|
|
| SetOmniboxText(content::kChromeUIHangURL);
|
| EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_default());
|
|
|
| SetOmniboxText(content::kChromeUIKillURL);
|
| EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_default());
|
|
|
| - // Make sure that the URLs were never sent to the overlay page.
|
| - EXPECT_TRUE(UpdateSearchState(instant()->GetOverlayContents()));
|
| - EXPECT_EQ("", value_);
|
| + EXPECT_FALSE(instant()->GetOverlayContents());
|
| }
|
|
|
| // Test that Instant doesn't fire for intranet paths that look like searches.
|
| // http://crbug.com/99836
|
| IN_PROC_BROWSER_TEST_F(InstantTest, IntranetPathLooksLikeSearch) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
|
|
| // Navigate to a URL that looks like a search (when the scheme is stripped).
|
| // It's okay if the host is bogus or the navigation fails, since we only care
|
| @@ -425,97 +416,71 @@ IN_PROC_BROWSER_TEST_F(InstantTest, IntranetPathLooksLikeSearch) {
|
| ui_test_utils::NavigateToURL(browser(), GURL("http://baby/beluga"));
|
| EXPECT_EQ(ASCIIToUTF16("baby/beluga"), omnibox()->GetText());
|
|
|
| - EXPECT_TRUE(instant()->GetOverlayContents());
|
| EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_default());
|
| + EXPECT_FALSE(instant()->GetOverlayContents());
|
| }
|
|
|
| // Test that transitions between searches and non-searches work as expected.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, TransitionsBetweenSearchAndURL) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| FocusOmniboxAndWaitForInstantSupport();
|
|
|
| // Type a search, and immediately a URL, without waiting for Instant to show.
|
| - // The page is told about the search. Though the page isn't told about the
|
| - // subsequent URL, it invalidates the search, so a blank query is sent in its
|
| - // place to indicate that the search is "out of date".
|
| + // This should cause the overlay to be discarded.
|
| SetOmniboxText("query");
|
| - SetOmniboxText("http://monstrous/nightmare");
|
| - int min_onchangecalls = 2;
|
| + EXPECT_TRUE(instant()->GetOverlayContents());
|
| + EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
|
|
| - EXPECT_TRUE(UpdateSearchState(instant()->GetOverlayContents()));
|
| + SetOmniboxText("http://monstrous/nightmare");
|
| + EXPECT_FALSE(instant()->GetOverlayContents());
|
| EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_default());
|
| - EXPECT_EQ("", value_);
|
| - EXPECT_LE(min_onchangecalls, onchangecalls_);
|
| - min_onchangecalls = onchangecalls_;
|
|
|
| // Type a search. Instant should show.
|
| + WaitForInstantSupport();
|
| SetOmniboxTextAndWaitForOverlayToShow("search");
|
| - ++min_onchangecalls;
|
| + EXPECT_TRUE(instant()->IsOverlayingSearchResults());
|
|
|
| EXPECT_TRUE(UpdateSearchState(instant()->GetOverlayContents()));
|
| - EXPECT_TRUE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_search_suggestions());
|
| EXPECT_EQ("search", value_);
|
| - EXPECT_LE(min_onchangecalls, onchangecalls_);
|
| - min_onchangecalls = onchangecalls_;
|
|
|
| // Type another URL. The overlay should be hidden.
|
| SetOmniboxText("http://terrible/terror");
|
| - ++min_onchangecalls;
|
| -
|
| - EXPECT_TRUE(UpdateSearchState(instant()->GetOverlayContents()));
|
| EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_default());
|
| - EXPECT_EQ("", value_);
|
| - EXPECT_LE(min_onchangecalls, onchangecalls_);
|
| - min_onchangecalls = onchangecalls_;
|
|
|
| // Type the same search as before.
|
| + WaitForInstantSupport();
|
| SetOmniboxTextAndWaitForOverlayToShow("search");
|
| - min_onchangecalls++;
|
| -
|
| - EXPECT_TRUE(UpdateSearchState(instant()->GetOverlayContents()));
|
| EXPECT_TRUE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_search_suggestions());
|
| - EXPECT_EQ("search", value_);
|
| - EXPECT_LE(min_onchangecalls, onchangecalls_);
|
| - min_onchangecalls = onchangecalls_;
|
|
|
| // Revert the omnibox.
|
| omnibox()->RevertAll();
|
| - min_onchangecalls++;
|
| -
|
| - EXPECT_TRUE(UpdateSearchState(instant()->GetOverlayContents()));
|
| EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_default());
|
| - EXPECT_EQ("", value_);
|
| - EXPECT_LE(min_onchangecalls, onchangecalls_);
|
| }
|
|
|
| // Test that Instant can't be fooled into committing a URL.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, DoesNotCommitURLsOne) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| EXPECT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
|
| + FocusOmniboxAndWaitForInstantSupport();
|
| +
|
| + content::WebContents* overlay = service()->preloader()->contents();
|
|
|
| // Type a URL. The Instant overlay shouldn't be showing.
|
| SetOmniboxText("http://deadly/nadder");
|
| EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_default());
|
|
|
| // Unfocus and refocus the omnibox.
|
| ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER);
|
| EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER));
|
| - FocusOmnibox();
|
| + EXPECT_FALSE(omnibox()->model()->has_focus());
|
|
|
| - content::WebContents* overlay = instant()->GetOverlayContents();
|
| - EXPECT_TRUE(overlay);
|
| + FocusOmnibox();
|
| + EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER));
|
| + EXPECT_TRUE(omnibox()->model()->has_focus());
|
|
|
| // The omnibox text hasn't changed, so Instant still shouldn't be showing.
|
| EXPECT_EQ(ASCIIToUTF16("http://deadly/nadder"), omnibox()->GetText());
|
| EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_default());
|
|
|
| // Commit the URL. The omnibox should reflect the URL minus the scheme.
|
| browser()->window()->GetLocationBar()->AcceptInput();
|
| @@ -525,31 +490,28 @@ IN_PROC_BROWSER_TEST_F(InstantTest, DoesNotCommitURLsOne) {
|
| EXPECT_EQ(ASCIIToUTF16("deadly/nadder"), omnibox()->GetText());
|
|
|
| // Instant shouldn't have done anything.
|
| - EXPECT_EQ(overlay, instant()->GetOverlayContents());
|
| + EXPECT_EQ(overlay, service()->preloader()->contents());
|
| EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_default());
|
| + EXPECT_FALSE(instant()->GetOverlayContents());
|
| }
|
|
|
| // Test that Instant can't be fooled into committing a URL.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, DoesNotCommitURLsTwo) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| FocusOmniboxAndWaitForInstantSupport();
|
|
|
| // Type a query. This causes the overlay to be shown.
|
| SetOmniboxTextAndWaitForOverlayToShow("query");
|
|
|
| content::WebContents* overlay = instant()->GetOverlayContents();
|
| - EXPECT_TRUE(overlay);
|
|
|
| // Type a URL. This causes the overlay to be hidden.
|
| SetOmniboxText("http://hideous/zippleback");
|
| EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_default());
|
|
|
| // Pretend the omnibox got focus. It already had focus, so we are just trying
|
| // to tickle a different code path.
|
| - instant()->OmniboxFocusChanged(OMNIBOX_FOCUS_VISIBLE,
|
| - OMNIBOX_FOCUS_CHANGE_EXPLICIT, NULL);
|
| + FocusOmnibox();
|
|
|
| // Commit the URL. As before, check that Instant wasn't committed.
|
| browser()->window()->GetLocationBar()->AcceptInput();
|
| @@ -559,46 +521,46 @@ IN_PROC_BROWSER_TEST_F(InstantTest, DoesNotCommitURLsTwo) {
|
| EXPECT_EQ(ASCIIToUTF16("hideous/zippleback"), omnibox()->GetText());
|
|
|
| // As before, Instant shouldn't have done anything.
|
| - EXPECT_EQ(overlay, instant()->GetOverlayContents());
|
| EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_default());
|
| + EXPECT_FALSE(instant()->GetOverlayContents());
|
| }
|
|
|
| // Test that a non-Instant search provider shows no overlays.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, NonInstantSearchProvider) {
|
| - GURL instant_url = test_server()->GetURL("files/empty.html");
|
| - InstantTestBase::Init(instant_url);
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + set_instant_url(test_server()->GetURL("files/empty.html"));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
|
|
| // Focus the omnibox. When the support determination response comes back,
|
| - // Instant will destroy the non-Instant page, and attempt to recreate it.
|
| - // We can know this happened by looking at the blacklist.
|
| - EXPECT_EQ(0, instant()->blacklisted_urls_[instant_url.spec()]);
|
| - FocusOmniboxAndWaitForInstantSupport();
|
| - EXPECT_EQ(1, instant()->blacklisted_urls_[instant_url.spec()]);
|
| + // Instant will destroy the non-Instant page.
|
| + FocusOmnibox();
|
| + EXPECT_TRUE(service()->preloader()->contents());
|
| +
|
| + WaitForInstantSupport();
|
| + EXPECT_FALSE(service()->preloader()->contents());
|
| }
|
|
|
| // Test that the renderer doesn't crash if JavaScript is blocked.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, NoCrashOnBlockedJS) {
|
| browser()->profile()->GetHostContentSettingsMap()->SetDefaultContentSetting(
|
| CONTENT_SETTINGS_TYPE_JAVASCRIPT, CONTENT_SETTING_BLOCK);
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
|
|
| // Wait for notification that the Instant API has been determined. As long as
|
| // we get the notification we're good (the renderer didn't crash).
|
| FocusOmniboxAndWaitForInstantSupport();
|
| + EXPECT_FALSE(service()->preloader()->contents());
|
| }
|
|
|
| // Test that the overlay and active tab's visibility states are set correctly.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, PageVisibility) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| FocusOmniboxAndWaitForInstantSupport();
|
|
|
| content::WebContents* active_tab =
|
| browser()->tab_strip_model()->GetActiveWebContents();
|
| - content::WebContents* overlay = instant()->GetOverlayContents();
|
| + content::WebContents* overlay = service()->preloader()->contents();
|
|
|
| - // Inititally, the active tab is showing; the overlay is not.
|
| + // Initially, the active tab is showing; the overlay is not.
|
| EXPECT_TRUE(CheckVisibilityIs(active_tab, true));
|
| EXPECT_TRUE(CheckVisibilityIs(overlay, false));
|
|
|
| @@ -608,11 +570,14 @@ IN_PROC_BROWSER_TEST_F(InstantTest, PageVisibility) {
|
| EXPECT_TRUE(CheckVisibilityIs(overlay, true));
|
|
|
| // Deleting the omnibox text should hide the overlay.
|
| - SetOmniboxText("");
|
| + omnibox()->RevertAll();
|
| EXPECT_TRUE(CheckVisibilityIs(active_tab, true));
|
| - EXPECT_TRUE(CheckVisibilityIs(overlay, false));
|
| + EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
|
|
| // Typing a query should show the overlay again.
|
| + WaitForInstantSupport();
|
| + overlay = service()->preloader()->contents();
|
| +
|
| SetOmniboxTextAndWaitForOverlayToShow("query");
|
| EXPECT_TRUE(CheckVisibilityIs(active_tab, true));
|
| EXPECT_TRUE(CheckVisibilityIs(overlay, true));
|
| @@ -623,7 +588,7 @@ IN_PROC_BROWSER_TEST_F(InstantTest, PageVisibility) {
|
| EXPECT_TRUE(CheckVisibilityIs(overlay, true));
|
| }
|
|
|
| -// Test that the task manager identifies Instant's overlay correctly.
|
| +// Test that the task manager identifies Instant's overlay tab correctly.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, TaskManagerPrefix) {
|
| // The browser starts with a new tab, so there's just one renderer initially.
|
| TaskManagerModel* task_manager = TaskManager::GetInstance()->model();
|
| @@ -639,10 +604,11 @@ IN_PROC_BROWSER_TEST_F(InstantTest, TaskManagerPrefix) {
|
| EXPECT_FALSE(StartsWith(title, prefix, true)) << title << " vs " << prefix;
|
| }
|
|
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| - FocusOmnibox();
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| + FocusOmniboxAndWaitForInstantSupport();
|
| + content::WebContents* overlay = service()->preloader()->contents();
|
|
|
| - // Now there should be two renderers, the second being the Instant overlay.
|
| + // Now there should be two renderers, the second being the preloaded page.
|
| TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
|
|
|
| int instant_overlays = 0;
|
| @@ -652,6 +618,44 @@ IN_PROC_BROWSER_TEST_F(InstantTest, TaskManagerPrefix) {
|
| ++instant_overlays;
|
| }
|
| EXPECT_EQ(1, instant_overlays);
|
| +
|
| + // Type something into the omnibox. This causes the overlay to be shown and
|
| + // another Instant page to be spun up in the background.
|
| + SetOmniboxTextAndWaitForOverlayToShow("query");
|
| +
|
| + // So now there are three renderers, two of which are Instant.
|
| + TaskManagerBrowserTestUtil::WaitForWebResourceChange(3);
|
| +
|
| + instant_overlays = 0;
|
| + for (int i = 0; i < task_manager->ResourceCount(); ++i) {
|
| + string16 title = task_manager->GetResourceTitle(i);
|
| + if (StartsWith(title, prefix, true))
|
| + ++instant_overlays;
|
| + }
|
| + EXPECT_EQ(2, instant_overlays);
|
| +
|
| + // Commit the overlay. It should now be considered a regular tab.
|
| + browser()->window()->GetLocationBar()->AcceptInput();
|
| +
|
| + // The task manager caches titles, so we need to force the cache to clear.
|
| + task_manager->StopUpdating();
|
| + task_manager->StartUpdating();
|
| +
|
| + int overlay_index = -1;
|
| + instant_overlays = 0;
|
| + for (int i = 0; i < task_manager->ResourceCount(); ++i) {
|
| + string16 title = task_manager->GetResourceTitle(i);
|
| + if (StartsWith(title, prefix, true))
|
| + ++instant_overlays;
|
| + if (task_manager->GetResourceWebContents(i) == overlay)
|
| + overlay_index = i;
|
| + }
|
| + EXPECT_EQ(1, instant_overlays);
|
| +
|
| + // We should've found the overlay (which is now a committed tab).
|
| + EXPECT_LE(0, overlay_index);
|
| + string16 title = task_manager->GetResourceTitle(overlay_index);
|
| + EXPECT_FALSE(StartsWith(title, prefix, true)) << title << " vs " << prefix;
|
| }
|
|
|
| void HistoryQueryDone(base::RunLoop* run_loop,
|
| @@ -675,7 +679,7 @@ void KeywordQueryDone(base::RunLoop* run_loop,
|
|
|
| // Test that the Instant page load is not added to history.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, History) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| FocusOmniboxAndWaitForInstantSupport();
|
|
|
| const TemplateURL* template_url = TemplateURLServiceFactory::GetForProfile(
|
| @@ -683,8 +687,8 @@ IN_PROC_BROWSER_TEST_F(InstantTest, History) {
|
|
|
| // |instant_url| is the URL Instant loads. |search_url| is the fake URL we
|
| // enter into history for search terms extraction to work correctly.
|
| - std::string search_url = template_url->url_ref().ReplaceSearchTerms(
|
| - TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("search")));
|
| + GURL search_url(template_url->url_ref().ReplaceSearchTerms(
|
| + TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("search"))));
|
|
|
| HistoryService* history = HistoryServiceFactory::GetForProfile(
|
| browser()->profile(), Profile::EXPLICIT_ACCESS);
|
| @@ -701,7 +705,7 @@ IN_PROC_BROWSER_TEST_F(InstantTest, History) {
|
|
|
| // The fake search URL should be in history.
|
| base::RunLoop run_loop1;
|
| - history->QueryURL(GURL(search_url), false, &consumer,
|
| + history->QueryURL(search_url, false, &consumer,
|
| base::Bind(&HistoryQueryDone, &run_loop1, &found));
|
| run_loop1.Run();
|
| EXPECT_TRUE(found);
|
| @@ -733,139 +737,141 @@ IN_PROC_BROWSER_TEST_F(InstantTest, History) {
|
| #endif
|
| // Test that creating a new window hides any currently showing Instant overlay.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, MAYBE_NewWindowDismissesInstant) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| EXPECT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
|
| FocusOmniboxAndWaitForInstantSupport();
|
| SetOmniboxTextAndWaitForOverlayToShow("search");
|
|
|
| Browser* previous_window = browser();
|
| EXPECT_TRUE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_search_suggestions());
|
|
|
| - InstantTestModelObserver observer(instant()->model(),
|
| - chrome::search::Mode::MODE_DEFAULT);
|
| chrome::NewEmptyWindow(browser()->profile(),
|
| chrome::HOST_DESKTOP_TYPE_NATIVE);
|
| - observer.WaitForDesiredOverlayState();
|
| + WaitForOverlayToHide();
|
|
|
| // Even though we just created a new Browser object (for the new window), the
|
| // browser() accessor should still give us the first window's Browser object.
|
| EXPECT_EQ(previous_window, browser());
|
| EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_default());
|
| }
|
|
|
| -// Test that the Instant overlay is recreated when all these conditions are met:
|
| -// - The stale overlay timer has fired.
|
| -// - The overlay is not showing.
|
| -// - The omnibox doesn't have focus.
|
| -IN_PROC_BROWSER_TEST_F(InstantTest, InstantOverlayRefresh) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| +// Test that the Instant overlay is recreated when the stale page timer fires.
|
| +IN_PROC_BROWSER_TEST_F(InstantTest, InstantPreloaderRefresh) {
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| FocusOmniboxAndWaitForInstantSupport();
|
|
|
| - // The overlay is refreshed only after all three conditions above are met.
|
| - SetOmniboxTextAndWaitForOverlayToShow("query");
|
| - instant()->overlay_->is_stale_ = true;
|
| - instant()->ReloadOverlayIfStale();
|
| - EXPECT_TRUE(instant()->overlay_->supports_instant());
|
| - instant()->HideOverlay();
|
| - EXPECT_TRUE(instant()->overlay_->supports_instant());
|
| - instant()->OmniboxFocusChanged(OMNIBOX_FOCUS_NONE,
|
| - OMNIBOX_FOCUS_CHANGE_EXPLICIT, NULL);
|
| - EXPECT_FALSE(instant()->overlay_->supports_instant());
|
| -
|
| - // Try with a different ordering.
|
| - SetOmniboxTextAndWaitForOverlayToShow("query");
|
| - instant()->overlay_->is_stale_ = true;
|
| - instant()->ReloadOverlayIfStale();
|
| - EXPECT_TRUE(instant()->overlay_->supports_instant());
|
| - instant()->OmniboxFocusChanged(OMNIBOX_FOCUS_NONE,
|
| - OMNIBOX_FOCUS_CHANGE_EXPLICIT, NULL);
|
| - // TODO(sreeram): Currently, OmniboxLostFocus() calls HideOverlay(). When it
|
| - // stops hiding the overlay eventually, uncomment these two lines:
|
| - // EXPECT_TRUE(instant()->overlay_->supports_instant());
|
| - // instant()->HideOverlay();
|
| - EXPECT_FALSE(instant()->overlay_->supports_instant());
|
| + // The timer should be running, with a non-zero delay.
|
| + base::Timer* timer = &service()->preloader()->stale_page_timer_;
|
| + EXPECT_TRUE(service()->preloader()->supports_instant());
|
| + EXPECT_TRUE(timer->IsRunning());
|
| + EXPECT_LT(base::TimeDelta(), timer->GetCurrentDelay());
|
| +
|
| + // Restart the timer at zero delay, and wait for it to fire.
|
| + timer->Start(FROM_HERE, base::TimeDelta(), timer->user_task());
|
| + EXPECT_EQ(base::TimeDelta(), timer->GetCurrentDelay());
|
| + content::RunAllPendingInMessageLoop();
|
| +
|
| + // The overlay was deleted and recreated, so its Instant support hasn't been
|
| + // determined yet. The timer would've been reset as usual.
|
| + EXPECT_FALSE(service()->preloader()->supports_instant());
|
| + EXPECT_TRUE(timer->IsRunning());
|
| + EXPECT_LT(base::TimeDelta(), timer->GetCurrentDelay());
|
| }
|
|
|
| // Test that suggestions are case insensitive. http://crbug.com/150728
|
| -IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionsAreCaseInsensitive) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| +IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionsAreCaseInsensitiveOne) {
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| FocusOmniboxAndWaitForInstantSupport();
|
|
|
| - EXPECT_TRUE(ExecuteScript("suggestion = [ { value: 'INSTANT' } ]"));
|
| -
|
| - SetOmniboxTextAndWaitForOverlayToShow("in");
|
| - EXPECT_EQ(ASCIIToUTF16("instant"), omnibox()->GetText());
|
| + const std::string script =
|
| + "suggestion = { suggestions: [ { value: 'INSTANT' } ] }";
|
| +
|
| + const struct {
|
| + const char* const user_text;
|
| + const string16 omnibox_text;
|
| + } kTestCases[] = {
|
| + {"in", ASCIIToUTF16("instant")},
|
| + {"IN", ASCIIToUTF16("INSTANT")},
|
| + };
|
| +
|
| + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) {
|
| + omnibox()->RevertAll();
|
| + WaitForInstantSupport();
|
| + EXPECT_TRUE(content::ExecuteScript(service()->preloader()->contents(),
|
| + script));
|
| + SetOmniboxTextAndWaitForOverlayToShow(kTestCases[i].user_text);
|
| + EXPECT_EQ(kTestCases[i].omnibox_text, omnibox()->GetText());
|
| + }
|
| +}
|
|
|
| - omnibox()->RevertAll();
|
| - SetOmniboxTextAndWaitForOverlayToShow("IN");
|
| - EXPECT_EQ(ASCIIToUTF16("INSTANT"), omnibox()->GetText());
|
| +// Test that suggestions are case insensitive. http://crbug.com/150728
|
| +IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionsAreCaseInsensitiveTwo) {
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| + FocusOmniboxAndWaitForInstantSupport();
|
|
|
| // U+0130 == LATIN CAPITAL LETTER I WITH DOT ABOVE
|
| - EXPECT_TRUE(ExecuteScript("suggestion = [ { value: '\\u0130NSTANT' } ]"));
|
| -
|
| - omnibox()->RevertAll();
|
| - SetOmniboxTextAndWaitForOverlayToShow("i");
|
| - EXPECT_EQ(WideToUTF16(L"i\u0307nstant"), omnibox()->GetText());
|
| -
|
| - omnibox()->RevertAll();
|
| - SetOmniboxTextAndWaitForOverlayToShow("I");
|
| - EXPECT_EQ(WideToUTF16(L"I\u0307nstant"), omnibox()->GetText());
|
| -
|
| - omnibox()->RevertAll();
|
| - SetOmniboxTextAndWaitForOverlayToShow(WideToUTF8(L"i\u0307"));
|
| - EXPECT_EQ(WideToUTF16(L"i\u0307nstant"), omnibox()->GetText());
|
| -
|
| - omnibox()->RevertAll();
|
| - SetOmniboxTextAndWaitForOverlayToShow(WideToUTF8(L"I\u0307"));
|
| - EXPECT_EQ(WideToUTF16(L"I\u0307nstant"), omnibox()->GetText());
|
| -
|
| - omnibox()->RevertAll();
|
| - SetOmniboxTextAndWaitForOverlayToShow(WideToUTF8(L"\u0130"));
|
| - EXPECT_EQ(WideToUTF16(L"\u0130NSTANT"), omnibox()->GetText());
|
| -
|
| - omnibox()->RevertAll();
|
| - SetOmniboxTextAndWaitForOverlayToShow("in");
|
| - EXPECT_EQ(ASCIIToUTF16("in"), omnibox()->GetText());
|
| + const std::string script =
|
| + "suggestion = { suggestions: [ { value: '\\u0130NSTANT' } ] }";
|
| +
|
| + const struct {
|
| + const std::string user_text;
|
| + const string16 omnibox_text;
|
| + } kTestCases[] = {
|
| + {std::string("i"), WideToUTF16(L"i\u0307nstant")},
|
| + {std::string("I"), WideToUTF16(L"I\u0307nstant")},
|
| + {WideToUTF8(L"i\u0307"), WideToUTF16(L"i\u0307nstant")},
|
| + {WideToUTF8(L"I\u0307"), WideToUTF16(L"I\u0307nstant")},
|
| + {WideToUTF8(L"\u0130"), WideToUTF16(L"\u0130NSTANT")},
|
| + {std::string("in"), ASCIIToUTF16("in")},
|
| + {std::string("IN"), ASCIIToUTF16("IN")},
|
| + };
|
| +
|
| + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) {
|
| + omnibox()->RevertAll();
|
| + WaitForInstantSupport();
|
| + EXPECT_TRUE(content::ExecuteScript(service()->preloader()->contents(),
|
| + script));
|
| + SetOmniboxTextAndWaitForOverlayToShow(kTestCases[i].user_text);
|
| + EXPECT_EQ(kTestCases[i].omnibox_text, omnibox()->GetText());
|
| + }
|
| +}
|
|
|
| - omnibox()->RevertAll();
|
| - SetOmniboxTextAndWaitForOverlayToShow("IN");
|
| - EXPECT_EQ(ASCIIToUTF16("IN"), omnibox()->GetText());
|
| +// Test that suggestions are case insensitive. http://crbug.com/150728
|
| +IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionsAreCaseInsensitiveThree) {
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| + FocusOmniboxAndWaitForInstantSupport();
|
|
|
| // Check that a d with a dot above and below it is completed regardless of
|
| // how that is encoded.
|
| // U+1E0D = LATIN SMALL LETTER D WITH DOT BELOW
|
| // U+1E0B = LATIN SMALL LETTER D WITH DOT ABOVE
|
| - EXPECT_TRUE(ExecuteScript("suggestion = [ { value: '\\u1e0d\\u0307oh' } ]"));
|
| -
|
| - omnibox()->RevertAll();
|
| + EXPECT_TRUE(content::ExecuteScript(service()->preloader()->contents(),
|
| + "suggestion = { suggestions: [ { value: '\\u1e0d\\u0307oh' } ] }"));
|
| SetOmniboxTextAndWaitForOverlayToShow(WideToUTF8(L"\u1e0b\u0323"));
|
| EXPECT_EQ(WideToUTF16(L"\u1e0b\u0323oh"), omnibox()->GetText());
|
| }
|
|
|
| -// Flakes on Windows and Mac: http://crbug.com/170677
|
| -#if defined(OS_WIN) || defined(OS_MACOSX)
|
| -#define MAYBE_CommitInNewTab DISABLED_CommitInNewTab
|
| -#else
|
| -#define MAYBE_CommitInNewTab CommitInNewTab
|
| -#endif
|
| // Test that the overlay can be committed onto a new tab.
|
| -IN_PROC_BROWSER_TEST_F(InstantTest, MAYBE_CommitInNewTab) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| +IN_PROC_BROWSER_TEST_F(InstantTest, CommitInNewTab) {
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| FocusOmniboxAndWaitForInstantSupport();
|
|
|
| // Use the Instant page as the active tab, so we can exploit its visibility
|
| // handler to check visibility transitions.
|
| + EXPECT_EQ(1, browser()->tab_strip_model()->count());
|
| ui_test_utils::NavigateToURL(browser(), instant_url());
|
| content::WebContents* active_tab =
|
| browser()->tab_strip_model()->GetActiveWebContents();
|
|
|
| - int active_tab_onvisibilitycalls = -1;
|
| - EXPECT_TRUE(GetIntFromJS(active_tab, "onvisibilitycalls",
|
| - &active_tab_onvisibilitycalls));
|
| - EXPECT_EQ(0, active_tab_onvisibilitycalls);
|
| + int active_tab_events_before = -1;
|
| + EXPECT_TRUE(GetIntFromJS(active_tab, "numVisibilityEvents",
|
| + &active_tab_events_before));
|
|
|
| + // Work around for http://crbug.com/181210.
|
| + EXPECT_TRUE(active_tab_events_before == 0 ||
|
| + active_tab_events_before == 1) << active_tab_events_before;
|
| +
|
| + FocusOmnibox();
|
| SetOmniboxTextAndWaitForOverlayToShow("search");
|
|
|
| // Stash a reference to the overlay, so we can refer to it after commit.
|
| @@ -876,32 +882,27 @@ IN_PROC_BROWSER_TEST_F(InstantTest, MAYBE_CommitInNewTab) {
|
| EXPECT_TRUE(UpdateSearchState(overlay));
|
| EXPECT_EQ("search", value_);
|
| EXPECT_FALSE(verbatim_);
|
| - EXPECT_EQ(0, onsubmitcalls_);
|
| - EXPECT_EQ(1, onvisibilitycalls_);
|
| + EXPECT_EQ(0, num_submit_events_);
|
| + EXPECT_EQ(1, num_visibility_events_);
|
|
|
| // The state of the active tab before the commit.
|
| EXPECT_NE(overlay, active_tab);
|
| EXPECT_EQ(2, active_tab->GetController().GetEntryCount());
|
| EXPECT_EQ(instant_url(), omnibox()->model()->PermanentURL());
|
| - active_tab_onvisibilitycalls = -1;
|
| - EXPECT_TRUE(GetIntFromJS(active_tab, "onvisibilitycalls",
|
| - &active_tab_onvisibilitycalls));
|
| - EXPECT_EQ(0, active_tab_onvisibilitycalls);
|
| + int active_tab_events_after = -1;
|
| + EXPECT_TRUE(GetIntFromJS(active_tab, "numVisibilityEvents",
|
| + &active_tab_events_after));
|
| + EXPECT_EQ(active_tab_events_before, active_tab_events_after);
|
|
|
| // Commit the search by pressing Alt-Enter.
|
| omnibox()->model()->AcceptInput(NEW_FOREGROUND_TAB, false);
|
|
|
| // After the commit, Instant should not be showing.
|
| EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| - EXPECT_TRUE(instant()->model()->mode().is_default());
|
| -
|
| - // The old overlay is deleted and a new one is created.
|
| - EXPECT_TRUE(instant()->GetOverlayContents());
|
| - EXPECT_NE(instant()->GetOverlayContents(), overlay);
|
|
|
| // Check that we have two tabs and that the new active tab is indeed what was
|
| - // once the overlay. The overlay should have just one navigation entry, for
|
| - // the Instant search that was committed.
|
| + // once the overlay. The overlay tab should have just one navigation entry,
|
| + // for the Instant search that was committed.
|
| EXPECT_EQ(2, browser()->tab_strip_model()->count());
|
| EXPECT_EQ(overlay, browser()->tab_strip_model()->GetActiveWebContents());
|
| EXPECT_EQ(1, overlay->GetController().GetEntryCount());
|
| @@ -911,94 +912,82 @@ IN_PROC_BROWSER_TEST_F(InstantTest, MAYBE_CommitInNewTab) {
|
|
|
| // Check that the searchbox API values have been reset.
|
| std::string value;
|
| - EXPECT_TRUE(GetStringFromJS(overlay,
|
| - "chrome.embeddedSearch.searchBox.value", &value));
|
| + bool verbatim;
|
| + int height;
|
| + EXPECT_TRUE(GetStringFromJS(overlay, "chrome.searchBox.value", &value));
|
| + EXPECT_TRUE(GetBoolFromJS(overlay, "chrome.searchBox.verbatim", &verbatim));
|
| + EXPECT_TRUE(GetIntFromJS(overlay, "chrome.searchBox.height", &height));
|
| EXPECT_EQ("", value);
|
| + EXPECT_FALSE(verbatim);
|
| + EXPECT_EQ(0, height);
|
|
|
| // However, the page should've correctly received the committed query.
|
| EXPECT_TRUE(UpdateSearchState(overlay));
|
| EXPECT_EQ("search", value_);
|
| EXPECT_TRUE(verbatim_);
|
| - EXPECT_EQ(1, onsubmitcalls_);
|
| - EXPECT_EQ(1, onvisibilitycalls_);
|
| + EXPECT_EQ(1, num_submit_events_);
|
| + EXPECT_EQ(1, num_visibility_events_);
|
|
|
| // The ex-active tab should've gotten a visibility change marking it hidden.
|
| - EXPECT_NE(active_tab, overlay);
|
| - EXPECT_TRUE(GetIntFromJS(active_tab, "onvisibilitycalls",
|
| - &active_tab_onvisibilitycalls));
|
| - EXPECT_EQ(1, active_tab_onvisibilitycalls);
|
| -}
|
| -
|
| -// Test that suggestions are reusable.
|
| -IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionsAreReusable) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| - FocusOmniboxAndWaitForInstantSupport();
|
| -
|
| - EXPECT_TRUE(ExecuteScript("suggestion = [ { value: 'instant' } ];"
|
| - "behavior = 'never';"));
|
| -
|
| - SetOmniboxTextAndWaitForOverlayToShow("in");
|
| - EXPECT_EQ(ASCIIToUTF16("stant"), omnibox()->GetInstantSuggestion());
|
| -
|
| - SetOmniboxText("ins");
|
| - EXPECT_EQ(ASCIIToUTF16("tant"), omnibox()->GetInstantSuggestion());
|
| -
|
| - SetOmniboxText("in");
|
| - EXPECT_EQ(ASCIIToUTF16("stant"), omnibox()->GetInstantSuggestion());
|
| -
|
| - SetOmniboxText("insane");
|
| - EXPECT_EQ(ASCIIToUTF16(""), omnibox()->GetInstantSuggestion());
|
| + EXPECT_NE(overlay, active_tab);
|
| + EXPECT_TRUE(GetIntFromJS(active_tab, "numVisibilityEvents",
|
| + &active_tab_events_after));
|
| + EXPECT_EQ(active_tab_events_before + 1, active_tab_events_after);
|
| }
|
|
|
| // Test that the Instant overlay is recreated if it gets destroyed.
|
| IN_PROC_BROWSER_TEST_F(InstantTest, InstantRenderViewGone) {
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| +
|
| + // Get the overlay to show.
|
| FocusOmniboxAndWaitForInstantSupport();
|
| + SetOmniboxTextAndWaitForOverlayToShow("search");
|
| + EXPECT_TRUE(instant()->IsOverlayingSearchResults());
|
|
|
| - // Type partial query, get suggestion to show.
|
| - SetOmniboxTextAndWaitForOverlayToShow("q");
|
| - EXPECT_EQ(ASCIIToUTF16("query suggestion"), omnibox()->GetText());
|
| + // Kill the overlay's renderer and wait for the overlay to disappear.
|
| + KillOverlayRenderView();
|
| + WaitForOverlayToHide();
|
| +
|
| + EXPECT_FALSE(instant()->IsOverlayingSearchResults());
|
| + EXPECT_FALSE(instant()->GetOverlayContents());
|
|
|
| - // Kill the Instant renderer and wait for Instant support again.
|
| - KillInstantRenderView();
|
| + // Tickle the loader into recreating an overlay.
|
| FocusOmniboxAndWaitForInstantSupport();
|
|
|
| - SetOmniboxTextAndWaitForOverlayToShow("qu");
|
| + // Continue typing. The overlay should show again, and set suggestions.
|
| + SetOmniboxTextAndWaitForOverlayToShow("query");
|
| + EXPECT_TRUE(instant()->IsOverlayingSearchResults());
|
| EXPECT_EQ(ASCIIToUTF16("query suggestion"), omnibox()->GetText());
|
| }
|
|
|
| IN_PROC_BROWSER_TEST_F(InstantTest, ProcessIsolation) {
|
| - // Prior to setup no render process is dedicated to Instant.
|
| - InstantService* instant_service =
|
| - InstantServiceFactory::GetForProfile(browser()->profile());
|
| - ASSERT_NE(static_cast<InstantService*>(NULL), instant_service);
|
| - EXPECT_EQ(0, instant_service->GetInstantProcessCount());
|
| + // Prior to setup, no render process is dedicated to Instant.
|
| + EXPECT_EQ(0, service()->GetInstantProcessCount());
|
|
|
| // Setup Instant.
|
| - ASSERT_NO_FATAL_FAILURE(SetupInstant(browser()));
|
| + ASSERT_NO_FATAL_FAILURE(SetupInstant());
|
| FocusOmniboxAndWaitForInstantSupport();
|
|
|
| // Now there should be a registered Instant render process.
|
| - EXPECT_LT(0, instant_service->GetInstantProcessCount());
|
| + EXPECT_EQ(1, service()->GetInstantProcessCount());
|
|
|
| // And the Instant overlay should live inside it.
|
| - content::WebContents* overlay = instant()->GetOverlayContents();
|
| - EXPECT_TRUE(instant_service->IsInstantProcess(
|
| - overlay->GetRenderProcessHost()->GetID()));
|
| + content::WebContents* overlay = service()->preloader()->contents();
|
| + EXPECT_TRUE(
|
| + service()->IsInstantProcess(overlay->GetRenderProcessHost()->GetID()));
|
|
|
| // Search and commit the search by pressing Alt-Enter.
|
| SetOmniboxTextAndWaitForOverlayToShow("tractor");
|
| omnibox()->model()->AcceptInput(NEW_FOREGROUND_TAB, false);
|
|
|
| - // The committed search results page should also live inside the
|
| - // Instant process.
|
| + // The committed results page should also live inside the Instant process.
|
| content::WebContents* active_tab =
|
| browser()->tab_strip_model()->GetActiveWebContents();
|
| - EXPECT_TRUE(instant_service->IsInstantProcess(
|
| - active_tab->GetRenderProcessHost()->GetID()));
|
| + EXPECT_TRUE(
|
| + service()->IsInstantProcess(active_tab->GetRenderProcessHost()->GetID()));
|
|
|
| // Navigating away should change the process.
|
| ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
|
| - EXPECT_FALSE(instant_service->IsInstantProcess(
|
| - active_tab->GetRenderProcessHost()->GetID()));
|
| + EXPECT_FALSE(
|
| + service()->IsInstantProcess(active_tab->GetRenderProcessHost()->GetID()));
|
| }
|
|
|