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

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

Powered by Google App Engine
This is Rietveld 408576698