Index: mojo/edk/js/core.cc |
diff --git a/mojo/edk/js/core.cc b/mojo/edk/js/core.cc |
deleted file mode 100644 |
index c06977d6bc68e03685401106b6da0246f0152c27..0000000000000000000000000000000000000000 |
--- a/mojo/edk/js/core.cc |
+++ /dev/null |
@@ -1,381 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "mojo/edk/js/core.h" |
- |
-#include "base/bind.h" |
-#include "base/logging.h" |
-#include "gin/arguments.h" |
-#include "gin/array_buffer.h" |
-#include "gin/converter.h" |
-#include "gin/dictionary.h" |
-#include "gin/function_template.h" |
-#include "gin/handle.h" |
-#include "gin/object_template_builder.h" |
-#include "gin/per_isolate_data.h" |
-#include "gin/public/wrapper_info.h" |
-#include "gin/wrappable.h" |
-#include "mojo/edk/js/drain_data.h" |
-#include "mojo/edk/js/handle.h" |
- |
-namespace mojo { |
-namespace js { |
- |
-namespace { |
- |
-MojoResult CloseHandle(gin::Handle<HandleWrapper> handle) { |
- if (!handle->get().is_valid()) |
- return MOJO_RESULT_INVALID_ARGUMENT; |
- handle->Close(); |
- return MOJO_RESULT_OK; |
-} |
- |
-gin::Dictionary WaitHandle(const gin::Arguments& args, |
- mojo::Handle handle, |
- MojoHandleSignals signals, |
- MojoDeadline deadline) { |
- v8::Isolate* isolate = args.isolate(); |
- gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(isolate); |
- |
- MojoHandleSignalsState signals_state; |
- MojoResult result = mojo::Wait(handle, signals, deadline, &signals_state); |
- dictionary.Set("result", result); |
- |
- mojo::WaitManyResult wmv(result, 0); |
- if (!wmv.AreSignalsStatesValid()) { |
- dictionary.Set("signalsState", v8::Null(isolate).As<v8::Value>()); |
- } else { |
- gin::Dictionary signalsStateDict = gin::Dictionary::CreateEmpty(isolate); |
- signalsStateDict.Set("satisfiedSignals", signals_state.satisfied_signals); |
- signalsStateDict.Set("satisfiableSignals", |
- signals_state.satisfiable_signals); |
- dictionary.Set("signalsState", signalsStateDict); |
- } |
- |
- return dictionary; |
-} |
- |
-gin::Dictionary WaitMany(const gin::Arguments& args, |
- const std::vector<mojo::Handle>& handles, |
- const std::vector<MojoHandleSignals>& signals, |
- MojoDeadline deadline) { |
- v8::Isolate* isolate = args.isolate(); |
- gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(isolate); |
- |
- std::vector<MojoHandleSignalsState> signals_states(signals.size()); |
- mojo::WaitManyResult wmv = |
- mojo::WaitMany(handles, signals, deadline, &signals_states); |
- dictionary.Set("result", wmv.result); |
- if (wmv.IsIndexValid()) { |
- dictionary.Set("index", wmv.index); |
- } else { |
- dictionary.Set("index", v8::Null(isolate).As<v8::Value>()); |
- } |
- if (wmv.AreSignalsStatesValid()) { |
- std::vector<gin::Dictionary> vec; |
- for (size_t i = 0; i < handles.size(); ++i) { |
- gin::Dictionary signalsStateDict = gin::Dictionary::CreateEmpty(isolate); |
- signalsStateDict.Set("satisfiedSignals", |
- signals_states[i].satisfied_signals); |
- signalsStateDict.Set("satisfiableSignals", |
- signals_states[i].satisfiable_signals); |
- vec.push_back(signalsStateDict); |
- } |
- dictionary.Set("signalsState", vec); |
- } else { |
- dictionary.Set("signalsState", v8::Null(isolate).As<v8::Value>()); |
- } |
- |
- return dictionary; |
-} |
- |
-gin::Dictionary CreateMessagePipe(const gin::Arguments& args) { |
- gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate()); |
- dictionary.Set("result", MOJO_RESULT_INVALID_ARGUMENT); |
- |
- MojoHandle handle0 = MOJO_HANDLE_INVALID; |
- MojoHandle handle1 = MOJO_HANDLE_INVALID; |
- MojoResult result = MOJO_RESULT_OK; |
- |
- v8::Handle<v8::Value> options_value = args.PeekNext(); |
- if (options_value.IsEmpty() || options_value->IsNull() || |
- options_value->IsUndefined()) { |
- result = MojoCreateMessagePipe(NULL, &handle0, &handle1); |
- } else if (options_value->IsObject()) { |
- gin::Dictionary options_dict(args.isolate(), options_value->ToObject()); |
- MojoCreateMessagePipeOptions options; |
- // For future struct_size, we can probably infer that from the presence of |
- // properties in options_dict. For now, it's always 8. |
- options.struct_size = 8; |
- // Ideally these would be optional. But the interface makes it hard to |
- // typecheck them then. |
- if (!options_dict.Get("flags", &options.flags)) { |
- return dictionary; |
- } |
- |
- result = MojoCreateMessagePipe(&options, &handle0, &handle1); |
- } else { |
- return dictionary; |
- } |
- |
- CHECK_EQ(MOJO_RESULT_OK, result); |
- |
- dictionary.Set("result", result); |
- dictionary.Set("handle0", mojo::Handle(handle0)); |
- dictionary.Set("handle1", mojo::Handle(handle1)); |
- return dictionary; |
-} |
- |
-MojoResult WriteMessage( |
- mojo::Handle handle, |
- const gin::ArrayBufferView& buffer, |
- const std::vector<gin::Handle<HandleWrapper> >& handles, |
- MojoWriteMessageFlags flags) { |
- std::vector<MojoHandle> raw_handles(handles.size()); |
- for (size_t i = 0; i < handles.size(); ++i) |
- raw_handles[i] = handles[i]->get().value(); |
- MojoResult rv = MojoWriteMessage(handle.value(), |
- buffer.bytes(), |
- static_cast<uint32_t>(buffer.num_bytes()), |
- raw_handles.empty() ? NULL : &raw_handles[0], |
- static_cast<uint32_t>(raw_handles.size()), |
- flags); |
- // MojoWriteMessage takes ownership of the handles upon success, so |
- // release them here. |
- if (rv == MOJO_RESULT_OK) { |
- for (size_t i = 0; i < handles.size(); ++i) |
- ignore_result(handles[i]->release()); |
- } |
- return rv; |
-} |
- |
-gin::Dictionary ReadMessage(const gin::Arguments& args, |
- mojo::Handle handle, |
- MojoReadMessageFlags flags) { |
- uint32_t num_bytes = 0; |
- uint32_t num_handles = 0; |
- MojoResult result = MojoReadMessage( |
- handle.value(), NULL, &num_bytes, NULL, &num_handles, flags); |
- if (result != MOJO_RESULT_RESOURCE_EXHAUSTED) { |
- gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate()); |
- dictionary.Set("result", result); |
- return dictionary; |
- } |
- |
- v8::Handle<v8::ArrayBuffer> array_buffer = |
- v8::ArrayBuffer::New(args.isolate(), num_bytes); |
- std::vector<mojo::Handle> handles(num_handles); |
- |
- gin::ArrayBuffer buffer; |
- ConvertFromV8(args.isolate(), array_buffer, &buffer); |
- CHECK(buffer.num_bytes() == num_bytes); |
- |
- result = MojoReadMessage(handle.value(), |
- buffer.bytes(), |
- &num_bytes, |
- handles.empty() ? NULL : |
- reinterpret_cast<MojoHandle*>(&handles[0]), |
- &num_handles, |
- flags); |
- |
- CHECK(buffer.num_bytes() == num_bytes); |
- CHECK(handles.size() == num_handles); |
- |
- gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate()); |
- dictionary.Set("result", result); |
- dictionary.Set("buffer", array_buffer); |
- dictionary.Set("handles", handles); |
- return dictionary; |
-} |
- |
-gin::Dictionary CreateDataPipe(const gin::Arguments& args) { |
- gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate()); |
- dictionary.Set("result", MOJO_RESULT_INVALID_ARGUMENT); |
- |
- MojoHandle producer_handle = MOJO_HANDLE_INVALID; |
- MojoHandle consumer_handle = MOJO_HANDLE_INVALID; |
- MojoResult result = MOJO_RESULT_OK; |
- |
- v8::Handle<v8::Value> options_value = args.PeekNext(); |
- if (options_value.IsEmpty() || options_value->IsNull() || |
- options_value->IsUndefined()) { |
- result = MojoCreateDataPipe(NULL, &producer_handle, &consumer_handle); |
- } else if (options_value->IsObject()) { |
- gin::Dictionary options_dict(args.isolate(), options_value->ToObject()); |
- MojoCreateDataPipeOptions options; |
- // For future struct_size, we can probably infer that from the presence of |
- // properties in options_dict. For now, it's always 16. |
- options.struct_size = 16; |
- // Ideally these would be optional. But the interface makes it hard to |
- // typecheck them then. |
- if (!options_dict.Get("flags", &options.flags) || |
- !options_dict.Get("elementNumBytes", &options.element_num_bytes) || |
- !options_dict.Get("capacityNumBytes", &options.capacity_num_bytes)) { |
- return dictionary; |
- } |
- |
- result = MojoCreateDataPipe(&options, &producer_handle, &consumer_handle); |
- } else { |
- return dictionary; |
- } |
- |
- CHECK_EQ(MOJO_RESULT_OK, result); |
- |
- dictionary.Set("result", result); |
- dictionary.Set("producerHandle", mojo::Handle(producer_handle)); |
- dictionary.Set("consumerHandle", mojo::Handle(consumer_handle)); |
- return dictionary; |
-} |
- |
-gin::Dictionary WriteData(const gin::Arguments& args, |
- mojo::Handle handle, |
- const gin::ArrayBufferView& buffer, |
- MojoWriteDataFlags flags) { |
- uint32_t num_bytes = static_cast<uint32_t>(buffer.num_bytes()); |
- MojoResult result = |
- MojoWriteData(handle.value(), buffer.bytes(), &num_bytes, flags); |
- gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate()); |
- dictionary.Set("result", result); |
- dictionary.Set("numBytes", num_bytes); |
- return dictionary; |
-} |
- |
-gin::Dictionary ReadData(const gin::Arguments& args, |
- mojo::Handle handle, |
- MojoReadDataFlags flags) { |
- uint32_t num_bytes = 0; |
- MojoResult result = MojoReadData( |
- handle.value(), NULL, &num_bytes, MOJO_READ_DATA_FLAG_QUERY); |
- if (result != MOJO_RESULT_OK) { |
- gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate()); |
- dictionary.Set("result", result); |
- return dictionary; |
- } |
- |
- v8::Handle<v8::ArrayBuffer> array_buffer = |
- v8::ArrayBuffer::New(args.isolate(), num_bytes); |
- gin::ArrayBuffer buffer; |
- ConvertFromV8(args.isolate(), array_buffer, &buffer); |
- CHECK_EQ(num_bytes, buffer.num_bytes()); |
- |
- result = MojoReadData(handle.value(), buffer.bytes(), &num_bytes, flags); |
- CHECK_EQ(num_bytes, buffer.num_bytes()); |
- |
- gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate()); |
- dictionary.Set("result", result); |
- dictionary.Set("buffer", array_buffer); |
- return dictionary; |
-} |
- |
-// Asynchronously read all of the data available for the specified data pipe |
-// consumer handle until the remote handle is closed or an error occurs. A |
-// Promise is returned whose settled value is an object like this: |
-// {result: core.RESULT_OK, buffer: dataArrayBuffer}. If the read failed, |
-// then the Promise is rejected, the result will be the actual error code, |
-// and the buffer will contain whatever was read before the error occurred. |
-// The drainData data pipe handle argument is closed automatically. |
- |
-v8::Handle<v8::Value> DoDrainData(gin::Arguments* args, |
- gin::Handle<HandleWrapper> handle) { |
- return (new DrainData(args->isolate(), handle->release()))->GetPromise(); |
-} |
- |
-bool IsHandle(gin::Arguments* args, v8::Handle<v8::Value> val) { |
- gin::Handle<mojo::js::HandleWrapper> ignore_handle; |
- return gin::Converter<gin::Handle<mojo::js::HandleWrapper>>::FromV8( |
- args->isolate(), val, &ignore_handle); |
-} |
- |
- |
-gin::WrapperInfo g_wrapper_info = { gin::kEmbedderNativeGin }; |
- |
-} // namespace |
- |
-const char Core::kModuleName[] = "mojo/public/js/core"; |
- |
-v8::Local<v8::Value> Core::GetModule(v8::Isolate* isolate) { |
- gin::PerIsolateData* data = gin::PerIsolateData::From(isolate); |
- v8::Local<v8::ObjectTemplate> templ = data->GetObjectTemplate( |
- &g_wrapper_info); |
- |
- if (templ.IsEmpty()) { |
- templ = |
- gin::ObjectTemplateBuilder(isolate) |
- // TODO(mpcomplete): Should these just be methods on the JS Handle |
- // object? |
- .SetMethod("close", CloseHandle) |
- .SetMethod("wait", WaitHandle) |
- .SetMethod("waitMany", WaitMany) |
- .SetMethod("createMessagePipe", CreateMessagePipe) |
- .SetMethod("writeMessage", WriteMessage) |
- .SetMethod("readMessage", ReadMessage) |
- .SetMethod("createDataPipe", CreateDataPipe) |
- .SetMethod("writeData", WriteData) |
- .SetMethod("readData", ReadData) |
- .SetMethod("drainData", DoDrainData) |
- .SetMethod("isHandle", IsHandle) |
- |
- .SetValue("RESULT_OK", MOJO_RESULT_OK) |
- .SetValue("RESULT_CANCELLED", MOJO_RESULT_CANCELLED) |
- .SetValue("RESULT_UNKNOWN", MOJO_RESULT_UNKNOWN) |
- .SetValue("RESULT_INVALID_ARGUMENT", MOJO_RESULT_INVALID_ARGUMENT) |
- .SetValue("RESULT_DEADLINE_EXCEEDED", MOJO_RESULT_DEADLINE_EXCEEDED) |
- .SetValue("RESULT_NOT_FOUND", MOJO_RESULT_NOT_FOUND) |
- .SetValue("RESULT_ALREADY_EXISTS", MOJO_RESULT_ALREADY_EXISTS) |
- .SetValue("RESULT_PERMISSION_DENIED", MOJO_RESULT_PERMISSION_DENIED) |
- .SetValue("RESULT_RESOURCE_EXHAUSTED", |
- MOJO_RESULT_RESOURCE_EXHAUSTED) |
- .SetValue("RESULT_FAILED_PRECONDITION", |
- MOJO_RESULT_FAILED_PRECONDITION) |
- .SetValue("RESULT_ABORTED", MOJO_RESULT_ABORTED) |
- .SetValue("RESULT_OUT_OF_RANGE", MOJO_RESULT_OUT_OF_RANGE) |
- .SetValue("RESULT_UNIMPLEMENTED", MOJO_RESULT_UNIMPLEMENTED) |
- .SetValue("RESULT_INTERNAL", MOJO_RESULT_INTERNAL) |
- .SetValue("RESULT_UNAVAILABLE", MOJO_RESULT_UNAVAILABLE) |
- .SetValue("RESULT_DATA_LOSS", MOJO_RESULT_DATA_LOSS) |
- .SetValue("RESULT_BUSY", MOJO_RESULT_BUSY) |
- .SetValue("RESULT_SHOULD_WAIT", MOJO_RESULT_SHOULD_WAIT) |
- |
- .SetValue("DEADLINE_INDEFINITE", MOJO_DEADLINE_INDEFINITE) |
- |
- .SetValue("HANDLE_SIGNAL_NONE", MOJO_HANDLE_SIGNAL_NONE) |
- .SetValue("HANDLE_SIGNAL_READABLE", MOJO_HANDLE_SIGNAL_READABLE) |
- .SetValue("HANDLE_SIGNAL_WRITABLE", MOJO_HANDLE_SIGNAL_WRITABLE) |
- .SetValue("HANDLE_SIGNAL_PEER_CLOSED", |
- MOJO_HANDLE_SIGNAL_PEER_CLOSED) |
- |
- .SetValue("CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE", |
- MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE) |
- |
- .SetValue("WRITE_MESSAGE_FLAG_NONE", MOJO_WRITE_MESSAGE_FLAG_NONE) |
- |
- .SetValue("READ_MESSAGE_FLAG_NONE", MOJO_READ_MESSAGE_FLAG_NONE) |
- .SetValue("READ_MESSAGE_FLAG_MAY_DISCARD", |
- MOJO_READ_MESSAGE_FLAG_MAY_DISCARD) |
- |
- .SetValue("CREATE_DATA_PIPE_OPTIONS_FLAG_NONE", |
- MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE) |
- .SetValue("CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD", |
- MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD) |
- |
- .SetValue("WRITE_DATA_FLAG_NONE", MOJO_WRITE_DATA_FLAG_NONE) |
- .SetValue("WRITE_DATA_FLAG_ALL_OR_NONE", |
- MOJO_WRITE_DATA_FLAG_ALL_OR_NONE) |
- |
- .SetValue("READ_DATA_FLAG_NONE", MOJO_READ_DATA_FLAG_NONE) |
- .SetValue("READ_DATA_FLAG_ALL_OR_NONE", |
- MOJO_READ_DATA_FLAG_ALL_OR_NONE) |
- .SetValue("READ_DATA_FLAG_DISCARD", MOJO_READ_DATA_FLAG_DISCARD) |
- .SetValue("READ_DATA_FLAG_QUERY", MOJO_READ_DATA_FLAG_QUERY) |
- .SetValue("READ_DATA_FLAG_PEEK", MOJO_READ_DATA_FLAG_PEEK) |
- .Build(); |
- |
- data->SetObjectTemplate(&g_wrapper_info, templ); |
- } |
- |
- return templ->NewInstance(); |
-} |
- |
-} // namespace js |
-} // namespace mojo |