| Index: chrome/android/javatests/src/org/chromium/chrome/browser/GeolocationTest.java | 
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/GeolocationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/GeolocationTest.java | 
| index 0c4dfc763b7707e4de6595bb02ab078052168886..215f537014cf94f2276fb7a4d1255ca31fbccbd0 100644 | 
| --- a/chrome/android/javatests/src/org/chromium/chrome/browser/GeolocationTest.java | 
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/GeolocationTest.java | 
| @@ -4,10 +4,14 @@ | 
|  | 
| package org.chromium.chrome.browser; | 
|  | 
| +import android.content.DialogInterface; | 
| +import android.support.v7.app.AlertDialog; | 
| import android.support.v7.widget.SwitchCompat; | 
| +import android.test.suitebuilder.annotation.LargeTest; | 
| import android.test.suitebuilder.annotation.MediumTest; | 
| import android.test.suitebuilder.annotation.Smoke; | 
|  | 
| +import org.chromium.base.ThreadUtils; | 
| import org.chromium.base.test.util.CallbackHelper; | 
| import org.chromium.base.test.util.CommandLineFlags; | 
| import org.chromium.base.test.util.Feature; | 
| @@ -15,6 +19,7 @@ import org.chromium.base.test.util.RetryOnFailure; | 
| import org.chromium.chrome.R; | 
| import org.chromium.chrome.browser.infobar.InfoBar; | 
| import org.chromium.chrome.browser.infobar.InfoBarContainer; | 
| +import org.chromium.chrome.browser.permissions.PermissionDialogController; | 
| import org.chromium.chrome.browser.tab.EmptyTabObserver; | 
| import org.chromium.chrome.browser.tab.Tab; | 
| import org.chromium.chrome.test.ChromeActivityTestCaseBase; | 
| @@ -23,12 +28,12 @@ import org.chromium.chrome.test.util.InfoBarUtil; | 
| import org.chromium.chrome.test.util.browser.LocationSettingsTestUtil; | 
| import org.chromium.content.browser.test.util.Criteria; | 
| import org.chromium.content.browser.test.util.CriteriaHelper; | 
| -import org.chromium.content.browser.test.util.TouchCommon; | 
| import org.chromium.device.geolocation.LocationProviderFactory; | 
| import org.chromium.device.geolocation.MockLocationProvider; | 
| import org.chromium.net.test.EmbeddedTestServer; | 
|  | 
| import java.util.concurrent.Callable; | 
| +import java.util.concurrent.ExecutionException; | 
|  | 
| /** | 
| * Test suite for Geo-Location functionality. | 
| @@ -45,6 +50,15 @@ public class GeolocationTest extends ChromeActivityTestCaseBase<ChromeActivity> | 
| private static final float ACCURACY = 10; | 
| private static final String TEST_FILE = "/content/test/data/android/geolocation.html"; | 
|  | 
| +    private static final String MODAL_FLAG = "ModalPermissionPrompts"; | 
| +    private static final String TOGGLE_FLAG = "DisplayPersistenceToggleInPermissionPrompts"; | 
| +    private static final String MODAL_TOGGLE_FLAG = MODAL_FLAG + "," + TOGGLE_FLAG; | 
| +    private static final String NO_GESTURE_FEATURE = | 
| +            "enable-features=ModalPermissionPrompts<ModalPrompts"; | 
| +    private static final String FORCE_FIELDTRIAL = "force-fieldtrials=ModalPrompts/Group1"; | 
| +    private static final String FORCE_FIELDTRIAL_PARAMS = | 
| +            "force-fieldtrial-params=ModalPrompts.Group1:require_gesture/false"; | 
| + | 
| private InfoBarTestAnimationListener mListener; | 
| private EmbeddedTestServer mTestServer; | 
|  | 
| @@ -73,6 +87,37 @@ public class GeolocationTest extends ChromeActivityTestCaseBase<ChromeActivity> | 
| } | 
| } | 
|  | 
| +    /** | 
| +     * Criteria class to detect whether the permission dialog is shown. | 
| +     */ | 
| +    private static class DialogShownCriteria extends Criteria { | 
| +        private AlertDialog mDialog; | 
| + | 
| +        public DialogShownCriteria(String error) { | 
| +            super(error); | 
| +        } | 
| + | 
| +        public AlertDialog getDialog() { | 
| +            return mDialog; | 
| +        } | 
| + | 
| +        @Override | 
| +        public boolean isSatisfied() { | 
| +            try { | 
| +                return ThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() { | 
| +                    @Override | 
| +                    public Boolean call() { | 
| +                        mDialog = PermissionDialogController.getInstance() | 
| +                                          .getCurrentDialogForTesting(); | 
| +                        return mDialog != null; | 
| +                    } | 
| +                }); | 
| +            } catch (ExecutionException e) { | 
| +                return false; | 
| +            } | 
| +        } | 
| +    } | 
| + | 
| public GeolocationTest() { | 
| super(ChromeActivity.class); | 
| } | 
| @@ -85,7 +130,7 @@ public class GeolocationTest extends ChromeActivityTestCaseBase<ChromeActivity> | 
|  | 
| InfoBarContainer container = | 
| getActivity().getTabModelSelector().getCurrentTab().getInfoBarContainer(); | 
| -        mListener =  new InfoBarTestAnimationListener(); | 
| +        mListener = new InfoBarTestAnimationListener(); | 
| container.setAnimationListener(mListener); | 
|  | 
| LocationProviderFactory.setLocationProviderImpl(new MockLocationProvider()); | 
| @@ -100,25 +145,172 @@ public class GeolocationTest extends ChromeActivityTestCaseBase<ChromeActivity> | 
| } | 
|  | 
| /** | 
| +     * Simulates clicking a button on an AlertDialog. | 
| +     */ | 
| +    private void clickButton(final AlertDialog dialog, final int button) { | 
| +        ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 
| +            @Override | 
| +            public void run() { | 
| +                dialog.getButton(button).performClick(); | 
| +            } | 
| +        }); | 
| +    } | 
| + | 
| +    /** | 
| +     * Runs a geolocation test that permits location access. | 
| +     * @param updateWaiter  The update waiter to wait for callbacks. | 
| +     * @param javascript    The JS function to run in the current tab to execute the test. | 
| +     * @param nUpdates      How many updates to wait for. | 
| +     * @param withGeature   True if we require a user gesture to trigger the prompt. | 
| +     * @param isDialog      True if we are expecting a permission dialog, false for an infobar. | 
| +     * @param hasSwitch     True if we are expecting a persistence switch, false otherwise. | 
| +     * @param toggleSwitch  True if we should toggle the switch off, false otherwise. | 
| +     * @throws Exception | 
| +     */ | 
| +    private void runAllowTest(GeolocationUpdateWaiter updateWaiter, String javascript, int nUpdates, | 
| +            boolean withGesture, boolean isDialog, boolean hasSwitch, boolean toggleSwitch) | 
| +            throws Exception { | 
| +        final String url = mTestServer.getURL(TEST_FILE); | 
| +        loadUrl(url); | 
| + | 
| +        if (withGesture) { | 
| +            runJavaScriptCodeInCurrentTab("functionToRun = '" + javascript + "'"); | 
| +            singleClickView(getActivity().getActivityTab().getView()); | 
| +        } else { | 
| +            runJavaScriptCodeInCurrentTab(javascript); | 
| +        } | 
| + | 
| +        if (isDialog) { | 
| +            // We need to have a user gesture for the modal to appear. Use a click listener to | 
| +            // trigger the JavaScript. | 
| +            DialogShownCriteria criteria = new DialogShownCriteria("Dialog not shown"); | 
| +            CriteriaHelper.pollInstrumentationThread(criteria); | 
| +            replyToDialogAndWaitForUpdates( | 
| +                    updateWaiter, criteria.getDialog(), nUpdates, true, hasSwitch, toggleSwitch); | 
| +        } else { | 
| +            replyToInfoBarAndWaitForUpdates(updateWaiter, nUpdates, true, hasSwitch, toggleSwitch); | 
| +        } | 
| +    } | 
| + | 
| +    private void replyToInfoBarAndWaitForUpdates(GeolocationUpdateWaiter updateWaiter, int nUpdates, | 
| +            boolean allow, boolean hasSwitch, boolean toggleSwitch) throws Exception { | 
| +        assertTrue("InfoBar not added.", mListener.addInfoBarAnimationFinished()); | 
| +        InfoBar infobar = getInfoBars().get(0); | 
| +        assertNotNull(infobar); | 
| + | 
| +        if (hasSwitch) { | 
| +            SwitchCompat persistSwitch = (SwitchCompat) infobar.getView().findViewById( | 
| +                    R.id.permission_infobar_persist_toggle); | 
| +            assertNotNull(persistSwitch); | 
| +            assertTrue(persistSwitch.isChecked()); | 
| +            if (toggleSwitch) { | 
| +                singleClickView(persistSwitch); | 
| +                waitForCheckedState(persistSwitch, false); | 
| +            } | 
| +        } | 
| + | 
| +        if (allow) { | 
| +            assertTrue("Allow button wasn't found", InfoBarUtil.clickPrimaryButton(infobar)); | 
| +        } else { | 
| +            assertTrue("Block button wasn't found", InfoBarUtil.clickSecondaryButton(infobar)); | 
| +        } | 
| +        updateWaiter.waitForNumUpdates(nUpdates); | 
| +    } | 
| + | 
| +    private void replyToDialogAndWaitForUpdates(GeolocationUpdateWaiter updateWaiter, | 
| +            AlertDialog dialog, int nUpdates, boolean allow, boolean hasSwitch, | 
| +            boolean toggleSwitch) throws Exception { | 
| +        if (hasSwitch) { | 
| +            SwitchCompat persistSwitch = | 
| +                    (SwitchCompat) dialog.findViewById(R.id.permission_dialog_persist_toggle); | 
| +            assertNotNull(persistSwitch); | 
| +            assertTrue(persistSwitch.isChecked()); | 
| +            if (toggleSwitch) { | 
| +                singleClickView(persistSwitch); | 
| +                waitForCheckedState(persistSwitch, false); | 
| +            } | 
| +        } | 
| + | 
| +        if (allow) { | 
| +            clickButton(dialog, DialogInterface.BUTTON_POSITIVE); | 
| +        } else { | 
| +            clickButton(dialog, DialogInterface.BUTTON_NEGATIVE); | 
| +        } | 
| +        updateWaiter.waitForNumUpdates(nUpdates); | 
| +    } | 
| + | 
| +    private void waitForCheckedState(final SwitchCompat persistSwitch, boolean isChecked) | 
| +            throws InterruptedException { | 
| +        CriteriaHelper.pollUiThread(Criteria.equals(isChecked, new Callable<Boolean>() { | 
| +            @Override | 
| +            public Boolean call() { | 
| +                return persistSwitch.isChecked(); | 
| +            } | 
| +        })); | 
| +    } | 
| + | 
| +    /** | 
| * Verify Geolocation creates an InfoBar and receives a mock location. | 
| * @throws Exception | 
| */ | 
| @Smoke | 
| @MediumTest | 
| @Feature({"Location", "Main"}) | 
| -    public void testGeolocationPlumbing() throws Exception { | 
| -        final String url = mTestServer.getURL(TEST_FILE); | 
| +    public void testGeolocationPlumbingAllowedInfoBar() throws Exception { | 
| +        Tab tab = getActivity().getActivityTab(); | 
| +        GeolocationUpdateWaiter updateWaiter = new GeolocationUpdateWaiter(); | 
| +        tab.addObserver(updateWaiter); | 
| +        runAllowTest(updateWaiter, "initiate_getCurrentPosition()", 1, false, false, false, false); | 
| +        tab.removeObserver(updateWaiter); | 
| +    } | 
|  | 
| +    /** | 
| +     * Verify Geolocation creates a dialog and receives a mock location. | 
| +     * @throws Exception | 
| +     */ | 
| +    @Smoke | 
| +    @MediumTest | 
| +    @CommandLineFlags.Add("enable-features=" + MODAL_FLAG) | 
| +    @Feature({"Location", "Main"}) | 
| +    public void testGeolocationPlumbingAllowedDialog() throws Exception { | 
| Tab tab = getActivity().getActivityTab(); | 
| GeolocationUpdateWaiter updateWaiter = new GeolocationUpdateWaiter(); | 
| tab.addObserver(updateWaiter); | 
| +        runAllowTest(updateWaiter, "initiate_getCurrentPosition()", 1, true, true, false, false); | 
| +        tab.removeObserver(updateWaiter); | 
| +    } | 
|  | 
| -        loadUrl(url); | 
| -        runJavaScriptCodeInCurrentTab("initiate_getCurrentPosition()"); | 
| -        assertTrue("InfoBar not added.", mListener.addInfoBarAnimationFinished()); | 
| -        assertTrue("OK button wasn't found", InfoBarUtil.clickPrimaryButton(getInfoBars().get(0))); | 
| -        updateWaiter.waitForNumUpdates(1); | 
| +    /** | 
| +     * Verify Geolocation creates a dialog and receives a mock location when dialogs are explicitly | 
| +     * enabled and permitted to trigger without a gesture. | 
| +     * @throws Exception | 
| +     */ | 
| +    @Smoke | 
| +    @MediumTest | 
| +    @CommandLineFlags.Add({NO_GESTURE_FEATURE, FORCE_FIELDTRIAL, FORCE_FIELDTRIAL_PARAMS}) | 
| +    @Feature({"Location", "Main"}) | 
| +    public void testGeolocationPlumbingAllowedDialogNoGesture() throws Exception { | 
| +        Tab tab = getActivity().getActivityTab(); | 
| +        GeolocationUpdateWaiter updateWaiter = new GeolocationUpdateWaiter(); | 
| +        tab.addObserver(updateWaiter); | 
| +        runAllowTest(updateWaiter, "initiate_getCurrentPosition()", 1, false, true, false, false); | 
| +        tab.removeObserver(updateWaiter); | 
| +    } | 
|  | 
| +    /** | 
| +     * Verify Geolocation shows an infobar and receives a mock location if the modal flag is on but | 
| +     * no user gesture is specified. | 
| +     * @throws Exception | 
| +     */ | 
| +    @Smoke | 
| +    @MediumTest | 
| +    @CommandLineFlags.Add("enable-features=" + MODAL_FLAG) | 
| +    @Feature({"Location", "Main"}) | 
| +    public void testGeolocationPlumbingAllowedNoGestureShowsInfoBar() throws Exception { | 
| +        Tab tab = getActivity().getActivityTab(); | 
| +        GeolocationUpdateWaiter updateWaiter = new GeolocationUpdateWaiter(); | 
| +        tab.addObserver(updateWaiter); | 
| +        runAllowTest(updateWaiter, "initiate_getCurrentPosition()", 1, false, false, false, false); | 
| tab.removeObserver(updateWaiter); | 
| } | 
|  | 
| @@ -128,85 +320,77 @@ public class GeolocationTest extends ChromeActivityTestCaseBase<ChromeActivity> | 
| */ | 
| @MediumTest | 
| @Feature({"Location"}) | 
| -    public void testGeolocationWatch() throws Exception { | 
| -        final String url = mTestServer.getURL(TEST_FILE); | 
| - | 
| +    public void testGeolocationWatchInfoBar() throws Exception { | 
| Tab tab = getActivity().getActivityTab(); | 
| GeolocationUpdateWaiter updateWaiter = new GeolocationUpdateWaiter(); | 
| tab.addObserver(updateWaiter); | 
| - | 
| -        loadUrl(url); | 
| -        runJavaScriptCodeInCurrentTab("initiate_watchPosition()"); | 
| -        assertTrue("InfoBar not added.", mListener.addInfoBarAnimationFinished()); | 
| -        assertTrue("OK button wasn't found", InfoBarUtil.clickPrimaryButton(getInfoBars().get(0))); | 
| -        updateWaiter.waitForNumUpdates(2); | 
| - | 
| +        runAllowTest(updateWaiter, "initiate_watchPosition()", 2, false, false, false, false); | 
| tab.removeObserver(updateWaiter); | 
| } | 
|  | 
| /** | 
| -     * Verify Geolocation prompts with a persistence toggle if that feature is enabled. Check the | 
| -     * switch appears and that permission is granted with it toggled on. | 
| +     * Verify Geolocation creates a dialog and receives multiple locations. | 
| * @throws Exception | 
| */ | 
| @MediumTest | 
| -    @CommandLineFlags.Add("enable-features=DisplayPersistenceToggleInPermissionPrompts") | 
| +    @CommandLineFlags.Add("enable-features=" + MODAL_FLAG) | 
| @Feature({"Location"}) | 
| -    public void testGeolocationPersistence() throws Exception { | 
| -        final String url = mTestServer.getURL(TEST_FILE); | 
| - | 
| +    public void testGeolocationWatchDialog() throws Exception { | 
| Tab tab = getActivity().getActivityTab(); | 
| GeolocationUpdateWaiter updateWaiter = new GeolocationUpdateWaiter(); | 
| tab.addObserver(updateWaiter); | 
| - | 
| -        loadUrl(url); | 
| -        runJavaScriptCodeInCurrentTab("initiate_getCurrentPosition()"); | 
| -        assertTrue("InfoBar not added.", mListener.addInfoBarAnimationFinished()); | 
| -        InfoBar infobar = getInfoBars().get(0); | 
| -        SwitchCompat persistSwitch = (SwitchCompat) infobar.getView().findViewById( | 
| -                R.id.permission_infobar_persist_toggle); | 
| -        assertNotNull(persistSwitch); | 
| -        assertTrue(persistSwitch.isChecked()); | 
| - | 
| -        assertTrue("OK button wasn't found", InfoBarUtil.clickPrimaryButton(infobar)); | 
| -        updateWaiter.waitForNumUpdates(1); | 
| - | 
| +        runAllowTest(updateWaiter, "initiate_watchPosition()", 2, true, true, false, false); | 
| tab.removeObserver(updateWaiter); | 
| } | 
|  | 
| /** | 
| -     * Verify Geolocation prompts with a persistence toggle if that feature is enabled. Check the | 
| -     * switch toggled off. | 
| +     * Verify Geolocation creates an infobar with a persistence toggle if that feature is enabled. | 
| +     * Check the switch appears and that permission is granted with it toggled on. | 
| * @throws Exception | 
| */ | 
| @MediumTest | 
| -    @CommandLineFlags.Add("enable-features=DisplayPersistenceToggleInPermissionPrompts") | 
| +    @CommandLineFlags.Add("enable-features=" + TOGGLE_FLAG) | 
| @Feature({"Location"}) | 
| -    public void testGeolocationPersistenceOff() throws Exception { | 
| -        final String url = mTestServer.getURL(TEST_FILE); | 
| - | 
| +    public void testGeolocationPersistenceAllowedInfoBar() throws Exception { | 
| Tab tab = getActivity().getActivityTab(); | 
| GeolocationUpdateWaiter updateWaiter = new GeolocationUpdateWaiter(); | 
| tab.addObserver(updateWaiter); | 
| +        runAllowTest(updateWaiter, "initiate_getCurrentPosition()", 1, false, false, true, false); | 
| +        tab.removeObserver(updateWaiter); | 
| +    } | 
|  | 
| -        loadUrl(url); | 
| -        runJavaScriptCodeInCurrentTab("initiate_getCurrentPosition()"); | 
| -        assertTrue("InfoBar not added.", mListener.addInfoBarAnimationFinished()); | 
| -        InfoBar infobar = getInfoBars().get(0); | 
| -        SwitchCompat persistSwitch = (SwitchCompat) infobar.getView().findViewById( | 
| -                R.id.permission_infobar_persist_toggle); | 
| -        assertNotNull(persistSwitch); | 
| -        assertTrue(persistSwitch.isChecked()); | 
| - | 
| -        // Uncheck the switch | 
| -        TouchCommon.singleClickView(persistSwitch); | 
| -        waitForCheckedState(persistSwitch, false); | 
| +    /** | 
| +     * Verify Geolocation creates a dialog with a persistence toggle if both features are enabled. | 
| +     * Check the switch appears and that permission is granted with it toggled on. | 
| +     * @throws Exception | 
| +     */ | 
| +    @MediumTest | 
| +    @CommandLineFlags.Add("enable-features=" + MODAL_TOGGLE_FLAG) | 
| +    @Feature({"Location"}) | 
| +    public void testGeolocationPersistenceAllowedDialog() throws Exception { | 
| +        Tab tab = getActivity().getActivityTab(); | 
| +        GeolocationUpdateWaiter updateWaiter = new GeolocationUpdateWaiter(); | 
| +        tab.addObserver(updateWaiter); | 
| +        runAllowTest(updateWaiter, "initiate_getCurrentPosition()", 1, true, true, true, false); | 
| +        tab.removeObserver(updateWaiter); | 
| +    } | 
|  | 
| -        assertTrue("OK button wasn't found", InfoBarUtil.clickPrimaryButton(infobar)); | 
| -        updateWaiter.waitForNumUpdates(1); | 
| +    /** | 
| +     * Verify Geolocation creates an infobar with a persistence toggle if that feature is enabled. | 
| +     * Check the switch toggled off. | 
| +     * @throws Exception | 
| +     */ | 
| +    @MediumTest | 
| +    @CommandLineFlags.Add("enable-features=" + TOGGLE_FLAG) | 
| +    @Feature({"Location"}) | 
| +    public void testGeolocationPersistenceOffAllowedInfoBar() throws Exception { | 
| +        Tab tab = getActivity().getActivityTab(); | 
| +        GeolocationUpdateWaiter updateWaiter = new GeolocationUpdateWaiter(); | 
| +        tab.addObserver(updateWaiter); | 
| +        runAllowTest(updateWaiter, "initiate_getCurrentPosition()", 1, false, false, true, true); | 
|  | 
| // Ask for permission again and make sure it doesn't prompt again (grant is cached in the | 
| -        // blink layer). | 
| +        // Blink layer). | 
| runJavaScriptCodeInCurrentTab("initiate_getCurrentPosition()"); | 
| updateWaiter.waitForNumUpdates(2); | 
|  | 
| @@ -218,48 +402,61 @@ public class GeolocationTest extends ChromeActivityTestCaseBase<ChromeActivity> | 
| } | 
|  | 
| /** | 
| -     * Verify Geolocation prompts once and sends multiple locations with a persistence toggle if | 
| -     * that feature is enabled. | 
| +     * Verify Geolocation creates a dialog with a persistence toggle if that feature is enabled. | 
| +     * Check the switch toggled off. | 
| * @throws Exception | 
| */ | 
| @MediumTest | 
| -    @CommandLineFlags.Add("enable-features=DisplayPersistenceToggleInPermissionPrompts") | 
| +    @CommandLineFlags.Add("enable-features=" + MODAL_TOGGLE_FLAG) | 
| @Feature({"Location"}) | 
| -    public void testGeolocationWatchPersistenceOff() throws Exception { | 
| -        final String url = mTestServer.getURL(TEST_FILE); | 
| - | 
| +    public void testGeolocationPersistenceOffAllowedDialog() throws Exception { | 
| Tab tab = getActivity().getActivityTab(); | 
| GeolocationUpdateWaiter updateWaiter = new GeolocationUpdateWaiter(); | 
| tab.addObserver(updateWaiter); | 
| +        runAllowTest(updateWaiter, "initiate_getCurrentPosition()", 1, true, true, true, true); | 
|  | 
| -        loadUrl(url); | 
| -        runJavaScriptCodeInCurrentTab("initiate_watchPosition()"); | 
| -        assertTrue("InfoBar not added.", mListener.addInfoBarAnimationFinished()); | 
| -        InfoBar infobar = getInfoBars().get(0); | 
| -        SwitchCompat persistSwitch = (SwitchCompat) infobar.getView().findViewById( | 
| -                R.id.permission_infobar_persist_toggle); | 
| -        assertNotNull(persistSwitch); | 
| -        assertTrue(persistSwitch.isChecked()); | 
| +        // Ask for permission again and make sure it doesn't prompt again (grant is cached in the | 
| +        // Blink layer). | 
| +        singleClickView(getActivity().getActivityTab().getView()); | 
| +        updateWaiter.waitForNumUpdates(2); | 
|  | 
| -        // Uncheck the switch | 
| -        TouchCommon.singleClickView(persistSwitch); | 
| -        waitForCheckedState(persistSwitch, false); | 
| +        // Ask for permission a third time and make sure it doesn't prompt again. | 
| +        singleClickView(getActivity().getActivityTab().getView()); | 
| +        updateWaiter.waitForNumUpdates(3); | 
|  | 
| -        // Make sure we get multiple updates without another prompt. | 
| -        assertTrue("OK button wasn't found", InfoBarUtil.clickPrimaryButton(infobar)); | 
| -        updateWaiter.waitForNumUpdates(4); | 
| +        tab.removeObserver(updateWaiter); | 
| +    } | 
|  | 
| +    /** | 
| +     * Verify Geolocation prompts once and sends multiple locations with a persistence toggle if | 
| +     * that feature is enabled. Use an infobar. | 
| +     * @throws Exception | 
| +     */ | 
| +    @LargeTest | 
| +    @CommandLineFlags.Add("enable-features=" + TOGGLE_FLAG) | 
| +    @Feature({"Location"}) | 
| +    public void testGeolocationWatchPersistenceOffAllowedInfoBar() throws Exception { | 
| +        Tab tab = getActivity().getActivityTab(); | 
| +        GeolocationUpdateWaiter updateWaiter = new GeolocationUpdateWaiter(); | 
| +        tab.addObserver(updateWaiter); | 
| +        runAllowTest(updateWaiter, "initiate_watchPosition()", 2, false, false, true, true); | 
| tab.removeObserver(updateWaiter); | 
| } | 
|  | 
| -    private void waitForCheckedState(final SwitchCompat persistSwitch, boolean isChecked) | 
| -            throws InterruptedException { | 
| -        CriteriaHelper.pollUiThread(Criteria.equals(isChecked, new Callable<Boolean>() { | 
| -            @Override | 
| -            public Boolean call() { | 
| -                return persistSwitch.isChecked(); | 
| -            } | 
| -        })); | 
| +    /** | 
| +     * Verify Geolocation prompts once and sends multiple locations with a persistence toggle if | 
| +     * that feature is enabled. Use a dialog. | 
| +     * @throws Exception | 
| +     */ | 
| +    @LargeTest | 
| +    @CommandLineFlags.Add("enable-features=" + MODAL_TOGGLE_FLAG) | 
| +    @Feature({"Location"}) | 
| +    public void testGeolocationWatchPersistenceOffAllowedDialog() throws Exception { | 
| +        Tab tab = getActivity().getActivityTab(); | 
| +        GeolocationUpdateWaiter updateWaiter = new GeolocationUpdateWaiter(); | 
| +        tab.addObserver(updateWaiter); | 
| +        runAllowTest(updateWaiter, "initiate_watchPosition()", 2, true, true, true, true); | 
| +        tab.removeObserver(updateWaiter); | 
| } | 
|  | 
| @Override | 
|  |