Index: content/public/android/javatests/src/org/chromium/content/browser/MediaSessionTest.java |
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/MediaSessionTest.java b/content/public/android/javatests/src/org/chromium/content/browser/MediaSessionTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9a9576dd800af4468465e07a09deb02110fdd898 |
--- /dev/null |
+++ b/content/public/android/javatests/src/org/chromium/content/browser/MediaSessionTest.java |
@@ -0,0 +1,371 @@ |
+// Copyright 2015 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. |
+ |
+package org.chromium.content.browser; |
+ |
+import android.content.Context; |
+import android.media.AudioManager; |
+import android.test.suitebuilder.annotation.MediumTest; |
+import android.test.suitebuilder.annotation.SmallTest; |
+ |
+import org.chromium.base.test.util.CommandLineFlags; |
+import org.chromium.base.test.util.Feature; |
+import org.chromium.content.browser.test.util.Criteria; |
+import org.chromium.content.browser.test.util.CriteriaHelper; |
+import org.chromium.content.browser.test.util.DOMUtils; |
+import org.chromium.content.common.ContentSwitches; |
+import org.chromium.content_shell_apk.ContentShellTestBase; |
+ |
+/** |
+ * Tests for MediaSession. |
+ */ |
+@CommandLineFlags.Add(ContentSwitches.DISABLE_GESTURE_REQUIREMENT_FOR_MEDIA_PLAYBACK) |
+public class MediaSessionTest extends ContentShellTestBase { |
+ private static final String MEDIA_SESSION_TEST_URL = |
+ "content/test/data/android/media/media-session.html"; |
+ private static final String VERY_SHORT_AUDIO = "very-short-audio"; |
+ private static final String SHORT_AUDIO = "short-audio"; |
+ private static final String LONG_AUDIO = "long-audio"; |
+ private static final String VERY_SHORT_VIDEO = "very-short-video"; |
+ private static final String SHORT_VIDEO = "short-video"; |
+ private static final String LONG_VIDEO = "long-video"; |
+ |
+ private AudioManager getAudioManager() { |
+ return (AudioManager) getActivity().getApplicationContext().getSystemService( |
+ Context.AUDIO_SERVICE); |
+ } |
+ |
+ private class MockAudioFocusChangeListener implements AudioManager.OnAudioFocusChangeListener { |
+ private int mAudioFocusState = AudioManager.AUDIOFOCUS_LOSS; |
+ |
+ @Override |
+ public void onAudioFocusChange(int focusChange) { |
+ mAudioFocusState = focusChange; |
+ } |
+ |
+ public int getAudioFocusState() { |
+ return mAudioFocusState; |
+ } |
+ |
+ public void requestAudioFocus(int focusType) throws Exception { |
+ int result = getAudioManager().requestAudioFocus( |
+ this, AudioManager.STREAM_MUSIC, focusType); |
+ if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { |
+ fail("Did not get audio focus"); |
+ } else { |
+ mAudioFocusState = focusType; |
+ } |
+ } |
+ |
+ public void abandonAudioFocus() { |
+ getAudioManager().abandonAudioFocus(this); |
+ mAudioFocusState = AudioManager.AUDIOFOCUS_LOSS; |
+ } |
+ |
+ public boolean waitForFocusStateChange(final int focusType) throws InterruptedException { |
+ return CriteriaHelper.pollForCriteria(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ return getAudioFocusState() == focusType; |
+ } |
+ }); |
+ } |
+ } |
+ |
+ private MockAudioFocusChangeListener mAudioFocusChangeListener; |
+ |
+ @Override |
+ public void setUp() throws Exception { |
+ super.setUp(); |
+ |
+ try { |
+ startActivityWithTestUrl(MEDIA_SESSION_TEST_URL); |
+ } catch (Throwable t) { |
+ fail("Couldn't load test page"); |
+ } |
+ |
+ mAudioFocusChangeListener = new MockAudioFocusChangeListener(); |
+ } |
+ |
+ @Override |
+ public void tearDown() throws Exception { |
+ mAudioFocusChangeListener.abandonAudioFocus(); |
+ |
+ super.tearDown(); |
+ } |
+ |
+ @SmallTest |
+ @Feature({"MediaSession"}) |
+ public void testDontStopEachOther() throws Exception { |
+ assertTrue(DOMUtils.isMediaPaused(getWebContents(), LONG_AUDIO)); |
+ DOMUtils.playMedia(getWebContents(), LONG_AUDIO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
+ |
+ assertTrue(DOMUtils.isMediaPaused(getWebContents(), LONG_VIDEO)); |
+ DOMUtils.playMedia(getWebContents(), LONG_VIDEO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
+ |
+ assertTrue(DOMUtils.isMediaPaused(getWebContents(), SHORT_VIDEO)); |
+ DOMUtils.playMedia(getWebContents(), SHORT_VIDEO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), SHORT_VIDEO)); |
+ |
+ assertTrue(DOMUtils.isMediaPaused(getWebContents(), SHORT_AUDIO)); |
+ DOMUtils.playMedia(getWebContents(), SHORT_AUDIO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), SHORT_AUDIO)); |
+ |
+ assertFalse(DOMUtils.isMediaPaused(getWebContents(), SHORT_AUDIO)); |
+ assertFalse(DOMUtils.isMediaPaused(getWebContents(), LONG_AUDIO)); |
+ assertFalse(DOMUtils.isMediaPaused(getWebContents(), SHORT_VIDEO)); |
+ assertFalse(DOMUtils.isMediaPaused(getWebContents(), LONG_VIDEO)); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"MediaSession"}) |
+ public void testShortAudioIsTransient() throws Exception { |
+ assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.getAudioFocusState()); |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ DOMUtils.playMedia(getWebContents(), VERY_SHORT_AUDIO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), VERY_SHORT_AUDIO)); |
+ |
+ assertTrue(mAudioFocusChangeListener.waitForFocusStateChange( |
+ AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK)); |
+ assertTrue(mAudioFocusChangeListener.waitForFocusStateChange(AudioManager.AUDIOFOCUS_GAIN)); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"MediaSession"}) |
+ public void testShortVideoIsTransient() throws Exception { |
+ assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.getAudioFocusState()); |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ DOMUtils.playMedia(getWebContents(), VERY_SHORT_VIDEO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), VERY_SHORT_VIDEO)); |
+ |
+ assertTrue(mAudioFocusChangeListener.waitForFocusStateChange( |
+ AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK)); |
+ assertTrue(mAudioFocusChangeListener.waitForFocusStateChange(AudioManager.AUDIOFOCUS_GAIN)); |
+ } |
+ |
+ @SmallTest |
+ @Feature({"MediaSession"}) |
+ public void testAudioGainFocus() throws Exception { |
+ assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.getAudioFocusState()); |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ DOMUtils.playMedia(getWebContents(), LONG_AUDIO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
+ |
+ assertTrue(mAudioFocusChangeListener.waitForFocusStateChange(AudioManager.AUDIOFOCUS_LOSS)); |
+ } |
+ |
+ @SmallTest |
+ @Feature({"MediaSession"}) |
+ public void testVideoGainFocus() throws Exception { |
+ assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.getAudioFocusState()); |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ DOMUtils.playMedia(getWebContents(), LONG_VIDEO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
+ |
+ assertTrue(mAudioFocusChangeListener.waitForFocusStateChange(AudioManager.AUDIOFOCUS_LOSS)); |
+ } |
+ |
+ @SmallTest |
+ @Feature({"MediaSession"}) |
+ public void testLongAudioAfterShortGainsFocus() throws Exception { |
+ assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.getAudioFocusState()); |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ DOMUtils.playMedia(getWebContents(), SHORT_AUDIO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), SHORT_AUDIO)); |
+ assertTrue(mAudioFocusChangeListener.waitForFocusStateChange( |
+ AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK)); |
+ |
+ DOMUtils.playMedia(getWebContents(), LONG_AUDIO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
+ assertTrue(mAudioFocusChangeListener.waitForFocusStateChange(AudioManager.AUDIOFOCUS_LOSS)); |
+ } |
+ |
+ @SmallTest |
+ @Feature({"MediaSession"}) |
+ public void testLongVideoAfterShortGainsFocus() throws Exception { |
+ assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.getAudioFocusState()); |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ DOMUtils.playMedia(getWebContents(), SHORT_VIDEO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), SHORT_VIDEO)); |
+ assertTrue(mAudioFocusChangeListener.waitForFocusStateChange( |
+ AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK)); |
+ |
+ DOMUtils.playMedia(getWebContents(), LONG_VIDEO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
+ assertTrue(mAudioFocusChangeListener.waitForFocusStateChange(AudioManager.AUDIOFOCUS_LOSS)); |
+ } |
+ |
+ @SmallTest |
+ @Feature({"MediaSession"}) |
+ public void testShortAudioStopsIfLostFocus() throws Exception { |
+ assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.getAudioFocusState()); |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ DOMUtils.playMedia(getWebContents(), SHORT_AUDIO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), SHORT_AUDIO)); |
+ |
+ // Wait for the media to be really playing. |
+ assertTrue(mAudioFocusChangeListener.waitForFocusStateChange( |
+ AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK)); |
+ |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ assertTrue(DOMUtils.waitForMediaPause(getWebContents(), SHORT_AUDIO)); |
+ } |
+ |
+ @SmallTest |
+ @Feature({"MediaSession"}) |
+ public void testShortVideoStopsIfLostFocus() throws Exception { |
+ assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.getAudioFocusState()); |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ DOMUtils.playMedia(getWebContents(), SHORT_VIDEO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), SHORT_VIDEO)); |
+ |
+ // Wait for the media to be really playing. |
+ assertTrue(mAudioFocusChangeListener.waitForFocusStateChange( |
+ AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK)); |
+ |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ assertTrue(DOMUtils.waitForMediaPause(getWebContents(), SHORT_VIDEO)); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"MediaSession"}) |
+ public void testAudioStopsIfLostFocus() throws Exception { |
+ assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.getAudioFocusState()); |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ DOMUtils.playMedia(getWebContents(), LONG_AUDIO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
+ |
+ // Wait for the media to be really playing. |
+ assertTrue(mAudioFocusChangeListener.waitForFocusStateChange(AudioManager.AUDIOFOCUS_LOSS)); |
+ |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ assertTrue(DOMUtils.waitForMediaPause(getWebContents(), LONG_AUDIO)); |
+ } |
+ |
+ @SmallTest |
+ @Feature({"MediaSession"}) |
+ public void testVideoStopsIfLostFocus() throws Exception { |
+ assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.getAudioFocusState()); |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ DOMUtils.playMedia(getWebContents(), LONG_VIDEO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
+ |
+ // Wait for the media to be really playing. |
+ assertTrue(mAudioFocusChangeListener.waitForFocusStateChange(AudioManager.AUDIOFOCUS_LOSS)); |
+ |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ assertTrue(DOMUtils.waitForMediaPause(getWebContents(), LONG_VIDEO)); |
+ } |
+ |
+ @SmallTest |
+ @Feature({"MediaSession"}) |
+ public void testMediaDontDuck() throws Exception { |
+ assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.getAudioFocusState()); |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ DOMUtils.playMedia(getWebContents(), LONG_AUDIO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
+ DOMUtils.playMedia(getWebContents(), LONG_VIDEO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
+ |
+ // Wait for the media to be really playing. |
+ assertTrue(mAudioFocusChangeListener.waitForFocusStateChange(AudioManager.AUDIOFOCUS_LOSS)); |
+ |
+ mAudioFocusChangeListener.requestAudioFocus( |
+ AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, |
+ mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ assertTrue(DOMUtils.waitForMediaPause(getWebContents(), LONG_AUDIO)); |
+ assertTrue(DOMUtils.waitForMediaPause(getWebContents(), LONG_VIDEO)); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"MediaSession"}) |
+ public void testMediaResumeAfterTransientMayDuckFocusLoss() throws Exception { |
+ assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.getAudioFocusState()); |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ DOMUtils.playMedia(getWebContents(), LONG_AUDIO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
+ DOMUtils.playMedia(getWebContents(), LONG_VIDEO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
+ |
+ // Wait for the media to be really playing. |
+ assertTrue(mAudioFocusChangeListener.waitForFocusStateChange(AudioManager.AUDIOFOCUS_LOSS)); |
+ |
+ mAudioFocusChangeListener.requestAudioFocus( |
+ AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, |
+ mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ assertTrue(DOMUtils.waitForMediaPause(getWebContents(), LONG_AUDIO)); |
+ assertTrue(DOMUtils.waitForMediaPause(getWebContents(), LONG_VIDEO)); |
+ |
+ mAudioFocusChangeListener.abandonAudioFocus(); |
+ |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"MediaSession"}) |
+ public void testMediaResumeAfterTransientFocusLoss() throws Exception { |
+ assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.getAudioFocusState()); |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ DOMUtils.playMedia(getWebContents(), LONG_AUDIO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
+ DOMUtils.playMedia(getWebContents(), LONG_VIDEO); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
+ |
+ // Wait for the media to be really playing. |
+ assertTrue(mAudioFocusChangeListener.waitForFocusStateChange(AudioManager.AUDIOFOCUS_LOSS)); |
+ |
+ mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); |
+ assertEquals(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT, |
+ mAudioFocusChangeListener.getAudioFocusState()); |
+ |
+ assertTrue(DOMUtils.waitForMediaPause(getWebContents(), LONG_AUDIO)); |
+ assertTrue(DOMUtils.waitForMediaPause(getWebContents(), LONG_VIDEO)); |
+ |
+ mAudioFocusChangeListener.abandonAudioFocus(); |
+ |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
+ assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
+ } |
+} |