Index: chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java |
index c1ccfa873a856d92784cf20b397628316c9c87ca..8689b50062cfee8ef38868831f93586a002e3e79 100644 |
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java |
@@ -4,6 +4,7 @@ |
package org.chromium.chrome.browser.preferences.privacy; |
+import android.os.Environment; |
import android.preference.CheckBoxPreference; |
import android.preference.Preference; |
import android.preference.PreferenceScreen; |
@@ -12,9 +13,12 @@ import android.test.suitebuilder.annotation.LargeTest; |
import android.test.suitebuilder.annotation.MediumTest; |
import android.test.suitebuilder.annotation.SmallTest; |
import android.text.SpannableString; |
+import android.widget.ListView; |
import org.chromium.base.ThreadUtils; |
+import org.chromium.base.test.util.CommandLineFlags; |
import org.chromium.chrome.browser.ChromeActivity; |
+import org.chromium.chrome.browser.ChromeFeatureList; |
import org.chromium.chrome.browser.ShortcutHelper; |
import org.chromium.chrome.browser.preferences.ButtonPreference; |
import org.chromium.chrome.browser.preferences.PrefServiceBridge; |
@@ -26,7 +30,9 @@ import org.chromium.chrome.test.ChromeActivityTestCaseBase; |
import org.chromium.chrome.test.util.browser.signin.SigninTestUtil; |
import org.chromium.content.browser.test.util.Criteria; |
import org.chromium.content.browser.test.util.CriteriaHelper; |
+import org.chromium.net.test.EmbeddedTestServer; |
+import java.net.URL; |
import java.util.Arrays; |
import java.util.HashSet; |
import java.util.List; |
@@ -37,7 +43,7 @@ import java.util.Set; |
*/ |
public class ClearBrowsingDataPreferencesTest |
extends ChromeActivityTestCaseBase<ChromeActivity> { |
- |
+ private EmbeddedTestServer mTestServer; |
private boolean mCallbackCalled; |
private class CallbackCriteria extends Criteria { |
@@ -55,6 +61,19 @@ public class ClearBrowsingDataPreferencesTest |
} |
} |
+ @Override |
+ protected void setUp() throws Exception { |
+ super.setUp(); |
+ mTestServer = EmbeddedTestServer.createAndStartFileServer( |
+ getInstrumentation().getContext(), Environment.getExternalStorageDirectory()); |
+ } |
+ |
+ @Override |
+ protected void tearDown() throws Exception { |
+ mTestServer.stopAndDestroyServer(); |
+ super.tearDown(); |
+ } |
+ |
public ClearBrowsingDataPreferencesTest() { |
super(ChromeActivity.class); |
} |
@@ -65,6 +84,17 @@ public class ClearBrowsingDataPreferencesTest |
startMainActivityOnBlankPage(); |
} |
+ /** Waits for the progress dialog to disappear from the given CBD preference. */ |
+ private void waitForProgressToComplete(final ClearBrowsingDataPreferences preferences) |
+ throws Exception { |
+ CriteriaHelper.pollUiThread(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ return preferences.getProgressDialog() == null; |
+ } |
+ }); |
+ } |
+ |
/** |
* Tests that web apps are cleared when the "cookies and site data" option is selected. |
*/ |
@@ -81,28 +111,21 @@ public class ClearBrowsingDataPreferencesTest |
CriteriaHelper.pollUiThread(new CallbackCriteria()); |
setDataTypesToClear(Arrays.asList(DialogOption.CLEAR_COOKIES_AND_SITE_DATA)); |
- final Preferences preferences = |
- startPreferences(ClearBrowsingDataPreferences.class.getName()); |
+ final ClearBrowsingDataPreferences preferences = |
+ (ClearBrowsingDataPreferences) startPreferences( |
+ ClearBrowsingDataPreferences.class.getName()) |
+ .getFragmentForTest(); |
ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
@Override |
public void run() { |
- ClearBrowsingDataPreferences fragment = |
- (ClearBrowsingDataPreferences) preferences.getFragmentForTest(); |
- PreferenceScreen screen = fragment.getPreferenceScreen(); |
+ PreferenceScreen screen = preferences.getPreferenceScreen(); |
ButtonPreference clearButton = (ButtonPreference) screen.findPreference( |
ClearBrowsingDataPreferences.PREF_CLEAR_BUTTON); |
clearButton.getOnPreferenceClickListener().onPreferenceClick(clearButton); |
} |
}); |
- CriteriaHelper.pollUiThread(new Criteria() { |
- @Override |
- public boolean isSatisfied() { |
- ClearBrowsingDataPreferences fragment = |
- (ClearBrowsingDataPreferences) preferences.getFragmentForTest(); |
- return fragment.getProgressDialog() == null; |
- } |
- }); |
+ waitForProgressToComplete(preferences); |
WebappRegistry.getRegisteredWebappIds(getActivity(), new WebappRegistry.FetchCallback() { |
@Override |
@@ -143,28 +166,21 @@ public class ClearBrowsingDataPreferencesTest |
CriteriaHelper.pollUiThread(new CallbackCriteria()); |
setDataTypesToClear(Arrays.asList(DialogOption.CLEAR_HISTORY)); |
- final Preferences preferences = |
- startPreferences(ClearBrowsingDataPreferences.class.getName()); |
+ final ClearBrowsingDataPreferences preferences = |
+ (ClearBrowsingDataPreferences) startPreferences( |
+ ClearBrowsingDataPreferences.class.getName()) |
+ .getFragmentForTest(); |
ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
@Override |
public void run() { |
- ClearBrowsingDataPreferences fragment = |
- (ClearBrowsingDataPreferences) preferences.getFragmentForTest(); |
- PreferenceScreen screen = fragment.getPreferenceScreen(); |
+ PreferenceScreen screen = preferences.getPreferenceScreen(); |
ButtonPreference clearButton = (ButtonPreference) screen.findPreference( |
ClearBrowsingDataPreferences.PREF_CLEAR_BUTTON); |
clearButton.getOnPreferenceClickListener().onPreferenceClick(clearButton); |
} |
}); |
- CriteriaHelper.pollUiThread(new Criteria() { |
- @Override |
- public boolean isSatisfied() { |
- ClearBrowsingDataPreferences fragment = |
- (ClearBrowsingDataPreferences) preferences.getFragmentForTest(); |
- return fragment.getProgressDialog() == null; |
- } |
- }); |
+ waitForProgressToComplete(preferences); |
// The web app should still exist in the registry. |
WebappRegistry.getRegisteredWebappIds(getActivity(), new WebappRegistry.FetchCallback() { |
@@ -221,15 +237,15 @@ public class ClearBrowsingDataPreferencesTest |
public void testClearingEverything() throws Exception { |
setDataTypesToClear(Arrays.asList(DialogOption.values())); |
- final Preferences preferences = |
- startPreferences(ClearBrowsingDataPreferences.class.getName()); |
+ final ClearBrowsingDataPreferences preferences = |
+ (ClearBrowsingDataPreferences) startPreferences( |
+ ClearBrowsingDataPreferences.class.getName()) |
+ .getFragmentForTest(); |
ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
@Override |
public void run() { |
- ClearBrowsingDataPreferences fragment = |
- (ClearBrowsingDataPreferences) preferences.getFragmentForTest(); |
- PreferenceScreen screen = fragment.getPreferenceScreen(); |
+ PreferenceScreen screen = preferences.getPreferenceScreen(); |
for (int i = 0; i < screen.getPreferenceCount(); ++i) { |
Preference pref = screen.getPreference(i); |
@@ -247,14 +263,7 @@ public class ClearBrowsingDataPreferencesTest |
} |
}); |
- CriteriaHelper.pollUiThread(new Criteria() { |
- @Override |
- public boolean isSatisfied() { |
- ClearBrowsingDataPreferences fragment = |
- (ClearBrowsingDataPreferences) preferences.getFragmentForTest(); |
- return fragment.getProgressDialog() == null; |
- } |
- }); |
+ waitForProgressToComplete(preferences); |
} |
/** |
@@ -447,6 +456,212 @@ public class ClearBrowsingDataPreferencesTest |
CriteriaHelper.pollUiThread(new PreferenceScreenClosedCriterion(preferences3)); |
} |
+ /** This presses the 'clear' button on the root preference page. */ |
+ private Runnable getPressClearRunnable(final ClearBrowsingDataPreferences preferences) { |
+ return new Runnable() { |
+ @Override |
+ public void run() { |
+ PreferenceScreen screen = preferences.getPreferenceScreen(); |
+ ButtonPreference clearButton = (ButtonPreference) screen.findPreference( |
+ ClearBrowsingDataPreferences.PREF_CLEAR_BUTTON); |
+ assertTrue(clearButton.isEnabled()); |
+ clearButton.getOnPreferenceClickListener().onPreferenceClick(clearButton); |
+ } |
+ }; |
+ } |
+ |
+ /** This presses the clear button in the important sites dialog */ |
+ private Runnable getPressButtonInImportantDialogRunnable( |
+ final ClearBrowsingDataPreferences preferences, final int whichButton) { |
+ return new Runnable() { |
+ @Override |
+ public void run() { |
+ assertNotNull(preferences); |
+ ConfirmImportantSitesDialogFragment dialog = |
+ preferences.getImportantSitesDialogFragment(); |
+ ((AlertDialog) dialog.getDialog()).getButton(whichButton).performClick(); |
+ } |
+ }; |
+ } |
+ |
+ /** |
+ * This waits until the important dialog fragment & the given number of important sites are |
+ * shown. |
+ */ |
+ private void waitForImportantDialogToShow(final ClearBrowsingDataPreferences preferences, |
+ final int numImportantSites) throws Exception { |
+ CriteriaHelper.pollUiThread(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ assertNotNull(preferences); |
+ if (preferences.getImportantSitesDialogFragment() == null |
+ || !preferences.getImportantSitesDialogFragment().getDialog().isShowing()) { |
+ return false; |
+ } |
+ ListView sitesList = preferences.getImportantSitesDialogFragment().getSitesList(); |
+ return sitesList.getAdapter().getCount() == numImportantSites; |
+ } |
+ }); |
+ } |
+ |
+ /** This runnable marks the given origins as important. */ |
+ private Runnable getMarkOriginsAsImportantRunnable(final String[] importantOrigins) { |
+ return new Runnable() { |
+ @Override |
+ public void run() { |
+ for (String origin : importantOrigins) { |
+ PrefServiceBridge.markOriginAsImportantForTesting(origin); |
+ } |
+ } |
+ }; |
+ } |
+ |
+ /** |
+ * Tests that the important sites dialog is shown, and if we don't deselect anything we |
+ * correctly clear everything. |
+ */ |
+ @CommandLineFlags.Add({"enable-features=ImportantSitesInCBD", "enable-site-engagement"}) |
+ @MediumTest |
+ public void testImportantSitesDialogNoFiltering() throws Exception { |
+ // Sign in. |
+ SigninTestUtil.addAndSignInTestAccount(); |
+ assertTrue(ChromeFeatureList.isEnabled(ChromeFeatureList.IMPORTANT_SITES_IN_CBD)); |
+ |
+ final String testUrl = |
+ mTestServer.getURL("/chrome/test/data/android/storage_persistance.html"); |
+ final String serverOrigin = mTestServer.getURL("/"); |
+ final String[] importantOrigins = {"http://www.facebook.com", serverOrigin}; |
+ // First mark our origins as important. |
+ ThreadUtils.runOnUiThreadBlocking(getMarkOriginsAsImportantRunnable(importantOrigins)); |
+ |
+ // Load the page and clear any set storage. |
+ loadUrl(testUrl + "#clear"); |
+ assertEquals("false", runJavaScriptCodeInCurrentTab("hasAllStorage()")); |
+ runJavaScriptCodeInCurrentTab("setStorage()"); |
+ assertEquals("true", runJavaScriptCodeInCurrentTab("hasAllStorage()")); |
+ |
+ // Load the page again and ensure the cookie still is set. |
+ loadUrl(testUrl); |
+ assertEquals("true", runJavaScriptCodeInCurrentTab("hasAllStorage()")); |
+ |
+ ClearBrowsingDataPreferences preferences = |
+ (ClearBrowsingDataPreferences) startPreferences( |
+ ClearBrowsingDataPreferences.class.getName()) |
+ .getFragmentForTest(); |
+ |
+ // Clear in root preference. |
+ ThreadUtils.runOnUiThreadBlocking(getPressClearRunnable(preferences)); |
+ // Check that the important sites dialog is shown, and the list is visible. |
+ waitForImportantDialogToShow(preferences, 2); |
+ // Clear in important dialog. |
+ ThreadUtils.runOnUiThreadBlocking( |
+ getPressButtonInImportantDialogRunnable(preferences, AlertDialog.BUTTON_POSITIVE)); |
+ waitForProgressToComplete(preferences); |
+ |
+ // Verify we don't have storage. |
+ loadUrl(testUrl); |
+ assertEquals("false", runJavaScriptCodeInCurrentTab("hasAllStorage()")); |
+ } |
+ |
+ /** |
+ * Tests that the important sites dialog is shown and if we cancel nothing happens. |
+ */ |
+ @CommandLineFlags.Add({"enable-features=ImportantSitesInCBD", "enable-site-engagement"}) |
+ @MediumTest |
+ public void testImportantSitesDialogNoopOnCancel() throws Exception { |
+ // Sign in. |
+ SigninTestUtil.addAndSignInTestAccount(); |
+ assertTrue(ChromeFeatureList.isEnabled(ChromeFeatureList.IMPORTANT_SITES_IN_CBD)); |
+ |
+ final String testUrl = |
+ mTestServer.getURL("/chrome/test/data/android/storage_persistance.html"); |
+ final String serverOrigin = mTestServer.getURL("/"); |
+ final String[] importantOrigins = {"http://www.facebook.com", serverOrigin}; |
+ // First mark our origins as important. |
+ ThreadUtils.runOnUiThreadBlocking(getMarkOriginsAsImportantRunnable(importantOrigins)); |
+ |
+ // Load the page and clear any set storage. |
+ loadUrl(testUrl + "#clear"); |
+ assertEquals("false", runJavaScriptCodeInCurrentTab("hasAllStorage()")); |
+ runJavaScriptCodeInCurrentTab("setStorage()"); |
+ assertEquals("true", runJavaScriptCodeInCurrentTab("hasAllStorage()")); |
+ |
+ Preferences preferences = startPreferences(ClearBrowsingDataPreferences.class.getName()); |
+ ClearBrowsingDataPreferences fragment = |
+ (ClearBrowsingDataPreferences) preferences.getFragmentForTest(); |
+ ThreadUtils.runOnUiThreadBlocking(getPressClearRunnable(fragment)); |
+ // Check that the important sites dialog is shown, and the list is visible. |
+ waitForImportantDialogToShow(fragment, 2); |
+ // Press the cancel button. |
+ ThreadUtils.runOnUiThreadBlocking( |
+ getPressButtonInImportantDialogRunnable(fragment, AlertDialog.BUTTON_NEGATIVE)); |
+ preferences.finish(); |
+ loadUrl(testUrl); |
+ assertEquals("true", runJavaScriptCodeInCurrentTab("hasAllStorage()")); |
+ } |
+ |
+ /** |
+ * Tests that the important sites dialog is shown, we can successfully uncheck options, and |
+ * clicking clear doesn't clear the protected domain. |
+ */ |
+ @CommandLineFlags.Add({"enable-features=ImportantSitesInCBD", "enable-site-engagement"}) |
+ @MediumTest |
+ public void testImportantSitesDialog() throws Exception { |
+ // Sign in. |
+ SigninTestUtil.addAndSignInTestAccount(); |
+ assertTrue(ChromeFeatureList.isEnabled(ChromeFeatureList.IMPORTANT_SITES_IN_CBD)); |
+ |
+ final String testUrl = |
+ mTestServer.getURL("/chrome/test/data/android/storage_persistance.html"); |
+ final String serverOrigin = mTestServer.getURL("/"); |
+ final String serverHost = new URL(testUrl).getHost(); |
+ final String[] importantOrigins = {"http://www.facebook.com", serverOrigin}; |
+ |
+ // First mark our origins as important. |
+ ThreadUtils.runOnUiThreadBlocking(getMarkOriginsAsImportantRunnable(importantOrigins)); |
+ |
+ // Load the page and clear any set storage. |
+ loadUrl(testUrl + "#clear"); |
+ assertEquals("false", runJavaScriptCodeInCurrentTab("hasAllStorage()")); |
+ runJavaScriptCodeInCurrentTab("setStorage()"); |
+ assertEquals("true", runJavaScriptCodeInCurrentTab("hasAllStorage()")); |
+ |
+ final Preferences preferences = |
+ startPreferences(ClearBrowsingDataPreferences.class.getName()); |
+ final ClearBrowsingDataPreferences fragment = |
+ (ClearBrowsingDataPreferences) preferences.getFragmentForTest(); |
+ |
+ // Uncheck the first item (our internal web server). |
+ ThreadUtils.runOnUiThreadBlocking(getPressClearRunnable(fragment)); |
+ waitForImportantDialogToShow(fragment, 2); |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
+ @Override |
+ public void run() { |
+ ListView sitesList = fragment.getImportantSitesDialogFragment().getSitesList(); |
+ sitesList.performItemClick( |
+ sitesList.getChildAt(0), 0, sitesList.getAdapter().getItemId(0)); |
+ } |
+ }); |
+ |
+ // Check that our server origin is in the set of deselected domains. |
+ CriteriaHelper.pollUiThread(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ ConfirmImportantSitesDialogFragment dialog = |
+ fragment.getImportantSitesDialogFragment(); |
+ return dialog.getDeselectedDomains().contains(serverHost); |
+ } |
+ }); |
+ |
+ // Click the clear button. |
+ ThreadUtils.runOnUiThreadBlocking( |
+ getPressButtonInImportantDialogRunnable(fragment, AlertDialog.BUTTON_POSITIVE)); |
+ |
+ waitForProgressToComplete(fragment); |
+ // And check we didn't clear our cookies. |
+ assertEquals("true", runJavaScriptCodeInCurrentTab("hasAllStorage()")); |
+ } |
+ |
private void setDataTypesToClear(final List<DialogOption> typesToClear) { |
ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
@Override |