OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "extensions/browser/api/cast_channel/cast_channel_api.h" | 5 #include "extensions/browser/api/cast_channel/cast_channel_api.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <limits> | 10 #include <limits> |
11 #include <memory> | 11 #include <memory> |
12 #include <string> | 12 #include <string> |
13 #include <utility> | 13 #include <utility> |
14 #include <vector> | 14 #include <vector> |
15 | 15 |
16 #include "base/json/json_writer.h" | 16 #include "base/json/json_writer.h" |
17 #include "base/lazy_instance.h" | 17 #include "base/lazy_instance.h" |
18 #include "base/memory/ptr_util.h" | 18 #include "base/memory/ptr_util.h" |
19 #include "base/strings/string_number_conversions.h" | 19 #include "base/strings/string_number_conversions.h" |
20 #include "base/values.h" | 20 #include "base/values.h" |
21 #include "content/public/browser/browser_thread.h" | 21 #include "content/public/browser/browser_thread.h" |
| 22 #include "extensions/browser/api/cast_channel/cast_channel_enum_util.h" |
22 #include "extensions/browser/api/cast_channel/cast_message_util.h" | 23 #include "extensions/browser/api/cast_channel/cast_message_util.h" |
23 #include "extensions/browser/api/cast_channel/cast_socket.h" | 24 #include "extensions/browser/api/cast_channel/cast_socket.h" |
24 #include "extensions/browser/api/cast_channel/cast_socket_service.h" | 25 #include "extensions/browser/api/cast_channel/cast_socket_service.h" |
25 #include "extensions/browser/api/cast_channel/cast_socket_service_factory.h" | 26 #include "extensions/browser/api/cast_channel/cast_socket_service_factory.h" |
26 #include "extensions/browser/api/cast_channel/keep_alive_delegate.h" | 27 #include "extensions/browser/api/cast_channel/keep_alive_delegate.h" |
27 #include "extensions/browser/api/cast_channel/logger.h" | 28 #include "extensions/browser/api/cast_channel/logger.h" |
28 #include "extensions/browser/event_router.h" | 29 #include "extensions/browser/event_router.h" |
29 #include "extensions/common/api/cast_channel/cast_channel.pb.h" | 30 #include "extensions/common/api/cast_channel/cast_channel.pb.h" |
30 #include "extensions/common/api/cast_channel/logging.pb.h" | 31 #include "extensions/common/api/cast_channel/logging.pb.h" |
31 #include "net/base/ip_address.h" | 32 #include "net/base/ip_address.h" |
32 #include "net/base/ip_endpoint.h" | 33 #include "net/base/ip_endpoint.h" |
33 #include "net/base/net_errors.h" | 34 #include "net/base/net_errors.h" |
34 | 35 |
35 // Default timeout interval for connection setup. | 36 // Default timeout interval for connection setup. |
36 // Used if not otherwise specified at ConnectInfo::timeout. | 37 // Used if not otherwise specified at ConnectInfo::timeout. |
37 const int kDefaultConnectTimeoutMillis = 5000; // 5 seconds. | 38 const int kDefaultConnectTimeoutMillis = 5000; // 5 seconds. |
38 | 39 |
39 namespace extensions { | 40 namespace extensions { |
40 | 41 |
41 namespace Close = cast_channel::Close; | 42 namespace Close = cast_channel::Close; |
42 namespace OnError = cast_channel::OnError; | 43 namespace OnError = cast_channel::OnError; |
43 namespace OnMessage = cast_channel::OnMessage; | 44 namespace OnMessage = cast_channel::OnMessage; |
44 namespace Open = cast_channel::Open; | 45 namespace Open = cast_channel::Open; |
45 namespace Send = cast_channel::Send; | 46 namespace Send = cast_channel::Send; |
| 47 using ::cast_channel::ChannelError; |
46 using cast_channel::CastDeviceCapability; | 48 using cast_channel::CastDeviceCapability; |
47 using cast_channel::CastMessage; | 49 using cast_channel::CastMessage; |
48 using cast_channel::CastSocket; | 50 using cast_channel::CastSocket; |
49 using cast_channel::ChannelAuthType; | 51 using cast_channel::CastSocketImpl; |
50 using cast_channel::ChannelError; | 52 using cast_channel::CastTransport; |
51 using cast_channel::ChannelInfo; | 53 using cast_channel::ChannelInfo; |
52 using cast_channel::ConnectInfo; | 54 using cast_channel::ConnectInfo; |
53 using cast_channel::ErrorInfo; | 55 using cast_channel::ErrorInfo; |
| 56 using cast_channel::KeepAliveDelegate; |
54 using cast_channel::LastErrors; | 57 using cast_channel::LastErrors; |
55 using cast_channel::Logger; | 58 using cast_channel::Logger; |
56 using cast_channel::MessageInfo; | 59 using cast_channel::MessageInfo; |
57 using cast_channel::ReadyState; | |
58 using content::BrowserThread; | 60 using content::BrowserThread; |
59 | 61 |
60 namespace { | 62 namespace { |
61 | 63 |
62 // T is an extension dictionary (MessageInfo or ChannelInfo) | 64 // T is an extension dictionary (MessageInfo or ChannelInfo) |
63 template <class T> | 65 template <class T> |
64 std::string ParamToString(const T& info) { | 66 std::string ParamToString(const T& info) { |
65 std::unique_ptr<base::DictionaryValue> dict = info.ToValue(); | 67 std::unique_ptr<base::DictionaryValue> dict = info.ToValue(); |
66 std::string out; | 68 std::string out; |
67 base::JSONWriter::Write(*dict, &out); | 69 base::JSONWriter::Write(*dict, &out); |
68 return out; | 70 return out; |
69 } | 71 } |
70 | 72 |
71 // Fills |channel_info| from the destination and state of |socket|. | 73 // Fills |channel_info| from the destination and state of |socket|. |
72 void FillChannelInfo(const CastSocket& socket, ChannelInfo* channel_info) { | 74 void FillChannelInfo(const CastSocket& socket, ChannelInfo* channel_info) { |
73 DCHECK(channel_info); | 75 DCHECK(channel_info); |
74 channel_info->channel_id = socket.id(); | 76 channel_info->channel_id = socket.id(); |
75 const net::IPEndPoint& ip_endpoint = socket.ip_endpoint(); | 77 const net::IPEndPoint& ip_endpoint = socket.ip_endpoint(); |
76 channel_info->connect_info.ip_address = ip_endpoint.ToStringWithoutPort(); | 78 channel_info->connect_info.ip_address = ip_endpoint.ToStringWithoutPort(); |
77 channel_info->connect_info.port = ip_endpoint.port(); | 79 channel_info->connect_info.port = ip_endpoint.port(); |
78 channel_info->connect_info.auth = socket.channel_auth(); | 80 channel_info->connect_info.auth = |
79 channel_info->ready_state = socket.ready_state(); | 81 cast_channel::ToChannelAuthType(socket.channel_auth()); |
80 channel_info->error_state = socket.error_state(); | 82 channel_info->ready_state = cast_channel::ToReadyState(socket.ready_state()); |
| 83 channel_info->error_state = |
| 84 cast_channel::ToChannelError(socket.error_state()); |
81 channel_info->keep_alive = socket.keep_alive(); | 85 channel_info->keep_alive = socket.keep_alive(); |
82 channel_info->audio_only = socket.audio_only(); | 86 channel_info->audio_only = socket.audio_only(); |
83 } | 87 } |
84 | 88 |
85 // Fills |error_info| from |error_state| and |last_errors|. | 89 // Fills |error_info| from |error_state| and |last_errors|. |
86 void FillErrorInfo(ChannelError error_state, | 90 void FillErrorInfo(cast_channel::ChannelError error_state, |
87 const LastErrors& last_errors, | 91 const LastErrors& last_errors, |
88 ErrorInfo* error_info) { | 92 ErrorInfo* error_info) { |
89 error_info->error_state = error_state; | 93 error_info->error_state = error_state; |
90 if (last_errors.event_type != cast_channel::proto::EVENT_TYPE_UNKNOWN) | 94 if (last_errors.event_type != cast_channel::proto::EVENT_TYPE_UNKNOWN) |
91 error_info->event_type.reset(new int(last_errors.event_type)); | 95 error_info->event_type.reset(new int(last_errors.event_type)); |
92 if (last_errors.challenge_reply_error_type != | 96 if (last_errors.challenge_reply_error_type != |
93 cast_channel::proto::CHALLENGE_REPLY_ERROR_NONE) { | 97 cast_channel::proto::CHALLENGE_REPLY_ERROR_NONE) { |
94 error_info->challenge_reply_error_type.reset( | 98 error_info->challenge_reply_error_type.reset( |
95 new int(last_errors.challenge_reply_error_type)); | 99 new int(last_errors.challenge_reply_error_type)); |
96 } | 100 } |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 | 206 |
203 void CastChannelAsyncApiFunction::RemoveSocket(int channel_id) { | 207 void CastChannelAsyncApiFunction::RemoveSocket(int channel_id) { |
204 auto* sockets = cast_socket_service_->GetOrCreateSocketRegistry(); | 208 auto* sockets = cast_socket_service_->GetOrCreateSocketRegistry(); |
205 sockets->RemoveSocket(channel_id); | 209 sockets->RemoveSocket(channel_id); |
206 } | 210 } |
207 | 211 |
208 void CastChannelAsyncApiFunction::SetResultFromSocket( | 212 void CastChannelAsyncApiFunction::SetResultFromSocket( |
209 const CastSocket& socket) { | 213 const CastSocket& socket) { |
210 ChannelInfo channel_info; | 214 ChannelInfo channel_info; |
211 FillChannelInfo(socket, &channel_info); | 215 FillChannelInfo(socket, &channel_info); |
212 ChannelError error = socket.error_state(); | 216 cast_channel::ChannelError error = |
| 217 cast_channel::ToChannelError(socket.error_state()); |
213 if (error != cast_channel::CHANNEL_ERROR_NONE) { | 218 if (error != cast_channel::CHANNEL_ERROR_NONE) { |
214 SetError("Channel socket error = " + base::IntToString(error)); | 219 SetError("Channel socket error = " + base::IntToString(error)); |
215 } | 220 } |
216 SetResultFromChannelInfo(channel_info); | 221 SetResultFromChannelInfo(channel_info); |
217 } | 222 } |
218 | 223 |
219 void CastChannelAsyncApiFunction::SetResultFromError(int channel_id, | 224 void CastChannelAsyncApiFunction::SetResultFromError( |
220 ChannelError error) { | 225 int channel_id, |
| 226 cast_channel::ChannelError error) { |
221 ChannelInfo channel_info; | 227 ChannelInfo channel_info; |
222 channel_info.channel_id = channel_id; | 228 channel_info.channel_id = channel_id; |
223 channel_info.ready_state = cast_channel::READY_STATE_CLOSED; | 229 channel_info.ready_state = cast_channel::READY_STATE_CLOSED; |
224 channel_info.error_state = error; | 230 channel_info.error_state = error; |
225 channel_info.connect_info.ip_address = ""; | 231 channel_info.connect_info.ip_address = ""; |
226 channel_info.connect_info.port = 0; | 232 channel_info.connect_info.port = 0; |
227 channel_info.connect_info.auth = cast_channel::CHANNEL_AUTH_TYPE_SSL_VERIFIED; | 233 channel_info.connect_info.auth = cast_channel::CHANNEL_AUTH_TYPE_SSL_VERIFIED; |
228 SetResultFromChannelInfo(channel_info); | 234 SetResultFromChannelInfo(channel_info); |
229 SetError("Channel error = " + base::IntToString(error)); | 235 SetError("Channel error = " + base::IntToString(error)); |
230 } | 236 } |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 SetError("livenessTimeout and pingInterval must be set together."); | 293 SetError("livenessTimeout and pingInterval must be set together."); |
288 } else if (liveness_timeout_ < ping_interval_) { | 294 } else if (liveness_timeout_ < ping_interval_) { |
289 SetError("livenessTimeout must be longer than pingTimeout."); | 295 SetError("livenessTimeout must be longer than pingTimeout."); |
290 } | 296 } |
291 } | 297 } |
292 | 298 |
293 if (!GetError().empty()) { | 299 if (!GetError().empty()) { |
294 return false; | 300 return false; |
295 } | 301 } |
296 | 302 |
297 channel_auth_ = connect_info.auth; | 303 channel_auth_ = cast_channel::ToChannelAuthTypeInternal(connect_info.auth); |
298 ip_endpoint_.reset(ParseConnectInfo(connect_info)); | 304 ip_endpoint_.reset(ParseConnectInfo(connect_info)); |
299 return true; | 305 return true; |
300 } | 306 } |
301 | 307 |
302 void CastChannelOpenFunction::AsyncWorkStart() { | 308 void CastChannelOpenFunction::AsyncWorkStart() { |
303 DCHECK(api_); | 309 DCHECK(api_); |
304 DCHECK(ip_endpoint_.get()); | 310 DCHECK(ip_endpoint_.get()); |
305 const ConnectInfo& connect_info = params_->connect_info; | 311 const ConnectInfo& connect_info = params_->connect_info; |
306 CastSocket* socket; | 312 CastSocket* socket; |
307 std::unique_ptr<CastSocket> test_socket = api_->GetSocketForTest(); | 313 std::unique_ptr<CastSocket> test_socket = api_->GetSocketForTest(); |
308 if (test_socket.get()) { | 314 if (test_socket.get()) { |
309 socket = test_socket.release(); | 315 socket = test_socket.release(); |
310 } else { | 316 } else { |
311 socket = new cast_channel::CastSocketImpl( | 317 socket = new CastSocketImpl( |
312 extension_->id(), *ip_endpoint_, channel_auth_, | 318 extension_->id(), *ip_endpoint_, channel_auth_, |
313 ExtensionsBrowserClient::Get()->GetNetLog(), | 319 ExtensionsBrowserClient::Get()->GetNetLog(), |
314 base::TimeDelta::FromMilliseconds(connect_info.timeout.get() | 320 base::TimeDelta::FromMilliseconds(connect_info.timeout.get() |
315 ? *connect_info.timeout | 321 ? *connect_info.timeout |
316 : kDefaultConnectTimeoutMillis), | 322 : kDefaultConnectTimeoutMillis), |
317 liveness_timeout_ > base::TimeDelta(), api_->GetLogger(), | 323 liveness_timeout_ > base::TimeDelta(), api_->GetLogger(), |
318 connect_info.capabilities.get() ? *connect_info.capabilities | 324 connect_info.capabilities.get() ? *connect_info.capabilities |
319 : CastDeviceCapability::NONE); | 325 : CastDeviceCapability::NONE); |
320 } | 326 } |
321 new_channel_id_ = AddSocket(base::WrapUnique(socket)); | 327 new_channel_id_ = AddSocket(base::WrapUnique(socket)); |
322 | 328 |
323 // Construct read delegates. | 329 // Construct read delegates. |
324 std::unique_ptr<api::cast_channel::CastTransport::Delegate> delegate( | 330 std::unique_ptr<CastTransport::Delegate> delegate( |
325 base::MakeUnique<CastMessageHandler>( | 331 base::MakeUnique<CastMessageHandler>( |
326 base::Bind(&CastChannelAPI::SendEvent, api_->AsWeakPtr(), | 332 base::Bind(&CastChannelAPI::SendEvent, api_->AsWeakPtr(), |
327 extension_->id()), | 333 extension_->id()), |
328 socket, api_->GetLogger())); | 334 socket, api_->GetLogger())); |
329 if (socket->keep_alive()) { | 335 if (socket->keep_alive()) { |
330 // Wrap read delegate in a KeepAliveDelegate for timeout handling. | 336 // Wrap read delegate in a KeepAliveDelegate for timeout handling. |
331 api::cast_channel::KeepAliveDelegate* keep_alive = | 337 KeepAliveDelegate* keep_alive = |
332 new api::cast_channel::KeepAliveDelegate( | 338 new KeepAliveDelegate(socket, api_->GetLogger(), std::move(delegate), |
333 socket, api_->GetLogger(), std::move(delegate), ping_interval_, | 339 ping_interval_, liveness_timeout_); |
334 liveness_timeout_); | |
335 std::unique_ptr<base::Timer> injected_timer = | 340 std::unique_ptr<base::Timer> injected_timer = |
336 api_->GetInjectedTimeoutTimerForTest(); | 341 api_->GetInjectedTimeoutTimerForTest(); |
337 if (injected_timer) { | 342 if (injected_timer) { |
338 keep_alive->SetTimersForTest(base::MakeUnique<base::Timer>(false, false), | 343 keep_alive->SetTimersForTest(base::MakeUnique<base::Timer>(false, false), |
339 std::move(injected_timer)); | 344 std::move(injected_timer)); |
340 } | 345 } |
341 delegate.reset(keep_alive); | 346 delegate.reset(keep_alive); |
342 } | 347 } |
343 | 348 |
344 socket->Connect(std::move(delegate), | 349 socket->Connect(std::move(delegate), |
345 base::Bind(&CastChannelOpenFunction::OnOpen, this)); | 350 base::Bind(&CastChannelOpenFunction::OnOpen, this)); |
346 } | 351 } |
347 | 352 |
348 void CastChannelOpenFunction::OnOpen(cast_channel::ChannelError result) { | 353 void CastChannelOpenFunction::OnOpen(ChannelError result) { |
349 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 354 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
350 VLOG(1) << "Connect finished, OnOpen invoked."; | 355 VLOG(1) << "Connect finished, OnOpen invoked."; |
351 // TODO: If we failed to open the CastSocket, we may want to clean up here, | 356 // TODO: If we failed to open the CastSocket, we may want to clean up here, |
352 // rather than relying on the extension to call close(). This can be done by | 357 // rather than relying on the extension to call close(). This can be done by |
353 // calling RemoveSocket() and api_->GetLogger()->ClearLastErrors(channel_id). | 358 // calling RemoveSocket() and api_->GetLogger()->ClearLastErrors(channel_id). |
354 if (result != cast_channel::CHANNEL_ERROR_UNKNOWN) { | 359 if (result != ChannelError::UNKNOWN) { |
355 CastSocket* socket = GetSocket(new_channel_id_); | 360 CastSocket* socket = GetSocket(new_channel_id_); |
356 CHECK(socket); | 361 CHECK(socket); |
357 SetResultFromSocket(*socket); | 362 SetResultFromSocket(*socket); |
358 } else { | 363 } else { |
359 // The socket is being destroyed. | 364 // The socket is being destroyed. |
360 SetResultFromError(new_channel_id_, result); | 365 SetResultFromError(new_channel_id_, cast_channel::CHANNEL_ERROR_UNKNOWN); |
361 } | 366 } |
362 | 367 |
363 AsyncWorkCompleted(); | 368 AsyncWorkCompleted(); |
364 } | 369 } |
365 | 370 |
366 CastChannelSendFunction::CastChannelSendFunction() { } | 371 CastChannelSendFunction::CastChannelSendFunction() { } |
367 | 372 |
368 CastChannelSendFunction::~CastChannelSendFunction() { } | 373 CastChannelSendFunction::~CastChannelSendFunction() { } |
369 | 374 |
370 bool CastChannelSendFunction::Prepare() { | 375 bool CastChannelSendFunction::Prepare() { |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
463 SetResultFromSocket(*socket); | 468 SetResultFromSocket(*socket); |
464 // This will delete |socket|. | 469 // This will delete |socket|. |
465 RemoveSocket(channel_id); | 470 RemoveSocket(channel_id); |
466 api_->GetLogger()->ClearLastErrors(channel_id); | 471 api_->GetLogger()->ClearLastErrors(channel_id); |
467 } | 472 } |
468 AsyncWorkCompleted(); | 473 AsyncWorkCompleted(); |
469 } | 474 } |
470 | 475 |
471 CastChannelOpenFunction::CastMessageHandler::CastMessageHandler( | 476 CastChannelOpenFunction::CastMessageHandler::CastMessageHandler( |
472 const EventDispatchCallback& ui_dispatch_cb, | 477 const EventDispatchCallback& ui_dispatch_cb, |
473 cast_channel::CastSocket* socket, | 478 CastSocket* socket, |
474 scoped_refptr<Logger> logger) | 479 scoped_refptr<Logger> logger) |
475 : ui_dispatch_cb_(ui_dispatch_cb), socket_(socket), logger_(logger) { | 480 : ui_dispatch_cb_(ui_dispatch_cb), socket_(socket), logger_(logger) { |
476 DCHECK(socket_); | 481 DCHECK(socket_); |
477 DCHECK(logger_); | 482 DCHECK(logger_); |
478 } | 483 } |
479 | 484 |
480 CastChannelOpenFunction::CastMessageHandler::~CastMessageHandler() { | 485 CastChannelOpenFunction::CastMessageHandler::~CastMessageHandler() { |
481 } | 486 } |
482 | 487 |
483 void CastChannelOpenFunction::CastMessageHandler::OnError( | 488 void CastChannelOpenFunction::CastMessageHandler::OnError( |
484 cast_channel::ChannelError error_state) { | 489 ChannelError error_state) { |
485 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 490 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
486 | 491 |
487 ChannelInfo channel_info; | 492 ChannelInfo channel_info; |
488 FillChannelInfo(*socket_, &channel_info); | 493 FillChannelInfo(*socket_, &channel_info); |
489 channel_info.error_state = error_state; | 494 channel_info.error_state = cast_channel::ToChannelError(error_state); |
490 ErrorInfo error_info; | 495 ErrorInfo error_info; |
491 FillErrorInfo(error_state, logger_->GetLastErrors(socket_->id()), | 496 FillErrorInfo(channel_info.error_state, logger_->GetLastErrors(socket_->id()), |
492 &error_info); | 497 &error_info); |
493 | 498 |
494 std::unique_ptr<base::ListValue> results = | 499 std::unique_ptr<base::ListValue> results = |
495 OnError::Create(channel_info, error_info); | 500 OnError::Create(channel_info, error_info); |
496 std::unique_ptr<Event> event(new Event( | 501 std::unique_ptr<Event> event(new Event( |
497 events::CAST_CHANNEL_ON_ERROR, OnError::kEventName, std::move(results))); | 502 events::CAST_CHANNEL_ON_ERROR, OnError::kEventName, std::move(results))); |
498 BrowserThread::PostTask( | 503 BrowserThread::PostTask( |
499 BrowserThread::UI, FROM_HERE, | 504 BrowserThread::UI, FROM_HERE, |
500 base::Bind(ui_dispatch_cb_, base::Passed(std::move(event)))); | 505 base::Bind(ui_dispatch_cb_, base::Passed(std::move(event)))); |
501 } | 506 } |
502 | 507 |
503 void CastChannelOpenFunction::CastMessageHandler::OnMessage( | 508 void CastChannelOpenFunction::CastMessageHandler::OnMessage( |
504 const CastMessage& message) { | 509 const CastMessage& message) { |
505 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 510 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
506 | 511 |
507 MessageInfo message_info; | 512 MessageInfo message_info; |
508 cast_channel::CastMessageToMessageInfo(message, &message_info); | 513 CastMessageToMessageInfo(message, &message_info); |
509 ChannelInfo channel_info; | 514 ChannelInfo channel_info; |
510 FillChannelInfo(*socket_, &channel_info); | 515 FillChannelInfo(*socket_, &channel_info); |
511 VLOG(1) << "Received message " << ParamToString(message_info) | 516 VLOG(1) << "Received message " << ParamToString(message_info) |
512 << " on channel " << ParamToString(channel_info); | 517 << " on channel " << ParamToString(channel_info); |
513 | 518 |
514 std::unique_ptr<base::ListValue> results = | 519 std::unique_ptr<base::ListValue> results = |
515 OnMessage::Create(channel_info, message_info); | 520 OnMessage::Create(channel_info, message_info); |
516 std::unique_ptr<Event> event(new Event(events::CAST_CHANNEL_ON_MESSAGE, | 521 std::unique_ptr<Event> event(new Event(events::CAST_CHANNEL_ON_MESSAGE, |
517 OnMessage::kEventName, | 522 OnMessage::kEventName, |
518 std::move(results))); | 523 std::move(results))); |
519 BrowserThread::PostTask( | 524 BrowserThread::PostTask( |
520 BrowserThread::UI, FROM_HERE, | 525 BrowserThread::UI, FROM_HERE, |
521 base::Bind(ui_dispatch_cb_, base::Passed(std::move(event)))); | 526 base::Bind(ui_dispatch_cb_, base::Passed(std::move(event)))); |
522 } | 527 } |
523 | 528 |
524 void CastChannelOpenFunction::CastMessageHandler::Start() { | 529 void CastChannelOpenFunction::CastMessageHandler::Start() { |
525 } | 530 } |
526 | 531 |
527 } // namespace extensions | 532 } // namespace extensions |
OLD | NEW |