Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2067)

Unified Diff: android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java

Issue 831903004: [WebView] Add a new flushVisualState API to AwContents. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Clarify comment Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..fac192a7c3b75046e314890868d5ed5ee3b8f60c 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 testLoadBlankImmediatelyDrawsBackgroundImmediately() throws Throwable {
+ // This test loads a page with a blue background color. It then waits until this page
+ // is drawn and then calls loadBlankImmediatel 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<>();
mkosiba (inactive) 2015/01/14 18:17:12 why do you need this? Why can't you just declare a
Ignacio Solla 2015/01/16 16:02:07 I can only initialize awContents after createAwTes
mkosiba (inactive) 2015/01/19 11:15:57 oh, I didn't notice the "circular" ref. This is fi
Ignacio Solla 2015/01/19 18:26:40 Acknowledged.
+ 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.loadBlankImmediately();
+ Bitmap redBitmap = drawIntoBitmap(awContents);
+ assertEquals(Color.RED, redBitmap.getPixel(0, 0));
+ }
+ });
+ }
+
+ @Feature({"AndroidWebView"})
+ @SmallTest
+ public void testLoadBlankImmediatelyDoesNotBlockSubsequentLoads() throws Throwable {
+ // This test briefly loads a yellow page and then immediately calls loadBlankImmediatel
+ // 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.loadBlankImmediately();
+ 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) {
mkosiba (inactive) 2015/01/14 18:17:12 we already have like 2 places in tests where we do
Ignacio Solla 2015/01/16 16:02:07 Done.
mkosiba (inactive) 2015/01/19 11:15:57 Thanks!
Ignacio Solla 2015/01/19 18:26:40 Acknowledged.
+ Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(bitmap);
+ awContents.onDraw(canvas);
+ return bitmap;
+ }
}

Powered by Google App Engine
This is Rietveld 408576698