// Copyright (c) 2011 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.

// Defines the Chrome Extensions Clear API functions, which entail
// clearing browsing data, and clearing the browser's cache (which, let's be
// honest, are the same thing), as specified in
// chrome/common/extensions/api/extension_api.json.

#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_CLEAR_API_H_
#define CHROME_BROWSER_EXTENSIONS_EXTENSION_CLEAR_API_H_
#pragma once

#include <string>

#include "chrome/browser/browsing_data_remover.h"
#include "chrome/browser/extensions/extension_function.h"

namespace base {
class DictionaryValue;
}

// This serves as a base class from which the browsing data API functions will
// inherit. Each needs to be an observer of BrowsingDataRemover events, and each
// will handle those events in the same way (by calling the passed-in callback
// function).
//
// Each child class must implement GetRemovalMask(), which returns the bitmask
// of data types to remove.
class BrowsingDataExtensionFunction : public AsyncExtensionFunction,
                                      public BrowsingDataRemover::Observer {
 public:
  // BrowsingDataRemover::Observer interface method.
  virtual void OnBrowsingDataRemoverDone() OVERRIDE;

  // AsyncExtensionFunction interface method.
  virtual bool RunImpl() OVERRIDE;

 protected:
  // Children should override this method to provide the proper removal mask
  // based on the API call they represent.
  virtual int GetRemovalMask() const = 0;
};

class ClearBrowsingDataFunction : public BrowsingDataExtensionFunction {
 public:
  ClearBrowsingDataFunction() {}
  virtual ~ClearBrowsingDataFunction() {}

 protected:
  // BrowsingDataExtensionFunction interface method.
  virtual int GetRemovalMask() const OVERRIDE;

  DECLARE_EXTENSION_FUNCTION_NAME("experimental.clear.browsingData")
};

class ClearCacheFunction : public BrowsingDataExtensionFunction {
 public:
  ClearCacheFunction() {}
  virtual ~ClearCacheFunction() {}

 protected:
  // BrowsingDataTypeExtensionFunction interface method.
  virtual int GetRemovalMask() const OVERRIDE;

  DECLARE_EXTENSION_FUNCTION_NAME("experimental.clear.cache")
};

class ClearCookiesFunction : public BrowsingDataExtensionFunction {
 public:
  ClearCookiesFunction() {}
  virtual ~ClearCookiesFunction() {}

 protected:
  // BrowsingDataTypeExtensionFunction interface method.
  virtual int GetRemovalMask() const OVERRIDE;

  DECLARE_EXTENSION_FUNCTION_NAME("experimental.clear.cookies")
};

class ClearDownloadsFunction : public BrowsingDataExtensionFunction {
 public:
  ClearDownloadsFunction() {}
  virtual ~ClearDownloadsFunction() {}

 protected:
  // BrowsingDataTypeExtensionFunction interface method.
  virtual int GetRemovalMask() const OVERRIDE;

  DECLARE_EXTENSION_FUNCTION_NAME("experimental.clear.downloads")
};

class ClearFormDataFunction : public BrowsingDataExtensionFunction {
 public:
  ClearFormDataFunction() {}
  virtual ~ClearFormDataFunction() {}

 protected:
  // BrowsingDataTypeExtensionFunction interface method.
  virtual int GetRemovalMask() const OVERRIDE;

  DECLARE_EXTENSION_FUNCTION_NAME("experimental.clear.formData")
};

class ClearHistoryFunction : public BrowsingDataExtensionFunction {
 public:
  ClearHistoryFunction() {}
  virtual ~ClearHistoryFunction() {}

 protected:
  // BrowsingDataTypeExtensionFunction interface method.
  virtual int GetRemovalMask() const OVERRIDE;

  DECLARE_EXTENSION_FUNCTION_NAME("experimental.clear.history")
};

class ClearPasswordsFunction : public BrowsingDataExtensionFunction {
 public:
  ClearPasswordsFunction() {}
  virtual ~ClearPasswordsFunction() {}

 protected:
  // BrowsingDataTypeExtensionFunction interface method.
  virtual int GetRemovalMask() const OVERRIDE;

  DECLARE_EXTENSION_FUNCTION_NAME("experimental.clear.passwords")
};

#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_CLEAR_API_H_