• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef NET_URL_REQUEST_URL_REQUEST_JOB_TRACKER_H_
6 #define NET_URL_REQUEST_URL_REQUEST_JOB_TRACKER_H_
7 #pragma once
8 
9 #include <vector>
10 
11 #include "base/observer_list.h"
12 #include "net/url_request/url_request_status.h"
13 
14 class GURL;
15 
16 namespace net {
17 class URLRequestJob;
18 
19 // This class maintains a list of active URLRequestJobs for debugging purposes.
20 // This allows us to warn on leaked jobs and also allows an observer to track
21 // what is happening, for example, for the network status monitor.
22 //
23 // NOTE: URLRequest is single-threaded, so this class should only be used
24 // onthe same thread where all of the application's URLRequest calls are
25 // made.
26 //
27 class URLRequestJobTracker {
28  public:
29   typedef std::vector<URLRequestJob*> JobList;
30   typedef JobList::const_iterator JobIterator;
31 
32   // The observer's methods are called on the thread that called AddObserver.
33   class JobObserver {
34    public:
~JobObserver()35     virtual ~JobObserver() {}
36 
37     // Called after the given job has been added to the list
38     virtual void OnJobAdded(URLRequestJob* job) = 0;
39 
40     // Called after the given job has been removed from the list
41     virtual void OnJobRemoved(URLRequestJob* job) = 0;
42 
43     // Called when the given job has completed, before notifying the request
44     virtual void OnJobDone(URLRequestJob* job,
45                            const URLRequestStatus& status) = 0;
46 
47     // Called when the given job is about to follow a redirect to the given
48     // new URL. The redirect type is given in status_code
49     virtual void OnJobRedirect(URLRequestJob* job, const GURL& location,
50                                int status_code) = 0;
51 
52     // Called when a new chunk of unfiltered bytes has been read for
53     // the given job. |byte_count| is the number of bytes for that
54     // read event only. |buf| is a pointer to the data buffer that
55     // contains those bytes. The data in |buf| is only valid for the
56     // duration of the OnBytesRead callback.
57     virtual void OnBytesRead(URLRequestJob* job, const char* buf,
58                              int byte_count) = 0;
59   };
60 
61   URLRequestJobTracker();
62   ~URLRequestJobTracker();
63 
64   // adds or removes an observer from the list.  note, these methods should
65   // only be called on the same thread where URLRequest objects are used.
AddObserver(JobObserver * observer)66   void AddObserver(JobObserver* observer) {
67     observers_.AddObserver(observer);
68   }
RemoveObserver(JobObserver * observer)69   void RemoveObserver(JobObserver* observer) {
70     observers_.RemoveObserver(observer);
71   }
72 
73   // adds or removes the job from the active list, should be called by the
74   // job constructor and destructor. Note: don't use "AddJob" since that
75   // is #defined by windows.h :(
76   void AddNewJob(URLRequestJob* job);
77   void RemoveJob(URLRequestJob* job);
78 
79   // Job status change notifications
80   void OnJobDone(URLRequestJob* job, const URLRequestStatus& status);
81   void OnJobRedirect(URLRequestJob* job, const GURL& location,
82                      int status_code);
83 
84   // Bytes read notifications.
85   void OnBytesRead(URLRequestJob* job, const char* buf, int byte_count);
86 
87   // allows iteration over all active jobs
begin()88   JobIterator begin() const {
89     return active_jobs_.begin();
90   }
end()91   JobIterator end() const {
92     return active_jobs_.end();
93   }
94 
95  private:
96   ObserverList<JobObserver> observers_;
97   JobList active_jobs_;
98 };
99 
100 extern URLRequestJobTracker g_url_request_job_tracker;
101 
102 }  // namespace net
103 
104 #endif  // NET_URL_REQUEST_URL_REQUEST_JOB_TRACKER_H_
105