OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/renderer/extensions/webrtc_native_handler.h" | 5 #include "chrome/renderer/extensions/webrtc_native_handler.h" |
6 | 6 |
7 #include <functional> | 7 #include <functional> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/message_loop/message_loop.h" |
10 #include "chrome/common/extensions/api/webrtc_cast_send_transport.h" | 11 #include "chrome/common/extensions/api/webrtc_cast_send_transport.h" |
11 #include "chrome/common/extensions/api/webrtc_cast_udp_transport.h" | 12 #include "chrome/common/extensions/api/webrtc_cast_udp_transport.h" |
12 #include "chrome/renderer/extensions/chrome_v8_context.h" | 13 #include "chrome/renderer/extensions/chrome_v8_context.h" |
13 #include "chrome/renderer/media/cast_send_transport.h" | 14 #include "chrome/renderer/media/cast_send_transport.h" |
14 #include "chrome/renderer/media/cast_session.h" | 15 #include "chrome/renderer/media/cast_session.h" |
15 #include "chrome/renderer/media/cast_udp_transport.h" | 16 #include "chrome/renderer/media/cast_udp_transport.h" |
16 #include "content/public/renderer/v8_value_converter.h" | 17 #include "content/public/renderer/v8_value_converter.h" |
17 #include "net/base/host_port_pair.h" | 18 #include "net/base/host_port_pair.h" |
18 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" | 19 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" |
19 #include "third_party/WebKit/public/web/WebDOMMediaStreamTrack.h" | 20 #include "third_party/WebKit/public/web/WebDOMMediaStreamTrack.h" |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 CastRtpPayloadParams cast_payload_params; | 117 CastRtpPayloadParams cast_payload_params; |
117 ToCastRtpPayloadParams(*ext_params.payloads[i], &cast_payload_params); | 118 ToCastRtpPayloadParams(*ext_params.payloads[i], &cast_payload_params); |
118 cast_params->payloads.push_back(cast_payload_params); | 119 cast_params->payloads.push_back(cast_payload_params); |
119 } | 120 } |
120 } | 121 } |
121 | 122 |
122 } // namespace | 123 } // namespace |
123 | 124 |
124 WebRtcNativeHandler::WebRtcNativeHandler(ChromeV8Context* context) | 125 WebRtcNativeHandler::WebRtcNativeHandler(ChromeV8Context* context) |
125 : ObjectBackedNativeHandler(context), | 126 : ObjectBackedNativeHandler(context), |
126 last_transport_id_(0) { | 127 last_transport_id_(0), |
127 RouteFunction("CreateCastSendTransport", | 128 weak_factory_(this) { |
128 base::Bind(&WebRtcNativeHandler::CreateCastSendTransport, | 129 RouteFunction("CreateSession", |
| 130 base::Bind(&WebRtcNativeHandler::CreateCastSession, |
129 base::Unretained(this))); | 131 base::Unretained(this))); |
130 RouteFunction("DestroyCastSendTransport", | 132 RouteFunction("DestroyCastSendTransport", |
131 base::Bind(&WebRtcNativeHandler::DestroyCastSendTransport, | 133 base::Bind(&WebRtcNativeHandler::DestroyCastSendTransport, |
132 base::Unretained(this))); | 134 base::Unretained(this))); |
133 RouteFunction("GetCapsCastSendTransport", | 135 RouteFunction("GetCapsCastSendTransport", |
134 base::Bind(&WebRtcNativeHandler::GetCapsCastSendTransport, | 136 base::Bind(&WebRtcNativeHandler::GetCapsCastSendTransport, |
135 base::Unretained(this))); | 137 base::Unretained(this))); |
136 RouteFunction("StartCastSendTransport", | 138 RouteFunction("StartCastSendTransport", |
137 base::Bind(&WebRtcNativeHandler::StartCastSendTransport, | 139 base::Bind(&WebRtcNativeHandler::StartCastSendTransport, |
138 base::Unretained(this))); | 140 base::Unretained(this))); |
139 RouteFunction("StopCastSendTransport", | 141 RouteFunction("StopCastSendTransport", |
140 base::Bind(&WebRtcNativeHandler::StopCastSendTransport, | 142 base::Bind(&WebRtcNativeHandler::StopCastSendTransport, |
141 base::Unretained(this))); | 143 base::Unretained(this))); |
142 RouteFunction("CreateCastUdpTransport", | |
143 base::Bind(&WebRtcNativeHandler::CreateCastUdpTransport, | |
144 base::Unretained(this))); | |
145 RouteFunction("DestroyCastUdpTransport", | 144 RouteFunction("DestroyCastUdpTransport", |
146 base::Bind(&WebRtcNativeHandler::DestroyCastUdpTransport, | 145 base::Bind(&WebRtcNativeHandler::DestroyCastUdpTransport, |
147 base::Unretained(this))); | 146 base::Unretained(this))); |
148 RouteFunction("StartCastUdpTransport", | 147 RouteFunction("StartCastUdpTransport", |
149 base::Bind(&WebRtcNativeHandler::StartCastUdpTransport, | 148 base::Bind(&WebRtcNativeHandler::StartCastUdpTransport, |
150 base::Unretained(this))); | 149 base::Unretained(this))); |
151 } | 150 } |
152 | 151 |
153 WebRtcNativeHandler::~WebRtcNativeHandler() { | 152 WebRtcNativeHandler::~WebRtcNativeHandler() { |
154 } | 153 } |
155 | 154 |
156 void WebRtcNativeHandler::CreateCastSendTransport( | 155 void WebRtcNativeHandler::CreateCastSession( |
157 const v8::FunctionCallbackInfo<v8::Value>& args) { | 156 const v8::FunctionCallbackInfo<v8::Value>& args) { |
158 CHECK_EQ(3, args.Length()); | 157 CHECK_EQ(3, args.Length()); |
159 CHECK(args[0]->IsInt32()); | 158 CHECK(args[0]->IsObject()); |
160 CHECK(args[1]->IsObject()); | 159 CHECK(args[1]->IsObject()); |
161 CHECK(args[2]->IsFunction()); | 160 CHECK(args[2]->IsFunction()); |
162 | 161 |
163 const int inner_transport_id = args[0]->ToInt32()->Value(); | 162 blink::WebDOMMediaStreamTrack track1 = |
164 CastUdpTransport* inner_transport = GetUdpTransportOrThrow( | 163 blink::WebDOMMediaStreamTrack::fromV8Value(args[0]); |
165 inner_transport_id); | 164 if (track1.isNull()) |
166 if (!inner_transport) | 165 return; |
| 166 blink::WebDOMMediaStreamTrack track2 = |
| 167 blink::WebDOMMediaStreamTrack::fromV8Value(args[1]); |
| 168 if (track2.isNull()) |
167 return; | 169 return; |
168 | 170 |
169 blink::WebDOMMediaStreamTrack track = | 171 scoped_refptr<CastSession> session(new CastSession()); |
170 blink::WebDOMMediaStreamTrack::fromV8Value(args[1]); | 172 scoped_ptr<CastSendTransport> stream1( |
171 if (track.isNull()) | 173 new CastSendTransport(track1.component(), session)); |
172 return; | 174 scoped_ptr<CastSendTransport> stream2( |
173 const int transport_id = last_transport_id_++; | 175 new CastSendTransport(track2.component(), session)); |
174 send_transport_map_[transport_id] = | 176 scoped_ptr<CastUdpTransport> udp_transport( |
175 linked_ptr<CastSendTransport>( | 177 new CastUdpTransport(session)); |
176 new CastSendTransport(inner_transport, track.component())); | |
177 | 178 |
178 v8::Handle<v8::Value> transport_id_v8 = v8::Integer::New(transport_id); | 179 create_callback_.reset(args[2].As<v8::Function>()); |
179 context()->CallFunction(v8::Handle<v8::Function>::Cast(args[2]), 1, | 180 |
180 &transport_id_v8); | 181 base::MessageLoop::current()->PostTask( |
| 182 FROM_HERE, |
| 183 base::Bind( |
| 184 &WebRtcNativeHandler::CallCreateCallback, |
| 185 weak_factory_.GetWeakPtr(), |
| 186 base::Passed(&stream1), |
| 187 base::Passed(&stream2), |
| 188 base::Passed(&udp_transport))); |
| 189 } |
| 190 |
| 191 void WebRtcNativeHandler::CallCreateCallback( |
| 192 scoped_ptr<CastSendTransport> stream1, |
| 193 scoped_ptr<CastSendTransport> stream2, |
| 194 scoped_ptr<CastUdpTransport> udp_transport) { |
| 195 v8::HandleScope handle_scope(context()->isolate()); |
| 196 v8::Context::Scope context_scope(context()->v8_context()); |
| 197 |
| 198 const int stream1_id = last_transport_id_++; |
| 199 send_transport_map_[stream1_id] = |
| 200 linked_ptr<CastSendTransport>(stream1.release()); |
| 201 const int stream2_id = last_transport_id_++; |
| 202 send_transport_map_[stream2_id] = |
| 203 linked_ptr<CastSendTransport>(stream2.release()); |
| 204 const int udp_id = last_transport_id_++; |
| 205 udp_transport_map_[udp_id] = |
| 206 linked_ptr<CastUdpTransport>(udp_transport.release()); |
| 207 |
| 208 v8::Handle<v8::Value> callback_args[3]; |
| 209 callback_args[0] = v8::Integer::New(stream1_id); |
| 210 callback_args[1] = v8::Integer::New(stream2_id); |
| 211 callback_args[2] = v8::Integer::New(udp_id); |
| 212 context()->CallFunction(create_callback_.NewHandle(context()->isolate()), |
| 213 3, callback_args); |
| 214 create_callback_.reset(); |
181 } | 215 } |
182 | 216 |
183 void WebRtcNativeHandler::DestroyCastSendTransport( | 217 void WebRtcNativeHandler::DestroyCastSendTransport( |
184 const v8::FunctionCallbackInfo<v8::Value>& args) { | 218 const v8::FunctionCallbackInfo<v8::Value>& args) { |
185 CHECK_EQ(1, args.Length()); | 219 CHECK_EQ(1, args.Length()); |
186 CHECK(args[0]->IsInt32()); | 220 CHECK(args[0]->IsInt32()); |
187 | 221 |
188 const int transport_id = args[0]->ToInt32()->Value(); | 222 const int transport_id = args[0]->ToInt32()->Value(); |
189 if (!GetSendTransportOrThrow(transport_id)) | 223 if (!GetSendTransportOrThrow(transport_id)) |
190 return; | 224 return; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 CHECK_EQ(1, args.Length()); | 281 CHECK_EQ(1, args.Length()); |
248 CHECK(args[0]->IsInt32()); | 282 CHECK(args[0]->IsInt32()); |
249 | 283 |
250 const int transport_id = args[0]->ToInt32()->Value(); | 284 const int transport_id = args[0]->ToInt32()->Value(); |
251 CastSendTransport* transport = GetSendTransportOrThrow(transport_id); | 285 CastSendTransport* transport = GetSendTransportOrThrow(transport_id); |
252 if (!transport) | 286 if (!transport) |
253 return; | 287 return; |
254 transport->Stop(); | 288 transport->Stop(); |
255 } | 289 } |
256 | 290 |
257 void WebRtcNativeHandler::CreateCastUdpTransport( | |
258 const v8::FunctionCallbackInfo<v8::Value>& args) { | |
259 CHECK_EQ(1, args.Length()); | |
260 CHECK(args[0]->IsFunction()); | |
261 | |
262 const int transport_id = last_transport_id_++; | |
263 udp_transport_map_[transport_id] = | |
264 linked_ptr<CastUdpTransport>(new CastUdpTransport()); | |
265 | |
266 v8::Handle<v8::Value> transport_id_v8 = v8::Integer::New(transport_id); | |
267 context()->CallFunction(v8::Handle<v8::Function>::Cast(args[0]), 1, | |
268 &transport_id_v8); | |
269 } | |
270 | |
271 void WebRtcNativeHandler::DestroyCastUdpTransport( | 291 void WebRtcNativeHandler::DestroyCastUdpTransport( |
272 const v8::FunctionCallbackInfo<v8::Value>& args) { | 292 const v8::FunctionCallbackInfo<v8::Value>& args) { |
273 CHECK_EQ(1, args.Length()); | 293 CHECK_EQ(1, args.Length()); |
274 CHECK(args[0]->IsInt32()); | 294 CHECK(args[0]->IsInt32()); |
275 | 295 |
276 const int transport_id = args[0]->ToInt32()->Value(); | 296 const int transport_id = args[0]->ToInt32()->Value(); |
277 if (!GetUdpTransportOrThrow(transport_id)) | 297 if (!GetUdpTransportOrThrow(transport_id)) |
278 return; | 298 return; |
279 udp_transport_map_.erase(transport_id); | 299 udp_transport_map_.erase(transport_id); |
280 } | 300 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 transport_id); | 345 transport_id); |
326 if (iter != udp_transport_map_.end()) | 346 if (iter != udp_transport_map_.end()) |
327 return iter->second.get(); | 347 return iter->second.get(); |
328 v8::Isolate* isolate = context()->v8_context()->GetIsolate(); | 348 v8::Isolate* isolate = context()->v8_context()->GetIsolate(); |
329 isolate->ThrowException(v8::Exception::RangeError( | 349 isolate->ThrowException(v8::Exception::RangeError( |
330 v8::String::NewFromUtf8(isolate, kUdpTransportNotFound))); | 350 v8::String::NewFromUtf8(isolate, kUdpTransportNotFound))); |
331 return NULL; | 351 return NULL; |
332 } | 352 } |
333 | 353 |
334 } // namespace extensions | 354 } // namespace extensions |
OLD | NEW |