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

Unified Diff: content/browser/loader/resource_scheduler_unittest.cc

Issue 357583003: Adding observable throttle logic without the signals. Defaults to current behavior. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Underflow check added. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/loader/resource_scheduler.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/loader/resource_scheduler_unittest.cc
diff --git a/content/browser/loader/resource_scheduler_unittest.cc b/content/browser/loader/resource_scheduler_unittest.cc
index b3dbf3778d85e0f15839c1ea78bb71906ff22f59..5d06268ccbd09f4d16ce9ad430a3c3bd54a84cf7 100644
--- a/content/browser/loader/resource_scheduler_unittest.cc
+++ b/content/browser/loader/resource_scheduler_unittest.cc
@@ -32,6 +32,12 @@ class TestRequestFactory;
const int kChildId = 30;
const int kRouteId = 75;
+const int kChildId2 = 43;
+const int kRouteId2 = 67;
+const int kBackgroundChildId = 35;
+const int kBackgroundRouteId = 43;
+const int kBackgroundChildId2 = 54;
+const int kBackgroundRouteId2 = 82;
class TestRequest : public ResourceController {
public:
@@ -42,6 +48,7 @@ class TestRequest : public ResourceController {
url_request_(url_request.Pass()) {
throttle_->set_controller_for_testing(this);
}
+ virtual ~TestRequest() {}
bool started() const { return started_; }
@@ -51,11 +58,15 @@ class TestRequest : public ResourceController {
started_ = !deferred;
}
+ virtual void Cancel() OVERRIDE {
+ // Alert the scheduler that the request can be deleted.
+ throttle_.reset(0);
+ }
+
const net::URLRequest* url_request() const { return url_request_.get(); }
protected:
// ResourceController interface:
- virtual void Cancel() OVERRIDE {}
virtual void CancelAndIgnore() OVERRIDE {}
virtual void CancelWithError(int error_code) OVERRIDE {}
virtual void Resume() OVERRIDE { started_ = true; }
@@ -70,8 +81,7 @@ class CancelingTestRequest : public TestRequest {
public:
CancelingTestRequest(scoped_ptr<ResourceThrottle> throttle,
scoped_ptr<net::URLRequest> url_request)
- : TestRequest(throttle.Pass(), url_request.Pass()) {
- }
+ : TestRequest(throttle.Pass(), url_request.Pass()) {}
void set_request_to_cancel(scoped_ptr<TestRequest> request_to_cancel) {
request_to_cancel_ = request_to_cancel.Pass();
@@ -127,66 +137,115 @@ class ResourceSchedulerTest : public testing::Test {
: next_request_id_(0),
ui_thread_(BrowserThread::UI, &message_loop_),
io_thread_(BrowserThread::IO, &message_loop_) {
+ // TODO(aiolos): remove when throttling and coalescing have both landed
+ scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
+ false /* should_coalesce */);
+
scheduler_.OnClientCreated(kChildId, kRouteId);
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, true);
+ scheduler_.OnClientCreated(kBackgroundChildId, kBackgroundRouteId);
context_.set_http_server_properties(http_server_properties_.GetWeakPtr());
}
virtual ~ResourceSchedulerTest() {
scheduler_.OnClientDeleted(kChildId, kRouteId);
+ scheduler_.OnClientDeleted(kBackgroundChildId, kBackgroundRouteId);
}
- scoped_ptr<net::URLRequest> NewURLRequestWithRoute(
+ scoped_ptr<net::URLRequest> NewURLRequestWithChildAndRoute(
const char* url,
net::RequestPriority priority,
- int route_id) {
+ int child_id,
+ int route_id,
+ bool is_async) {
scoped_ptr<net::URLRequest> url_request(
context_.CreateRequest(GURL(url), priority, NULL, NULL));
ResourceRequestInfoImpl* info = new ResourceRequestInfoImpl(
- PROCESS_TYPE_RENDERER, // process_type
- kChildId, // child_id
- route_id, // route_id
- 0, // origin_pid
- ++next_request_id_, // request_id
- MSG_ROUTING_NONE, // render_frame_id
- false, // is_main_frame
- false, // parent_is_main_frame
- 0, // parent_render_frame_id
- ResourceType::SUB_RESOURCE, // resource_type
- PAGE_TRANSITION_LINK, // transition_type
- false, // should_replace_current_entry
- false, // is_download
- false, // is_stream
- true, // allow_download
- false, // has_user_gesture
- blink::WebReferrerPolicyDefault, // referrer_policy
- blink::WebPageVisibilityStateVisible, // visibility_state
- NULL, // context
+ PROCESS_TYPE_RENDERER, // process_type
+ child_id, // child_id
+ route_id, // route_id
+ 0, // origin_pid
+ ++next_request_id_, // request_id
+ MSG_ROUTING_NONE, // render_frame_id
+ false, // is_main_frame
+ false, // parent_is_main_frame
+ 0, // parent_render_frame_id
+ ResourceType::SUB_RESOURCE, // resource_type
+ PAGE_TRANSITION_LINK, // transition_type
+ false, // should_replace_current_entry
+ false, // is_download
+ false, // is_stream
+ true, // allow_download
+ false, // has_user_gesture
+ blink::WebReferrerPolicyDefault, // referrer_policy
+ blink::WebPageVisibilityStateVisible, // visibility_state
+ NULL, // context
base::WeakPtr<ResourceMessageFilter>(), // filter
- true); // is_async
+ is_async); // is_async
info->AssociateWithRequest(url_request.get());
return url_request.Pass();
}
scoped_ptr<net::URLRequest> NewURLRequest(const char* url,
net::RequestPriority priority) {
- return NewURLRequestWithRoute(url, priority, kRouteId);
+ return NewURLRequestWithChildAndRoute(
+ url, priority, kChildId, kRouteId, true);
}
TestRequest* NewRequestWithRoute(const char* url,
net::RequestPriority priority,
int route_id) {
- scoped_ptr<net::URLRequest> url_request(
- NewURLRequestWithRoute(url, priority, route_id));
- scoped_ptr<ResourceThrottle> throttle(scheduler_.ScheduleRequest(
- kChildId, route_id, url_request.get()));
+ return NewRequestWithChildAndRoute(url, priority, route_id, kChildId);
+ }
+
+ TestRequest* NewRequestWithChildAndRoute(const char* url,
+ net::RequestPriority priority,
+ int child_id,
+ int route_id) {
+ return GetNewTestRequest(url, priority, child_id, route_id, true);
+ }
+
+ TestRequest* NewRequest(const char* url, net::RequestPriority priority) {
+ return NewRequestWithChildAndRoute(url, priority, kChildId, kRouteId);
+ }
+
+ TestRequest* NewBackgroundRequest(const char* url,
+ net::RequestPriority priority) {
+ return NewRequestWithChildAndRoute(
+ url, priority, kBackgroundChildId, kBackgroundRouteId);
+ }
+
+ TestRequest* NewSyncRequest(const char* url, net::RequestPriority priority) {
+ return NewSyncRequestWithChildAndRoute(url, priority, kChildId, kRouteId);
+ }
+
+ TestRequest* NewBackgroundSyncRequest(const char* url,
+ net::RequestPriority priority) {
+ return NewSyncRequestWithChildAndRoute(
+ url, priority, kBackgroundChildId, kBackgroundRouteId);
+ }
+
+ TestRequest* NewSyncRequestWithChildAndRoute(const char* url,
+ net::RequestPriority priority,
+ int child_id,
+ int route_id) {
+ return GetNewTestRequest(url, priority, child_id, route_id, false);
+ }
+
+ TestRequest* GetNewTestRequest(const char* url,
+ net::RequestPriority priority,
+ int child_id,
+ int route_id,
+ bool is_async) {
+ scoped_ptr<net::URLRequest> url_request(NewURLRequestWithChildAndRoute(
+ url, priority, child_id, route_id, is_async));
+ scoped_ptr<ResourceThrottle> throttle(
+ scheduler_.ScheduleRequest(child_id, route_id, url_request.get()));
TestRequest* request = new TestRequest(throttle.Pass(), url_request.Pass());
request->Start();
return request;
}
- TestRequest* NewRequest(const char* url, net::RequestPriority priority) {
- return NewRequestWithRoute(url, priority, kRouteId);
- }
void ChangeRequestPriority(TestRequest* request,
net::RequestPriority new_priority,
@@ -243,7 +302,7 @@ TEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInsertedExceptSpdy) {
net::HostPortPair("spdyhost", 443), true);
scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
scoped_ptr<TestRequest> low_spdy(
- NewRequest("https://spdyhost/high", net::LOWEST));
+ NewRequest("https://spdyhost/low", net::LOWEST));
scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST));
EXPECT_TRUE(high->started());
@@ -293,8 +352,8 @@ TEST_F(ResourceSchedulerTest, CancelOtherRequestsWhileResuming) {
scoped_ptr<net::URLRequest> url_request(
NewURLRequest("http://host/low2", net::LOWEST));
- scoped_ptr<ResourceThrottle> throttle(scheduler_.ScheduleRequest(
- kChildId, kRouteId, url_request.get()));
+ scoped_ptr<ResourceThrottle> throttle(
+ scheduler_.ScheduleRequest(kChildId, kRouteId, url_request.get()));
scoped_ptr<CancelingTestRequest> low2(new CancelingTestRequest(
throttle.Pass(), url_request.Pass()));
low2->Start();
@@ -427,7 +486,7 @@ TEST_F(ResourceSchedulerTest, LowerPriority) {
TEST_F(ResourceSchedulerTest, ReprioritizedRequestGoesToBackOfQueue) {
// Dummies to enforce scheduling.
scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
- scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST));
+ scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST));
scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE));
@@ -457,7 +516,7 @@ TEST_F(ResourceSchedulerTest, ReprioritizedRequestGoesToBackOfQueue) {
TEST_F(ResourceSchedulerTest, HigherIntraPriorityGoesToFrontOfQueue) {
// Dummies to enforce scheduling.
scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
- scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST));
+ scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc.
ScopedVector<TestRequest> lows;
@@ -479,13 +538,39 @@ TEST_F(ResourceSchedulerTest, HigherIntraPriorityGoesToFrontOfQueue) {
TEST_F(ResourceSchedulerTest, NonHTTPSchedulesImmediately) {
// Dummies to enforce scheduling.
scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
- scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST));
+ scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
scoped_ptr<TestRequest> request(
NewRequest("chrome-extension://req", net::LOWEST));
EXPECT_TRUE(request->started());
}
+TEST_F(ResourceSchedulerTest, ActiveLoadingSyncSchedulesImmediately) {
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+ // Dummies to enforce scheduling.
+ scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
+ scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
+
+ scoped_ptr<TestRequest> request(
+ NewSyncRequest("http://host/req", net::LOWEST));
+ EXPECT_TRUE(request->started());
+}
+
+TEST_F(ResourceSchedulerTest, UnthrottledSyncSchedulesImmediately) {
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ // Dummies to enforce scheduling.
+ scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
+ scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
+
+ scoped_ptr<TestRequest> request(
+ NewBackgroundSyncRequest("http://host/req", net::LOWEST));
+ EXPECT_TRUE(request->started());
+}
+
TEST_F(ResourceSchedulerTest, SpdyProxySchedulesImmediately) {
scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
@@ -531,6 +616,1066 @@ TEST_F(ResourceSchedulerTest, NewSpdyHostInDelayableRequests) {
EXPECT_TRUE(low2->started());
}
+TEST_F(ResourceSchedulerTest, ThrottledClientCreation) {
+ EXPECT_TRUE(scheduler_.should_throttle());
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2);
+
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
+}
+
+TEST_F(ResourceSchedulerTest, ActiveClientThrottleUpdateOnLoadingChange) {
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false);
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+}
+
+TEST_F(ResourceSchedulerTest, CoalesceBackgroundClientOnLoadCompletion) {
+ scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
+ true /* should_coalesce */);
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId, kBackgroundRouteId, true);
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
+ EXPECT_EQ(ResourceScheduler::COALESCED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+}
+
+TEST_F(ResourceSchedulerTest, UnthrottleBackgroundClientOnLoadingStarted) {
+ scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
+ true /* should_coalesce */);
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId, kBackgroundRouteId, true);
+ EXPECT_EQ(ResourceScheduler::COALESCED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId, kBackgroundRouteId, false);
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+}
+
+TEST_F(ResourceSchedulerTest, OneRequestPerThrottledClient) {
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ scoped_ptr<TestRequest> high(
+ NewBackgroundRequest("http://host/high", net::HIGHEST));
+ scoped_ptr<TestRequest> request(
+ NewBackgroundRequest("http://host/req", net::IDLE));
+
+ EXPECT_TRUE(high->started());
+ EXPECT_FALSE(request->started());
+}
+
+TEST_F(ResourceSchedulerTest, UnthrottleNewlyVisibleClient) {
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ scoped_ptr<TestRequest> high(
+ NewBackgroundRequest("http://host/high", net::HIGHEST));
+ scoped_ptr<TestRequest> request(
+ NewBackgroundRequest("http://host/req", net::IDLE));
+ EXPECT_FALSE(request->started());
+
+ scheduler_.OnVisibilityChanged(kBackgroundChildId, kBackgroundRouteId, true);
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_TRUE(request->started());
+}
+
+TEST_F(ResourceSchedulerTest, UnthrottleNewlyAudibleClient) {
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ scoped_ptr<TestRequest> high(
+ NewBackgroundRequest("http://host/high", net::HIGHEST));
+ scoped_ptr<TestRequest> request(
+ NewBackgroundRequest("http://host/req", net::IDLE));
+ EXPECT_FALSE(request->started());
+
+ scheduler_.OnAudibilityChanged(kBackgroundChildId, kBackgroundRouteId, true);
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_TRUE(request->started());
+}
+
+TEST_F(ResourceSchedulerTest, VisibleClientStillUnthrottledOnAudabilityChange) {
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, true);
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, false);
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+}
+
+TEST_F(ResourceSchedulerTest, AudibleClientStillUnthrottledOnVisabilityChange) {
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, true);
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, true);
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+}
+
+TEST_F(ResourceSchedulerTest, ThrottledClientStartsNextHighestPriorityRequest) {
+ scoped_ptr<TestRequest> request(
+ NewBackgroundRequest("http://host/req", net::IDLE));
+ // Lower priority request started first to test request prioritizaton.
+ scoped_ptr<TestRequest> low(
+ NewBackgroundRequest("http://host/high", net::IDLE));
+ scoped_ptr<TestRequest> high(
+ NewBackgroundRequest("http://host/high", net::HIGHEST));
+
+ EXPECT_FALSE(low->started());
+ EXPECT_FALSE(high->started());
+
+ // request->CancelRequest();
+ request->Cancel();
+ EXPECT_TRUE(high->started());
+ EXPECT_FALSE(low->started());
+}
+
+TEST_F(ResourceSchedulerTest, ThrottledSpdyProxySchedulesImmediately) {
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ scoped_ptr<TestRequest> high(
+ NewBackgroundRequest("http://host/high", net::HIGHEST));
+ scoped_ptr<TestRequest> request(
+ NewBackgroundRequest("http://host/req", net::IDLE));
+
+ EXPECT_FALSE(request->started());
+
+ scheduler_.OnReceivedSpdyProxiedHttpResponse(kBackgroundChildId,
+ kBackgroundRouteId);
+ EXPECT_TRUE(request->started());
+
+ scoped_ptr<TestRequest> after(
+ NewBackgroundRequest("http://host/after", net::IDLE));
+ EXPECT_TRUE(after->started());
+}
+
+TEST_F(ResourceSchedulerTest, CoalescedClientIssuesNoRequests) {
+ scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
+ true /* should_coalesce */);
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId, kBackgroundRouteId, true);
+ EXPECT_EQ(ResourceScheduler::COALESCED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ scoped_ptr<TestRequest> high(
+ NewBackgroundRequest("http://host/high", net::HIGHEST));
+ scoped_ptr<TestRequest> request(
+ NewBackgroundRequest("http://host/req", net::IDLE));
+
+ EXPECT_FALSE(high->started());
+ EXPECT_FALSE(request->started());
+
+ scheduler_.OnReceivedSpdyProxiedHttpResponse(kBackgroundChildId,
+ kBackgroundRouteId);
+ EXPECT_FALSE(high->started());
+
+ scoped_ptr<TestRequest> after(
+ NewBackgroundRequest("http://host/after", net::HIGHEST));
+ EXPECT_FALSE(after->started());
+}
+
+TEST_F(ResourceSchedulerTest, CoalescedSpdyProxyWaits) {
+ scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
+ true /* should_coalesce */);
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId, kBackgroundRouteId, true);
+ EXPECT_EQ(ResourceScheduler::COALESCED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ scoped_ptr<TestRequest> high(
+ NewBackgroundRequest("http://host/high", net::HIGHEST));
+ scoped_ptr<TestRequest> request(
+ NewBackgroundRequest("http://host/req", net::IDLE));
+
+ EXPECT_FALSE(request->started());
+
+ scheduler_.OnReceivedSpdyProxiedHttpResponse(kBackgroundChildId,
+ kBackgroundRouteId);
+ EXPECT_FALSE(request->started());
+
+ scoped_ptr<TestRequest> after(
+ NewBackgroundRequest("http://host/after", net::IDLE));
+ EXPECT_FALSE(after->started());
+}
+
+TEST_F(ResourceSchedulerTest, ThrottledNonHTTPSchedulesImmediately) {
+ // Dummies to enforce scheduling.
+ scoped_ptr<TestRequest> high(
+ NewBackgroundRequest("http://host/high", net::HIGHEST));
+ scoped_ptr<TestRequest> low(
+ NewBackgroundRequest("http://host/low", net::LOWEST));
+
+ scoped_ptr<TestRequest> request(
+ NewBackgroundRequest("chrome-extension://req", net::LOWEST));
+ EXPECT_TRUE(request->started());
+ EXPECT_FALSE(low->started());
+}
+
+TEST_F(ResourceSchedulerTest, CoalescedNonHTTPSchedulesImmediately) {
+ scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
+ true /* should_coalesce */);
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId, kBackgroundRouteId, true);
+ EXPECT_EQ(ResourceScheduler::COALESCED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ // Dummies to enforce scheduling.
+ scoped_ptr<TestRequest> high(
+ NewBackgroundRequest("http://host/high", net::HIGHEST));
+ scoped_ptr<TestRequest> low(
+ NewBackgroundRequest("http://host/low", net::LOWEST));
+
+ scoped_ptr<TestRequest> request(
+ NewBackgroundRequest("chrome-extension://req", net::LOWEST));
+ EXPECT_TRUE(request->started());
+ EXPECT_FALSE(low->started());
+}
+
+TEST_F(ResourceSchedulerTest, ThrottledSyncSchedulesImmediately) {
+ // Dummies to enforce scheduling.
+ scoped_ptr<TestRequest> high(
+ NewBackgroundRequest("http://host/high", net::HIGHEST));
+ scoped_ptr<TestRequest> low(
+ NewBackgroundRequest("http://host/low", net::LOWEST));
+
+ scoped_ptr<TestRequest> request(
+ NewBackgroundSyncRequest("http://host/req", net::LOWEST));
+ EXPECT_TRUE(request->started());
+ EXPECT_FALSE(low->started());
+}
+
+TEST_F(ResourceSchedulerTest, CoalescedSyncSchedulesImmediately) {
+ scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
+ true /* should_coalesce */);
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId, kBackgroundRouteId, true);
+ EXPECT_EQ(ResourceScheduler::COALESCED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ // Dummies to enforce scheduling.
+ scoped_ptr<TestRequest> high(
+ NewBackgroundRequest("http://host/high", net::HIGHEST));
+ scoped_ptr<TestRequest> low(
+ NewBackgroundRequest("http://host/low", net::LOWEST));
+
+ scoped_ptr<TestRequest> request(
+ NewBackgroundSyncRequest("http://host/req", net::LOWEST));
+ EXPECT_TRUE(request->started());
+ EXPECT_FALSE(low->started());
+ EXPECT_FALSE(high->started());
+}
+
+TEST_F(ResourceSchedulerTest, AllBackgroundClientsUnthrottle) {
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
+ EXPECT_TRUE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false);
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId, kBackgroundRouteId, true);
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+}
+
+TEST_F(ResourceSchedulerTest,
+ UnloadedClientVisibilityChangedCorrectlyUnthrottles) {
+ scheduler_.OnClientCreated(kChildId2, kRouteId2);
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2);
+ scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true);
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId2, kBackgroundRouteId2, true);
+
+ // 1 visible, 3 hidden
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 2 visible, 2 hidden
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 1 visible, 3 hidden
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, false);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2);
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
+}
+
+TEST_F(ResourceSchedulerTest,
+ UnloadedClientAudibilityChangedCorrectlyUnthrottles) {
+ scheduler_.OnClientCreated(kChildId2, kRouteId2);
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2);
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId2, kBackgroundRouteId2, true);
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, true);
+
+ // 1 audible, 3 hidden
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 2 audible, 2 hidden
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 1 audible, 3 hidden
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, false);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2);
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
+}
+
+TEST_F(ResourceSchedulerTest,
+ LoadedClientVisibilityChangedCorrectlyUnthrottles) {
+ scheduler_.OnClientCreated(kChildId2, kRouteId2);
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2);
+ scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true);
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId2, kBackgroundRouteId2, true);
+ // 1 visible, 3 hidden
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 2 visible, 2 hidden
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 1 visible, 3 hidden
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, false);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2);
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
+}
+
+TEST_F(ResourceSchedulerTest,
+ LoadedClientAudibilityChangedCorrectlyUnthrottles) {
+ scheduler_.OnClientCreated(kChildId2, kRouteId2);
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2);
+ scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true);
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId2, kBackgroundRouteId2, true);
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, true);
+ // 1 audible, 3 hidden
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 2 audible, 2 hidden
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 1 audible, 3 hidden
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, false);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2);
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
+}
+
+TEST_F(ResourceSchedulerTest, UnloadedClientBecomesHiddenCorrectlyUnthrottles) {
+ scheduler_.OnClientCreated(kChildId2, kRouteId2);
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2);
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId2, kBackgroundRouteId2, true);
+
+ // 2 visible, 2 hidden
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 1 visible, 3 hidden
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, false);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 0 visible, 4 hidden
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
+ EXPECT_TRUE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 1 visible, 3 hidden
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, true);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2);
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
+}
+
+TEST_F(ResourceSchedulerTest, UnloadedClientBecomesSilentCorrectlyUnthrottles) {
+ scheduler_.OnClientCreated(kChildId2, kRouteId2);
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2);
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId2, kBackgroundRouteId2, true);
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, true);
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true);
+ // 2 audible, 2 hidden
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 1 audible, 3 hidden
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, false);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 0 audible, 4 hidden
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, false);
+ EXPECT_TRUE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 1 audible, 3 hidden
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, true);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2);
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
+}
+
+TEST_F(ResourceSchedulerTest, LoadedClientBecomesHiddenCorrectlyThrottles) {
+ scheduler_.OnClientCreated(kChildId2, kRouteId2);
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2);
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId2, kBackgroundRouteId2, true);
+ scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true);
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true);
+ // 2 visible, 2 hidden
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 1 visible, 3 hidden
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, false);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 0 visible, 4 hidden
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
+ EXPECT_TRUE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 1 visible, 3 hidden
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true);
+ EXPECT_TRUE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2);
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
+}
+
+TEST_F(ResourceSchedulerTest, LoadedClientBecomesSilentCorrectlyThrottles) {
+ scheduler_.OnClientCreated(kChildId2, kRouteId2);
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2);
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId2, kBackgroundRouteId2, true);
+ scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true);
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, true);
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true);
+ // 2 audible, 2 hidden
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 1 audible, 3 hidden
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, false);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 0 audible, 4 hidden
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, false);
+ EXPECT_TRUE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 1 audible, 3 hidden
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true);
+ EXPECT_TRUE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2);
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
+}
+
+TEST_F(ResourceSchedulerTest, HiddenLoadedChangesCorrectlyStayThrottled) {
+ scheduler_.OnClientCreated(kChildId2, kRouteId2);
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2);
+
+ // 1 visible and 2 hidden loading, 1 visible loaded
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true);
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 1 visible and 1 hidden loading, 1 visible and 1 hidden loaded
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId2, kBackgroundRouteId2, true);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 1 visible loading, 1 visible and 2 hidden loaded
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId, kBackgroundRouteId, true);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 1 visible and 1 hidden loading, 1 visible and 1 hidden loaded
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId2, kBackgroundRouteId2, true);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2);
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
+}
+
+TEST_F(ResourceSchedulerTest, PartialVisibleClientLoadedDoesNotUnthrottle) {
+ scheduler_.OnClientCreated(kChildId2, kRouteId2);
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2);
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true);
+
+ // 2 visible loading, 1 hidden loading, 1 hidden loaded
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId2, kBackgroundRouteId2, true);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 2 visible loading, 1 hidden loading, 1 hidden loaded
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2);
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
+}
+
+TEST_F(ResourceSchedulerTest, FullVisibleLoadedCorrectlyUnthrottle) {
+ scheduler_.OnClientCreated(kChildId2, kRouteId2);
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2);
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true);
+
+ // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId2, kBackgroundRouteId2, true);
+ scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ scoped_ptr<TestRequest> high(
+ NewBackgroundRequest("http://host/high", net::HIGHEST));
+ scoped_ptr<TestRequest> low(
+ NewBackgroundRequest("http://host/low", net::LOWEST));
+
+ EXPECT_TRUE(high->started());
+ EXPECT_FALSE(low->started());
+
+ // 2 visible loaded, 1 hidden loading, 1 hidden loaded
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
+ EXPECT_TRUE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+ // kBackgroundClientId unthrottling should unthrottle it's request.
+ EXPECT_TRUE(low->started());
+
+ // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2);
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
+}
+
+TEST_F(ResourceSchedulerTest,
+ ActiveAndLoadingClientDeletedCorrectlyUnthrottle) {
+ scheduler_.OnClientCreated(kChildId2, kRouteId2);
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2);
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true);
+
+ // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading
+ scheduler_.OnLoadingStateChanged(
+ kBackgroundChildId2, kBackgroundRouteId2, true);
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
+
+ // 1 visible loaded, 1 hidden loading, 1 hidden loaded
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2);
+ EXPECT_TRUE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false);
+ EXPECT_FALSE(scheduler_.active_clients_loaded());
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId,
+ kBackgroundRouteId));
+ EXPECT_EQ(ResourceScheduler::THROTTLED,
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2,
+ kBackgroundRouteId2));
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId));
+
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
+}
+
} // unnamed namespace
} // namespace content
« no previous file with comments | « content/browser/loader/resource_scheduler.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698