blob: 1dbf31ca39771e298821dffd13db94db7c17d0ac [file] [log] [blame]
// 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 WEBKIT_DOM_STORAGE_DOM_STORAGE_AREA_H_
#define WEBKIT_DOM_STORAGE_DOM_STORAGE_AREA_H_
#include "base/file_path.h"
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/nullable_string16.h"
#include "base/string16.h"
#include "googleurl/src/gurl.h"
#include "webkit/dom_storage/dom_storage_types.h"
namespace dom_storage {
class DomStorageDatabaseAdapter;
class DomStorageMap;
class DomStorageTaskRunner;
// Container for a per-origin Map of key/value pairs potentially
// backed by storage on disk and lazily commits changes to disk.
// See class comments for DomStorageContext for a larger overview.
class DomStorageArea
: public base::RefCountedThreadSafe<DomStorageArea> {
public:
static const FilePath::CharType kDatabaseFileExtension[];
static FilePath DatabaseFileNameFromOrigin(const GURL& origin);
static GURL OriginFromDatabaseFileName(const FilePath& file_name);
// Local storage. Backed on disk if directory is nonempty.
DomStorageArea(const GURL& origin,
const FilePath& directory,
DomStorageTaskRunner* task_runner);
// Session storage.
DomStorageArea(int64 namespace_id,
const std::string& persistent_namespace_id,
const GURL& origin,
DomStorageTaskRunner* task_runner);
const GURL& origin() const { return origin_; }
int64 namespace_id() const { return namespace_id_; }
// Writes a copy of the current set of values in the area to the |map|.
void ExtractValues(ValuesMap* map);
unsigned Length();
NullableString16 Key(unsigned index);
NullableString16 GetItem(const string16& key);
bool SetItem(const string16& key, const string16& value,
NullableString16* old_value);
bool RemoveItem(const string16& key, string16* old_value);
bool Clear();
DomStorageArea* ShallowCopy(
int64 destination_namespace_id,
const std::string& destination_persistent_namespace_id);
bool HasUncommittedChanges() const;
// Similar to Clear() but more optimized for just deleting
// without raising events.
void DeleteOrigin();
// Frees up memory when possible. Typically, this method returns
// the object to its just constructed state, however if uncommitted
// changes are pending, it does nothing.
void PurgeMemory();
// Schedules the commit of any unsaved changes and enters a
// shutdown state such that the value getters and setters will
// no longer do anything.
void Shutdown();
private:
friend class DomStorageAreaTest;
FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, DomStorageAreaBasics);
FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, BackingDatabaseOpened);
FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, TestDatabaseFilePath);
FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, CommitTasks);
FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, CommitChangesAtShutdown);
FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, DeleteOrigin);
FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, PurgeMemory);
FRIEND_TEST_ALL_PREFIXES(DomStorageContextTest, PersistentIds);
friend class base::RefCountedThreadSafe<DomStorageArea>;
struct CommitBatch {
bool clear_all_first;
ValuesMap changed_values;
CommitBatch();
~CommitBatch();
};
~DomStorageArea();
// If we haven't done so already and this is a local storage area,
// will attempt to read any values for this origin currently
// stored on disk.
void InitialImportIfNeeded();
// Post tasks to defer writing a batch of changed values to
// disk on the commit sequence, and to call back on the primary
// task sequence when complete.
CommitBatch* CreateCommitBatchIfNeeded();
void OnCommitTimer();
void CommitChanges(const CommitBatch* commit_batch);
void OnCommitComplete();
void ShutdownInCommitSequence();
int64 namespace_id_;
std::string persistent_namespace_id_;
GURL origin_;
FilePath directory_;
scoped_refptr<DomStorageTaskRunner> task_runner_;
scoped_refptr<DomStorageMap> map_;
scoped_ptr<DomStorageDatabaseAdapter> backing_;
bool is_initial_import_done_;
bool is_shutdown_;
scoped_ptr<CommitBatch> commit_batch_;
int commit_batches_in_flight_;
};
} // namespace dom_storage
#endif // WEBKIT_DOM_STORAGE_DOM_STORAGE_AREA_H_