chromium/chrome/browser/profiles/android/java/src/org/chromium/chrome/browser/profiles/ProfileManagerUtils.java

// Copyright 2017 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.chrome.browser.profiles;

import android.os.SystemClock;

import org.jni_zero.NativeMethods;

import org.chromium.base.TraceEvent;
import org.chromium.base.shared_preferences.SharedPreferencesManager;
import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;

/** A utility class for applying operations on all loaded profiles. */
public class ProfileManagerUtils {
    private static final long BOOT_TIMESTAMP_MARGIN_MS = 1000;

    /**
     * Commits pending writes for all loaded profiles. The host activity should call this during its
     * onPause() handler to ensure all state is saved when the app is suspended.
     */
    public static void flushPersistentDataForAllProfiles() {
        try {
            TraceEvent.begin("ProfileManagerUtils.commitPendingWritesForAllProfiles");
            ProfileManagerUtilsJni.get().flushPersistentDataForAllProfiles();
        } finally {
            TraceEvent.end("ProfileManagerUtils.commitPendingWritesForAllProfiles");
        }
    }

    /**
     * Removes all session cookies (cookies with no expiration date). This should be called after
     * device reboots. This function incorrectly clears cookies when Daylight Savings Time changes
     * the clock. Without a way to get a monotonically increasing system clock, the boot timestamp
     * will be off by one hour. However, this should only happen at most once when the clock changes
     * since the updated timestamp is immediately saved.
     */
    public static void removeSessionCookiesForAllProfiles() {
        SharedPreferencesManager preferences = ChromeSharedPreferences.getInstance();
        long lastKnownBootTimestamp =
                preferences.readLong(ChromePreferenceKeys.PROFILES_BOOT_TIMESTAMP, 0);
        long bootTimestamp = System.currentTimeMillis() - SystemClock.uptimeMillis();
        long difference = bootTimestamp - lastKnownBootTimestamp;

        // Allow some leeway to account for fractions of milliseconds.
        if (Math.abs(difference) > BOOT_TIMESTAMP_MARGIN_MS) {
            ProfileManagerUtilsJni.get().removeSessionCookiesForAllProfiles();

            preferences.writeLong(ChromePreferenceKeys.PROFILES_BOOT_TIMESTAMP, bootTimestamp);
        }
    }

    @NativeMethods
    interface Natives {
        void flushPersistentDataForAllProfiles();

        void removeSessionCookiesForAllProfiles();
    }
}