Index: content/browser/loader/resource_scheduler.h |
diff --git a/content/browser/loader/resource_scheduler.h b/content/browser/loader/resource_scheduler.h |
index 60cf0cd69f8c10360b3c3f43babb2a61744e7443..2d5d986203030ab1836d18b13909d2a7069ad39c 100644 |
--- a/content/browser/loader/resource_scheduler.h |
+++ b/content/browser/loader/resource_scheduler.h |
@@ -14,6 +14,7 @@ |
#include "base/threading/non_thread_safe.h" |
#include "base/timer/timer.h" |
#include "content/common/content_export.h" |
+#include "content/public/browser/resource_throttle.h" |
#include "net/base/priority_queue.h" |
#include "net/base/request_priority.h" |
@@ -23,7 +24,6 @@ class URLRequest; |
} |
namespace content { |
-class ResourceThrottle; |
// There is one ResourceScheduler. All renderer-initiated HTTP requests are |
// expected to pass through it. |
@@ -44,9 +44,9 @@ class ResourceThrottle; |
// Each Client may have many Requests in flight. Requests are uniquely |
// identified within a Client by its ScheduledResourceRequest. |
// |
-// Users should call ScheduleRequest() to notify this ResourceScheduler of a |
-// new request. The returned ResourceThrottle should be destroyed when the load |
-// finishes or is canceled. |
+// Users should call ScheduleRequest() to notify this ResourceScheduler of a new |
+// request. The returned ScheduledResourceRequest should be destroyed when the |
+// load finishes or is canceled, before the net::URLRequest. |
// |
// The scheduler may defer issuing the request via the ResourceThrottle |
// interface or it may alter the request's priority by calling set_priority() on |
@@ -86,6 +86,25 @@ class CONTENT_EXPORT ResourceScheduler : public base::NonThreadSafe { |
LAYOUT_BLOCKING_REQUEST, |
}; |
+ // Handle for a scheduled request. On creation, it will attach itself to the |
+ // net::URLRequest it is associated with. On destruction, it will detach |
+ // itself. It must be destroyed before the associated URLRequest. |
+ class ScheduledResourceRequest : public ResourceThrottle { |
+ public: |
+ ScheduledResourceRequest(); |
+ ~ScheduledResourceRequest() override; |
+ |
+ virtual void ChangePriority(net::RequestPriority new_priority, |
+ int intra_priority_value) = 0; |
+ |
+ // If there currently exists a ScheduledResourceRequest-implementing object |
+ // for |request|, then return it. Otherwise returns nullptr. |
+ static ScheduledResourceRequest* ForRequest(net::URLRequest* request); |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(ScheduledResourceRequest); |
+ }; |
+ |
ResourceScheduler(); |
~ResourceScheduler(); |
@@ -103,10 +122,13 @@ class CONTENT_EXPORT ResourceScheduler : public base::NonThreadSafe { |
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. |
- scoped_ptr<ResourceThrottle> ScheduleRequest( |
- int child_id, int route_id, net::URLRequest* url_request); |
+ // specified |url_request|. Caller should delete the returned |
+ // ScheduledResourceRequest when the load completes or is canceled. |
+ scoped_ptr<ScheduledResourceRequest> ScheduleRequest( |
+ int child_id, |
+ int route_id, |
+ bool is_async, |
+ net::URLRequest* url_request); |
// Signals from the UI thread, posted as tasks on the IO thread: |
@@ -154,6 +176,8 @@ class CONTENT_EXPORT ResourceScheduler : public base::NonThreadSafe { |
bool HasLoadingClients() const; |
private: |
+ friend class ScheduledResourceRequest; |
+ |
// Returns true if limiting of outstanding requests is enabled. |
bool limit_outstanding_requests() const { |
return limit_outstanding_requests_; |
@@ -175,20 +199,20 @@ class CONTENT_EXPORT ResourceScheduler : public base::NonThreadSafe { |
}; |
class RequestQueue; |
- class ScheduledResourceRequest; |
+ class ScheduledResourceRequestImpl; |
struct RequestPriorityParams; |
struct ScheduledResourceSorter { |
- bool operator()(const ScheduledResourceRequest* a, |
- const ScheduledResourceRequest* b) const; |
+ bool operator()(const ScheduledResourceRequestImpl* a, |
+ const ScheduledResourceRequestImpl* b) const; |
}; |
class Client; |
typedef int64 ClientId; |
typedef std::map<ClientId, Client*> ClientMap; |
- typedef std::set<ScheduledResourceRequest*> RequestSet; |
+ typedef std::set<ScheduledResourceRequestImpl*> RequestSet; |
- // Called when a ScheduledResourceRequest is destroyed. |
- void RemoveRequest(ScheduledResourceRequest* request); |
+ // Called when a ScheduledResourceRequestImpl is destroyed. |
+ void RemoveRequest(ScheduledResourceRequestImpl* request); |
// These calls may update the ThrottleState of all clients, and have the |
// potential to be re-entrant. |
@@ -221,7 +245,7 @@ class CONTENT_EXPORT ResourceScheduler : public base::NonThreadSafe { |
// Queues are maintained for each priority level. When |request| is |
// reprioritized, it will move to the end of the queue for that priority |
// level. |
- void ReprioritizeRequest(ScheduledResourceRequest* request, |
+ void ReprioritizeRequest(ScheduledResourceRequestImpl* request, |
net::RequestPriority new_priority, |
int intra_priority_value); |
@@ -241,6 +265,8 @@ class CONTENT_EXPORT ResourceScheduler : public base::NonThreadSafe { |
// This is a repeating timer to initiate requests on COALESCED Clients. |
scoped_ptr<base::Timer> coalescing_timer_; |
RequestSet unowned_requests_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ResourceScheduler); |
}; |
} // namespace content |