19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.webkit;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.WebAddress;
2045a9a14006214e6478311ffcb980e766702d5a76Doug Zongker
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
2277db9990777efd100bee4ec47568414ea039e99bSteve Block * Manages the cookies used by an application's {@link WebView} instances.
2377db9990777efd100bee4ec47568414ea039e99bSteve Block * Cookies are manipulated according to RFC2109.
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
25939e5040b51539be561db1d18dec18196f201f5cJonathan Dixonpublic class CookieManager {
26d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon    /**
27d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon     * @hide Only for use by WebViewProvider implementations
28d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon     */
29d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon    protected CookieManager() {
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon    @Override
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Object clone() throws CloneNotSupportedException {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new CloneNotSupportedException("doesn't implement Cloneable");
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3877db9990777efd100bee4ec47568414ea039e99bSteve Block     * Gets the singleton CookieManager instance. If this method is used
3977db9990777efd100bee4ec47568414ea039e99bSteve Block     * before the application instantiates a {@link WebView} instance,
40c723e35336e764a1e708f1a4a8ee3f7bff711c0fSteve Block     * {@link CookieSyncManager#createInstance CookieSyncManager.createInstance(Context)}
41c723e35336e764a1e708f1a4a8ee3f7bff711c0fSteve Block     * must be called first.
42d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon     *
434e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * @return the singleton CookieManager instance
4406312cae6b0e00c4ccbe84e9c682de8d607897a9Patrick Scott     */
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static synchronized CookieManager getInstance() {
46d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon        return WebViewFactory.getProvider().getCookieManager();
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5077db9990777efd100bee4ec47568414ea039e99bSteve Block     * Sets whether the application's {@link WebView} instances should send and
5177db9990777efd100bee4ec47568414ea039e99bSteve Block     * accept cookies.
524e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     *
534e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * @param accept whether {@link WebView} instances should send and accept
5477db9990777efd100bee4ec47568414ea039e99bSteve Block     *               cookies
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public synchronized void setAcceptCookie(boolean accept) {
57d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon        throw new MustOverrideException();
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6177db9990777efd100bee4ec47568414ea039e99bSteve Block     * Gets whether the application's {@link WebView} instances send and accept
6277db9990777efd100bee4ec47568414ea039e99bSteve Block     * cookies.
634e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     *
644e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * @return true if {@link WebView} instances send and accept cookies
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public synchronized boolean acceptCookie() {
67d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon        throw new MustOverrideException();
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon     /**
7177db9990777efd100bee4ec47568414ea039e99bSteve Block     * Sets a cookie for the given URL. Any existing cookie with the same host,
7277db9990777efd100bee4ec47568414ea039e99bSteve Block     * path and name will be replaced with the new cookie. The cookie being set
7377db9990777efd100bee4ec47568414ea039e99bSteve Block     * must not have expired and must not be a session cookie, otherwise it
7477db9990777efd100bee4ec47568414ea039e99bSteve Block     * will be ignored.
754e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     *
764e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * @param url the URL for which the cookie is set
774e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * @param value the cookie as a string, using the format of the 'Set-Cookie'
78d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon     *              HTTP response header
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCookie(String url, String value) {
81d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon        throw new MustOverrideException();
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8577db9990777efd100bee4ec47568414ea039e99bSteve Block     * Gets the cookies for the given URL.
864e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     *
874e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * @param url the URL for which the cookies are requested
884e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * @return value the cookies as a string, using the format of the 'Cookie'
8977db9990777efd100bee4ec47568414ea039e99bSteve Block     *               HTTP request header
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getCookie(String url) {
92d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon        throw new MustOverrideException();
93469aebbbd92a5300c5ebd6a420ca48976d21e9d1Kristian Monsen    }
94469aebbbd92a5300c5ebd6a420ca48976d21e9d1Kristian Monsen
95469aebbbd92a5300c5ebd6a420ca48976d21e9d1Kristian Monsen    /**
964e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * See {@link #getCookie(String)}.
974e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     *
984e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * @param url the URL for which the cookies are requested
994e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * @param privateBrowsing whether to use the private browsing cookie jar
1004e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * @return value the cookies as a string, using the format of the 'Cookie'
10177db9990777efd100bee4ec47568414ea039e99bSteve Block     *               HTTP request header
10277db9990777efd100bee4ec47568414ea039e99bSteve Block     * @hide Used by Browser, no intention to publish.
103469aebbbd92a5300c5ebd6a420ca48976d21e9d1Kristian Monsen     */
104469aebbbd92a5300c5ebd6a420ca48976d21e9d1Kristian Monsen    public String getCookie(String url, boolean privateBrowsing) {
105d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon        throw new MustOverrideException();
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1094e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * Gets cookie(s) for a given uri so that it can be set to "cookie:" in http
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * request header.
1114e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     *
1124e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * @param uri the WebAddress for which the cookies are requested
1134e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * @return value the cookies as a string, using the format of the 'Cookie'
11477db9990777efd100bee4ec47568414ea039e99bSteve Block     *               HTTP request header
11577db9990777efd100bee4ec47568414ea039e99bSteve Block     * @hide Used by RequestHandle, no intention to publish.
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public synchronized String getCookie(WebAddress uri) {
118d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon        throw new MustOverrideException();
119851730552166bf6e99ed60438ba91f09f36b829fKristian Monsen    }
120851730552166bf6e99ed60438ba91f09f36b829fKristian Monsen
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12277db9990777efd100bee4ec47568414ea039e99bSteve Block     * Removes all session cookies, which are cookies without an expiration
12377db9990777efd100bee4ec47568414ea039e99bSteve Block     * date.
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeSessionCookie() {
126d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon        throw new MustOverrideException();
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13077db9990777efd100bee4ec47568414ea039e99bSteve Block     * Removes all cookies.
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeAllCookie() {
133d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon        throw new MustOverrideException();
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13777db9990777efd100bee4ec47568414ea039e99bSteve Block     * Gets whether there are stored cookies.
1384e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     *
1394e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * @return true if there are stored cookies
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public synchronized boolean hasCookies() {
142d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon        throw new MustOverrideException();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
146d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon     * See {@link #hasCookies()}.
1474e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     *
1484e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * @param privateBrowsing whether to use the private browsing cookie jar
14977db9990777efd100bee4ec47568414ea039e99bSteve Block     * @hide Used by Browser, no intention to publish.
150469aebbbd92a5300c5ebd6a420ca48976d21e9d1Kristian Monsen     */
151469aebbbd92a5300c5ebd6a420ca48976d21e9d1Kristian Monsen    public synchronized boolean hasCookies(boolean privateBrowsing) {
152d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon        throw new MustOverrideException();
153469aebbbd92a5300c5ebd6a420ca48976d21e9d1Kristian Monsen    }
154469aebbbd92a5300c5ebd6a420ca48976d21e9d1Kristian Monsen
155469aebbbd92a5300c5ebd6a420ca48976d21e9d1Kristian Monsen    /**
15677db9990777efd100bee4ec47568414ea039e99bSteve Block     * Removes all expired cookies.
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeExpiredCookie() {
159d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon        throw new MustOverrideException();
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1634e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * Flushes all cookies managed by the Chrome HTTP stack to flash.
164d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon     *
165d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon     * @hide Package level api, called from CookieSyncManager
166c40fc2c31a55f7e8312aa2721bf51fcb74bb3a95Iain Merrick     */
167d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon    protected void flushCookieStore() {
168d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon        throw new MustOverrideException();
169c40fc2c31a55f7e8312aa2721bf51fcb74bb3a95Iain Merrick    }
170c40fc2c31a55f7e8312aa2721bf51fcb74bb3a95Iain Merrick
171c40fc2c31a55f7e8312aa2721bf51fcb74bb3a95Iain Merrick    /**
17277db9990777efd100bee4ec47568414ea039e99bSteve Block     * Gets whether the application's {@link WebView} instances send and accept
17377db9990777efd100bee4ec47568414ea039e99bSteve Block     * cookies for file scheme URLs.
1744e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     *
1754e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * @return true if {@link WebView} instances send and accept cookies for
17677db9990777efd100bee4ec47568414ea039e99bSteve Block     *         file scheme URLs
17716d041cc9f4b67c37abf7dc5f8d49c7de81f2c84Kristian Monsen     */
178be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon    // Static for backward compatibility.
17916d041cc9f4b67c37abf7dc5f8d49c7de81f2c84Kristian Monsen    public static boolean allowFileSchemeCookies() {
180be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon        return getInstance().allowFileSchemeCookiesImpl();
181be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon    }
182be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon
183be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon    /**
1844e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * Implements {@link #allowFileSchemeCookies()}.
1854e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     *
186be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon     * @hide Only for use by WebViewProvider implementations
187be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon     */
188be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon    protected boolean allowFileSchemeCookiesImpl() {
189be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon        throw new MustOverrideException();
19016d041cc9f4b67c37abf7dc5f8d49c7de81f2c84Kristian Monsen    }
19116d041cc9f4b67c37abf7dc5f8d49c7de81f2c84Kristian Monsen
19216d041cc9f4b67c37abf7dc5f8d49c7de81f2c84Kristian Monsen    /**
19377db9990777efd100bee4ec47568414ea039e99bSteve Block     * Sets whether the application's {@link WebView} instances should send and
19477db9990777efd100bee4ec47568414ea039e99bSteve Block     * accept cookies for file scheme URLs.
19577db9990777efd100bee4ec47568414ea039e99bSteve Block     * Use of cookies with file scheme URLs is potentially insecure. Do not use
19677db9990777efd100bee4ec47568414ea039e99bSteve Block     * this feature unless you can be sure that no unintentional sharing of
19777db9990777efd100bee4ec47568414ea039e99bSteve Block     * cookie data can take place.
19816d041cc9f4b67c37abf7dc5f8d49c7de81f2c84Kristian Monsen     * <p>
19977db9990777efd100bee4ec47568414ea039e99bSteve Block     * Note that calls to this method will have no effect if made after a
20077db9990777efd100bee4ec47568414ea039e99bSteve Block     * {@link WebView} or CookieManager instance has been created.
20116d041cc9f4b67c37abf7dc5f8d49c7de81f2c84Kristian Monsen     */
202be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon    // Static for backward compatibility.
20316d041cc9f4b67c37abf7dc5f8d49c7de81f2c84Kristian Monsen    public static void setAcceptFileSchemeCookies(boolean accept) {
204be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon        getInstance().setAcceptFileSchemeCookiesImpl(accept);
205be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon    }
206be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon
207be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon    /**
2084e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     * Implements {@link #setAcceptFileSchemeCookies(boolean)}.
2094e584df4cee8334bc371c04a67bcd0a32e2f9480Steve Block     *
210be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon     * @hide Only for use by WebViewProvider implementations
211be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon     */
212be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon    protected void setAcceptFileSchemeCookiesImpl(boolean accept) {
213be58c40646ed5694136970cf0e88ffd6087a3c2aJonathan Dixon        throw new MustOverrideException();
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
216