Commit 982325f6 authored by tzik@chromium.org's avatar tzik@chromium.org

[Pepper] Use platform path for QuotaReservation::GetOpenFileHandle

 * Pass platform file path instead of virtual path to fileapis::QuotaReservation.
 * This should fix the quota leak regression.

BUG=333150

Review URL: https://codereview.chromium.org/131043002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@244393 0039d316-1c4b-4281-b951-d872f2087c98
parent 879b1800
......@@ -235,7 +235,7 @@ void PepperFileIOHost::DidOpenInternalFile(
check_quota_ = true;
file_system_host_->OpenQuotaFile(
this,
file_system_url_.path(),
file_system_url_,
base::Bind(&PepperFileIOHost::DidOpenQuotaFile,
weak_factory_.GetWeakPtr(),
reply_context,
......
......@@ -121,7 +121,7 @@ bool PepperFileSystemBrowserHost::IsFileSystemHost() {
void PepperFileSystemBrowserHost::OpenQuotaFile(
PepperFileIOHost* file_io_host,
const base::FilePath& file_path,
const fileapi::FileSystemURL& url,
const OpenQuotaFileCallback& callback) {
int32_t id = file_io_host->pp_resource();
std::pair<FileMap::iterator, bool> insert_result =
......@@ -133,7 +133,7 @@ void PepperFileSystemBrowserHost::OpenQuotaFile(
base::Bind(&QuotaReservation::OpenFile,
quota_reservation_,
id,
file_path),
url),
callback);
} else {
NOTREACHED();
......
......@@ -68,7 +68,7 @@ class CONTENT_EXPORT PepperFileSystemBrowserHost
// callback.
typedef base::Callback<void(int64_t)> OpenQuotaFileCallback;
void OpenQuotaFile(PepperFileIOHost* file_io_host,
const base::FilePath& file_path,
const fileapi::FileSystemURL& url,
const OpenQuotaFileCallback& callback);
// Closes the file. This must be called after OpenQuotaFile and before the
// PepperFileIOHost is destroyed.
......
......@@ -7,6 +7,7 @@
#include "base/bind.h"
#include "base/callback.h"
#include "content/public/browser/browser_thread.h"
#include "webkit/browser/fileapi/file_system_operation_runner.h"
#include "webkit/browser/fileapi/quota/open_file_handle.h"
#include "webkit/browser/fileapi/quota/quota_reservation.h"
#include "webkit/common/fileapi/file_system_util.h"
......@@ -49,9 +50,23 @@ QuotaReservation::~QuotaReservation() {
}
int64_t QuotaReservation::OpenFile(int32_t id,
const base::FilePath& file_path) {
const fileapi::FileSystemURL& url) {
base::FilePath platform_file_path;
if (file_system_context_) {
base::PlatformFileError error =
file_system_context_->operation_runner()->SyncGetPlatformPath(
url, &platform_file_path);
if (error != base::PLATFORM_FILE_OK) {
NOTREACHED();
return 0;
}
} else {
// For test.
platform_file_path = url.path();
}
scoped_ptr<fileapi::OpenFileHandle> file_handle =
quota_reservation_->GetOpenFileHandle(file_path);
quota_reservation_->GetOpenFileHandle(platform_file_path);
std::pair<FileMap::iterator, bool> insert_result =
files_.insert(std::make_pair(id, file_handle.get()));
if (insert_result.second) {
......@@ -68,6 +83,7 @@ void QuotaReservation::CloseFile(int32_t id,
FileMap::iterator it = files_.find(id);
if (it != files_.end()) {
it->second->UpdateMaxWrittenOffset(max_written_offset);
delete it->second;
files_.erase(it);
} else {
NOTREACHED();
......
......@@ -15,11 +15,8 @@
#include "url/gurl.h"
#include "webkit/browser/fileapi/file_system_context.h"
namespace base {
class FilePath;
}
namespace fileapi {
class FileSystemURL;
class OpenFileHandle;
class QuotaReservation;
}
......@@ -44,7 +41,7 @@ class CONTENT_EXPORT QuotaReservation
fileapi::FileSystemType file_system_type);
// Opens a file with the given id and path and returns its current size.
int64_t OpenFile(int32_t id, const base::FilePath& file_path);
int64_t OpenFile(int32_t id, const fileapi::FileSystemURL& url);
// Closes the file opened by OpenFile with the given id.
void CloseFile(int32_t id, int64_t max_written_offset);
// Refreshes the quota reservation to a new amount. A map that associates file
......
......@@ -82,10 +82,16 @@ class QuotaReservationTest : public testing::Test {
reservation_manager_.reset();
}
base::FilePath MakeFilePath(base::FilePath::StringType file_name) {
base::FilePath MakeFilePath(const base::FilePath::StringType& file_name) {
return work_dir_.path().Append(file_name);
}
fileapi::FileSystemURL MakeFileSystemURL(
const base::FilePath::StringType& file_name) {
return fileapi::FileSystemURL::CreateForTest(
GURL(kOrigin), kType, MakeFilePath(file_name));
}
scoped_refptr<QuotaReservation> CreateQuotaReservation(
scoped_refptr<fileapi::QuotaReservation> reservation,
const GURL& origin,
......@@ -164,7 +170,8 @@ TEST_F(QuotaReservationTest, DISABLED_ReserveQuota) {
// Open a file, refresh the reservation, extend the file, and close it.
int64 file_size = 10;
SetFileSize(file1_name, file_size);
int64 open_file_size = test->OpenFile(kFile1ID, MakeFilePath(file1_name));
int64 open_file_size = test->OpenFile(kFile1ID,
MakeFileSystemURL(file1_name));
EXPECT_EQ(file_size, open_file_size);
max_written_offsets[kFile1ID] = file_size; // 1 file open.
......@@ -196,15 +203,18 @@ TEST_F(QuotaReservationTest, DISABLED_MultipleFiles) {
// Open some files of different sizes.
int64 file1_size = 10;
SetFileSize(file1_name, file1_size);
int64 open_file1_size = test->OpenFile(kFile1ID, MakeFilePath(file1_name));
int64 open_file1_size = test->OpenFile(kFile1ID,
MakeFileSystemURL(file1_name));
EXPECT_EQ(file1_size, open_file1_size);
int64 file2_size = 20;
SetFileSize(file2_name, file2_size);
int64 open_file2_size = test->OpenFile(kFile2ID, MakeFilePath(file2_name));
int64 open_file2_size = test->OpenFile(kFile2ID,
MakeFileSystemURL(file2_name));
EXPECT_EQ(file2_size, open_file2_size);
int64 file3_size = 30;
SetFileSize(file3_name, file3_size);
int64 open_file3_size = test->OpenFile(kFile3ID, MakeFilePath(file3_name));
int64 open_file3_size = test->OpenFile(kFile3ID,
MakeFileSystemURL(file3_name));
EXPECT_EQ(file3_size, open_file3_size);
// Reserve quota.
......
......@@ -46,8 +46,13 @@ void QuotaReservationBuffer::CommitFileGrowth(int64 quota_consumption,
return;
reservation_manager_->CommitQuotaUsage(origin_, type_, usage_delta);
DCHECK_LE(quota_consumption, reserved_quota_);
if (quota_consumption > 0) {
if (quota_consumption > reserved_quota_) {
LOG(ERROR) << "Detected over consumption of the storage quota beyond its"
<< " reservation";
quota_consumption = reserved_quota_;
}
reserved_quota_ -= quota_consumption;
reservation_manager_->ReleaseReservedQuota(
origin_, type_, quota_consumption);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment