| Index: mojo/edk/js/core.cc
|
| diff --git a/mojo/edk/js/core.cc b/mojo/edk/js/core.cc
|
| index e70931da529751c84952025a7408765520a9f584..c06977d6bc68e03685401106b6da0246f0152c27 100644
|
| --- a/mojo/edk/js/core.cc
|
| +++ b/mojo/edk/js/core.cc
|
| @@ -31,17 +31,63 @@ MojoResult CloseHandle(gin::Handle<HandleWrapper> handle) {
|
| return MOJO_RESULT_OK;
|
| }
|
|
|
| -MojoResult WaitHandle(mojo::Handle handle,
|
| - MojoHandleSignals signals,
|
| - MojoDeadline deadline) {
|
| - return MojoWait(handle.value(), signals, deadline);
|
| +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;
|
| }
|
|
|
| -MojoResult WaitMany(
|
| - const std::vector<mojo::Handle>& handles,
|
| - const std::vector<MojoHandleSignals>& signals,
|
| - MojoDeadline deadline) {
|
| - return mojo::WaitMany(handles, signals, deadline);
|
| +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) {
|
| @@ -235,6 +281,13 @@ v8::Handle<v8::Value> DoDrainData(gin::Arguments* args,
|
| 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
|
| @@ -261,6 +314,7 @@ v8::Local<v8::Value> Core::GetModule(v8::Isolate* isolate) {
|
| .SetMethod("writeData", WriteData)
|
| .SetMethod("readData", ReadData)
|
| .SetMethod("drainData", DoDrainData)
|
| + .SetMethod("isHandle", IsHandle)
|
|
|
| .SetValue("RESULT_OK", MOJO_RESULT_OK)
|
| .SetValue("RESULT_CANCELLED", MOJO_RESULT_CANCELLED)
|
|
|