blob: 6d7e423493ac05c5393f5956e6298c1633a7e48b [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/download/model/download_directory_util.h"
#import "base/apple/foundation_util.h"
#import "base/check.h"
#import "base/feature_list.h"
#import "base/files/file_path.h"
#import "base/files/file_util.h"
#import "base/functional/bind.h"
#import "base/task/task_traits.h"
#import "base/task/thread_pool.h"
#import "ios/web/common/features.h"
namespace {
// Override for testing purposes
base::FilePath* g_downloads_directory_for_testing = nullptr;
// Synchronously deletes downloads directory.
void DeleteTempDownloadsDirectorySync() {
base::FilePath downloads_directory;
if (GetTempDownloadsDirectory(&downloads_directory)) {
DeletePathRecursively(downloads_directory);
}
}
} // namespace
bool GetTempDownloadsDirectory(base::FilePath* directory_path) {
if (!GetTempDir(directory_path)) {
return false;
}
*directory_path = directory_path->Append("downloads");
return true;
}
void GetDownloadsDirectory(base::FilePath* directory_path) {
// Use override for testing if set.
if (g_downloads_directory_for_testing) {
*directory_path = *g_downloads_directory_for_testing;
return;
}
*directory_path =
base::apple::NSStringToFilePath([NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSAllDomainsMask, YES) firstObject]);
}
base::FilePath ConvertToRelativeDownloadPath(
const base::FilePath& absolute_path) {
DCHECK(absolute_path.IsAbsolute());
base::FilePath downloads_directory;
GetDownloadsDirectory(&downloads_directory);
base::FilePath relative_path;
bool success =
downloads_directory.AppendRelativePath(absolute_path, &relative_path);
DCHECK(success);
return relative_path;
}
base::FilePath ConvertToAbsoluteDownloadPath(
const base::FilePath& relative_path) {
DCHECK(!relative_path.IsAbsolute());
base::FilePath downloads_directory;
GetDownloadsDirectory(&downloads_directory);
return downloads_directory.Append(relative_path);
}
void DeleteTempDownloadsDirectory() {
base::ThreadPool::PostTask(
FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
base::BindOnce(&DeleteTempDownloadsDirectorySync));
}
namespace test {
void SetDownloadsDirectoryForTesting(const base::FilePath* directory) {
g_downloads_directory_for_testing = const_cast<base::FilePath*>(directory);
}
} // namespace test