| Index: webkit/fileapi/sandbox_mount_point_provider.cc
|
| diff --git a/webkit/fileapi/sandbox_mount_point_provider.cc b/webkit/fileapi/sandbox_mount_point_provider.cc
|
| index ff1b6cd4aab149b0ad7707d4fa4bc4561cbcde44..7fdeb8a268c78c8f356b5cf0d285e9eba5726e39 100644
|
| --- a/webkit/fileapi/sandbox_mount_point_provider.cc
|
| +++ b/webkit/fileapi/sandbox_mount_point_provider.cc
|
| @@ -43,11 +43,18 @@ const size_t kOldFileSystemUniqueDirectoryNameLength =
|
| kOldFileSystemUniqueLength + arraysize(kOldFileSystemUniqueNamePrefix) - 1;
|
|
|
| const char kOpenFileSystemLabel[] = "FileSystem.OpenFileSystem";
|
| +const char kOpenFileSystemDetailLabel[] = "FileSystem.OpenFileSystemDetail";
|
| +const char kOpenFileSystemDetailNonThrottledLabel[] =
|
| + "FileSystem.OpenFileSystemDetailNonthrottled";
|
| +int64 kMinimumStatsCollectionIntervalHours = 1;
|
| +
|
| enum FileSystemError {
|
| kOK = 0,
|
| kIncognito,
|
| - kInvalidScheme,
|
| + kInvalidSchemeError,
|
| kCreateDirectoryError,
|
| + kNotFound,
|
| + kUnknownError,
|
| kFileSystemErrorMax,
|
| };
|
|
|
| @@ -267,25 +274,34 @@ void PassPointerErrorByValue(
|
| callback.Run(*error_ptr);
|
| }
|
|
|
| -void ValidateRootOnFileThread(ObfuscatedFileUtil* file_util,
|
| - const GURL& origin_url,
|
| - FileSystemType type,
|
| - const FilePath& old_base_path,
|
| - bool create,
|
| - base::PlatformFileError* error_ptr) {
|
| +void DidValidateFileSystemRoot(
|
| + base::WeakPtr<SandboxMountPointProvider> mount_point_provider,
|
| + const base::Callback<void(PlatformFileError)>& callback,
|
| + base::PlatformFileError* error) {
|
| + if (mount_point_provider.get())
|
| + mount_point_provider.get()->CollectOpenFileSystemMetrics(*error);
|
| + callback.Run(*error);
|
| +}
|
| +
|
| +void ValidateRootOnFileThread(
|
| + ObfuscatedFileUtil* file_util,
|
| + const GURL& origin_url,
|
| + FileSystemType type,
|
| + const FilePath& old_base_path,
|
| + bool create,
|
| + base::PlatformFileError* error_ptr) {
|
| DCHECK(error_ptr);
|
| MigrateIfNeeded(file_util, old_base_path);
|
| +
|
| FilePath root_path =
|
| - file_util->GetDirectoryForOriginAndType(origin_url, type, create);
|
| + file_util->GetDirectoryForOriginAndType(
|
| + origin_url, type, create, error_ptr);
|
| if (root_path.empty()) {
|
| UMA_HISTOGRAM_ENUMERATION(kOpenFileSystemLabel,
|
| kCreateDirectoryError,
|
| kFileSystemErrorMax);
|
| - // TODO(kinuko): We should return appropriate error code.
|
| - *error_ptr = base::PLATFORM_FILE_ERROR_FAILED;
|
| } else {
|
| UMA_HISTOGRAM_ENUMERATION(kOpenFileSystemLabel, kOK, kFileSystemErrorMax);
|
| - *error_ptr = base::PLATFORM_FILE_OK;
|
| }
|
| // The reference of file_util will be derefed on the FILE thread
|
| // when the storage of this callback gets deleted regardless of whether
|
| @@ -315,7 +331,8 @@ SandboxMountPointProvider::SandboxMountPointProvider(
|
| sandbox_file_util_(
|
| new ObfuscatedFileUtil(
|
| profile_path.Append(kNewFileSystemDirectory),
|
| - QuotaFileUtil::CreateDefault())) {
|
| + QuotaFileUtil::CreateDefault())),
|
| + weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
|
| }
|
|
|
| SandboxMountPointProvider::~SandboxMountPointProvider() {
|
| @@ -341,7 +358,7 @@ void SandboxMountPointProvider::ValidateFileSystemRoot(
|
| if (!IsAllowedScheme(origin_url)) {
|
| callback.Run(base::PLATFORM_FILE_ERROR_SECURITY);
|
| UMA_HISTOGRAM_ENUMERATION(kOpenFileSystemLabel,
|
| - kInvalidScheme,
|
| + kInvalidSchemeError,
|
| kFileSystemErrorMax);
|
| return;
|
| }
|
| @@ -353,8 +370,9 @@ void SandboxMountPointProvider::ValidateFileSystemRoot(
|
| sandbox_file_util_,
|
| origin_url, type, old_base_path(), create,
|
| base::Unretained(error_ptr)),
|
| - base::Bind(base::Bind(&PassPointerErrorByValue, callback),
|
| - base::Owned(error_ptr)));
|
| + base::Bind(&DidValidateFileSystemRoot,
|
| + weak_factory_.GetWeakPtr(),
|
| + callback, base::Owned(error_ptr)));
|
| };
|
|
|
| FilePath
|
| @@ -673,4 +691,41 @@ bool SandboxMountPointProvider::IsAllowedScheme(const GURL& url) const {
|
| return false;
|
| }
|
|
|
| +void SandboxMountPointProvider::CollectOpenFileSystemMetrics(
|
| + base::PlatformFileError error_code) {
|
| + base::Time now = base::Time::Now();
|
| + bool throttled = now < next_release_time_for_open_filesystem_stat_;
|
| + if (!throttled) {
|
| + next_release_time_for_open_filesystem_stat_ =
|
| + now + base::TimeDelta::FromHours(kMinimumStatsCollectionIntervalHours);
|
| + }
|
| +
|
| +#define REPORT(report_value) \
|
| + UMA_HISTOGRAM_ENUMERATION(kOpenFileSystemDetailLabel, \
|
| + (report_value), \
|
| + kFileSystemErrorMax); \
|
| + if (!throttled) { \
|
| + UMA_HISTOGRAM_ENUMERATION(kOpenFileSystemDetailNonThrottledLabel, \
|
| + (report_value), \
|
| + kFileSystemErrorMax); \
|
| + }
|
| +
|
| + switch (error_code) {
|
| + case base::PLATFORM_FILE_OK:
|
| + REPORT(kOK);
|
| + break;
|
| + case base::PLATFORM_FILE_ERROR_INVALID_URL:
|
| + REPORT(kInvalidSchemeError);
|
| + break;
|
| + case base::PLATFORM_FILE_ERROR_NOT_FOUND:
|
| + REPORT(kNotFound);
|
| + break;
|
| + case base::PLATFORM_FILE_ERROR_FAILED:
|
| + default:
|
| + REPORT(kUnknownError);
|
| + break;
|
| + }
|
| +#undef REPORT
|
| +}
|
| +
|
| } // namespace fileapi
|
|
|