| Index: android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java
|
| diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java
|
| index fbba821a7ced05b9885da13e305a8441deac84e9..4a900f27d9da31fb5cd1ac4ffb6496a9f52ed3cf 100644
|
| --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java
|
| +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java
|
| @@ -7,6 +7,7 @@ package org.chromium.android_webview.test;
|
| import android.graphics.Bitmap;
|
| import android.graphics.BitmapFactory;
|
| import android.graphics.Canvas;
|
| +import android.graphics.Color;
|
| import android.os.Handler;
|
| import android.os.Looper;
|
| import android.os.Message;
|
| @@ -20,6 +21,7 @@ import android.view.View;
|
| import org.apache.http.Header;
|
| import org.apache.http.HttpRequest;
|
| import org.chromium.android_webview.AwContents;
|
| +import org.chromium.android_webview.AwContents.VisualStateFlushCallback;
|
| import org.chromium.android_webview.AwSettings;
|
| import org.chromium.android_webview.test.TestAwContentsClient.OnDownloadStartHelper;
|
| import org.chromium.android_webview.test.util.CommonResources;
|
| @@ -35,9 +37,11 @@ import java.util.HashMap;
|
| import java.util.List;
|
| import java.util.Map;
|
| import java.util.concurrent.Callable;
|
| +import java.util.concurrent.CountDownLatch;
|
| import java.util.concurrent.Semaphore;
|
| import java.util.concurrent.TimeUnit;
|
| import java.util.concurrent.atomic.AtomicInteger;
|
| +import java.util.concurrent.atomic.AtomicReference;
|
|
|
| /**
|
| * AwContents tests.
|
| @@ -562,4 +566,156 @@ public class AwContentsTest extends AwTestBase {
|
| loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
|
| assertEquals(onSslErrorCallCount + 1, onReceivedSslErrorHelper.getCallCount());
|
| }
|
| +
|
| + @Feature({"AndroidWebView"})
|
| + @SmallTest
|
| + public void testFlushVisualState() throws Throwable {
|
| + AwTestContainerView testContainer =
|
| + createAwTestContainerViewOnMainSync(mContentsClient);
|
| + final AwContents awContents = testContainer.getAwContents();
|
| + loadUrlSync(awContents,
|
| + mContentsClient.getOnPageFinishedHelper(), CommonResources.ABOUT_HTML);
|
| + final CallbackHelper ch = new CallbackHelper();
|
| + final int chCount = ch.getCallCount();
|
| + runTestOnUiThread(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + awContents.flushVisualState(new AwContents.VisualStateFlushCallback() {
|
| + @Override
|
| + public void onComplete() {
|
| + ch.notifyCalled();
|
| + }
|
| +
|
| + @Override
|
| + public void onFailure(int reason) {}
|
| + });
|
| + }
|
| + });
|
| + ch.waitForCallback(chCount);
|
| + }
|
| +
|
| + @Feature({"AndroidWebView"})
|
| + @SmallTest
|
| + public void testLoadBlankDrawsBackgroundImmediately() throws Throwable {
|
| + // This test loads a page with a blue background color. It then waits until this page
|
| + // is drawn and then calls loadBlank and checks that the background color of the view
|
| + // (in this case red) is drawn immediately instead of the contents of the blue page.
|
| + final CountDownLatch bluePageDrawnSignal = new CountDownLatch(1);
|
| + final LoadUrlParams bluePageUrl = createTestPageUrl("blue");
|
| +
|
| + final AtomicReference<AwContents> awContentsRef = new AtomicReference<>();
|
| + final AwTestContainerView testView = createAwTestContainerViewOnMainSync(
|
| + new TestAwContentsClient() {
|
| + @Override
|
| + public void onPageFinished(String url) {
|
| + if (bluePageUrl.getUrl().equals(url)) {
|
| + // We flush from onPageFinished to ensure that the blue page contents
|
| + // have been drawn when the flush callback is received.
|
| + awContentsRef.get().flushVisualState(
|
| + createFlushCallback(bluePageDrawnSignal));
|
| + }
|
| + }
|
| + });
|
| + final AwContents awContents = testView.getAwContents();
|
| + awContentsRef.set(awContents);
|
| +
|
| + getInstrumentation().runOnMainSync(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + awContents.setBackgroundColor(Color.RED);
|
| + awContents.loadUrl(bluePageUrl);
|
| + }
|
| + });
|
| +
|
| + bluePageDrawnSignal.await();
|
| +
|
| + getInstrumentation().runOnMainSync(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + Bitmap blueBitmap = drawIntoBitmap(awContents);
|
| + assertEquals(Color.BLUE, blueBitmap.getPixel(0, 0));
|
| +
|
| + // Check that the background color is drawn immediately after loading blank.
|
| + // Note that we don't need to wait for any events such as onPageFinished.
|
| + awContents.loadBlank();
|
| + Bitmap redBitmap = drawIntoBitmap(awContents);
|
| + assertEquals(Color.RED, redBitmap.getPixel(0, 0));
|
| + }
|
| + });
|
| + }
|
| +
|
| + @Feature({"AndroidWebView"})
|
| + @SmallTest
|
| + public void testLoadBlankDoesNotBlockSubsequentLoads() throws Throwable {
|
| + // This test briefly loads a yellow page and then immediately calls loadBlank which should
|
| + // draw the background color of the view immediately (in this case red). It then tries to
|
| + // load a page with blue background and waits until this page is drawn.
|
| + final CountDownLatch bluePageDrawnSignal = new CountDownLatch(1);
|
| + final LoadUrlParams bluePageUrl = createTestPageUrl("blue");
|
| +
|
| + final AtomicReference<AwContents> awContentsRef = new AtomicReference<>();
|
| + final AwTestContainerView testView = createAwTestContainerViewOnMainSync(
|
| + new TestAwContentsClient() {
|
| + @Override
|
| + public void onPageFinished(String url) {
|
| + if (bluePageUrl.getUrl().equals(url)) {
|
| + awContentsRef.get().flushVisualState(
|
| + createFlushCallback(bluePageDrawnSignal));
|
| + }
|
| + }
|
| + });
|
| + final AwContents awContents = testView.getAwContents();
|
| + awContentsRef.set(awContents);
|
| +
|
| + getInstrumentation().runOnMainSync(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + awContents.loadUrl(createTestPageUrl("yellow"));
|
| + awContents.setBackgroundColor(Color.RED);
|
| + awContents.loadBlank();
|
| + Bitmap redBitmap = drawIntoBitmap(awContents);
|
| + assertEquals(Color.RED, redBitmap.getPixel(0, 0));
|
| +
|
| + // Loading blank previously should not block this load.
|
| + awContents.loadUrl(bluePageUrl);
|
| + }
|
| + });
|
| +
|
| + bluePageDrawnSignal.await();
|
| +
|
| + getInstrumentation().runOnMainSync(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + Bitmap blueBitmap = drawIntoBitmap(awContents);
|
| + assertEquals(Color.BLUE, blueBitmap.getPixel(0, 0));
|
| + }
|
| + });
|
| + }
|
| +
|
| + private static VisualStateFlushCallback createFlushCallback(final CountDownLatch latch) {
|
| + return new VisualStateFlushCallback() {
|
| + @Override
|
| + public void onFailure(int reason) {
|
| + fail("onFailure received");
|
| + }
|
| +
|
| + @Override
|
| + public void onComplete() {
|
| + latch.countDown();
|
| + }
|
| + };
|
| + }
|
| +
|
| + private static final LoadUrlParams createTestPageUrl(String backgroundColor) {
|
| + return LoadUrlParams.createLoadDataParams(
|
| + "<html><body bgcolor=" + backgroundColor + "></body></html>",
|
| + "text/html", false);
|
| + }
|
| +
|
| + private Bitmap drawIntoBitmap(AwContents awContents) {
|
| + Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
|
| + Canvas canvas = new Canvas(bitmap);
|
| + awContents.onDraw(canvas);
|
| + return bitmap;
|
| + }
|
| }
|
|
|