Index: extensions/renderer/display_source_custom_bindings.cc |
diff --git a/extensions/renderer/display_source_custom_bindings.cc b/extensions/renderer/display_source_custom_bindings.cc |
index ab685535f6295f2cffebba9ad4b278149b99a9b9..1a021c157b3f0701159522b4a4de78b1e447be29 100644 |
--- a/extensions/renderer/display_source_custom_bindings.cc |
+++ b/extensions/renderer/display_source_custom_bindings.cc |
@@ -67,13 +67,17 @@ v8::Local<v8::Value> GetChildValue(v8::Local<v8::Object> value, |
return v8::Null(isolate); |
} |
+int32_t GetCallbackId() { |
+ static int32_t sCallId = 0; |
+ return ++sCallId; |
+} |
+ |
} // namespace |
void DisplaySourceCustomBindings::StartSession( |
const v8::FunctionCallbackInfo<v8::Value>& args) { |
- CHECK_EQ(2, args.Length()); |
+ CHECK_EQ(1, args.Length()); |
CHECK(args[0]->IsObject()); |
- CHECK(args[1]->IsFunction()); |
v8::Isolate* isolate = context()->isolate(); |
v8::Local<v8::Object> start_info = args[0].As<v8::Object>(); |
@@ -154,32 +158,28 @@ void DisplaySourceCustomBindings::StartSession( |
return; |
} |
- auto on_started_callback = base::Bind( |
- &DisplaySourceCustomBindings::OnSessionStarted, |
- weak_factory_.GetWeakPtr()); |
- auto on_terminated_callback = base::Bind( |
- &DisplaySourceCustomBindings::OnSessionTerminated, |
- weak_factory_.GetWeakPtr()); |
- auto on_error_callback = base::Bind( |
- &DisplaySourceCustomBindings::OnSessionError, |
- weak_factory_.GetWeakPtr()); |
- session->SetCallbacks(on_started_callback, |
- on_terminated_callback, |
- on_error_callback); |
- |
- CallbackInfo cb_info = GetCallbackInfo(kStarted, sink_id); |
- args.GetReturnValue().Set(static_cast<int32_t>(cb_info.call_id)); |
- callbacks_.push_back(cb_info); |
- |
- session->Start(); |
+ auto on_terminated_callback = |
+ base::Bind(&DisplaySourceCustomBindings::OnSessionTerminated, |
+ weak_factory_.GetWeakPtr(), sink_id); |
+ auto on_error_callback = |
+ base::Bind(&DisplaySourceCustomBindings::OnSessionError, |
+ weak_factory_.GetWeakPtr(), sink_id); |
+ session->SetNotificationCallbacks(on_terminated_callback, on_error_callback); |
+ |
+ int32_t call_id = GetCallbackId(); |
+ args.GetReturnValue().Set(call_id); |
+ |
+ auto on_call_completed = |
+ base::Bind(&DisplaySourceCustomBindings::OnSessionStarted, |
+ weak_factory_.GetWeakPtr(), sink_id, call_id); |
+ session->Start(on_call_completed); |
session_map_.insert(std::make_pair(sink_id, std::move(session))); |
} |
void DisplaySourceCustomBindings::TerminateSession( |
const v8::FunctionCallbackInfo<v8::Value>& args) { |
- CHECK_EQ(2, args.Length()); |
+ CHECK_EQ(1, args.Length()); |
CHECK(args[0]->IsInt32()); |
- CHECK(args[1]->IsFunction()); |
v8::Isolate* isolate = context()->isolate(); |
int sink_id = args[0]->ToInt32(args.GetIsolate())->Value(); |
@@ -190,39 +190,44 @@ void DisplaySourceCustomBindings::TerminateSession( |
return; |
} |
- if (session->state() == DisplaySourceSession::Terminating) { |
+ DisplaySourceSession::State state = session->state(); |
+ DCHECK_NE(state, DisplaySourceSession::Idle); |
+ if (state == DisplaySourceSession::Establishing) { |
+ // 'session started' callback has not yet been invoked. |
+ // This session is not existing for the user. |
+ isolate->ThrowException(v8::Exception::Error( |
+ v8::String::NewFromUtf8(isolate, kSessionNotFound))); |
+ return; |
+ } |
+ |
+ if (state == DisplaySourceSession::Terminating) { |
isolate->ThrowException(v8::Exception::Error(v8::String::NewFromUtf8( |
isolate, kSessionAlreadyTerminating))); |
return; |
} |
- CallbackInfo cb_info = GetCallbackInfo(kTerminated, sink_id); |
- args.GetReturnValue().Set(static_cast<int32_t>(cb_info.call_id)); |
- callbacks_.push_back(cb_info); |
+ int32_t call_id = GetCallbackId(); |
+ args.GetReturnValue().Set(call_id); |
+ auto on_call_completed = |
+ base::Bind(&DisplaySourceCustomBindings::OnCallCompleted, |
+ weak_factory_.GetWeakPtr(), call_id); |
// The session will get removed from session_map_ in OnSessionTerminated. |
- session->Terminate(); |
+ session->Terminate(on_call_completed); |
} |
-void DisplaySourceCustomBindings::CallCompletionCallback( |
- int sink_id, |
- CallbackType type, |
+void DisplaySourceCustomBindings::OnCallCompleted( |
+ int call_id, |
+ bool success, |
const std::string& error_message) { |
- auto predicate = [sink_id, type](const CallbackInfo& info) -> bool { |
- return info.sink_id == sink_id && info.type == type; |
- }; |
- auto it = std::find_if(callbacks_.begin(), callbacks_.end(), predicate); |
- if (it == callbacks_.end()) |
- return; |
- |
v8::Isolate* isolate = context()->isolate(); |
ModuleSystem* module_system = context()->module_system(); |
v8::HandleScope handle_scope(isolate); |
v8::Context::Scope context_scope(context()->v8_context()); |
v8::Local<v8::Value> callback_args[2]; |
- callback_args[0] = v8::Integer::New(isolate, it->call_id); |
- if (error_message.empty()) |
+ callback_args[0] = v8::Integer::New(isolate, call_id); |
+ if (success) |
callback_args[1] = v8::Null(isolate); |
else |
callback_args[1] = v8::String::NewFromUtf8(isolate, error_message.c_str()); |
@@ -231,6 +236,19 @@ void DisplaySourceCustomBindings::CallCompletionCallback( |
callback_args); |
} |
+void DisplaySourceCustomBindings::OnSessionStarted( |
+ int sink_id, |
+ int call_id, |
+ bool success, |
+ const std::string& error_message) { |
+ CHECK(GetDisplaySession(sink_id)); |
+ if (!success) { |
+ // Session has failed to start, removing it. |
+ session_map_.erase(sink_id); |
+ } |
+ OnCallCompleted(call_id, success, error_message); |
+} |
+ |
void DisplaySourceCustomBindings::DispatchSessionTerminated(int sink_id) const { |
v8::Isolate* isolate = context()->isolate(); |
v8::HandleScope handle_scope(isolate); |
@@ -272,32 +290,17 @@ DisplaySourceSession* DisplaySourceCustomBindings::GetDisplaySession( |
return nullptr; |
} |
-void DisplaySourceCustomBindings::OnSessionStarted(int sink_id) { |
- CallCompletionCallback(sink_id, kStarted); |
-} |
- |
void DisplaySourceCustomBindings::OnSessionTerminated(int sink_id) { |
- DisplaySourceSession* session = GetDisplaySession(sink_id); |
- CHECK(session); |
+ CHECK(GetDisplaySession(sink_id)); |
session_map_.erase(sink_id); |
DispatchSessionTerminated(sink_id); |
- CallCompletionCallback(sink_id, kTerminated); |
} |
void DisplaySourceCustomBindings::OnSessionError(int sink_id, |
DisplaySourceErrorType type, |
const std::string& message) { |
- DisplaySourceSession* session = GetDisplaySession(sink_id); |
- CHECK(session); |
+ CHECK(GetDisplaySession(sink_id)); |
DispatchSessionError(sink_id, type, message); |
} |
-DisplaySourceCustomBindings::CallbackInfo |
-DisplaySourceCustomBindings::GetCallbackInfo( |
- DisplaySourceCustomBindings::CallbackType type, |
- int sink_id) const { |
- static int sCallId = 0; |
- return {type, sink_id, ++sCallId}; |
-} |
- |
} // extensions |