chromium/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteDataCleaner.java

// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.components.browser_ui.site_settings;

import org.chromium.components.content_settings.ContentSettingValues;
import org.chromium.content_public.browser.BrowserContextHandle;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Encapsulates clearing the data of {@link Website}s and {@link WebsiteGroup}s.
 * Requires native library to be initialized.
 */
public class SiteDataCleaner {
    /**
     * Clears the data of the specified site.
     *
     * @param finishCallback is called when finished.
     */
    public static void clearData(
            SiteSettingsDelegate siteSettingsDelegate, Website site, Runnable finishCallback) {
        String origin = site.getAddress().getOrigin();
        var browserContextHandle = siteSettingsDelegate.getBrowserContextHandle();
        WebsitePreferenceBridgeJni.get().clearCookieData(browserContextHandle, origin);

        if (!siteSettingsDelegate.isBrowsingDataModelFeatureEnabled()) {
            WebsitePreferenceBridgeJni.get().clearMediaLicenses(browserContextHandle, origin);
        }

        WebsitePreferenceBridgeJni.get().clearBannerData(browserContextHandle, origin);
        site.clearAllStoredData(siteSettingsDelegate, finishCallback::run);
    }

    /**
     * Clears the data for each of the sites in a given group.
     *
     * @param finishCallback is called when the entire operation is finished.
     */
    public static void clearData(
            SiteSettingsDelegate siteSettingsDelegate,
            WebsiteGroup group,
            Runnable finishCallback) {

        final AtomicInteger callbacksReceived = new AtomicInteger(0);
        List<Website> sites = group.getWebsites();
        final int websitesCount = sites.size();
        final Runnable singleWebsiteCallback =
                () -> {
                    if (callbacksReceived.incrementAndGet() >= websitesCount) {
                        finishCallback.run();
                    }
                };
        for (Website site : sites) {
            clearData(siteSettingsDelegate, site, singleWebsiteCallback);
        }
    }

    /** Resets the permissions of the specified site. */
    public static void resetPermissions(BrowserContextHandle browserContextHandle, Website site) {
        // Clear the permissions.
        for (ContentSettingException exception : site.getContentSettingExceptions()) {
            site.setContentSetting(
                    browserContextHandle,
                    exception.getContentSettingType(),
                    ContentSettingValues.DEFAULT);
        }
        for (PermissionInfo info : site.getPermissionInfos()) {
            site.setContentSetting(
                    browserContextHandle,
                    info.getContentSettingsType(),
                    ContentSettingValues.DEFAULT);
        }

        for (ChosenObjectInfo info : site.getChosenObjectInfo()) {
            info.revoke(browserContextHandle);
        }

        for (var exceptions : site.getEmbeddedPermissions().values()) {
            for (var exception : exceptions) {
                exception.setContentSetting(browserContextHandle, ContentSettingValues.DEFAULT);
            }
        }
    }

    /** Resets the permissions for each of the sites in a given group. */
    public static void resetPermissions(
            BrowserContextHandle browserContextHandle, WebsiteGroup group) {
        for (Website site : group.getWebsites()) {
            resetPermissions(browserContextHandle, site);
        }
    }
}