| Index: android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java
|
| diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..72e62a60a869ea688b699fa9e741f7433dc07afe
|
| --- /dev/null
|
| +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java
|
| @@ -0,0 +1,191 @@
|
| +// Copyright 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.android_webview.test;
|
| +
|
| +import android.test.suitebuilder.annotation.SmallTest;
|
| +import android.view.View;
|
| +import android.view.View.MeasureSpec;
|
| +import android.view.ViewGroup.LayoutParams;
|
| +import android.widget.LinearLayout;
|
| +import android.util.Log;
|
| +
|
| +import org.chromium.android_webview.AwContents;
|
| +import org.chromium.android_webview.AwContentsClient;
|
| +import org.chromium.android_webview.AwLayoutSizer;
|
| +import org.chromium.android_webview.test.util.CommonResources;
|
| +import org.chromium.base.test.util.Feature;
|
| +import org.chromium.content.browser.ContentViewCore;
|
| +import org.chromium.content.browser.test.util.CallbackHelper;
|
| +
|
| +import java.util.concurrent.atomic.AtomicReference;
|
| +import java.util.concurrent.TimeoutException;
|
| +
|
| +/**
|
| + * Tests for certain edge cases related to integrating with the Android view system.
|
| + */
|
| +public class AndroidViewIntegrationTest extends AwTestBase {
|
| + private static class OnContentSizeChangedHelper extends CallbackHelper {
|
| + private int mWidth;
|
| + private int mHeight;
|
| +
|
| + public int getWidth() {
|
| + assert(getCallCount() > 0);
|
| + return mWidth;
|
| + }
|
| +
|
| + public int getHeight() {
|
| + assert(getCallCount() > 0);
|
| + return mHeight;
|
| + }
|
| +
|
| + public void onContentSizeChanged(int widthCss, int heightCss) {
|
| + mWidth = widthCss;
|
| + mHeight = heightCss;
|
| + notifyCalled();
|
| + }
|
| + }
|
| +
|
| + private OnContentSizeChangedHelper mOnContentSizeChangedHelper =
|
| + new OnContentSizeChangedHelper();
|
| + private CallbackHelper mOnPageScaleChangedHelper = new CallbackHelper();
|
| +
|
| + private class TestAwLayoutSizer extends AwLayoutSizer {
|
| + @Override
|
| + public void onContentSizeChanged(int widthCss, int heightCss) {
|
| + super.onContentSizeChanged(widthCss, heightCss);
|
| + mOnContentSizeChangedHelper.onContentSizeChanged(widthCss, heightCss);
|
| + }
|
| +
|
| + @Override
|
| + public void onPageScaleChanged(double pageScaleFactor) {
|
| + super.onPageScaleChanged(pageScaleFactor);
|
| + mOnPageScaleChangedHelper.notifyCalled();
|
| + }
|
| + }
|
| +
|
| + private class DependencyFactory extends TestDependencyFactory {
|
| + @Override
|
| + public AwLayoutSizer createLayoutSizer() {
|
| + return new TestAwLayoutSizer();
|
| + }
|
| + }
|
| +
|
| + final LinearLayout.LayoutParams wrapContentLayoutParams =
|
| + new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
|
| +
|
| + private AwTestContainerView createCustomTestContainerViewOnMainSync(
|
| + final AwContentsClient awContentsClient, final int visibility) throws Exception {
|
| + final AtomicReference<AwTestContainerView> testContainerView =
|
| + new AtomicReference<AwTestContainerView>();
|
| + getInstrumentation().runOnMainSync(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + testContainerView.set(createAwTestContainerView(awContentsClient,
|
| + new DependencyFactory()));
|
| + testContainerView.get().setLayoutParams(wrapContentLayoutParams);
|
| + testContainerView.get().setVisibility(visibility);
|
| + }
|
| + });
|
| + return testContainerView.get();
|
| + }
|
| +
|
| + private AwTestContainerView createDetachedTestContainerViewOnMainSync(
|
| + final AwContentsClient awContentsClient) {
|
| + final AtomicReference<AwTestContainerView> testContainerView =
|
| + new AtomicReference<AwTestContainerView>();
|
| + getInstrumentation().runOnMainSync(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + testContainerView.set(createDetachedAwTestContainerView(awContentsClient,
|
| + new DependencyFactory()));
|
| + }
|
| + });
|
| + return testContainerView.get();
|
| + }
|
| +
|
| + private void assertZeroHeight(final AwTestContainerView testContainerView) throws Throwable {
|
| + // Make sure the test isn't broken by the view having a non-zero height.
|
| + getInstrumentation().runOnMainSync(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + assertEquals(0, testContainerView.getHeight());
|
| + }
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * This checks for issues related to loading content into a 0x0 view.
|
| + *
|
| + * A 0x0 sized view is common if the WebView is set to wrap_content and newly created. The
|
| + * expected behavior is for the WebView to expand after some content is loaded.
|
| + * In Chromium it would be valid to not load or render content into a WebContents with a 0x0
|
| + * view (since the user can't see it anyway) and only do so after the view's size is non-zero.
|
| + * Such behavior is unacceptable for the WebView and this test is to ensure that such behavior
|
| + * is not re-introduced.
|
| + */
|
| + @SmallTest
|
| + @Feature({"AndroidWebView"})
|
| + public void testZeroByZeroViewLoadsContent() throws Throwable {
|
| + final TestAwContentsClient contentsClient = new TestAwContentsClient();
|
| + final AwTestContainerView testContainerView = createCustomTestContainerViewOnMainSync(
|
| + contentsClient, View.VISIBLE);
|
| + assertZeroHeight(testContainerView);
|
| +
|
| + final int contentSizeChangeCallCount = mOnContentSizeChangedHelper.getCallCount();
|
| + final int pageScaleChangeCallCount = mOnPageScaleChangedHelper.getCallCount();
|
| + loadUrlAsync(testContainerView.getAwContents(), CommonResources.ABOUT_HTML);
|
| + mOnPageScaleChangedHelper.waitForCallback(pageScaleChangeCallCount);
|
| + mOnContentSizeChangedHelper.waitForCallback(contentSizeChangeCallCount);
|
| + assertTrue(mOnContentSizeChangedHelper.getHeight() > 0);
|
| + }
|
| +
|
| + /**
|
| + * Check that a content size change notification is issued when the view is invisible.
|
| + *
|
| + * This makes sure that any optimizations related to the view's visibility don't inhibit
|
| + * the ability to load pages. Many applications keep the WebView hidden when it's loading.
|
| + */
|
| + @SmallTest
|
| + @Feature({"AndroidWebView"})
|
| + public void testInvisibleViewLoadsContent() throws Throwable {
|
| + final TestAwContentsClient contentsClient = new TestAwContentsClient();
|
| + final AwTestContainerView testContainerView = createCustomTestContainerViewOnMainSync(
|
| + contentsClient, View.INVISIBLE);
|
| + assertZeroHeight(testContainerView);
|
| +
|
| + final int contentSizeChangeCallCount = mOnContentSizeChangedHelper.getCallCount();
|
| + final int pageScaleChangeCallCount = mOnPageScaleChangedHelper.getCallCount();
|
| + loadUrlAsync(testContainerView.getAwContents(), CommonResources.ABOUT_HTML);
|
| + mOnPageScaleChangedHelper.waitForCallback(pageScaleChangeCallCount);
|
| + mOnContentSizeChangedHelper.waitForCallback(contentSizeChangeCallCount);
|
| + assertTrue(mOnContentSizeChangedHelper.getHeight() > 0);
|
| +
|
| + getInstrumentation().runOnMainSync(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + assertEquals(View.INVISIBLE, testContainerView.getVisibility());
|
| + }
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * Check that a content size change notification is sent even if the WebView is off screen.
|
| + */
|
| + @SmallTest
|
| + @Feature({"AndroidWebView"})
|
| + public void testDisconnectedViewLoadsContent() throws Throwable {
|
| + final TestAwContentsClient contentsClient = new TestAwContentsClient();
|
| + final AwTestContainerView testContainerView =
|
| + createDetachedTestContainerViewOnMainSync(contentsClient);
|
| + assertZeroHeight(testContainerView);
|
| +
|
| + final int contentSizeChangeCallCount = mOnContentSizeChangedHelper.getCallCount();
|
| + final int pageScaleChangeCallCount = mOnPageScaleChangedHelper.getCallCount();
|
| + loadUrlAsync(testContainerView.getAwContents(), CommonResources.ABOUT_HTML);
|
| + mOnPageScaleChangedHelper.waitForCallback(pageScaleChangeCallCount);
|
| + mOnContentSizeChangedHelper.waitForCallback(contentSizeChangeCallCount);
|
| + assertTrue(mOnContentSizeChangedHelper.getHeight() > 0);
|
| + }
|
| +}
|
|
|