Skip to content

Commit e8cd36e

Browse files
ojanvafaiCommit bot
authored andcommitted
Revert of [Prerender] Restore request priorities when swapped in (patchset #1 id:1 of https://codereview.chromium.org/2832473002/ )
Reason for revert: Caused compile failures on Mac and Windows Beta official desktop continuous waterfall. https://bugs.chromium.org/p/chromium/issues/detail?id=713223 Original issue's description: > [Prerender] Restore request priorities when swapped in > > Requests from prerendered contents have a IDLE priority, in order not to slow > down visible pages. > However, when the prerendered contents become visible, the request priorities > were not reset back to their correct values, leading to bad prerendering > performance. > > In this CL, the priority management for prerender requests is moved to the > PrerenderResourceThrottle/PrerendereContents. > The original priorities are stored in the throttle, and restored when the > prerender contents swaps in. > A new public function is added to ResourceDispatcherHost to update a request > priority, and its implementation reuses the existing code that updates the image > priorities. > > The prerender contents keeps a list of all the network resources that were > started while the prerender is hidden. If this proves to be too large, pruning > the list when responses are received should be doable. > > BUG=705955 > > Review-Url: https://codereview.chromium.org/2807163002 > Cr-Commit-Position: refs/heads/master@{#464728} > (cherry picked from commit d3bc614) > > Review-Url: https://codereview.chromium.org/2832473002 . > Cr-Commit-Position: refs/branch-heads/3071@{#48} > Cr-Branched-From: a106f0a-refs/heads/master@{#464641} > Committed: https://chromium.googlesource.com/chromium/src/+/d4b0c9f58ec981f98342cb8438da1a69bb489a06 TBR=droger@chromium.org # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=705955 Review-Url: https://codereview.chromium.org/2833553002 Cr-Commit-Position: refs/branch-heads/3071@{#58} Cr-Branched-From: a106f0a-refs/heads/master@{#464641}
1 parent a3ba228 commit e8cd36e

14 files changed

+85
-294
lines changed

chrome/browser/loader/chrome_resource_dispatcher_host_delegate.cc

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,27 @@ void ChromeResourceDispatcherHostDelegate::RequestBeginning(
443443
safe_browsing_->OnResourceRequest(request);
444444

445445
const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
446+
447+
// The lowering of request priority causes issues with scheduling, since
448+
// content::ResourceScheduler uses it to delay and throttle requests. This is
449+
// disabled only on Android, as the prerenders are not likely to compete with
450+
// page loads there.
451+
// See https://crbug.com/652746 for details.
452+
// TODO(lizeb,droger): Fix the issue on all platforms.
453+
#if !defined(OS_ANDROID)
454+
bool is_prerendering =
455+
info->GetVisibilityState() == blink::kWebPageVisibilityStatePrerender;
456+
if (is_prerendering) {
457+
// Requests with the IGNORE_LIMITS flag set (i.e., sync XHRs)
458+
// should remain at MAXIMUM_PRIORITY.
459+
if (request->load_flags() & net::LOAD_IGNORE_LIMITS) {
460+
DCHECK_EQ(request->priority(), net::MAXIMUM_PRIORITY);
461+
} else {
462+
request->SetPriority(net::IDLE);
463+
}
464+
}
465+
#endif // OS_ANDROID
466+
446467
ProfileIOData* io_data = ProfileIOData::FromResourceContext(
447468
resource_context);
448469

chrome/browser/prerender/prerender_browsertest.cc

Lines changed: 30 additions & 151 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ using content::WebContentsObserver;
143143
using net::NetworkChangeNotifier;
144144
using prerender::test_utils::RequestCounter;
145145
using prerender::test_utils::CreateCountingInterceptorOnIO;
146-
using prerender::test_utils::CreateHangingFirstRequestInterceptor;
146+
using prerender::test_utils::CreateHangingFirstRequestInterceptorOnIO;
147147
using prerender::test_utils::CreateMockInterceptorOnIO;
148148
using prerender::test_utils::TestPrerender;
149149
using prerender::test_utils::TestPrerenderContents;
@@ -166,8 +166,6 @@ namespace prerender {
166166

167167
namespace {
168168

169-
const char kPrefetchJpeg[] = "/prerender/image.jpeg";
170-
171169
class FaviconUpdateWatcher : public favicon::FaviconDriverObserver {
172170
public:
173171
explicit FaviconUpdateWatcher(content::WebContents* web_contents)
@@ -541,17 +539,6 @@ page_load_metrics::PageLoadExtraInfo GenericPageLoadExtraInfo(
541539
dest_url, false /* started_in_foreground */);
542540
}
543541

544-
// Helper function, to allow passing a UI closure to
545-
// CreateHangingFirstRequestInterceptor() instead of a IO callback.
546-
base::Callback<void(net::URLRequest*)> GetIOCallbackFromUIClosure(
547-
base::Closure ui_closure) {
548-
auto lambda = [](base::Closure closure, net::URLRequest*) {
549-
content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
550-
closure);
551-
};
552-
return base::Bind(lambda, ui_closure);
553-
}
554-
555542
} // namespace
556543

557544
class PrerenderBrowserTest : public test_utils::PrerenderInProcessBrowserTest {
@@ -1315,9 +1302,10 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap) {
13151302
base::FilePath file(GetTestPath("prerender_page.html"));
13161303

13171304
base::RunLoop prerender_start_loop;
1318-
CreateHangingFirstRequestInterceptor(
1319-
kNoCommitUrl, file,
1320-
GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure()));
1305+
BrowserThread::PostTask(
1306+
BrowserThread::IO, FROM_HERE,
1307+
base::Bind(&CreateHangingFirstRequestInterceptorOnIO, kNoCommitUrl, file,
1308+
prerender_start_loop.QuitClosure()));
13211309
DisableJavascriptCalls();
13221310
PrerenderTestURL(kNoCommitUrl,
13231311
FINAL_STATUS_NAVIGATION_UNCOMMITTED,
@@ -1342,9 +1330,10 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap2) {
13421330
base::FilePath file(GetTestPath("prerender_page.html"));
13431331

13441332
base::RunLoop prerender_start_loop;
1345-
CreateHangingFirstRequestInterceptor(
1346-
kNoCommitUrl, file,
1347-
GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure()));
1333+
BrowserThread::PostTask(
1334+
BrowserThread::IO, FROM_HERE,
1335+
base::Bind(&CreateHangingFirstRequestInterceptorOnIO, kNoCommitUrl, file,
1336+
prerender_start_loop.QuitClosure()));
13481337
DisableJavascriptCalls();
13491338
PrerenderTestURL(CreateClientRedirect(kNoCommitUrl.spec()),
13501339
FINAL_STATUS_APP_TERMINATING, 1);
@@ -2120,7 +2109,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImagePng) {
21202109
// Checks that prerendering a JPG works correctly.
21212110
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImageJpeg) {
21222111
DisableJavascriptCalls();
2123-
PrerenderTestURL(kPrefetchJpeg, FINAL_STATUS_USED, 1);
2112+
PrerenderTestURL("/prerender/image.jpeg", FINAL_STATUS_USED, 1);
21242113
NavigateToDestURL();
21252114
}
21262115

@@ -2192,7 +2181,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorSubresource) {
21922181
https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
21932182
https_server.ServeFilesFromSourceDirectory("chrome/test/data");
21942183
ASSERT_TRUE(https_server.Start());
2195-
GURL https_url = https_server.GetURL(kPrefetchJpeg);
2184+
GURL https_url = https_server.GetURL("/prerender/image.jpeg");
21962185
base::StringPairs replacement_text;
21972186
replacement_text.push_back(
21982187
std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec()));
@@ -2304,7 +2293,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
23042293
https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_OK, ssl_config);
23052294
https_server.ServeFilesFromSourceDirectory("chrome/test/data");
23062295
ASSERT_TRUE(https_server.Start());
2307-
GURL https_url = https_server.GetURL(kPrefetchJpeg);
2296+
GURL https_url = https_server.GetURL("/prerender/image.jpeg");
23082297
base::StringPairs replacement_text;
23092298
replacement_text.push_back(
23102299
std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec()));
@@ -2378,7 +2367,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
23782367

23792368
// Ensures that we do not prerender pages which have a malware subresource.
23802369
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingSubresource) {
2381-
GURL image_url = embedded_test_server()->GetURL(kPrefetchJpeg);
2370+
GURL image_url = embedded_test_server()->GetURL("/prerender/image.jpeg");
23822371
GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl(
23832372
image_url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE);
23842373
base::StringPairs replacement_text;
@@ -2502,8 +2491,11 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHangingUnload) {
25022491
const GURL hang_url("http://unload-url.test");
25032492
base::FilePath empty_file = ui_test_utils::GetTestFilePath(
25042493
base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html")));
2505-
CreateHangingFirstRequestInterceptor(
2506-
hang_url, empty_file, base::Callback<void(net::URLRequest*)>());
2494+
BrowserThread::PostTask(
2495+
BrowserThread::IO, FROM_HERE,
2496+
base::Bind(&CreateHangingFirstRequestInterceptorOnIO,
2497+
hang_url, empty_file,
2498+
base::Closure()));
25072499

25082500
set_loader_path("/prerender/prerender_loader_with_unload.html");
25092501
PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
@@ -3299,122 +3291,6 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, AutosigninInPrerenderer) {
32993291
EXPECT_EQ(0, done_counter.count());
33003292
}
33013293

3302-
// Checks that the requests from a prerender are IDLE priority before the swap
3303-
// (except on Android), but normal priority after the swap.
3304-
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, ResourcePriority) {
3305-
GURL before_swap_url = embedded_test_server()->GetURL(kPrefetchJpeg);
3306-
GURL after_swap_url = embedded_test_server()->GetURL("/prerender/image.png");
3307-
GURL main_page_url =
3308-
GetURLWithReplacement("/prerender/prerender_with_image.html",
3309-
"REPLACE_WITH_IMAGE_URL", kPrefetchJpeg);
3310-
3311-
// Setup request interceptors for subresources.
3312-
auto get_priority_lambda = [](net::RequestPriority* out_priority,
3313-
net::URLRequest* request) {
3314-
*out_priority = request->priority();
3315-
};
3316-
RequestCounter before_swap_counter;
3317-
net::RequestPriority before_swap_priority = net::THROTTLED;
3318-
InterceptRequestAndCount(
3319-
before_swap_url, &before_swap_counter,
3320-
base::Bind(get_priority_lambda, base::Unretained(&before_swap_priority)));
3321-
RequestCounter after_swap_counter;
3322-
net::RequestPriority after_swap_priority = net::THROTTLED;
3323-
InterceptRequestAndCount(
3324-
after_swap_url, &after_swap_counter,
3325-
base::Bind(get_priority_lambda, base::Unretained(&after_swap_priority)));
3326-
3327-
// Start the prerender.
3328-
PrerenderTestURL(main_page_url, FINAL_STATUS_USED, 1);
3329-
3330-
// Check priority before swap.
3331-
before_swap_counter.WaitForCount(1);
3332-
#if defined(OS_ANDROID)
3333-
EXPECT_GT(before_swap_priority, net::IDLE);
3334-
#else
3335-
EXPECT_EQ(net::IDLE, before_swap_priority);
3336-
#endif
3337-
3338-
// Swap.
3339-
NavigateToDestURL();
3340-
3341-
// Check priority after swap.
3342-
GetActiveWebContents()->GetMainFrame()->ExecuteJavaScriptForTests(
3343-
base::ASCIIToUTF16(
3344-
"var img=new Image(); img.src='/prerender/image.png'"));
3345-
after_swap_counter.WaitForCount(1);
3346-
EXPECT_NE(net::IDLE, after_swap_priority);
3347-
}
3348-
3349-
// Checks that a request started before the swap gets its original priority back
3350-
// after the swap.
3351-
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, ResourcePriorityOverlappingSwap) {
3352-
GURL image_url = embedded_test_server()->GetURL(kPrefetchJpeg);
3353-
GURL main_page_url =
3354-
GetURLWithReplacement("/prerender/prerender_with_image.html",
3355-
"REPLACE_WITH_IMAGE_URL", kPrefetchJpeg);
3356-
3357-
// Setup request interceptors for subresources.
3358-
net::URLRequest* url_request = nullptr;
3359-
net::RequestPriority priority = net::THROTTLED;
3360-
base::RunLoop wait_loop;
3361-
auto io_lambda = [](net::URLRequest** out_request,
3362-
net::RequestPriority* out_priority, base::Closure closure,
3363-
net::URLRequest* request) {
3364-
if (out_request)
3365-
*out_request = request;
3366-
content::BrowserThread::PostTask(
3367-
content::BrowserThread::UI, FROM_HERE,
3368-
base::Bind(
3369-
[](net::RequestPriority priority,
3370-
net::RequestPriority* out_priority, base::Closure closure) {
3371-
*out_priority = priority;
3372-
closure.Run();
3373-
},
3374-
request->priority(), base::Unretained(out_priority), closure));
3375-
};
3376-
3377-
CreateHangingFirstRequestInterceptor(
3378-
image_url, base::FilePath(),
3379-
base::Bind(io_lambda, base::Unretained(&url_request),
3380-
base::Unretained(&priority), wait_loop.QuitClosure()));
3381-
3382-
// The prerender will hang on the image resource, can't run the usual checks.
3383-
DisableLoadEventCheck();
3384-
DisableJavascriptCalls();
3385-
// Start the prerender.
3386-
PrerenderTestURL(main_page_url, FINAL_STATUS_USED, 0);
3387-
3388-
// Check priority before swap.
3389-
#if defined(OS_ANDROID)
3390-
if (priority <= net::IDLE)
3391-
wait_loop.Run();
3392-
EXPECT_GT(priority, net::IDLE);
3393-
#else
3394-
if (priority != net::IDLE)
3395-
wait_loop.Run();
3396-
EXPECT_EQ(net::IDLE, priority);
3397-
#endif
3398-
3399-
// Swap. Cannot use NavigateToDestURL, because it waits for the load to
3400-
// complete, but the resource is still hung.
3401-
current_browser()->OpenURL(content::OpenURLParams(
3402-
dest_url(), Referrer(), WindowOpenDisposition::CURRENT_TAB,
3403-
ui::PAGE_TRANSITION_TYPED, false));
3404-
3405-
// Check priority after swap. The test may timeout in case of failure.
3406-
priority = net::THROTTLED;
3407-
do {
3408-
base::RunLoop loop;
3409-
content::BrowserThread::PostTask(
3410-
content::BrowserThread::IO, FROM_HERE,
3411-
base::Bind(io_lambda, nullptr, base::Unretained(&priority),
3412-
loop.QuitClosure(), base::Unretained(url_request)));
3413-
loop.Run();
3414-
} while (priority <= net::IDLE);
3415-
EXPECT_GT(priority, net::IDLE);
3416-
}
3417-
34183294
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingSimple) {
34193295
GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
34203296
base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
@@ -3447,9 +3323,10 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingReuse) {
34473323

34483324
GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
34493325
base::RunLoop hanging_request_waiter;
3450-
CreateHangingFirstRequestInterceptor(
3451-
url, GetTestPath("prerender_page.html"),
3452-
GetIOCallbackFromUIClosure(hanging_request_waiter.QuitClosure()));
3326+
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
3327+
base::Bind(&CreateHangingFirstRequestInterceptorOnIO,
3328+
url, GetTestPath("prerender_page.html"),
3329+
hanging_request_waiter.QuitClosure()));
34533330
// As this load will be canceled, it is not waited for, and hence no
34543331
// javascript is executed.
34553332
DisableJavascriptCalls();
@@ -3534,9 +3411,10 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
35343411
base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html")));
35353412

35363413
base::RunLoop prerender_start_loop;
3537-
CreateHangingFirstRequestInterceptor(
3538-
url, url_file,
3539-
GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure()));
3414+
BrowserThread::PostTask(
3415+
BrowserThread::IO, FROM_HERE,
3416+
base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file,
3417+
prerender_start_loop.QuitClosure()));
35403418
// As this load is uncommitted, it is not waited for, and hence no
35413419
// javascript is executed.
35423420
DisableJavascriptCalls();
@@ -3653,9 +3531,10 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
36533531
base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html")));
36543532

36553533
base::RunLoop prerender_start_loop;
3656-
CreateHangingFirstRequestInterceptor(
3657-
url, url_file,
3658-
GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure()));
3534+
BrowserThread::PostTask(
3535+
BrowserThread::IO, FROM_HERE,
3536+
base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file,
3537+
prerender_start_loop.QuitClosure()));
36593538
// As this load is uncommitted, it is not waited for, and hence no
36603539
// javascript is executed.
36613540
DisableJavascriptCalls();

chrome/browser/prerender/prerender_contents.cc

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,7 @@ const char* const kValidHttpMethodsForPrerendering[] = {
7070
};
7171

7272
void ResumeThrottles(
73-
std::vector<base::WeakPtr<PrerenderResourceThrottle>> throttles,
74-
std::vector<base::WeakPtr<PrerenderResourceThrottle>> idle_resources) {
75-
for (auto resource : idle_resources) {
76-
if (resource)
77-
resource->ResetResourcePriority();
78-
}
73+
std::vector<base::WeakPtr<PrerenderResourceThrottle> > throttles) {
7974
for (size_t i = 0; i < throttles.size(); i++) {
8075
if (throttles[i])
8176
throttles[i]->ResumeHandler();
@@ -762,10 +757,10 @@ void PrerenderContents::PrepareForUse() {
762757
NotifyPrerenderStop();
763758

764759
BrowserThread::PostTask(
765-
BrowserThread::IO, FROM_HERE,
766-
base::Bind(&ResumeThrottles, resource_throttles_, idle_resources_));
760+
BrowserThread::IO,
761+
FROM_HERE,
762+
base::Bind(&ResumeThrottles, resource_throttles_));
767763
resource_throttles_.clear();
768-
idle_resources_.clear();
769764
}
770765

771766
void PrerenderContents::CancelPrerenderForPrinting() {
@@ -783,11 +778,6 @@ void PrerenderContents::AddResourceThrottle(
783778
resource_throttles_.push_back(throttle);
784779
}
785780

786-
void PrerenderContents::AddIdleResource(
787-
const base::WeakPtr<PrerenderResourceThrottle>& throttle) {
788-
idle_resources_.push_back(throttle);
789-
}
790-
791781
void PrerenderContents::AddNetworkBytes(int64_t bytes) {
792782
network_bytes_ += bytes;
793783
for (Observer& observer : observer_list_)

chrome/browser/prerender/prerender_contents.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -235,12 +235,6 @@ class PrerenderContents : public content::NotificationObserver,
235235
void AddResourceThrottle(
236236
const base::WeakPtr<PrerenderResourceThrottle>& throttle);
237237

238-
// Called when a PrerenderResourceThrottle changes a resource priority to
239-
// net::IDLE. The resources are reset back to their original priorities when
240-
// the prerender contents is swapped in.
241-
void AddIdleResource(
242-
const base::WeakPtr<PrerenderResourceThrottle>& throttle);
243-
244238
// Increments the number of bytes fetched over the network for this prerender.
245239
void AddNetworkBytes(int64_t bytes);
246240

@@ -378,8 +372,6 @@ class PrerenderContents : public content::NotificationObserver,
378372
// Resources that are throttled, pending a prerender use. Can only access a
379373
// throttle on the IO thread.
380374
std::vector<base::WeakPtr<PrerenderResourceThrottle> > resource_throttles_;
381-
// Resources for which the priority was lowered to net::IDLE.
382-
std::vector<base::WeakPtr<PrerenderResourceThrottle>> idle_resources_;
383375

384376
// A running tally of the number of bytes this prerender has caused to be
385377
// transferred over the network for resources. Updated with AddNetworkBytes.

chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,8 +284,10 @@ IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimultaneous) {
284284
base::FilePath first_path = ui_test_utils::GetTestFilePath(
285285
base::FilePath(), base::FilePath().AppendASCII(kPrefetchPage));
286286

287-
test_utils::CreateHangingFirstRequestInterceptor(
288-
first_url, first_path, base::Callback<void(net::URLRequest*)>());
287+
content::BrowserThread::PostTask(
288+
content::BrowserThread::IO, FROM_HERE,
289+
base::Bind(&test_utils::CreateHangingFirstRequestInterceptorOnIO,
290+
first_url, first_path, base::Closure()));
289291

290292
// Start the first prefetch directly instead of via PrefetchFromFile for the
291293
// first prefetch to avoid the wait on prerender stop.

0 commit comments

Comments
 (0)