Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(169)

Side by Side Diff: chrome/renderer/extensions/webrtc_native_handler.cc

Issue 47303005: Implement native bindings for cast extensions API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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, &params)) {
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 &params_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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698