| 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;
|
| + }
|
| + }));
|
| + }
|
| +}
|
|
|