1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/file_system_access/cloud_identifier/cloud_identifier_util_cros.h"
#include "base/check_is_test.h"
#include "chrome/browser/ash/crosapi/crosapi_ash.h"
#include "chrome/browser/ash/crosapi/crosapi_manager.h"
#include "chrome/browser/ash/crosapi/file_system_access_cloud_identifier_provider_ash.h"
#include "chromeos/crosapi/mojom/file_system_access_cloud_identifier.mojom.h"
#include "storage/browser/file_system/file_system_url.h"
#include "third_party/blink/public/mojom/file_system_access/file_system_access_cloud_identifier.mojom.h"
#include "third_party/blink/public/mojom/file_system_access/file_system_access_error.mojom.h"
namespace {
crosapi::mojom::FileSystemAccessCloudIdentifierProvider*
g_cloud_identifier_provider_for_testing = nullptr;
crosapi::mojom::FileSystemAccessCloudIdentifierProvider*
GetFileSystemAccessCloudIdentifierProvider() {
if (g_cloud_identifier_provider_for_testing) {
CHECK_IS_TEST();
return g_cloud_identifier_provider_for_testing;
}
return crosapi::CrosapiManager::Get()
->crosapi_ash()
->file_system_access_cloud_identifier_provider_ash();
}
crosapi::mojom::HandleType TranslateHandleType(
content::FileSystemAccessPermissionContext::HandleType handle_type) {
switch (handle_type) {
case content::FileSystemAccessPermissionContext::HandleType::kFile:
return crosapi::mojom::HandleType::kFile;
case content::FileSystemAccessPermissionContext::HandleType::kDirectory:
return crosapi::mojom::HandleType::kDirectory;
}
}
blink::mojom::FileSystemAccessErrorPtr FileSystemAccessErrorOk() {
return blink::mojom::FileSystemAccessError::New(
blink::mojom::FileSystemAccessStatus::kOk, base::File::FILE_OK, "");
}
void OnCrosApiResult(
content::ContentBrowserClient::GetCloudIdentifiersCallback callback,
crosapi::mojom::FileSystemAccessCloudIdentifierPtr result) {
if (result.is_null()) {
std::move(callback).Run(
blink::mojom::FileSystemAccessError::New(
blink::mojom::FileSystemAccessStatus::kOperationFailed,
base::File::Error::FILE_ERROR_FAILED,
"Unable to retrieve identifier"),
{});
return;
}
std::vector<blink::mojom::FileSystemAccessCloudIdentifierPtr> handles;
blink::mojom::FileSystemAccessCloudIdentifierPtr handle =
blink::mojom::FileSystemAccessCloudIdentifier::New(result->provider_name,
result->id);
handles.push_back(std::move(handle));
std::move(callback).Run(FileSystemAccessErrorOk(), std::move(handles));
}
} // namespace
namespace cloud_identifier {
void SetCloudIdentifierProviderForTesting(
crosapi::mojom::FileSystemAccessCloudIdentifierProvider* provider) {
CHECK_IS_TEST();
CHECK(!g_cloud_identifier_provider_for_testing);
g_cloud_identifier_provider_for_testing = provider;
}
void GetCloudIdentifierFromAsh(
const storage::FileSystemURL& url,
content::FileSystemAccessPermissionContext::HandleType handle_type,
content::ContentBrowserClient::GetCloudIdentifiersCallback callback) {
// Only `kFileSystemTypeDriveFs` and `kFileSystemTypeProvided` can be cloud
// handled on ChromeOS.
if (url.type() != storage::kFileSystemTypeDriveFs &&
url.type() != storage::kFileSystemTypeProvided) {
std::move(callback).Run(FileSystemAccessErrorOk(), {});
return;
}
crosapi::mojom::FileSystemAccessCloudIdentifierProvider* provider =
GetFileSystemAccessCloudIdentifierProvider();
if (!provider) {
std::move(callback).Run(
blink::mojom::FileSystemAccessError::New(
blink::mojom::FileSystemAccessStatus::kOperationFailed,
base::File::Error::FILE_ERROR_FAILED, "Provider not available"),
{});
return;
}
provider->GetCloudIdentifier(
url.virtual_path(), TranslateHandleType(handle_type),
base::BindOnce(&OnCrosApiResult, std::move(callback)));
}
} // namespace cloud_identifier
|