Chromium Code Reviews| 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 05331b2bd09888cfdf8f0950e9b7c4bc9c8b8dd1..0343b7be888e81600a3b353187e739e68e382fe9 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 |
| @@ -17,16 +17,21 @@ import android.test.suitebuilder.annotation.SmallTest; |
| import android.util.Pair; |
| import android.view.KeyEvent; |
| import android.view.View; |
| +import android.view.ViewGroup.LayoutParams; |
| +import android.view.ViewTreeObserver.OnGlobalLayoutListener; |
| import android.webkit.JavascriptInterface; |
| +import android.widget.FrameLayout; |
| import org.apache.http.Header; |
| import org.apache.http.HttpRequest; |
| import org.chromium.android_webview.AwContents; |
| +import org.chromium.android_webview.AwContents.AwViewAndroidDelegate; |
| import org.chromium.android_webview.AwSettings; |
| import org.chromium.android_webview.AwSwitches; |
| import org.chromium.android_webview.test.TestAwContentsClient.OnDownloadStartHelper; |
| import org.chromium.android_webview.test.util.CommonResources; |
| import org.chromium.android_webview.test.util.JSUtils; |
| +import org.chromium.base.ThreadUtils; |
| import org.chromium.base.annotations.SuppressFBWarnings; |
| import org.chromium.base.test.util.CommandLineFlags; |
| import org.chromium.base.test.util.Feature; |
| @@ -36,6 +41,8 @@ import org.chromium.content.browser.ChildProcessConnection; |
| import org.chromium.content.browser.ChildProcessLauncher; |
| import org.chromium.content.browser.test.util.CallbackHelper; |
| import org.chromium.net.test.util.TestWebServer; |
| +import org.chromium.ui.base.ViewAndroidDelegate; |
| +import org.chromium.ui.gfx.DeviceDisplayInfo; |
| import java.io.InputStream; |
| import java.net.URL; |
| @@ -614,4 +621,206 @@ public class AwContentsTest extends AwTestBase { |
| mContentsClient.getOnEvaluateJavaScriptResultHelper(), "21 + 21")); |
| } |
| + @DisableHardwareAccelerationForTest |
|
boliu
2016/07/25 22:15:26
why?
Jinsuk Kim
2016/07/27 10:02:43
Without it, the container starts with a hardware v
|
| + @Feature({"AndroidWebView"}) |
| + @SmallTest |
| + public void testMovedAndRemovedAnchorViewIsNotTransferred() throws Throwable { |
|
boliu
2016/07/25 22:15:26
pull everything out into a new file, maybe AwAncho
Jinsuk Kim
2016/07/27 10:02:43
AwContentAnchorViewTest.java
|
| + // Add, move and remove anchorView |
| + AwTestContainerView containerView = createAwTestContainerViewOnMainSync(mContentsClient); |
| + View anchorView = addAnchorViewTest(containerView, 1); |
| + setLayoutParams(containerView, anchorView, 1, 2); |
| + removeAnchorViewTest(containerView, anchorView, 0); |
| + |
| + // Replace container view |
| + FrameLayout updatedContainerView = updateContainerView(containerView); |
| + |
| + // Verify that no anchor view is transferred between containerViews |
| + assertEquals(0, containerView.getChildCount()); |
| + assertEquals(0, updatedContainerView.getChildCount()); |
| + } |
| + |
| + @DisableHardwareAccelerationForTest |
| + @Feature({"AndroidWebView"}) |
| + @SmallTest |
| + public void testTransferAnchorView() throws Throwable { |
| + // Add anchor view |
| + AwTestContainerView containerView = createAwTestContainerViewOnMainSync(mContentsClient); |
| + View anchorView = addAnchorViewTest(containerView, 1); |
| + LayoutParams layoutParams = anchorView.getLayoutParams(); |
| + |
| + // Replace container view |
| + FrameLayout updatedContainerView = updateContainerView(containerView); |
| + verifyAnchorViewCorrectlyTransferred( |
| + containerView, anchorView, updatedContainerView, layoutParams); |
| + } |
| + |
| + @DisableHardwareAccelerationForTest |
| + @Feature({"AndroidWebView"}) |
| + @SmallTest |
| + public void testTransferMovedAnchorView() throws Throwable { |
| + // Add anchor view and move it |
| + AwTestContainerView containerView = createAwTestContainerViewOnMainSync(mContentsClient); |
| + View anchorView = addAnchorViewTest(containerView, 1); |
| + LayoutParams layoutParams = setLayoutParams(containerView, anchorView, 1, 2); |
| + |
| + // Replace container view |
| + FrameLayout updatedContainerView = updateContainerView(containerView); |
| + |
| + verifyAnchorViewCorrectlyTransferred( |
| + containerView, anchorView, updatedContainerView, layoutParams); |
| + } |
| + |
| + @DisableHardwareAccelerationForTest |
| + @Feature({"AndroidWebView"}) |
| + @SmallTest |
| + public void testRemoveTransferedAnchorView() throws Throwable { |
| + // Add anchor view |
| + AwTestContainerView containerView = createAwTestContainerViewOnMainSync(mContentsClient); |
| + View anchorView = addAnchorViewTest(containerView, 1); |
| + |
| + // Replace container view |
| + FrameLayout updatedContainerView = updateContainerView(containerView); |
| + |
| + verifyAnchorViewCorrectlyTransferred(containerView, anchorView, updatedContainerView); |
| + |
| + // Remove transferred anchor view |
| + removeAnchorViewTest(containerView, anchorView, 0); |
| + } |
| + |
| + @DisableHardwareAccelerationForTest |
| + @Feature({"AndroidWebView"}) |
| + @SmallTest |
| + public void testMoveTransferedAnchorView() throws Throwable { |
| + // Add anchor view |
| + AwTestContainerView containerView = createAwTestContainerViewOnMainSync(mContentsClient); |
| + View anchorView = addAnchorViewTest(containerView, 1); |
| + LayoutParams layoutParams = anchorView.getLayoutParams(); |
| + |
| + // Replace container view |
| + FrameLayout updatedContainerView = updateContainerView(containerView); |
| + |
| + verifyAnchorViewCorrectlyTransferred( |
| + containerView, anchorView, updatedContainerView, layoutParams); |
| + |
| + // Move transferred anchor view |
| + assertFalse(areEqual(layoutParams, setLayoutParams(containerView, anchorView, 1, 2))); |
| + } |
| + |
| + @DisableHardwareAccelerationForTest |
| + @Feature({"AndroidWebView"}) |
| + @SmallTest |
| + public void testTransferMultipleMovedAnchorViews() throws Throwable { |
| + // Add and move anchorView1 |
| + AwTestContainerView containerView = createAwTestContainerViewOnMainSync(mContentsClient); |
| + View anchorView1 = addAnchorViewTest(containerView, 1); |
| + LayoutParams layoutParams1 = setLayoutParams(containerView, anchorView1, 1, 2); |
| + |
| + // Add and move anchorView2 |
| + View anchorView2 = addAnchorViewTest(containerView, 2); |
| + LayoutParams layoutParams2 = setLayoutParams(containerView, anchorView2, 2, 4); |
| + |
| + // Replace containerView |
| + FrameLayout updatedContainerView = updateContainerView(containerView); |
| + |
| + // Verify that anchor views are transfered in the same order |
| + // and with the same layout params. |
| + assertEquals(0, containerView.getChildCount()); |
| + assertEquals(2, updatedContainerView.getChildCount()); |
| + assertSame(anchorView1, updatedContainerView.getChildAt(0)); |
| + assertTrue(areEqual(layoutParams1, anchorView1.getLayoutParams())); |
| + assertSame(anchorView2, updatedContainerView.getChildAt(1)); |
| + assertTrue(areEqual(layoutParams2, anchorView2.getLayoutParams())); |
| + } |
| + |
| + private View addAnchorViewTest(AwTestContainerView containerView, int expectedCount) { |
| + final ViewAndroidDelegate delegate = |
| + containerView.getAwContents().getContentViewCore().getViewAndroidDelegate(); |
| + View anchorView = ThreadUtils.runOnUiThreadBlockingNoException(new Callable<View>() { |
| + @Override |
| + public View call() { |
| + return delegate.acquireView(); |
| + } |
| + }); |
| + assertEquals(expectedCount, containerView.getChildCount()); |
| + assertSame(anchorView, containerView.getChildAt(expectedCount - 1)); |
| + return anchorView; |
| + } |
| + |
| + private void removeAnchorViewTest(AwTestContainerView containerView, final View anchorView, |
| + int expectedCount) { |
| + final ViewAndroidDelegate delegate = |
| + containerView.getAwContents().getContentViewCore().getViewAndroidDelegate(); |
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| + @Override |
| + public void run() { |
| + delegate.removeView(anchorView); |
| + } |
| + }); |
| + assertEquals(expectedCount, containerView.getChildCount()); |
| + } |
| + |
| + private LayoutParams setLayoutParams(final AwTestContainerView containerView, |
| + final View anchorView, final int coords, final int dimension) { |
| + final ViewAndroidDelegate delegate = |
| + containerView.getAwContents().getContentViewCore().getViewAndroidDelegate(); |
| + final float scale = |
| + (float) DeviceDisplayInfo.create(containerView.getContext()).getDIPScale(); |
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| + @Override |
| + public void run() { |
| + delegate.setViewPosition(anchorView, coords, coords, dimension, dimension, |
| + scale, 10, 10); |
| + } |
| + }); |
| + return anchorView.getLayoutParams(); |
| + } |
| + |
| + private FrameLayout updateContainerView(final AwTestContainerView oldContainerView) |
| + throws InterruptedException { |
| + final FrameLayout containerView = new FrameLayout(getActivity()); |
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| + @Override |
| + public void run() { |
| + getActivity().addView(containerView); |
| + } |
| + }); |
| + |
| + // Waits for the layout of the new container view to be completed so that the anchor |
| + // views can be positioned at the right place. |
| + final Semaphore s = new Semaphore(0); |
| + containerView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { |
| + @Override |
| + public void onGlobalLayout() { |
| + s.release(); |
| + } |
| + }); |
| + assertTrue(s.tryAcquire(WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
| + |
| + final AwViewAndroidDelegate delegate = (AwViewAndroidDelegate) |
| + oldContainerView.getAwContents().getContentViewCore().getViewAndroidDelegate(); |
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| + @Override |
| + public void run() { |
| + delegate.updateCurrentContainerView(containerView); |
| + } |
| + }); |
| + return containerView; |
| + } |
| + |
| + private void verifyAnchorViewCorrectlyTransferred(FrameLayout containerView, View anchorView, |
| + FrameLayout updatedContainerView, LayoutParams expectedParams) { |
| + assertTrue(areEqual(expectedParams, anchorView.getLayoutParams())); |
| + verifyAnchorViewCorrectlyTransferred(containerView, anchorView, updatedContainerView); |
| + } |
| + |
| + private void verifyAnchorViewCorrectlyTransferred(FrameLayout containerView, View anchorView, |
| + FrameLayout updatedContainerView) { |
| + assertEquals(0, containerView.getChildCount()); |
| + assertEquals(1, updatedContainerView.getChildCount()); |
| + assertSame(anchorView, updatedContainerView.getChildAt(0)); |
| + } |
| + |
| + private boolean areEqual(LayoutParams params1, LayoutParams params2) { |
| + return params1.height == params2.height && params1.width == params2.width; |
| + } |
| } |