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