diff options
author | igsolla <igsolla@chromium.org> | 2015-02-19 10:14:04 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-02-19 18:14:40 +0000 |
commit | 09dd483ed39867502d9e036e511d118da36b13eb (patch) | |
tree | ab5fd6336b4d160c49fccac866777545cc1b300d | |
parent | 2df221e4be8e76b2c0b9ba4db79eb358605430ff (diff) | |
download | chromium_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}
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> |