Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2565)

Unified Diff: android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientFullScreenTest.java

Issue 639413002: [aw] Reuse WebContents PowerSaveBlocker in fullscreen. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@testsForPowerSaver
Patch Set: Nits Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientFullScreenTest.java
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientFullScreenTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientFullScreenTest.java
index 3d3f6af0fa303830a7d3f1bc22ecb2ccc06cbffc..840fbaa99eef92ba47d8e9086718aa6e188aa869 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientFullScreenTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientFullScreenTest.java
@@ -5,14 +5,19 @@
package org.chromium.android_webview.test;
import android.test.suitebuilder.annotation.MediumTest;
+import android.view.View;
+import android.view.ViewGroup;
import org.chromium.android_webview.test.util.JavascriptEventObserver;
-import org.chromium.android_webview.test.util.VideoTestWebServer;
import org.chromium.base.test.util.Feature;
import org.chromium.content.browser.ContentViewCore;
+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.browser.test.util.TouchCommon;
+import java.util.concurrent.TimeoutException;
+
/**
* Test the fullscreen API (WebChromeClient::onShow/HideCustomView).
*
@@ -22,9 +27,21 @@ import org.chromium.content.browser.test.util.TouchCommon;
* very common use case.
*/
public class AwContentsClientFullScreenTest extends AwTestBase {
+ private static final String VIDEO_TEST_URL =
+ "file:///android_asset/full_screen_video_test.html";
+ private static final String VIDEO_INSIDE_DIV_TEST_URL =
+ "file:///android_asset/full_screen_video_inside_div_test.html";
+
+ // These values must be kept in sync with the strings in
+ // full_screen_video_test.html, full_screen_video_inside_div_test.html and
+ // full_screen_video.js.
+ private static final String VIDEO_ID = "video";
+ private static final String CUSTOM_PLAY_CONTROL_ID = "playControl";
+ private static final String CUSTOM_FULLSCREEN_CONTROL_ID = "fullscreenControl";
+ private static final String FULLSCREEN_ERROR_OBSERVER = "javaFullScreenErrorObserver";
+
private FullScreenVideoTestAwContentsClient mContentsClient;
private ContentViewCore mContentViewCore;
- private VideoTestWebServer mWebServer;
private AwTestContainerView mTestContainerView;
@Override
@@ -36,26 +53,18 @@ public class AwContentsClientFullScreenTest extends AwTestBase {
mContentViewCore = mTestContainerView.getContentViewCore();
enableJavaScriptOnUiThread(mTestContainerView.getAwContents());
mTestContainerView.getAwContents().getSettings().setFullscreenSupported(true);
- mWebServer = new VideoTestWebServer(
- getInstrumentation().getTargetContext());
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- if (mWebServer != null) mWebServer.getTestWebServer().shutdown();
}
@MediumTest
@Feature({"AndroidWebView"})
public void testOnShowAndHideCustomViewWithCallback_video() throws Throwable {
- doTestOnShowAndHideCustomViewWithCallback(getFullScreenVideoTestUrl());
+ doTestOnShowAndHideCustomViewWithCallback(VIDEO_TEST_URL);
}
@MediumTest
@Feature({"AndroidWebView"})
public void testOnShowAndHideCustomViewWithCallback_videoInsideDiv() throws Throwable {
- doTestOnShowAndHideCustomViewWithCallback(getFullScreenVideoInsideDivTestUrl());
+ doTestOnShowAndHideCustomViewWithCallback(VIDEO_INSIDE_DIV_TEST_URL);
}
public void doTestOnShowAndHideCustomViewWithCallback(String videoTestUrl) throws Throwable {
@@ -70,14 +79,14 @@ public class AwContentsClientFullScreenTest extends AwTestBase {
@MediumTest
@Feature({"AndroidWebView"})
public void testOnShowAndHideCustomViewWithJavascript_video() throws Throwable {
- doTestOnShowAndHideCustomViewWithJavascript(getFullScreenVideoTestUrl());
+ doTestOnShowAndHideCustomViewWithJavascript(VIDEO_TEST_URL);
}
@MediumTest
@Feature({"AndroidWebView"})
public void testOnShowAndHideCustomViewWithJavascript_videoInsideDiv()
throws Throwable {
- doTestOnShowAndHideCustomViewWithJavascript(getFullScreenVideoInsideDivTestUrl());
+ doTestOnShowAndHideCustomViewWithJavascript(VIDEO_INSIDE_DIV_TEST_URL);
}
public void doTestOnShowAndHideCustomViewWithJavascript(String videoTestUrl) throws Throwable {
@@ -92,55 +101,200 @@ public class AwContentsClientFullScreenTest extends AwTestBase {
@MediumTest
@Feature({"AndroidWebView"})
public void testOnShowCustomViewAndPlayWithHtmlControl_video() throws Throwable {
- doTestOnShowCustomViewAndPlayWithHtmlControl(getFullScreenVideoTestUrl());
+ doTestOnShowCustomViewAndPlayWithHtmlControl(VIDEO_TEST_URL);
}
@MediumTest
@Feature({"AndroidWebView"})
public void testOnShowCustomViewAndPlayWithHtmlControl_videoInsideDiv() throws Throwable {
- doTestOnShowCustomViewAndPlayWithHtmlControl(getFullScreenVideoInsideDivTestUrl());
+ doTestOnShowCustomViewAndPlayWithHtmlControl(VIDEO_INSIDE_DIV_TEST_URL);
}
public void doTestOnShowCustomViewAndPlayWithHtmlControl(String videoTestUrl) throws Throwable {
- final JavascriptEventObserver onPlayObserver = registerObserver("javaOnPlayObserver");
-
doOnShowCustomViewTest(videoTestUrl);
+ assertTrue(DOMUtils.isVideoPaused(mContentViewCore.getWebContents(), VIDEO_ID));
- // Click the html play button that is rendered above the video right in the middle
- // of the custom view. Note that we're not able to get the precise location of the
- // control since it is a shadow element, so this test might break if the location
- // ever moves.
- TouchCommon touchCommon = new TouchCommon(
- AwContentsClientFullScreenTest.this);
- touchCommon.singleClickView(mContentsClient.getCustomView());
-
- assertTrue(onPlayObserver.waitForEvent(WAIT_TIMEOUT_MS));
+ tapPlayButton();
+ assertTrue(DOMUtils.waitForVideoPlay(mContentViewCore.getWebContents(), VIDEO_ID));
}
@MediumTest
@Feature({"AndroidWebView"})
public void testFullscreenNotSupported_video() throws Throwable {
- doTestFullscreenNotSupported(getFullScreenVideoTestUrl());
+ doTestFullscreenNotSupported(VIDEO_TEST_URL);
}
@MediumTest
@Feature({"AndroidWebView"})
public void testFullscreenNotSupported_videoInsideDiv() throws Throwable {
- doTestFullscreenNotSupported(getFullScreenVideoInsideDivTestUrl());
+ doTestFullscreenNotSupported(VIDEO_INSIDE_DIV_TEST_URL);
}
public void doTestFullscreenNotSupported(String videoTestUrl) throws Throwable {
mTestContainerView.getAwContents().getSettings().setFullscreenSupported(false);
-
- final JavascriptEventObserver fullScreenErrorObserver = registerObserver(
- "javaFullScreenErrorObserver");
+ final JavascriptEventObserver fullscreenErrorObserver = registerObserver(
+ FULLSCREEN_ERROR_OBSERVER);
loadTestPageAndClickFullscreen(videoTestUrl);
- assertTrue(fullScreenErrorObserver.waitForEvent(WAIT_TIMEOUT_MS));
+ assertTrue(fullscreenErrorObserver.waitForEvent(WAIT_TIMEOUT_MS));
assertFalse(mContentsClient.wasCustomViewShownCalled());
}
+ @MediumTest
+ @Feature({"AndroidWebView"})
+ public void testPowerSaveBlockerIsEnabledDuringFullscreenPlayback_video()
+ throws Throwable {
+ doTestPowerSaveBlockerIsEnabledDuringFullscreenPlayback(VIDEO_TEST_URL);
+ }
+
+ @MediumTest
+ @Feature({"AndroidWebView"})
+ public void testPowerSaveBlockerIsEnabledDuringFullscreenPlayback_videoInsideDiv()
+ throws Throwable {
+ doTestPowerSaveBlockerIsEnabledDuringFullscreenPlayback(VIDEO_INSIDE_DIV_TEST_URL);
+ }
+
+ public void doTestPowerSaveBlockerIsEnabledDuringFullscreenPlayback(String videoTestUrl)
+ throws Throwable {
+ // Enter fullscreen.
+ doOnShowCustomViewTest(videoTestUrl);
+ View customView = mContentsClient.getCustomView();
+
+ // No power save blocker is active before playback starts.
+ assertKeepScreenOnActive(customView, false);
+
+ // Play and verify that there is an active power save blocker.
+ tapPlayButton();
+ assertKeepScreenOnActive(customView, true);
+
+ // Stop the video and verify that the power save blocker is gone.
+ DOMUtils.pauseVideo(mContentViewCore.getWebContents(), VIDEO_ID);
+ assertKeepScreenOnActive(customView, false);
+ }
+
+ @MediumTest
+ @Feature({"AndroidWebView"})
+ public void testPowerSaveBlockerIsEnabledDuringEmbeddedPlayback()
+ throws Throwable {
+ assertFalse(DOMUtils.isFullscreen(mContentViewCore.getWebContents()));
+ loadTestPage(VIDEO_INSIDE_DIV_TEST_URL);
+
+ // No power save blocker is active before playback starts.
+ assertKeepScreenOnActive(mTestContainerView, false);
+
+ // Play and verify that there is an active power save blocker.
+ tapPlayButton();
+ assertKeepScreenOnActive(mTestContainerView, true);
+
+ // Stop the video and verify that the power save blocker is gone.
+ DOMUtils.pauseVideo(mContentViewCore.getWebContents(), VIDEO_ID);
+ assertKeepScreenOnActive(mTestContainerView, false);
+ }
+
+ @MediumTest
+ @Feature({"AndroidWebView"})
+ public void testPowerSaveBlockerIsTransferredToFullscreen()
+ throws Throwable {
+ assertFalse(DOMUtils.isFullscreen(mContentViewCore.getWebContents()));
+ loadTestPage(VIDEO_INSIDE_DIV_TEST_URL);
+
+ // Play and verify that there is an active power save blocker.
+ tapPlayButton();
+ assertKeepScreenOnActive(mTestContainerView, true);
+
+ // Enter fullscreen and verify that the power save blocker is
+ // still there.
+ DOMUtils.clickNode(this, mContentViewCore, CUSTOM_FULLSCREEN_CONTROL_ID);
+ mContentsClient.waitForCustomViewShown();
+ View customView = mContentsClient.getCustomView();
+ assertKeepScreenOnActive(customView, true);
+
+ // Pause the video and the power save blocker is gone.
+ DOMUtils.pauseVideo(mContentViewCore.getWebContents(), VIDEO_ID);
+ assertKeepScreenOnActive(customView, false);
+
+ // Exit fullscreen and the power save blocker is still gone.
+ DOMUtils.exitFullscreen(mContentViewCore.getWebContents());
+ mContentsClient.waitForCustomViewHidden();
+ assertKeepScreenOnActive(mTestContainerView, false);
+ }
+
+ @MediumTest
+ @Feature({"AndroidWebView"})
+ public void testPowerSaveBlockerIsTransferredToEmbedded()
+ throws Throwable {
+ // Enter fullscreen.
+ doOnShowCustomViewTest(VIDEO_INSIDE_DIV_TEST_URL);
+ View customView = mContentsClient.getCustomView();
+
+ // Play and verify that there is an active power save blocker
+ // in fullscreen.
+ tapPlayButton();
+ assertKeepScreenOnActive(customView, true);
+
+ // Exit fullscreen and verify that the power save blocker is
+ // still there.
+ DOMUtils.exitFullscreen(mContentViewCore.getWebContents());
+ mContentsClient.waitForCustomViewHidden();
+ assertKeepScreenOnActive(mTestContainerView, true);
+ }
+
+ private void tapPlayButton() throws Exception {
+ String testUrl = mTestContainerView.getAwContents().getUrl();
+ if (VIDEO_INSIDE_DIV_TEST_URL.equals(testUrl)) {
+ // VIDEO_INSIDE_DIV_TEST_URL uses a custom play control with known id.
+ DOMUtils.clickNode(this, mContentViewCore, CUSTOM_PLAY_CONTROL_ID);
+ } else if (VIDEO_TEST_URL.equals(testUrl)
+ && DOMUtils.isFullscreen(mContentViewCore.getWebContents())) {
+ // VIDEO_TEST_URL uses the standard html5 video controls. The standard
+ // html5 controls are shadow html elements without any ids. In fullscreen we can still
+ // tap the play button because this is rendered in the center of the custom view.
+ // In embedded mode we don't have an easy way of retrieving its location.
+ TouchCommon touchCommon = new TouchCommon(AwContentsClientFullScreenTest.this);
+ touchCommon.singleClickView(mContentsClient.getCustomView());
+ } else {
+ fail("Unable to tap standard html5 play control in embedded mode");
+ }
+ }
+
+ /**
+ * Asserts that the keep screen on property in the given {@code view} is active as
+ * {@code expected}. It also verifies that it is only active when the video is playing.
+ */
+ private void assertKeepScreenOnActive(final View view, final boolean expected)
+ throws InterruptedException {
+ // We need to poll because it takes time to synchronize the state between the android
+ // views and Javascript.
+ assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
+ @Override
+ public boolean isSatisfied() {
+ try {
+ return getKeepScreenOn(view) == expected
+ && DOMUtils.isVideoPaused(mContentViewCore.getWebContents(), VIDEO_ID)
+ != expected;
+ } catch (InterruptedException | TimeoutException e) {
+ fail(e.getMessage());
+ return false;
+ }
+ }
+ }));
+ }
+
+ private boolean getKeepScreenOn(View view) {
+ // The power save blocker is added to a child anchor view,
+ // so we need to traverse the hierarchy.
+ if (view instanceof ViewGroup) {
+ ViewGroup viewGroup = (ViewGroup) view;
+ for (int i = 0; i < viewGroup.getChildCount(); i++) {
+ if (getKeepScreenOn(viewGroup.getChildAt(i))) {
+ return true;
+ }
+ }
+ }
+ return view.getKeepScreenOn();
+ }
+
private JavascriptEventObserver registerObserver(final String observerName) {
final JavascriptEventObserver observer = new JavascriptEventObserver();
getInstrumentation().runOnMainSync(new Runnable() {
@@ -160,27 +314,18 @@ public class AwContentsClientFullScreenTest extends AwTestBase {
}
private void doOnShowCustomViewTest(String videoTestUrl) throws Exception {
- final JavascriptEventObserver onEnterFullscreenObserver =
- registerObserver("javaOnEnterFullscreen");
loadTestPageAndClickFullscreen(videoTestUrl);
mContentsClient.waitForCustomViewShown();
- assertTrue(onEnterFullscreenObserver.waitForEvent(WAIT_TIMEOUT_MS));
+ assertTrue(DOMUtils.isFullscreen(mContentViewCore.getWebContents()));
}
private void loadTestPageAndClickFullscreen(String videoTestUrl) throws Exception {
- loadUrlSync(mTestContainerView.getAwContents(),
- mContentsClient.getOnPageFinishedHelper(), videoTestUrl);
-
- // Click the button in full_screen_video_test.html to enter fullscreen.
- TouchCommon touchCommon = new TouchCommon(this);
- touchCommon.singleClickView(mTestContainerView);
+ loadTestPage(videoTestUrl);
+ DOMUtils.clickNode(this, mContentViewCore, CUSTOM_FULLSCREEN_CONTROL_ID);
}
- private String getFullScreenVideoTestUrl() {
- return mWebServer.getFullScreenVideoTestURL();
- }
-
- private String getFullScreenVideoInsideDivTestUrl() {
- return mWebServer.getFullScreenVideoInsideDivTestURL();
+ private void loadTestPage(String videoTestUrl) throws Exception {
+ loadUrlSync(mTestContainerView.getAwContents(),
+ mContentsClient.getOnPageFinishedHelper(), videoTestUrl);
}
}

Powered by Google App Engine
This is Rietveld 408576698