| Index: chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerDisableIncognitoModeIntegrationTest.java
 | 
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerDisableIncognitoModeIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerDisableIncognitoModeIntegrationTest.java
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..172dfbff1671aaa1f00e91e7c41d54e725741bda
 | 
| --- /dev/null
 | 
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerDisableIncognitoModeIntegrationTest.java
 | 
| @@ -0,0 +1,174 @@
 | 
| +// Copyright 2015 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.chrome.browser.partnercustomizations;
 | 
| +
 | 
| +import android.content.Context;
 | 
| +import android.net.Uri;
 | 
| +import android.os.Bundle;
 | 
| +import android.test.suitebuilder.annotation.MediumTest;
 | 
| +import android.view.Menu;
 | 
| +import android.view.MenuItem;
 | 
| +import android.widget.PopupMenu;
 | 
| +
 | 
| +import com.google.android.apps.chrome.R;
 | 
| +
 | 
| +import org.chromium.base.ThreadUtils;
 | 
| +import org.chromium.base.test.util.Feature;
 | 
| +import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 | 
| +import org.chromium.chrome.test.partnercustomizations.TestPartnerBrowserCustomizationsProvider;
 | 
| +import org.chromium.chrome.test.util.TestHttpServerClient;
 | 
| +import org.chromium.content.browser.test.util.Criteria;
 | 
| +import org.chromium.content.browser.test.util.CriteriaHelper;
 | 
| +
 | 
| +import java.util.concurrent.Callable;
 | 
| +import java.util.concurrent.ExecutionException;
 | 
| +
 | 
| +/**
 | 
| + * Integration tests for the partner disabling incognito mode feature.
 | 
| + */
 | 
| +public class PartnerDisableIncognitoModeIntegrationTest extends
 | 
| +        BasePartnerBrowserCustomizationIntegrationTest {
 | 
| +
 | 
| +    private static final String TEST_URLS[] = {
 | 
| +            TestHttpServerClient.getUrl("chrome/test/data/android/about.html"),
 | 
| +            TestHttpServerClient.getUrl("chrome/test/data/android/ok.txt"),
 | 
| +            TestHttpServerClient.getUrl("chrome/test/data/android/test.html")
 | 
| +    };
 | 
| +
 | 
| +    @Override
 | 
| +    public void startMainActivity() throws InterruptedException {
 | 
| +        // Each test will launch main activity, so purposefully omit here.
 | 
| +    }
 | 
| +
 | 
| +    private void setParentalControlsEnabled(boolean enabled) {
 | 
| +        Uri uri = PartnerBrowserCustomizations.buildQueryUri(
 | 
| +                PartnerBrowserCustomizations.PARTNER_DISABLE_INCOGNITO_MODE_PATH);
 | 
| +        Bundle bundle = new Bundle();
 | 
| +        bundle.putBoolean(
 | 
| +                TestPartnerBrowserCustomizationsProvider.INCOGNITO_MODE_DISABLED_KEY, enabled);
 | 
| +        Context context = getInstrumentation().getTargetContext();
 | 
| +        context.getContentResolver().call(uri, "setIncognitoModeDisabled", null, bundle);
 | 
| +    }
 | 
| +
 | 
| +    private void assertIncognitoMenuItemEnabled(boolean enabled) throws ExecutionException {
 | 
| +        Menu menu = ThreadUtils.runOnUiThreadBlocking(new Callable<Menu>() {
 | 
| +            @Override
 | 
| +            public Menu call() throws Exception {
 | 
| +                // PopupMenu is a convenient way of building a temp menu.
 | 
| +                PopupMenu tempMenu = new PopupMenu(
 | 
| +                        getActivity(), getActivity().findViewById(R.id.menu_anchor_stub));
 | 
| +                tempMenu.inflate(R.menu.main_menu);
 | 
| +                Menu menu = tempMenu.getMenu();
 | 
| +
 | 
| +                getActivity().prepareMenu(menu);
 | 
| +                return menu;
 | 
| +            }
 | 
| +        });
 | 
| +        for (int i = 0; i < menu.size(); ++i) {
 | 
| +            MenuItem item = menu.getItem(i);
 | 
| +            if (item.getItemId() == R.id.new_incognito_tab_menu_id && item.isVisible()) {
 | 
| +                assertEquals("Menu item enabled state is not correct.", enabled, item.isEnabled());
 | 
| +            }
 | 
| +        }
 | 
| +    }
 | 
| +
 | 
| +    private boolean waitForParentalControlsEnabledState(final boolean parentalControlsEnabled)
 | 
| +            throws InterruptedException {
 | 
| +        return CriteriaHelper.pollForCriteria(new Criteria() {
 | 
| +            @Override
 | 
| +            public boolean isSatisfied() {
 | 
| +                return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Boolean>() {
 | 
| +                    @Override
 | 
| +                    public Boolean call() throws Exception {
 | 
| +                        // areParentalControlsEnabled is updated on a background thread, so we
 | 
| +                        // also wait on the isIncognitoModeEnabled to ensure the updates on the
 | 
| +                        // UI thread have also triggered.
 | 
| +                        boolean retVal = parentalControlsEnabled
 | 
| +                                == PartnerBrowserCustomizations.isIncognitoDisabled();
 | 
| +                        retVal &= parentalControlsEnabled
 | 
| +                                != PrefServiceBridge.getInstance().isIncognitoModeEnabled();
 | 
| +                        return retVal;
 | 
| +                    }
 | 
| +                });
 | 
| +            }
 | 
| +        });
 | 
| +    }
 | 
| +
 | 
| +    private void toggleActivityForegroundState() {
 | 
| +        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
 | 
| +            @Override
 | 
| +            public void run() {
 | 
| +                getActivity().onPause();
 | 
| +            }
 | 
| +        });
 | 
| +        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
 | 
| +            @Override
 | 
| +            public void run() {
 | 
| +                getActivity().onStop();
 | 
| +            }
 | 
| +        });
 | 
| +        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
 | 
| +            @Override
 | 
| +            public void run() {
 | 
| +                getActivity().onStart();
 | 
| +            }
 | 
| +        });
 | 
| +        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
 | 
| +            @Override
 | 
| +            public void run() {
 | 
| +                getActivity().onResume();
 | 
| +            }
 | 
| +        });
 | 
| +    }
 | 
| +
 | 
| +    @MediumTest
 | 
| +    @Feature({"DisableIncognitoMode"})
 | 
| +    public void testIncognitoEnabledIfNoParentalControls() throws InterruptedException {
 | 
| +        setParentalControlsEnabled(false);
 | 
| +        startMainActivityOnBlankPage();
 | 
| +        assertTrue(waitForParentalControlsEnabledState(false));
 | 
| +        newIncognitoTabFromMenu();
 | 
| +    }
 | 
| +
 | 
| +    @MediumTest
 | 
| +    @Feature({"DisableIncognitoMode"})
 | 
| +    public void testIncognitoMenuItemEnabledBasedOnParentalControls()
 | 
| +            throws InterruptedException, ExecutionException {
 | 
| +        setParentalControlsEnabled(true);
 | 
| +        startMainActivityOnBlankPage();
 | 
| +        assertTrue(waitForParentalControlsEnabledState(true));
 | 
| +        assertIncognitoMenuItemEnabled(false);
 | 
| +
 | 
| +        setParentalControlsEnabled(false);
 | 
| +        toggleActivityForegroundState();
 | 
| +        assertTrue(waitForParentalControlsEnabledState(false));
 | 
| +        assertIncognitoMenuItemEnabled(true);
 | 
| +    }
 | 
| +
 | 
| +    @MediumTest
 | 
| +    @Feature({"DisableIncognitoMode"})
 | 
| +    public void testEnabledParentalControlsClosesIncognitoTabs() throws InterruptedException {
 | 
| +        setParentalControlsEnabled(false);
 | 
| +        startMainActivityOnBlankPage();
 | 
| +        assertTrue(waitForParentalControlsEnabledState(false));
 | 
| +
 | 
| +        loadUrlInNewTab(TEST_URLS[0], true);
 | 
| +        loadUrlInNewTab(TEST_URLS[1], true);
 | 
| +        loadUrlInNewTab(TEST_URLS[2], true);
 | 
| +        loadUrlInNewTab(TEST_URLS[0], false);
 | 
| +
 | 
| +        setParentalControlsEnabled(true);
 | 
| +        toggleActivityForegroundState();
 | 
| +        assertTrue(waitForParentalControlsEnabledState(true));
 | 
| +
 | 
| +        assertTrue("Incognito tabs did not close as expected",
 | 
| +                CriteriaHelper.pollForCriteria(new Criteria() {
 | 
| +                    @Override
 | 
| +                    public boolean isSatisfied() {
 | 
| +                        return incognitoTabsCount() == 0;
 | 
| +                    }
 | 
| +                }));
 | 
| +    }
 | 
| +}
 | 
| 
 |