Index: content/public/android/javatests/src/org/chromium/content/browser/ContentViewLocationTest.java |
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ContentViewLocationTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewLocationTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3e6b3f7ac431abe36e1809242a5b907ffae3c162 |
--- /dev/null |
+++ b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewLocationTest.java |
@@ -0,0 +1,173 @@ |
+// Copyright 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.content.browser; |
+ |
+import android.test.suitebuilder.annotation.MediumTest; |
+ |
+import org.chromium.base.test.util.Feature; |
+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 org.chromium.content.browser.test.util.TestCallbackHelperContainer; |
+import org.chromium.content_shell_apk.ContentShellTestBase; |
+ |
+/** |
+ * Test suite for ensureing that Geolocation interacts as expected |
+ * with ContentView APIs - e.g. that it's started and stopped as the |
+ * ContentView is hidden or shown. |
+ */ |
+public class ContentViewLocationTest extends ContentShellTestBase { |
+ |
+ private TestCallbackHelperContainer mTestCallbackHelperContainer; |
+ private TestCallbackHelperContainer.OnEvaluateJavaScriptResultHelper mJavascriptHelper; |
+ private MockLocationProvider mMockLocationProvider; |
+ |
+ private void hideContentViewOnUiThread() { |
+ getInstrumentation().runOnMainSync(new Runnable() { |
+ @Override |
+ public void run() { |
+ getContentView().onHide(); |
+ } |
+ }); |
+ } |
+ |
+ private void showContentViewOnUiThread() { |
+ getInstrumentation().runOnMainSync(new Runnable() { |
+ @Override |
+ public void run() { |
+ getContentView().onShow(); |
+ } |
+ }); |
+ } |
+ |
+ private void pollForPositionCallback() throws Throwable { |
+ mJavascriptHelper.evaluateJavaScript(getContentViewCore(), |
+ "positionCount = 0"); |
+ mJavascriptHelper.waitUntilHasValue(); |
+ assertEquals(0, Integer.parseInt(mJavascriptHelper.getJsonResultAndClear())); |
+ |
+ assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ mJavascriptHelper.evaluateJavaScript(getContentViewCore(), "positionCount"); |
+ try { |
+ mJavascriptHelper.waitUntilHasValue(); |
+ } catch (Exception e) { |
+ fail(); |
+ } |
+ return Integer.parseInt(mJavascriptHelper.getJsonResultAndClear()) > 0; |
+ } |
+ })); |
+ } |
+ |
+ private void startGeolocationWatchPosition() throws Throwable { |
+ mJavascriptHelper.evaluateJavaScript(getContentViewCore(), |
+ "initiate_watchPosition();"); |
+ mJavascriptHelper.waitUntilHasValue(); |
+ } |
+ |
+ private void ensureGeolocationRunning(final boolean running) throws Exception { |
+ assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ return mMockLocationProvider.isRunning() == running; |
+ } |
+ })); |
+ } |
+ |
+ @Override |
+ protected void setUp() throws Exception { |
+ super.setUp(); |
+ |
+ mMockLocationProvider = new MockLocationProvider(); |
+ LocationProviderFactory.setLocationProviderImpl(mMockLocationProvider); |
+ |
+ try { |
+ startActivityWithTestUrl("content/geolocation.html"); |
+ } catch (Throwable t) { |
+ fail(); |
+ } |
+ |
+ mTestCallbackHelperContainer = new TestCallbackHelperContainer(getContentView()); |
+ mJavascriptHelper = mTestCallbackHelperContainer.getOnEvaluateJavaScriptResultHelper(); |
+ |
+ ensureGeolocationRunning(false); |
+ } |
+ |
+ @Override |
+ protected void tearDown() throws Exception { |
+ mMockLocationProvider.stopUpdates(); |
+ super.tearDown(); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"Location"}) |
+ public void testWatchHideShowStop() throws Throwable { |
+ |
+ startGeolocationWatchPosition(); |
+ pollForPositionCallback(); |
+ ensureGeolocationRunning(true); |
+ |
+ // Now hide the ContentView and ensure that geolocation stops. |
+ hideContentViewOnUiThread(); |
+ ensureGeolocationRunning(false); |
+ |
+ mJavascriptHelper.evaluateJavaScript(getContentViewCore(), |
+ "positionCount = 0"); |
+ mJavascriptHelper.waitUntilHasValue(); |
+ |
+ // Show the ContentView again and ensure that geolocation starts again. |
+ showContentViewOnUiThread(); |
+ pollForPositionCallback(); |
+ ensureGeolocationRunning(true); |
+ |
+ // Navigate away and ensure that geolocation stops. |
+ loadUrl(getContentView(), mTestCallbackHelperContainer, new LoadUrlParams("about:blank")); |
+ ensureGeolocationRunning(false); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"Location"}) |
+ public void testHideWatchResume() throws Throwable { |
+ hideContentViewOnUiThread(); |
+ startGeolocationWatchPosition(); |
+ ensureGeolocationRunning(false); |
+ |
+ showContentViewOnUiThread(); |
+ pollForPositionCallback(); |
+ ensureGeolocationRunning(true); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"Location"}) |
+ public void testWatchHideNewWatchShow() throws Throwable { |
+ startGeolocationWatchPosition(); |
+ pollForPositionCallback(); |
+ ensureGeolocationRunning(true); |
+ |
+ hideContentViewOnUiThread(); |
+ |
+ // Make sure that when starting a new watch while paused we still don't |
+ // start up geolocation until we show the content view again. |
+ startGeolocationWatchPosition(); |
+ ensureGeolocationRunning(false); |
+ |
+ showContentViewOnUiThread(); |
+ pollForPositionCallback(); |
+ ensureGeolocationRunning(true); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"Location"}) |
+ public void testHideWatchStopShow() throws Throwable { |
+ hideContentViewOnUiThread(); |
+ startGeolocationWatchPosition(); |
+ ensureGeolocationRunning(false); |
+ |
+ loadUrl(getContentView(), mTestCallbackHelperContainer, new LoadUrlParams("about:blank")); |
+ showContentViewOnUiThread(); |
+ ensureGeolocationRunning(false); |
+ } |
+} |