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