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 5331f495c576d2b562dc2a803df473f1341b9976..b34f55c9edb9e37a8349a26317f054f8e799a196 100644 |
--- a/content/browser/web_contents/web_contents_impl.cc |
+++ b/content/browser/web_contents/web_contents_impl.cc |
@@ -38,7 +38,6 @@ |
#include "content/browser/geolocation/geolocation_dispatcher_host.h" |
#include "content/browser/host_zoom_map_impl.h" |
#include "content/browser/loader/resource_dispatcher_host_impl.h" |
-#include "content/browser/media/audio_stream_monitor.h" |
#include "content/browser/media/midi_dispatcher_host.h" |
#include "content/browser/message_port_message_filter.h" |
#include "content/browser/message_port_service.h" |
@@ -377,8 +376,7 @@ WebContentsImpl::WebContentsImpl( |
force_disable_overscroll_content_(false), |
last_dialog_suppressed_(false), |
accessibility_mode_( |
- BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode()), |
- audio_stream_monitor_(this) { |
+ BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode()) { |
for (size_t i = 0; i < g_created_callbacks.Get().size(); i++) |
g_created_callbacks.Get().at(i).Run(this); |
frame_tree_.SetFrameRemoveListener( |
@@ -1011,18 +1009,6 @@ bool WebContentsImpl::IsBeingDestroyed() const { |
void WebContentsImpl::NotifyNavigationStateChanged( |
InvalidateTypes changed_flags) { |
- // 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 (delegate_) |
delegate_->NavigationStateChanged(this, changed_flags); |
} |
@@ -1056,10 +1042,6 @@ void WebContentsImpl::WasShown() { |
rvh->ResizeRectChanged(GetRootWindowResizerRect()); |
} |
- // 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; |
@@ -1082,9 +1064,6 @@ void WebContentsImpl::WasHidden() { |
if (*iter) |
(*iter)->Hide(); |
} |
- |
- // Release any video power save blockers held as video is not visible. |
- video_power_save_blocker_.reset(); |
} |
FOR_EACH_OBSERVER(WebContentsObserver, observers_, WasHidden()); |
@@ -2409,10 +2388,6 @@ void WebContentsImpl::InsertCSS(const std::string& css) { |
GetMainFrame()->GetRoutingID(), css)); |
} |
-bool WebContentsImpl::WasRecentlyAudible() { |
- return audio_stream_monitor_.WasRecentlyAudible(); |
-} |
- |
bool WebContentsImpl::FocusLocationBarByDefault() { |
NavigationEntry* entry = controller_.GetVisibleEntry(); |
if (entry && entry->GetURL() == GURL(url::kAboutBlankURL)) |
@@ -3026,70 +3001,43 @@ void WebContentsImpl::OnUpdateFaviconURL( |
DidUpdateFaviconURL(candidates)); |
} |
-void WebContentsImpl::CreateAudioPowerSaveBlocker() { |
- // ChromeOS has its own way of handling power save blocks for media. |
-#if !defined(OS_CHROMEOS) |
- DCHECK(!audio_power_save_blocker_); |
- audio_power_save_blocker_ = PowerSaveBlocker::Create( |
- PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, "Playing Audio"); |
-#endif |
-} |
- |
-void WebContentsImpl::CreateVideoPowerSaveBlocker() { |
- // ChromeOS has its own way of handling power save blocks for media. |
+void WebContentsImpl::OnMediaPlayingNotification(int64 player_cookie, |
+ bool has_video, |
+ bool has_audio) { |
#if !defined(OS_CHROMEOS) |
- DCHECK(!video_power_save_blocker_); |
- DCHECK(!active_video_players_.empty()); |
- video_power_save_blocker_ = PowerSaveBlocker::Create( |
- PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, "Playing Video"); |
+ scoped_ptr<PowerSaveBlocker> blocker; |
+ if (has_video) { |
+ blocker = PowerSaveBlocker::Create( |
+ PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, "Playing video"); |
#if defined(OS_ANDROID) |
- static_cast<PowerSaveBlockerImpl*>(video_power_save_blocker_.get()) |
- ->InitDisplaySleepBlocker(GetView()->GetNativeView()); |
-#endif |
+ static_cast<PowerSaveBlockerImpl*>(blocker.get()) |
+ ->InitDisplaySleepBlocker(GetView()->GetNativeView()); |
#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(); |
+ } else if (has_audio) { |
+ blocker = PowerSaveBlocker::Create( |
+ PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, "Playing audio"); |
} |
- // 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) { |
- 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 (blocker) { |
+ uintptr_t key = reinterpret_cast<uintptr_t>(render_frame_message_source_); |
+ if (!power_save_blockers_.contains(key)) { |
+ power_save_blockers_.add(key, |
+ make_scoped_ptr(new PowerSaveBlockerMapEntry)); |
} |
+ PowerSaveBlockerMapEntry* map_entry = |
+ power_save_blockers_.get(key); |
+ map_entry->set(player_cookie, blocker.Pass()); |
} |
- |
- 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(); |
- } |
+#endif // !defined(OS_CHROMEOS) |
} |
void WebContentsImpl::OnMediaPausedNotification(int64 player_cookie) { |
- RemoveMediaPlayerEntry(player_cookie, &active_audio_players_); |
- RemoveMediaPlayerEntry(player_cookie, &active_video_players_); |
- MaybeReleasePowerSaveBlockers(); |
+#if !defined(OS_CHROMEOS) |
+ uintptr_t key = reinterpret_cast<uintptr_t>(render_frame_message_source_); |
+ PowerSaveBlockerMapEntry* map_entry = power_save_blockers_.get(key); |
+ if (map_entry) |
+ map_entry->erase(player_cookie); |
+#endif // !defined(OS_CHROMEOS) |
} |
void WebContentsImpl::OnFirstVisuallyNonEmptyPaint() { |
@@ -3107,6 +3055,7 @@ void WebContentsImpl::NotifyBeforeFormRepostWarningShow() { |
BeforeFormRepostWarningShow()); |
} |
+ |
void WebContentsImpl::ActivateAndShowRepostFormWarningDialog() { |
Activate(); |
if (delegate_) |
@@ -4255,16 +4204,19 @@ BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const { |
void WebContentsImpl::ClearPowerSaveBlockers( |
RenderFrameHost* render_frame_host) { |
- RemoveAllMediaPlayerEntries(render_frame_host, &active_audio_players_); |
- RemoveAllMediaPlayerEntries(render_frame_host, &active_video_players_); |
- MaybeReleasePowerSaveBlockers(); |
+#if !defined(OS_CHROMEOS) |
+ uintptr_t key = reinterpret_cast<uintptr_t>(render_frame_host); |
+ scoped_ptr<PowerSaveBlockerMapEntry> map_entry = |
+ power_save_blockers_.take_and_erase(key); |
+ if (map_entry) |
+ map_entry->clear(); |
+#endif |
} |
void WebContentsImpl::ClearAllPowerSaveBlockers() { |
- active_audio_players_.clear(); |
- active_video_players_.clear(); |
- audio_power_save_blocker_.reset(); |
- video_power_save_blocker_.reset(); |
+#if !defined(OS_CHROMEOS) |
+ power_save_blockers_.clear(); |
+#endif |
} |
gfx::Size WebContentsImpl::GetSizeForNewRenderView() { |
@@ -4289,45 +4241,6 @@ void WebContentsImpl::OnPreferredSizeChanged(const gfx::Size& old_size) { |
delegate_->UpdatePreferredSize(this, new_size); |
} |
-void WebContentsImpl::AddMediaPlayerEntry(int64 player_cookie, |
- ActiveMediaPlayerMap* player_map) { |
- 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) { |
- 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); |
-} |
- |
void WebContentsImpl::ResumeResponseDeferredAtStart() { |
FrameTreeNode* node = frame_tree_.root(); |
node->render_manager()->ResumeResponseDeferredAtStart(); |