Chromium Code Reviews| Index: content/browser/web_contents/web_contents_impl.cc |
| diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc |
| index 5ec31a02c05612ac3f3807e8b0e0ed9d560352f4..b1300e2c162eab7375943ee033fac7d3863281a2 100644 |
| --- a/content/browser/web_contents/web_contents_impl.cc |
| +++ b/content/browser/web_contents/web_contents_impl.cc |
| @@ -331,7 +331,8 @@ WebContentsImpl::WebContentsImpl(BrowserContext* browser_context, |
| geolocation_service_context_(new GeolocationServiceContext()), |
| accessibility_mode_( |
| BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode()), |
| - audio_stream_monitor_(this), |
| + audio_stream_monitor_(base::Bind( |
| + &WebContentsImpl::NotifyAudibleStateChanged, base::Unretained(this))), |
| loading_weak_factory_(this) { |
| for (size_t i = 0; i < g_created_callbacks.Get().size(); i++) |
| g_created_callbacks.Get().at(i).Run(this); |
| @@ -949,14 +950,16 @@ bool WebContentsImpl::IsAudioMuted() const { |
| return audio_muter_.get() && audio_muter_->is_muting(); |
| } |
| -void WebContentsImpl::SetAudioMuted(bool mute) { |
| - DVLOG(1) << "SetAudioMuted(mute=" << mute << "), was " << IsAudioMuted() |
| +void WebContentsImpl::SetAudioMuted(bool muted, const std::string& cause) { |
| + DVLOG(1) << "SetAudioMuted(muted=" << muted << ", cause =" << cause << "), was " << IsAudioMuted() |
| << " for WebContentsImpl@" << this; |
| - if (mute == IsAudioMuted()) |
| + if (muted == IsAudioMuted()) |
| return; |
| - if (mute) { |
| + NotifyMutedStateChanged(muted, cause); |
| + |
| + if (muted) { |
| if (!audio_muter_) |
| audio_muter_.reset(new WebContentsAudioMuter(this)); |
| audio_muter_->StartMuting(); |
| @@ -995,20 +998,30 @@ bool WebContentsImpl::IsBeingDestroyed() const { |
| void WebContentsImpl::NotifyNavigationStateChanged( |
| InvalidateTypes changed_flags) { |
| + if (delegate_) |
| + delegate_->NavigationStateChanged(this, changed_flags); |
| +} |
| + |
| +void WebContentsImpl::NotifyAudibleStateChanged(bool is_audible) { |
| + DCHECK(AudioStreamMonitor::monitoring_available()); |
| + |
| // Create and release the audio power save blocker depending on whether the |
| // tab is actively producing audio or not. |
| - if (changed_flags == INVALIDATE_TYPE_TAB && |
| - AudioStreamMonitor::monitoring_available()) { |
| - if (WasRecentlyAudible()) { |
| - if (!audio_power_save_blocker_) |
| - CreateAudioPowerSaveBlocker(); |
| - } else { |
| - audio_power_save_blocker_.reset(); |
| - } |
| + if (WasRecentlyAudible()) { |
| + if (!audio_power_save_blocker_) |
| + CreateAudioPowerSaveBlocker(); |
| + } else { |
| + audio_power_save_blocker_.reset(); |
| } |
| - if (delegate_) |
| - delegate_->NavigationStateChanged(this, changed_flags); |
| + // TODO: The following should be eliminated once the browser UI uses the new WebContentsObserver interface. |
|
miu
2014/12/05 23:46:48
Actually, I think I gave you bad advice (earlier)
|
| + NotifyNavigationStateChanged(INVALIDATE_TYPE_TAB); |
| + |
| + FOR_EACH_OBSERVER(WebContentsObserver, observers_, TabAudible(is_audible)); |
| +} |
| + |
| +void WebContentsImpl::NotifyMutedStateChanged(bool is_muted, const std::string& cause) { |
| + FOR_EACH_OBSERVER(WebContentsObserver, observers_, TabMuted(is_muted, cause)); |
| } |
| base::TimeTicks WebContentsImpl::GetLastActiveTime() const { |