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; |
+ } |
} |