Index: chrome/browser/media/webrtc/media_stream_capture_indicator.cc |
diff --git a/chrome/browser/media/webrtc/media_stream_capture_indicator.cc b/chrome/browser/media/webrtc/media_stream_capture_indicator.cc |
index 105b62124296c2cc5388129d62e62749688bc835..9e809839325b0fcb0e652f6b27f5d86bd981edcf 100644 |
--- a/chrome/browser/media/webrtc/media_stream_capture_indicator.cc |
+++ b/chrome/browser/media/webrtc/media_stream_capture_indicator.cc |
@@ -114,11 +114,15 @@ class MediaStreamCaptureIndicator::WebContentsDeviceUsage |
const content::MediaStreamDevices& devices); |
// Increment ref-counts up based on the type of each device provided. |
- void AddDevices(const content::MediaStreamDevices& devices); |
+ void AddDevices(const content::MediaStreamDevices& devices, |
+ const base::Closure& close_callback); |
// Decrement ref-counts up based on the type of each device provided. |
void RemoveDevices(const content::MediaStreamDevices& devices); |
+ // Helper to call |stop_callback_|. |
+ void NotifyStopped(); |
+ |
private: |
// content::WebContentsObserver overrides. |
void WebContentsDestroyed() override { |
@@ -130,6 +134,7 @@ class MediaStreamCaptureIndicator::WebContentsDeviceUsage |
int video_ref_count_; |
int mirroring_ref_count_; |
+ base::Closure stop_callback_; |
base::WeakPtrFactory<WebContentsDeviceUsage> weak_factory_; |
DISALLOW_COPY_AND_ASSIGN(WebContentsDeviceUsage); |
@@ -161,7 +166,7 @@ class MediaStreamCaptureIndicator::UIDelegate : public content::MediaStreamUI { |
DCHECK(!started_); |
started_ = true; |
if (device_usage_.get()) |
- device_usage_->AddDevices(devices_); |
+ device_usage_->AddDevices(devices_, close_callback); |
return 0; |
} |
@@ -179,11 +184,11 @@ MediaStreamCaptureIndicator::WebContentsDeviceUsage::RegisterMediaStream( |
} |
void MediaStreamCaptureIndicator::WebContentsDeviceUsage::AddDevices( |
- const content::MediaStreamDevices& devices) { |
+ const content::MediaStreamDevices& devices, |
+ const base::Closure& close_callback) { |
for (content::MediaStreamDevices::const_iterator it = devices.begin(); |
it != devices.end(); ++it) { |
- if (it->type == content::MEDIA_TAB_AUDIO_CAPTURE || |
- it->type == content::MEDIA_TAB_VIDEO_CAPTURE) { |
+ if (content::IsScreenCaptureMediaType(it->type)) { |
++mirroring_ref_count_; |
} else if (content::IsAudioInputMediaType(it->type)) { |
++audio_ref_count_; |
@@ -194,8 +199,10 @@ void MediaStreamCaptureIndicator::WebContentsDeviceUsage::AddDevices( |
} |
} |
- if (web_contents()) |
+ if (web_contents()) { |
+ stop_callback_ = close_callback; |
web_contents()->NotifyNavigationStateChanged(content::INVALIDATE_TYPE_TAB); |
+ } |
indicator_->UpdateNotificationUserInterface(); |
} |
@@ -204,8 +211,7 @@ void MediaStreamCaptureIndicator::WebContentsDeviceUsage::RemoveDevices( |
const content::MediaStreamDevices& devices) { |
for (content::MediaStreamDevices::const_iterator it = devices.begin(); |
it != devices.end(); ++it) { |
- if (it->type == content::MEDIA_TAB_AUDIO_CAPTURE || |
- it->type == content::MEDIA_TAB_VIDEO_CAPTURE) { |
+ if (IsScreenCaptureMediaType(it->type)) { |
--mirroring_ref_count_; |
} else if (content::IsAudioInputMediaType(it->type)) { |
--audio_ref_count_; |
@@ -224,6 +230,14 @@ void MediaStreamCaptureIndicator::WebContentsDeviceUsage::RemoveDevices( |
indicator_->UpdateNotificationUserInterface(); |
} |
+void MediaStreamCaptureIndicator::WebContentsDeviceUsage::NotifyStopped() { |
+ if (!stop_callback_.is_null()) { |
+ base::Closure callback = stop_callback_; |
+ stop_callback_.Reset(); |
+ callback.Run(); |
+ } |
+} |
+ |
MediaStreamCaptureIndicator::MediaStreamCaptureIndicator() |
: status_icon_(NULL), |
mic_image_(NULL), |
@@ -297,6 +311,15 @@ bool MediaStreamCaptureIndicator::IsBeingMirrored( |
return usage && usage->IsMirroring(); |
} |
+void MediaStreamCaptureIndicator::NotifyStopped( |
+ content::WebContents* web_contents) const { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ |
+ WebContentsDeviceUsage* usage = usage_map_.get(web_contents); |
+ DCHECK(usage); |
+ usage->NotifyStopped(); |
+} |
+ |
void MediaStreamCaptureIndicator::UnregisterWebContents( |
WebContents* web_contents) { |
usage_map_.erase(web_contents); |