feat: promisify session.getBlobData() (#17303)

This commit is contained in:
Shelley Vohr 2019-03-14 08:11:01 -07:00 committed by GitHub
parent c082b3964c
commit aa8b66aae1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 45 additions and 38 deletions

View file

@ -27,12 +27,10 @@ void FreeNodeBufferData(char* data, void* hint) {
delete[] data;
}
void RunCallbackInUI(const AtomBlobReader::CompletionCallback& callback,
char* blob_data,
int size) {
void RunPromiseInUI(util::Promise promise, char* blob_data, int size) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
v8::Isolate* isolate = promise.isolate();
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::Locker locker(isolate);
v8::HandleScope handle_scope(isolate);
if (blob_data) {
@ -40,9 +38,9 @@ void RunCallbackInUI(const AtomBlobReader::CompletionCallback& callback,
node::Buffer::New(isolate, blob_data, static_cast<size_t>(size),
&FreeNodeBufferData, nullptr)
.ToLocalChecked();
callback.Run(buffer);
promise.Resolve(buffer);
} else {
callback.Run(v8::Null(isolate));
promise.RejectWithErrorMessage("Could not get blob data");
}
}
@ -53,29 +51,29 @@ AtomBlobReader::AtomBlobReader(content::ChromeBlobStorageContext* blob_context)
AtomBlobReader::~AtomBlobReader() {}
void AtomBlobReader::StartReading(
const std::string& uuid,
const AtomBlobReader::CompletionCallback& completion_callback) {
void AtomBlobReader::StartReading(const std::string& uuid,
util::Promise promise) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
auto blob_data_handle = blob_context_->context()->GetBlobDataFromUUID(uuid);
auto callback = base::Bind(&RunCallbackInUI, completion_callback);
if (!blob_data_handle) {
base::PostTaskWithTraits(FROM_HERE, {BrowserThread::UI},
base::BindOnce(callback, nullptr, 0));
util::Promise::RejectPromise(std::move(promise),
"Could not get blob data handle");
return;
}
auto blob_reader = blob_data_handle->CreateReader();
BlobReadHelper* blob_read_helper =
new BlobReadHelper(std::move(blob_reader), callback);
new BlobReadHelper(std::move(blob_reader),
base::BindOnce(&RunPromiseInUI, std::move(promise)));
blob_read_helper->Read();
}
AtomBlobReader::BlobReadHelper::BlobReadHelper(
std::unique_ptr<storage::BlobReader> blob_reader,
const BlobReadHelper::CompletionCallback& callback)
: blob_reader_(std::move(blob_reader)), completion_callback_(callback) {}
BlobReadHelper::CompletionCallback callback)
: blob_reader_(std::move(blob_reader)),
completion_callback_(std::move(callback)) {}
AtomBlobReader::BlobReadHelper::~BlobReadHelper() {}
@ -117,8 +115,9 @@ void AtomBlobReader::BlobReadHelper::DidReadBlobData(
char* data = new char[size];
memcpy(data, blob_data->data(), size);
base::PostTaskWithTraits(FROM_HERE, {BrowserThread::UI},
base::BindOnce(completion_callback_, data, size));
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::UI},
base::BindOnce(std::move(completion_callback_), data, size));
delete this;
}