blob: 30a9d4215786f91a6b023dbede20d9ad103b0c7f [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/indexed_db/indexed_db_external_object.h"
#include <utility>
#include "base/check_op.h"
#include "base/functional/bind.h"
#include "content/browser/indexed_db/indexed_db_leveldb_coding.h"
#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom.h"
namespace content::indexed_db {
const int64_t IndexedDBExternalObject::kUnknownSize;
// static
void IndexedDBExternalObject::ConvertToMojo(
const std::vector<IndexedDBExternalObject>& objects,
std::vector<blink::mojom::IDBExternalObjectPtr>* mojo_objects) {
mojo_objects->reserve(objects.size());
for (const auto& iter : objects) {
if (!iter.mark_used_callback().is_null())
iter.mark_used_callback().Run();
switch (iter.object_type()) {
case ObjectType::kBlob:
case ObjectType::kFile: {
auto info = blink::mojom::IDBBlobInfo::New();
info->mime_type = iter.type();
info->size = iter.size();
if (iter.object_type() == ObjectType::kFile) {
info->file = blink::mojom::IDBFileInfo::New();
info->file->name = iter.file_name();
info->file->last_modified = iter.last_modified();
}
mojo_objects->push_back(
blink::mojom::IDBExternalObject::NewBlobOrFile(std::move(info)));
break;
}
case ObjectType::kFileSystemAccessHandle:
// Contents of token will be filled in later by
// BucketContext::CreateAllExternalObjects.
mojo_objects->push_back(
blink::mojom::IDBExternalObject::NewFileSystemAccessToken(
mojo::NullRemote()));
break;
}
}
}
IndexedDBExternalObject::IndexedDBExternalObject()
: object_type_(ObjectType::kBlob) {}
IndexedDBExternalObject::IndexedDBExternalObject(
mojo::PendingRemote<blink::mojom::Blob> blob_remote,
const std::u16string& type,
int64_t size)
: object_type_(ObjectType::kBlob),
blob_remote_(std::move(blob_remote)),
type_(type),
size_(size) {}
IndexedDBExternalObject::IndexedDBExternalObject(const std::u16string& type,
int64_t size,
int64_t blob_number)
: object_type_(ObjectType::kBlob),
type_(type),
size_(size),
blob_number_(blob_number) {}
IndexedDBExternalObject::IndexedDBExternalObject(
mojo::PendingRemote<blink::mojom::Blob> blob_remote,
const std::u16string& file_name,
const std::u16string& type,
const base::Time& last_modified,
const int64_t size)
: object_type_(ObjectType::kFile),
blob_remote_(std::move(blob_remote)),
type_(type),
size_(size),
file_name_(file_name),
last_modified_(last_modified) {}
IndexedDBExternalObject::IndexedDBExternalObject(
int64_t blob_number,
const std::u16string& type,
const std::u16string& file_name,
const base::Time& last_modified,
const int64_t size)
: object_type_(ObjectType::kFile),
type_(type),
size_(size),
file_name_(file_name),
last_modified_(last_modified),
blob_number_(blob_number) {}
IndexedDBExternalObject::IndexedDBExternalObject(
mojo::PendingRemote<blink::mojom::FileSystemAccessTransferToken>
token_remote)
: object_type_(ObjectType::kFileSystemAccessHandle),
token_remote_(std::move(token_remote)) {}
IndexedDBExternalObject::IndexedDBExternalObject(
std::vector<uint8_t> serialized_file_system_access_handle)
: object_type_(ObjectType::kFileSystemAccessHandle),
serialized_file_system_access_handle_(
std::move(serialized_file_system_access_handle)) {}
IndexedDBExternalObject::IndexedDBExternalObject(
const IndexedDBExternalObject& other) = default;
IndexedDBExternalObject::~IndexedDBExternalObject() = default;
IndexedDBExternalObject& IndexedDBExternalObject::operator=(
const IndexedDBExternalObject& other) = default;
void IndexedDBExternalObject::Clone(
mojo::PendingReceiver<blink::mojom::Blob> receiver) const {
DCHECK(is_remote_valid());
blob_remote_->Clone(std::move(receiver));
}
void IndexedDBExternalObject::set_size(int64_t size) {
DCHECK_EQ(-1, size_);
size_ = size;
}
void IndexedDBExternalObject::set_indexed_db_file_path(
const base::FilePath& file_path) {
indexed_db_file_path_ = file_path;
}
void IndexedDBExternalObject::set_last_modified(const base::Time& time) {
DCHECK(base::Time().is_null());
DCHECK_EQ(object_type_, ObjectType::kFile);
last_modified_ = time;
}
void IndexedDBExternalObject::set_serialized_file_system_access_handle(
std::vector<uint8_t> token) {
DCHECK_EQ(object_type_, ObjectType::kFileSystemAccessHandle);
serialized_file_system_access_handle_ = std::move(token);
}
void IndexedDBExternalObject::set_blob_number(int64_t blob_number) {
DCHECK_EQ(DatabaseMetaDataKey::kInvalidBlobNumber, blob_number_);
blob_number_ = blob_number;
}
void IndexedDBExternalObject::set_mark_used_callback(
base::RepeatingClosure mark_used_callback) {
DCHECK(!mark_used_callback_);
mark_used_callback_ = std::move(mark_used_callback);
}
void IndexedDBExternalObject::set_release_callback(
base::RepeatingClosure release_callback) {
DCHECK(!release_callback_);
release_callback_ = std::move(release_callback);
}
} // namespace content::indexed_db