Index: chrome/browser/media/router/discovery/dial/dial_media_sink_service.cc |
diff --git a/chrome/browser/media/router/discovery/dial/dial_media_sink_service.cc b/chrome/browser/media/router/discovery/dial/dial_media_sink_service.cc |
index 562dcd5b8a213b51bed1f6e38abd4a3ed215c299..c5a53717e8496e0ada86264d73e47d52ee3bc33b 100644 |
--- a/chrome/browser/media/router/discovery/dial/dial_media_sink_service.cc |
+++ b/chrome/browser/media/router/discovery/dial/dial_media_sink_service.cc |
@@ -26,22 +26,29 @@ DialMediaSinkService::DialMediaSinkService( |
DCHECK(request_context_); |
} |
-DialMediaSinkService::~DialMediaSinkService() {} |
+DialMediaSinkService::~DialMediaSinkService() { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ Stop(); |
+} |
void DialMediaSinkService::Start() { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- dial_registry()->RegisterObserver(this); |
- dial_registry()->StartPeriodicDiscovery(); |
+ if (dial_registry_) |
+ return; |
+ |
+ dial_registry_ = DialRegistry::GetInstance(); |
+ dial_registry_->RegisterObserver(this); |
+ dial_registry_->OnListenerAdded(); |
} |
void DialMediaSinkService::Stop() { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- dial_registry()->UnregisterObserver(this); |
-} |
+ if (!dial_registry_) |
+ return; |
-DialRegistry* DialMediaSinkService::dial_registry() { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- return DialRegistry::GetInstance(); |
+ dial_registry_->OnListenerRemoved(); |
+ dial_registry_->UnregisterObserver(this); |
+ dial_registry_ = nullptr; |
} |
DeviceDescriptionService* DialMediaSinkService::GetDescriptionService() { |
@@ -56,18 +63,33 @@ DeviceDescriptionService* DialMediaSinkService::GetDescriptionService() { |
return description_service_.get(); |
} |
+void DialMediaSinkService::SetDialRegistryForTest(DialRegistry* dial_registry) { |
+ DCHECK(!dial_registry_); |
+ dial_registry_ = dial_registry; |
+ |
+ DCHECK(dial_registry); |
+ dial_registry_->RegisterObserver(this); |
+ dial_registry_->OnListenerAdded(); |
+} |
+ |
+void DialMediaSinkService::SetDescriptionServiceForTest( |
+ std::unique_ptr<DeviceDescriptionService> description_service) { |
+ DCHECK(!description_service_); |
+ description_service_ = std::move(description_service); |
+} |
+ |
+void DialMediaSinkService::SetTimerForTest(std::unique_ptr<base::Timer> timer) { |
+ DCHECK(!finish_timer_); |
+ finish_timer_ = std::move(timer); |
+} |
+ |
void DialMediaSinkService::OnDialDeviceEvent( |
const DialRegistry::DeviceList& devices) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
DVLOG(2) << "DialMediaSinkService::OnDialDeviceEvent found " << devices.size() |
<< " devices"; |
- // Add a finish timer. |
- finish_timer_.reset(new base::OneShotTimer()); |
- base::TimeDelta finish_delay = |
- base::TimeDelta::FromSeconds(kFetchCompleteTimeoutSecs); |
- finish_timer_->Start(FROM_HERE, finish_delay, this, |
- &DialMediaSinkService::OnFetchCompleted); |
+ StartTimer(); |
current_sinks_.clear(); |
current_devices_ = devices; |
@@ -107,16 +129,10 @@ void DialMediaSinkService::OnDeviceDescriptionAvailable( |
current_sinks_.insert(MediaSinkInternal(sink, extra_data)); |
- if (finish_timer_) |
- return; |
- |
// Start fetch timer again if device description comes back after |
// |finish_timer_| fires. |
- base::TimeDelta finish_delay = |
- base::TimeDelta::FromSeconds(kFetchCompleteTimeoutSecs); |
- finish_timer_.reset(new base::OneShotTimer()); |
- finish_timer_->Start(FROM_HERE, finish_delay, this, |
- &DialMediaSinkService::OnFetchCompleted); |
+ if (!finish_timer_->IsRunning()) |
+ StartTimer(); |
} |
void DialMediaSinkService::OnDeviceDescriptionError( |
@@ -127,21 +143,29 @@ void DialMediaSinkService::OnDeviceDescriptionError( |
} |
void DialMediaSinkService::OnFetchCompleted() { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
DCHECK(!sink_discovery_callback_.is_null()); |
- finish_timer_.reset(); |
- |
- auto sinks = current_sinks_; |
- if (sinks == mrp_sinks_) { |
+ if (current_sinks_ == mrp_sinks_) { |
DVLOG(2) << "No update to sink list."; |
return; |
} |
- DVLOG(2) << "Send sinks to media router, [size]: " << sinks.size(); |
- sink_discovery_callback_.Run( |
- std::vector<MediaSinkInternal>(sinks.begin(), sinks.end())); |
- mrp_sinks_ = std::move(sinks); |
+ DVLOG(2) << "Send sinks to media router, [size]: " << current_sinks_.size(); |
+ sink_discovery_callback_.Run(std::vector<MediaSinkInternal>( |
+ current_sinks_.begin(), current_sinks_.end())); |
+ mrp_sinks_ = current_sinks_; |
+} |
+ |
+void DialMediaSinkService::StartTimer() { |
+ // Create a finish timer. |
+ if (!finish_timer_) |
+ finish_timer_.reset(new base::OneShotTimer()); |
+ |
+ base::TimeDelta finish_delay = |
+ base::TimeDelta::FromSeconds(kFetchCompleteTimeoutSecs); |
+ finish_timer_->Start(FROM_HERE, finish_delay, |
+ base::Bind(&DialMediaSinkService::OnFetchCompleted, |
+ base::Unretained(this))); |
} |
} // namespace media_router |