Chromium Code Reviews| Index: extensions/browser/api/cast_channel/cast_channel_api.cc |
| diff --git a/extensions/browser/api/cast_channel/cast_channel_api.cc b/extensions/browser/api/cast_channel/cast_channel_api.cc |
| index 811b681d1c26870683b2a990fc7b9f5aa08702c8..43f70152181ea8ec203bb278f78cc16f1bed6994 100644 |
| --- a/extensions/browser/api/cast_channel/cast_channel_api.cc |
| +++ b/extensions/browser/api/cast_channel/cast_channel_api.cc |
| @@ -22,7 +22,6 @@ |
| #include "components/cast_channel/cast_message_util.h" |
| #include "components/cast_channel/cast_socket.h" |
| #include "components/cast_channel/cast_socket_service.h" |
| -#include "components/cast_channel/cast_socket_service_factory.h" |
| #include "components/cast_channel/keep_alive_delegate.h" |
| #include "components/cast_channel/logger.h" |
| #include "components/cast_channel/proto/cast_channel.pb.h" |
| @@ -137,6 +136,18 @@ void CastChannelAPI::SendEvent(const std::string& extension_id, |
| } |
| } |
| +cast_channel::CastSocket::Observer* CastChannelAPI::GetObserver( |
| + const std::string& extension_id, |
| + scoped_refptr<cast_channel::Logger> logger) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + if (!observer_) { |
| + observer_.reset(new CastMessageHandler( |
| + base::Bind(&CastChannelAPI::SendEvent, this->AsWeakPtr()), logger)); |
| + } |
| + observer_->RegisterExtensionId(extension_id); |
| + return observer_.get(); |
| +} |
| + |
| static base::LazyInstance< |
| BrowserContextKeyedAPIFactory<CastChannelAPI>>::DestructorAtExit g_factory = |
| LAZY_INSTANCE_INITIALIZER; |
| @@ -168,9 +179,7 @@ CastChannelAsyncApiFunction::CastChannelAsyncApiFunction() |
| CastChannelAsyncApiFunction::~CastChannelAsyncApiFunction() { } |
| bool CastChannelAsyncApiFunction::PrePrepare() { |
| - cast_socket_service_ = |
| - cast_channel::CastSocketServiceFactory::GetForBrowserContext( |
| - browser_context()); |
| + cast_socket_service_ = cast_channel::CastSocketService::GetInstance(); |
| DCHECK(cast_socket_service_); |
| return true; |
| } |
| @@ -277,14 +286,8 @@ void CastChannelOpenFunction::AsyncWorkStart() { |
| if (test_socket.get()) |
| cast_socket_service_->SetSocketForTest(std::move(test_socket)); |
| - auto* observer = cast_socket_service_->GetObserver(extension_->id()); |
| - if (!observer) { |
| - observer = cast_socket_service_->AddObserver( |
| - extension_->id(), base::MakeUnique<CastMessageHandler>( |
| - base::Bind(&CastChannelAPI::SendEvent, |
| - api_->AsWeakPtr(), extension_->id()), |
| - cast_socket_service_->GetLogger())); |
| - } |
| + auto* observer = |
| + api_->GetObserver(extension_->id(), cast_socket_service_->GetLogger()); |
| cast_socket_service_->OpenSocket( |
| *ip_endpoint_, ExtensionsBrowserClient::Get()->GetNetLog(), |
| @@ -422,20 +425,23 @@ void CastChannelCloseFunction::OnClose(int result) { |
| AsyncWorkCompleted(); |
| } |
| -CastChannelOpenFunction::CastMessageHandler::CastMessageHandler( |
| +CastChannelAPI::CastMessageHandler::CastMessageHandler( |
| const EventDispatchCallback& ui_dispatch_cb, |
| scoped_refptr<Logger> logger) |
| : ui_dispatch_cb_(ui_dispatch_cb), logger_(logger) { |
| + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| DCHECK(logger_); |
| } |
| -CastChannelOpenFunction::CastMessageHandler::~CastMessageHandler() { |
| +CastChannelAPI::CastMessageHandler::~CastMessageHandler() { |
| + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| + cast_channel::CastSocketService::GetInstance()->RemoveObserver(this); |
| } |
| -void CastChannelOpenFunction::CastMessageHandler::OnError( |
| +void CastChannelAPI::CastMessageHandler::OnError( |
| const cast_channel::CastSocket& socket, |
| ChannelError error_state) { |
| - DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| ChannelInfo channel_info; |
| FillChannelInfo(socket, &channel_info); |
| @@ -444,19 +450,22 @@ void CastChannelOpenFunction::CastMessageHandler::OnError( |
| FillErrorInfo(channel_info.error_state, logger_->GetLastError(socket.id()), |
| &error_info); |
| - std::unique_ptr<base::ListValue> results = |
| - OnError::Create(channel_info, error_info); |
| - std::unique_ptr<Event> event(new Event( |
| - events::CAST_CHANNEL_ON_ERROR, OnError::kEventName, std::move(results))); |
| - BrowserThread::PostTask( |
| - BrowserThread::UI, FROM_HERE, |
| - base::Bind(ui_dispatch_cb_, base::Passed(std::move(event)))); |
| + for (const auto& extension_id : extension_ids_) { |
| + std::unique_ptr<base::ListValue> results = |
| + OnError::Create(channel_info, error_info); |
| + std::unique_ptr<Event> event(new Event(events::CAST_CHANNEL_ON_ERROR, |
| + OnError::kEventName, |
| + std::move(results))); |
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| + base::Bind(ui_dispatch_cb_, extension_id, |
| + base::Passed(std::move(event)))); |
| + } |
| } |
| -void CastChannelOpenFunction::CastMessageHandler::OnMessage( |
| +void CastChannelAPI::CastMessageHandler::OnMessage( |
| const cast_channel::CastSocket& socket, |
| const CastMessage& message) { |
| - DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| MessageInfo message_info; |
| CastMessageToMessageInfo(message, &message_info); |
| @@ -465,14 +474,21 @@ void CastChannelOpenFunction::CastMessageHandler::OnMessage( |
| VLOG(1) << "Received message " << ParamToString(message_info) |
| << " on channel " << ParamToString(channel_info); |
| - std::unique_ptr<base::ListValue> results = |
| - OnMessage::Create(channel_info, message_info); |
| - std::unique_ptr<Event> event(new Event(events::CAST_CHANNEL_ON_MESSAGE, |
| - OnMessage::kEventName, |
| - std::move(results))); |
| - BrowserThread::PostTask( |
| - BrowserThread::UI, FROM_HERE, |
| - base::Bind(ui_dispatch_cb_, base::Passed(std::move(event)))); |
| + for (const auto& extension_id : extension_ids_) { |
| + std::unique_ptr<base::ListValue> results = |
| + OnMessage::Create(channel_info, message_info); |
| + std::unique_ptr<Event> event(new Event(events::CAST_CHANNEL_ON_MESSAGE, |
| + OnMessage::kEventName, |
| + std::move(results))); |
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| + base::Bind(ui_dispatch_cb_, extension_id, |
| + base::Passed(std::move(event)))); |
| + } |
| +} |
| + |
| +void CastChannelAPI::CastMessageHandler::RegisterExtensionId( |
|
mark a. foltz
2017/07/10 20:43:05
Right now there are only two extension ids that ar
imcheng
2017/07/11 01:31:15
Changing to allow one extension at a time sounds f
zhaobin
2017/07/12 21:58:08
Done.
|
| + const std::string& extension_id) { |
| + extension_ids_.insert(extension_id); |
| } |
| } // namespace extensions |