Chromium Code Reviews| Index: android_webview/javatests/src/org/chromium/android_webview/test/GeolocationTest.java |
| diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/GeolocationTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/GeolocationTest.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..526d4bef6e18b123f9ab6f1f335554a6c48f1999 |
| --- /dev/null |
| +++ b/android_webview/javatests/src/org/chromium/android_webview/test/GeolocationTest.java |
| @@ -0,0 +1,266 @@ |
| +// Copyright (c) 2013 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.content.Context; |
| +import android.test.suitebuilder.annotation.SmallTest; |
| +import android.os.SystemClock; |
| +import android.webkit.GeolocationPermissions; |
| + |
| +import org.chromium.android_webview.AwContents; |
| +import org.chromium.base.test.util.Feature; |
| +import org.chromium.content.browser.LocationProviderFactory; |
| +import org.chromium.content.browser.test.util.Criteria; |
| +import org.chromium.content.browser.test.util.CriteriaHelper; |
| +import org.chromium.content.browser.test.util.MockLocationProvider; |
| + |
| +import java.util.List; |
| + |
| +public class GeolocationTest extends AwTestBase { |
| + |
| + private static final long TEST_TIMEOUT = 20000L; |
|
bulach
2013/12/11 15:48:39
nit: looks huge! would 5secs work? also, "_MS" her
benm (inactive)
2013/12/11 20:08:51
Done.
|
| + private static final int CHECK_INTERVAL = 100; |
| + |
| + private TestAwContentsClient mContentsClient; |
| + private AwContents mAwContents; |
| + private MockLocationProvider mMockLocationProvider; |
| + |
| + private static final String RAW_HTML = |
| + "<!DOCTYPE html>\n" + |
| + "<html>\n" + |
| + " <head>\n" + |
| + " <title>Geolocation</title>\n" + |
| + " <script>\n" + |
| + " var positionCount = 0;\n" + |
| + " function gotPos(position) {\n" + |
| + " positionCount++;\n" + |
| + " }\n" + |
| + " function initiate_getCurrentPosition() {\n" + |
| + " navigator.geolocation.getCurrentPosition(\n" + |
| + " gotPos, function() { }, { });\n" + |
| + " }\n" + |
| + " function initiate_watchPosition() {\n" + |
| + " navigator.geolocation.watchPosition(\n" + |
| + " gotPos, function() { }, { });\n" + |
| + " }\n" + |
| + " </script>\n" + |
| + " </head>\n" + |
| + " <body>\n" + |
| + " </body>\n" + |
| + "</html>"; |
| + |
| + @Override |
| + public void setUp() throws Exception { |
| + super.setUp(); |
| + mContentsClient = new TestAwContentsClient() { |
| + @Override |
| + public void onGeolocationPermissionsShowPrompt(String origin, |
| + GeolocationPermissions.Callback callback) { |
| + callback.invoke(origin, true, true); |
| + } |
| + }; |
| + mAwContents = createAwTestContainerViewOnMainSync(mContentsClient).getAwContents(); |
| + enableJavaScriptOnUiThread(mAwContents); |
| + setupGeolocation(); |
| + } |
| + |
| + @Override |
| + public void tearDown() throws Exception { |
| + mMockLocationProvider.stopUpdates(); |
| + GeolocationPermissions.getInstance().clearAll(); |
| + super.tearDown(); |
| + } |
| + |
| + private void setupGeolocation() { |
| + getInstrumentation().runOnMainSync(new Runnable() { |
| + @Override |
| + public void run() { |
| + mAwContents.getSettings().setGeolocationEnabled(true); |
| + } |
| + }); |
| + mMockLocationProvider = new MockLocationProvider(); |
| + LocationProviderFactory.setLocationProviderImpl(mMockLocationProvider); |
| + } |
| + |
| + private int getPositionCountFromJS() { |
| + int result = -1; |
| + try { |
| + result = Integer.parseInt(executeJavaScriptAndWaitForResult( |
| + mAwContents, mContentsClient, "positionCount")); |
| + } catch (Exception e) { |
| + fail("Unable to get positionCount"); |
| + } |
| + return result; |
| + } |
| + |
| + private void ensureGeolocationRunning(final boolean running) throws Exception { |
| + assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
| + @Override |
| + public boolean isSatisfied() { |
| + return mMockLocationProvider.isRunning() == running; |
| + } |
| + }, TEST_TIMEOUT, CHECK_INTERVAL)); |
| + } |
| + |
| + |
| + /** |
| + * Ensure that a call to navigator.getCurrentPosition works in WebView. |
| + */ |
| + @SmallTest |
|
bulach
2013/12/11 13:29:27
nit: I think all of these tests are at least Mediu
mkosiba (inactive)
2013/12/11 15:47:44
hmm.. I've been using Small for most of the integr
benm (inactive)
2013/12/11 20:08:51
Done.
|
| + @Feature({"AndroidWebView"}) |
| + public void testGetPosition() throws Throwable { |
| + loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), |
| + RAW_HTML, "text/html", false); |
| + |
| + mAwContents.evaluateJavaScript("initiate_getCurrentPosition();", null); |
| + |
| + assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
| + @Override |
| + public boolean isSatisfied() { |
| + return getPositionCountFromJS() == 1; |
| + } |
| + }, TEST_TIMEOUT, CHECK_INTERVAL)); |
| + |
| + mAwContents.evaluateJavaScript("initiate_getCurrentPosition();", null); |
| + assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
| + @Override |
| + public boolean isSatisfied() { |
| + return getPositionCountFromJS() == 2; |
| + } |
| + }, TEST_TIMEOUT, CHECK_INTERVAL)); |
| + } |
| + |
| + /** |
| + * Ensure that a call to navigator.watchPosition works in WebView. |
| + */ |
| + @SmallTest |
| + @Feature({"AndroidWebView"}) |
| + public void testWatchPosition() throws Throwable { |
| + loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), |
| + RAW_HTML, "text/html", false); |
| + |
| + mAwContents.evaluateJavaScript("initiate_watchPosition();", null); |
| + |
| + assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
| + @Override |
| + public boolean isSatisfied() { |
| + return getPositionCountFromJS() > 3; |
|
bulach
2013/12/11 13:29:27
nit: isn't > 0 enough? or if you really want more
benm (inactive)
2013/12/11 20:08:51
3 was completely arbitrary :)
I wanted to make su
|
| + } |
| + }, TEST_TIMEOUT, CHECK_INTERVAL)); |
| + } |
| + |
| + @SmallTest |
| + @Feature({"AndroidWebView"}) |
| + public void testPauseGeolocationOnPause() throws Throwable { |
| + // Start a watch going. |
| + loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), |
| + RAW_HTML, "text/html", false); |
| + |
| + mAwContents.evaluateJavaScript("initiate_watchPosition();", null); |
| + |
| + assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
| + @Override |
| + public boolean isSatisfied() { |
| + return getPositionCountFromJS() > 3; |
| + } |
| + }, TEST_TIMEOUT, CHECK_INTERVAL)); |
| + |
| + ensureGeolocationRunning(true); |
| + |
| + getInstrumentation().runOnMainSync(new Runnable() { |
| + @Override |
| + public void run() { |
| + mAwContents.onPause(); |
| + } |
| + }); |
| + |
| + ensureGeolocationRunning(false); |
| + |
| + try { |
| + executeJavaScriptAndWaitForResult(mAwContents, mContentsClient, "positionCount = 0"); |
| + } catch (Exception e) { |
| + fail("Unable to clear positionCount"); |
| + } |
| + assertEquals(0, getPositionCountFromJS()); |
| + |
| + getInstrumentation().runOnMainSync(new Runnable() { |
| + @Override |
| + public void run() { |
| + mAwContents.onResume(); |
| + } |
| + }); |
| + |
| + ensureGeolocationRunning(true); |
| + |
| + assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
| + @Override |
| + public boolean isSatisfied() { |
| + return getPositionCountFromJS() > 3; |
| + } |
| + }, TEST_TIMEOUT, CHECK_INTERVAL)); |
| + } |
| + |
| + @SmallTest |
| + @Feature({"AndroidWebView"}) |
| + public void testPauseAwContentsBeforeNavigating() throws Throwable { |
| + getInstrumentation().runOnMainSync(new Runnable() { |
| + @Override |
| + public void run() { |
| + mAwContents.onPause(); |
| + } |
| + }); |
| + |
| + // Start a watch going. |
| + loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), |
| + RAW_HTML, "text/html", false); |
| + |
| + mAwContents.evaluateJavaScript("initiate_watchPosition();", null); |
| + |
| + assertEquals(0, getPositionCountFromJS()); |
| + |
| + ensureGeolocationRunning(false); |
| + |
| + getInstrumentation().runOnMainSync(new Runnable() { |
| + @Override |
| + public void run() { |
| + mAwContents.onResume(); |
| + } |
| + }); |
| + |
| + ensureGeolocationRunning(true); |
| + |
| + assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
| + @Override |
| + public boolean isSatisfied() { |
| + return getPositionCountFromJS() > 3; |
| + } |
| + }, TEST_TIMEOUT, CHECK_INTERVAL)); |
| + |
| + } |
| + |
| + @SmallTest |
| + @Feature({"AndroidWebView"}) |
| + public void testResumeWhenNotStarted() throws Throwable { |
| + getInstrumentation().runOnMainSync(new Runnable() { |
| + @Override |
| + public void run() { |
| + mAwContents.onPause(); |
| + } |
| + }); |
| + |
| + loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), |
| + RAW_HTML, "text/html", false); |
| + |
| + getInstrumentation().runOnMainSync(new Runnable() { |
| + @Override |
| + public void run() { |
| + mAwContents.onResume(); |
| + } |
| + }); |
| + |
| + ensureGeolocationRunning(false); |
| + } |
| + |
| +} |