Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(752)

Unified Diff: mojo/public/bindings/js/core.cc

Issue 83143002: [Mojo] Improve JavaScript API for MojoReadMessage (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/public/bindings/js/core.cc
diff --git a/mojo/public/bindings/js/core.cc b/mojo/public/bindings/js/core.cc
index 8cc5ee1d0274b6e912e872259f3dff108a8ef2b0..4212586e0d88086ac2a2ac5c500a9a2b649a56e2 100644
--- a/mojo/public/bindings/js/core.cc
+++ b/mojo/public/bindings/js/core.cc
@@ -4,6 +4,8 @@
#include "mojo/public/bindings/js/core.h"
+#include <assert.h>
+
#include "gin/arguments.h"
#include "gin/array_buffer.h"
#include "gin/converter.h"
@@ -62,22 +64,23 @@ void WaitMany(const v8::FunctionCallbackInfo<v8::Value>& info) {
void CreateMessagePipe(const v8::FunctionCallbackInfo<v8::Value>& info) {
gin::Arguments args(info);
- mojo::ScopedMessagePipeHandle handle_0;
- mojo::ScopedMessagePipeHandle handle_1;
- mojo::CreateMessagePipe(&handle_0, &handle_1);
+ MojoHandle handle_0 = MOJO_HANDLE_INVALID;
+ MojoHandle handle_1 = MOJO_HANDLE_INVALID;
+ MojoResult result = MojoCreateMessagePipe(&handle_0, &handle_1);
+ assert(result == MOJO_RESULT_OK);
gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(info.GetIsolate());
- dictionary.Set("handle0", static_cast<mojo::Handle>(handle_0.release()));
- dictionary.Set("handle1", static_cast<mojo::Handle>(handle_1.release()));
+ dictionary.Set("handle0", handle_0);
+ dictionary.Set("handle1", handle_1);
args.Return(dictionary);
}
void WriteMessage(const v8::FunctionCallbackInfo<v8::Value>& info) {
gin::Arguments args(info);
- mojo::Handle handle;
+ MojoHandle handle = MOJO_HANDLE_INVALID;
gin::ArrayBufferView buffer(args.isolate());
- std::vector<mojo::Handle> handles;
+ std::vector<MojoHandle> handles;
MojoWriteMessageFlags flags = MOJO_WRITE_MESSAGE_FLAG_NONE;
if (!args.GetNext(&handle) ||
@@ -87,46 +90,61 @@ void WriteMessage(const v8::FunctionCallbackInfo<v8::Value>& info) {
return args.ThrowError();
}
- args.Return(mojo::WriteMessageRaw(
- MessagePipeHandle(handle.value()), buffer.bytes(),
- static_cast<uint32_t>(buffer.num_bytes()),
- handles.empty() ? NULL : reinterpret_cast<const MojoHandle*>(&handles[0]),
- static_cast<uint32_t>(handles.size()), flags));
+ args.Return(MojoWriteMessage(handle,
+ buffer.bytes(),
+ static_cast<uint32_t>(buffer.num_bytes()),
+ handles.empty() ? NULL : handles.data(),
+ static_cast<uint32_t>(handles.size()),
+ flags));
}
void ReadMessage(const v8::FunctionCallbackInfo<v8::Value>& info) {
gin::Arguments args(info);
- mojo::Handle handle;
- gin::ArrayBufferView buffer(args.isolate());
- uint32_t num_handles = 0;
+ MojoHandle handle = MOJO_HANDLE_INVALID;
MojoReadMessageFlags flags = MOJO_READ_MESSAGE_FLAG_NONE;
if (!args.GetNext(&handle) ||
- !args.GetNext(&buffer) ||
- !args.GetNext(&num_handles) ||
!args.GetNext(&flags)) {
return args.ThrowError();
}
- uint32_t num_bytes = static_cast<uint32_t>(buffer.num_bytes());
- std::vector<mojo::Handle> handles(num_handles);
- MojoResult result = mojo::ReadMessageRaw(
- MessagePipeHandle(handle.value()), buffer.bytes(), &num_bytes,
- handles.empty() ? NULL : reinterpret_cast<MojoHandle*>(&handles[0]),
- &num_handles, flags);
- handles.resize(num_handles);
+ uint32_t num_bytes = 0;
+ uint32_t num_handles = 0;
+ MojoResult result = MojoReadMessage(
+ handle, NULL, &num_bytes, NULL, &num_handles, flags);
+ if (result != MOJO_RESULT_RESOURCE_EXHAUSTED) {
+ gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(
+ info.GetIsolate());
+ dictionary.Set("result", result);
+ args.Return(dictionary);
+ }
+
+ v8::Handle<v8::ArrayBuffer> array_buffer = v8::ArrayBuffer::New(num_bytes);
+ std::vector<MojoHandle> handles(num_handles);
+
+ gin::ArrayBuffer buffer(args.isolate());
+ ConvertFromV8(array_buffer, &buffer);
+ assert(buffer.num_bytes() == num_bytes);
+
+ result = MojoReadMessage(handle,
+ buffer.bytes(),
+ &num_bytes,
+ handles.empty() ? NULL : handles.data(),
+ &num_handles,
+ flags);
+
+ assert(buffer.num_bytes() == num_bytes);
+ assert(handles.size() == num_handles);
- // TODO(abarth): We should benchmark this codepath to make sure it's ok to
- // allocate all this memory on each read.
gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(info.GetIsolate());
dictionary.Set("result", result);
- dictionary.Set("bytesRead", num_bytes);
+ dictionary.Set("buffer", array_buffer);
dictionary.Set("handles", handles);
args.Return(dictionary);
}
-gin::WrapperInfo g_core_wrapper_info = { gin::kEmbedderNativeGin };
+gin::WrapperInfo g_wrapper_info = { gin::kEmbedderNativeGin };
} // namespace
@@ -135,7 +153,7 @@ const char Core::kModuleName[] = "mojo/public/bindings/js/core";
v8::Local<v8::ObjectTemplate> Core::GetTemplate(v8::Isolate* isolate) {
gin::PerIsolateData* data = gin::PerIsolateData::From(isolate);
v8::Local<v8::ObjectTemplate> templ = data->GetObjectTemplate(
- &g_core_wrapper_info);
+ &g_wrapper_info);
if (templ.IsEmpty()) {
templ = v8::ObjectTemplate::New();
@@ -211,7 +229,7 @@ v8::Local<v8::ObjectTemplate> Core::GetTemplate(v8::Isolate* isolate) {
templ->Set(gin::StringToSymbol(isolate, "READ_MESSAGE_FLAG_MAY_DISCARD"),
gin::ConvertToV8(isolate, MOJO_READ_MESSAGE_FLAG_MAY_DISCARD));
- data->SetObjectTemplate(&g_core_wrapper_info, templ);
+ data->SetObjectTemplate(&g_wrapper_info, templ);
}
return templ;

Powered by Google App Engine
This is Rietveld 408576698