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) |