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..01bd925734b6d487c18519a82ff63579354e956e 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,11 +17,14 @@ 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.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.AwContentViewAndroidDelegate; |
import org.chromium.android_webview.AwSettings; |
import org.chromium.android_webview.AwSwitches; |
import org.chromium.android_webview.test.TestAwContentsClient.OnDownloadStartHelper; |
@@ -36,6 +39,7 @@ 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 java.io.InputStream; |
import java.net.URL; |
@@ -614,4 +618,159 @@ public class AwContentsTest extends AwTestBase { |
mContentsClient.getOnEvaluateJavaScriptResultHelper(), "21 + 21")); |
} |
+ @DisableHardwareAccelerationForTest |
+ @Feature({"AndroidWebView"}) |
+ @SmallTest |
+ public void testMovedAndRemovedAnchorViewIsNotTransferred() throws Throwable { |
+ // Add, move and remove anchorView |
+ AwTestContainerView containerView = createAwTestContainerViewOnMainSync(mContentsClient); |
+ View anchorView = addAnchorViewTest(containerView, 1, 1f, 2f); |
+ ViewAndroidDelegate delegate = |
+ containerView.getAwContents().getContentViewCore().getViewAndroidDelegate(); |
+ removeAnchorViewTest(containerView, delegate, 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, 1f, 2f); |
+ LayoutParams layoutParams = anchorView.getLayoutParams(); |
+ |
+ // 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 |
+ ViewAndroidDelegate delegate = |
+ containerView.getAwContents().getContentViewCore().getViewAndroidDelegate(); |
+ removeAnchorViewTest(updatedContainerView, delegate, 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); |
+ } |
+ |
+ @DisableHardwareAccelerationForTest |
+ @Feature({"AndroidWebView"}) |
+ @SmallTest |
+ public void testTransferMultipleMovedAnchorViews() throws Throwable { |
+ // Add and move anchorView1 |
+ AwTestContainerView containerView = createAwTestContainerViewOnMainSync(mContentsClient); |
+ View anchorView1 = addAnchorViewTest(containerView, 1, 1f, 2f); |
+ LayoutParams layoutParams1 = anchorView1.getLayoutParams(); |
+ |
+ // Add and move anchorView2 |
+ View anchorView2 = addAnchorViewTest(containerView, 2, 2f, 4f); |
+ LayoutParams layoutParams2 = anchorView2.getLayoutParams(); |
+ |
+ // 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) { |
+ return addAnchorViewTest(containerView, expectedCount, 0.f, 0.f); |
+ } |
+ |
+ private View addAnchorViewTest(AwTestContainerView containerView, int expectedCount, |
+ float coord, float dimen) { |
+ View anchorView = containerView.getAwContents().getContentViewCore().acquireAnchorView(); |
+ containerView.getAwContents().getContentViewCore().getViewAndroidDelegate().setViewPosition( |
+ anchorView, coord, coord, dimen, dimen, 1f, 1, 1); |
+ assertEquals(expectedCount, containerView.getChildCount()); |
+ assertSame(anchorView, containerView.getChildAt(expectedCount - 1)); |
+ return anchorView; |
+ } |
+ |
+ private void removeAnchorViewTest(FrameLayout containerView, ViewAndroidDelegate delegate, |
+ View anchorView1, int expectedCount) { |
+ delegate.removeView(anchorView1); |
+ assertEquals(expectedCount, containerView.getChildCount()); |
+ } |
+ |
+ private FrameLayout updateContainerView(AwTestContainerView containerView) { |
+ FrameLayout updatedContainerView = new FrameLayout(getActivity()); |
+ AwContentViewAndroidDelegate delegate = (AwContentViewAndroidDelegate) |
+ containerView.getAwContents().getContentViewCore().getViewAndroidDelegate(); |
+ delegate.updateCurrentContainerView(updatedContainerView); |
+ return updatedContainerView; |
+ } |
+ |
+ 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; |
+ } |
} |