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

Side by Side Diff: chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc

Issue 2411863002: [NoStatePrefetch] Kill renderer after preload scanning (Closed)
Patch Set: inline Document::onPrefetchFinished() into Document::finishedParsing() Created 4 years, 1 month 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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/command_line.h" 5 #include "base/command_line.h"
6 #include "base/strings/string16.h" 6 #include "base/strings/string16.h"
7 #include "base/strings/string_split.h" 7 #include "base/strings/string_split.h"
8 #include "base/task_scheduler/post_task.h" 8 #include "base/task_scheduler/post_task.h"
9 #include "chrome/browser/prerender/prerender_handle.h"
9 #include "chrome/browser/prerender/prerender_manager.h" 10 #include "chrome/browser/prerender/prerender_manager.h"
10 #include "chrome/browser/prerender/prerender_manager_factory.h" 11 #include "chrome/browser/prerender/prerender_manager_factory.h"
11 #include "chrome/browser/prerender/prerender_test_utils.h" 12 #include "chrome/browser/prerender/prerender_test_utils.h"
12 #include "chrome/browser/profiles/profile.h" 13 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/task_manager/task_manager_browsertest_util.h" 14 #include "chrome/browser/task_manager/task_manager_browsertest_util.h"
14 #include "chrome/browser/ui/browser.h" 15 #include "chrome/browser/ui/browser.h"
15 #include "chrome/browser/ui/browser_commands.h" 16 #include "chrome/browser/ui/browser_commands.h"
16 #include "chrome/browser/ui/tabs/tab_strip_model.h" 17 #include "chrome/browser/ui/tabs/tab_strip_model.h"
17 #include "chrome/common/chrome_switches.h" 18 #include "chrome/common/chrome_switches.h"
18 #include "chrome/grit/generated_resources.h" 19 #include "chrome/grit/generated_resources.h"
(...skipping 10 matching lines...) Expand all
29 using prerender::test_utils::CreateCountingInterceptorOnIO; 30 using prerender::test_utils::CreateCountingInterceptorOnIO;
30 using prerender::test_utils::DestructionWaiter; 31 using prerender::test_utils::DestructionWaiter;
31 using prerender::test_utils::RequestCounter; 32 using prerender::test_utils::RequestCounter;
32 using prerender::test_utils::TestPrerender; 33 using prerender::test_utils::TestPrerender;
33 using prerender::test_utils::TestPrerenderContents; 34 using prerender::test_utils::TestPrerenderContents;
34 using task_manager::browsertest_util::WaitForTaskManagerRows; 35 using task_manager::browsertest_util::WaitForTaskManagerRows;
35 36
36 namespace prerender { 37 namespace prerender {
37 38
38 // These URLs used for test resources must be relative with the exception of 39 // These URLs used for test resources must be relative with the exception of
39 // |PrefetchLoaderPath|, which is only used in |PrerenderTestURLImpl()|. 40 // |kPrefetchLoaderPath|.
40 const char kPrefetchImagePage[] = "prerender/prefetch_image.html"; 41 const char kPrefetchImagePage[] = "prerender/prefetch_image.html";
41 const char kPrefetchJpeg[] = "prerender/image.jpeg"; 42 const char kPrefetchJpeg[] = "prerender/image.jpeg";
42 const char kPrefetchLoaderPath[] = "/prerender/prefetch_loader.html"; 43 const char kPrefetchLoaderPath[] = "/prerender/prefetch_loader.html";
43 const char kPrefetchLoopPage[] = "prerender/prefetch_loop.html"; 44 const char kPrefetchLoopPage[] = "prerender/prefetch_loop.html";
44 const char kPrefetchMetaCSP[] = "prerender/prefetch_meta_csp.html"; 45 const char kPrefetchMetaCSP[] = "prerender/prefetch_meta_csp.html";
45 const char kPrefetchPage[] = "prerender/prefetch_page.html"; 46 const char kPrefetchPage[] = "prerender/prefetch_page.html";
46 const char kPrefetchPage2[] = "prerender/prefetch_page2.html"; 47 const char kPrefetchPage2[] = "prerender/prefetch_page2.html";
47 const char kPrefetchPng[] = "prerender/image.png"; 48 const char kPrefetchPng[] = "prerender/image.png";
48 const char kPrefetchResponseHeaderCSP[] = 49 const char kPrefetchResponseHeaderCSP[] =
49 "prerender/prefetch_response_csp.html"; 50 "prerender/prefetch_response_csp.html";
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 base::FilePath url_file = ui_test_utils::GetTestFilePath( 123 base::FilePath url_file = ui_test_utils::GetTestFilePath(
123 base::FilePath(), base::FilePath::FromUTF8Unsafe(path_str)); 124 base::FilePath(), base::FilePath::FromUTF8Unsafe(path_str));
124 content::BrowserThread::PostTask( 125 content::BrowserThread::PostTask(
125 content::BrowserThread::IO, FROM_HERE, 126 content::BrowserThread::IO, FROM_HERE,
126 base::Bind(&CreateCountingInterceptorOnIO, url, url_file, 127 base::Bind(&CreateCountingInterceptorOnIO, url, url_file,
127 counter->AsWeakPtr())); 128 counter->AsWeakPtr()));
128 } 129 }
129 130
130 BrowserTestTime* GetTimeOverride() const { return browser_test_time_; } 131 BrowserTestTime* GetTimeOverride() const { return browser_test_time_; }
131 132
132 private: 133 protected:
133 std::vector<std::unique_ptr<TestPrerender>> PrerenderTestURLImpl( 134 std::unique_ptr<TestPrerender> PrefetchFromURL(
134 const GURL& prerender_url, 135 const GURL& target_url,
135 const std::vector<FinalStatus>& expected_final_status_queue, 136 FinalStatus expected_final_status) {
136 int expected_number_of_loads) override { 137 GURL loader_url = ServeLoaderURL(
137 base::StringPairs replacement_text; 138 kPrefetchLoaderPath, "REPLACE_WITH_PREFETCH_URL", target_url, "");
138 replacement_text.push_back( 139 std::vector<FinalStatus> expected_final_status_queue(1,
139 make_pair("REPLACE_WITH_PREFETCH_URL", prerender_url.spec())); 140 expected_final_status);
140 std::string replacement_path;
141 net::test_server::GetFilePathWithReplacements(
142 kPrefetchLoaderPath, replacement_text, &replacement_path);
143 GURL loader_url = src_server()->GetURL(replacement_path);
144
145 std::vector<std::unique_ptr<TestPrerender>> prerenders = 141 std::vector<std::unique_ptr<TestPrerender>> prerenders =
146 NavigateWithPrerenders(loader_url, expected_final_status_queue, 142 NavigateWithPrerenders(loader_url, expected_final_status_queue);
147 expected_number_of_loads); 143 prerenders[0]->WaitForStop();
148 144 return std::move(prerenders[0]);
149 TestPrerenderContents* prerender_contents = prerenders[0]->contents();
150 if (expected_number_of_loads > 0) {
151 CHECK(prerender_contents);
152 // Checks that the prerender contents final status is unchanged from its
153 // default value, meaning that the contents has not been destroyed.
154 EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status());
155 }
156 EXPECT_EQ(expected_number_of_loads, prerenders[0]->number_of_loads());
157
158 return prerenders;
159 } 145 }
160 146
147 std::unique_ptr<TestPrerender> PrefetchFromFile(
148 const std::string& html_file,
149 FinalStatus expected_final_status) {
150 return PrefetchFromURL(src_server()->GetURL(MakeAbsolute(html_file)),
151 expected_final_status);
152 }
153
154 private:
161 BrowserTestTime* browser_test_time_; 155 BrowserTestTime* browser_test_time_;
156
157 DISALLOW_COPY_AND_ASSIGN(NoStatePrefetchBrowserTest);
162 }; 158 };
163 159
164 // Checks that a page is correctly prefetched in the case of a 160 // Checks that a page is correctly prefetched in the case of a
165 // <link rel=prerender> tag and the JavaScript on the page is not executed. 161 // <link rel=prerender> tag and the JavaScript on the page is not executed.
166 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimple) { 162 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimple) {
167 RequestCounter main_counter; 163 RequestCounter main_counter;
168 CountRequestFor(kPrefetchPage, &main_counter); 164 CountRequestFor(kPrefetchPage, &main_counter);
169 RequestCounter script_counter; 165 RequestCounter script_counter;
170 CountRequestFor(kPrefetchScript, &script_counter); 166 CountRequestFor(kPrefetchScript, &script_counter);
171 RequestCounter script2_counter; 167 RequestCounter script2_counter;
172 CountRequestFor(kPrefetchScript2, &script2_counter); 168 CountRequestFor(kPrefetchScript2, &script2_counter);
173 169
174 std::unique_ptr<TestPrerender> test_prerender = 170 std::unique_ptr<TestPrerender> test_prerender =
175 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1); 171 PrefetchFromFile(kPrefetchPage, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
176 main_counter.WaitForCount(1); 172 main_counter.WaitForCount(1);
177 script_counter.WaitForCount(1); 173 script_counter.WaitForCount(1);
178 script2_counter.WaitForCount(0); 174 script2_counter.WaitForCount(0);
175
176 // Verify that the page load did not happen.
177 test_prerender->WaitForLoads(0);
179 } 178 }
180 179
181 // Checks the prefetch of an img tag. 180 // Checks the prefetch of an img tag.
182 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchImage) { 181 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchImage) {
183 RequestCounter image_counter; 182 RequestCounter image_counter;
184 CountRequestFor(kPrefetchJpeg, &image_counter); 183 CountRequestFor(kPrefetchJpeg, &image_counter);
185 base::StringPairs replacement_text; 184 base::StringPairs replacement_text;
186 replacement_text.push_back( 185 replacement_text.push_back(
187 std::make_pair("REPLACE_WITH_IMAGE_URL", MakeAbsolute(kPrefetchJpeg))); 186 std::make_pair("REPLACE_WITH_IMAGE_URL", MakeAbsolute(kPrefetchJpeg)));
188 std::string main_page_path; 187 std::string main_page_path;
189 net::test_server::GetFilePathWithReplacements( 188 net::test_server::GetFilePathWithReplacements(
190 kPrefetchImagePage, replacement_text, &main_page_path); 189 kPrefetchImagePage, replacement_text, &main_page_path);
191 // Note CountRequestFor cannot be used on the main page as the test server 190 // Note CountRequestFor cannot be used on the main page as the test server
192 // must handling the image url replacement. 191 // must handling the image url replacement.
193 PrerenderTestURL(main_page_path, FINAL_STATUS_APP_TERMINATING, 1); 192 PrefetchFromFile(main_page_path, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
194 image_counter.WaitForCount(1); 193 image_counter.WaitForCount(1);
195 } 194 }
196 195
197 // Checks that a cross-domain prefetching works correctly. 196 // Checks that a cross-domain prefetching works correctly.
198 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchCrossDomain) { 197 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchCrossDomain) {
199 static const std::string secondary_domain = "www.foo.com"; 198 static const std::string secondary_domain = "www.foo.com";
200 host_resolver()->AddRule(secondary_domain, "127.0.0.1"); 199 host_resolver()->AddRule(secondary_domain, "127.0.0.1");
201 GURL cross_domain_url(base::StringPrintf( 200 GURL cross_domain_url(base::StringPrintf(
202 "http://%s:%d/%s", secondary_domain.c_str(), 201 "http://%s:%d/%s", secondary_domain.c_str(),
203 embedded_test_server()->host_port_pair().port(), kPrefetchPage)); 202 embedded_test_server()->host_port_pair().port(), kPrefetchPage));
204 RequestCounter cross_domain_counter; 203 RequestCounter cross_domain_counter;
205 CountRequestForUrl(cross_domain_url, kPrefetchPage, &cross_domain_counter); 204 CountRequestForUrl(cross_domain_url, kPrefetchPage, &cross_domain_counter);
206 PrerenderTestURL(cross_domain_url, FINAL_STATUS_APP_TERMINATING, 1); 205 PrefetchFromURL(cross_domain_url, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
207 cross_domain_counter.WaitForCount(1); 206 cross_domain_counter.WaitForCount(1);
208 } 207 }
209 208
210 // Checks that response header CSP is respected. 209 // Checks that response header CSP is respected.
211 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, ResponseHeaderCSP) { 210 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, ResponseHeaderCSP) {
212 static const std::string secondary_domain = "foo.bar"; 211 static const std::string secondary_domain = "foo.bar";
213 host_resolver()->AddRule(secondary_domain, "127.0.0.1"); 212 host_resolver()->AddRule(secondary_domain, "127.0.0.1");
214 RequestCounter main_page; 213 RequestCounter main_page;
215 CountRequestFor(kPrefetchResponseHeaderCSP, &main_page); 214 CountRequestFor(kPrefetchResponseHeaderCSP, &main_page);
216 RequestCounter first_script; 215 RequestCounter first_script;
217 CountRequestFor(kPrefetchScript, &first_script); 216 CountRequestFor(kPrefetchScript, &first_script);
218 RequestCounter second_script; 217 RequestCounter second_script;
219 GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2); 218 GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2);
220 CountRequestForUrl(second_script_url, kPrefetchScript2, &second_script); 219 CountRequestForUrl(second_script_url, kPrefetchScript2, &second_script);
221 PrerenderTestURL(kPrefetchResponseHeaderCSP, FINAL_STATUS_APP_TERMINATING, 1); 220 PrefetchFromFile(kPrefetchResponseHeaderCSP,
221 FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
222 // The second script is in the correct domain for CSP, but the first script is 222 // The second script is in the correct domain for CSP, but the first script is
223 // not. 223 // not.
224 main_page.WaitForCount(1); 224 main_page.WaitForCount(1);
225 second_script.WaitForCount(1); 225 second_script.WaitForCount(1);
226 // TODO(pasko): wait for prefetch to be finished before checking the counts.
227 first_script.WaitForCount(0); 226 first_script.WaitForCount(0);
228 } 227 }
229 228
230 // Checks that CSP in the meta tag cancels the prefetch. 229 // Checks that CSP in the meta tag cancels the prefetch.
231 // TODO(mattcary): probably this behavior should be consistent with 230 // TODO(mattcary): probably this behavior should be consistent with
232 // response-header CSP. See crbug/656581. 231 // response-header CSP. See crbug/656581.
233 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, MetaTagCSP) { 232 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, MetaTagCSP) {
234 static const std::string secondary_domain = "foo.bar"; 233 static const std::string secondary_domain = "foo.bar";
235 host_resolver()->AddRule(secondary_domain, "127.0.0.1"); 234 host_resolver()->AddRule(secondary_domain, "127.0.0.1");
236 RequestCounter main_page; 235 RequestCounter main_page;
237 CountRequestFor(kPrefetchMetaCSP, &main_page); 236 CountRequestFor(kPrefetchMetaCSP, &main_page);
238 RequestCounter first_script; 237 RequestCounter first_script;
239 CountRequestFor(kPrefetchScript, &first_script); 238 CountRequestFor(kPrefetchScript, &first_script);
240 RequestCounter second_script; 239 RequestCounter second_script;
241 GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2); 240 GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2);
242 CountRequestForUrl(second_script_url, kPrefetchScript2, &second_script); 241 CountRequestForUrl(second_script_url, kPrefetchScript2, &second_script);
243 PrerenderTestURL(kPrefetchMetaCSP, FINAL_STATUS_APP_TERMINATING, 1); 242 PrefetchFromFile(kPrefetchMetaCSP, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
244 // TODO(mattcary): See test comment above. If the meta CSP tag were parsed, 243 // TODO(mattcary): See test comment above. If the meta CSP tag were parsed,
245 // |second_script| would be loaded. Instead as the background scanner bails as 244 // |second_script| would be loaded. Instead as the background scanner bails as
246 // soon as the meta CSP tag is seen, only |main_page| is fetched. 245 // soon as the meta CSP tag is seen, only |main_page| is fetched.
247 main_page.WaitForCount(1); 246 main_page.WaitForCount(1);
248 // TODO(pasko): wait for prefetch to be finished before checking the counts.
249 second_script.WaitForCount(0); 247 second_script.WaitForCount(0);
250 first_script.WaitForCount(0); 248 first_script.WaitForCount(0);
251 } 249 }
252 250
253 // Checks simultaneous prefetch. 251 // Checks that the second prefetch request succeeds. TODO(pasko): This test
252 // waits for Prerender Start before starting the second request, add a test that
253 // starts the second request from the UI thread immediately without waiting.
254 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimultaneous) { 254 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimultaneous) {
255 RequestCounter first_main_counter; 255 RequestCounter first_main_counter;
256 CountRequestFor(kPrefetchPage, &first_main_counter); 256 CountRequestFor(kPrefetchPage, &first_main_counter);
257 RequestCounter second_main_counter; 257 RequestCounter second_main_counter;
258 CountRequestFor(kPrefetchPage2, &second_main_counter); 258 CountRequestFor(kPrefetchPage2, &second_main_counter);
259 RequestCounter first_script_counter; 259 RequestCounter first_script_counter;
260 CountRequestFor(kPrefetchScript, &first_script_counter); 260 CountRequestFor(kPrefetchScript, &first_script_counter);
261 RequestCounter second_script_counter; 261 RequestCounter second_script_counter;
262 CountRequestFor(kPrefetchScript2, &second_script_counter); 262 CountRequestFor(kPrefetchScript2, &second_script_counter);
263 263
264 // The first prerender is marked as canceled. When the second prerender 264 // The first prerender is marked as canceled. When the second prerender
265 // starts, it sees that the first has been abandoned (because the earlier 265 // starts, it sees that the first has been abandoned (because the earlier
266 // prerender is detached immediately and so dies quickly). 266 // prerender is detached immediately and so dies quickly).
267 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_CANCELLED, 1); 267 PrefetchFromFile(kPrefetchPage, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
268 PrerenderTestURL(kPrefetchPage2, FINAL_STATUS_APP_TERMINATING, 1); 268 PrefetchFromFile(kPrefetchPage2, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
269 first_main_counter.WaitForCount(1); 269 first_main_counter.WaitForCount(1);
270 second_main_counter.WaitForCount(1); 270 second_main_counter.WaitForCount(1);
271 first_script_counter.WaitForCount(1); 271 first_script_counter.WaitForCount(1);
272 second_script_counter.WaitForCount(1); 272 second_script_counter.WaitForCount(1);
273 } 273 }
274 274
275 // Checks a prefetch to a nonexisting page. 275 // Checks a prefetch to a nonexisting page.
276 // TODO(mattcary): disabled as prefetch process teardown is racey with prerender 276 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchNonexisting) {
277 // contents destruction, can fix when prefetch prerenderers are destroyed 277 std::unique_ptr<TestPrerender> test_prerender = PrefetchFromFile(
278 // deterministically. 278 "nonexisting-page.html", FINAL_STATUS_UNSUPPORTED_SCHEME);
279 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest,
280 DISABLED_PrefetchNonexisting) {
281 PrerenderTestURL("nonexisting-page.html", FINAL_STATUS_APP_TERMINATING, 0);
282 // TODO(mattcary): we fire up a prerenderer before we discover that the main
283 // page doesn't exist, we still count this as a prerender. Also we don't fail
284 // the renderer (presumably because we've detached the resource, etc). Is this
285 // what we want? At any rate, we can't positively check any of that now due to
286 // histogram race conditions, and only test that we don't crash on a
287 // nonexisting page.
288 } 279 }
289 280
290 // Checks that a 301 redirect is followed. 281 // Checks that a 301 redirect is followed.
291 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Prefetch301Redirect) { 282 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Prefetch301Redirect) {
292 RequestCounter script_counter; 283 RequestCounter script_counter;
293 CountRequestFor(kPrefetchScript, &script_counter); 284 CountRequestFor(kPrefetchScript, &script_counter);
294 PrerenderTestURL( 285 PrefetchFromFile(
295 "/server-redirect/?" + 286 "/server-redirect/?" +
296 net::EscapeQueryParamValue(MakeAbsolute(kPrefetchPage), false), 287 net::EscapeQueryParamValue(MakeAbsolute(kPrefetchPage), false),
297 FINAL_STATUS_APP_TERMINATING, 1); 288 FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
298 script_counter.WaitForCount(1); 289 script_counter.WaitForCount(1);
299 } 290 }
300 291
301 // Checks that a subresource 301 redirect is followed. 292 // Checks that a subresource 301 redirect is followed.
302 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Prefetch301Subresource) { 293 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Prefetch301Subresource) {
303 RequestCounter script_counter; 294 RequestCounter script_counter;
304 CountRequestFor(kPrefetchScript, &script_counter); 295 CountRequestFor(kPrefetchScript, &script_counter);
305 PrerenderTestURL(kPrefetchSubresourceRedirectPage, 296 PrefetchFromFile(kPrefetchSubresourceRedirectPage,
306 FINAL_STATUS_APP_TERMINATING, 1); 297 FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
307 script_counter.WaitForCount(1); 298 script_counter.WaitForCount(1);
308 } 299 }
309 300
310 // Checks a client redirect is not followed. 301 // Checks a client redirect is not followed.
311 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchClientRedirect) { 302 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchClientRedirect) {
312 RequestCounter script_counter; 303 RequestCounter script_counter;
313 CountRequestFor(kPrefetchScript, &script_counter); 304 CountRequestFor(kPrefetchScript, &script_counter);
314 // A complete load of kPrefetchPage2 is used as a sentinal. Otherwise the test 305 // A complete load of kPrefetchPage2 is used as a sentinal. Otherwise the test
315 // ends before script_counter would reliably see the load of kPrefetchScript, 306 // ends before script_counter would reliably see the load of kPrefetchScript,
316 // were it to happen. 307 // were it to happen.
317 RequestCounter sentinel_counter; 308 RequestCounter sentinel_counter;
318 CountRequestFor(kPrefetchScript2, &sentinel_counter); 309 CountRequestFor(kPrefetchScript2, &sentinel_counter);
319 PrerenderTestURL( 310 PrefetchFromFile(
320 "/client-redirect/?" + 311 "/client-redirect/?" +
321 net::EscapeQueryParamValue(MakeAbsolute(kPrefetchPage), false), 312 net::EscapeQueryParamValue(MakeAbsolute(kPrefetchPage), false),
322 FINAL_STATUS_APP_TERMINATING, 1); 313 FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
323 ui_test_utils::NavigateToURL( 314 ui_test_utils::NavigateToURL(
324 current_browser(), src_server()->GetURL(MakeAbsolute(kPrefetchPage2))); 315 current_browser(), src_server()->GetURL(MakeAbsolute(kPrefetchPage2)));
325 sentinel_counter.WaitForCount(1); 316 sentinel_counter.WaitForCount(1);
326 script_counter.WaitForCount(0); 317 script_counter.WaitForCount(0);
327 } 318 }
328 319
329 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchHttps) { 320 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchHttps) {
330 UseHttpsSrcServer(); 321 UseHttpsSrcServer();
331 RequestCounter main_counter; 322 RequestCounter main_counter;
332 CountRequestFor(kPrefetchPage, &main_counter); 323 CountRequestFor(kPrefetchPage, &main_counter);
333 RequestCounter script_counter; 324 RequestCounter script_counter;
334 CountRequestFor(kPrefetchScript, &script_counter); 325 CountRequestFor(kPrefetchScript, &script_counter);
335 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1); 326 PrefetchFromFile(kPrefetchPage, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
336 main_counter.WaitForCount(1); 327 main_counter.WaitForCount(1);
337 script_counter.WaitForCount(1); 328 script_counter.WaitForCount(1);
338 } 329 }
339 330
340 // Checks that an SSL error prevents prefetch. 331 // Checks that an SSL error prevents prefetch.
341 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, SSLError) { 332 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, SSLError) {
342 // Only send the loaded page, not the loader, through SSL. 333 // Only send the loaded page, not the loader, through SSL.
343 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); 334 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
344 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); 335 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
345 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); 336 https_server.ServeFilesFromSourceDirectory("chrome/test/data");
346 ASSERT_TRUE(https_server.Start()); 337 ASSERT_TRUE(https_server.Start());
347 std::unique_ptr<TestPrerender> prerender = 338 std::unique_ptr<TestPrerender> prerender = PrefetchFromURL(
348 PrerenderTestURL(https_server.GetURL(MakeAbsolute(kPrefetchPage)), 339 https_server.GetURL(MakeAbsolute(kPrefetchPage)), FINAL_STATUS_SSL_ERROR);
349 FINAL_STATUS_SSL_ERROR, 0);
350 DestructionWaiter waiter(prerender->contents(), FINAL_STATUS_SSL_ERROR); 340 DestructionWaiter waiter(prerender->contents(), FINAL_STATUS_SSL_ERROR);
351 EXPECT_TRUE(waiter.WaitForDestroy()); 341 EXPECT_TRUE(waiter.WaitForDestroy());
352 } 342 }
353 343
354 // Checks that a subresource failing SSL does not prevent prefetch on the rest 344 // Checks that a subresource failing SSL does not prevent prefetch on the rest
355 // of the page. 345 // of the page.
356 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, SSLSubresourceError) { 346 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, SSLSubresourceError) {
357 // First confirm that the image loads as expected. 347 // First confirm that the image loads as expected.
358 348
359 // A separate HTTPS server is started for the subresource; src_server() is 349 // A separate HTTPS server is started for the subresource; src_server() is
360 // non-HTTPS. 350 // non-HTTPS.
361 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); 351 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
362 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); 352 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
363 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); 353 https_server.ServeFilesFromSourceDirectory("chrome/test/data");
364 ASSERT_TRUE(https_server.Start()); 354 ASSERT_TRUE(https_server.Start());
365 GURL https_url = https_server.GetURL("/prerender/image.jpeg"); 355 GURL https_url = https_server.GetURL("/prerender/image.jpeg");
366 base::StringPairs replacement_text; 356 base::StringPairs replacement_text;
367 replacement_text.push_back( 357 replacement_text.push_back(
368 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); 358 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec()));
369 std::string main_page_path; 359 std::string main_page_path;
370 net::test_server::GetFilePathWithReplacements( 360 net::test_server::GetFilePathWithReplacements(
371 kPrefetchImagePage, replacement_text, &main_page_path); 361 kPrefetchImagePage, replacement_text, &main_page_path);
372 RequestCounter script_counter; 362 RequestCounter script_counter;
373 CountRequestFor(kPrefetchScript, &script_counter); 363 CountRequestFor(kPrefetchScript, &script_counter);
374 364
375 std::unique_ptr<TestPrerender> prerender = 365 std::unique_ptr<TestPrerender> prerender =
376 PrerenderTestURL(main_page_path, FINAL_STATUS_APP_TERMINATING, 1); 366 PrefetchFromFile(main_page_path, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
377 // Checks that the presumed failure of the image load didn't affect the script 367 // Checks that the presumed failure of the image load didn't affect the script
378 // fetch. This assumes waiting for the script load is enough to see any error 368 // fetch. This assumes waiting for the script load is enough to see any error
379 // from the image load. 369 // from the image load.
380 script_counter.WaitForCount(1); 370 script_counter.WaitForCount(1);
381 } 371 }
382 372
383 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Loop) { 373 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Loop) {
384 RequestCounter script_counter; 374 RequestCounter script_counter;
385 CountRequestFor(kPrefetchScript, &script_counter); 375 CountRequestFor(kPrefetchScript, &script_counter);
386 RequestCounter main_counter; 376 RequestCounter main_counter;
387 CountRequestFor(kPrefetchLoopPage, &main_counter); 377 CountRequestFor(kPrefetchLoopPage, &main_counter);
388 378
389 std::unique_ptr<TestPrerender> test_prerender = 379 std::unique_ptr<TestPrerender> test_prerender = PrefetchFromFile(
390 PrerenderTestURL(kPrefetchLoopPage, FINAL_STATUS_APP_TERMINATING, 1); 380 kPrefetchLoopPage, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
391 main_counter.WaitForCount(1); 381 main_counter.WaitForCount(1);
392 script_counter.WaitForCount(1); 382 script_counter.WaitForCount(1);
393 } 383 }
394 384
395 #if defined(ENABLE_TASK_MANAGER) 385 #if defined(ENABLE_TASK_MANAGER)
396 386
397 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, 387 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest,
398 OpenTaskManagerBeforePrefetch) { 388 OpenTaskManagerBeforePrefetch) {
399 const base::string16 any_prerender = MatchTaskManagerPrerender("*"); 389 const base::string16 any_prerender = MatchTaskManagerPrerender("*");
400 const base::string16 any_tab = MatchTaskManagerTab("*"); 390 const base::string16 any_tab = MatchTaskManagerTab("*");
401 const base::string16 original = MatchTaskManagerTab("Prefetch Loader"); 391 const base::string16 original = MatchTaskManagerTab("Prefetch Loader");
402 // The page title is not visible in the task manager, presumably because the 392 // The page title is not visible in the task manager, presumably because the
403 // page has not been fully parsed. 393 // page has not been fully parsed.
404 const base::string16 prerender = 394 const base::string16 prerender =
405 MatchTaskManagerPrerender("*prefetch_page.html*"); 395 MatchTaskManagerPrerender("*prefetch_page.html*");
406 396
407 // Show the task manager. This populates the model. 397 // Show the task manager. This populates the model.
408 chrome::OpenTaskManager(current_browser()); 398 chrome::OpenTaskManager(current_browser());
409 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 399 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab));
410 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender)); 400 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender));
411 401
412 // Prerender a page in addition to the original tab. 402 // Prerender a page in addition to the original tab.
413 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1); 403 PrefetchFromFile(kPrefetchPage, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
414 404
415 // A TaskManager entry should appear like "Prerender: Prerender Page" 405 // A TaskManager entry should appear like "Prerender: Prerender Page"
416 // alongside the original tab entry. There should be just these two entries. 406 // alongside the original tab entry. There should be just these two entries.
417 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, prerender)); 407 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, prerender));
418 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, original)); 408 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, original));
419 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_prerender)); 409 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_prerender));
420 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 410 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab));
421 } 411 }
422 412
423 #endif // defined(ENABLE_TASK_MANAGER) 413 #endif // defined(ENABLE_TASK_MANAGER)
424 414
425 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, RendererCrash) { 415 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, RendererCrash) {
426 std::unique_ptr<TestPrerender> prerender = 416 // Navigate to about:blank to get the session storage namespace.
427 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_RENDERER_CRASHED, 1); 417 ui_test_utils::NavigateToURL(current_browser(), GURL(url::kAboutBlankURL));
428 prerender->contents()->prerender_contents()->GetController().LoadURL( 418 content::SessionStorageNamespace* storage_namespace =
429 GURL(content::kChromeUICrashURL), content::Referrer(), 419 GetActiveWebContents()
430 ui::PAGE_TRANSITION_TYPED, std::string()); 420 ->GetController()
431 prerender->WaitForStop(); 421 .GetDefaultSessionStorageNamespace();
422
423 // Navigate to about:crash without an intermediate loader because chrome://
424 // URLs are ignored in renderers, and teh test server has no support for them.
droger 2016/10/26 08:52:16 s/teh/the/
pasko 2016/10/26 09:54:52 Done.
425 const gfx::Size kSize(640, 480);
426 std::unique_ptr<TestPrerender> test_prerender =
427 prerender_contents_factory()->ExpectPrerenderContents(
428 FINAL_STATUS_RENDERER_CRASHED);
429 std::unique_ptr<PrerenderHandle> prerender_handle(
430 GetPrerenderManager()->AddPrerenderFromExternalRequest(
431 GURL(content::kChromeUICrashURL), content::Referrer(),
432 storage_namespace, gfx::Rect(kSize)));
433 ASSERT_EQ(prerender_handle->contents(), test_prerender->contents());
434 test_prerender->WaitForStop();
432 } 435 }
433 436
434 // Checks that the prefetch of png correctly loads the png. 437 // Checks that the prefetch of png correctly loads the png.
435 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Png) { 438 // TODO(pasko): Add support for prefetching non-HTML documents and re-enable the
439 // test.
440 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, DISABLED_Png) {
436 RequestCounter counter; 441 RequestCounter counter;
437 CountRequestFor(kPrefetchPng, &counter); 442 CountRequestFor(kPrefetchPng, &counter);
438 PrerenderTestURL(kPrefetchPng, FINAL_STATUS_APP_TERMINATING, 1); 443 PrefetchFromFile(kPrefetchPng, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
439 counter.WaitForCount(1); 444 counter.WaitForCount(1);
440 } 445 }
441 446
442 // Checks that the prefetch of png correctly loads the jpeg. 447 // Checks that the prefetch of png correctly loads the jpeg.
443 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Jpeg) { 448 // TODO(pasko): Add support for prefetching non-HTML documents and re-enable the
449 // test.
450 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, DISABLED_Jpeg) {
444 RequestCounter counter; 451 RequestCounter counter;
445 CountRequestFor(kPrefetchJpeg, &counter); 452 CountRequestFor(kPrefetchJpeg, &counter);
446 PrerenderTestURL(kPrefetchJpeg, FINAL_STATUS_APP_TERMINATING, 1); 453 PrefetchFromFile(kPrefetchJpeg, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
447 counter.WaitForCount(1); 454 counter.WaitForCount(1);
448 } 455 }
449 456
450 // Checks that nothing is prefetched from malware sites. 457 // Checks that nothing is prefetched from malware sites.
451 // TODO(mattcary): disabled as prefetch process teardown is racey with prerender 458 // TODO(mattcary): disabled as prefetch process teardown is racey with prerender
452 // contents destruction, can fix when prefetch prerenderers are destroyed 459 // contents destruction, can fix when prefetch prerenderers are destroyed
453 // deterministically. 460 // deterministically.
454 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, 461 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest,
455 DISABLED_PrerenderSafeBrowsingTopLevel) { 462 DISABLED_PrerenderSafeBrowsingTopLevel) {
456 GURL url = src_server()->GetURL(MakeAbsolute(kPrefetchPage)); 463 GURL url = src_server()->GetURL(MakeAbsolute(kPrefetchPage));
457 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 464 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl(
458 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); 465 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE);
459 // Prefetch resources are blocked, but the prerender is not killed in any 466 // Prefetch resources are blocked, but the prerender is not killed in any
460 // special way. 467 // special way.
461 // TODO(mattcary): since the prerender will count itself as loaded even if the 468 // TODO(mattcary): since the prerender will count itself as loaded even if the
462 // fetch of the main resource fails, the test doesn't actually confirm what we 469 // fetch of the main resource fails, the test doesn't actually confirm what we
463 // want it to confirm. This may be fixed by planned changes to the prerender 470 // want it to confirm. This may be fixed by planned changes to the prerender
464 // lifecycle. 471 // lifecycle.
465 std::unique_ptr<TestPrerender> prerender = 472 std::unique_ptr<TestPrerender> prerender =
466 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_SAFE_BROWSING, 1); 473 PrefetchFromFile(kPrefetchPage, FINAL_STATUS_SAFE_BROWSING);
474 prerender->WaitForStop();
467 } 475 }
468 476
469 } // namespace prerender 477 } // namespace prerender
OLDNEW
« no previous file with comments | « chrome/browser/prerender/prerender_message_filter.cc ('k') | chrome/browser/prerender/prerender_test_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698