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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3d3f6af0fa303830a7d3f1bc22ecb2ccc06cbffc |
--- /dev/null |
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientFullScreenTest.java |
@@ -0,0 +1,186 @@ |
+// Copyright 2013 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.android_webview.test; |
+ |
+import android.test.suitebuilder.annotation.MediumTest; |
+ |
+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.DOMUtils; |
+import org.chromium.content.browser.test.util.TouchCommon; |
+ |
+/** |
+ * Test the fullscreen API (WebChromeClient::onShow/HideCustomView). |
+ * |
+ * <p>Fullscreen support follows a different code path depending on whether |
+ * the element is a video or not, so we test we both. For non-video elements |
+ * we pick a div containing a video and custom html controls since this is a |
+ * very common use case. |
+ */ |
+public class AwContentsClientFullScreenTest extends AwTestBase { |
+ private FullScreenVideoTestAwContentsClient mContentsClient; |
+ private ContentViewCore mContentViewCore; |
+ private VideoTestWebServer mWebServer; |
+ private AwTestContainerView mTestContainerView; |
+ |
+ @Override |
+ protected void setUp() throws Exception { |
+ super.setUp(); |
+ mContentsClient = new FullScreenVideoTestAwContentsClient(getActivity()); |
+ mTestContainerView = |
+ createAwTestContainerViewOnMainSync(mContentsClient); |
+ 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()); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"AndroidWebView"}) |
+ public void testOnShowAndHideCustomViewWithCallback_videoInsideDiv() throws Throwable { |
+ doTestOnShowAndHideCustomViewWithCallback(getFullScreenVideoInsideDivTestUrl()); |
+ } |
+ |
+ public void doTestOnShowAndHideCustomViewWithCallback(String videoTestUrl) throws Throwable { |
+ doOnShowAndHideCustomViewTest(videoTestUrl, new Runnable() { |
+ @Override |
+ public void run() { |
+ mContentsClient.getExitCallback().onCustomViewHidden(); |
+ } |
+ }); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"AndroidWebView"}) |
+ public void testOnShowAndHideCustomViewWithJavascript_video() throws Throwable { |
+ doTestOnShowAndHideCustomViewWithJavascript(getFullScreenVideoTestUrl()); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"AndroidWebView"}) |
+ public void testOnShowAndHideCustomViewWithJavascript_videoInsideDiv() |
+ throws Throwable { |
+ doTestOnShowAndHideCustomViewWithJavascript(getFullScreenVideoInsideDivTestUrl()); |
+ } |
+ |
+ public void doTestOnShowAndHideCustomViewWithJavascript(String videoTestUrl) throws Throwable { |
+ doOnShowAndHideCustomViewTest(videoTestUrl, new Runnable() { |
+ @Override |
+ public void run() { |
+ DOMUtils.exitFullscreen(mContentViewCore.getWebContents()); |
+ } |
+ }); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"AndroidWebView"}) |
+ public void testOnShowCustomViewAndPlayWithHtmlControl_video() throws Throwable { |
+ doTestOnShowCustomViewAndPlayWithHtmlControl(getFullScreenVideoTestUrl()); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"AndroidWebView"}) |
+ public void testOnShowCustomViewAndPlayWithHtmlControl_videoInsideDiv() throws Throwable { |
+ doTestOnShowCustomViewAndPlayWithHtmlControl(getFullScreenVideoInsideDivTestUrl()); |
+ } |
+ |
+ public void doTestOnShowCustomViewAndPlayWithHtmlControl(String videoTestUrl) throws Throwable { |
+ final JavascriptEventObserver onPlayObserver = registerObserver("javaOnPlayObserver"); |
+ |
+ doOnShowCustomViewTest(videoTestUrl); |
+ |
+ // 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)); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"AndroidWebView"}) |
+ public void testFullscreenNotSupported_video() throws Throwable { |
+ doTestFullscreenNotSupported(getFullScreenVideoTestUrl()); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"AndroidWebView"}) |
+ public void testFullscreenNotSupported_videoInsideDiv() throws Throwable { |
+ doTestFullscreenNotSupported(getFullScreenVideoInsideDivTestUrl()); |
+ } |
+ |
+ public void doTestFullscreenNotSupported(String videoTestUrl) throws Throwable { |
+ mTestContainerView.getAwContents().getSettings().setFullscreenSupported(false); |
+ |
+ final JavascriptEventObserver fullScreenErrorObserver = registerObserver( |
+ "javaFullScreenErrorObserver"); |
+ |
+ loadTestPageAndClickFullscreen(videoTestUrl); |
+ |
+ assertTrue(fullScreenErrorObserver.waitForEvent(WAIT_TIMEOUT_MS)); |
+ assertFalse(mContentsClient.wasCustomViewShownCalled()); |
+ } |
+ |
+ private JavascriptEventObserver registerObserver(final String observerName) { |
+ final JavascriptEventObserver observer = new JavascriptEventObserver(); |
+ getInstrumentation().runOnMainSync(new Runnable() { |
+ @Override |
+ public void run() { |
+ observer.register(mContentViewCore, observerName); |
+ } |
+ }); |
+ return observer; |
+ } |
+ |
+ private void doOnShowAndHideCustomViewTest(String videoTestUrl, final Runnable existFullscreen) |
+ throws Throwable { |
+ doOnShowCustomViewTest(videoTestUrl); |
+ getInstrumentation().runOnMainSync(existFullscreen); |
+ mContentsClient.waitForCustomViewHidden(); |
+ } |
+ |
+ private void doOnShowCustomViewTest(String videoTestUrl) throws Exception { |
+ final JavascriptEventObserver onEnterFullscreenObserver = |
+ registerObserver("javaOnEnterFullscreen"); |
+ loadTestPageAndClickFullscreen(videoTestUrl); |
+ mContentsClient.waitForCustomViewShown(); |
+ assertTrue(onEnterFullscreenObserver.waitForEvent(WAIT_TIMEOUT_MS)); |
+ } |
+ |
+ 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); |
+ } |
+ |
+ private String getFullScreenVideoTestUrl() { |
+ return mWebServer.getFullScreenVideoTestURL(); |
+ } |
+ |
+ private String getFullScreenVideoInsideDivTestUrl() { |
+ return mWebServer.getFullScreenVideoInsideDivTestURL(); |
+ } |
+} |