12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CONTENT_BROWSER_WEBUI_URL_DATA_MANAGER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CONTENT_BROWSER_WEBUI_URL_DATA_MANAGER_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/supports_user_data.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/content_export.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BrowserContext;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLDataSource;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLDataSourceImpl;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebUIDataSource;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// To serve dynamic data off of chrome: URLs, implement the
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// URLDataManager::DataSource interface and register your handler
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// with AddDataSource. DataSources must be added on the UI thread (they are also
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// deleted on the UI thread). Internally the DataSources are maintained by
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// URLDataManagerBackend, see it for details.
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CONTENT_EXPORT URLDataManager : public base::SupportsUserData::Data {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit URLDataManager(BrowserContext* browser_context);
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~URLDataManager();
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adds a DataSource to the collection of data sources. This *must* be invoked
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // on the UI thread.
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If |AddDataSource| is called more than once for a particular name it will
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // release the old |DataSource|, most likely resulting in it getting deleted
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // as there are no other references to it. |DataSource| uses the
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |DeleteOnUIThread| trait to insure that the destructor is called on the UI
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // thread. This is necessary as some |DataSource|s notably |FileIconSource|
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and |FaviconSource|, have members that will DCHECK if they are not
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // destructed in the same thread as they are constructed (the UI thread).
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddDataSource(URLDataSourceImpl* source);
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Deletes any data sources no longer referenced. This is normally invoked
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for you, but can be invoked to force deletion (such as during shutdown).
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void DeleteDataSources();
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Convenience wrapper function to add |source| to |browser_context|'s
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |URLDataManager|. Creates a URLDataSourceImpl to wrap the given
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // source.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void AddDataSource(BrowserContext* browser_context,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            URLDataSource* source);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adds a WebUI data source to |browser_context|'s |URLDataManager|.
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void AddWebUIDataSource(BrowserContext* browser_context,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 WebUIDataSource* source);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class URLDataSourceImpl;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend struct DeleteURLDataSource;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::vector<const URLDataSourceImpl*> URLDataSources;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If invoked on the UI thread the DataSource is deleted immediatlye,
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // otherwise it is added to |data_sources_| and a task is scheduled to handle
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // deletion on the UI thread. See note abouve DeleteDataSource for more info.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void DeleteDataSource(const URLDataSourceImpl* data_source);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if |data_source| is scheduled for deletion (|DeleteDataSource|
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // was invoked).
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool IsScheduledForDeletion(const URLDataSourceImpl* data_source);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserContext* browser_context_;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |data_sources_| that are no longer referenced and scheduled for deletion.
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Protected by g_delete_lock in the .cc file.
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static URLDataSources* data_sources_;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(URLDataManager);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace content
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CONTENT_BROWSER_WEBUI_URL_DATA_MANAGER_H_
83