summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorigsolla <igsolla@chromium.org>2015-02-19 10:14:04 -0800
committerCommit bot <commit-bot@chromium.org>2015-02-19 18:14:40 +0000
commit09dd483ed39867502d9e036e511d118da36b13eb (patch)
treeab5fd6336b4d160c49fccac866777545cc1b300d
parent2df221e4be8e76b2c0b9ba4db79eb358605430ff (diff)
downloadchromium_src-09dd483ed39867502d9e036e511d118da36b13eb.zip
chromium_src-09dd483ed39867502d9e036e511d118da36b13eb.tar.gz
chromium_src-09dd483ed39867502d9e036e511d118da36b13eb.tar.bz2
[WebView] Tests for visual state during fullscreen transitions.
We add tests that verify that VisualStateCallbacks are delivered correctly during fullscreen transitions. BUG=459044 Review URL: https://codereview.chromium.org/941713002 Cr-Commit-Position: refs/heads/master@{#317077}
-rw-r--r--android_webview/android_webview_tests.gypi2
-rw-r--r--android_webview/javatests/src/org/chromium/android_webview/test/VisualStateTest.java156
-rw-r--r--android_webview/javatests/src/org/chromium/android_webview/test/util/GraphicsTestUtils.java15
-rw-r--r--android_webview/test/shell/assets/visual_state_during_fullscreen_test.html33
4 files changed, 206 insertions, 0 deletions
diff --git a/android_webview/android_webview_tests.gypi b/android_webview/android_webview_tests.gypi
index 845aedf..e242a6e 100644
--- a/android_webview/android_webview_tests.gypi
+++ b/android_webview/android_webview_tests.gypi
@@ -32,6 +32,7 @@
'<(asset_location)/full_screen_video_inside_div_test.html',
'<(asset_location)/multiple_videos_test.html',
'<(asset_location)/video.mp4',
+ '<(asset_location)/visual_state_during_fullscreen_test.html',
'<(asset_location)/visual_state_waits_for_js_test.html',
'<@(snapshot_additional_input_paths)',
],
@@ -58,6 +59,7 @@
'<(java_in_dir)/assets/full_screen_video_inside_div_test.html',
'<(java_in_dir)/assets/multiple_videos_test.html',
'<(java_in_dir)/assets/video.mp4',
+ '<(java_in_dir)/assets/visual_state_during_fullscreen_test.html',
'<(java_in_dir)/assets/visual_state_waits_for_js_test.html',
'<@(snapshot_copy_files)',
],
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/VisualStateTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/VisualStateTest.java
index 877de7a..3ceeb13 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/VisualStateTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/VisualStateTest.java
@@ -7,6 +7,8 @@ package org.chromium.android_webview.test;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.test.suitebuilder.annotation.SmallTest;
+import android.view.View;
+import android.webkit.WebChromeClient;
import org.chromium.android_webview.AwContents;
import org.chromium.android_webview.AwContents.VisualStateCallback;
@@ -30,7 +32,10 @@ public class VisualStateTest extends AwTestBase {
private static final String WAIT_FOR_JS_TEST_URL =
"file:///android_asset/visual_state_waits_for_js_test.html";
+ private static final String FULLSCREEN_TEST_URL =
+ "file:///android_asset/visual_state_during_fullscreen_test.html";
private static final String UPDATE_COLOR_CONTROL_ID = "updateColorControl";
+ private static final String ENTER_FULLSCREEN_CONTROL_ID = "enterFullscreenControl";
private TestAwContentsClient mContentsClient = new TestAwContentsClient();
@@ -205,6 +210,157 @@ public class VisualStateTest extends AwTestBase {
assertTrue(testFinishedSignal.await(AwTestBase.WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS));
}
+ @Feature({"AndroidWebView"})
+ @SmallTest
+ public void testVisualStateCallbackFromJsDuringFullscreenTransitions() throws Throwable {
+ // This test checks that VisualStateCallbacks are delivered correctly during
+ // fullscreen transitions. It loads a page, clicks a button to enter fullscreen,
+ // then inserts a VisualStateCallback once notified from JS and verifies that when the
+ // callback is received the fullscreen contents are rendered correctly in the next draw.
+ final CountDownLatch readyToEnterFullscreenSignal = new CountDownLatch(1);
+ final CountDownLatch testFinishedSignal = new CountDownLatch(1);
+
+ final AtomicReference<AwContents> awContentsRef = new AtomicReference<>();
+ final FullScreenVideoTestAwContentsClient awContentsClient =
+ new FullScreenVideoTestAwContentsClient(
+ getActivity(), isHardwareAcceleratedTest()) {
+ @Override
+ public void onPageFinished(String url) {
+ super.onPageFinished(url);
+ awContentsRef.get().insertVisualStateCallback(10, new VisualStateCallback() {
+ @Override
+ public void onFailure(long id) {
+ fail("onFailure received");
+ }
+
+ @Override
+ public void onComplete(long id) {
+ Bitmap blueScreenshot =
+ GraphicsTestUtils.drawAwContents(awContentsRef.get(), 100, 100);
+ assertEquals(Color.BLUE, blueScreenshot.getPixel(50, 50));
+ readyToEnterFullscreenSignal.countDown();
+ }
+ });
+ }
+ };
+ final AwTestContainerView testView = createAwTestContainerViewOnMainSync(awContentsClient);
+ final AwContents awContents = testView.getAwContents();
+ awContentsRef.set(awContents);
+ final ContentViewCore contentViewCore = testView.getContentViewCore();
+ enableJavaScriptOnUiThread(awContents);
+ awContents.getSettings().setFullscreenSupported(true);
+
+ // JS will notify this observer once it has entered fullscreen.
+ final JavascriptEventObserver jsObserver = new JavascriptEventObserver();
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ jsObserver.register(contentViewCore, "jsObserver");
+ }
+ });
+
+ loadUrlSync(awContents, awContentsClient.getOnPageFinishedHelper(), FULLSCREEN_TEST_URL);
+
+ assertTrue(readyToEnterFullscreenSignal.await(
+ AwTestBase.WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ DOMUtils.clickNode(VisualStateTest.this, contentViewCore, ENTER_FULLSCREEN_CONTROL_ID);
+ assertTrue(jsObserver.waitForEvent(WAIT_TIMEOUT_MS));
+
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ awContents.insertVisualStateCallback(20, new VisualStateCallback() {
+ @Override
+ public void onFailure(long id) {
+ fail("onFailure received");
+ }
+
+ @Override
+ public void onComplete(long id) {
+ // NOTE: We cannot use drawAwContents here because the web contents
+ // are rendered into the custom view while in fullscreen.
+ Bitmap redScreenshot = GraphicsTestUtils.drawView(
+ awContentsClient.getCustomView(), 100, 100);
+ assertEquals(Color.RED, redScreenshot.getPixel(50, 50));
+ testFinishedSignal.countDown();
+ }
+ });
+ }
+ });
+
+ assertTrue(testFinishedSignal.await(AwTestBase.WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ }
+
+ @Feature({"AndroidWebView"})
+ @SmallTest
+ public void testVisualStateCallbackFromJavaDuringFullscreenTransitions() throws Throwable {
+ // This test checks that VisualStateCallbacks are delivered correctly during
+ // fullscreen transitions. It loads a page, clicks a button to enter fullscreen,
+ // then inserts a VisualStateCallback from onShowCustomView and verifies that when the
+ // callback is received the fullscreen contents are rendered correctly in the next draw.
+ final CountDownLatch readyToEnterFullscreenSignal = new CountDownLatch(1);
+ final CountDownLatch testFinishedSignal = new CountDownLatch(1);
+
+ final AtomicReference<AwContents> awContentsRef = new AtomicReference<>();
+ final FullScreenVideoTestAwContentsClient awContentsClient =
+ new FullScreenVideoTestAwContentsClient(
+ getActivity(), isHardwareAcceleratedTest()) {
+ @Override
+ public void onPageFinished(String url) {
+ super.onPageFinished(url);
+ awContentsRef.get().insertVisualStateCallback(10, new VisualStateCallback() {
+ @Override
+ public void onFailure(long id) {
+ fail("onFailure received");
+ }
+
+ @Override
+ public void onComplete(long id) {
+ Bitmap blueScreenshot =
+ GraphicsTestUtils.drawAwContents(awContentsRef.get(), 100, 100);
+ assertEquals(Color.BLUE, blueScreenshot.getPixel(50, 50));
+ readyToEnterFullscreenSignal.countDown();
+ }
+ });
+ }
+
+ @Override
+ public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) {
+ super.onShowCustomView(view, callback);
+ awContentsRef.get().insertVisualStateCallback(20, new VisualStateCallback() {
+ @Override
+ public void onFailure(long id) {
+ fail("onFailure received");
+ }
+
+ @Override
+ public void onComplete(long id) {
+ // NOTE: We cannot use drawAwContents here because the web contents are
+ // rendered into the custom view while in fullscreen.
+ Bitmap redScreenshot =
+ GraphicsTestUtils.drawView(getCustomView(), 100, 100);
+ assertEquals(Color.RED, redScreenshot.getPixel(50, 50));
+ testFinishedSignal.countDown();
+ }
+ });
+ }
+ };
+ final AwTestContainerView testView = createAwTestContainerViewOnMainSync(awContentsClient);
+ final AwContents awContents = testView.getAwContents();
+ awContentsRef.set(awContents);
+ final ContentViewCore contentViewCore = testView.getContentViewCore();
+ enableJavaScriptOnUiThread(awContents);
+ awContents.getSettings().setFullscreenSupported(true);
+
+ loadUrlSync(awContents, awContentsClient.getOnPageFinishedHelper(), FULLSCREEN_TEST_URL);
+
+ assertTrue(readyToEnterFullscreenSignal.await(
+ AwTestBase.WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ DOMUtils.clickNode(VisualStateTest.this, contentViewCore, ENTER_FULLSCREEN_CONTROL_ID);
+
+ assertTrue(testFinishedSignal.await(AwTestBase.WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ }
+
private static final LoadUrlParams createTestPageUrl(String backgroundColor) {
return LoadUrlParams.createLoadDataParams(
"<html><body bgcolor=" + backgroundColor + "></body></html>", "text/html", false);
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/util/GraphicsTestUtils.java b/android_webview/javatests/src/org/chromium/android_webview/test/util/GraphicsTestUtils.java
index acce0fe..d41b7a3 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/util/GraphicsTestUtils.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/util/GraphicsTestUtils.java
@@ -6,6 +6,7 @@ package org.chromium.android_webview.test.util;
import android.graphics.Bitmap;
import android.graphics.Canvas;
+import android.view.View;
import org.chromium.android_webview.AwContents;
import org.chromium.android_webview.test.AwTestBase;
@@ -43,6 +44,20 @@ public class GraphicsTestUtils {
return doDrawAwContents(awContents, width, height, dx, dy);
}
+ /**
+ * Draws the supplied {@link View} into the returned {@link Bitmap}.
+ *
+ * @param view The view to draw
+ * @param width The width of the bitmap
+ * @param height The height of the bitmap
+ */
+ public static Bitmap drawView(View view, int width, int height) {
+ Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(bitmap);
+ view.draw(canvas);
+ return bitmap;
+ }
+
public static int sampleBackgroundColorOnUiThread(final AwContents awContents)
throws Exception {
return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() {
diff --git a/android_webview/test/shell/assets/visual_state_during_fullscreen_test.html b/android_webview/test/shell/assets/visual_state_during_fullscreen_test.html
new file mode 100644
index 0000000..cf1fed0
--- /dev/null
+++ b/android_webview/test/shell/assets/visual_state_during_fullscreen_test.html
@@ -0,0 +1,33 @@
+<html>
+<head>
+<script>
+ function enterFullscreen() {
+ var div = document.getElementById("mydiv");
+ div.webkitRequestFullScreen();
+ div.addEventListener("webkitfullscreenchange", function(){
+ div.style.height = "100%";
+ div.style.width = "100%";
+ div.style.backgroundColor = "red";
+ jsObserver.notifyJava();
+ });
+ }
+</script>
+<style>
+ body {
+ margin: 0px;
+ padding: 0px;
+ }
+ #enterFullscreenControl {
+ height: 100%;
+ width: 100%;
+ padding: 0px 0px;
+ background-color: blue;
+ }
+</style>
+</head>
+<body>
+<button id="enterFullscreenControl" autofocus onclick="enterFullscreen(); return false">
+<div id="mydiv"></div>
+</button>
+</body>
+</html>