Commit 09dd483e authored by igsolla's avatar igsolla Committed by Commit bot

[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}
parent 2df221e4
......@@ -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)',
],
......
......@@ -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);
......
......@@ -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>() {
......
<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>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment