OLD | NEW |
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 "content/browser/loader/resource_scheduler.h" | 5 #include "content/browser/loader/resource_scheduler.h" |
6 | 6 |
7 #include "base/memory/scoped_vector.h" | 7 #include "base/memory/scoped_vector.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
10 #include "content/browser/browser_thread_impl.h" | 10 #include "content/browser/browser_thread_impl.h" |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 TestRequest* request = new TestRequest(throttle.Pass(), url_request.Pass()); | 183 TestRequest* request = new TestRequest(throttle.Pass(), url_request.Pass()); |
184 request->Start(); | 184 request->Start(); |
185 return request; | 185 return request; |
186 } | 186 } |
187 | 187 |
188 TestRequest* NewRequest(const char* url, net::RequestPriority priority) { | 188 TestRequest* NewRequest(const char* url, net::RequestPriority priority) { |
189 return NewRequestWithRoute(url, priority, kRouteId); | 189 return NewRequestWithRoute(url, priority, kRouteId); |
190 } | 190 } |
191 | 191 |
192 void ChangeRequestPriority(TestRequest* request, | 192 void ChangeRequestPriority(TestRequest* request, |
193 net::RequestPriority new_priority) { | 193 net::RequestPriority new_priority, |
| 194 int intra_priority = 0) { |
194 scoped_refptr<FakeResourceMessageFilter> filter( | 195 scoped_refptr<FakeResourceMessageFilter> filter( |
195 new FakeResourceMessageFilter(kChildId)); | 196 new FakeResourceMessageFilter(kChildId)); |
196 const ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest( | 197 const ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest( |
197 request->url_request()); | 198 request->url_request()); |
198 const GlobalRequestID& id = info->GetGlobalRequestID(); | 199 const GlobalRequestID& id = info->GetGlobalRequestID(); |
199 ResourceHostMsg_DidChangePriority msg(id.request_id, new_priority); | 200 ResourceHostMsg_DidChangePriority msg(id.request_id, new_priority, |
| 201 intra_priority); |
200 bool ok = false; | 202 bool ok = false; |
201 rdh_.OnMessageReceived(msg, filter.get(), &ok); | 203 rdh_.OnMessageReceived(msg, filter.get(), &ok); |
202 EXPECT_TRUE(ok); | 204 EXPECT_TRUE(ok); |
203 } | 205 } |
204 | 206 |
205 int next_request_id_; | 207 int next_request_id_; |
206 base::MessageLoopForIO message_loop_; | 208 base::MessageLoopForIO message_loop_; |
207 BrowserThreadImpl ui_thread_; | 209 BrowserThreadImpl ui_thread_; |
208 BrowserThreadImpl io_thread_; | 210 BrowserThreadImpl io_thread_; |
209 ResourceDispatcherHostImpl rdh_; | 211 ResourceDispatcherHostImpl rdh_; |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
448 | 450 |
449 ChangeRequestPriority(request.get(), net::LOWEST); | 451 ChangeRequestPriority(request.get(), net::LOWEST); |
450 EXPECT_FALSE(request->started()); | 452 EXPECT_FALSE(request->started()); |
451 EXPECT_FALSE(idle->started()); | 453 EXPECT_FALSE(idle->started()); |
452 | 454 |
453 scheduler_.OnWillInsertBody(kChildId, kRouteId); | 455 scheduler_.OnWillInsertBody(kChildId, kRouteId); |
454 EXPECT_FALSE(request->started()); | 456 EXPECT_FALSE(request->started()); |
455 EXPECT_FALSE(idle->started()); | 457 EXPECT_FALSE(idle->started()); |
456 } | 458 } |
457 | 459 |
| 460 TEST_F(ResourceSchedulerTest, HigherIntraPriorityGoesToFrontOfQueue) { |
| 461 // Dummies to enforce scheduling. |
| 462 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
| 463 scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST)); |
| 464 |
| 465 const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. |
| 466 ScopedVector<TestRequest> lows; |
| 467 for (int i = 0; i < kMaxNumDelayableRequestsPerClient; ++i) { |
| 468 string url = "http://host/low" + base::IntToString(i); |
| 469 lows.push_back(NewRequest(url.c_str(), net::IDLE)); |
| 470 } |
| 471 |
| 472 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); |
| 473 EXPECT_FALSE(request->started()); |
| 474 |
| 475 ChangeRequestPriority(request.get(), net::IDLE, 1); |
| 476 EXPECT_FALSE(request->started()); |
| 477 |
| 478 scheduler_.OnWillInsertBody(kChildId, kRouteId); |
| 479 EXPECT_TRUE(request->started()); |
| 480 } |
| 481 |
458 TEST_F(ResourceSchedulerTest, NonHTTPSchedulesImmediately) { | 482 TEST_F(ResourceSchedulerTest, NonHTTPSchedulesImmediately) { |
459 // Dummies to enforce scheduling. | 483 // Dummies to enforce scheduling. |
460 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); | 484 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
461 scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST)); | 485 scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST)); |
462 | 486 |
463 scoped_ptr<TestRequest> request( | 487 scoped_ptr<TestRequest> request( |
464 NewRequest("chrome-extension://req", net::LOWEST)); | 488 NewRequest("chrome-extension://req", net::LOWEST)); |
465 EXPECT_TRUE(request->started()); | 489 EXPECT_TRUE(request->started()); |
466 } | 490 } |
467 | 491 |
468 TEST_F(ResourceSchedulerTest, SpdyProxySchedulesImmediately) { | 492 TEST_F(ResourceSchedulerTest, SpdyProxySchedulesImmediately) { |
469 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); | 493 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
470 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); | 494 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); |
471 | 495 |
472 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); | 496 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); |
473 EXPECT_FALSE(request->started()); | 497 EXPECT_FALSE(request->started()); |
474 | 498 |
475 scheduler_.OnReceivedSpdyProxiedHttpResponse(kChildId, kRouteId); | 499 scheduler_.OnReceivedSpdyProxiedHttpResponse(kChildId, kRouteId); |
476 EXPECT_TRUE(request->started()); | 500 EXPECT_TRUE(request->started()); |
477 | 501 |
478 scoped_ptr<TestRequest> after(NewRequest("http://host/after", net::IDLE)); | 502 scoped_ptr<TestRequest> after(NewRequest("http://host/after", net::IDLE)); |
479 EXPECT_TRUE(after->started()); | 503 EXPECT_TRUE(after->started()); |
480 } | 504 } |
481 | 505 |
482 } // unnamed namespace | 506 } // unnamed namespace |
483 | 507 |
484 } // namespace content | 508 } // namespace content |
OLD | NEW |