Commit 9bf4ba9b authored by Christian Dullweber's avatar Christian Dullweber Committed by Commit Bot

Show storage usage in PageInfo

Show amount of used storage in cookies page in PageInfo.
Fix cookie deletion by using a populated website object.

Screenshot: https://crbug.com/1077766#c46
Bug: 1077766
Change-Id: Ifce703ba4af9bdd14da8403516871b7c8001eb02
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2416371
Commit-Queue: Christian Dullweber <dullweber@chromium.org>
Reviewed-by: default avatarEhimare Okoyomon <eokoyomon@chromium.org>
Cr-Commit-Position: refs/heads/master@{#809750}
parent 509fe7c0
......@@ -8,11 +8,17 @@ import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.Visibility.GONE;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.chromium.chrome.test.util.ViewUtils.onViewWaiting;
import static org.chromium.components.content_settings.PrefNames.COOKIE_CONTROLS_MODE;
import android.os.Build;
......@@ -45,6 +51,7 @@ import org.chromium.components.location.LocationUtils;
import org.chromium.components.page_info.PageInfoController;
import org.chromium.components.page_info.PageInfoFeatureList;
import org.chromium.components.user_prefs.UserPrefs;
import org.chromium.content_public.browser.test.util.JavaScriptUtils;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.content_public.common.ContentSwitches;
import org.chromium.net.test.EmbeddedTestServerRule;
......@@ -53,6 +60,7 @@ import org.chromium.ui.test.util.DisableAnimationsTestRule;
import org.chromium.ui.test.util.RenderTestRule;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* Tests for PageInfoView. Uses pixel tests to ensure the UI handles different
......@@ -62,6 +70,12 @@ import java.io.IOException;
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
ContentSwitches.HOST_RESOLVER_RULES + "=MAP * 127.0.0.1"})
public class PageInfoViewTest {
private static final String sSimpleHtml = "/chrome/test/data/android/simple.html";
private static final String sSiteDataHtml = "/content/test/data/browsing_data/site_data.html";
private static String[] sCookieDataTypes = {"Cookie", "LocalStorage", "ServiceWorker",
"CacheStorage", "IndexedDb", "FileSystem", "WebSql"};
@Rule
public ChromeActivityTestRule<ChromeActivity> mActivityTestRule =
new ChromeActivityTestRule<>(ChromeActivity.class);
......@@ -85,8 +99,6 @@ public class PageInfoViewTest {
@ClassRule
public static DisableAnimationsTestRule disableAnimationsRule = new DisableAnimationsTestRule();
private final String mPath = "/chrome/test/data/android/simple.html";
private void loadUrlAndOpenPageInfo(String url) {
mActivityTestRule.loadUrl(url);
onView(withId(R.id.location_bar_status_icon)).perform(click());
......@@ -107,6 +119,23 @@ public class PageInfoViewTest {
});
}
private String runJavascriptAsync(String type) throws TimeoutException {
return JavaScriptUtils.runJavascriptWithAsyncResult(
mActivityTestRule.getWebContents(), type);
}
private void expectHasCookies(boolean hasData) throws TimeoutException {
for (String type : sCookieDataTypes) {
assertEquals(hasData ? "true" : "false", runJavascriptAsync("has" + type + "()"));
}
}
private void createCookies() throws TimeoutException {
for (String type : sCookieDataTypes) {
runJavascriptAsync("set" + type + "()");
}
}
private void addSomePermissions(String url) {
TestThreadUtils.runOnUiThreadBlocking(() -> {
WebsitePreferenceBridge.setContentSettingForPattern(Profile.getLastUsedRegularProfile(),
......@@ -158,7 +187,7 @@ public class PageInfoViewTest {
@Feature({"RenderTest"})
public void testShowOnInsecureHttpWebsite() throws IOException {
mTestServerRule.setServerUsesHttps(false);
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
mRenderTestRule.render(getPageInfoView(), "PageInfo_HttpWebsite");
}
......@@ -169,7 +198,7 @@ public class PageInfoViewTest {
@MediumTest
@Feature({"RenderTest"})
public void testShowOnSecureWebsite() throws IOException {
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
mRenderTestRule.render(getPageInfoView(), "PageInfo_SecureWebsite");
}
......@@ -181,7 +210,7 @@ public class PageInfoViewTest {
@Feature({"RenderTest"})
public void testShowOnExpiredCertificateWebsite() throws IOException {
mTestServerRule.setCertificateType(ServerCertificate.CERT_EXPIRED);
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
mRenderTestRule.render(getPageInfoView(), "PageInfo_ExpiredCertWebsite");
}
......@@ -206,7 +235,7 @@ public class PageInfoViewTest {
public void testShowWithPermissions() throws IOException {
mIsSystemLocationSettingEnabled = false;
addSomePermissions(mTestServerRule.getServer().getURL("/"));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
mRenderTestRule.render(getPageInfoView(), "PageInfo_Permissions");
}
......@@ -218,7 +247,7 @@ public class PageInfoViewTest {
@Feature({"RenderTest"})
public void testShowWithCookieBlocking() throws IOException {
setThirdPartyCookieBlocking(CookieControlsMode.BLOCK_THIRD_PARTY);
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
mRenderTestRule.render(getPageInfoView(), "PageInfo_CookieBlocking");
}
......@@ -231,7 +260,7 @@ public class PageInfoViewTest {
public void testShowWithPermissionsAndCookieBlocking() throws IOException {
addSomePermissions(mTestServerRule.getServer().getURL("/"));
setThirdPartyCookieBlocking(CookieControlsMode.BLOCK_THIRD_PARTY);
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
mRenderTestRule.render(getPageInfoView(), "PageInfo_PermissionsAndCookieBlocking");
}
......@@ -243,7 +272,7 @@ public class PageInfoViewTest {
@Feature({"RenderTest"})
public void testShowWithDefaultSettingPermissions() throws IOException {
addDefaultSettingPermissions(mTestServerRule.getServer().getURL("/"));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
mRenderTestRule.render(getPageInfoView(), "PageInfo_DefaultSettingPermissions");
}
......@@ -255,7 +284,7 @@ public class PageInfoViewTest {
@Feature({"RenderTest"})
@Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
public void testShowOnSecureWebsiteV2() throws IOException {
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
mRenderTestRule.render(getPageInfoView(), "PageInfo_SecureWebsiteV2");
}
......@@ -267,7 +296,7 @@ public class PageInfoViewTest {
@Feature({"RenderTest"})
@Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
public void testShowConnectionInfoSubpage() throws IOException {
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
onView(withId(R.id.page_info_connection_row)).perform(click());
mRenderTestRule.render(getPageInfoView(), "PageInfo_ConnectionInfoSubpage");
}
......@@ -280,7 +309,7 @@ public class PageInfoViewTest {
@MediumTest
@Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
public void testNoPermissionsSubpage() throws IOException {
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
View dialog = (View) getPageInfoView().getParent();
onView(withId(R.id.page_info_permissions_row))
.check(matches(withEffectiveVisibility(GONE)));
......@@ -295,7 +324,7 @@ public class PageInfoViewTest {
@Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
public void testShowPermissionsSubpage() throws IOException {
addSomePermissions(mTestServerRule.getServer().getURL("/"));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
onView(withId(R.id.page_info_permissions_row)).perform(click());
mRenderTestRule.render(getPageInfoView(), "PageInfo_PermissionsSubpage");
}
......@@ -309,10 +338,34 @@ public class PageInfoViewTest {
@Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
public void testShowCookiesSubpage() throws IOException {
setThirdPartyCookieBlocking(CookieControlsMode.BLOCK_THIRD_PARTY);
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
onView(withId(R.id.page_info_cookies_row)).perform(click());
mRenderTestRule.render(getPageInfoView(), "PageInfo_CookiesSubpage");
}
/**
* Tests clearing cookies on the cookies page of the new PageInfo UI.
*/
@Test
@MediumTest
@Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
public void testClearCookiesOnSubpage() throws Exception {
mActivityTestRule.loadUrl(mTestServerRule.getServer().getURL(sSiteDataHtml));
// Create cookies.
expectHasCookies(false);
createCookies();
expectHasCookies(true);
// Go to cookies subpage.
onView(withId(R.id.location_bar_status_icon)).perform(click());
onView(withId(R.id.page_info_cookies_row)).perform(click());
// Check that cookies usage is displayed.
onViewWaiting(allOf(withText(containsString("stored data")), isDisplayed()));
// Clear cookies in page info.
onView(withText("Clear cookies")).perform(click());
// Wait until the UI navigates back and check cookies are deleted.
onViewWaiting(allOf(withId(R.id.page_info_cookies_row), isDisplayed()));
expectHasCookies(false);
}
// TODO(1071762): Add tests for preview pages, offline pages, offline state and other states.
}
......@@ -277,7 +277,7 @@ public class SingleWebsiteSettings extends SiteSettingsPreferenceFragment
* @param websites The websites to search in.
* @return The merged website.
*/
private static Website mergePermissionAndStorageInfoForTopLevelOrigin(
public static Website mergePermissionAndStorageInfoForTopLevelOrigin(
WebsiteAddress address, Collection<Website> websites) {
String origin = address.getOrigin();
String host = Uri.parse(origin).getHost();
......
......@@ -9,15 +9,20 @@ import android.view.ViewGroup;
import androidx.appcompat.app.AppCompatActivity;
import org.chromium.components.browser_ui.site_settings.SingleWebsiteSettings;
import org.chromium.components.browser_ui.site_settings.SiteDataCleaner;
import org.chromium.components.browser_ui.site_settings.SiteSettingsCategory;
import org.chromium.components.browser_ui.site_settings.Website;
import org.chromium.components.browser_ui.site_settings.WebsiteAddress;
import org.chromium.components.browser_ui.site_settings.WebsitePermissionsFetcher;
import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge;
import org.chromium.components.content_settings.CookieControlsBridge;
import org.chromium.components.content_settings.CookieControlsEnforcement;
import org.chromium.components.content_settings.CookieControlsObserver;
import org.chromium.components.embedder_support.util.Origin;
import java.util.Collection;
/**
* Class for controlling the page info cookies section.
*/
......@@ -35,6 +40,7 @@ public class PageInfoCookiesController
private int mBlockedCookies;
private int mStatus;
private boolean mIsEnforced;
private Website mWebsite;
public PageInfoCookiesController(PageInfoMainController mainController, PageInfoRowView rowView,
PageInfoControllerDelegate delegate, String fullUrl) {
......@@ -80,18 +86,31 @@ public class PageInfoCookiesController
mSubPage.setCookiesCount(mAllowedCookies, mBlockedCookies);
mSubPage.setCookieBlockingStatus(mStatus, mIsEnforced);
SiteSettingsCategory storageCategory = SiteSettingsCategory.createFromType(
mMainController.getBrowserContext(), SiteSettingsCategory.Type.USE_STORAGE);
new WebsitePermissionsFetcher(mMainController.getBrowserContext())
.fetchPreferencesForCategory(storageCategory, this::onStorageFetched);
return mSubPage.requireView();
}
private void onStorageFetched(Collection<Website> result) {
String origin = Origin.createOrThrow(mFullUrl).toString();
WebsiteAddress address = WebsiteAddress.create(origin);
mWebsite = SingleWebsiteSettings.mergePermissionAndStorageInfoForTopLevelOrigin(
address, result);
mSubPage.setStorageUsage(mWebsite.getTotalUsage());
}
private void onCheckedChangedCallback(boolean state) {
mBridge.setThirdPartyCookieBlockingEnabledForSite(state);
}
private void clearData() {
String origin = Origin.createOrThrow(mFullUrl).toString();
WebsiteAddress address = WebsiteAddress.create(origin);
new SiteDataCleaner().clearData(mMainController.getBrowserContext(),
new Website(address, address), mMainController::exitSubpage);
if (mWebsite == null) return;
new SiteDataCleaner().clearData(
mMainController.getBrowserContext(), mWebsite, mMainController::exitSubpage);
}
@Override
......
......@@ -4,6 +4,7 @@
package org.chromium.components.page_info;
import android.os.Bundle;
import android.text.format.Formatter;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
......@@ -94,4 +95,12 @@ public class PageInfoCookiesPreference extends PreferenceFragmentCompat {
mCookieInUse.setTitle(getContext().getResources().getQuantityString(
R.plurals.page_info_cookies_in_use, allowedCookies, allowedCookies));
}
public void setStorageUsage(long storageUsage) {
mCookieInUse.setSummary(
storageUsage > 0 ? String.format(
getContext().getString(R.string.origin_settings_storage_usage_brief),
Formatter.formatShortFileSize(getContext(), storageUsage))
: null);
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment