| Index: content/browser/storage_partition_impl.cc
|
| diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
|
| index e906a6acb8dc22a68ba429db5a1370496b5a01d4..02cb5d71d7163ba4a827675d7bcd20231241583b 100644
|
| --- a/content/browser/storage_partition_impl.cc
|
| +++ b/content/browser/storage_partition_impl.cc
|
| @@ -12,6 +12,46 @@
|
|
|
| namespace content {
|
|
|
| +namespace {
|
| +
|
| +// These constants are used to create the directory structure under the profile
|
| +// where renderers with a non-default storage partition keep their persistent
|
| +// state. This will contain a set of directories that partially mirror the
|
| +// directory structure of BrowserContext::GetPath().
|
| +//
|
| +// The kStoragePartitionDirname is contains an extensions directory which is
|
| +// further partitioned by extension id, followed by another level of directories
|
| +// for the "default" extension storage partition and one directory for each
|
| +// persistent partition used by an extension's browser tags. Example:
|
| +//
|
| +// {kStoragePartitionDirname}/extensions/ABCDEF/default
|
| +// {kStoragePartitionDirname}/extensions/ABCDEF/{hash(guest partition)}
|
| +//
|
| +// The code in GetPartitionPath() constructs these path names.
|
| +const FilePath::CharType kStoragePartitionDirname[] =
|
| + FILE_PATH_LITERAL("Storage Partitions");
|
| +const FilePath::CharType kExtensionsDirname[] =
|
| + FILE_PATH_LITERAL("extensions");
|
| +const FilePath::CharType kDefaultPartitionDirname[] =
|
| + FILE_PATH_LITERAL("default");
|
| +
|
| +} // namespace
|
| +
|
| +// static
|
| +FilePath StoragePartition::GetPartitionPath(const std::string& partition_id) {
|
| + if (partition_id.empty()) {
|
| + // The default profile just sits inside the top-level profile directory.
|
| + return FilePath();
|
| + }
|
| +
|
| + // TODO(ajwong): This should check that we create a valid path name.
|
| + CHECK(IsStringASCII(partition_id));
|
| + return FilePath(kStoragePartitionDirname)
|
| + .Append(kExtensionsDirname)
|
| + .AppendASCII(partition_id)
|
| + .Append(kDefaultPartitionDirname);
|
| +}
|
| +
|
| StoragePartitionImpl::StoragePartitionImpl(
|
| const FilePath& partition_path,
|
| quota::QuotaManager* quota_manager,
|
| @@ -47,12 +87,16 @@ StoragePartitionImpl::~StoragePartitionImpl() {
|
| // need 3 pieces of info from it.
|
| StoragePartitionImpl* StoragePartitionImpl::Create(
|
| BrowserContext* context,
|
| - const FilePath& partition_path) {
|
| + const std::string& partition_id,
|
| + const FilePath& profile_path) {
|
| // Ensure that these methods are called on the UI thread, except for
|
| // unittests where a UI thread might not have been created.
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) ||
|
| !BrowserThread::IsMessageLoopValid(BrowserThread::UI));
|
|
|
| + FilePath partition_path =
|
| + profile_path.Append(GetPartitionPath(partition_id));
|
| +
|
| // All of the clients have to be created and registered with the
|
| // QuotaManager prior to the QuotaManger being used. We do them
|
| // all together here prior to handing out a reference to anything
|
| @@ -99,6 +143,10 @@ StoragePartitionImpl* StoragePartitionImpl::Create(
|
| indexed_db_context);
|
| }
|
|
|
| +FilePath StoragePartitionImpl::GetPath() {
|
| + return partition_path_;
|
| +}
|
| +
|
| quota::QuotaManager* StoragePartitionImpl::GetQuotaManager() {
|
| return quota_manager_;
|
| }
|
|
|