Index: content/public/android/javatests/src/org/chromium/content/browser/ContentViewCoreViewAndroidDelegateTest.java |
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ContentViewCoreViewAndroidDelegateTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewCoreViewAndroidDelegateTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f803f9ab19ab0c474cd040dc2ba7b1762d07b81e |
--- /dev/null |
+++ b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewCoreViewAndroidDelegateTest.java |
@@ -0,0 +1,223 @@ |
+// Copyright 2014 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.content.browser; |
+ |
+import android.test.suitebuilder.annotation.SmallTest; |
+import android.view.View; |
+import android.view.ViewGroup; |
+import android.view.ViewGroup.LayoutParams; |
+import android.widget.FrameLayout; |
+ |
+import org.chromium.content_shell_apk.ContentShellTestBase; |
+import org.chromium.ui.base.ViewAndroidDelegate; |
+import org.chromium.ui.base.WindowAndroid; |
+ |
+/** |
+ * This suite verifies that when {@link ContentViewCore} replaces container |
+ * views then: |
+ * 1. anchor views are transferred between container views |
+ * 2. and the reference returned by {@link ContentViewCore#getViewAndroidDelegate()} is |
+ * still valid and it will add/remove anchor views from the new container view. |
+ */ |
+public class ContentViewCoreViewAndroidDelegateTest extends ContentShellTestBase { |
+ |
+ private ViewAndroidDelegate mViewAndroidDelegate; |
+ private ContentViewCore mContentViewCore; |
+ private ViewGroup mContainerView; |
+ |
+ @Override |
+ public void setUp() throws Exception { |
+ super.setUp(); |
+ mContentViewCore = new ContentViewCore(getActivity()); |
+ mContainerView = new FrameLayout(getActivity()); |
+ |
+ mContentViewCore.createContentViewAndroidDelegate(); |
+ mContentViewCore.initPopupZoomer(getActivity()); |
+ // This reference never changes during the duration of the tests, |
+ // but can still be used to add/remove anchor views from the |
+ // updated container view. |
+ mViewAndroidDelegate = mContentViewCore.getViewAndroidDelegate(); |
+ mContentViewCore.setContainerView(mContainerView); |
+ } |
+ |
+ @SmallTest |
+ public void testViewAndroidCreatedWithCorrectDelegate() { |
+ mContentViewCore.createViewAndroid( |
+ new WindowAndroid(getActivity().getApplicationContext())); |
+ assertSame(mViewAndroidDelegate, |
+ mContentViewCore.getViewAndroid().getViewAndroidDelegate()); |
+ } |
+ |
+ @SmallTest |
+ public void testAddAndRemoveAnchorViews() { |
+ assertEquals(0, mContainerView.getChildCount()); |
+ |
+ // Add 2 anchor views |
+ View anchorView1 = addAnchorViewTest(mContainerView, 1); |
+ View anchorView2 = addAnchorViewTest(mContainerView, 2); |
+ |
+ // Remove anchorView1 |
+ removeAnchorViewTest(mContainerView, anchorView1, 1); |
+ assertSame(anchorView2, mContainerView.getChildAt(0)); |
+ |
+ // Try to remove anchorView1 again; no-op. |
+ removeAnchorViewTest(mContainerView, anchorView1, 1); |
+ assertSame(anchorView2, mContainerView.getChildAt(0)); |
+ |
+ // Remove anchorView2 |
+ removeAnchorViewTest(mContainerView, anchorView2, 0); |
+ } |
+ |
+ @SmallTest |
+ public void testAddAndMoveAnchorView() { |
+ // Add anchorView and set layout params |
+ View anchorView = addAnchorViewTest(mContainerView, 1); |
+ LayoutParams originalLayoutParams = setLayoutParams(anchorView, 0, 0); |
+ |
+ // Move it |
+ LayoutParams updatedLayoutParams = setLayoutParams(anchorView, 1, 2); |
+ assertEquals(1, mContainerView.getChildCount()); |
+ assertFalse(areEqual(originalLayoutParams, updatedLayoutParams)); |
+ |
+ // Move it back to the original position |
+ updatedLayoutParams = setLayoutParams(anchorView, 0, 0); |
+ assertEquals(1, mContainerView.getChildCount()); |
+ assertTrue(areEqual(originalLayoutParams, updatedLayoutParams)); |
+ } |
+ |
+ @SmallTest |
+ public void testMovedAndRemovedAnchorViewIsNotTransferred() { |
+ // Add, move and remove anchorView |
+ View anchorView = addAnchorViewTest(mContainerView, 1); |
+ setLayoutParams(anchorView, 1, 2); |
+ removeAnchorViewTest(mContainerView, anchorView, 0); |
+ |
+ // Replace container view |
+ FrameLayout updatedContainerView = updateContainerView(); |
+ |
+ // Verify that no anchor view is transferred between containerViews |
+ assertEquals(0, mContainerView.getChildCount()); |
+ assertEquals(0, updatedContainerView.getChildCount()); |
+ } |
+ |
+ @SmallTest |
+ public void testTransferAnchorView() { |
+ // Add anchor view |
+ View anchorView = addAnchorViewTest(mContainerView, 1); |
+ LayoutParams layoutParams = anchorView.getLayoutParams(); |
+ |
+ // Replace container view |
+ FrameLayout updatedContainerView = updateContainerView(); |
+ |
+ verifyAnchorViewCorrectlyTransferred(anchorView, updatedContainerView, layoutParams); |
+ } |
+ |
+ @SmallTest |
+ public void testTransferMovedAnchorView() { |
+ // Add anchor view and move it |
+ View anchorView = addAnchorViewTest(mContainerView, 1); |
+ LayoutParams layoutParams = setLayoutParams(anchorView, 1, 2); |
+ |
+ // Replace container view |
+ FrameLayout updatedContainerView = updateContainerView(); |
+ |
+ verifyAnchorViewCorrectlyTransferred(anchorView, updatedContainerView, layoutParams); |
+ } |
+ |
+ @SmallTest |
+ public void testRemoveTransferedAnchorView() { |
+ // Add anchor view |
+ View anchorView = addAnchorViewTest(mContainerView, 1); |
+ |
+ // Replace container view |
+ FrameLayout updatedContainerView = updateContainerView(); |
+ |
+ verifyAnchorViewCorrectlyTransferred(anchorView, updatedContainerView); |
+ |
+ // Remove transferred anchor view |
+ removeAnchorViewTest(updatedContainerView, anchorView, 0); |
+ } |
+ |
+ @SmallTest |
+ public void testMoveTransferedAnchorView() { |
+ // Add anchor view |
+ View anchorView = addAnchorViewTest(mContainerView, 1); |
+ LayoutParams layoutParams = anchorView.getLayoutParams(); |
+ |
+ // Replace container view |
+ FrameLayout updatedContainerView = updateContainerView(); |
+ |
+ verifyAnchorViewCorrectlyTransferred(anchorView, updatedContainerView, layoutParams); |
+ |
+ // Move transferred anchor view |
+ assertFalse(areEqual(layoutParams, setLayoutParams(anchorView, 1, 2))); |
+ } |
+ |
+ @SmallTest |
+ public void testTransferMultipleMovedAnchorViews() { |
+ // Add and move anchorView1 |
+ View anchorView1 = addAnchorViewTest(mContainerView, 1); |
+ LayoutParams layoutParams1 = setLayoutParams(anchorView1, 1, 2); |
+ |
+ // Add and move anchorView2 |
+ View anchorView2 = addAnchorViewTest(mContainerView, 2); |
+ LayoutParams layoutParams2 = setLayoutParams(anchorView2, 2, 4); |
+ |
+ // Replace containerView |
+ FrameLayout updatedContainerView = updateContainerView(); |
+ |
+ // Verify that anchor views are transfered in the same order |
+ // and with the same layout params. |
+ assertEquals(0, mContainerView.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(ViewGroup containerView, int expectedCount) { |
+ View anchorView = mViewAndroidDelegate.acquireAnchorView(); |
+ assertEquals(expectedCount, containerView.getChildCount()); |
+ assertSame(anchorView, containerView.getChildAt(expectedCount - 1)); |
+ return anchorView; |
+ } |
+ |
+ private void removeAnchorViewTest( |
+ ViewGroup containerView, View anchorView1, int expectedCount) { |
+ mViewAndroidDelegate.releaseAnchorView(anchorView1); |
+ assertEquals(expectedCount, containerView.getChildCount()); |
+ } |
+ |
+ private LayoutParams setLayoutParams(View anchorView, |
+ int coordinatesValue, int dimensionsValue) { |
+ mViewAndroidDelegate.setAnchorViewPosition(anchorView, coordinatesValue, coordinatesValue, |
+ dimensionsValue, dimensionsValue); |
+ return anchorView.getLayoutParams(); |
+ } |
+ |
+ private FrameLayout updateContainerView() { |
+ FrameLayout updatedContainerView = new FrameLayout(getActivity()); |
+ mContentViewCore.setContainerView(updatedContainerView); |
+ return updatedContainerView; |
+ } |
+ |
+ private void verifyAnchorViewCorrectlyTransferred(View anchorView, |
+ FrameLayout updatedContainerView, LayoutParams expectedParams) { |
+ assertTrue(areEqual(expectedParams, anchorView.getLayoutParams())); |
+ verifyAnchorViewCorrectlyTransferred(anchorView, updatedContainerView); |
+ } |
+ |
+ private void verifyAnchorViewCorrectlyTransferred(View anchorView, |
+ FrameLayout updatedContainerView) { |
+ assertEquals(0, mContainerView.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; |
+ } |
+} |