| Index: android_webview/javatests/src/org/chromium/android_webview/test/AwContentsAnchorViewTest.java
|
| diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsAnchorViewTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsAnchorViewTest.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0e2c68dc738ecc3e537d42cac8f1add663b9c054
|
| --- /dev/null
|
| +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsAnchorViewTest.java
|
| @@ -0,0 +1,186 @@
|
| +// Copyright 2016 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.UiThreadTest;
|
| +import android.test.suitebuilder.annotation.SmallTest;
|
| +import android.view.View;
|
| +import android.view.ViewGroup.LayoutParams;
|
| +import android.widget.FrameLayout;
|
| +
|
| +import org.chromium.android_webview.AwViewAndroidDelegate;
|
| +import org.chromium.base.test.util.Feature;
|
| +import org.chromium.ui.base.ViewAndroidDelegate;
|
| +import org.chromium.ui.gfx.DeviceDisplayInfo;
|
| +
|
| +/**
|
| + * Tests anchor views are correctly added/removed when their container view is updated.
|
| + */
|
| +public class AwContentsAnchorViewTest extends AwTestBase {
|
| +
|
| + private TestAwContentsClient mContentsClient = new TestAwContentsClient();
|
| +
|
| + @Feature({"AndroidWebView"})
|
| + @SmallTest
|
| + @UiThreadTest
|
| + public void testMovedAndRemovedAnchorViewIsNotTransferred() throws Throwable {
|
| + // Add, move and remove anchorView
|
| + AwTestContainerView containerView = createAwTestContainerViewOnMainSync(mContentsClient);
|
| + View anchorView = addAnchorView(containerView);
|
| + setLayoutParams(containerView, anchorView, 1, 2);
|
| + removeAnchorView(containerView, anchorView);
|
| +
|
| + // Replace container view
|
| + FrameLayout updatedContainerView = updateContainerView(containerView);
|
| +
|
| + // Verify that no anchor view is transferred between containerViews
|
| + assertFalse(isViewInContainer(containerView, anchorView));
|
| + assertFalse(isViewInContainer(updatedContainerView, anchorView));
|
| + }
|
| +
|
| + @Feature({"AndroidWebView"})
|
| + @SmallTest
|
| + @UiThreadTest
|
| + public void testTransferAnchorView() throws Throwable {
|
| + // Add anchor view
|
| + AwTestContainerView containerView = createAwTestContainerViewOnMainSync(mContentsClient);
|
| + View anchorView = addAnchorView(containerView);
|
| + LayoutParams layoutParams = anchorView.getLayoutParams();
|
| +
|
| + // Replace container view
|
| + FrameLayout updatedContainerView = updateContainerView(containerView);
|
| + verifyAnchorViewCorrectlyTransferred(
|
| + containerView, anchorView, updatedContainerView, layoutParams);
|
| + }
|
| +
|
| + @Feature({"AndroidWebView"})
|
| + @SmallTest
|
| + @UiThreadTest
|
| + public void testTransferMovedAnchorView() throws Throwable {
|
| + // Add anchor view and move it
|
| + AwTestContainerView containerView = createAwTestContainerViewOnMainSync(mContentsClient);
|
| + View anchorView = addAnchorView(containerView);
|
| + LayoutParams layoutParams = setLayoutParams(containerView, anchorView, 1, 2);
|
| +
|
| + // Replace container view
|
| + FrameLayout updatedContainerView = updateContainerView(containerView);
|
| +
|
| + verifyAnchorViewCorrectlyTransferred(
|
| + containerView, anchorView, updatedContainerView, layoutParams);
|
| + }
|
| +
|
| + @Feature({"AndroidWebView"})
|
| + @SmallTest
|
| + @UiThreadTest
|
| + public void testRemoveTransferedAnchorView() throws Throwable {
|
| + // Add anchor view
|
| + AwTestContainerView containerView = createAwTestContainerViewOnMainSync(mContentsClient);
|
| + View anchorView = addAnchorView(containerView);
|
| +
|
| + // Replace container view
|
| + FrameLayout updatedContainerView = updateContainerView(containerView);
|
| +
|
| + verifyAnchorViewCorrectlyTransferred(containerView, anchorView, updatedContainerView);
|
| +
|
| + // Remove transferred anchor view
|
| + removeAnchorView(containerView, anchorView);
|
| + }
|
| +
|
| + @Feature({"AndroidWebView"})
|
| + @SmallTest
|
| + @UiThreadTest
|
| + public void testMoveTransferedAnchorView() throws Throwable {
|
| + // Add anchor view
|
| + AwTestContainerView containerView = createAwTestContainerViewOnMainSync(mContentsClient);
|
| + View anchorView = addAnchorView(containerView);
|
| + 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)));
|
| + }
|
| +
|
| + @Feature({"AndroidWebView"})
|
| + @SmallTest
|
| + @UiThreadTest
|
| + public void testTransferMultipleMovedAnchorViews() throws Throwable {
|
| + // Add and move anchorView1
|
| + AwTestContainerView containerView = createAwTestContainerViewOnMainSync(mContentsClient);
|
| + View anchorView1 = addAnchorView(containerView);
|
| + LayoutParams layoutParams1 = setLayoutParams(containerView, anchorView1, 1, 2);
|
| +
|
| + // Add and move anchorView2
|
| + View anchorView2 = addAnchorView(containerView);
|
| + LayoutParams layoutParams2 = setLayoutParams(containerView, anchorView2, 2, 4);
|
| +
|
| + // Replace containerView
|
| + FrameLayout updatedContainerView = updateContainerView(containerView);
|
| +
|
| + // Verify that anchor views are transfered with the same layout params.
|
| + assertFalse(isViewInContainer(containerView, anchorView1));
|
| + assertFalse(isViewInContainer(containerView, anchorView2));
|
| + assertTrue(isViewInContainer(updatedContainerView, anchorView1));
|
| + assertTrue(isViewInContainer(updatedContainerView, anchorView2));
|
| + assertTrue(areEqual(layoutParams1, anchorView1.getLayoutParams()));
|
| + assertTrue(areEqual(layoutParams2, anchorView2.getLayoutParams()));
|
| + }
|
| +
|
| + private static View addAnchorView(AwTestContainerView containerView) {
|
| + View anchorView = getViewDelegate(containerView).acquireView();
|
| + assertTrue(isViewInContainer(containerView, anchorView));
|
| + return anchorView;
|
| + }
|
| +
|
| + private static void removeAnchorView(AwTestContainerView containerView, View anchorView) {
|
| + getViewDelegate(containerView).removeView(anchorView);
|
| + assertFalse(isViewInContainer(containerView, anchorView));
|
| + }
|
| +
|
| + private static LayoutParams setLayoutParams(AwTestContainerView containerView, View anchorView,
|
| + int coords, int dimension) {
|
| + ViewAndroidDelegate delegate = getViewDelegate(containerView);
|
| + float scale = (float) DeviceDisplayInfo.create(containerView.getContext()).getDIPScale();
|
| + delegate.setViewPosition(anchorView, coords, coords, dimension, dimension, scale, 10, 10);
|
| + return anchorView.getLayoutParams();
|
| + }
|
| +
|
| + private FrameLayout updateContainerView(AwTestContainerView oldContainerView) {
|
| + FrameLayout containerView = new FrameLayout(getActivity());
|
| + getActivity().addView(containerView);
|
| + AwViewAndroidDelegate delegate = (AwViewAndroidDelegate) getViewDelegate(oldContainerView);
|
| + delegate.updateCurrentContainerView(containerView);
|
| + return containerView;
|
| + }
|
| +
|
| + private static void verifyAnchorViewCorrectlyTransferred(FrameLayout containerView,
|
| + View anchorView, FrameLayout updatedContainerView, LayoutParams expectedParams) {
|
| + assertTrue(areEqual(expectedParams, anchorView.getLayoutParams()));
|
| + verifyAnchorViewCorrectlyTransferred(containerView, anchorView, updatedContainerView);
|
| + }
|
| +
|
| + private static void verifyAnchorViewCorrectlyTransferred(FrameLayout containerView,
|
| + View anchorView, FrameLayout updatedContainerView) {
|
| + assertFalse(isViewInContainer(containerView, anchorView));
|
| + assertTrue(isViewInContainer(updatedContainerView, anchorView));
|
| + assertSame(anchorView, updatedContainerView.getChildAt(0));
|
| + }
|
| +
|
| + private static boolean areEqual(LayoutParams params1, LayoutParams params2) {
|
| + return params1.height == params2.height && params1.width == params2.width;
|
| + }
|
| +
|
| + private static boolean isViewInContainer(FrameLayout containerView, View view) {
|
| + return containerView.indexOfChild(view) != -1;
|
| + }
|
| +
|
| + private static ViewAndroidDelegate getViewDelegate(AwTestContainerView containerView) {
|
| + return containerView.getAwContents().getContentViewCore().getViewAndroidDelegate();
|
| + }
|
| +}
|
|
|