| Index: chrome/renderer/extensions/webrtc_native_handler.cc
|
| diff --git a/chrome/renderer/extensions/webrtc_native_handler.cc b/chrome/renderer/extensions/webrtc_native_handler.cc
|
| index ba04e98b912eead5b247dd72821b317d5c46aee4..ac3bf18a11e09f86147c0026e13fc033d37d9f81 100644
|
| --- a/chrome/renderer/extensions/webrtc_native_handler.cc
|
| +++ b/chrome/renderer/extensions/webrtc_native_handler.cc
|
| @@ -7,6 +7,7 @@
|
| #include <functional>
|
|
|
| #include "base/logging.h"
|
| +#include "base/message_loop/message_loop.h"
|
| #include "chrome/common/extensions/api/webrtc_cast_send_transport.h"
|
| #include "chrome/common/extensions/api/webrtc_cast_udp_transport.h"
|
| #include "chrome/renderer/extensions/chrome_v8_context.h"
|
| @@ -123,9 +124,10 @@ void ToCastRtpParams(const RtpParams& ext_params, CastRtpParams* cast_params) {
|
|
|
| WebRtcNativeHandler::WebRtcNativeHandler(ChromeV8Context* context)
|
| : ObjectBackedNativeHandler(context),
|
| - last_transport_id_(0) {
|
| - RouteFunction("CreateCastSendTransport",
|
| - base::Bind(&WebRtcNativeHandler::CreateCastSendTransport,
|
| + last_transport_id_(0),
|
| + weak_factory_(this) {
|
| + RouteFunction("CreateSession",
|
| + base::Bind(&WebRtcNativeHandler::CreateCastSession,
|
| base::Unretained(this)));
|
| RouteFunction("DestroyCastSendTransport",
|
| base::Bind(&WebRtcNativeHandler::DestroyCastSendTransport,
|
| @@ -139,9 +141,6 @@ WebRtcNativeHandler::WebRtcNativeHandler(ChromeV8Context* context)
|
| RouteFunction("StopCastSendTransport",
|
| base::Bind(&WebRtcNativeHandler::StopCastSendTransport,
|
| base::Unretained(this)));
|
| - RouteFunction("CreateCastUdpTransport",
|
| - base::Bind(&WebRtcNativeHandler::CreateCastUdpTransport,
|
| - base::Unretained(this)));
|
| RouteFunction("DestroyCastUdpTransport",
|
| base::Bind(&WebRtcNativeHandler::DestroyCastUdpTransport,
|
| base::Unretained(this)));
|
| @@ -153,31 +152,66 @@ WebRtcNativeHandler::WebRtcNativeHandler(ChromeV8Context* context)
|
| WebRtcNativeHandler::~WebRtcNativeHandler() {
|
| }
|
|
|
| -void WebRtcNativeHandler::CreateCastSendTransport(
|
| +void WebRtcNativeHandler::CreateCastSession(
|
| const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| CHECK_EQ(3, args.Length());
|
| - CHECK(args[0]->IsInt32());
|
| + CHECK(args[0]->IsObject());
|
| CHECK(args[1]->IsObject());
|
| CHECK(args[2]->IsFunction());
|
|
|
| - const int inner_transport_id = args[0]->ToInt32()->Value();
|
| - CastUdpTransport* inner_transport = GetUdpTransportOrThrow(
|
| - inner_transport_id);
|
| - if (!inner_transport)
|
| + blink::WebDOMMediaStreamTrack track1 =
|
| + blink::WebDOMMediaStreamTrack::fromV8Value(args[0]);
|
| + if (track1.isNull())
|
| return;
|
| -
|
| - blink::WebDOMMediaStreamTrack track =
|
| + blink::WebDOMMediaStreamTrack track2 =
|
| blink::WebDOMMediaStreamTrack::fromV8Value(args[1]);
|
| - if (track.isNull())
|
| + if (track2.isNull())
|
| return;
|
| - const int transport_id = last_transport_id_++;
|
| - send_transport_map_[transport_id] =
|
| - linked_ptr<CastSendTransport>(
|
| - new CastSendTransport(inner_transport, track.component()));
|
| -
|
| - v8::Handle<v8::Value> transport_id_v8 = v8::Integer::New(transport_id);
|
| - context()->CallFunction(v8::Handle<v8::Function>::Cast(args[2]), 1,
|
| - &transport_id_v8);
|
| +
|
| + scoped_refptr<CastSession> session(new CastSession());
|
| + scoped_ptr<CastSendTransport> stream1(
|
| + new CastSendTransport(track1.component(), session));
|
| + scoped_ptr<CastSendTransport> stream2(
|
| + new CastSendTransport(track2.component(), session));
|
| + scoped_ptr<CastUdpTransport> udp_transport(
|
| + new CastUdpTransport(session));
|
| +
|
| + create_callback_.reset(args[2].As<v8::Function>());
|
| +
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(
|
| + &WebRtcNativeHandler::CallCreateCallback,
|
| + weak_factory_.GetWeakPtr(),
|
| + base::Passed(&stream1),
|
| + base::Passed(&stream2),
|
| + base::Passed(&udp_transport)));
|
| +}
|
| +
|
| +void WebRtcNativeHandler::CallCreateCallback(
|
| + scoped_ptr<CastSendTransport> stream1,
|
| + scoped_ptr<CastSendTransport> stream2,
|
| + scoped_ptr<CastUdpTransport> udp_transport) {
|
| + v8::HandleScope handle_scope(context()->isolate());
|
| + v8::Context::Scope context_scope(context()->v8_context());
|
| +
|
| + const int stream1_id = last_transport_id_++;
|
| + send_transport_map_[stream1_id] =
|
| + linked_ptr<CastSendTransport>(stream1.release());
|
| + const int stream2_id = last_transport_id_++;
|
| + send_transport_map_[stream2_id] =
|
| + linked_ptr<CastSendTransport>(stream2.release());
|
| + const int udp_id = last_transport_id_++;
|
| + udp_transport_map_[udp_id] =
|
| + linked_ptr<CastUdpTransport>(udp_transport.release());
|
| +
|
| + v8::Handle<v8::Value> callback_args[3];
|
| + callback_args[0] = v8::Integer::New(stream1_id);
|
| + callback_args[1] = v8::Integer::New(stream2_id);
|
| + callback_args[2] = v8::Integer::New(udp_id);
|
| + context()->CallFunction(create_callback_.NewHandle(context()->isolate()),
|
| + 3, callback_args);
|
| + create_callback_.reset();
|
| }
|
|
|
| void WebRtcNativeHandler::DestroyCastSendTransport(
|
| @@ -254,20 +288,6 @@ void WebRtcNativeHandler::StopCastSendTransport(
|
| transport->Stop();
|
| }
|
|
|
| -void WebRtcNativeHandler::CreateCastUdpTransport(
|
| - const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| - CHECK_EQ(1, args.Length());
|
| - CHECK(args[0]->IsFunction());
|
| -
|
| - const int transport_id = last_transport_id_++;
|
| - udp_transport_map_[transport_id] =
|
| - linked_ptr<CastUdpTransport>(new CastUdpTransport());
|
| -
|
| - v8::Handle<v8::Value> transport_id_v8 = v8::Integer::New(transport_id);
|
| - context()->CallFunction(v8::Handle<v8::Function>::Cast(args[0]), 1,
|
| - &transport_id_v8);
|
| -}
|
| -
|
| void WebRtcNativeHandler::DestroyCastUdpTransport(
|
| const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| CHECK_EQ(1, args.Length());
|
|
|