Index: content/browser/loader/resource_scheduler.h |
diff --git a/content/browser/loader/resource_scheduler.h b/content/browser/loader/resource_scheduler.h |
index 0e918f10c6d07b2e5467551026ee2257267abe83..b445a6818fddec1e7726ff9b16c32ad5773d205d 100644 |
--- a/content/browser/loader/resource_scheduler.h |
+++ b/content/browser/loader/resource_scheduler.h |
@@ -52,9 +52,31 @@ class ResourceThrottle; |
// the URLRequest. |
class CONTENT_EXPORT ResourceScheduler : public base::NonThreadSafe { |
public: |
+ enum ClientThrottleState { |
+ // Loaded background client, all observable clients loaded. |
+ COALESCED, |
+ // Background client, an observable client is loading. |
+ THROTTLED, |
+ // Observable (active) loaded client or |
+ // Loading background client, all observable clients loaded. |
+ // Note that clients which would be COALESCED are UNTHROTTLED until |
+ // coalescing is turned on. |
+ UNTHROTTLED, |
+ // Observable (active) loading client. |
+ ACTIVE_AND_LOADING, |
+ }; |
+ |
ResourceScheduler(); |
~ResourceScheduler(); |
+ // TODO(aiolos): Remove when throttling and coalescing have landed |
+ void SetThrottleOptionsForTesting(bool should_throttle, bool should_coalesce); |
+ |
+ bool should_coalesce() const { return should_coalesce_; } |
+ bool should_throttle() const { return should_throttle_; } |
+ |
+ ClientThrottleState GetClientStateForTesting(int child_id, int route_id); |
+ |
// Requests that this ResourceScheduler schedule, and eventually loads, the |
// specified |url_request|. Caller should delete the returned ResourceThrottle |
// when the load completes or is canceled. |
@@ -78,12 +100,25 @@ class CONTENT_EXPORT ResourceScheduler : public base::NonThreadSafe { |
// resource loads won't interfere with first paint. |
void OnWillInsertBody(int child_id, int route_id); |
- // Signals from the IO thread |
+ // Signals from the IO thread: |
// Called when we received a response to a http request that was served |
// from a proxy using SPDY. |
void OnReceivedSpdyProxiedHttpResponse(int child_id, int route_id); |
+ // Client functions: |
+ |
+ // Called to check if all user observable tabs have completed loading. |
+ bool active_clients_loaded() const { return active_clients_loading_ == 0; } |
+ |
+ // Called when a Client starts or stops playing audio. |
+ void OnAudibilityChanged(int child_id, int route_id, bool is_audible); |
+ |
+ // Called when a Client is shown or hidden. |
+ void OnVisibilityChanged(int child_id, int route_id, bool is_visible); |
+ |
+ void OnLoadingStateChanged(int child_id, int route_id, bool is_loaded); |
+ |
private: |
class RequestQueue; |
class ScheduledResourceRequest; |
@@ -101,6 +136,17 @@ class CONTENT_EXPORT ResourceScheduler : public base::NonThreadSafe { |
// Called when a ScheduledResourceRequest is destroyed. |
void RemoveRequest(ScheduledResourceRequest* request); |
+ // These Calls may update the ThrottleState of all clients, and have the |
+ // potential to be re-entarant. |
+ // Called when a Client newly becomes active loading. |
+ void DecrementActiveClientsLoading(); |
+ // Caled when a Client stops being active loading. |
+ void IncrementActiveClientsLoading(); |
+ |
+ void OnLoadingActiveClientsStateChanged(); |
+ |
+ size_t CountActiveClientsLoading(); |
+ |
// Update the queue position for |request|, possibly causing it to start |
// loading. |
// |
@@ -114,7 +160,13 @@ class CONTENT_EXPORT ResourceScheduler : public base::NonThreadSafe { |
// Returns the client ID for the given |child_id| and |route_id| combo. |
ClientId MakeClientId(int child_id, int route_id); |
+ // Returns the client for the given |child_id| and |route_id| combo. |
+ Client* GetClient(int child_id, int route_id); |
+ |
+ bool should_coalesce_; |
+ bool should_throttle_; |
ClientMap client_map_; |
+ size_t active_clients_loading_; |
RequestSet unowned_requests_; |
}; |