Chromium Code Reviews| Index: android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java |
| diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java |
| index f67a27263ea1230c3ae0952687fae0ef1db43199..0969f20aa46c8a05e38848b43a64a76ba4d3b151 100644 |
| --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java |
| +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java |
| @@ -9,12 +9,9 @@ import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout; |
| import android.app.Instrumentation; |
| import android.content.Context; |
| import android.os.Build; |
| -import android.util.AndroidRuntimeException; |
| -import android.util.Log; |
| import android.view.ViewGroup; |
| import org.chromium.android_webview.AwBrowserContext; |
| -import org.chromium.android_webview.AwBrowserProcess; |
| import org.chromium.android_webview.AwContents; |
| import org.chromium.android_webview.AwContents.DependencyFactory; |
| import org.chromium.android_webview.AwContents.InternalAccessDelegate; |
| @@ -22,18 +19,13 @@ import org.chromium.android_webview.AwContents.NativeDrawGLFunctorFactory; |
| import org.chromium.android_webview.AwContentsClient; |
| import org.chromium.android_webview.AwSettings; |
| import org.chromium.android_webview.AwSwitches; |
| -import org.chromium.android_webview.test.util.GraphicsTestUtils; |
| -import org.chromium.android_webview.test.util.JSUtils; |
| -import org.chromium.base.ThreadUtils; |
| +import org.chromium.android_webview.test.AwTestCommon.AwTestCommonCallback; |
| +import org.chromium.base.Log; |
| import org.chromium.base.test.BaseActivityInstrumentationTestCase; |
| import org.chromium.base.test.util.CallbackHelper; |
| import org.chromium.base.test.util.InMemorySharedPreferences; |
| import org.chromium.base.test.util.MinAndroidSdkLevel; |
| import org.chromium.base.test.util.parameter.CommandLineParameter; |
| -import org.chromium.content.browser.test.util.Criteria; |
| -import org.chromium.content.browser.test.util.CriteriaHelper; |
| -import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageFinishedHelper; |
| -import org.chromium.content_public.browser.LoadUrlParams; |
| import org.chromium.net.test.util.TestWebServer; |
| import java.lang.annotation.Annotation; |
| @@ -41,94 +33,69 @@ import java.lang.reflect.AnnotatedElement; |
| import java.lang.reflect.Method; |
| import java.util.Map; |
| import java.util.concurrent.Callable; |
| -import java.util.concurrent.FutureTask; |
| -import java.util.concurrent.TimeUnit; |
| -import java.util.regex.Matcher; |
| -import java.util.regex.Pattern; |
| /** |
| - * A base class for android_webview tests. WebView only runs on KitKat and later, |
| - * so make sure no one attempts to run the tests on earlier OS releases. |
| - * |
| - * By default, all tests run both in single-process mode, and with sandboxed renderer. |
| - * If a test doesn't yet work with sandboxed renderer, an entire class, or an individual test |
| - * method can be marked for single-process testing only by adding the following annotation: |
| + * A base class for android_webview tests. WebView only runs on KitKat and |
| + * later, so make sure no one attempts to run the tests on earlier OS releases. |
| + * By default, all tests run both in single-process mode, and with sandboxed |
| + * renderer. If a test doesn't yet work with sandboxed renderer, an entire |
| + * class, or an individual test method can be marked for single-process testing |
| + * only by adding the following annotation: |
| * |
| * @SkipCommandLineParameterization |
|
boliu
2017/07/20 21:22:47
fix this comment
the real yoland
2017/07/27 00:29:47
Done
|
| */ |
| @MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT) |
| @CommandLineParameter({"", AwSwitches.WEBVIEW_SANDBOXED_RENDERER}) |
| -public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunnerActivity> { |
| +public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunnerActivity> |
| + implements AwTestCommonCallback { |
| + private static final String TAG = "AwTestBase"; |
| + |
| public static final long WAIT_TIMEOUT_MS = scaleTimeout(15000); |
| + |
| public static final int CHECK_INTERVAL = 100; |
| - private static final String TAG = "AwTestBase"; |
| - private static final Pattern MAYBE_QUOTED_STRING = Pattern.compile("^(\"?)(.*)\\1$"); |
| - // The browser context needs to be a process-wide singleton. |
| - private AwBrowserContext mBrowserContext; |
| + private final AwTestCommon mTestCommon; |
| public AwTestBase() { |
| super(AwTestRunnerActivity.class); |
| + mTestCommon = new AwTestCommon(this); |
| } |
| @Override |
| protected void setUp() throws Exception { |
| - if (needsAwBrowserContextCreated()) { |
| - createAwBrowserContext(); |
| - } |
| - |
| - super.setUp(); |
| - if (needsBrowserProcessStarted()) { |
| - startBrowserProcess(); |
| - } |
| + mTestCommon.setUp(); |
| } |
| protected void createAwBrowserContext() { |
| - if (mBrowserContext != null) { |
| - throw new AndroidRuntimeException("There should only be one browser context."); |
| - } |
| - getActivity(); // The Activity must be launched in order to load native code |
| - final InMemorySharedPreferences prefs = new InMemorySharedPreferences(); |
| - final Context appContext = getInstrumentation().getTargetContext().getApplicationContext(); |
| - getInstrumentation().runOnMainSync(new Runnable() { |
| - @Override |
| - public void run() { |
| - mBrowserContext = createAwBrowserContextOnUiThread(prefs, appContext); |
| - } |
| - }); |
| + mTestCommon.createAwBrowserContext(); |
| } |
| protected AwBrowserContext createAwBrowserContextOnUiThread( |
| InMemorySharedPreferences prefs, Context appContext) { |
| - return new AwBrowserContext(prefs, appContext); |
| + return mTestCommon.createAwBrowserContextOnUiThread(prefs, appContext); |
| } |
| protected void startBrowserProcess() throws Exception { |
| - // The Activity must be launched in order for proper webview statics to be setup. |
| - getActivity(); |
| - getInstrumentation().runOnMainSync(new Runnable() { |
| - @Override |
| - public void run() { |
| - AwBrowserProcess.start(); |
| - } |
| - }); |
| + mTestCommon.startBrowserProcess(); |
| } |
| /** |
| - * Override this to return false if the test doesn't want to create an AwBrowserContext |
| - * automatically. |
| + * Override this to return false if the test doesn't want to create an |
| + * AwBrowserContext automatically. |
| */ |
| protected boolean needsAwBrowserContextCreated() { |
| - return true; |
| + return mTestCommon.needsAwBrowserContextCreated(); |
| } |
| /** |
| - * Override this to return false if the test doesn't want the browser startup sequence to |
| - * be run automatically. |
| - * @return Whether the instrumentation test requires the browser process to already be started. |
| + * Override this to return false if the test doesn't want the browser |
| + * startup sequence to be run automatically. |
| + * |
| + * @return Whether the instrumentation test requires the browser process to |
| + * already be started. |
| */ |
| protected boolean needsBrowserProcessStarted() { |
| - return true; |
| + return mTestCommon.needsBrowserProcessStarted(); |
| } |
| /** |
| @@ -141,28 +108,16 @@ public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunner |
| */ |
| public <R> R runTestOnUiThreadAndGetResult(Callable<R> callable) |
| throws Exception { |
| - FutureTask<R> task = new FutureTask<R>(callable); |
| - getInstrumentation().runOnMainSync(task); |
| - return task.get(); |
| + return mTestCommon.runTestOnUiThreadAndGetResult(callable); |
| } |
| public void enableJavaScriptOnUiThread(final AwContents awContents) { |
| - getInstrumentation().runOnMainSync(new Runnable() { |
| - @Override |
| - public void run() { |
| - awContents.getSettings().setJavaScriptEnabled(true); |
| - } |
| - }); |
| + mTestCommon.enableJavaScriptOnUiThread(awContents); |
| } |
| public void setNetworkAvailableOnUiThread(final AwContents awContents, |
| final boolean networkUp) { |
| - getInstrumentation().runOnMainSync(new Runnable() { |
| - @Override |
| - public void run() { |
| - awContents.setNetworkAvailable(networkUp); |
| - } |
| - }); |
| + mTestCommon.setNetworkAvailableOnUiThread(awContents, networkUp); |
| } |
| /** |
| @@ -171,30 +126,22 @@ public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunner |
| public void loadUrlSync(final AwContents awContents, |
| CallbackHelper onPageFinishedHelper, |
| final String url) throws Exception { |
| - loadUrlSync(awContents, onPageFinishedHelper, url, null); |
| + mTestCommon.loadUrlSync(awContents, onPageFinishedHelper, url); |
| } |
| public void loadUrlSync(final AwContents awContents, |
| CallbackHelper onPageFinishedHelper, |
| final String url, |
| final Map<String, String> extraHeaders) throws Exception { |
| - int currentCallCount = onPageFinishedHelper.getCallCount(); |
| - loadUrlAsync(awContents, url, extraHeaders); |
| - onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS, |
| - TimeUnit.MILLISECONDS); |
| + mTestCommon.loadUrlSync(awContents, onPageFinishedHelper, url, extraHeaders); |
| } |
| public void loadUrlSyncAndExpectError(final AwContents awContents, |
| CallbackHelper onPageFinishedHelper, |
| CallbackHelper onReceivedErrorHelper, |
| final String url) throws Exception { |
| - int onErrorCallCount = onReceivedErrorHelper.getCallCount(); |
| - int onFinishedCallCount = onPageFinishedHelper.getCallCount(); |
| - loadUrlAsync(awContents, url); |
| - onReceivedErrorHelper.waitForCallback(onErrorCallCount, 1, WAIT_TIMEOUT_MS, |
| - TimeUnit.MILLISECONDS); |
| - onPageFinishedHelper.waitForCallback(onFinishedCallCount, 1, WAIT_TIMEOUT_MS, |
| - TimeUnit.MILLISECONDS); |
| + mTestCommon.loadUrlSyncAndExpectError( |
| + awContents, onPageFinishedHelper, onReceivedErrorHelper, url); |
| } |
| /** |
| @@ -202,18 +149,13 @@ public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunner |
| */ |
| public void loadUrlAsync(final AwContents awContents, |
| final String url) throws Exception { |
| - loadUrlAsync(awContents, url, null); |
| + mTestCommon.loadUrlAsync(awContents, url); |
| } |
| public void loadUrlAsync(final AwContents awContents, |
| final String url, |
| final Map<String, String> extraHeaders) { |
| - getInstrumentation().runOnMainSync(new Runnable() { |
| - @Override |
| - public void run() { |
| - awContents.loadUrl(url, extraHeaders); |
| - } |
| - }); |
| + mTestCommon.loadUrlAsync(awContents, url, extraHeaders); |
| } |
| /** |
| @@ -222,10 +164,7 @@ public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunner |
| public void postUrlSync(final AwContents awContents, |
| CallbackHelper onPageFinishedHelper, final String url, |
| byte[] postData) throws Exception { |
| - int currentCallCount = onPageFinishedHelper.getCallCount(); |
| - postUrlAsync(awContents, url, postData); |
| - onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS, |
| - TimeUnit.MILLISECONDS); |
| + mTestCommon.postUrlSync(awContents, onPageFinishedHelper, url, postData); |
| } |
| /** |
| @@ -233,17 +172,7 @@ public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunner |
| */ |
| public void postUrlAsync(final AwContents awContents, |
| final String url, byte[] postData) throws Exception { |
| - class PostUrl implements Runnable { |
| - byte[] mPostData; |
| - public PostUrl(byte[] postData) { |
| - mPostData = postData; |
| - } |
| - @Override |
| - public void run() { |
| - awContents.postUrl(url, mPostData); |
| - } |
| - } |
| - getInstrumentation().runOnMainSync(new PostUrl(postData)); |
| + mTestCommon.postUrlAsync(awContents, url, postData); |
| } |
| /** |
| @@ -253,10 +182,7 @@ public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunner |
| CallbackHelper onPageFinishedHelper, |
| final String data, final String mimeType, |
| final boolean isBase64Encoded) throws Exception { |
| - int currentCallCount = onPageFinishedHelper.getCallCount(); |
| - loadDataAsync(awContents, data, mimeType, isBase64Encoded); |
| - onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS, |
| - TimeUnit.MILLISECONDS); |
| + mTestCommon.loadDataSync(awContents, onPageFinishedHelper, data, mimeType, isBase64Encoded); |
| } |
| public void loadDataSyncWithCharset(final AwContents awContents, |
| @@ -264,16 +190,8 @@ public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunner |
| final String data, final String mimeType, |
| final boolean isBase64Encoded, final String charset) |
| throws Exception { |
| - int currentCallCount = onPageFinishedHelper.getCallCount(); |
| - getInstrumentation().runOnMainSync(new Runnable() { |
| - @Override |
| - public void run() { |
| - awContents.loadUrl(LoadUrlParams.createLoadDataParams( |
| - data, mimeType, isBase64Encoded, charset)); |
| - } |
| - }); |
| - onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS, |
| - TimeUnit.MILLISECONDS); |
| + mTestCommon.loadDataSyncWithCharset( |
| + awContents, onPageFinishedHelper, data, mimeType, isBase64Encoded, charset); |
| } |
| /** |
| @@ -282,34 +200,22 @@ public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunner |
| public void loadDataAsync(final AwContents awContents, final String data, |
| final String mimeType, final boolean isBase64Encoded) |
| throws Exception { |
| - getInstrumentation().runOnMainSync(new Runnable() { |
| - @Override |
| - public void run() { |
| - awContents.loadData(data, mimeType, isBase64Encoded ? "base64" : null); |
| - } |
| - }); |
| + mTestCommon.loadDataAsync(awContents, data, mimeType, isBase64Encoded); |
| } |
| public void loadDataWithBaseUrlSync(final AwContents awContents, |
| CallbackHelper onPageFinishedHelper, final String data, final String mimeType, |
| final boolean isBase64Encoded, final String baseUrl, |
| final String historyUrl) throws Throwable { |
| - int currentCallCount = onPageFinishedHelper.getCallCount(); |
| - loadDataWithBaseUrlAsync(awContents, data, mimeType, isBase64Encoded, baseUrl, historyUrl); |
| - onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS, |
| - TimeUnit.MILLISECONDS); |
| + mTestCommon.loadDataWithBaseUrlSync(awContents, onPageFinishedHelper, data, mimeType, |
| + isBase64Encoded, baseUrl, historyUrl); |
| } |
| public void loadDataWithBaseUrlAsync(final AwContents awContents, |
| final String data, final String mimeType, final boolean isBase64Encoded, |
| final String baseUrl, final String historyUrl) throws Throwable { |
| - runTestOnUiThread(new Runnable() { |
| - @Override |
| - public void run() { |
| - awContents.loadDataWithBaseURL( |
| - baseUrl, data, mimeType, isBase64Encoded ? "base64" : null, historyUrl); |
| - } |
| - }); |
| + mTestCommon.loadDataWithBaseUrlAsync( |
| + awContents, data, mimeType, isBase64Encoded, baseUrl, historyUrl); |
| } |
| /** |
| @@ -317,244 +223,115 @@ public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunner |
| */ |
| public void reloadSync(final AwContents awContents, |
| CallbackHelper onPageFinishedHelper) throws Exception { |
| - int currentCallCount = onPageFinishedHelper.getCallCount(); |
| - getInstrumentation().runOnMainSync(new Runnable() { |
| - @Override |
| - public void run() { |
| - awContents.getNavigationController().reload(true); |
| - } |
| - }); |
| - onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS, |
| - TimeUnit.MILLISECONDS); |
| + mTestCommon.reloadSync(awContents, onPageFinishedHelper); |
| } |
| /** |
| * Stops loading on the UI thread. |
| */ |
| public void stopLoading(final AwContents awContents) { |
| - getInstrumentation().runOnMainSync(new Runnable() { |
| - @Override |
| - public void run() { |
| - awContents.stopLoading(); |
| - } |
| - }); |
| + mTestCommon.stopLoading(awContents); |
| } |
| public void waitForVisualStateCallback(final AwContents awContents) throws Exception { |
| - final CallbackHelper ch = new CallbackHelper(); |
| - final int chCount = ch.getCallCount(); |
| - getInstrumentation().runOnMainSync(new Runnable() { |
| - @Override |
| - public void run() { |
| - final long requestId = 666; |
| - awContents.insertVisualStateCallback(requestId, |
| - new AwContents.VisualStateCallback() { |
| - @Override |
| - public void onComplete(long id) { |
| - assertEquals(requestId, id); |
| - ch.notifyCalled(); |
| - } |
| - }); |
| - } |
| - }); |
| - ch.waitForCallback(chCount); |
| + mTestCommon.waitForVisualStateCallback(awContents); |
| } |
| public void insertVisualStateCallbackOnUIThread(final AwContents awContents, |
| final long requestId, final AwContents.VisualStateCallback callback) { |
| - getInstrumentation().runOnMainSync(new Runnable() { |
| - @Override |
| - public void run() { |
| - awContents.insertVisualStateCallback(requestId, callback); |
| - } |
| - }); |
| + mTestCommon.insertVisualStateCallbackOnUIThread(awContents, requestId, callback); |
| } |
| - // Waits for the pixel at the center of AwContents to color up into expectedColor. |
| - // Note that this is a stricter condition that waiting for a visual state callback, |
| - // as visual state callback only indicates that *something* has appeared in WebView. |
| + // Waits for the pixel at the center of AwContents to color up into |
| + // expectedColor. |
| + // Note that this is a stricter condition that waiting for a visual state |
| + // callback, |
| + // as visual state callback only indicates that *something* has appeared in |
| + // WebView. |
| public void waitForPixelColorAtCenterOfView(final AwContents awContents, |
| final AwTestContainerView testContainerView, final int expectedColor) throws Exception { |
| - pollUiThread(new Callable<Boolean>() { |
| - @Override |
| - public Boolean call() throws Exception { |
| - return GraphicsTestUtils.getPixelColorAtCenterOfView(awContents, testContainerView) |
| - == expectedColor; |
| - } |
| - }); |
| - } |
| - |
| - /** |
| - * Checks the current test has |clazz| annotation. Note this swallows NoSuchMethodException |
| - * and returns false in that case. |
| - */ |
| - private boolean testMethodHasAnnotation(Class<? extends Annotation> clazz) { |
| - String testName = getName(); |
| - Method method = null; |
| - try { |
| - method = getClass().getMethod(testName); |
| - } catch (NoSuchMethodException e) { |
| - Log.w(TAG, "Test method name not found.", e); |
| - return false; |
| - } |
| - |
| - // Cast to AnnotatedElement to work around a compilation failure. |
| - // Method.isAnnotationPresent() was removed in Java 8 (which is used by the Android N SDK), |
| - // so compilation with Java 7 fails. See crbug.com/608792. |
| - return ((AnnotatedElement) method).isAnnotationPresent(clazz); |
| - } |
| - |
| - /** |
| - * Factory class used in creation of test AwContents instances. |
| - * |
| - * Test cases can provide subclass instances to the createAwTest* methods in order to create an |
| - * AwContents instance with injected test dependencies. |
| - */ |
| - public static class TestDependencyFactory extends AwContents.DependencyFactory { |
| - public AwTestContainerView createAwTestContainerView(AwTestRunnerActivity activity, |
| - boolean allowHardwareAcceleration) { |
| - return new AwTestContainerView(activity, allowHardwareAcceleration); |
| - } |
| - public AwSettings createAwSettings(Context context, boolean supportsLegacyQuirks) { |
| - return new AwSettings(context, false /* isAccessFromFileURLsGrantedByDefault */, |
| - supportsLegacyQuirks, false /* allowEmptyDocumentPersistence */, |
| - true /* allowGeolocationOnInsecureOrigins */, |
| - false /* doNotUpdateSelectionOnMutatingSelectionRange */); |
| - } |
| - |
| - public AwContents createAwContents(AwBrowserContext browserContext, ViewGroup containerView, |
| - Context context, InternalAccessDelegate internalAccessAdapter, |
| - NativeDrawGLFunctorFactory nativeDrawGLFunctorFactory, |
| - AwContentsClient contentsClient, AwSettings settings, |
| - DependencyFactory dependencyFactory) { |
| - return new AwContents(browserContext, containerView, context, internalAccessAdapter, |
| - nativeDrawGLFunctorFactory, contentsClient, settings, dependencyFactory); |
| - } |
| + mTestCommon.waitForPixelColorAtCenterOfView(awContents, testContainerView, expectedColor); |
| } |
| protected TestDependencyFactory createTestDependencyFactory() { |
| - return new TestDependencyFactory(); |
| + return mTestCommon.createTestDependencyFactory(); |
| } |
| public AwTestContainerView createAwTestContainerView( |
| final AwContentsClient awContentsClient) { |
| - return createAwTestContainerView(awContentsClient, false, null); |
| + return mTestCommon.createAwTestContainerView(awContentsClient); |
| } |
| public AwTestContainerView createAwTestContainerView(final AwContentsClient awContentsClient, |
| boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) { |
| - AwTestContainerView testContainerView = createDetachedAwTestContainerView( |
| + return mTestCommon.createAwTestContainerView( |
| awContentsClient, supportsLegacyQuirks, testDependencyFactory); |
| - getActivity().addView(testContainerView); |
| - testContainerView.requestFocus(); |
| - return testContainerView; |
| } |
| public AwBrowserContext getAwBrowserContext() { |
| - return mBrowserContext; |
| + return mTestCommon.getAwBrowserContext(); |
| } |
| public AwTestContainerView createDetachedAwTestContainerView( |
| final AwContentsClient awContentsClient) { |
| - return createDetachedAwTestContainerView(awContentsClient, false, null); |
| + return mTestCommon.createDetachedAwTestContainerView(awContentsClient); |
| } |
| public AwTestContainerView createDetachedAwTestContainerView( |
| final AwContentsClient awContentsClient, boolean supportsLegacyQuirks, |
| TestDependencyFactory testDependencyFactory) { |
| - if (testDependencyFactory == null) { |
| - testDependencyFactory = createTestDependencyFactory(); |
| - } |
| - boolean allowHardwareAcceleration = isHardwareAcceleratedTest(); |
| - final AwTestContainerView testContainerView = |
| - testDependencyFactory.createAwTestContainerView( |
| - getActivity(), allowHardwareAcceleration); |
| - |
| - AwSettings awSettings = |
| - testDependencyFactory.createAwSettings(getActivity(), supportsLegacyQuirks); |
| - AwContents awContents = testDependencyFactory.createAwContents(mBrowserContext, |
| - testContainerView, testContainerView.getContext(), |
| - testContainerView.getInternalAccessDelegate(), |
| - testContainerView.getNativeDrawGLFunctorFactory(), awContentsClient, awSettings, |
| - testDependencyFactory); |
| - testContainerView.initialize(awContents); |
| - return testContainerView; |
| + return mTestCommon.createDetachedAwTestContainerView( |
| + awContentsClient, supportsLegacyQuirks, testDependencyFactory); |
| } |
| protected boolean isHardwareAcceleratedTest() { |
| - return !testMethodHasAnnotation(DisableHardwareAccelerationForTest.class); |
| + return mTestCommon.isHardwareAcceleratedTest(); |
| } |
| public AwTestContainerView createAwTestContainerViewOnMainSync( |
| final AwContentsClient client) throws Exception { |
| - return createAwTestContainerViewOnMainSync(client, false, null); |
| + return mTestCommon.createAwTestContainerViewOnMainSync(client); |
| } |
| public AwTestContainerView createAwTestContainerViewOnMainSync( |
| final AwContentsClient client, final boolean supportsLegacyQuirks) { |
| - return createAwTestContainerViewOnMainSync(client, supportsLegacyQuirks, null); |
| + return mTestCommon.createAwTestContainerViewOnMainSync(client, supportsLegacyQuirks); |
| } |
| public AwTestContainerView createAwTestContainerViewOnMainSync(final AwContentsClient client, |
| final boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) { |
| - return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<AwTestContainerView>() { |
| - @Override |
| - public AwTestContainerView call() { |
| - return createAwTestContainerView( |
| - client, supportsLegacyQuirks, testDependencyFactory); |
| - } |
| - }); |
| + return mTestCommon.createAwTestContainerViewOnMainSync( |
| + client, supportsLegacyQuirks, testDependencyFactory); |
| } |
| public void destroyAwContentsOnMainSync(final AwContents awContents) { |
| - if (awContents == null) return; |
| - getInstrumentation().runOnMainSync(new Runnable() { |
| - @Override |
| - public void run() { |
| - awContents.destroy(); |
| - } |
| - }); |
| + mTestCommon.destroyAwContentsOnMainSync(awContents); |
| } |
| public String getTitleOnUiThread(final AwContents awContents) throws Exception { |
| - return runTestOnUiThreadAndGetResult(new Callable<String>() { |
| - @Override |
| - public String call() throws Exception { |
| - return awContents.getTitle(); |
| - } |
| - }); |
| + return mTestCommon.getTitleOnUiThread(awContents); |
| } |
| public AwSettings getAwSettingsOnUiThread( |
| final AwContents awContents) throws Exception { |
| - return runTestOnUiThreadAndGetResult(new Callable<AwSettings>() { |
| - @Override |
| - public AwSettings call() throws Exception { |
| - return awContents.getSettings(); |
| - } |
| - }); |
| + return mTestCommon.getAwSettingsOnUiThread(awContents); |
| } |
| /** |
| - * Verify double quotes in both sides of the raw string. Strip the double quotes and |
| - * returns rest of the string. |
| + * Verify double quotes in both sides of the raw string. Strip the double |
| + * quotes and returns rest of the string. |
| */ |
| protected String maybeStripDoubleQuotes(String raw) { |
| - assertNotNull(raw); |
| - Matcher m = MAYBE_QUOTED_STRING.matcher(raw); |
| - assertTrue(m.matches()); |
| - return m.group(2); |
| + return mTestCommon.maybeStripDoubleQuotes(raw); |
| } |
| /** |
| - * Executes the given snippet of JavaScript code within the given ContentView. Returns the |
| - * result of its execution in JSON format. |
| + * Executes the given snippet of JavaScript code within the given |
| + * ContentView. Returns the result of its execution in JSON format. |
| */ |
| public String executeJavaScriptAndWaitForResult(final AwContents awContents, |
| TestAwContentsClient viewClient, final String code) throws Exception { |
| - return JSUtils.executeJavaScriptAndWaitForResult(this, awContents, |
| - viewClient.getOnEvaluateJavaScriptResultHelper(), |
| - code); |
| + return mTestCommon.executeJavaScriptAndWaitForResult(awContents, viewClient, code); |
| } |
| /** |
| @@ -563,9 +340,7 @@ public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunner |
| */ |
| protected String getJavaScriptResultBodyTextContent( |
| final AwContents awContents, final TestAwContentsClient viewClient) throws Exception { |
| - String raw = executeJavaScriptAndWaitForResult( |
| - awContents, viewClient, "document.body.textContent"); |
| - return maybeStripDoubleQuotes(raw); |
| + return mTestCommon.getJavaScriptResultBodyTextContent(awContents, viewClient); |
| } |
| /** |
| @@ -574,101 +349,57 @@ public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunner |
| */ |
| public static void pollInstrumentationThread(final Callable<Boolean> callable) |
| throws Exception { |
| - CriteriaHelper.pollInstrumentationThread(new Criteria() { |
| - @Override |
| - public boolean isSatisfied() { |
| - try { |
| - return callable.call(); |
| - } catch (Throwable e) { |
| - Log.e(TAG, "Exception while polling.", e); |
| - return false; |
| - } |
| - } |
| - }, WAIT_TIMEOUT_MS, CHECK_INTERVAL); |
| + AwTestCommon.pollInstrumentationThread(callable); |
| } |
| /** |
| - * Wrapper around {@link AwTestBase#poll()} but runs the callable on the UI thread. |
| + * Wrapper around {@link AwTestBase#poll()} but runs the callable on the UI |
| + * thread. |
| */ |
| public void pollUiThread(final Callable<Boolean> callable) throws Exception { |
| - pollInstrumentationThread(new Callable<Boolean>() { |
| - @Override |
| - public Boolean call() throws Exception { |
| - return runTestOnUiThreadAndGetResult(callable); |
| - } |
| - }); |
| + mTestCommon.pollUiThread(callable); |
| } |
| /** |
| - * Clears the resource cache. Note that the cache is per-application, so this will clear the |
| - * cache for all WebViews used. |
| + * Clears the resource cache. Note that the cache is per-application, so |
| + * this will clear the cache for all WebViews used. |
| */ |
| public void clearCacheOnUiThread( |
| final AwContents awContents, |
| final boolean includeDiskFiles) throws Exception { |
| - getInstrumentation().runOnMainSync(new Runnable() { |
| - @Override |
| - public void run() { |
| - awContents.clearCache(includeDiskFiles); |
| - } |
| - }); |
| + mTestCommon.clearCacheOnUiThread(awContents, includeDiskFiles); |
| } |
| /** |
| * Returns pure page scale. |
| */ |
| public float getScaleOnUiThread(final AwContents awContents) throws Exception { |
| - return runTestOnUiThreadAndGetResult(new Callable<Float>() { |
| - @Override |
| - public Float call() throws Exception { |
| - return awContents.getPageScaleFactor(); |
| - } |
| - }); |
| + return mTestCommon.getScaleOnUiThread(awContents); |
| } |
| /** |
| * Returns page scale multiplied by the screen density. |
| */ |
| public float getPixelScaleOnUiThread(final AwContents awContents) throws Exception { |
| - return runTestOnUiThreadAndGetResult(new Callable<Float>() { |
| - @Override |
| - public Float call() throws Exception { |
| - return awContents.getScale(); |
| - } |
| - }); |
| + return mTestCommon.getPixelScaleOnUiThread(awContents); |
| } |
| /** |
| * Returns whether a user can zoom the page in. |
| */ |
| public boolean canZoomInOnUiThread(final AwContents awContents) throws Exception { |
| - return runTestOnUiThreadAndGetResult(new Callable<Boolean>() { |
| - @Override |
| - public Boolean call() throws Exception { |
| - return awContents.canZoomIn(); |
| - } |
| - }); |
| + return mTestCommon.canZoomInOnUiThread(awContents); |
| } |
| /** |
| * Returns whether a user can zoom the page out. |
| */ |
| public boolean canZoomOutOnUiThread(final AwContents awContents) throws Exception { |
| - return runTestOnUiThreadAndGetResult(new Callable<Boolean>() { |
| - @Override |
| - public Boolean call() throws Exception { |
| - return awContents.canZoomOut(); |
| - } |
| - }); |
| + return mTestCommon.canZoomOutOnUiThread(awContents); |
| } |
| public void killRenderProcessOnUiThreadAsync(final AwContents awContents) throws Exception { |
| - getInstrumentation().runOnMainSync(new Runnable() { |
| - @Override |
| - public void run() { |
| - awContents.killRenderProcess(); |
| - } |
| - }); |
| + mTestCommon.killRenderProcessOnUiThreadAsync(awContents); |
| } |
| /** |
| @@ -678,31 +409,44 @@ public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunner |
| TestAwContentsClient parentAwContentsClient, TestWebServer testWebServer, |
| String mainHtml, String popupHtml, String popupPath, String triggerScript) |
| throws Exception { |
| - enableJavaScriptOnUiThread(parentAwContents); |
| - getInstrumentation().runOnMainSync(new Runnable() { |
| - @Override |
| - public void run() { |
| - parentAwContents.getSettings().setSupportMultipleWindows(true); |
| - parentAwContents.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); |
| - } |
| - }); |
| - |
| - final String parentUrl = testWebServer.setResponse("/popupParent.html", mainHtml, null); |
| - if (popupHtml != null) { |
| - testWebServer.setResponse(popupPath, popupHtml, null); |
| - } else { |
| - testWebServer.setResponseWithNoContentStatus(popupPath); |
| + mTestCommon.triggerPopup(parentAwContents, parentAwContentsClient, testWebServer, mainHtml, |
| + popupHtml, popupPath, triggerScript); |
| + } |
| + |
| + /** |
| + * Supplies the popup window with AwContents then waits for the popup window |
| + * to finish loading. |
| + */ |
| + public PopupInfo connectPendingPopup(final AwContents parentAwContents) throws Exception { |
| + return mTestCommon.connectPendingPopup(parentAwContents); |
| + } |
| + |
| + /** |
| + * Factory class used in creation of test AwContents instances. Test cases |
| + * can provide subclass instances to the createAwTest* methods in order to |
| + * create an AwContents instance with injected test dependencies. |
| + */ |
| + public static class TestDependencyFactory extends AwContents.DependencyFactory { |
| + public AwTestContainerView createAwTestContainerView( |
| + AwTestRunnerActivity activity, boolean allowHardwareAcceleration) { |
| + return new AwTestContainerView(activity, allowHardwareAcceleration); |
| } |
| - parentAwContentsClient.getOnCreateWindowHelper().setReturnValue(true); |
| - loadUrlSync(parentAwContents, parentAwContentsClient.getOnPageFinishedHelper(), parentUrl); |
| + public AwSettings createAwSettings(Context context, boolean supportsLegacyQuirks) { |
| + return new AwSettings(context, false /* isAccessFromFileURLsGrantedByDefault */, |
| + supportsLegacyQuirks, false /* allowEmptyDocumentPersistence */, |
| + true /* allowGeolocationOnInsecureOrigins */, |
| + false /* doNotUpdateSelectionOnMutatingSelectionRange */); |
| + } |
| - TestAwContentsClient.OnCreateWindowHelper onCreateWindowHelper = |
| - parentAwContentsClient.getOnCreateWindowHelper(); |
| - int currentCallCount = onCreateWindowHelper.getCallCount(); |
| - parentAwContents.evaluateJavaScriptForTests(triggerScript, null); |
| - onCreateWindowHelper.waitForCallback( |
| - currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); |
| + public AwContents createAwContents(AwBrowserContext browserContext, ViewGroup containerView, |
| + Context context, InternalAccessDelegate internalAccessAdapter, |
| + NativeDrawGLFunctorFactory nativeDrawGLFunctorFactory, |
| + AwContentsClient contentsClient, AwSettings settings, |
| + DependencyFactory dependencyFactory) { |
| + return new AwContents(browserContext, containerView, context, internalAccessAdapter, |
| + nativeDrawGLFunctorFactory, contentsClient, settings, dependencyFactory); |
| + } |
| } |
| /** |
| @@ -712,6 +456,7 @@ public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunner |
| public final TestAwContentsClient popupContentsClient; |
| public final AwTestContainerView popupContainerView; |
| public final AwContents popupContents; |
| + |
| public PopupInfo(TestAwContentsClient popupContentsClient, |
| AwTestContainerView popupContainerView, AwContents popupContents) { |
| this.popupContentsClient = popupContentsClient; |
| @@ -721,35 +466,29 @@ public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunner |
| } |
| /** |
| - * Supplies the popup window with AwContents then waits for the popup window to finish loading. |
| + * Checks the current test has |clazz| annotation. Note this swallows |
| + * NoSuchMethodException and returns false in that case. |
| */ |
| - public PopupInfo connectPendingPopup(final AwContents parentAwContents) throws Exception { |
| - TestAwContentsClient popupContentsClient; |
| - AwTestContainerView popupContainerView; |
| - final AwContents popupContents; |
| - popupContentsClient = new TestAwContentsClient(); |
| - popupContainerView = createAwTestContainerViewOnMainSync(popupContentsClient); |
| - popupContents = popupContainerView.getAwContents(); |
| - enableJavaScriptOnUiThread(popupContents); |
| - |
| - getInstrumentation().runOnMainSync(new Runnable() { |
| - @Override |
| - public void run() { |
| - parentAwContents.supplyContentsForPopup(popupContents); |
| - } |
| - }); |
| - |
| - OnPageFinishedHelper onPageFinishedHelper = popupContentsClient.getOnPageFinishedHelper(); |
| - int finishCallCount = onPageFinishedHelper.getCallCount(); |
| - TestAwContentsClient.OnReceivedTitleHelper onReceivedTitleHelper = |
| - popupContentsClient.getOnReceivedTitleHelper(); |
| - int titleCallCount = onReceivedTitleHelper.getCallCount(); |
| - |
| - onPageFinishedHelper.waitForCallback(finishCallCount, 1, WAIT_TIMEOUT_MS, |
| - TimeUnit.MILLISECONDS); |
| - onReceivedTitleHelper.waitForCallback(titleCallCount, 1, WAIT_TIMEOUT_MS, |
| - TimeUnit.MILLISECONDS); |
| - |
| - return new PopupInfo(popupContentsClient, popupContainerView, popupContents); |
| + @Override |
| + public boolean testMethodHasAnnotation(Class<? extends Annotation> clazz) { |
| + String testName = getName(); |
| + Method method = null; |
| + try { |
| + method = getClass().getMethod(testName); |
| + } catch (NoSuchMethodException e) { |
| + Log.w(TAG, "Test method name not found.", e); |
| + return false; |
| + } |
| + |
| + // Cast to AnnotatedElement to work around a compilation failure. |
| + // Method.isAnnotationPresent() was removed in Java 8 (which is used by |
| + // the Android N SDK), |
| + // so compilation with Java 7 fails. See crbug.com/608792. |
| + return ((AnnotatedElement) method).isAnnotationPresent(clazz); |
| + } |
| + |
| + @Override |
| + public void runOnUiThread(Runnable runnable) { |
| + getInstrumentation().runOnMainSync(runnable); |
| } |
| } |