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 358754a6894b03d62c33345edbeb32d2c1b4d915..852d27c9cf34997ccb112e732af5733f673db1a9 100644 |
| --- a/content/browser/web_contents/web_contents_impl.cc |
| +++ b/content/browser/web_contents/web_contents_impl.cc |
| @@ -47,9 +47,9 @@ |
| #include "content/browser/manifest/manifest_manager_host.h" |
| #include "content/browser/media/audio_stream_monitor.h" |
| #include "content/browser/media/capture/web_contents_audio_muter.h" |
| +#include "content/browser/media/media_web_contents_observer.h" |
| #include "content/browser/message_port_message_filter.h" |
| #include "content/browser/plugin_content_origin_whitelist.h" |
| -#include "content/browser/power_save_blocker_impl.h" |
| #include "content/browser/renderer_host/render_process_host_impl.h" |
| #include "content/browser/renderer_host/render_view_host_delegate_view.h" |
| #include "content/browser/renderer_host/render_view_host_impl.h" |
| @@ -91,7 +91,6 @@ |
| #include "content/public/browser/storage_partition.h" |
| #include "content/public/browser/user_metrics.h" |
| #include "content/public/browser/web_contents_delegate.h" |
| -#include "content/public/browser/web_contents_observer.h" |
| #include "content/public/common/bindings_policy.h" |
| #include "content/public/common/browser_plugin_guest_mode.h" |
| #include "content/public/common/content_constants.h" |
| @@ -115,10 +114,6 @@ |
| #include "ui/gfx/screen.h" |
| #include "ui/gl/gl_switches.h" |
| -#if defined(ENABLE_BROWSER_CDMS) |
| -#include "content/browser/media/media_web_contents_observer.h" |
| -#endif |
| - |
| #if defined(OS_ANDROID) |
| #include "content/browser/android/content_video_view.h" |
| #include "content/browser/media/android/media_session.h" |
| @@ -413,10 +408,7 @@ WebContentsImpl::WebContentsImpl(BrowserContext* browser_context) |
| frame_tree_.SetFrameRemoveListener( |
| base::Bind(&WebContentsImpl::OnFrameRemoved, |
| base::Unretained(this))); |
| -#if defined(ENABLE_BROWSER_CDMS) |
| media_web_contents_observer_.reset(new MediaWebContentsObserver(this)); |
| -#endif |
| - |
| wake_lock_service_context_.reset(new WakeLockServiceContext(this)); |
| } |
| @@ -430,8 +422,6 @@ WebContentsImpl::~WebContentsImpl() { |
| frame_tree_.ForEach( |
| base::Bind(&RenderFrameHostManager::ClearRFHsPendingShutdown)); |
| - ClearAllPowerSaveBlockers(); |
| - |
| for (std::set<RenderWidgetHostImpl*>::iterator iter = |
| created_widgets_.begin(); iter != created_widgets_.end(); ++iter) { |
| (*iter)->DetachDelegate(); |
| @@ -630,10 +620,7 @@ bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host, |
| IPC_MESSAGE_HANDLER(FrameHostMsg_EndColorChooser, OnEndColorChooser) |
| IPC_MESSAGE_HANDLER(FrameHostMsg_SetSelectedColorInColorChooser, |
| OnSetSelectedColorInColorChooser) |
| - IPC_MESSAGE_HANDLER(FrameHostMsg_MediaPlayingNotification, |
| - OnMediaPlayingNotification) |
| - IPC_MESSAGE_HANDLER(FrameHostMsg_MediaPausedNotification, |
| - OnMediaPausedNotification) |
| + |
| IPC_MESSAGE_HANDLER(ViewHostMsg_DidFirstVisuallyNonEmptyPaint, |
| OnFirstVisuallyNonEmptyPaint) |
| IPC_MESSAGE_HANDLER(FrameHostMsg_DidLoadResourceFromMemoryCache, |
| @@ -1157,16 +1144,10 @@ void WebContentsImpl::NotifyNavigationStateChanged( |
| tracked_objects::ScopedTracker tracking_profile( |
| FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| "466285 WebContentsImpl::NotifyNavigationStateChanged")); |
| - // 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(); |
| - } |
| + // Notify the media observer of potential audibility changes. |
| + if (changed_flags & INVALIDATE_TYPE_TAB) { |
| + media_web_contents_observer_->MaybeUpdateAudibleState( |
| + AudioStreamMonitor::monitoring_available() && WasRecentlyAudible()); |
| } |
| if (delegate_) |
| @@ -1203,10 +1184,6 @@ void WebContentsImpl::WasShown() { |
| GetRootWindowResizerRect(rvh->GetWidget())); |
| } |
| - // Restore power save blocker if there are active video players running. |
| - if (!active_video_players_.empty() && !video_power_save_blocker_) |
| - CreateVideoPowerSaveBlocker(); |
| - |
| FOR_EACH_OBSERVER(WebContentsObserver, observers_, WasShown()); |
| should_normally_be_visible_ = true; |
| @@ -1226,9 +1203,6 @@ void WebContentsImpl::WasHidden() { |
| if (view) |
| view->Hide(); |
| } |
| - |
| - // Release any video power save blockers held as video is not visible. |
| - video_power_save_blocker_.reset(); |
| } |
| FOR_EACH_OBSERVER(WebContentsObserver, observers_, WasHidden()); |
| @@ -3448,78 +3422,6 @@ void WebContentsImpl::OnUpdateFaviconURL( |
| DidUpdateFaviconURL(candidates)); |
| } |
| -void WebContentsImpl::CreateAudioPowerSaveBlocker() { |
| - DCHECK(!audio_power_save_blocker_); |
| - audio_power_save_blocker_ = PowerSaveBlocker::Create( |
| - PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, |
| - PowerSaveBlocker::kReasonAudioPlayback, "Playing audio"); |
| -} |
| - |
| -void WebContentsImpl::CreateVideoPowerSaveBlocker() { |
| - DCHECK(!video_power_save_blocker_); |
| - DCHECK(!active_video_players_.empty()); |
| - video_power_save_blocker_ = PowerSaveBlocker::Create( |
| - PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, |
| - PowerSaveBlocker::kReasonVideoPlayback, "Playing video"); |
| - //TODO(mfomitchev): Support PowerSaveBlocker on Aura - crbug.com/546718. |
| -#if defined(OS_ANDROID) && !defined(USE_AURA) |
| -static_cast<PowerSaveBlockerImpl*>(video_power_save_blocker_.get()) |
| - ->InitDisplaySleepBlocker(this); |
| -#endif |
| -} |
| - |
| -void WebContentsImpl::MaybeReleasePowerSaveBlockers() { |
| - // If there are no more audio players and we don't have audio stream |
| - // monitoring, release the audio power save blocker here instead of during |
| - // NotifyNavigationStateChanged(). |
| - if (active_audio_players_.empty() && |
| - !AudioStreamMonitor::monitoring_available()) { |
| - audio_power_save_blocker_.reset(); |
| - } |
| - |
| - // If there are no more video players, clear the video power save blocker. |
| - if (active_video_players_.empty()) |
| - video_power_save_blocker_.reset(); |
| -} |
| - |
| -void WebContentsImpl::OnMediaPlayingNotification(int64 player_cookie, |
| - bool has_video, |
| - bool has_audio, |
| - bool is_remote) { |
| - // Ignore the videos playing remotely and don't hold the wake lock for the |
| - // screen. |
| - if (is_remote) return; |
| - |
| - if (has_audio) { |
| - AddMediaPlayerEntry(player_cookie, &active_audio_players_); |
| - |
| - // If we don't have audio stream monitoring, allocate the audio power save |
| - // blocker here instead of during NotifyNavigationStateChanged(). |
| - if (!audio_power_save_blocker_ && |
| - !AudioStreamMonitor::monitoring_available()) { |
| - CreateAudioPowerSaveBlocker(); |
| - } |
| - } |
| - |
| - if (has_video) { |
| - AddMediaPlayerEntry(player_cookie, &active_video_players_); |
| - |
| - // If we're not hidden and have just created a player, create a blocker. |
| - if (!video_power_save_blocker_ && !IsHidden()) |
| - CreateVideoPowerSaveBlocker(); |
| - } |
| - |
| - FOR_EACH_OBSERVER(WebContentsObserver, observers_, MediaStartedPlaying()); |
| -} |
| - |
| -void WebContentsImpl::OnMediaPausedNotification(int64 player_cookie) { |
| - RemoveMediaPlayerEntry(player_cookie, &active_audio_players_); |
| - RemoveMediaPlayerEntry(player_cookie, &active_video_players_); |
| - MaybeReleasePowerSaveBlockers(); |
| - |
| - FOR_EACH_OBSERVER(WebContentsObserver, observers_, MediaPaused()); |
| -} |
| - |
| #if defined(OS_ANDROID) |
| void WebContentsImpl::OnMediaSessionStateChanged() { |
| @@ -3754,7 +3656,6 @@ void WebContentsImpl::RenderFrameCreated(RenderFrameHost* render_frame_host) { |
| } |
| void WebContentsImpl::RenderFrameDeleted(RenderFrameHost* render_frame_host) { |
| - ClearPowerSaveBlockers(render_frame_host); |
| FOR_EACH_OBSERVER(WebContentsObserver, |
| observers_, |
| RenderFrameDeleted(render_frame_host)); |
| @@ -4711,20 +4612,6 @@ void WebContentsImpl::CreateBrowserPluginEmbedderIfNecessary() { |
| browser_plugin_embedder_.reset(BrowserPluginEmbedder::Create(this)); |
| } |
| -void WebContentsImpl::ClearPowerSaveBlockers( |
| - RenderFrameHost* render_frame_host) { |
| - RemoveAllMediaPlayerEntries(render_frame_host, &active_audio_players_); |
| - RemoveAllMediaPlayerEntries(render_frame_host, &active_video_players_); |
| - MaybeReleasePowerSaveBlockers(); |
| -} |
| - |
| -void WebContentsImpl::ClearAllPowerSaveBlockers() { |
| - active_audio_players_.clear(); |
| - active_video_players_.clear(); |
| - audio_power_save_blocker_.reset(); |
| - video_power_save_blocker_.reset(); |
| -} |
| - |
| gfx::Size WebContentsImpl::GetSizeForNewRenderView() { |
| gfx::Size size; |
| if (delegate_) |
| @@ -4747,51 +4634,6 @@ void WebContentsImpl::OnPreferredSizeChanged(const gfx::Size& old_size) { |
| delegate_->UpdatePreferredSize(this, new_size); |
| } |
| -void WebContentsImpl::AddMediaPlayerEntry(int64 player_cookie, |
| - ActiveMediaPlayerMap* player_map) { |
| - if (!HasValidFrameSource()) |
| - return; |
| - |
| - const uintptr_t key = |
| - reinterpret_cast<uintptr_t>(render_frame_message_source_); |
| - DCHECK(std::find((*player_map)[key].begin(), |
| - (*player_map)[key].end(), |
| - player_cookie) == (*player_map)[key].end()); |
| - (*player_map)[key].push_back(player_cookie); |
| -} |
| - |
| -void WebContentsImpl::RemoveMediaPlayerEntry(int64 player_cookie, |
| - ActiveMediaPlayerMap* player_map) { |
| - if (!HasValidFrameSource()) |
| - return; |
| - |
| - const uintptr_t key = |
| - reinterpret_cast<uintptr_t>(render_frame_message_source_); |
| - ActiveMediaPlayerMap::iterator it = player_map->find(key); |
| - if (it == player_map->end()) |
| - return; |
| - |
| - // Remove the player. |
| - PlayerList::iterator player_it = |
| - std::find(it->second.begin(), it->second.end(), player_cookie); |
| - if (player_it != it->second.end()) |
| - it->second.erase(player_it); |
| - |
| - // If there are no players left, remove the map entry. |
| - if (it->second.empty()) |
| - player_map->erase(it); |
| -} |
| - |
| -void WebContentsImpl::RemoveAllMediaPlayerEntries( |
| - RenderFrameHost* render_frame_host, |
| - ActiveMediaPlayerMap* player_map) { |
| - ActiveMediaPlayerMap::iterator it = |
| - player_map->find(reinterpret_cast<uintptr_t>(render_frame_host)); |
| - if (it == player_map->end()) |
| - return; |
| - player_map->erase(it); |
| -} |
| - |
| WebUI* WebContentsImpl::CreateWebUI(const GURL& url, |
| const std::string& frame_name) { |
| WebUIImpl* web_ui = new WebUIImpl(this, frame_name); |
| @@ -4813,4 +4655,14 @@ void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) { |
| view_->SetOverscrollControllerEnabled(CanOverscrollContent()); |
| } |
| +void WebContentsImpl::MediaStartedPlaying( |
| + const WebContentsObserver::MediaPlayerId& id) { |
| + FOR_EACH_OBSERVER(WebContentsObserver, observers_, MediaStartedPlaying(id)); |
|
ncarter (slow)
2015/12/02 17:49:31
This FOR_EACH_OBSERVER will happen in the context
DaleCurtis
2015/12/02 19:55:46
Correct, which is also the existing behavior.
|
| +} |
| + |
| +void WebContentsImpl::MediaPaused( |
| + const WebContentsObserver::MediaPlayerId& id) { |
| + FOR_EACH_OBSERVER(WebContentsObserver, observers_, MediaPaused(id)); |
| +} |
| + |
| } // namespace content |