Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2263)

Unified Diff: android_webview/javatests/src/org/chromium/android_webview/test/AwContentsAnchorViewTest.java

Issue 2103243002: Factor out ContentViewAndroidDelegate (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: webview issues addressed Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..e5b0d98a272cea045d71dd6ded202619ceb4cbfe
--- /dev/null
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsAnchorViewTest.java
@@ -0,0 +1,232 @@
+// Copyright 2012 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.suitebuilder.annotation.SmallTest;
+import android.view.View;
+import android.view.ViewGroup.LayoutParams;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+import android.widget.FrameLayout;
+
+import org.chromium.android_webview.AwViewAndroidDelegate;
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.util.Feature;
+import org.chromium.ui.base.ViewAndroidDelegate;
+import org.chromium.ui.gfx.DeviceDisplayInfo;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * AwContents tests.
+ */
+public class AwContentsAnchorViewTest extends AwTestBase {
+
+ private TestAwContentsClient mContentsClient = new TestAwContentsClient();
+
+ @DisableHardwareAccelerationForTest
boliu 2016/07/27 16:20:26 remove DisableHardwareAccelerationForTest and upda
Jinsuk Kim 2016/07/29 06:09:13 Done.
+ @Feature({"AndroidWebView"})
+ @SmallTest
+ public void testMovedAndRemovedAnchorViewIsNotTransferred() throws Throwable {
+ // Add, move and remove anchorView
+ AwTestContainerView containerView = createAwTestContainerViewOnMainSync(mContentsClient);
+ View anchorView = addAnchorView(containerView, 1);
+ setLayoutParams(containerView, anchorView, 1, 2);
+ removeAnchorView(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 = addAnchorView(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 = addAnchorView(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 = addAnchorView(containerView, 1);
+
+ // Replace container view
+ FrameLayout updatedContainerView = updateContainerView(containerView);
+
+ verifyAnchorViewCorrectlyTransferred(containerView, anchorView, updatedContainerView);
+
+ // Remove transferred anchor view
+ removeAnchorView(containerView, anchorView, 0);
+ }
+
+ @DisableHardwareAccelerationForTest
+ @Feature({"AndroidWebView"})
+ @SmallTest
+ public void testMoveTransferedAnchorView() throws Throwable {
+ // Add anchor view
+ AwTestContainerView containerView = createAwTestContainerViewOnMainSync(mContentsClient);
+ View anchorView = addAnchorView(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 = addAnchorView(containerView, 1);
+ LayoutParams layoutParams1 = setLayoutParams(containerView, anchorView1, 1, 2);
+
+ // Add and move anchorView2
+ View anchorView2 = addAnchorView(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 addAnchorView(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 removeAnchorView(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;
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698