Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(101)

Side by Side Diff: chrome/browser/instant/instant_browsertest.cc

Issue 12386019: Instant: Use only one hidden WebContents per profile. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/prefs/pref_service.h"
5 #include "chrome/browser/content_settings/host_content_settings_map.h" 6 #include "chrome/browser/content_settings/host_content_settings_map.h"
6 #include "chrome/browser/history/history_service_factory.h" 7 #include "chrome/browser/history/history_service_factory.h"
7 #include "chrome/browser/instant/instant_overlay.h" 8 #include "chrome/browser/instant/instant_controller.h"
9 #include "chrome/browser/instant/instant_loader.h"
10 #include "chrome/browser/instant/instant_model.h"
8 #include "chrome/browser/instant/instant_service.h" 11 #include "chrome/browser/instant/instant_service.h"
9 #include "chrome/browser/instant/instant_service_factory.h"
10 #include "chrome/browser/instant/instant_test_utils.h" 12 #include "chrome/browser/instant/instant_test_utils.h"
11 #include "chrome/browser/profiles/profile.h"
12 #include "chrome/browser/search_engines/template_url_service.h" 13 #include "chrome/browser/search_engines/template_url_service.h"
13 #include "chrome/browser/search_engines/template_url_service_factory.h" 14 #include "chrome/browser/search_engines/template_url_service_factory.h"
14 #include "chrome/browser/task_manager/task_manager.h" 15 #include "chrome/browser/task_manager/task_manager.h"
15 #include "chrome/browser/task_manager/task_manager_browsertest_util.h" 16 #include "chrome/browser/task_manager/task_manager_browsertest_util.h"
16 #include "chrome/browser/ui/browser.h"
17 #include "chrome/browser/ui/browser_commands.h" 17 #include "chrome/browser/ui/browser_commands.h"
18 #include "chrome/browser/ui/host_desktop.h" 18 #include "chrome/browser/ui/browser_window.h"
19 #include "chrome/browser/ui/omnibox/location_bar.h"
20 #include "chrome/browser/ui/omnibox/omnibox_view.h"
19 #include "chrome/browser/ui/tabs/tab_strip_model.h" 21 #include "chrome/browser/ui/tabs/tab_strip_model.h"
20 #include "chrome/common/chrome_notification_types.h" 22 #include "chrome/common/pref_names.h"
21 #include "chrome/common/url_constants.h" 23 #include "chrome/common/url_constants.h"
24 #include "chrome/test/base/in_process_browser_test.h"
22 #include "chrome/test/base/interactive_test_utils.h" 25 #include "chrome/test/base/interactive_test_utils.h"
23 #include "chrome/test/base/ui_test_utils.h"
24 #include "content/public/browser/notification_service.h"
25 #include "content/public/browser/render_process_host.h" 26 #include "content/public/browser/render_process_host.h"
26 #include "content/public/browser/web_contents.h" 27 #include "content/public/browser/web_contents.h"
28 #include "content/public/test/browser_test_utils.h"
27 #include "grit/generated_resources.h" 29 #include "grit/generated_resources.h"
28 #include "ui/base/l10n/l10n_util.h" 30 #include "ui/base/l10n/l10n_util.h"
29 31
30 class InstantTest : public InstantTestBase { 32 class InstantTest : public InProcessBrowserTest,
33 public InstantTestBase {
31 protected: 34 protected:
32 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 35 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
33 ASSERT_TRUE(test_server()->Start()); 36 ASSERT_TRUE(test_server()->Start());
34 instant_url_ = test_server()->GetURL("files/instant.html?"); 37 set_instant_url(test_server()->GetURL("files/instant.html"));
35 } 38 }
36 39
37 void FocusOmniboxAndWaitForInstantSupport() { 40 virtual void SetUpOnMainThread() OVERRIDE {
38 content::WindowedNotificationObserver observer( 41 set_browser(browser());
39 chrome::NOTIFICATION_INSTANT_OVERLAY_SUPPORT_DETERMINED, 42 }
40 content::NotificationService::AllSources()); 43
41 FocusOmnibox(); 44 void SetupInstant() {
42 observer.Wait(); 45 TemplateURLData template_data;
46 template_data.SetURL("http://does/not/exist?q={searchTerms}");
47 template_data.instant_url = instant_url().spec();
48 SetupDefaultSearchProvider(template_data);
49
50 browser()->profile()->GetPrefs()->SetBoolean(prefs::kInstantEnabled, true);
43 } 51 }
44 52
45 bool UpdateSearchState(content::WebContents* contents) WARN_UNUSED_RESULT { 53 bool UpdateSearchState(content::WebContents* contents) WARN_UNUSED_RESULT {
46 return GetIntFromJS(contents, "onvisibilitycalls", &onvisibilitycalls_) && 54 return GetIntFromJS(contents, "onvisibilitycalls", &onvisibilitycalls_) &&
47 GetIntFromJS(contents, "onchangecalls", &onchangecalls_) && 55 GetIntFromJS(contents, "onchangecalls", &onchangecalls_) &&
48 GetIntFromJS(contents, "onsubmitcalls", &onsubmitcalls_) && 56 GetIntFromJS(contents, "onsubmitcalls", &onsubmitcalls_) &&
49 GetIntFromJS(contents, "oncancelcalls", &oncancelcalls_) && 57 GetIntFromJS(contents, "oncancelcalls", &oncancelcalls_) &&
50 GetIntFromJS(contents, "onresizecalls", &onresizecalls_) && 58 GetIntFromJS(contents, "onresizecalls", &onresizecalls_) &&
51 GetStringFromJS(contents, "value", &value_) && 59 GetStringFromJS(contents, "value", &value_) &&
52 GetBoolFromJS(contents, "verbatim", &verbatim_) && 60 GetBoolFromJS(contents, "verbatim", &verbatim_) &&
53 GetIntFromJS(contents, "height", &height_); 61 GetIntFromJS(contents, "height", &height_);
54 } 62 }
55 63
56 int onvisibilitycalls_; 64 int onvisibilitycalls_;
57 int onchangecalls_; 65 int onchangecalls_;
58 int onsubmitcalls_; 66 int onsubmitcalls_;
59 int oncancelcalls_; 67 int oncancelcalls_;
60 int onresizecalls_; 68 int onresizecalls_;
61 69
62 std::string value_; 70 std::string value_;
63 bool verbatim_; 71 bool verbatim_;
64 int height_; 72 int height_;
65 }; 73 };
66 74
67 // Test that Instant is preloaded when the omnibox is focused. 75 // Test that Instant is preloaded when the omnibox is focused.
68 IN_PROC_BROWSER_TEST_F(InstantTest, OmniboxFocusLoadsInstant) { 76 IN_PROC_BROWSER_TEST_F(InstantTest, OmniboxFocusLoadsInstant) {
69 ASSERT_NO_FATAL_FAILURE(SetupInstant());
70
71 // Explicitly unfocus the omnibox. 77 // Explicitly unfocus the omnibox.
72 EXPECT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 78 EXPECT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
73 ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER); 79 ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER);
74 80
75 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER)); 81 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER));
76 EXPECT_FALSE(omnibox()->model()->has_focus()); 82 EXPECT_FALSE(omnibox()->model()->has_focus());
77 83
78 // Delete any existing preview. 84 ASSERT_NO_FATAL_FAILURE(SetupInstant());
79 instant()->overlay_.reset(); 85 EXPECT_FALSE(service()->loader()->contents());
80 EXPECT_FALSE(instant()->GetPreviewContents());
81 86
82 // Refocus the omnibox. The InstantController should've preloaded Instant. 87 // Refocus the omnibox. The InstantLoader should preload an Instant page.
83 FocusOmniboxAndWaitForInstantSupport(); 88 FocusOmniboxAndWaitForInstantSupport();
84 89
85 EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER)); 90 EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER));
86 EXPECT_TRUE(omnibox()->model()->has_focus()); 91 EXPECT_TRUE(omnibox()->model()->has_focus());
87 92
88 content::WebContents* preview_tab = instant()->GetPreviewContents(); 93 content::WebContents* overlay = service()->loader()->contents();
89 EXPECT_TRUE(preview_tab); 94 EXPECT_TRUE(overlay);
90 95
91 // Check that the page supports Instant, but it isn't showing. 96 // Check that the page supports Instant, but it isn't showing.
92 EXPECT_TRUE(instant()->overlay_->supports_instant()); 97 EXPECT_TRUE(service()->loader()->supports_instant());
93 EXPECT_FALSE(instant()->IsPreviewingSearchResults()); 98 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
94 EXPECT_TRUE(instant()->model()->mode().is_default()); 99 EXPECT_FALSE(instant()->GetOverlayContents());
95 100
96 // Adding a new tab shouldn't delete or recreate the preview; otherwise, 101 // Adding a new tab shouldn't delete or recreate the overlay; otherwise,
97 // what's the point of preloading? 102 // what's the point of preloading?
98 AddBlankTabAndShow(browser()); 103 AddBlankTabAndShow(browser());
99 EXPECT_EQ(preview_tab, instant()->GetPreviewContents()); 104 EXPECT_EQ(overlay, service()->loader()->contents());
100 105
101 // Unfocusing and refocusing the omnibox should also preserve the preview. 106 // Unfocusing and refocusing the omnibox should also preserve the overlay.
102 ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER); 107 ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER);
103 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER)); 108 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER));
104 109
105 FocusOmnibox(); 110 FocusOmnibox();
106 EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER)); 111 EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER));
107 112
108 EXPECT_EQ(preview_tab, instant()->GetPreviewContents()); 113 EXPECT_EQ(overlay, service()->loader()->contents());
109 114
110 // Doing a search should also use the same preloaded page. 115 // Doing a search should also use the same preloaded page.
111 SetOmniboxTextAndWaitForInstantToShow("query"); 116 SetOmniboxTextAndWaitForOverlayToShow("query");
112 EXPECT_TRUE(instant()->model()->mode().is_search_suggestions()); 117 EXPECT_TRUE(instant()->IsOverlayingSearchResults());
113 EXPECT_EQ(preview_tab, instant()->GetPreviewContents()); 118 EXPECT_EQ(overlay, instant()->GetOverlayContents());
114 } 119 }
115 120
116 // Flakes on Windows and Mac: http://crbug.com/170677
117 #if defined(OS_WIN) || defined(OS_MACOSX)
118 #define MAYBE_OnChangeEvent DISABLED_OnChangeEvent
119 #else
120 #define MAYBE_OnChangeEvent OnChangeEvent
121 #endif
122 // Test that the onchange event is dispatched upon typing in the omnibox. 121 // Test that the onchange event is dispatched upon typing in the omnibox.
123 IN_PROC_BROWSER_TEST_F(InstantTest, MAYBE_OnChangeEvent) { 122 IN_PROC_BROWSER_TEST_F(InstantTest, OnChangeEvent) {
124 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 123 ASSERT_NO_FATAL_FAILURE(SetupInstant());
125 FocusOmniboxAndWaitForInstantSupport(); 124 FocusOmniboxAndWaitForInstantSupport();
126 125
127 // Use the Instant page as the active tab, so we can exploit its visibility 126 // Use the Instant page as the active tab, so we can exploit its visibility
128 // handler to check visibility transitions. 127 // handler to check visibility transitions.
129 ui_test_utils::NavigateToURL(browser(), instant_url_); 128 ui_test_utils::NavigateToURL(browser(), instant_url());
130 content::WebContents* active_tab = 129 content::WebContents* active_tab =
131 browser()->tab_strip_model()->GetActiveWebContents(); 130 browser()->tab_strip_model()->GetActiveWebContents();
132 131
133 int active_tab_onvisibilitycalls = -1; 132 int active_tab_onvisibilitycalls = -1;
134 EXPECT_TRUE(GetIntFromJS(active_tab, "onvisibilitycalls", 133 EXPECT_TRUE(GetIntFromJS(active_tab, "onvisibilitycalls",
135 &active_tab_onvisibilitycalls)); 134 &active_tab_onvisibilitycalls));
136 EXPECT_EQ(0, active_tab_onvisibilitycalls); 135 EXPECT_EQ(0, active_tab_onvisibilitycalls);
137 136
138 // Typing "query" into the omnibox causes one or more onchange events. The 137 // Typing "query" into the omnibox causes the first onchange event. The page
139 // page suggested "query suggestion" is inline autocompleted into the omnibox, 138 // suggested "query suggestion" is inline autocompleted into the omnibox,
140 // causing another onchange event. 139 // causing the second onchange event.
141 SetOmniboxTextAndWaitForInstantToShow("query"); 140 SetOmniboxTextAndWaitForOverlayToShow("query");
142 EXPECT_EQ(ASCIIToUTF16("query suggestion"), omnibox()->GetText()); 141 EXPECT_EQ(ASCIIToUTF16("query suggestion"), omnibox()->GetText());
143 int min_onchangecalls = 2;
144 142
145 EXPECT_TRUE(UpdateSearchState(instant()->GetPreviewContents())); 143 EXPECT_TRUE(UpdateSearchState(instant()->GetOverlayContents()));
146 EXPECT_LE(min_onchangecalls, onchangecalls_); 144 EXPECT_EQ(2, onchangecalls_);
147 min_onchangecalls = onchangecalls_;
148 145
149 // Change the query and confirm more onchange events are sent. 146 // Change the query and confirm that a third onchange event is sent. The
147 // hardcoded "query suggestion" doesn't start with "search", so no inline
148 // autocompletion or fourth onchange event happens.
150 SetOmniboxText("search"); 149 SetOmniboxText("search");
151 ++min_onchangecalls;
152 150
153 EXPECT_TRUE(UpdateSearchState(instant()->GetPreviewContents())); 151 EXPECT_TRUE(UpdateSearchState(instant()->GetOverlayContents()));
154 EXPECT_LE(min_onchangecalls, onchangecalls_); 152 EXPECT_EQ(3, onchangecalls_);
155 153
156 // The preview was shown once, and the active tab was never hidden. 154 // The overlay was shown once, and the active tab was never hidden.
157 EXPECT_EQ(1, onvisibilitycalls_); 155 EXPECT_EQ(1, onvisibilitycalls_);
158 active_tab_onvisibilitycalls = -1; 156 active_tab_onvisibilitycalls = -1;
159 EXPECT_TRUE(GetIntFromJS(active_tab, "onvisibilitycalls", 157 EXPECT_TRUE(GetIntFromJS(active_tab, "onvisibilitycalls",
160 &active_tab_onvisibilitycalls)); 158 &active_tab_onvisibilitycalls));
161 EXPECT_EQ(0, active_tab_onvisibilitycalls); 159 EXPECT_EQ(0, active_tab_onvisibilitycalls);
162 } 160 }
163 161
164 // Test that the onsubmit event is dispatched upon pressing Enter. 162 // Test that the onsubmit event is dispatched upon pressing Enter.
165 IN_PROC_BROWSER_TEST_F(InstantTest, OnSubmitEvent) { 163 IN_PROC_BROWSER_TEST_F(InstantTest, OnSubmitEvent) {
166 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 164 ASSERT_NO_FATAL_FAILURE(SetupInstant());
167 FocusOmniboxAndWaitForInstantSupport(); 165 FocusOmniboxAndWaitForInstantSupport();
168 SetOmniboxTextAndWaitForInstantToShow("search"); 166 SetOmniboxTextAndWaitForOverlayToShow("search");
169 167
170 // Stash a reference to the preview, so we can refer to it after commit. 168 // Stash a reference to the overlay, so we can refer to it after commit.
171 content::WebContents* preview_tab = instant()->GetPreviewContents(); 169 content::WebContents* overlay = instant()->GetOverlayContents();
172 EXPECT_TRUE(preview_tab); 170 EXPECT_TRUE(overlay);
173 171
174 // The state of the searchbox before the commit. 172 // The state of the searchbox before the commit.
175 EXPECT_TRUE(UpdateSearchState(preview_tab)); 173 EXPECT_TRUE(UpdateSearchState(overlay));
176 EXPECT_EQ("search", value_); 174 EXPECT_EQ("search", value_);
177 EXPECT_FALSE(verbatim_); 175 EXPECT_FALSE(verbatim_);
178 EXPECT_EQ(0, onsubmitcalls_); 176 EXPECT_EQ(0, onsubmitcalls_);
179 EXPECT_EQ(1, onvisibilitycalls_); 177 EXPECT_EQ(1, onvisibilitycalls_);
180 178
181 // Before the commit, the active tab is the NTP (i.e., not Instant). 179 // Before the commit, the active tab is a blank page (i.e., not Instant).
182 content::WebContents* active_tab = 180 content::WebContents* active_tab =
183 browser()->tab_strip_model()->GetActiveWebContents(); 181 browser()->tab_strip_model()->GetActiveWebContents();
184 EXPECT_NE(preview_tab, active_tab); 182 EXPECT_NE(overlay, active_tab);
185 EXPECT_EQ(1, active_tab->GetController().GetEntryCount()); 183 EXPECT_EQ(1, active_tab->GetController().GetEntryCount());
186 EXPECT_EQ(std::string(chrome::kAboutBlankURL), 184 EXPECT_EQ(std::string(chrome::kAboutBlankURL),
187 omnibox()->model()->PermanentURL().spec()); 185 omnibox()->model()->PermanentURL().spec());
188 186
189 // Commit the search by pressing Enter. 187 // Commit the search by pressing Enter.
190 browser()->window()->GetLocationBar()->AcceptInput(); 188 browser()->window()->GetLocationBar()->AcceptInput();
191 189
192 // After the commit, Instant should not be showing. 190 // After the commit, Instant should not be showing.
193 EXPECT_FALSE(instant()->IsPreviewingSearchResults()); 191 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
194 EXPECT_TRUE(instant()->model()->mode().is_default());
195 192
196 // The old overlay is deleted and a new one is created. 193 // Check that the current active tab is indeed what was once the overlay.
197 EXPECT_TRUE(instant()->GetPreviewContents()); 194 EXPECT_EQ(overlay, browser()->tab_strip_model()->GetActiveWebContents());
198 EXPECT_NE(instant()->GetPreviewContents(), preview_tab);
199 195
200 // Check that the current active tab is indeed what was once the preview. 196 // We should have two navigation entries, one for the blank page, and one for
201 EXPECT_EQ(preview_tab, browser()->tab_strip_model()->GetActiveWebContents()); 197 // the Instant search that was committed.
202 198 EXPECT_EQ(2, overlay->GetController().GetEntryCount());
203 // We should have two navigation entries, one for the NTP, and one for the
204 // Instant search that was committed.
205 EXPECT_EQ(2, preview_tab->GetController().GetEntryCount());
206 199
207 // Check that the omnibox contains the Instant URL we loaded. 200 // Check that the omnibox contains the Instant URL we loaded.
208 EXPECT_EQ(instant_url_, omnibox()->model()->PermanentURL()); 201 EXPECT_EQ(instant_url(), omnibox()->model()->PermanentURL());
209 202
210 // Check that the searchbox API values have been reset. 203 // The page should've correctly received the committed query.
211 std::string value; 204 EXPECT_TRUE(UpdateSearchState(overlay));
212 EXPECT_TRUE(GetStringFromJS(preview_tab,
213 "chrome.embeddedSearch.searchBox.value", &value));
214 EXPECT_EQ("", value);
215
216 // However, the page should've correctly received the committed query.
217 EXPECT_TRUE(UpdateSearchState(preview_tab));
218 EXPECT_EQ("search", value_); 205 EXPECT_EQ("search", value_);
219 EXPECT_TRUE(verbatim_); 206 EXPECT_TRUE(verbatim_);
220 EXPECT_EQ(1, onsubmitcalls_); 207 EXPECT_EQ(1, onsubmitcalls_);
221 EXPECT_EQ(1, onvisibilitycalls_); 208 EXPECT_EQ(1, onvisibilitycalls_);
222 } 209 }
223 210
224 // Test that the oncancel event is dispatched upon clicking on the preview. 211 // Test that the oncancel event is dispatched upon clicking on the overlay.
225 IN_PROC_BROWSER_TEST_F(InstantTest, OnCancelEvent) { 212 IN_PROC_BROWSER_TEST_F(InstantTest, OnCancelEvent) {
226 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 213 ASSERT_NO_FATAL_FAILURE(SetupInstant());
227 EXPECT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 214 EXPECT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
228 FocusOmniboxAndWaitForInstantSupport(); 215 FocusOmniboxAndWaitForInstantSupport();
229 SetOmniboxTextAndWaitForInstantToShow("search"); 216 SetOmniboxTextAndWaitForOverlayToShow("search");
230 217
231 // Stash a reference to the preview, so we can refer to it after commit. 218 // Stash a reference to the overlay, so we can refer to it after commit.
232 content::WebContents* preview_tab = instant()->GetPreviewContents(); 219 content::WebContents* overlay = instant()->GetOverlayContents();
233 EXPECT_TRUE(preview_tab); 220 EXPECT_TRUE(overlay);
234 221
235 // The state of the searchbox before the commit. 222 // The state of the searchbox before the commit.
236 EXPECT_TRUE(UpdateSearchState(preview_tab)); 223 EXPECT_TRUE(UpdateSearchState(overlay));
237 EXPECT_EQ("search", value_); 224 EXPECT_EQ("search", value_);
238 EXPECT_FALSE(verbatim_); 225 EXPECT_FALSE(verbatim_);
239 EXPECT_EQ(0, oncancelcalls_); 226 EXPECT_EQ(0, oncancelcalls_);
240 EXPECT_EQ(1, onvisibilitycalls_); 227 EXPECT_EQ(1, onvisibilitycalls_);
241 228
242 // Before the commit, the active tab is the NTP (i.e., not Instant). 229 // Before the commit, the active tab is a blank page (i.e., not Instant).
243 content::WebContents* active_tab = 230 content::WebContents* active_tab =
244 browser()->tab_strip_model()->GetActiveWebContents(); 231 browser()->tab_strip_model()->GetActiveWebContents();
245 EXPECT_NE(preview_tab, active_tab); 232 EXPECT_NE(overlay, active_tab);
246 EXPECT_EQ(1, active_tab->GetController().GetEntryCount()); 233 EXPECT_EQ(1, active_tab->GetController().GetEntryCount());
247 EXPECT_EQ(std::string(chrome::kAboutBlankURL), 234 EXPECT_EQ(std::string(chrome::kAboutBlankURL),
248 omnibox()->model()->PermanentURL().spec()); 235 omnibox()->model()->PermanentURL().spec());
249 236
250 // Commit the search by clicking on the preview. 237 // Commit the search by clicking on the overlay.
251 ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER); 238 ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER);
252 239
253 // After the commit, Instant should not be showing. 240 // After the commit, Instant should not be showing.
254 EXPECT_FALSE(instant()->IsPreviewingSearchResults()); 241 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
255 EXPECT_TRUE(instant()->model()->mode().is_default());
256 242
257 // The old overlay is deleted and a new one is created. 243 // Check that the current active tab is indeed what was once the overlay.
258 EXPECT_TRUE(instant()->GetPreviewContents()); 244 EXPECT_EQ(overlay, browser()->tab_strip_model()->GetActiveWebContents());
259 EXPECT_NE(instant()->GetPreviewContents(), preview_tab);
260 245
261 // Check that the current active tab is indeed what was once the preview. 246 // We should have two navigation entries, one for the blank page, and one for
262 EXPECT_EQ(preview_tab, browser()->tab_strip_model()->GetActiveWebContents()); 247 // the Instant search that was committed.
263 248 EXPECT_EQ(2, overlay->GetController().GetEntryCount());
264 // We should have two navigation entries, one for the NTP, and one for the
265 // Instant search that was committed.
266 EXPECT_EQ(2, preview_tab->GetController().GetEntryCount());
267 249
268 // Check that the omnibox contains the Instant URL we loaded. 250 // Check that the omnibox contains the Instant URL we loaded.
269 EXPECT_EQ(instant_url_, omnibox()->model()->PermanentURL()); 251 EXPECT_EQ(instant_url(), omnibox()->model()->PermanentURL());
270 252
271 // Check that the searchbox API values have been reset. 253 // The page should've correctly received the committed query.
272 std::string value; 254 EXPECT_TRUE(UpdateSearchState(overlay));
273 EXPECT_TRUE(GetStringFromJS(preview_tab,
274 "chrome.embeddedSearch.searchBox.value", &value));
275 EXPECT_EQ("", value);
276
277 // However, the page should've correctly received the committed query.
278 EXPECT_TRUE(UpdateSearchState(preview_tab));
279 EXPECT_EQ("search", value_); 255 EXPECT_EQ("search", value_);
280 EXPECT_TRUE(verbatim_); 256 EXPECT_TRUE(verbatim_);
281 EXPECT_EQ(1, oncancelcalls_); 257 EXPECT_EQ(1, oncancelcalls_);
282 EXPECT_EQ(1, onvisibilitycalls_); 258 EXPECT_EQ(1, onvisibilitycalls_);
283 } 259 }
284 260
285 // Test that the onreisze event is dispatched upon typing in the omnibox. 261 // Test that the onresize event is dispatched upon typing in the omnibox.
286 IN_PROC_BROWSER_TEST_F(InstantTest, OnResizeEvent) { 262 IN_PROC_BROWSER_TEST_F(InstantTest, OnResizeEvent) {
287 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 263 ASSERT_NO_FATAL_FAILURE(SetupInstant());
264 FocusOmniboxAndWaitForInstantSupport();
265 content::WebContents* overlay = service()->loader()->contents();
288 266
289 FocusOmniboxAndWaitForInstantSupport(); 267 EXPECT_TRUE(UpdateSearchState(overlay));
290
291 EXPECT_TRUE(UpdateSearchState(instant()->GetPreviewContents()));
292 EXPECT_EQ(0, onresizecalls_); 268 EXPECT_EQ(0, onresizecalls_);
293 EXPECT_EQ(0, height_); 269 EXPECT_EQ(0, height_);
294 270
295 // Type a query into the omnibox. This should cause an onresize() event, with 271 // Type a query into the omnibox. This should cause an onresize() event, with
296 // a valid (non-zero) height. 272 // a valid (non-zero) height.
297 SetOmniboxTextAndWaitForInstantToShow("search"); 273 SetOmniboxTextAndWaitForOverlayToShow("search");
274 EXPECT_EQ(overlay, instant()->GetOverlayContents());
298 275
299 EXPECT_TRUE(UpdateSearchState(instant()->GetPreviewContents())); 276 EXPECT_TRUE(UpdateSearchState(overlay));
300 EXPECT_EQ(1, onresizecalls_); 277 EXPECT_EQ(1, onresizecalls_);
301 EXPECT_LT(0, height_); 278 EXPECT_LT(0, height_);
302 } 279 }
303 280
304 // Test that the INSTANT_COMPLETE_NOW behavior works as expected. 281 // Test that the INSTANT_COMPLETE_NOW behavior works as expected.
305 IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionIsCompletedNow) { 282 IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionIsCompletedNow) {
306 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 283 ASSERT_NO_FATAL_FAILURE(SetupInstant());
307 FocusOmniboxAndWaitForInstantSupport(); 284 FocusOmniboxAndWaitForInstantSupport();
308 285
309 // Tell the JS to request the given behavior.
310 EXPECT_TRUE(ExecuteScript("behavior = 'now'"));
311
312 // Type a query, causing the hardcoded "query suggestion" to be returned. 286 // Type a query, causing the hardcoded "query suggestion" to be returned.
313 SetOmniboxTextAndWaitForInstantToShow("query"); 287 SetOmniboxTextAndWaitForOverlayToShow("query");
314 288
315 // Get what's showing in the omnibox, and what's highlighted. 289 // Get what's showing in the omnibox, and what's highlighted.
316 string16 text = omnibox()->GetText(); 290 string16 text = omnibox()->GetText();
317 size_t start = 0, end = 0; 291 size_t start = 0, end = 0;
318 omnibox()->GetSelectionBounds(&start, &end); 292 omnibox()->GetSelectionBounds(&start, &end);
319 if (start > end) 293 if (start > end)
320 std::swap(start, end); 294 std::swap(start, end);
321 295
322 EXPECT_EQ(ASCIIToUTF16("query suggestion"), text); 296 EXPECT_EQ(ASCIIToUTF16("query suggestion"), text);
323 EXPECT_EQ(ASCIIToUTF16(" suggestion"), text.substr(start, end - start)); 297 EXPECT_EQ(ASCIIToUTF16(" suggestion"), text.substr(start, end - start));
324 EXPECT_EQ(ASCIIToUTF16(""), omnibox()->GetInstantSuggestion()); 298 EXPECT_EQ(ASCIIToUTF16(""), omnibox()->GetInstantSuggestion());
325 } 299 }
326 300
327 // Test that the INSTANT_COMPLETE_NEVER behavior works as expected.
328 IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionIsCompletedNever) {
329 ASSERT_NO_FATAL_FAILURE(SetupInstant());
330 FocusOmniboxAndWaitForInstantSupport();
331
332 // Tell the JS to request the given behavior.
333 EXPECT_TRUE(ExecuteScript("behavior = 'never'"));
334
335 // Type a query, causing the hardcoded "query suggestion" to be returned.
336 SetOmniboxTextAndWaitForInstantToShow("query");
337
338 // Get what's showing in the omnibox, and what's highlighted.
339 string16 text = omnibox()->GetText();
340 size_t start = 0, end = 0;
341 omnibox()->GetSelectionBounds(&start, &end);
342 if (start > end)
343 std::swap(start, end);
344
345 EXPECT_EQ(ASCIIToUTF16("query"), text);
346 EXPECT_EQ(ASCIIToUTF16(""), text.substr(start, end - start));
347 EXPECT_EQ(ASCIIToUTF16(" suggestion"), omnibox()->GetInstantSuggestion());
348 }
349
350 // Test that a valid suggestion is accepted. 301 // Test that a valid suggestion is accepted.
351 IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionIsValidObject) { 302 IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionIsValidObject) {
352 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 303 ASSERT_NO_FATAL_FAILURE(SetupInstant());
353 FocusOmniboxAndWaitForInstantSupport(); 304 FocusOmniboxAndWaitForInstantSupport();
354 305
355 // Tell the JS to use the given suggestion. 306 // Tell the JS to use the given suggestion.
356 EXPECT_TRUE(ExecuteScript("suggestion = [ { value: 'query completion' } ]")); 307 EXPECT_TRUE(content::ExecuteScript(service()->loader()->contents(),
308 "suggestion = { suggestions: [ { value: 'query completion' } ] }"));
357 309
358 // Type a query, causing "query completion" to be returned as the suggestion. 310 // Type a query, causing "query completion" to be returned as the suggestion.
359 SetOmniboxTextAndWaitForInstantToShow("query"); 311 SetOmniboxTextAndWaitForOverlayToShow("query");
360 EXPECT_EQ(ASCIIToUTF16("query completion"), omnibox()->GetText()); 312 EXPECT_EQ(ASCIIToUTF16("query completion"), omnibox()->GetText());
361 } 313 }
362 314
363 // Test that an invalid suggestion is rejected. 315 // Test that an invalid suggestion is rejected.
364 IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionIsInvalidObject) { 316 IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionIsInvalidObject) {
365 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 317 ASSERT_NO_FATAL_FAILURE(SetupInstant());
366 FocusOmniboxAndWaitForInstantSupport(); 318 FocusOmniboxAndWaitForInstantSupport();
367 319
368 // Tell the JS to use an object in an invalid format. 320 // Tell the JS to use an object in an invalid format.
369 EXPECT_TRUE(ExecuteScript("suggestion = { value: 'query completion' }")); 321 EXPECT_TRUE(content::ExecuteScript(service()->loader()->contents(),
322 "suggestion = { suggestions: { value: 'query completion' } }"));
370 323
371 // Type a query, but expect no suggestion. 324 // Type a query, but expect no suggestion.
372 SetOmniboxTextAndWaitForInstantToShow("query"); 325 SetOmniboxTextAndWaitForOverlayToShow("query");
373 EXPECT_EQ(ASCIIToUTF16("query"), omnibox()->GetText()); 326 EXPECT_EQ(ASCIIToUTF16("query"), omnibox()->GetText());
374 } 327 }
375 328
376 // Test that various forms of empty suggestions are rejected. 329 // Test that various forms of empty suggestions are rejected.
377 IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionIsEmpty) { 330 IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionIsEmpty) {
378 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 331 ASSERT_NO_FATAL_FAILURE(SetupInstant());
332
379 FocusOmniboxAndWaitForInstantSupport(); 333 FocusOmniboxAndWaitForInstantSupport();
380 334 EXPECT_TRUE(content::ExecuteScript(service()->loader()->contents(),
381 EXPECT_TRUE(ExecuteScript("suggestion = {}")); 335 "suggestion = {}"));
382 SetOmniboxTextAndWaitForInstantToShow("query"); 336 SetOmniboxTextAndWaitForOverlayToShow("query");
383 EXPECT_EQ(ASCIIToUTF16("query"), omnibox()->GetText()); 337 EXPECT_EQ(ASCIIToUTF16("query"), omnibox()->GetText());
384 338
385 omnibox()->RevertAll(); 339 omnibox()->RevertAll();
386 340
387 EXPECT_TRUE(ExecuteScript("suggestion = []")); 341 FocusOmniboxAndWaitForInstantSupport();
388 SetOmniboxTextAndWaitForInstantToShow("query sugg"); 342 EXPECT_TRUE(content::ExecuteScript(service()->loader()->contents(),
343 "suggestion = []"));
344 SetOmniboxTextAndWaitForOverlayToShow("query sugg");
389 EXPECT_EQ(ASCIIToUTF16("query sugg"), omnibox()->GetText()); 345 EXPECT_EQ(ASCIIToUTF16("query sugg"), omnibox()->GetText());
390 346
391 omnibox()->RevertAll(); 347 omnibox()->RevertAll();
392 348
393 EXPECT_TRUE(ExecuteScript("suggestion = [{}]")); 349 FocusOmniboxAndWaitForInstantSupport();
394 SetOmniboxTextAndWaitForInstantToShow("query suggest"); 350 EXPECT_TRUE(content::ExecuteScript(service()->loader()->contents(),
351 "suggestion = [{}]"));
352 SetOmniboxTextAndWaitForOverlayToShow("query suggest");
395 EXPECT_EQ(ASCIIToUTF16("query suggest"), omnibox()->GetText()); 353 EXPECT_EQ(ASCIIToUTF16("query suggest"), omnibox()->GetText());
396 } 354 }
397 355
398 // Test that Instant doesn't process URLs. 356 // Test that Instant doesn't process URLs.
399 IN_PROC_BROWSER_TEST_F(InstantTest, RejectsURLs) { 357 IN_PROC_BROWSER_TEST_F(InstantTest, RejectsURLs) {
400 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 358 ASSERT_NO_FATAL_FAILURE(SetupInstant());
401 FocusOmniboxAndWaitForInstantSupport(); 359 FocusOmniboxAndWaitForInstantSupport();
402 360
403 // Note that we are not actually navigating to these URLs yet. We are just 361 // Note that we are not actually navigating to these URLs yet. We are just
404 // typing them into the omnibox (without pressing Enter) and checking that 362 // typing them into the omnibox (without pressing Enter) and checking that
405 // Instant doesn't try to process them. 363 // Instant doesn't try to process them.
406 SetOmniboxText(chrome::kChromeUICrashURL); 364 SetOmniboxText(chrome::kChromeUICrashURL);
407 EXPECT_FALSE(instant()->IsPreviewingSearchResults()); 365 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
408 EXPECT_TRUE(instant()->model()->mode().is_default());
409 366
410 SetOmniboxText(chrome::kChromeUIHangURL); 367 SetOmniboxText(chrome::kChromeUIHangURL);
411 EXPECT_FALSE(instant()->IsPreviewingSearchResults()); 368 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
412 EXPECT_TRUE(instant()->model()->mode().is_default());
413 369
414 SetOmniboxText(chrome::kChromeUIKillURL); 370 SetOmniboxText(chrome::kChromeUIKillURL);
415 EXPECT_FALSE(instant()->IsPreviewingSearchResults()); 371 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
416 EXPECT_TRUE(instant()->model()->mode().is_default());
417 372
418 // Make sure that the URLs were never sent to the preview page. 373 EXPECT_FALSE(instant()->GetOverlayContents());
419 EXPECT_TRUE(UpdateSearchState(instant()->GetPreviewContents()));
420 EXPECT_EQ("", value_);
421 } 374 }
422 375
423 // Test that Instant doesn't fire for intranet paths that look like searches. 376 // Test that Instant doesn't fire for intranet paths that look like searches.
424 // http://crbug.com/99836 377 // http://crbug.com/99836
425 IN_PROC_BROWSER_TEST_F(InstantTest, IntranetPathLooksLikeSearch) { 378 IN_PROC_BROWSER_TEST_F(InstantTest, IntranetPathLooksLikeSearch) {
426 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 379 ASSERT_NO_FATAL_FAILURE(SetupInstant());
427 380
428 // Navigate to a URL that looks like a search (when the scheme is stripped). 381 // Navigate to a URL that looks like a search (when the scheme is stripped).
429 // It's okay if the host is bogus or the navigation fails, since we only care 382 // It's okay if the host is bogus or the navigation fails, since we only care
430 // that Instant doesn't act on it. 383 // that Instant doesn't act on it.
431 ui_test_utils::NavigateToURL(browser(), GURL("http://baby/beluga")); 384 ui_test_utils::NavigateToURL(browser(), GURL("http://baby/beluga"));
432 EXPECT_EQ(ASCIIToUTF16("baby/beluga"), omnibox()->GetText()); 385 EXPECT_EQ(ASCIIToUTF16("baby/beluga"), omnibox()->GetText());
433 386
434 EXPECT_TRUE(instant()->GetPreviewContents()); 387 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
435 EXPECT_FALSE(instant()->IsPreviewingSearchResults()); 388 EXPECT_FALSE(instant()->GetOverlayContents());
436 EXPECT_TRUE(instant()->model()->mode().is_default());
437 } 389 }
438 390
439 // Test that transitions between searches and non-searches work as expected. 391 // Test that transitions between searches and non-searches work as expected.
440 IN_PROC_BROWSER_TEST_F(InstantTest, TransitionsBetweenSearchAndURL) { 392 IN_PROC_BROWSER_TEST_F(InstantTest, TransitionsBetweenSearchAndURL) {
441 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 393 ASSERT_NO_FATAL_FAILURE(SetupInstant());
442 FocusOmniboxAndWaitForInstantSupport(); 394 FocusOmniboxAndWaitForInstantSupport();
443 395
444 // Type a search, and immediately a URL, without waiting for Instant to show. 396 // Type a search, and immediately a URL, without waiting for Instant to show.
445 // The page is told about the search. Though the page isn't told about the 397 // This should cause the overlay to be discarded.
446 // subsequent URL, it invalidates the search, so a blank query is sent in its
447 // place to indicate that the search is "out of date".
448 SetOmniboxText("query"); 398 SetOmniboxText("query");
399 EXPECT_TRUE(instant()->GetOverlayContents());
400 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
401
449 SetOmniboxText("http://monstrous/nightmare"); 402 SetOmniboxText("http://monstrous/nightmare");
450 int min_onchangecalls = 2; 403 EXPECT_FALSE(instant()->GetOverlayContents());
451 404 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
452 EXPECT_TRUE(UpdateSearchState(instant()->GetPreviewContents()));
453 EXPECT_FALSE(instant()->IsPreviewingSearchResults());
454 EXPECT_TRUE(instant()->model()->mode().is_default());
455 EXPECT_EQ("", value_);
456 EXPECT_LE(min_onchangecalls, onchangecalls_);
457 min_onchangecalls = onchangecalls_;
458 405
459 // Type a search. Instant should show. 406 // Type a search. Instant should show.
460 SetOmniboxTextAndWaitForInstantToShow("search"); 407 FocusOmniboxAndWaitForInstantSupport();
461 ++min_onchangecalls; 408 SetOmniboxTextAndWaitForOverlayToShow("search");
409 EXPECT_TRUE(instant()->IsOverlayingSearchResults());
462 410
463 EXPECT_TRUE(UpdateSearchState(instant()->GetPreviewContents())); 411 EXPECT_TRUE(UpdateSearchState(instant()->GetOverlayContents()));
464 EXPECT_TRUE(instant()->IsPreviewingSearchResults());
465 EXPECT_TRUE(instant()->model()->mode().is_search_suggestions());
466 EXPECT_EQ("search", value_); 412 EXPECT_EQ("search", value_);
467 EXPECT_LE(min_onchangecalls, onchangecalls_);
468 min_onchangecalls = onchangecalls_;
469 413
470 // Type another URL. The preview should be hidden. 414 // Type another URL. The overlay should be hidden.
471 SetOmniboxText("http://terrible/terror"); 415 SetOmniboxText("http://terrible/terror");
472 ++min_onchangecalls; 416 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
473
474 EXPECT_TRUE(UpdateSearchState(instant()->GetPreviewContents()));
475 EXPECT_FALSE(instant()->IsPreviewingSearchResults());
476 EXPECT_TRUE(instant()->model()->mode().is_default());
477 EXPECT_EQ("", value_);
478 EXPECT_LE(min_onchangecalls, onchangecalls_);
479 min_onchangecalls = onchangecalls_;
480 417
481 // Type the same search as before. 418 // Type the same search as before.
482 SetOmniboxTextAndWaitForInstantToShow("search"); 419 FocusOmniboxAndWaitForInstantSupport();
483 min_onchangecalls++; 420 SetOmniboxTextAndWaitForOverlayToShow("search");
484 421 EXPECT_TRUE(instant()->IsOverlayingSearchResults());
485 EXPECT_TRUE(UpdateSearchState(instant()->GetPreviewContents()));
486 EXPECT_TRUE(instant()->IsPreviewingSearchResults());
487 EXPECT_TRUE(instant()->model()->mode().is_search_suggestions());
488 EXPECT_EQ("search", value_);
489 EXPECT_LE(min_onchangecalls, onchangecalls_);
490 min_onchangecalls = onchangecalls_;
491 422
492 // Revert the omnibox. 423 // Revert the omnibox.
493 omnibox()->RevertAll(); 424 omnibox()->RevertAll();
494 min_onchangecalls++; 425 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
495
496 EXPECT_TRUE(UpdateSearchState(instant()->GetPreviewContents()));
497 EXPECT_FALSE(instant()->IsPreviewingSearchResults());
498 EXPECT_TRUE(instant()->model()->mode().is_default());
499 EXPECT_EQ("", value_);
500 EXPECT_LE(min_onchangecalls, onchangecalls_);
501 } 426 }
502 427
503 // Test that Instant can't be fooled into committing a URL. 428 // Test that Instant can't be fooled into committing a URL.
504 IN_PROC_BROWSER_TEST_F(InstantTest, DoesNotCommitURLsOne) { 429 IN_PROC_BROWSER_TEST_F(InstantTest, DoesNotCommitURLsOne) {
505 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 430 ASSERT_NO_FATAL_FAILURE(SetupInstant());
431 FocusOmniboxAndWaitForInstantSupport();
506 EXPECT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 432 EXPECT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
507 433
508 // Type a URL. The Instant preview shouldn't be showing. 434 content::WebContents* overlay = service()->loader()->contents();
435
436 // Type a URL. The Instant overlay shouldn't be showing.
509 SetOmniboxText("http://deadly/nadder"); 437 SetOmniboxText("http://deadly/nadder");
510 EXPECT_FALSE(instant()->IsPreviewingSearchResults()); 438 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
511 EXPECT_TRUE(instant()->model()->mode().is_default());
512 439
513 // Unfocus and refocus the omnibox. 440 // Unfocus and refocus the omnibox.
514 ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER); 441 ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER);
515 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER)); 442 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER));
516 FocusOmnibox(); 443 FocusOmnibox();
517 444
518 content::WebContents* preview_tab = instant()->GetPreviewContents();
519 EXPECT_TRUE(preview_tab);
520
521 // The omnibox text hasn't changed, so Instant still shouldn't be showing. 445 // The omnibox text hasn't changed, so Instant still shouldn't be showing.
522 EXPECT_EQ(ASCIIToUTF16("http://deadly/nadder"), omnibox()->GetText()); 446 EXPECT_EQ(ASCIIToUTF16("http://deadly/nadder"), omnibox()->GetText());
523 EXPECT_FALSE(instant()->IsPreviewingSearchResults()); 447 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
524 EXPECT_TRUE(instant()->model()->mode().is_default());
525 448
526 // Commit the URL. The omnibox should reflect the URL minus the scheme. 449 // Commit the URL. The omnibox should reflect the URL minus the scheme.
527 browser()->window()->GetLocationBar()->AcceptInput(); 450 browser()->window()->GetLocationBar()->AcceptInput();
528 content::WebContents* active_tab = 451 content::WebContents* active_tab =
529 browser()->tab_strip_model()->GetActiveWebContents(); 452 browser()->tab_strip_model()->GetActiveWebContents();
530 EXPECT_NE(preview_tab, active_tab); 453 EXPECT_NE(overlay, active_tab);
531 EXPECT_EQ(ASCIIToUTF16("deadly/nadder"), omnibox()->GetText()); 454 EXPECT_EQ(ASCIIToUTF16("deadly/nadder"), omnibox()->GetText());
532 455
533 // Instant shouldn't have done anything. 456 // Instant shouldn't have done anything.
534 EXPECT_EQ(preview_tab, instant()->GetPreviewContents()); 457 EXPECT_EQ(overlay, service()->loader()->contents());
535 EXPECT_FALSE(instant()->IsPreviewingSearchResults()); 458 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
536 EXPECT_TRUE(instant()->model()->mode().is_default());
537 } 459 }
538 460
539 // Test that Instant can't be fooled into committing a URL. 461 // Test that Instant can't be fooled into committing a URL.
540 IN_PROC_BROWSER_TEST_F(InstantTest, DoesNotCommitURLsTwo) { 462 IN_PROC_BROWSER_TEST_F(InstantTest, DoesNotCommitURLsTwo) {
541 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 463 ASSERT_NO_FATAL_FAILURE(SetupInstant());
542 FocusOmniboxAndWaitForInstantSupport(); 464 FocusOmniboxAndWaitForInstantSupport();
543 465
544 // Type a query. This causes the preview to be shown. 466 // Type a query. This causes the overlay to be shown.
545 SetOmniboxTextAndWaitForInstantToShow("query"); 467 SetOmniboxTextAndWaitForOverlayToShow("query");
546 468
547 content::WebContents* preview_tab = instant()->GetPreviewContents(); 469 content::WebContents* overlay = instant()->GetOverlayContents();
548 EXPECT_TRUE(preview_tab);
549 470
550 // Type a URL. This causes the preview to be hidden. 471 // Type a URL. This causes the overlay to be hidden.
551 SetOmniboxText("http://hideous/zippleback"); 472 SetOmniboxText("http://hideous/zippleback");
552 EXPECT_FALSE(instant()->IsPreviewingSearchResults()); 473 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
553 EXPECT_TRUE(instant()->model()->mode().is_default());
554 474
555 // Pretend the omnibox got focus. It already had focus, so we are just trying 475 // Pretend the omnibox got focus. It already had focus, so we are just trying
556 // to tickle a different code path. 476 // to tickle a different code path.
557 instant()->OmniboxFocusChanged(OMNIBOX_FOCUS_VISIBLE, 477 instant()->OmniboxFocusChanged(OMNIBOX_FOCUS_VISIBLE,
558 OMNIBOX_FOCUS_CHANGE_EXPLICIT, NULL); 478 OMNIBOX_FOCUS_CHANGE_EXPLICIT, NULL);
559 479
560 // Commit the URL. As before, check that Instant wasn't committed. 480 // Commit the URL. As before, check that Instant wasn't committed.
561 browser()->window()->GetLocationBar()->AcceptInput(); 481 browser()->window()->GetLocationBar()->AcceptInput();
562 content::WebContents* active_tab = 482 content::WebContents* active_tab =
563 browser()->tab_strip_model()->GetActiveWebContents(); 483 browser()->tab_strip_model()->GetActiveWebContents();
564 EXPECT_NE(preview_tab, active_tab); 484 EXPECT_NE(overlay, active_tab);
565 EXPECT_EQ(ASCIIToUTF16("hideous/zippleback"), omnibox()->GetText()); 485 EXPECT_EQ(ASCIIToUTF16("hideous/zippleback"), omnibox()->GetText());
566 486
567 // As before, Instant shouldn't have done anything. 487 // As before, Instant shouldn't have done anything.
568 EXPECT_EQ(preview_tab, instant()->GetPreviewContents()); 488 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
569 EXPECT_FALSE(instant()->IsPreviewingSearchResults());
570 EXPECT_TRUE(instant()->model()->mode().is_default());
571 } 489 }
572 490
573 // Test that a non-Instant search provider shows no previews. 491 // Test that a non-Instant search provider shows no overlays.
574 IN_PROC_BROWSER_TEST_F(InstantTest, NonInstantSearchProvider) { 492 IN_PROC_BROWSER_TEST_F(InstantTest, NonInstantSearchProvider) {
575 instant_url_ = test_server()->GetURL("files/empty.html"); 493 set_instant_url(test_server()->GetURL("files/empty.html"));
576 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 494 ASSERT_NO_FATAL_FAILURE(SetupInstant());
577 495
578 // Focus the omnibox. When the support determination response comes back, 496 // Focus the omnibox. When the support determination response comes back,
579 // Instant will destroy the non-Instant page, and attempt to recreate it. 497 // Instant will destroy the non-Instant page.
580 // We can know this happened by looking at the blacklist. 498 FocusOmnibox();
581 EXPECT_EQ(0, instant()->blacklisted_urls_[instant_url_.spec()]); 499 EXPECT_TRUE(service()->loader()->contents());
500
582 FocusOmniboxAndWaitForInstantSupport(); 501 FocusOmniboxAndWaitForInstantSupport();
583 EXPECT_EQ(1, instant()->blacklisted_urls_[instant_url_.spec()]); 502 EXPECT_FALSE(service()->loader()->contents());
584 } 503 }
585 504
586 // Test that the renderer doesn't crash if JavaScript is blocked. 505 // Test that the renderer doesn't crash if JavaScript is blocked.
587 IN_PROC_BROWSER_TEST_F(InstantTest, NoCrashOnBlockedJS) { 506 IN_PROC_BROWSER_TEST_F(InstantTest, NoCrashOnBlockedJS) {
588 browser()->profile()->GetHostContentSettingsMap()->SetDefaultContentSetting( 507 browser()->profile()->GetHostContentSettingsMap()->SetDefaultContentSetting(
589 CONTENT_SETTINGS_TYPE_JAVASCRIPT, CONTENT_SETTING_BLOCK); 508 CONTENT_SETTINGS_TYPE_JAVASCRIPT, CONTENT_SETTING_BLOCK);
590 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 509 ASSERT_NO_FATAL_FAILURE(SetupInstant());
591 510
592 // Wait for notification that the Instant API has been determined. As long as 511 // Wait for notification that the Instant API has been determined. As long as
593 // we get the notification we're good (the renderer didn't crash). 512 // we get the notification we're good (the renderer didn't crash).
594 FocusOmniboxAndWaitForInstantSupport(); 513 FocusOmniboxAndWaitForInstantSupport();
514 EXPECT_FALSE(service()->loader()->contents());
595 } 515 }
596 516
597 // Test that the preview and active tab's visibility states are set correctly. 517 // Test that the overlay and active tab's visibility states are set correctly.
598 IN_PROC_BROWSER_TEST_F(InstantTest, PageVisibility) { 518 IN_PROC_BROWSER_TEST_F(InstantTest, PageVisibility) {
599 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 519 ASSERT_NO_FATAL_FAILURE(SetupInstant());
600 FocusOmniboxAndWaitForInstantSupport(); 520 FocusOmniboxAndWaitForInstantSupport();
601 521
602 content::WebContents* active_tab = 522 content::WebContents* active_tab =
603 browser()->tab_strip_model()->GetActiveWebContents(); 523 browser()->tab_strip_model()->GetActiveWebContents();
604 content::WebContents* preview_tab = instant()->GetPreviewContents(); 524 content::WebContents* overlay = service()->loader()->contents();
605 525
606 // Inititally, the active tab is showing; the preview is not. 526 // Inititally, the active tab is showing; the overlay is not.
607 EXPECT_TRUE(CheckVisibilityIs(active_tab, true)); 527 EXPECT_TRUE(CheckVisibilityIs(active_tab, true));
608 EXPECT_TRUE(CheckVisibilityIs(preview_tab, false)); 528 EXPECT_TRUE(CheckVisibilityIs(overlay, false));
609 529
610 // Type a query and wait for Instant to show. 530 // Type a query and wait for Instant to show.
611 SetOmniboxTextAndWaitForInstantToShow("query"); 531 SetOmniboxTextAndWaitForOverlayToShow("query");
612 EXPECT_TRUE(CheckVisibilityIs(active_tab, true)); 532 EXPECT_TRUE(CheckVisibilityIs(active_tab, true));
613 EXPECT_TRUE(CheckVisibilityIs(preview_tab, true)); 533 EXPECT_TRUE(CheckVisibilityIs(overlay, true));
614 534
615 // Deleting the omnibox text should hide the preview. 535 // Deleting the omnibox text should hide the overlay.
616 SetOmniboxText(""); 536 SetOmniboxText("");
617 EXPECT_TRUE(CheckVisibilityIs(active_tab, true)); 537 EXPECT_TRUE(CheckVisibilityIs(active_tab, true));
618 EXPECT_TRUE(CheckVisibilityIs(preview_tab, false)); 538 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
619 539
620 // Typing a query should show the preview again. 540 // Typing a query should show the overlay again.
621 SetOmniboxTextAndWaitForInstantToShow("query"); 541 FocusOmniboxAndWaitForInstantSupport();
542 overlay = service()->loader()->contents();
543
544 SetOmniboxTextAndWaitForOverlayToShow("query");
622 EXPECT_TRUE(CheckVisibilityIs(active_tab, true)); 545 EXPECT_TRUE(CheckVisibilityIs(active_tab, true));
623 EXPECT_TRUE(CheckVisibilityIs(preview_tab, true)); 546 EXPECT_TRUE(CheckVisibilityIs(overlay, true));
624 547
625 // Commit the preview. 548 // Commit the overlay.
626 browser()->window()->GetLocationBar()->AcceptInput(); 549 browser()->window()->GetLocationBar()->AcceptInput();
627 EXPECT_EQ(preview_tab, browser()->tab_strip_model()->GetActiveWebContents()); 550 EXPECT_EQ(overlay, browser()->tab_strip_model()->GetActiveWebContents());
628 EXPECT_TRUE(CheckVisibilityIs(preview_tab, true)); 551 EXPECT_TRUE(CheckVisibilityIs(overlay, true));
629 } 552 }
630 553
631 // Test that the task manager identifies Instant's preview tab correctly. 554 // Test that the task manager identifies Instant's overlay tab correctly.
632 IN_PROC_BROWSER_TEST_F(InstantTest, TaskManagerPrefix) { 555 IN_PROC_BROWSER_TEST_F(InstantTest, TaskManagerPrefix) {
633 // The browser starts with a new tab, so there's just one renderer initially. 556 // The browser starts with a new tab, so there's just one renderer initially.
634 TaskManagerModel* task_manager = TaskManager::GetInstance()->model(); 557 TaskManagerModel* task_manager = TaskManager::GetInstance()->model();
635 task_manager->StartUpdating(); 558 task_manager->StartUpdating();
636 TaskManagerBrowserTestUtil::WaitForWebResourceChange(1); 559 TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
637 560
638 string16 prefix = l10n_util::GetStringFUTF16( 561 string16 prefix = l10n_util::GetStringFUTF16(
639 IDS_TASK_MANAGER_INSTANT_PREVIEW_PREFIX, string16()); 562 IDS_TASK_MANAGER_INSTANT_OVERLAY_PREFIX, string16());
640 563
641 // There should be no Instant preview yet. 564 // There should be no Instant overlay yet.
642 for (int i = 0; i < task_manager->ResourceCount(); ++i) { 565 for (int i = 0; i < task_manager->ResourceCount(); ++i) {
643 string16 title = task_manager->GetResourceTitle(i); 566 string16 title = task_manager->GetResourceTitle(i);
644 EXPECT_FALSE(StartsWith(title, prefix, true)) << title << " vs " << prefix; 567 EXPECT_FALSE(StartsWith(title, prefix, true)) << title << " vs " << prefix;
645 } 568 }
646 569
647 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 570 ASSERT_NO_FATAL_FAILURE(SetupInstant());
648 FocusOmnibox(); 571 FocusOmniboxAndWaitForInstantSupport();
572 content::WebContents* overlay = service()->loader()->contents();
649 573
650 // Now there should be two renderers, the second being the Instant preview. 574 // Now there should be two renderers, the second being the Instant overlay.
651 TaskManagerBrowserTestUtil::WaitForWebResourceChange(2); 575 TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
652 576
653 int instant_previews = 0; 577 int instant_overlays = 0;
654 for (int i = 0; i < task_manager->ResourceCount(); ++i) { 578 for (int i = 0; i < task_manager->ResourceCount(); ++i) {
655 string16 title = task_manager->GetResourceTitle(i); 579 string16 title = task_manager->GetResourceTitle(i);
656 if (StartsWith(title, prefix, true)) 580 if (StartsWith(title, prefix, true))
657 ++instant_previews; 581 ++instant_overlays;
658 } 582 }
659 EXPECT_EQ(1, instant_previews); 583 EXPECT_EQ(1, instant_overlays);
584
585 // Type something into the omnibox. This causes the overlay to be shown and
586 // another Instant page to be spun up in the background.
587 SetOmniboxTextAndWaitForOverlayToShow("query");
588
589 // So now there are three renderers, two of which are Instant.
590 TaskManagerBrowserTestUtil::WaitForWebResourceChange(3);
591
592 instant_overlays = 0;
593 for (int i = 0; i < task_manager->ResourceCount(); ++i) {
594 string16 title = task_manager->GetResourceTitle(i);
595 if (StartsWith(title, prefix, true))
596 ++instant_overlays;
597 }
598 EXPECT_EQ(2, instant_overlays);
599
600 // Commit the overlay. It should now be considered a regular tab.
601 browser()->window()->GetLocationBar()->AcceptInput();
602
603 // The task manager caches titles, so we need to force the cache to clear.
604 task_manager->StopUpdating();
605 task_manager->StartUpdating();
606
607 int overlay_index = -1;
608 instant_overlays = 0;
609 for (int i = 0; i < task_manager->ResourceCount(); ++i) {
610 string16 title = task_manager->GetResourceTitle(i);
611 if (StartsWith(title, prefix, true))
612 ++instant_overlays;
613 if (task_manager->GetResourceWebContents(i) == overlay)
614 overlay_index = i;
615 }
616 EXPECT_EQ(1, instant_overlays);
617
618 // We should've found the overlay (which is now a committed tab).
619 EXPECT_LE(0, overlay_index);
620 string16 title = task_manager->GetResourceTitle(overlay_index);
621 EXPECT_FALSE(StartsWith(title, prefix, true)) << title << " vs " << prefix;
660 } 622 }
661 623
662 void HistoryQueryDone(base::RunLoop* run_loop, 624 void HistoryQueryDone(base::RunLoop* run_loop,
663 bool* result, 625 bool* result,
664 HistoryService::Handle /* handle */, 626 HistoryService::Handle /* handle */,
665 bool success, 627 bool success,
666 const history::URLRow* /* urlrow */, 628 const history::URLRow* /* urlrow */,
667 history::VisitVector* /* visitvector */) { 629 history::VisitVector* /* visitvector */) {
668 *result = success; 630 *result = success;
669 run_loop->Quit(); 631 run_loop->Quit();
(...skipping 19 matching lines...) Expand all
689 // |instant_url| is the URL Instant loads. |search_url| is the fake URL we 651 // |instant_url| is the URL Instant loads. |search_url| is the fake URL we
690 // enter into history for search terms extraction to work correctly. 652 // enter into history for search terms extraction to work correctly.
691 std::string search_url = template_url->url_ref().ReplaceSearchTerms( 653 std::string search_url = template_url->url_ref().ReplaceSearchTerms(
692 TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("search"))); 654 TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("search")));
693 655
694 HistoryService* history = HistoryServiceFactory::GetForProfile( 656 HistoryService* history = HistoryServiceFactory::GetForProfile(
695 browser()->profile(), Profile::EXPLICIT_ACCESS); 657 browser()->profile(), Profile::EXPLICIT_ACCESS);
696 ui_test_utils::WaitForHistoryToLoad(history); 658 ui_test_utils::WaitForHistoryToLoad(history);
697 659
698 // Perform a search. 660 // Perform a search.
699 SetOmniboxTextAndWaitForInstantToShow("search"); 661 SetOmniboxTextAndWaitForOverlayToShow("search");
700 662
701 // Commit the search. 663 // Commit the search.
702 browser()->window()->GetLocationBar()->AcceptInput(); 664 browser()->window()->GetLocationBar()->AcceptInput();
703 665
704 bool found = false; 666 bool found = false;
705 CancelableRequestConsumer consumer; 667 CancelableRequestConsumer consumer;
706 668
707 // The fake search URL should be in history. 669 // The fake search URL should be in history.
708 base::RunLoop run_loop1; 670 base::RunLoop run_loop1;
709 history->QueryURL(GURL(search_url), false, &consumer, 671 history->QueryURL(GURL(search_url), false, &consumer,
710 base::Bind(&HistoryQueryDone, &run_loop1, &found)); 672 base::Bind(&HistoryQueryDone, &run_loop1, &found));
711 run_loop1.Run(); 673 run_loop1.Run();
712 EXPECT_TRUE(found); 674 EXPECT_TRUE(found);
713 675
714 // The Instant URL should not be in history. 676 // The Instant URL should not be in history.
715 base::RunLoop run_loop2; 677 base::RunLoop run_loop2;
716 history->QueryURL(instant_url_, false, &consumer, 678 history->QueryURL(instant_url(), false, &consumer,
717 base::Bind(&HistoryQueryDone, &run_loop2, &found)); 679 base::Bind(&HistoryQueryDone, &run_loop2, &found));
718 run_loop2.Run(); 680 run_loop2.Run();
719 EXPECT_FALSE(found); 681 EXPECT_FALSE(found);
720 682
721 // The search terms should have been extracted into history. 683 // The search terms should have been extracted into history.
722 base::RunLoop run_loop3; 684 base::RunLoop run_loop3;
723 std::vector<string16> queries; 685 std::vector<string16> queries;
724 history->GetMostRecentKeywordSearchTerms(template_url->id(), 686 history->GetMostRecentKeywordSearchTerms(template_url->id(),
725 ASCIIToUTF16("s"), 1, &consumer, 687 ASCIIToUTF16("s"), 1, &consumer,
726 base::Bind(&KeywordQueryDone, &run_loop3, &queries)); 688 base::Bind(&KeywordQueryDone, &run_loop3, &queries));
727 run_loop3.Run(); 689 run_loop3.Run();
728 ASSERT_TRUE(queries.size()); 690 ASSERT_TRUE(queries.size());
729 EXPECT_EQ(ASCIIToUTF16("search"), queries[0]); 691 EXPECT_EQ(ASCIIToUTF16("search"), queries[0]);
730 } 692 }
731 693
732 // TODO(jered): Fix this test on Mac. It fails currently, but the behavior is 694 // Test that creating a new window hides any currently showing Instant overlay.
733 // actually closer to what we'd like. 695 IN_PROC_BROWSER_TEST_F(InstantTest, NewWindowDismissesInstant) {
734 #if defined(OS_MACOSX)
735 #define MAYBE_NewWindowDismissesInstant DISABLED_NewWindowDismissesInstant
736 #else
737 #define MAYBE_NewWindowDismissesInstant NewWindowDismissesInstant
738 #endif
739 // Test that creating a new window hides any currently showing Instant preview.
740 IN_PROC_BROWSER_TEST_F(InstantTest, MAYBE_NewWindowDismissesInstant) {
741 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 696 ASSERT_NO_FATAL_FAILURE(SetupInstant());
742 EXPECT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 697 EXPECT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
743 FocusOmniboxAndWaitForInstantSupport(); 698 FocusOmniboxAndWaitForInstantSupport();
744 SetOmniboxTextAndWaitForInstantToShow("search"); 699 SetOmniboxTextAndWaitForOverlayToShow("search");
745 700
746 Browser* previous_window = browser(); 701 Browser* previous_window = browser();
747 EXPECT_TRUE(instant()->IsPreviewingSearchResults()); 702 EXPECT_TRUE(instant()->IsOverlayingSearchResults());
748 EXPECT_TRUE(instant()->model()->mode().is_search_suggestions());
749 703
750 InstantTestModelObserver observer(instant()->model(),
751 chrome::search::Mode::MODE_DEFAULT);
752 chrome::NewEmptyWindow(browser()->profile(), 704 chrome::NewEmptyWindow(browser()->profile(),
753 chrome::HOST_DESKTOP_TYPE_NATIVE); 705 chrome::HOST_DESKTOP_TYPE_NATIVE);
754 observer.WaitUntilDesiredPreviewState();
755 706
756 // Even though we just created a new Browser object (for the new window), the 707 // Even though we just created a new Browser object (for the new window), the
757 // browser() accessor should still give us the first window's Browser object. 708 // browser() accessor should still give us the first window's Browser object.
758 EXPECT_EQ(previous_window, browser()); 709 EXPECT_EQ(previous_window, browser());
759 EXPECT_FALSE(instant()->IsPreviewingSearchResults()); 710 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
760 EXPECT_TRUE(instant()->model()->mode().is_default());
761 } 711 }
762 712
763 // Test that the Instant overlay is recreated when all these conditions are met: 713 // Test that the Instant overlay is recreated when the stale page timer fires.
764 // - The stale overlay timer has fired. 714 IN_PROC_BROWSER_TEST_F(InstantTest, InstantLoaderRefresh) {
765 // - The preview is not showing.
766 // - The omnibox doesn't have focus.
767 IN_PROC_BROWSER_TEST_F(InstantTest, InstantOverlayRefresh) {
768 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 715 ASSERT_NO_FATAL_FAILURE(SetupInstant());
769 FocusOmniboxAndWaitForInstantSupport(); 716 FocusOmniboxAndWaitForInstantSupport();
770 717
771 // The preview is refreshed only after all three conditions above are met. 718 // The timer should be running, with a non-zero delay.
772 SetOmniboxTextAndWaitForInstantToShow("query"); 719 base::Timer* timer = &service()->loader()->stale_page_timer_;
773 instant()->overlay_->is_stale_ = true; 720 EXPECT_TRUE(service()->loader()->supports_instant());
774 instant()->ReloadOverlayIfStale(); 721 EXPECT_TRUE(timer->IsRunning());
775 EXPECT_TRUE(instant()->overlay_->supports_instant()); 722 EXPECT_LT(base::TimeDelta(), timer->GetCurrentDelay());
776 instant()->HideOverlay();
777 EXPECT_TRUE(instant()->overlay_->supports_instant());
778 instant()->OmniboxFocusChanged(OMNIBOX_FOCUS_NONE,
779 OMNIBOX_FOCUS_CHANGE_EXPLICIT, NULL);
780 EXPECT_FALSE(instant()->overlay_->supports_instant());
781 723
782 // Try with a different ordering. 724 // Restart the timer at zero delay, and wait for it to fire.
783 SetOmniboxTextAndWaitForInstantToShow("query"); 725 timer->Start(FROM_HERE, base::TimeDelta(), timer->user_task());
784 instant()->overlay_->is_stale_ = true; 726 EXPECT_EQ(base::TimeDelta(), timer->GetCurrentDelay());
785 instant()->ReloadOverlayIfStale(); 727 content::RunAllPendingInMessageLoop();
786 EXPECT_TRUE(instant()->overlay_->supports_instant()); 728
787 instant()->OmniboxFocusChanged(OMNIBOX_FOCUS_NONE, 729 // The overlay was deleted and recreated, so its Instant support hasn't been
788 OMNIBOX_FOCUS_CHANGE_EXPLICIT, NULL); 730 // determined yet. The timer would've been reset as usual.
789 // TODO(sreeram): Currently, OmniboxLostFocus() calls HideOverlay(). When it 731 EXPECT_FALSE(service()->loader()->supports_instant());
790 // stops hiding the preview eventually, uncomment these two lines: 732 EXPECT_TRUE(timer->IsRunning());
791 // EXPECT_TRUE(instant()->overlay_->supports_instant()); 733 EXPECT_LT(base::TimeDelta(), timer->GetCurrentDelay());
792 // instant()->HideOverlay();
793 EXPECT_FALSE(instant()->overlay_->supports_instant());
794 } 734 }
795 735
796 // Test that suggestions are case insensitive. http://crbug.com/150728 736 // Test that suggestions are case insensitive. http://crbug.com/150728
797 IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionsAreCaseInsensitive) { 737 IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionsAreCaseInsensitiveOne) {
738 ASSERT_NO_FATAL_FAILURE(SetupInstant());
739
740 const std::string script =
741 "suggestion = { suggestions: [ { value: 'INSTANT' } ] }";
742
743 const struct {
744 const char* const user_text;
745 const string16 omnibox_text;
746 } kTestCases[] = {
747 {"in", ASCIIToUTF16("instant")},
748 {"IN", ASCIIToUTF16("INSTANT")},
749 };
750
751 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) {
752 FocusOmniboxAndWaitForInstantSupport();
753 EXPECT_TRUE(content::ExecuteScript(service()->loader()->contents(),
754 script));
755 SetOmniboxTextAndWaitForOverlayToShow(kTestCases[i].user_text);
756 EXPECT_EQ(kTestCases[i].omnibox_text, omnibox()->GetText());
757 omnibox()->RevertAll();
758 }
759 }
760
761 // Test that suggestions are case insensitive. http://crbug.com/150728
762 IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionsAreCaseInsensitiveTwo) {
763 ASSERT_NO_FATAL_FAILURE(SetupInstant());
764
765 // U+0130 == LATIN CAPITAL LETTER I WITH DOT ABOVE
766 const std::string script =
767 "suggestion = { suggestions: [ { value: '\\u0130NSTANT' } ] }";
768
769 const struct {
770 const std::string user_text;
771 const string16 omnibox_text;
772 } kTestCases[] = {
773 {std::string("i"), WideToUTF16(L"i\u0307nstant")},
774 {std::string("I"), WideToUTF16(L"I\u0307nstant")},
775 {WideToUTF8(L"i\u0307"), WideToUTF16(L"i\u0307nstant")},
776 {WideToUTF8(L"I\u0307"), WideToUTF16(L"I\u0307nstant")},
777 {WideToUTF8(L"\u0130"), WideToUTF16(L"\u0130NSTANT")},
778 {std::string("in"), ASCIIToUTF16("in")},
779 {std::string("IN"), ASCIIToUTF16("IN")},
780 };
781
782 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) {
783 FocusOmniboxAndWaitForInstantSupport();
784 EXPECT_TRUE(content::ExecuteScript(service()->loader()->contents(),
785 script));
786 SetOmniboxTextAndWaitForOverlayToShow(kTestCases[i].user_text);
787 EXPECT_EQ(kTestCases[i].omnibox_text, omnibox()->GetText());
788 omnibox()->RevertAll();
789 }
790 }
791
792 // Test that suggestions are case insensitive. http://crbug.com/150728
793 IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionsAreCaseInsensitiveThree) {
798 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 794 ASSERT_NO_FATAL_FAILURE(SetupInstant());
799 FocusOmniboxAndWaitForInstantSupport(); 795 FocusOmniboxAndWaitForInstantSupport();
800 796
801 EXPECT_TRUE(ExecuteScript("suggestion = [ { value: 'INSTANT' } ]"));
802
803 SetOmniboxTextAndWaitForInstantToShow("in");
804 EXPECT_EQ(ASCIIToUTF16("instant"), omnibox()->GetText());
805
806 omnibox()->RevertAll();
807 SetOmniboxTextAndWaitForInstantToShow("IN");
808 EXPECT_EQ(ASCIIToUTF16("INSTANT"), omnibox()->GetText());
809
810 // U+0130 == LATIN CAPITAL LETTER I WITH DOT ABOVE
811 EXPECT_TRUE(ExecuteScript("suggestion = [ { value: '\\u0130NSTANT' } ]"));
812
813 omnibox()->RevertAll();
814 SetOmniboxTextAndWaitForInstantToShow("i");
815 EXPECT_EQ(WideToUTF16(L"i\u0307nstant"), omnibox()->GetText());
816
817 omnibox()->RevertAll();
818 SetOmniboxTextAndWaitForInstantToShow("I");
819 EXPECT_EQ(WideToUTF16(L"I\u0307nstant"), omnibox()->GetText());
820
821 omnibox()->RevertAll();
822 SetOmniboxTextAndWaitForInstantToShow(WideToUTF8(L"i\u0307"));
823 EXPECT_EQ(WideToUTF16(L"i\u0307nstant"), omnibox()->GetText());
824
825 omnibox()->RevertAll();
826 SetOmniboxTextAndWaitForInstantToShow(WideToUTF8(L"I\u0307"));
827 EXPECT_EQ(WideToUTF16(L"I\u0307nstant"), omnibox()->GetText());
828
829 omnibox()->RevertAll();
830 SetOmniboxTextAndWaitForInstantToShow(WideToUTF8(L"\u0130"));
831 EXPECT_EQ(WideToUTF16(L"\u0130NSTANT"), omnibox()->GetText());
832
833 omnibox()->RevertAll();
834 SetOmniboxTextAndWaitForInstantToShow("in");
835 EXPECT_EQ(ASCIIToUTF16("in"), omnibox()->GetText());
836
837 omnibox()->RevertAll();
838 SetOmniboxTextAndWaitForInstantToShow("IN");
839 EXPECT_EQ(ASCIIToUTF16("IN"), omnibox()->GetText());
840
841 // Check that a d with a dot above and below it is completed regardless of 797 // Check that a d with a dot above and below it is completed regardless of
842 // how that is encoded. 798 // how that is encoded.
843 // U+1E0D = LATIN SMALL LETTER D WITH DOT BELOW 799 // U+1E0D = LATIN SMALL LETTER D WITH DOT BELOW
844 // U+1E0B = LATIN SMALL LETTER D WITH DOT ABOVE 800 // U+1E0B = LATIN SMALL LETTER D WITH DOT ABOVE
845 EXPECT_TRUE(ExecuteScript("suggestion = [ { value: '\\u1e0d\\u0307oh' } ]")); 801 EXPECT_TRUE(content::ExecuteScript(service()->loader()->contents(),
846 802 "suggestion = { suggestions: [ { value: '\\u1e0d\\u0307oh' } ] }"));
847 omnibox()->RevertAll(); 803 SetOmniboxTextAndWaitForOverlayToShow(WideToUTF8(L"\u1e0b\u0323"));
848 SetOmniboxTextAndWaitForInstantToShow(WideToUTF8(L"\u1e0b\u0323"));
849 EXPECT_EQ(WideToUTF16(L"\u1e0b\u0323oh"), omnibox()->GetText()); 804 EXPECT_EQ(WideToUTF16(L"\u1e0b\u0323oh"), omnibox()->GetText());
850 } 805 }
851 806
852 // Flakes on Windows and Mac: http://crbug.com/170677 807 // Test that the overlay can be committed onto a new tab.
853 #if defined(OS_WIN) || defined(OS_MACOSX) 808 IN_PROC_BROWSER_TEST_F(InstantTest, CommitInNewTab) {
854 #define MAYBE_CommitInNewTab DISABLED_CommitInNewTab
855 #else
856 #define MAYBE_CommitInNewTab CommitInNewTab
857 #endif
858 // Test that the preview can be committed onto a new tab.
859 IN_PROC_BROWSER_TEST_F(InstantTest, MAYBE_CommitInNewTab) {
860 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 809 ASSERT_NO_FATAL_FAILURE(SetupInstant());
861 FocusOmniboxAndWaitForInstantSupport(); 810 FocusOmniboxAndWaitForInstantSupport();
862 811
863 // Use the Instant page as the active tab, so we can exploit its visibility 812 // Use the Instant page as the active tab, so we can exploit its visibility
864 // handler to check visibility transitions. 813 // handler to check visibility transitions.
865 ui_test_utils::NavigateToURL(browser(), instant_url_); 814 EXPECT_EQ(1, browser()->tab_strip_model()->count());
815 ui_test_utils::NavigateToURL(browser(), instant_url());
866 content::WebContents* active_tab = 816 content::WebContents* active_tab =
867 browser()->tab_strip_model()->GetActiveWebContents(); 817 browser()->tab_strip_model()->GetActiveWebContents();
868 818
869 int active_tab_onvisibilitycalls = -1; 819 int active_tab_onvisibilitycalls = -1;
870 EXPECT_TRUE(GetIntFromJS(active_tab, "onvisibilitycalls", 820 EXPECT_TRUE(GetIntFromJS(active_tab, "onvisibilitycalls",
871 &active_tab_onvisibilitycalls)); 821 &active_tab_onvisibilitycalls));
872 EXPECT_EQ(0, active_tab_onvisibilitycalls); 822 EXPECT_EQ(0, active_tab_onvisibilitycalls);
873 823
874 SetOmniboxTextAndWaitForInstantToShow("search"); 824 SetOmniboxTextAndWaitForOverlayToShow("search");
875 825
876 // Stash a reference to the preview, so we can refer to it after commit. 826 // Stash a reference to the overlay, so we can refer to it after commit.
877 content::WebContents* preview_tab = instant()->GetPreviewContents(); 827 content::WebContents* overlay = instant()->GetOverlayContents();
878 EXPECT_TRUE(preview_tab); 828 EXPECT_TRUE(overlay);
879 829
880 // The state of the searchbox before the commit. 830 // The state of the searchbox before the commit.
881 EXPECT_TRUE(UpdateSearchState(preview_tab)); 831 EXPECT_TRUE(UpdateSearchState(overlay));
882 EXPECT_EQ("search", value_); 832 EXPECT_EQ("search", value_);
883 EXPECT_FALSE(verbatim_); 833 EXPECT_FALSE(verbatim_);
884 EXPECT_EQ(0, onsubmitcalls_); 834 EXPECT_EQ(0, onsubmitcalls_);
885 EXPECT_EQ(1, onvisibilitycalls_); 835 EXPECT_EQ(1, onvisibilitycalls_);
886 836
887 // The state of the active tab before the commit. 837 // The state of the active tab before the commit.
888 EXPECT_NE(preview_tab, active_tab); 838 EXPECT_NE(overlay, active_tab);
889 EXPECT_EQ(2, active_tab->GetController().GetEntryCount()); 839 EXPECT_EQ(2, active_tab->GetController().GetEntryCount());
890 EXPECT_EQ(instant_url_, omnibox()->model()->PermanentURL()); 840 EXPECT_EQ(instant_url(), omnibox()->model()->PermanentURL());
891 active_tab_onvisibilitycalls = -1; 841 active_tab_onvisibilitycalls = -1;
892 EXPECT_TRUE(GetIntFromJS(active_tab, "onvisibilitycalls", 842 EXPECT_TRUE(GetIntFromJS(active_tab, "onvisibilitycalls",
893 &active_tab_onvisibilitycalls)); 843 &active_tab_onvisibilitycalls));
894 EXPECT_EQ(0, active_tab_onvisibilitycalls); 844 EXPECT_EQ(0, active_tab_onvisibilitycalls);
895 845
896 // Commit the search by pressing Alt-Enter. 846 // Commit the search by pressing Alt-Enter.
897 omnibox()->model()->AcceptInput(NEW_FOREGROUND_TAB, false); 847 omnibox()->model()->AcceptInput(NEW_FOREGROUND_TAB, false);
898 848
899 // After the commit, Instant should not be showing. 849 // After the commit, Instant should not be showing.
900 EXPECT_FALSE(instant()->IsPreviewingSearchResults()); 850 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
901 EXPECT_TRUE(instant()->model()->mode().is_default());
902
903 // The old overlay is deleted and a new one is created.
904 EXPECT_TRUE(instant()->GetPreviewContents());
905 EXPECT_NE(instant()->GetPreviewContents(), preview_tab);
906 851
907 // Check that we have two tabs and that the new active tab is indeed what was 852 // Check that we have two tabs and that the new active tab is indeed what was
908 // once the preview. The preview tab should have just one navigation entry, 853 // once the overlay. The overlay tab should have just one navigation entry,
909 // for the Instant search that was committed. 854 // for the Instant search that was committed.
910 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 855 EXPECT_EQ(2, browser()->tab_strip_model()->count());
911 EXPECT_EQ(preview_tab, browser()->tab_strip_model()->GetActiveWebContents()); 856 EXPECT_EQ(overlay, browser()->tab_strip_model()->GetActiveWebContents());
912 EXPECT_EQ(1, preview_tab->GetController().GetEntryCount()); 857 EXPECT_EQ(1, overlay->GetController().GetEntryCount());
913 858
914 // Check that the omnibox contains the Instant URL we loaded. 859 // Check that the omnibox contains the Instant URL we loaded.
915 EXPECT_EQ(instant_url_, omnibox()->model()->PermanentURL()); 860 EXPECT_EQ(instant_url(), omnibox()->model()->PermanentURL());
916 861
917 // Check that the searchbox API values have been reset. 862 // The page should've correctly received the committed query.
918 std::string value; 863 EXPECT_TRUE(UpdateSearchState(overlay));
919 EXPECT_TRUE(GetStringFromJS(preview_tab,
920 "chrome.embeddedSearch.searchBox.value", &value));
921 EXPECT_EQ("", value);
922
923 // However, the page should've correctly received the committed query.
924 EXPECT_TRUE(UpdateSearchState(preview_tab));
925 EXPECT_EQ("search", value_); 864 EXPECT_EQ("search", value_);
926 EXPECT_TRUE(verbatim_); 865 EXPECT_TRUE(verbatim_);
927 EXPECT_EQ(1, onsubmitcalls_); 866 EXPECT_EQ(1, onsubmitcalls_);
928 EXPECT_EQ(1, onvisibilitycalls_); 867 EXPECT_EQ(1, onvisibilitycalls_);
929 868
930 // The ex-active tab should've gotten a visibility change marking it hidden. 869 // The ex-active tab should've gotten a visibility change marking it hidden.
931 EXPECT_NE(active_tab, preview_tab); 870 EXPECT_NE(overlay, active_tab);
932 EXPECT_TRUE(GetIntFromJS(active_tab, "onvisibilitycalls", 871 EXPECT_TRUE(GetIntFromJS(active_tab, "onvisibilitycalls",
933 &active_tab_onvisibilitycalls)); 872 &active_tab_onvisibilitycalls));
934 EXPECT_EQ(1, active_tab_onvisibilitycalls); 873 EXPECT_EQ(1, active_tab_onvisibilitycalls);
935 } 874 }
936 875
937 // Test that suggestions are reusable. 876 // Test that the Instant overlay is recreated if it gets destroyed.
938 IN_PROC_BROWSER_TEST_F(InstantTest, SuggestionsAreReusable) { 877 IN_PROC_BROWSER_TEST_F(InstantTest, InstantRenderViewGone) {
939 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 878 ASSERT_NO_FATAL_FAILURE(SetupInstant());
879
880 // Get the overlay to show.
881 FocusOmniboxAndWaitForInstantSupport();
882 SetOmniboxTextAndWaitForOverlayToShow("search");
883 EXPECT_TRUE(instant()->IsOverlayingSearchResults());
884
885 InstantModel desired_model(service());
886 desired_model.SetOverlayState(NULL, 0, false);
887 InstantTestModelObserver observer(instant(), &desired_model);
888
889 // Kill the overlay's renderer.
890 KillOverlayRenderView();
891
892 // Wait for the overlay to disappear.
893 observer.WaitForDesiredOverlayState();
894 EXPECT_FALSE(instant()->IsOverlayingSearchResults());
895 EXPECT_FALSE(instant()->GetOverlayContents());
896
897 // Tickle the loader into recreating an overlay.
940 FocusOmniboxAndWaitForInstantSupport(); 898 FocusOmniboxAndWaitForInstantSupport();
941 899
942 EXPECT_TRUE(ExecuteScript("suggestion = [ { value: 'instant' } ];" 900 // Continue typing. The overlay should show again, and set suggestions.
943 "behavior = 'never';")); 901 SetOmniboxTextAndWaitForOverlayToShow("query");
944 902 EXPECT_TRUE(instant()->IsOverlayingSearchResults());
945 SetOmniboxTextAndWaitForInstantToShow("in");
946 EXPECT_EQ(ASCIIToUTF16("stant"), omnibox()->GetInstantSuggestion());
947
948 SetOmniboxText("ins");
949 EXPECT_EQ(ASCIIToUTF16("tant"), omnibox()->GetInstantSuggestion());
950
951 SetOmniboxText("in");
952 EXPECT_EQ(ASCIIToUTF16("stant"), omnibox()->GetInstantSuggestion());
953
954 SetOmniboxText("insane");
955 EXPECT_EQ(ASCIIToUTF16(""), omnibox()->GetInstantSuggestion());
956 }
957
958 // Test that instant overlay is recreated if it gets destroyed.
959 IN_PROC_BROWSER_TEST_F(InstantTest, InstantRenderViewGone) {
960 ASSERT_NO_FATAL_FAILURE(SetupInstant());
961 FocusOmniboxAndWaitForInstantSupport();
962
963 // Type partial query, get suggestion to show.
964 SetOmniboxTextAndWaitForInstantToShow("q");
965 EXPECT_EQ(ASCIIToUTF16("query suggestion"), omnibox()->GetText());
966
967 // Kill the instant renderer and wait for instant support again.
968 KillInstantRenderView();
969 FocusOmniboxAndWaitForInstantSupport();
970
971 SetOmniboxTextAndWaitForInstantToShow("qu");
972 EXPECT_EQ(ASCIIToUTF16("query suggestion"), omnibox()->GetText()); 903 EXPECT_EQ(ASCIIToUTF16("query suggestion"), omnibox()->GetText());
973 } 904 }
974 905
975 IN_PROC_BROWSER_TEST_F(InstantTest, ProcessIsolation) { 906 IN_PROC_BROWSER_TEST_F(InstantTest, ProcessIsolation) {
976 // Prior to setup no render process is dedicated to Instant. 907 // Prior to setup no render process is dedicated to Instant.
977 InstantService* instant_service = 908 EXPECT_EQ(0, service()->GetInstantProcessCount());
978 InstantServiceFactory::GetForProfile(browser()->profile());
979 ASSERT_NE(static_cast<InstantService*>(NULL), instant_service);
980 EXPECT_EQ(0, instant_service->GetInstantProcessCount());
981 909
982 // Setup Instant. 910 // Setup Instant.
983 ASSERT_NO_FATAL_FAILURE(SetupInstant()); 911 ASSERT_NO_FATAL_FAILURE(SetupInstant());
984 FocusOmniboxAndWaitForInstantSupport(); 912 FocusOmniboxAndWaitForInstantSupport();
985 913
986 // Now there should be a registered Instant render process. 914 // Now there should be a registered Instant render process.
987 EXPECT_LT(0, instant_service->GetInstantProcessCount()); 915 EXPECT_EQ(1, service()->GetInstantProcessCount());
988 916
989 // And the Instant preview should live inside it. 917 // And the Instant overlay should live inside it.
990 content::WebContents* preview = instant()->GetPreviewContents(); 918 content::WebContents* overlay = service()->loader()->contents();
991 EXPECT_TRUE(instant_service->IsInstantProcess( 919 EXPECT_TRUE(
992 preview->GetRenderProcessHost()->GetID())); 920 service()->IsInstantProcess(overlay->GetRenderProcessHost()->GetID()));
993 921
994 // Search and commit the search by pressing Alt-Enter. 922 // Search and commit the search by pressing Alt-Enter.
995 SetOmniboxTextAndWaitForInstantToShow("tractor"); 923 SetOmniboxTextAndWaitForOverlayToShow("tractor");
996 omnibox()->model()->AcceptInput(NEW_FOREGROUND_TAB, false); 924 omnibox()->model()->AcceptInput(NEW_FOREGROUND_TAB, false);
997 925
998 // The committed search results page should also live inside the 926 // The committed results page should also live inside the Instant process.
999 // Instant process.
1000 content::WebContents* active_tab = 927 content::WebContents* active_tab =
1001 browser()->tab_strip_model()->GetActiveWebContents(); 928 browser()->tab_strip_model()->GetActiveWebContents();
1002 EXPECT_TRUE(instant_service->IsInstantProcess( 929 EXPECT_TRUE(
1003 active_tab->GetRenderProcessHost()->GetID())); 930 service()->IsInstantProcess(active_tab->GetRenderProcessHost()->GetID()));
1004 931
1005 // Navigating away should change the process. 932 // Navigating away should change the process.
1006 ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL)); 933 ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
1007 EXPECT_FALSE(instant_service->IsInstantProcess( 934 EXPECT_FALSE(
1008 active_tab->GetRenderProcessHost()->GetID())); 935 service()->IsInstantProcess(active_tab->GetRenderProcessHost()->GetID()));
1009 } 936 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698