// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_WEB_WEBUI_URL_DATA_MANAGER_IOS_H_
#define IOS_WEB_WEBUI_URL_DATA_MANAGER_IOS_H_

#include <string>
#include <vector>

#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/supports_user_data.h"

namespace web {
class BrowserState;
class URLDataSourceIOS;
class URLDataSourceIOSImpl;
class WebUIIOSDataSource;

// To serve dynamic data off of chrome: URLs, implement the
// URLDataManagerIOS::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
// URLDataManagerIOSBackend, see it for details.
class URLDataManagerIOS : public base::SupportsUserData::Data {
 public:
  explicit URLDataManagerIOS(BrowserState* browser_state);
  ~URLDataManagerIOS() override;

  // Adds a DataSource to the collection of data sources. This *must* be invoked
  // on the UI thread.
  //
  // If |AddDataSource| is called more than once for a particular name it will
  // release the old |DataSource|, most likely resulting in it getting deleted
  // as there are no other references to it. |DataSource| uses the
  // |DeleteOnUIThread| trait to insure that the destructor is called on the UI
  // thread. This is necessary as some |DataSource|s notably |FileIconSource|
  // and |FaviconSource|, have members that will DCHECK if they are not
  // destructed in the same thread as they are constructed (the UI thread).
  void AddDataSource(URLDataSourceIOSImpl* source);

  // Deletes any data sources no longer referenced. This is normally invoked
  // for you, but can be invoked to force deletion (such as during shutdown).
  static void DeleteDataSources();

  // Convenience wrapper function to add |source| to |browser_context|'s
  // |URLDataManagerIOS|. Creates a URLDataSourceIOSImpl to wrap the given
  // source.
  static void AddDataSource(BrowserState* browser_context,
                            URLDataSourceIOS* source);

  // Adds a WebUI data source to |browser_context|'s |URLDataManagerIOS|.
  static void AddWebUIIOSDataSource(BrowserState* browser_state,
                                    WebUIIOSDataSource* source);

 private:
  friend class URLDataSourceIOSImpl;
  friend struct DeleteURLDataSourceIOS;
  typedef std::vector<const URLDataSourceIOSImpl*> URLDataSources;

  // Invoked on the IO thread to do the actual adding of the DataSource.
  static void AddDataSourceOnIOThread(
      BrowserState* browser_state,
      scoped_refptr<URLDataSourceIOSImpl> data_source);

  // If invoked on the UI thread the DataSource is deleted immediatlye,
  // otherwise it is added to |data_sources_| and a task is scheduled to handle
  // deletion on the UI thread. See note abouve DeleteDataSource for more info.
  static void DeleteDataSource(const URLDataSourceIOSImpl* data_source);

  // Returns true if |data_source| is scheduled for deletion (|DeleteDataSource|
  // was invoked).
  static bool IsScheduledForDeletion(const URLDataSourceIOSImpl* data_source);

  BrowserState* browser_state_;

  // |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(URLDataManagerIOS);
};

}  // namespace web

#endif  // IOS_WEB_WEBUI_URL_DATA_MANAGER_IOS_H_
