Index: chrome/renderer/extensions/cast_streaming_native_handler.cc |
diff --git a/chrome/renderer/extensions/cast_streaming_native_handler.cc b/chrome/renderer/extensions/cast_streaming_native_handler.cc |
index 46d4f4bafbde9fc496c55ffd73149ab87e86b1d6..8e6d25931958ac45b0236df08abcd0fef0c40e5e 100644 |
--- a/chrome/renderer/extensions/cast_streaming_native_handler.cc |
+++ b/chrome/renderer/extensions/cast_streaming_native_handler.cc |
@@ -459,8 +459,20 @@ void CastStreamingNativeHandler::GetStats( |
CHECK_EQ(2, args.Length()); |
CHECK(args[0]->IsInt32()); |
CHECK(args[1]->IsFunction()); |
+ const int transport_id = args[0]->ToInt32()->Value(); |
+ CastRtpStream* transport = GetRtpStreamOrThrow(transport_id); |
+ if (!transport) |
+ return; |
+ |
+ linked_ptr<extensions::ScopedPersistent<v8::Function> > callback( |
+ new extensions::ScopedPersistent<v8::Function>); |
+ callback->reset(args[1].As<v8::Function>()); |
+ get_stats_callbacks_.insert(std::make_pair(transport_id, callback)); |
- // TODO(imcheng): Implement this. |
+ transport->GetStats( |
+ base::Bind(&CastStreamingNativeHandler::CallGetStatsCallback, |
+ weak_factory_.GetWeakPtr(), |
+ transport_id)); |
} |
void CastStreamingNativeHandler::CallGetRawEventsCallback( |
@@ -483,6 +495,23 @@ void CastStreamingNativeHandler::CallGetRawEventsCallback( |
} |
} |
+void CastStreamingNativeHandler::CallGetStatsCallback( |
+ int transport_id, |
+ scoped_ptr<std::string> stats) { |
+ v8::Isolate* isolate = context()->isolate(); |
+ v8::HandleScope handle_scope(isolate); |
+ v8::Context::Scope context_scope(context()->v8_context()); |
+ |
+ RtpStreamCallbackMap::iterator it = get_stats_callbacks_.find(transport_id); |
+ if (it != get_stats_callbacks_.end()) { |
Alpha Left Google
2014/03/03 07:11:39
nit: Early return if it is not found. This the fol
imcheng
2014/03/04 02:06:24
Done.
|
+ v8::Handle<v8::Value> callback_args[1]; |
+ callback_args[0] = v8::String::NewFromUtf8( |
Alpha Left Google
2014/03/03 07:11:39
I think it's odd that we pass the javascript API w
imcheng
2014/03/04 02:06:24
Per offline chat discussion, this api will return
|
+ isolate, stats->data(), v8::String::kNormalString, stats->size()); |
+ context()->CallFunction(it->second->NewHandle(isolate), 1, callback_args); |
+ get_stats_callbacks_.erase(it); |
+ } |
+} |
+ |
CastRtpStream* CastStreamingNativeHandler::GetRtpStreamOrThrow( |
int transport_id) const { |
RtpStreamMap::const_iterator iter = rtp_stream_map_.find( |