Index: content/browser/web_contents/web_contents_impl_unittest.cc |
diff --git a/content/browser/web_contents/web_contents_impl_unittest.cc b/content/browser/web_contents/web_contents_impl_unittest.cc |
index e2ef0e578ae3c1c8ea288b508e7229fdf1343233..f34a093c3ae5f0032b29ccca99e72486c2c59eb6 100644 |
--- a/content/browser/web_contents/web_contents_impl_unittest.cc |
+++ b/content/browser/web_contents/web_contents_impl_unittest.cc |
@@ -7,6 +7,7 @@ |
#include "content/browser/frame_host/cross_site_transferring_request.h" |
#include "content/browser/frame_host/interstitial_page_impl.h" |
#include "content/browser/frame_host/navigation_entry_impl.h" |
+#include "content/browser/media/audio_stream_monitor.h" |
#include "content/browser/renderer_host/render_view_host_impl.h" |
#include "content/browser/site_instance_impl.h" |
#include "content/browser/webui/web_ui_controller_factory_registry.h" |
@@ -2685,4 +2686,91 @@ |
EXPECT_EQ(0u, instance_webui->GetRelatedActiveContentsCount()); |
} |
+// ChromeOS doesn't use WebContents based power save blocking. |
+#if !defined(OS_CHROMEOS) |
+TEST_F(WebContentsImplTest, MediaPowerSaveBlocking) { |
+ // PlayerIDs are actually pointers cast to int64, so verify that both negative |
+ // and positive player ids don't blow up. |
+ const int kPlayerAudioVideoId = 15; |
+ const int kPlayerAudioOnlyId = -15; |
+ const int kPlayerVideoOnlyId = 30; |
+ |
+ EXPECT_FALSE(contents()->has_audio_power_save_blocker_for_testing()); |
+ EXPECT_FALSE(contents()->has_video_power_save_blocker_for_testing()); |
+ |
+ TestRenderFrameHost* rfh = contents()->GetMainFrame(); |
+ AudioStreamMonitor* monitor = contents()->audio_stream_monitor(); |
+ |
+ // The audio power save blocker should not be based on having a media player |
+ // when audio stream monitoring is available. |
+ if (AudioStreamMonitor::monitoring_available()) { |
+ // Send a fake audio stream monitor notification. The audio power save |
+ // blocker should be created. |
+ monitor->set_was_recently_audible_for_testing(true); |
+ contents()->NotifyNavigationStateChanged(INVALIDATE_TYPE_TAB); |
+ EXPECT_TRUE(contents()->has_audio_power_save_blocker_for_testing()); |
+ |
+ // Send another fake notification, this time when WasRecentlyAudible() will |
+ // be false. The power save blocker should be released. |
+ monitor->set_was_recently_audible_for_testing(false); |
+ contents()->NotifyNavigationStateChanged(INVALIDATE_TYPE_TAB); |
+ EXPECT_FALSE(contents()->has_audio_power_save_blocker_for_testing()); |
+ } |
+ |
+ // Start a player with both audio and video. A video power save blocker |
+ // should be created. If audio stream monitoring is available, an audio power |
+ // save blocker should be created too. |
+ rfh->OnMessageReceived(FrameHostMsg_MediaPlayingNotification( |
+ 0, kPlayerAudioVideoId, true, true)); |
+ EXPECT_TRUE(contents()->has_video_power_save_blocker_for_testing()); |
+ EXPECT_EQ(contents()->has_audio_power_save_blocker_for_testing(), |
+ !AudioStreamMonitor::monitoring_available()); |
+ |
+ // Upon hiding the video power save blocker should be released. |
+ contents()->WasHidden(); |
+ EXPECT_FALSE(contents()->has_video_power_save_blocker_for_testing()); |
+ |
+ // Start another player that only has video. There should be no change in |
+ // the power save blockers. The notification should take into account the |
+ // visibility state of the WebContents. |
+ rfh->OnMessageReceived(FrameHostMsg_MediaPlayingNotification( |
+ 0, kPlayerVideoOnlyId, true, false)); |
+ EXPECT_FALSE(contents()->has_video_power_save_blocker_for_testing()); |
+ EXPECT_EQ(contents()->has_audio_power_save_blocker_for_testing(), |
+ !AudioStreamMonitor::monitoring_available()); |
+ |
+ // Showing the WebContents should result in the creation of the blocker. |
+ contents()->WasShown(); |
+ EXPECT_TRUE(contents()->has_video_power_save_blocker_for_testing()); |
+ |
+ // Start another player that only has audio. There should be no change in |
+ // the power save blockers. |
+ rfh->OnMessageReceived(FrameHostMsg_MediaPlayingNotification( |
+ 0, kPlayerAudioOnlyId, false, true)); |
+ EXPECT_TRUE(contents()->has_video_power_save_blocker_for_testing()); |
+ EXPECT_EQ(contents()->has_audio_power_save_blocker_for_testing(), |
+ !AudioStreamMonitor::monitoring_available()); |
+ |
+ // Destroy the original audio video player. Both power save blockers should |
+ // remain. |
+ rfh->OnMessageReceived( |
+ FrameHostMsg_MediaPausedNotification(0, kPlayerAudioVideoId)); |
+ EXPECT_TRUE(contents()->has_video_power_save_blocker_for_testing()); |
+ EXPECT_EQ(contents()->has_audio_power_save_blocker_for_testing(), |
+ !AudioStreamMonitor::monitoring_available()); |
+ |
+ // Destroy the audio only player. The video power save blocker should remain. |
+ rfh->OnMessageReceived( |
+ FrameHostMsg_MediaPausedNotification(0, kPlayerAudioOnlyId)); |
+ EXPECT_TRUE(contents()->has_video_power_save_blocker_for_testing()); |
+ EXPECT_FALSE(contents()->has_audio_power_save_blocker_for_testing()); |
+ |
+ // Destroy the video only player. No power save blockers should remain. |
+ rfh->OnMessageReceived( |
+ FrameHostMsg_MediaPausedNotification(0, kPlayerVideoOnlyId)); |
+ EXPECT_FALSE(contents()->has_video_power_save_blocker_for_testing()); |
+ EXPECT_FALSE(contents()->has_audio_power_save_blocker_for_testing()); |
+} |
+#endif |
+ |
} // namespace content |