Index: content/browser/device_monitor_mac.mm |
diff --git a/content/browser/device_monitor_mac.mm b/content/browser/device_monitor_mac.mm |
index 5491aa640eec7d595651fc86290aca82eaee63f8..ae720cbdd9686017b2b934438eb6af6e00e1b8f5 100644 |
--- a/content/browser/device_monitor_mac.mm |
+++ b/content/browser/device_monitor_mac.mm |
@@ -378,10 +378,15 @@ void AVFoundationMonitorImpl::StartObserverOnDeviceThread() { |
std::set<CrAVCaptureDevice*>::iterator found = |
std::find(monitoredDevices_.begin(), monitoredDevices_.end(), device); |
DCHECK(found != monitoredDevices_.end()); |
- [device removeObserver:self |
- forKeyPath:@"suspended"]; |
- [device removeObserver:self |
- forKeyPath:@"connected"]; |
+ // Every so seldom, |device| might be gone when getting here, in that case |
+ // removing the observer causes a crash. Try to avoid it by checking sanity of |
+ // the |device| via its -observationInfo. http://crbug.com/371271. |
+ if ([device observationInfo]) { |
+ [device removeObserver:self |
+ forKeyPath:@"suspended"]; |
+ [device removeObserver:self |
+ forKeyPath:@"connected"]; |
+ } |
monitoredDevices_.erase(found); |
} |