Index: content/browser/media/session/media_session_browsertest.cc |
diff --git a/content/browser/media/session/media_session_browsertest.cc b/content/browser/media/session/media_session_browsertest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c33254eaf38693198b5dab47b20339b118214221 |
--- /dev/null |
+++ b/content/browser/media/session/media_session_browsertest.cc |
@@ -0,0 +1,216 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/public/browser/media_session.h" |
+ |
+#include "base/command_line.h" |
+#include "base/run_loop.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "content/public/browser/render_frame_host.h" |
+#include "content/public/browser/web_contents.h" |
+#include "content/public/browser/web_contents_observer.h" |
+#include "content/public/test/browser_test_utils.h" |
+#include "content/public/test/content_browser_test.h" |
+#include "content/public/test/content_browser_test_utils.h" |
+#include "content/shell/browser/shell.h" |
+#include "media/base/media_switches.h" |
+ |
+namespace content { |
+ |
+namespace { |
+ |
+// Integration tests for content::MediaSession that do not take into |
+// consideration the implementation details contrary to |
+// MediaSessionImplBrowserTest. |
+class MediaSessionBrowserTest : public ContentBrowserTest { |
+ public: |
+ MediaSessionBrowserTest() = default; |
+ |
+ void SetUpCommandLine(base::CommandLine* command_line) override { |
+ command_line->AppendSwitch(switches::kIgnoreAutoplayRestrictionsForTests); |
+ } |
+ |
+ void EnableInternalMediaSesion() { |
+#if !defined(OS_ANDROID) |
+ base::CommandLine::ForCurrentProcess()->AppendSwitch( |
+ switches::kEnableInternalMediaSession); |
+#endif // !defined(OS_ANDROID) |
+ } |
+ |
+ void StartPlaybackAndWait(Shell* shell, const std::string& id) { |
+ shell->web_contents()->GetMainFrame()->ExecuteJavaScriptForTests( |
+ base::ASCIIToUTF16("document.querySelector('#" + id + "').play();")); |
+ WaitForStart(shell); |
+ } |
+ |
+ void StopPlaybackAndWait(Shell* shell, const std::string& id) { |
+ shell->web_contents()->GetMainFrame()->ExecuteJavaScriptForTests( |
+ base::ASCIIToUTF16("document.querySelector('#" + id + "').pause();")); |
+ WaitForStop(shell); |
+ } |
+ |
+ void WaitForStart(Shell* shell) { |
+ MediaStartStopObserver observer(shell->web_contents(), |
+ MediaStartStopObserver::Type::kStart); |
+ observer.Wait(); |
+ } |
+ |
+ void WaitForStop(Shell* shell) { |
+ MediaStartStopObserver observer(shell->web_contents(), |
+ MediaStartStopObserver::Type::kStop); |
+ observer.Wait(); |
+ } |
+ |
+ bool IsPlaying(Shell* shell, const std::string& id) { |
+ bool result; |
+ EXPECT_TRUE( |
+ ExecuteScriptAndExtractBool(shell->web_contents(), |
+ "window.domAutomationController.send(" |
+ "!document.querySelector('#" + |
+ id + "').paused);", |
+ &result)); |
+ return result; |
+ } |
+ |
+ private: |
+ class MediaStartStopObserver : public WebContentsObserver { |
+ public: |
+ enum class Type { kStart, kStop }; |
+ |
+ MediaStartStopObserver(WebContents* web_contents, Type type) |
+ : WebContentsObserver(web_contents), type_(type) {} |
+ |
+ void MediaStartedPlaying(const MediaPlayerInfo& info, |
+ const MediaPlayerId& id) override { |
+ if (type_ != Type::kStart) |
+ return; |
+ |
+ run_loop_.Quit(); |
+ } |
+ |
+ void MediaStoppedPlaying(const MediaPlayerInfo& info, |
+ const MediaPlayerId& id) override { |
+ if (type_ != Type::kStop) |
+ return; |
+ |
+ run_loop_.Quit(); |
+ } |
+ |
+ void Wait() { run_loop_.Run(); } |
+ |
+ private: |
+ base::RunLoop run_loop_; |
+ Type type_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MediaStartStopObserver); |
+ }; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MediaSessionBrowserTest); |
+}; |
+ |
+} // anonymous namespace |
+ |
+#if !defined(OS_ANDROID) |
+// The feature can't be disabled on Android. |
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, MediaSessionNoOpWhenDisabled) { |
+ NavigateToURL(shell(), GetTestUrl("media/session", "media-session.html")); |
+ |
+ MediaSession* media_session = MediaSession::Get(shell()->web_contents()); |
+ ASSERT_NE(nullptr, media_session); |
+ |
+ StartPlaybackAndWait(shell(), "long-video"); |
+ StartPlaybackAndWait(shell(), "long-audio"); |
+ |
+ media_session->Suspend(MediaSession::SuspendType::SYSTEM); |
+ StopPlaybackAndWait(shell(), "long-audio"); |
+ |
+ // At that point, only "long-audio" is paused. |
+ EXPECT_FALSE(IsPlaying(shell(), "long-audio")); |
+ EXPECT_TRUE(IsPlaying(shell(), "long-video")); |
+} |
+#endif // !defined(OS_ANDROID) |
+ |
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, SimplePlayPause) { |
+ EnableInternalMediaSesion(); |
+ |
+ NavigateToURL(shell(), GetTestUrl("media/session", "media-session.html")); |
+ |
+ MediaSession* media_session = MediaSession::Get(shell()->web_contents()); |
+ ASSERT_NE(nullptr, media_session); |
+ |
+ StartPlaybackAndWait(shell(), "long-video"); |
+ |
+ media_session->Suspend(MediaSession::SuspendType::SYSTEM); |
+ WaitForStop(shell()); |
+ EXPECT_FALSE(IsPlaying(shell(), "long-video")); |
+ |
+ media_session->Resume(MediaSession::SuspendType::SYSTEM); |
+ WaitForStart(shell()); |
+ EXPECT_TRUE(IsPlaying(shell(), "long-video")); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, MultiplePlayersPlayPause) { |
+ EnableInternalMediaSesion(); |
+ |
+ NavigateToURL(shell(), GetTestUrl("media/session", "media-session.html")); |
+ |
+ MediaSession* media_session = MediaSession::Get(shell()->web_contents()); |
+ ASSERT_NE(nullptr, media_session); |
+ |
+ StartPlaybackAndWait(shell(), "long-video"); |
+ StartPlaybackAndWait(shell(), "long-audio"); |
+ |
+ media_session->Suspend(MediaSession::SuspendType::SYSTEM); |
+ WaitForStop(shell()); |
+ EXPECT_FALSE(IsPlaying(shell(), "long-video")); |
+ EXPECT_FALSE(IsPlaying(shell(), "long-audio")); |
+ |
+ media_session->Resume(MediaSession::SuspendType::SYSTEM); |
+ WaitForStart(shell()); |
+ EXPECT_TRUE(IsPlaying(shell(), "long-video")); |
+ EXPECT_TRUE(IsPlaying(shell(), "long-audio")); |
+} |
+ |
+#if !defined(OS_ANDROID) |
+// On Android, System Audio Focus would break this test. |
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, MultipleTabsPlayPause) { |
+ EnableInternalMediaSesion(); |
+ |
+ Shell* other_shell = CreateBrowser(); |
+ |
+ NavigateToURL(shell(), GetTestUrl("media/session", "media-session.html")); |
+ NavigateToURL(other_shell, GetTestUrl("media/session", "media-session.html")); |
+ |
+ MediaSession* media_session = MediaSession::Get(shell()->web_contents()); |
+ MediaSession* other_media_session = |
+ MediaSession::Get(other_shell->web_contents()); |
+ ASSERT_NE(nullptr, media_session); |
+ ASSERT_NE(nullptr, other_media_session); |
+ |
+ StartPlaybackAndWait(shell(), "long-video"); |
+ StartPlaybackAndWait(other_shell, "long-video"); |
+ |
+ media_session->Suspend(MediaSession::SuspendType::SYSTEM); |
+ WaitForStop(shell()); |
+ EXPECT_FALSE(IsPlaying(shell(), "long-video")); |
+ EXPECT_TRUE(IsPlaying(other_shell, "long-video")); |
+ |
+ other_media_session->Suspend(MediaSession::SuspendType::SYSTEM); |
+ WaitForStop(other_shell); |
+ EXPECT_FALSE(IsPlaying(shell(), "long-video")); |
+ EXPECT_FALSE(IsPlaying(other_shell, "long-video")); |
+ |
+ media_session->Resume(MediaSession::SuspendType::SYSTEM); |
+ WaitForStart(shell()); |
+ EXPECT_TRUE(IsPlaying(shell(), "long-video")); |
+ EXPECT_FALSE(IsPlaying(other_shell, "long-video")); |
+ |
+ other_media_session->Resume(MediaSession::SuspendType::SYSTEM); |
+ WaitForStart(other_shell); |
+ EXPECT_TRUE(IsPlaying(shell(), "long-video")); |
+ EXPECT_TRUE(IsPlaying(other_shell, "long-video")); |
+} |
+#endif // defined(OS_ANDROID) |
+ |
+} // namespace content |