Index: chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/ContentPreferencesTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/ContentPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/ContentPreferencesTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8a62dc1e36f3cedc99135e142029ce5e96b8227c |
--- /dev/null |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/ContentPreferencesTest.java |
@@ -0,0 +1,376 @@ |
+// 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.preferences.website; |
+ |
+import android.content.Context; |
+import android.content.Intent; |
+import android.os.Bundle; |
+import android.test.suitebuilder.annotation.SmallTest; |
+ |
+import org.chromium.base.ThreadUtils; |
+import org.chromium.base.test.util.Feature; |
+import org.chromium.chrome.browser.infobar.InfoBar; |
+import org.chromium.chrome.browser.infobar.InfoBarContainer; |
+import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference; |
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference; |
+import org.chromium.chrome.browser.preferences.LocationSettings; |
+import org.chromium.chrome.browser.preferences.PrefServiceBridge; |
+import org.chromium.chrome.browser.preferences.Preferences; |
+import org.chromium.chrome.browser.preferences.PreferencesLauncher; |
+import org.chromium.chrome.shell.ChromeShellTestBase; |
+import org.chromium.chrome.test.util.InfoBarTestAnimationListener; |
+import org.chromium.chrome.test.util.TestHttpServerClient; |
+import org.chromium.content.browser.test.util.JavaScriptUtils; |
+ |
+import java.util.List; |
+import java.util.concurrent.Callable; |
+import java.util.concurrent.TimeoutException; |
+ |
+/** |
+ * Tests for everything under Settings > Site Settings. |
+ */ |
+public class ContentPreferencesTest extends ChromeShellTestBase { |
+ |
+ private static class MockLocationSettings extends LocationSettings { |
+ public MockLocationSettings(Context context) { |
+ super(context); |
+ } |
+ |
+ @Override |
+ public boolean isSystemLocationSettingEnabled() { |
+ return true; |
+ } |
+ } |
+ |
+ private void setAllowLocation(final boolean enabled) { |
+ ThreadUtils.runOnUiThread(new Runnable() { |
+ @Override |
+ public void run() { |
+ Context targetContext = getInstrumentation().getTargetContext(); |
+ LocationSettings.setInstanceForTesting(new MockLocationSettings(targetContext)); |
+ } |
+ }); |
+ |
+ final Preferences preferenceActivity = |
+ startContentSettingsCategory(ContentPreferences.LOCATION_KEY); |
+ |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
+ @Override |
+ public void run() { |
+ WebsitePreferences websitePreferences = (WebsitePreferences) |
+ preferenceActivity.getFragmentForTest(); |
+ ChromeSwitchPreference location = (ChromeSwitchPreference) |
+ websitePreferences.findPreference(WebsitePreferences.READ_WRITE_TOGGLE_KEY); |
+ |
+ websitePreferences.onPreferenceChange(location, enabled); |
+ assertEquals("Location should be " + (enabled ? "allowed" : "blocked"), enabled, |
+ LocationSettings.areAllLocationSettingsEnabled()); |
+ preferenceActivity.finish(); |
+ } |
+ }); |
+ } |
+ |
+ private InfoBarTestAnimationListener setInfoBarAnimationListener() { |
+ return ThreadUtils.runOnUiThreadBlockingNoException( |
+ new Callable<InfoBarTestAnimationListener>() { |
+ @Override |
+ public InfoBarTestAnimationListener call() throws Exception { |
+ InfoBarContainer container = |
+ getActivity().getActiveTab().getInfoBarContainer(); |
+ InfoBarTestAnimationListener listener = new InfoBarTestAnimationListener(); |
+ container.setAnimationListener(listener); |
+ return listener; |
+ } |
+ }); |
+ } |
+ |
+ /** |
+ * Sets Allow Location Enabled to be true and make sure it is set correctly. |
+ */ |
+ @SmallTest |
+ @Feature({"Preferences"}) |
+ public void testSetAllowLocationEnabled() throws Exception { |
+ setAllowLocation(true); |
+ InfoBarTestAnimationListener listener = setInfoBarAnimationListener(); |
+ |
+ // Launch a page that uses geolocation and make sure an infobar shows up. |
+ loadUrl(TestHttpServerClient.getUrl( |
+ "chrome/test/data/geolocation/geolocation_on_load.html")); |
+ assertTrue("InfoBar not added.", listener.addInfoBarAnimationFinished()); |
+ |
+ assertEquals("Wrong infobar count", 1, getInfoBars().size()); |
+ } |
+ |
+ /** |
+ * Sets Allow Location Enabled to be false and make sure it is set correctly. |
+ */ |
+ @SmallTest |
+ @Feature({"Preferences"}) |
+ public void testSetAllowLocationNotEnabled() throws Exception { |
+ setAllowLocation(false); |
+ |
+ // Launch a page that uses geolocation. |
+ loadUrl(TestHttpServerClient.getUrl( |
+ "chrome/test/data/geolocation/geolocation_on_load.html")); |
+ |
+ // No infobars are expected. |
+ assertTrue(getInfoBars().isEmpty()); |
+ } |
+ |
+ private Preferences startContentSettingsCategory( |
+ String categoryKey) { |
+ // Launch main activity for initial ContentPreferences initialization. |
+ launchChromeShellWithBlankPage(); |
+ |
+ Bundle fragmentArgs = new Bundle(); |
+ fragmentArgs.putString(WebsitePreferences.EXTRA_CATEGORY, categoryKey); |
+ Intent intent = PreferencesLauncher.createIntentForSettingsPage( |
+ getInstrumentation().getTargetContext(), WebsitePreferences.class.getName()); |
+ intent.putExtra(Preferences.EXTRA_SHOW_FRAGMENT_ARGUMENTS, fragmentArgs); |
+ return (Preferences) getInstrumentation().startActivitySync(intent); |
+ } |
+ |
+ private void setCookiesEnabled(final Preferences preferenceActivity, final boolean enabled) { |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
+ @Override |
+ public void run() { |
+ final WebsitePreferences websitePreferences = |
+ (WebsitePreferences) preferenceActivity.getFragmentForTest(); |
+ final ChromeSwitchPreference cookies = |
+ (ChromeSwitchPreference) websitePreferences.findPreference( |
+ WebsitePreferences.READ_WRITE_TOGGLE_KEY); |
+ final ChromeBaseCheckBoxPreference thirdPartyCookies = |
+ (ChromeBaseCheckBoxPreference) websitePreferences.findPreference( |
+ WebsitePreferences.THIRD_PARTY_COOKIES_TOGGLE_KEY); |
+ |
+ assertEquals("Third-party cookie toggle should be " |
+ + (doesAcceptCookies() ? "enabled" : " disabled"), |
+ doesAcceptCookies(), thirdPartyCookies.isEnabled()); |
+ websitePreferences.onPreferenceChange(cookies, enabled); |
+ assertEquals("Cookies should be " + (enabled ? "allowed" : "blocked"), |
+ doesAcceptCookies(), enabled); |
+ } |
+ |
+ private boolean doesAcceptCookies() { |
+ return PrefServiceBridge.getInstance().isAcceptCookiesEnabled(); |
+ } |
+ }); |
+ } |
+ |
+ private void setThirdPartyCookiesEnabled(final Preferences preferenceActivity, |
+ final boolean enabled) { |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
+ @Override |
+ public void run() { |
+ final WebsitePreferences websitePreferences = |
+ (WebsitePreferences) preferenceActivity.getFragmentForTest(); |
+ final ChromeBaseCheckBoxPreference thirdPartyCookies = |
+ (ChromeBaseCheckBoxPreference) websitePreferences.findPreference( |
+ WebsitePreferences.THIRD_PARTY_COOKIES_TOGGLE_KEY); |
+ |
+ websitePreferences.onPreferenceChange(thirdPartyCookies, enabled); |
+ assertEquals("Third-party cookies should be " + (enabled ? "allowed" : "blocked"), |
+ !PrefServiceBridge.getInstance().isBlockThirdPartyCookiesEnabled(), |
+ enabled); |
+ } |
+ }); |
+ } |
+ |
+ private void setEnablePopups(final boolean enabled) { |
+ Preferences preferenceActivity = |
+ startContentSettingsCategory(ContentPreferences.POPUPS_KEY); |
+ |
+ final WebsitePreferences websitePreferences = |
+ (WebsitePreferences) preferenceActivity.getFragmentForTest(); |
+ final ChromeSwitchPreference popups = (ChromeSwitchPreference) |
+ websitePreferences.findPreference(WebsitePreferences.READ_WRITE_TOGGLE_KEY); |
+ |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
+ @Override |
+ public void run() { |
+ websitePreferences.onPreferenceChange(popups, enabled); |
+ assertEquals("Popups should be " + (enabled ? "allowed" : "blocked"), enabled, |
+ PrefServiceBridge.getInstance().popupsEnabled()); |
+ } |
+ }); |
+ preferenceActivity.finish(); |
+ } |
+ |
+ private void setEnableCameraMic(final boolean enabled) { |
+ Preferences preferenceActivity = |
+ startContentSettingsCategory(ContentPreferences.CAMERA_AND_MIC_KEY); |
+ |
+ final WebsitePreferences websitePreferences = |
+ (WebsitePreferences) preferenceActivity.getFragmentForTest(); |
+ final ChromeSwitchPreference toggle = (ChromeSwitchPreference) |
+ websitePreferences.findPreference(WebsitePreferences.READ_WRITE_TOGGLE_KEY); |
+ |
+ ThreadUtils.runOnUiThread(new Runnable() { |
+ @Override |
+ public void run() { |
+ websitePreferences.onPreferenceChange(toggle, enabled); |
+ assertEquals("Camera/Mic should be " + (enabled ? "allowed" : "blocked"), |
+ enabled, PrefServiceBridge.getInstance().isCameraMicEnabled()); |
+ } |
+ }); |
+ preferenceActivity.finish(); |
+ } |
+ |
+ /** |
+ * Tests that disabling cookies turns off the third-party cookie toggle. |
+ * @throws Exception |
+ */ |
+ @SmallTest |
+ @Feature({"Preferences"}) |
+ public void testThirdPartyCookieToggleGetsDisabled() throws Exception { |
+ Preferences preferenceActivity = |
+ startContentSettingsCategory(ContentPreferences.COOKIES_KEY); |
+ setCookiesEnabled(preferenceActivity, true); |
+ setThirdPartyCookiesEnabled(preferenceActivity, false); |
+ setThirdPartyCookiesEnabled(preferenceActivity, true); |
+ setCookiesEnabled(preferenceActivity, false); |
+ preferenceActivity.finish(); |
+ } |
+ |
+ /** |
+ * Allows cookies to be set and ensures that they are. |
+ */ |
+ @SmallTest |
+ @Feature({"Preferences"}) |
+ public void testCookiesNotBlocked() throws Exception { |
+ Preferences preferenceActivity = |
+ startContentSettingsCategory(ContentPreferences.COOKIES_KEY); |
+ setCookiesEnabled(preferenceActivity, true); |
+ preferenceActivity.finish(); |
+ |
+ final String url = TestHttpServerClient.getUrl("chrome/test/data/android/cookie.html"); |
+ |
+ // Load the page and clear any set cookies. |
+ loadUrl(url + "#clear"); |
+ assertEquals("\"\"", runJavaScriptCodeInCurrentTab("getCookie()")); |
+ runJavaScriptCodeInCurrentTab("setCookie()"); |
+ assertEquals("\"Foo=Bar\"", runJavaScriptCodeInCurrentTab("getCookie()")); |
+ |
+ // Load the page again and ensure the cookie still is set. |
+ loadUrl(url); |
+ assertEquals("\"Foo=Bar\"", runJavaScriptCodeInCurrentTab("getCookie()")); |
+ } |
+ |
+ /** |
+ * Blocks cookies from being set and ensures that no cookies can be set. |
+ */ |
+ @SmallTest |
+ @Feature({"Preferences"}) |
+ public void testCookiesBlocked() throws Exception { |
+ Preferences preferenceActivity = |
+ startContentSettingsCategory(ContentPreferences.COOKIES_KEY); |
+ setCookiesEnabled(preferenceActivity, false); |
+ preferenceActivity.finish(); |
+ |
+ final String url = TestHttpServerClient.getUrl("chrome/test/data/android/cookie.html"); |
+ |
+ // Load the page and clear any set cookies. |
+ loadUrl(url + "#clear"); |
+ assertEquals("\"\"", runJavaScriptCodeInCurrentTab("getCookie()")); |
+ runJavaScriptCodeInCurrentTab("setCookie()"); |
+ assertEquals("\"\"", runJavaScriptCodeInCurrentTab("getCookie()")); |
+ |
+ // Load the page again and ensure the cookie remains unset. |
+ loadUrl(url); |
+ assertEquals("\"\"", runJavaScriptCodeInCurrentTab("getCookie()")); |
+ } |
+ |
+ /** |
+ * Sets Allow Popups Enabled to be false and make sure it is set correctly. |
+ * @throws Exception |
+ */ |
+ @SmallTest |
+ @Feature({"Preferences"}) |
+ public void testPopupsBlocked() throws Exception { |
+ setEnablePopups(false); |
+ |
+ // Test that the popup doesn't open. |
+ loadUrl(TestHttpServerClient.getUrl("chrome/test/data/android/popup.html")); |
+ |
+ getInstrumentation().waitForIdleSync(); |
+ assertEquals(1, getTabCount()); |
+ } |
+ |
+ /** |
+ * Sets Allow Popups Enabled to be true and make sure it is set correctly. |
+ * @throws Exception |
+ */ |
+ @SmallTest |
+ @Feature({"Preferences"}) |
+ public void testPopupsNotBlocked() throws Exception { |
+ setEnablePopups(true); |
+ |
+ // Test that a popup opens. |
+ loadUrl(TestHttpServerClient.getUrl("chrome/test/data/android/popup.html")); |
+ getInstrumentation().waitForIdleSync(); |
+ |
+ assertEquals(2, getTabCount()); |
+ } |
+ |
+ /** |
+ * Sets Allow Camera/Mic Enabled to be false and make sure it is set correctly. |
+ * @throws Exception |
+ */ |
+ @SmallTest |
+ @Feature({"Preferences"}) |
+ public void testCameraMicBlocked() throws Exception { |
+ setEnableCameraMic(false); |
+ |
+ // Test that the camera permission doesn't get requested. |
+ loadUrl(TestHttpServerClient.getUrl("content/test/data/media/getusermedia.html")); |
+ runJavaScriptCodeInCurrentTab("getUserMediaAndStop({video: true, audio: true});"); |
+ |
+ // No infobars are expected. |
+ assertTrue(getInfoBars().isEmpty()); |
+ } |
+ |
+ /** |
+ * Sets Allow Camera/Mic Enabled to be true and make sure it is set correctly. |
+ * @throws Exception |
+ */ |
+ @SmallTest |
+ @Feature({"Preferences"}) |
+ public void testCameraMicNotBlocked() throws Exception { |
+ setEnableCameraMic(true); |
+ |
+ InfoBarTestAnimationListener listener = setInfoBarAnimationListener(); |
+ |
+ // Launch a page that use geolocation and make sure an infobar shows up. |
+ loadUrl(TestHttpServerClient.getUrl("content/test/data/media/getusermedia.html")); |
+ runJavaScriptCodeInCurrentTab("getUserMediaAndStop({video: true, audio: true});"); |
+ |
+ assertTrue("InfoBar not added.", listener.addInfoBarAnimationFinished()); |
+ assertEquals("Wrong infobar count", 1, getInfoBars().size()); |
+ } |
+ |
+ private String runJavaScriptCodeInCurrentTab(String code) throws InterruptedException, |
+ TimeoutException { |
+ return JavaScriptUtils.executeJavaScriptAndWaitForResult( |
+ getActivity().getActiveContentViewCore().getWebContents(), code); |
+ } |
+ |
+ private List<InfoBar> getInfoBars() { |
+ return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<List<InfoBar>>() { |
+ @Override |
+ public List<InfoBar> call() throws Exception { |
+ return getActivity().getActiveTab().getInfoBarContainer().getInfoBars(); |
+ } |
+ }); |
+ } |
+ |
+ private int getTabCount() { |
+ return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Integer>() { |
+ @Override |
+ public Integer call() throws Exception { |
+ return getActivity().getTabModelSelector().getCurrentModel().getCount(); |
+ } |
+ }); |
+ } |
+} |