| 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()));
 | 
|  }
 | 
| 
 |