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 "base/logging.h" | 7 #include "base/logging.h" |
8 #include "chrome/common/extensions/api/webrtc_cast_send_transport.h" | |
9 #include "chrome/common/extensions/api/webrtc_cast_udp_transport.h" | |
10 #include "chrome/renderer/extensions/chrome_v8_context.h" | |
11 #include "chrome/renderer/media/cast_session.h" | |
12 #include "chrome/renderer/media/cast_send_transport.h" | |
13 #include "chrome/renderer/media/cast_udp_transport.h" | |
14 #include "content/public/renderer/v8_value_converter.h" | |
15 #include "net/base/host_port_pair.h" | |
16 | |
17 using content::V8ValueConverter; | |
18 | |
19 // Extension types. | |
20 using extensions::api::webrtc_cast_send_transport::RtpCaps; | |
21 using extensions::api::webrtc_cast_send_transport::RtpParams; | |
22 using extensions::api::webrtc_cast_send_transport::RtpPayloadParams; | |
23 using extensions::api::webrtc_cast_udp_transport::CreateInfo; | |
24 using extensions::api::webrtc_cast_udp_transport::UdpParams; | |
8 | 25 |
9 namespace extensions { | 26 namespace extensions { |
10 | 27 |
28 namespace { | |
29 const char kSendTransportNotFound[] = | |
scherkus (not reviewing)
2013/10/29 17:38:17
can this fit on one line?
Alpha Left Google
2013/10/29 19:52:18
Done.
| |
30 "The send transport cannot be found"; | |
31 const char kUdpTransportNotFound[] = "The udp transport cannot be found"; | |
scherkus (not reviewing)
2013/10/29 17:38:17
s/udp/UDP/
Alpha Left Google
2013/10/29 19:52:18
Done.
| |
32 const char kInvalidUdpParams[] = "Invalid UDP params"; | |
33 const char kInvalidRtpCaps[] = "Invalid value for RTP caps"; | |
34 const char kInvalidRtpParams[] = "Invalid value for RTP params"; | |
35 const char kUnableToConvertArgs[] = "Unable to convert arguments"; | |
36 const char kUnableToConvertCaps[] = "Unable to convert caps"; | |
37 const char kUnableToConvertParams[] = "Unable to convert params"; | |
38 | |
39 // Convert from extension API's RtpCaps to CastRtpCaps. | |
40 bool ToCastRtpCaps(const RtpCaps& ext_caps, CastRtpCaps* cast_caps) { | |
41 NOTIMPLEMENTED(); | |
42 return true; | |
43 } | |
44 | |
45 // Convert from CastRtpCaps to extension API's RtpCaps. | |
46 bool FromCastRtpCaps(const CastRtpCaps& cast_caps, RtpCaps* ext_caps) { | |
47 NOTIMPLEMENTED(); | |
48 return true; | |
49 } | |
50 | |
51 // Convert from extension API's RtpParams to CastRtpCaps. | |
scherkus (not reviewing)
2013/10/29 17:38:17
s/CastRtpCaps/CastRtpParams/
Alpha Left Google
2013/10/29 19:52:18
Done.
| |
52 bool ToCastRtpParams(const RtpParams& ext_params, CastRtpParams* cast_params) { | |
53 NOTIMPLEMENTED(); | |
54 return true; | |
55 } | |
56 | |
57 // Convert from extension API's RtpParams to CastRtpCaps. | |
scherkus (not reviewing)
2013/10/29 17:38:17
this comment is backwards
in fact, I'm not sure h
Alpha Left Google
2013/10/29 19:52:18
Okay. I removed them all.
| |
58 bool FromCastRtpParams(const CastRtpParams& cast_params, | |
59 RtpParams* ext_params) { | |
60 NOTIMPLEMENTED(); | |
61 return true; | |
62 } | |
63 | |
64 } // namespace | |
65 | |
11 WebRtcNativeHandler::WebRtcNativeHandler(ChromeV8Context* context) | 66 WebRtcNativeHandler::WebRtcNativeHandler(ChromeV8Context* context) |
12 : ObjectBackedNativeHandler(context) { | 67 : ObjectBackedNativeHandler(context), |
68 last_transport_id_(0) { | |
13 RouteFunction("CreateCastSendTransport", | 69 RouteFunction("CreateCastSendTransport", |
14 base::Bind(&WebRtcNativeHandler::CreateCastSendTransport, | 70 base::Bind(&WebRtcNativeHandler::CreateCastSendTransport, |
15 base::Unretained(this))); | 71 base::Unretained(this))); |
16 RouteFunction("DestroyCastSendTransport", | 72 RouteFunction("DestroyCastSendTransport", |
17 base::Bind(&WebRtcNativeHandler::DestroyCastSendTransport, | 73 base::Bind(&WebRtcNativeHandler::DestroyCastSendTransport, |
18 base::Unretained(this))); | 74 base::Unretained(this))); |
19 RouteFunction("CreateParamsCastSendTransport", | 75 RouteFunction("CreateParamsCastSendTransport", |
20 base::Bind(&WebRtcNativeHandler::CreateParamsCastSendTransport, | 76 base::Bind(&WebRtcNativeHandler::CreateParamsCastSendTransport, |
21 base::Unretained(this))); | 77 base::Unretained(this))); |
22 RouteFunction("GetCapsCastSendTransport", | 78 RouteFunction("GetCapsCastSendTransport", |
23 base::Bind(&WebRtcNativeHandler::GetCapsCastSendTransport, | 79 base::Bind(&WebRtcNativeHandler::GetCapsCastSendTransport, |
24 base::Unretained(this))); | 80 base::Unretained(this))); |
25 RouteFunction("StartCastSendTransport", | 81 RouteFunction("StartCastSendTransport", |
26 base::Bind(&WebRtcNativeHandler::StartCastSendTransport, | 82 base::Bind(&WebRtcNativeHandler::StartCastSendTransport, |
27 base::Unretained(this))); | 83 base::Unretained(this))); |
28 RouteFunction("StopCastSendTransport", | 84 RouteFunction("StopCastSendTransport", |
29 base::Bind(&WebRtcNativeHandler::StopCastSendTransport, | 85 base::Bind(&WebRtcNativeHandler::StopCastSendTransport, |
30 base::Unretained(this))); | 86 base::Unretained(this))); |
31 RouteFunction("CreateCastUdpTransport", | 87 RouteFunction("CreateCastUdpTransport", |
32 base::Bind(&WebRtcNativeHandler::CreateCastUdpTransport, | 88 base::Bind(&WebRtcNativeHandler::CreateCastUdpTransport, |
33 base::Unretained(this))); | 89 base::Unretained(this))); |
90 RouteFunction("DestroyCastUdpTransport", | |
91 base::Bind(&WebRtcNativeHandler::DestroyCastUdpTransport, | |
92 base::Unretained(this))); | |
34 RouteFunction("StartCastUdpTransport", | 93 RouteFunction("StartCastUdpTransport", |
35 base::Bind(&WebRtcNativeHandler::StartCastUdpTransport, | 94 base::Bind(&WebRtcNativeHandler::StartCastUdpTransport, |
36 base::Unretained(this))); | 95 base::Unretained(this))); |
37 RouteFunction("StopCastUdpTransport", | 96 RouteFunction("StopCastUdpTransport", |
38 base::Bind(&WebRtcNativeHandler::StopCastUdpTransport, | 97 base::Bind(&WebRtcNativeHandler::StopCastUdpTransport, |
39 base::Unretained(this))); | 98 base::Unretained(this))); |
40 } | 99 } |
41 | 100 |
42 WebRtcNativeHandler::~WebRtcNativeHandler() { | 101 WebRtcNativeHandler::~WebRtcNativeHandler() { |
43 } | 102 } |
44 | 103 |
45 void WebRtcNativeHandler::CreateCastSendTransport( | 104 void WebRtcNativeHandler::CreateCastSendTransport( |
46 const v8::FunctionCallbackInfo<v8::Value>& args) { | 105 const v8::FunctionCallbackInfo<v8::Value>& args) { |
47 NOTIMPLEMENTED(); | 106 CHECK_EQ(3, args.Length()); |
107 CHECK(args[0]->IsInt32()); | |
scherkus (not reviewing)
2013/10/29 17:38:17
what about args[1]?
also, is crashing really the
Alpha Left Google
2013/10/29 19:52:18
args[1] is a MediaStreamTrack and the extension sy
scherkus (not reviewing)
2013/10/29 23:47:22
I've found at least one counter-example :)
chrome/
| |
108 CHECK(args[2]->IsFunction()); | |
109 | |
110 int inner_transport_id = static_cast<int>( | |
scherkus (not reviewing)
2013/10/29 17:38:17
can this fit on one line?
Alpha Left Google
2013/10/29 19:52:18
Done.
| |
111 args[0]->ToInt32()->Value()); | |
112 CastUdpTransport* inner_transport = GetUdpTransport(inner_transport_id); | |
113 if (!inner_transport) | |
114 return; | |
115 | |
116 // TODO(hclam): Convert second argument from v8::Value to | |
117 // WebMediaStreamTrack. | |
118 int transport_id = last_transport_id_++; | |
119 send_transport_map_[transport_id] = | |
120 linked_ptr<CastSendTransport>( | |
121 new CastSendTransport(inner_transport, NULL)); | |
122 | |
123 v8::Handle<v8::Value> transport_id_v8 = v8::Integer::New(transport_id); | |
124 context()->CallFunction(v8::Handle<v8::Function>::Cast(args[2]), 1, | |
125 &transport_id_v8); | |
48 } | 126 } |
49 | 127 |
50 void WebRtcNativeHandler::DestroyCastSendTransport( | 128 void WebRtcNativeHandler::DestroyCastSendTransport( |
51 const v8::FunctionCallbackInfo<v8::Value>& args) { | 129 const v8::FunctionCallbackInfo<v8::Value>& args) { |
52 NOTIMPLEMENTED(); | 130 CHECK_EQ(1, args.Length()); |
131 CHECK(args[0]->IsInt32()); | |
132 | |
133 int transport_id = static_cast<int>(args[0]->ToInt32()->Value()); | |
134 CastSendTransport* transport = GetSendTransport(transport_id); | |
135 if (!transport) | |
136 return; | |
137 send_transport_map_.erase(transport_id); | |
53 } | 138 } |
54 | 139 |
55 void WebRtcNativeHandler::CreateParamsCastSendTransport( | 140 void WebRtcNativeHandler::CreateParamsCastSendTransport( |
56 const v8::FunctionCallbackInfo<v8::Value>& args) { | 141 const v8::FunctionCallbackInfo<v8::Value>& args) { |
57 NOTIMPLEMENTED(); | 142 CHECK_EQ(3, args.Length()); |
143 CHECK(args[0]->IsInt32()); | |
144 CHECK(args[1]->IsObject()); | |
145 CHECK(args[2]->IsFunction()); | |
146 | |
147 int transport_id = static_cast<int>(args[0]->ToInt32()->Value()); | |
148 CastSendTransport* transport = GetSendTransport(transport_id); | |
149 if (!transport) | |
150 return; | |
151 | |
152 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); | |
153 scoped_ptr<Value> remote_caps_value( | |
154 converter->FromV8Value(args[1], context()->v8_context())); | |
155 if (!remote_caps_value) { | |
156 v8::ThrowException(v8::Exception::TypeError(v8::String::New( | |
157 kUnableToConvertArgs))); | |
158 return; | |
159 } | |
160 scoped_ptr<RtpCaps> remote_caps = | |
161 RtpCaps::FromValue(*remote_caps_value); | |
162 if (!remote_caps) { | |
163 v8::ThrowException(v8::Exception::TypeError(v8::String::New( | |
164 kInvalidRtpCaps))); | |
165 return; | |
166 } | |
167 | |
168 CastRtpCaps cast_remote_caps; | |
169 if (!ToCastRtpCaps(*remote_caps, &cast_remote_caps)) { | |
170 v8::ThrowException(v8::Exception::TypeError(v8::String::New( | |
171 kUnableToConvertCaps))); | |
172 return; | |
173 } | |
174 CastRtpParams cast_params = transport->CreateParams(cast_remote_caps); | |
175 RtpParams params; | |
176 if (!FromCastRtpParams(cast_params, ¶ms)) { | |
177 v8::ThrowException(v8::Exception::TypeError(v8::String::New( | |
178 kUnableToConvertParams))); | |
179 return; | |
180 } | |
181 | |
182 scoped_ptr<base::DictionaryValue> params_value = params.ToValue(); | |
183 v8::Handle<v8::Value> params_v8 = converter->ToV8Value( | |
184 params_value.get(), context()->v8_context()); | |
185 context()->CallFunction(v8::Handle<v8::Function>::Cast(args[2]), 1, | |
186 ¶ms_v8); | |
58 } | 187 } |
59 | 188 |
60 void WebRtcNativeHandler::GetCapsCastSendTransport( | 189 void WebRtcNativeHandler::GetCapsCastSendTransport( |
61 const v8::FunctionCallbackInfo<v8::Value>& args) { | 190 const v8::FunctionCallbackInfo<v8::Value>& args) { |
62 NOTIMPLEMENTED(); | 191 CHECK_EQ(2, args.Length()); |
192 CHECK(args[0]->IsInt32()); | |
193 CHECK(args[1]->IsFunction()); | |
194 | |
195 int transport_id = static_cast<int>(args[0]->ToInt32()->Value()); | |
196 CastSendTransport* transport = GetSendTransport(transport_id); | |
197 if (!transport) | |
198 return; | |
199 | |
200 CastRtpCaps cast_caps = transport->GetCaps(); | |
201 RtpCaps caps; | |
202 if (!FromCastRtpCaps(cast_caps, &caps)) { | |
203 v8::ThrowException(v8::Exception::TypeError(v8::String::New( | |
204 kUnableToConvertCaps))); | |
205 return; | |
206 } | |
207 | |
208 scoped_ptr<base::DictionaryValue> caps_value = caps.ToValue(); | |
209 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); | |
210 v8::Handle<v8::Value> caps_v8 = converter->ToV8Value( | |
211 caps_value.get(), context()->v8_context()); | |
212 context()->CallFunction(v8::Handle<v8::Function>::Cast(args[1]), 1, | |
213 &caps_v8); | |
63 } | 214 } |
64 | 215 |
65 void WebRtcNativeHandler::StartCastSendTransport( | 216 void WebRtcNativeHandler::StartCastSendTransport( |
66 const v8::FunctionCallbackInfo<v8::Value>& args) { | 217 const v8::FunctionCallbackInfo<v8::Value>& args) { |
67 NOTIMPLEMENTED(); | 218 CHECK_EQ(2, args.Length()); |
219 CHECK(args[0]->IsInt32()); | |
220 CHECK(args[1]->IsObject()); | |
221 | |
222 int transport_id = static_cast<int>(args[0]->ToInt32()->Value()); | |
223 CastSendTransport* transport = GetSendTransport(transport_id); | |
224 if (!transport) | |
225 return; | |
226 | |
227 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); | |
228 scoped_ptr<Value> params_value( | |
229 converter->FromV8Value(args[1], context()->v8_context())); | |
230 if (!params_value) { | |
231 v8::ThrowException(v8::Exception::TypeError(v8::String::New( | |
232 kUnableToConvertParams))); | |
233 return; | |
234 } | |
235 scoped_ptr<RtpParams> params = RtpParams::FromValue(*params_value); | |
236 if (!params) { | |
237 v8::ThrowException(v8::Exception::TypeError(v8::String::New( | |
238 kInvalidRtpParams))); | |
239 return; | |
240 } | |
241 | |
242 CastRtpCaps cast_params; | |
243 if (!ToCastRtpParams(*params, &cast_params)) { | |
244 v8::ThrowException(v8::Exception::TypeError(v8::String::New( | |
245 kUnableToConvertParams))); | |
246 return; | |
247 } | |
248 transport->Start(cast_params); | |
68 } | 249 } |
69 | 250 |
70 void WebRtcNativeHandler::StopCastSendTransport( | 251 void WebRtcNativeHandler::StopCastSendTransport( |
71 const v8::FunctionCallbackInfo<v8::Value>& args) { | 252 const v8::FunctionCallbackInfo<v8::Value>& args) { |
72 NOTIMPLEMENTED(); | 253 CHECK_EQ(1, args.Length()); |
254 CHECK(args[0]->IsInt32()); | |
255 | |
256 int transport_id = static_cast<int>(args[0]->ToInt32()->Value()); | |
257 CastSendTransport* transport = GetSendTransport(transport_id); | |
258 if (!transport) | |
259 return; | |
260 transport->Stop(); | |
73 } | 261 } |
74 | 262 |
75 void WebRtcNativeHandler::CreateCastUdpTransport( | 263 void WebRtcNativeHandler::CreateCastUdpTransport( |
76 const v8::FunctionCallbackInfo<v8::Value>& args) { | 264 const v8::FunctionCallbackInfo<v8::Value>& args) { |
77 NOTIMPLEMENTED(); | 265 CHECK_EQ(1, args.Length()); |
266 CHECK(args[0]->IsFunction()); | |
267 | |
268 // TODO(hclam): Fill in |create_info| properly. We might have to | |
269 // call the callback asynchronously after the port is allocated. | |
270 CreateInfo create_info; | |
271 create_info.transport_id = last_transport_id_++; | |
scherkus (not reviewing)
2013/10/29 17:38:17
do we need to initialize create_info.params in any
Alpha Left Google
2013/10/29 19:52:18
It will initialized with 0s which is appropriate f
| |
272 udp_transport_map_[create_info.transport_id] = | |
273 linked_ptr<CastUdpTransport>(new CastUdpTransport()); | |
274 | |
275 scoped_ptr<base::DictionaryValue> create_info_value = create_info.ToValue(); | |
276 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); | |
277 v8::Handle<v8::Value> create_info_v8 = converter->ToV8Value( | |
278 create_info_value.get(), context()->v8_context()); | |
279 context()->CallFunction(v8::Handle<v8::Function>::Cast(args[0]), 1, | |
280 &create_info_v8); | |
281 } | |
282 | |
283 void WebRtcNativeHandler::DestroyCastUdpTransport( | |
284 const v8::FunctionCallbackInfo<v8::Value>& args) { | |
285 CHECK_EQ(1, args.Length()); | |
286 CHECK(args[0]->IsInt32()); | |
justinlin
2013/10/29 18:22:29
I don't think you want to CHECK these. They're use
Alpha Left Google
2013/10/29 19:52:18
This seems to be the style used for the extension
| |
287 | |
288 int transport_id = static_cast<int>(args[0]->ToInt32()->Value()); | |
289 CastUdpTransport* transport = GetUdpTransport(transport_id); | |
290 if (!transport) | |
291 return; | |
292 udp_transport_map_.erase(transport_id); | |
78 } | 293 } |
79 | 294 |
80 void WebRtcNativeHandler::StartCastUdpTransport( | 295 void WebRtcNativeHandler::StartCastUdpTransport( |
81 const v8::FunctionCallbackInfo<v8::Value>& args) { | 296 const v8::FunctionCallbackInfo<v8::Value>& args) { |
82 NOTIMPLEMENTED(); | 297 CHECK_EQ(2, args.Length()); |
298 CHECK(args[0]->IsInt32()); | |
scherkus (not reviewing)
2013/10/29 17:38:17
what about args[1]?
Alpha Left Google
2013/10/29 19:52:18
Checked for IsObject().
| |
299 | |
300 int transport_id = static_cast<int>(args[0]->ToInt32()->Value()); | |
301 CastUdpTransport* transport = GetUdpTransport(transport_id); | |
302 if (!transport) | |
303 return; | |
304 | |
305 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); | |
306 scoped_ptr<Value> udp_params_value( | |
307 converter->FromV8Value(args[1], context()->v8_context())); | |
308 if (!udp_params_value) { | |
309 v8::ThrowException(v8::Exception::TypeError(v8::String::New( | |
310 kUnableToConvertArgs))); | |
311 return; | |
312 } | |
313 scoped_ptr<UdpParams> udp_params = UdpParams::FromValue(*udp_params_value); | |
314 if (!udp_params) { | |
315 v8::ThrowException(v8::Exception::TypeError(v8::String::New( | |
316 kInvalidUdpParams))); | |
317 return; | |
318 } | |
319 transport->Start(net::HostPortPair(udp_params->address, udp_params->port)); | |
83 } | 320 } |
84 | 321 |
85 void WebRtcNativeHandler::StopCastUdpTransport( | 322 void WebRtcNativeHandler::StopCastUdpTransport( |
86 const v8::FunctionCallbackInfo<v8::Value>& args) { | 323 const v8::FunctionCallbackInfo<v8::Value>& args) { |
87 NOTIMPLEMENTED(); | 324 CHECK_EQ(1, args.Length()); |
325 CHECK(args[0]->IsInt32()); | |
326 | |
327 int transport_id = static_cast<int>(args[0]->ToInt32()->Value()); | |
328 CastUdpTransport* transport = GetUdpTransport(transport_id); | |
329 if (!transport) | |
330 return; | |
331 transport->Stop(); | |
332 } | |
333 | |
334 CastSendTransport* WebRtcNativeHandler::GetSendTransport( | |
335 int transport_id) const { | |
336 SendTransportMap::const_iterator iter = send_transport_map_.find( | |
337 transport_id); | |
338 if (iter != send_transport_map_.end()) | |
339 return iter->second.get(); | |
340 v8::ThrowException(v8::Exception::RangeError(v8::String::New( | |
341 kSendTransportNotFound))); | |
342 return NULL; | |
343 } | |
344 | |
345 CastUdpTransport* WebRtcNativeHandler::GetUdpTransport( | |
346 int transport_id) const { | |
347 UdpTransportMap::const_iterator iter = udp_transport_map_.find( | |
348 transport_id); | |
349 if (iter != udp_transport_map_.end()) | |
350 return iter->second.get(); | |
351 v8::ThrowException(v8::Exception::RangeError(v8::String::New( | |
352 kUdpTransportNotFound))); | |
353 return NULL; | |
88 } | 354 } |
89 | 355 |
90 } // namespace extensions | 356 } // namespace extensions |
OLD | NEW |