Index: android_webview/javatests/src/org/chromium/android_webview/test/VisualStateTest.java |
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 877de7aaf733ea20025201980c37804f13b4edf0..3ceeb13c32a11b57c54ae74aa7153ff231821082 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); |