// Copyright (c) 2012 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 CONTENT_PUBLIC_BROWSER_DOM_STORAGE_CONTEXT_H_
#define CONTENT_PUBLIC_BROWSER_DOM_STORAGE_CONTEXT_H_

#include <string>
#include <vector>

#include "base/callback.h"

class GURL;

namespace content {

class BrowserContext;
struct LocalStorageUsageInfo;
class SessionStorageNamespace;
struct SessionStorageUsageInfo;

// Represents the per-BrowserContext Local Storage data.
class DOMStorageContext {
 public:
  typedef base::Callback<
      void(const std::vector<LocalStorageUsageInfo>&)>
          GetLocalStorageUsageCallback;

  typedef base::Callback<
      void(const std::vector<SessionStorageUsageInfo>&)>
          GetSessionStorageUsageCallback;

  // Returns a collection of origins using local storage to the given callback.
  virtual void GetLocalStorageUsage(
      const GetLocalStorageUsageCallback& callback) = 0;

  // Returns a collection of origins using session storage to the given
  // callback.
  virtual void GetSessionStorageUsage(
      const GetSessionStorageUsageCallback& callback) = 0;

  // Deletes the local storage data for the given origin.
  virtual void DeleteLocalStorage(const GURL& origin) = 0;

  // Deletes the session storage data identified by |usage_info|.
  virtual void DeleteSessionStorage(
      const SessionStorageUsageInfo& usage_info) = 0;

  // If this is called, sessionStorage data will be stored on disk, and can be
  // restored after a browser restart (with RecreateSessionStorage). This
  // function must be called right after DOMStorageContextWrapper is created,
  // and before it's used.
  virtual void SetSaveSessionStorageOnDisk() = 0;

  // Creates a SessionStorageNamespace with the given |persistent_id|. Used
  // after tabs are restored by session restore. When created, the
  // SessionStorageNamespace with the correct |persistent_id| will be
  // associated with the persisted sessionStorage data.
  virtual scoped_refptr<SessionStorageNamespace> RecreateSessionStorage(
      const std::string& persistent_id) = 0;

  // Starts deleting sessionStorages which don't have an associated
  // SessionStorageNamespace alive. Called when SessionStorageNamespaces have
  // been created after a session restore, or a session restore won't happen.
  virtual void StartScavengingUnusedSessionStorage() = 0;

 protected:
  virtual ~DOMStorageContext() {}
};

}  // namespace content

#endif  // CONTENT_PUBLIC_BROWSER_DOM_STORAGE_CONTEXT_H_
