Index: content/browser/webui/url_data_manager.h |
=================================================================== |
--- content/browser/webui/url_data_manager.h (revision 179094) |
+++ content/browser/webui/url_data_manager.h (working copy) |
@@ -9,37 +9,24 @@ |
#include <vector> |
#include "base/memory/ref_counted.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/sequenced_task_runner_helpers.h" |
#include "base/supports_user_data.h" |
-#include "base/synchronization/lock.h" |
#include "content/common/content_export.h" |
-class ChromeURLDataManagerBackend; |
-class MessageLoop; |
- |
-namespace base { |
-class RefCountedMemory; |
-} |
- |
namespace content { |
class BrowserContext; |
class URLDataSource; |
+class URLDataSourceImpl; |
class WebUIDataSource; |
-} |
-class URLDataSourceImpl; |
- |
// To serve dynamic data off of chrome: URLs, implement the |
-// ChromeURLDataManager::DataSource interface and register your handler |
+// URLDataManager::DataSource interface and register your handler |
// with AddDataSource. DataSources must be added on the UI thread (they are also |
// deleted on the UI thread). Internally the DataSources are maintained by |
-// ChromeURLDataManagerBackend, see it for details. |
-class CONTENT_EXPORT ChromeURLDataManager |
- : public base::SupportsUserData::Data { |
+// URLDataManagerBackend, see it for details. |
+class CONTENT_EXPORT URLDataManager : public base::SupportsUserData::Data { |
public: |
- explicit ChromeURLDataManager(content::BrowserContext* browser_context); |
- virtual ~ChromeURLDataManager(); |
+ explicit URLDataManager(BrowserContext* browser_context); |
+ virtual ~URLDataManager(); |
// Adds a DataSource to the collection of data sources. This *must* be invoked |
// on the UI thread. |
@@ -58,16 +45,14 @@ |
static void DeleteDataSources(); |
// Convenience wrapper function to add |source| to |browser_context|'s |
- // |ChromeURLDataManager|. Creates a URLDataSourceImpl to wrap the given |
+ // |URLDataManager|. Creates a URLDataSourceImpl to wrap the given |
// source. |
- static void AddDataSource( |
- content::BrowserContext* browser_context, |
- content::URLDataSource* source); |
+ static void AddDataSource(BrowserContext* browser_context, |
+ URLDataSource* source); |
- // Adds a WebUI data source to |browser_context|'s |ChromeURLDataManager|. |
- static void AddWebUIDataSource( |
- content::BrowserContext* browser_context, |
- content::WebUIDataSource* source); |
+ // Adds a WebUI data source to |browser_context|'s |URLDataManager|. |
+ static void AddWebUIDataSource(BrowserContext* browser_context, |
+ WebUIDataSource* source); |
private: |
friend class URLDataSourceImpl; |
@@ -83,85 +68,15 @@ |
// was invoked). |
static bool IsScheduledForDeletion(const URLDataSourceImpl* data_source); |
- content::BrowserContext* browser_context_; |
+ BrowserContext* browser_context_; |
// |data_sources_| that are no longer referenced and scheduled for deletion. |
// Protected by g_delete_lock in the .cc file. |
static URLDataSources* data_sources_; |
- DISALLOW_COPY_AND_ASSIGN(ChromeURLDataManager); |
+ DISALLOW_COPY_AND_ASSIGN(URLDataManager); |
}; |
-// Trait used to handle deleting a URLDataSource. Deletion happens on the UI |
-// thread. |
-// |
-// Implementation note: the normal shutdown sequence is for the UI loop to |
-// stop pumping events then the IO loop and thread are stopped. When the |
-// URLDataSources are no longer referenced (which happens when IO thread stops) |
-// they get added to the UI message loop for deletion. But because the UI loop |
-// has stopped by the time this happens the URLDataSources would be leaked. |
-// |
-// To make sure URLDataSources are properly deleted ChromeURLDataManager manages |
-// deletion of the URLDataSources. When a URLDataSource is no longer referenced |
-// it is added to |data_sources_| and a task is posted to the UI thread to |
-// handle the actual deletion. During shutdown |DeleteDataSources| is invoked so |
-// that all pending URLDataSources are properly deleted. |
-struct DeleteURLDataSource { |
- static void Destruct(const URLDataSourceImpl* data_source) { |
- ChromeURLDataManager::DeleteDataSource(data_source); |
- } |
-}; |
+} // namespace content |
-// A URLDataSource is an object that can answer requests for data |
-// asynchronously. URLDataSources are collectively owned with refcounting smart |
-// pointers and should never be deleted on the IO thread, since their calls |
-// are handled almost always on the UI thread and there's a possibility of a |
-// data race. The |DeleteDataSource| trait above is used to enforce this. |
-class URLDataSourceImpl : public base::RefCountedThreadSafe< |
- URLDataSourceImpl, DeleteURLDataSource> { |
- public: |
- // See source_name_ below for docs on that parameter. Takes ownership of |
- // |source|. |
- URLDataSourceImpl(const std::string& source_name, |
- content::URLDataSource* source); |
- |
- // Report that a request has resulted in the data |bytes|. |
- // If the request can't be satisfied, pass NULL for |bytes| to indicate |
- // the request is over. |
- virtual void SendResponse(int request_id, base::RefCountedMemory* bytes); |
- |
- const std::string& source_name() const { return source_name_; } |
- content::URLDataSource* source() const { return source_.get(); } |
- |
- protected: |
- virtual ~URLDataSourceImpl(); |
- |
- private: |
- friend class ChromeURLDataManagerBackend; |
- friend class ChromeURLDataManager; |
- friend class base::DeleteHelper<URLDataSourceImpl>; |
- |
- // SendResponse invokes this on the IO thread. Notifies the backend to |
- // handle the actual work of sending the data. |
- virtual void SendResponseOnIOThread( |
- int request_id, |
- scoped_refptr<base::RefCountedMemory> bytes); |
- |
- // The name of this source. |
- // E.g., for favicons, this could be "favicon", which results in paths for |
- // specific resources like "favicon/34" getting sent to this source. |
- const std::string source_name_; |
- |
- // This field is set and maintained by ChromeURLDataManagerBackend. It is |
- // set when the DataSource is added, and unset if the DataSource is removed. |
- // A DataSource can be removed in two ways: the ChromeURLDataManagerBackend |
- // is deleted, or another DataSource is registered with the same |
- // name. backend_ should only be accessed on the IO thread. |
- // This reference can't be via a scoped_refptr else there would be a cycle |
- // between the backend and data source. |
- ChromeURLDataManagerBackend* backend_; |
- |
- scoped_ptr<content::URLDataSource> source_; |
-}; |
- |
#endif // CONTENT_BROWSER_WEBUI_URL_DATA_MANAGER_H_ |