Index: chrome/renderer/extensions/cast_streaming_native_handler.cc |
diff --git a/chrome/renderer/extensions/cast_streaming_native_handler.cc b/chrome/renderer/extensions/cast_streaming_native_handler.cc |
index 284ad774ef33df6d214d3ada1426fcd2d5184ca9..5b92c6fa1b341cd002fcffa9764472e5048ea11e 100644 |
--- a/chrome/renderer/extensions/cast_streaming_native_handler.cc |
+++ b/chrome/renderer/extensions/cast_streaming_native_handler.cc |
@@ -38,6 +38,7 @@ const char kInvalidDestination[] = "Invalid destination"; |
const char kInvalidRtpParams[] = "Invalid value for RTP params"; |
const char kInvalidAesKey[] = "Invalid value for AES key"; |
const char kInvalidAesIvMask[] = "Invalid value for AES IV mask"; |
+const char kInvalidStreamArgs[] = "Invalid stream arguments"; |
const char kUnableToConvertArgs[] = "Unable to convert arguments"; |
const char kUnableToConvertParams[] = "Unable to convert params"; |
@@ -196,24 +197,40 @@ CastStreamingNativeHandler::~CastStreamingNativeHandler() { |
void CastStreamingNativeHandler::CreateCastSession( |
const v8::FunctionCallbackInfo<v8::Value>& args) { |
CHECK_EQ(3, args.Length()); |
- CHECK(args[0]->IsObject()); |
- CHECK(args[1]->IsObject()); |
CHECK(args[2]->IsFunction()); |
- blink::WebDOMMediaStreamTrack track1 = |
- blink::WebDOMMediaStreamTrack::fromV8Value(args[0]); |
- if (track1.isNull()) |
- return; |
- blink::WebDOMMediaStreamTrack track2 = |
- blink::WebDOMMediaStreamTrack::fromV8Value(args[1]); |
- if (track2.isNull()) |
+ v8::Isolate* isolate = context()->v8_context()->GetIsolate(); |
+ if ((args[0]->IsNull() || args[0]->IsUndefined()) && |
+ (args[1]->IsNull() || args[1]->IsUndefined())) { |
+ isolate->ThrowException(v8::Exception::Error( |
+ v8::String::NewFromUtf8(isolate, kInvalidStreamArgs))); |
return; |
+ } |
scoped_refptr<CastSession> session(new CastSession()); |
- scoped_ptr<CastRtpStream> stream1( |
- new CastRtpStream(track1.component(), session)); |
- scoped_ptr<CastRtpStream> stream2( |
- new CastRtpStream(track2.component(), session)); |
+ scoped_ptr<CastRtpStream> stream1, stream2; |
+ if (!args[0]->IsNull() && !args[0]->IsUndefined()) { |
+ CHECK(args[0]->IsObject()); |
+ blink::WebDOMMediaStreamTrack track = |
+ blink::WebDOMMediaStreamTrack::fromV8Value(args[0]); |
+ if (track.isNull()) { |
+ isolate->ThrowException(v8::Exception::Error( |
+ v8::String::NewFromUtf8(isolate, kInvalidStreamArgs))); |
+ return; |
+ } |
+ stream1.reset(new CastRtpStream(track.component(), session)); |
+ } |
+ if (!args[1]->IsNull() && !args[1]->IsUndefined()) { |
+ CHECK(args[1]->IsObject()); |
+ blink::WebDOMMediaStreamTrack track = |
+ blink::WebDOMMediaStreamTrack::fromV8Value(args[1]); |
+ if (track.isNull()) { |
+ isolate->ThrowException(v8::Exception::Error( |
+ v8::String::NewFromUtf8(isolate, kInvalidStreamArgs))); |
+ return; |
+ } |
+ stream2.reset(new CastRtpStream(track.component(), session)); |
+ } |
scoped_ptr<CastUdpTransport> udp_transport( |
new CastUdpTransport(session)); |
@@ -239,19 +256,25 @@ void CastStreamingNativeHandler::CallCreateCallback( |
v8::HandleScope handle_scope(isolate); |
v8::Context::Scope context_scope(context()->v8_context()); |
- const int stream1_id = last_transport_id_++; |
- rtp_stream_map_[stream1_id] = |
- linked_ptr<CastRtpStream>(stream1.release()); |
- const int stream2_id = last_transport_id_++; |
- rtp_stream_map_[stream2_id] = |
- linked_ptr<CastRtpStream>(stream2.release()); |
+ v8::Handle<v8::Value> callback_args[3]; |
+ callback_args[0] = v8::Null(isolate); |
+ callback_args[1] = v8::Null(isolate); |
+ |
+ if (stream1) { |
+ const int stream1_id = last_transport_id_++; |
+ callback_args[0] = v8::Integer::New(isolate, stream1_id); |
+ rtp_stream_map_[stream1_id] = |
+ linked_ptr<CastRtpStream>(stream1.release()); |
+ } |
+ if (stream2) { |
+ const int stream2_id = last_transport_id_++; |
+ callback_args[1] = v8::Integer::New(isolate, stream2_id); |
+ rtp_stream_map_[stream2_id] = |
+ linked_ptr<CastRtpStream>(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(isolate, stream1_id); |
- callback_args[1] = v8::Integer::New(isolate, stream2_id); |
callback_args[2] = v8::Integer::New(isolate, udp_id); |
context()->CallFunction(create_callback_.NewHandle(isolate), |
3, callback_args); |