Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e81c9609 authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge change I8c92c39b into eclair-mr2

* changes:
  Add postdata identifier so that if we cache the post result, we will use (url+postIdentifier) as the key for the CacheResult.
parents 0e983864 8c92c39b
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -541,6 +541,7 @@ class BrowserFrame extends Handler {
                                              String method,
                                              HashMap headers,
                                              byte[] postData,
                                              long postDataIdentifier,
                                              int cacheMode,
                                              boolean synchronous) {
        PerfChecker checker = new PerfChecker();
@@ -612,8 +613,9 @@ class BrowserFrame extends Handler {
        }

        // Create a LoadListener
        LoadListener loadListener = LoadListener.getLoadListener(mContext, this, url,
                loaderHandle, synchronous, isMainFramePage);
        LoadListener loadListener = LoadListener.getLoadListener(mContext,
                this, url, loaderHandle, synchronous, isMainFramePage,
                postDataIdentifier);

        mCallbackProxy.onLoadResource(url);

+37 −8
Original line number Diff line number Diff line
@@ -283,16 +283,24 @@ public final class CacheManager {
    // only called from WebCore thread
    public static CacheResult getCacheFile(String url,
            Map<String, String> headers) {
        return getCacheFile(url, 0, headers);
    }

    // only called from WebCore thread
    static CacheResult getCacheFile(String url, long postIdentifier,
            Map<String, String> headers) {
        if (mDisabled) {
            return null;
        }

        CacheResult result = mDataBase.getCache(url);
        String databaseKey = getDatabaseKey(url, postIdentifier);

        CacheResult result = mDataBase.getCache(databaseKey);
        if (result != null) {
            if (result.contentLength == 0) {
                if (!checkCacheRedirect(result.httpStatusCode)) {
                    // this should not happen. If it does, remove it.
                    mDataBase.removeCache(url);
                    mDataBase.removeCache(databaseKey);
                    return null;
                }
            } else {
@@ -304,7 +312,7 @@ public final class CacheManager {
                } catch (FileNotFoundException e) {
                    // the files in the cache directory can be removed by the
                    // system. If it is gone, clean up the database
                    mDataBase.removeCache(url);
                    mDataBase.removeCache(databaseKey);
                    return null;
                }
            }
@@ -352,14 +360,24 @@ public final class CacheManager {
    // only called from WebCore thread
    public static CacheResult createCacheFile(String url, int statusCode,
            Headers headers, String mimeType, boolean forceCache) {
        return createCacheFile(url, statusCode, headers, mimeType, 0,
                forceCache);
    }

    // only called from WebCore thread
    static CacheResult createCacheFile(String url, int statusCode,
            Headers headers, String mimeType, long postIdentifier,
            boolean forceCache) {
        if (!forceCache && mDisabled) {
            return null;
        }

        String databaseKey = getDatabaseKey(url, postIdentifier);

        // according to the rfc 2616, the 303 response MUST NOT be cached.
        if (statusCode == 303) {
            // remove the saved cache if there is any
            mDataBase.removeCache(url);
            mDataBase.removeCache(databaseKey);
            return null;
        }

@@ -367,7 +385,7 @@ public final class CacheManager {
        // header.
        if (checkCacheRedirect(statusCode) && !headers.getSetCookie().isEmpty()) {
            // remove the saved cache if there is any
            mDataBase.removeCache(url);
            mDataBase.removeCache(databaseKey);
            return null;
        }

@@ -375,9 +393,9 @@ public final class CacheManager {
        if (ret == null) {
            // this should only happen if the headers has "no-store" in the
            // cache-control. remove the saved cache if there is any
            mDataBase.removeCache(url);
            mDataBase.removeCache(databaseKey);
        } else {
            setupFiles(url, ret);
            setupFiles(databaseKey, ret);
            try {
                ret.outStream = new FileOutputStream(ret.outFile);
            } catch (FileNotFoundException e) {
@@ -408,6 +426,12 @@ public final class CacheManager {
     */
    // only called from WebCore thread
    public static void saveCacheFile(String url, CacheResult cacheRet) {
        saveCacheFile(url, 0, cacheRet);
    }

    // only called from WebCore thread
    static void saveCacheFile(String url, long postIdentifier,
            CacheResult cacheRet) {
        try {
            cacheRet.outStream.close();
        } catch (IOException e) {
@@ -434,7 +458,7 @@ public final class CacheManager {
            return;
        }

        mDataBase.addCache(url, cacheRet);
        mDataBase.addCache(getDatabaseKey(url, postIdentifier), cacheRet);

        if (DebugFlags.CACHE_MANAGER) {
            Log.v(LOGTAG, "saveCacheFile for url " + url);
@@ -513,6 +537,11 @@ public final class CacheManager {
        }
    }

    private static String getDatabaseKey(String url, long postIdentifier) {
        if (postIdentifier == 0) return url;
        return postIdentifier + url;
    }

    @SuppressWarnings("deprecation")
    private static void setupFiles(String url, CacheResult cacheRet) {
        if (true) {
+2 −2
Original line number Diff line number Diff line
@@ -242,7 +242,7 @@ class FrameLoader {
            // to load POST content in a history navigation.
            case WebSettings.LOAD_CACHE_ONLY: {
                CacheResult result = CacheManager.getCacheFile(mListener.url(),
                        null);
                        mListener.postIdentifier(), null);
                if (result != null) {
                    startCacheLoad(result);
                } else {
@@ -270,7 +270,7 @@ class FrameLoader {
                // Get the cache file name for the current URL, passing null for
                // the validation headers causes no validation to occur
                CacheResult result = CacheManager.getCacheFile(mListener.url(),
                        null);
                        mListener.postIdentifier(), null);
                if (result != null) {
                    startCacheLoad(result);
                    return true;
+27 −13
Original line number Diff line number Diff line
@@ -104,6 +104,7 @@ class LoadListener extends Handler implements EventHandler {
    private SslError mSslError;
    private RequestHandle mRequestHandle;
    private RequestHandle mSslErrorRequestHandle;
    private long     mPostIdentifier;

    // Request data. It is only valid when we are doing a load from the
    // cache. It is needed if the cache returns a redirect
@@ -123,13 +124,13 @@ class LoadListener extends Handler implements EventHandler {
    // Public functions
    // =========================================================================

    public static LoadListener getLoadListener(
            Context context, BrowserFrame frame, String url,
            int nativeLoader, boolean synchronous, boolean isMainPageLoader) {
    public static LoadListener getLoadListener(Context context,
            BrowserFrame frame, String url, int nativeLoader,
            boolean synchronous, boolean isMainPageLoader, long postIdentifier) {

        sNativeLoaderCount += 1;
        return new LoadListener(
            context, frame, url, nativeLoader, synchronous, isMainPageLoader);
        return new LoadListener(context, frame, url, nativeLoader, synchronous,
                isMainPageLoader, postIdentifier);
    }

    public static int getNativeLoaderCount() {
@@ -137,7 +138,8 @@ class LoadListener extends Handler implements EventHandler {
    }

    LoadListener(Context context, BrowserFrame frame, String url,
            int nativeLoader, boolean synchronous, boolean isMainPageLoader) {
            int nativeLoader, boolean synchronous, boolean isMainPageLoader,
            long postIdentifier) {
        if (DebugFlags.LOAD_LISTENER) {
            Log.v(LOGTAG, "LoadListener constructor url=" + url);
        }
@@ -150,6 +152,7 @@ class LoadListener extends Handler implements EventHandler {
            mMessageQueue = new Vector<Message>();
        }
        mIsMainPageLoader = isMainPageLoader;
        mPostIdentifier = postIdentifier;
    }

    /**
@@ -408,9 +411,14 @@ class LoadListener extends Handler implements EventHandler {
                mStatusCode == HTTP_MOVED_PERMANENTLY ||
                mStatusCode == HTTP_TEMPORARY_REDIRECT) && 
                mNativeLoader != 0) {
            if (!mFromCache && mRequestHandle != null) {
            // for POST request, only cache the result if there is an identifier
            // associated with it. postUrl() or form submission should set the
            // identifier while XHR POST doesn't.
            if (!mFromCache && mRequestHandle != null
                    && (!mRequestHandle.getMethod().equals("POST")
                            || mPostIdentifier != 0)) {
                mCacheResult = CacheManager.createCacheFile(mUrl, mStatusCode,
                        headers, mMimeType, false);
                        headers, mMimeType, mPostIdentifier, false);
            }
            if (mCacheResult != null) {
                mCacheResult.encoding = mEncoding;
@@ -637,7 +645,7 @@ class LoadListener extends Handler implements EventHandler {
     */
    boolean checkCache(Map<String, String> headers) {
        // Get the cache file name for the current URL
        CacheResult result = CacheManager.getCacheFile(url(),
        CacheResult result = CacheManager.getCacheFile(url(), mPostIdentifier,
                headers);

        // Go ahead and set the cache loader to null in case the result is
@@ -862,6 +870,10 @@ class LoadListener extends Handler implements EventHandler {
        }
    }

    long postIdentifier() {
        return mPostIdentifier;
    }

    void attachRequestHandle(RequestHandle requestHandle) {
        if (DebugFlags.LOAD_LISTENER) {
            Log.v(LOGTAG, "LoadListener.attachRequestHandle(): " +
@@ -908,8 +920,9 @@ class LoadListener extends Handler implements EventHandler {
     * be used. This is just for forward/back navigation to a POST
     * URL.
     */
    static boolean willLoadFromCache(String url) {
        boolean inCache = CacheManager.getCacheFile(url, null) != null;
    static boolean willLoadFromCache(String url, long identifier) {
        boolean inCache =
                CacheManager.getCacheFile(url, identifier, null) != null;
        if (DebugFlags.LOAD_LISTENER) {
            Log.v(LOGTAG, "willLoadFromCache: " + url + " in cache: " + 
                    inCache);
@@ -1066,7 +1079,7 @@ class LoadListener extends Handler implements EventHandler {
    void tearDown() {
        if (mCacheResult != null) {
            if (getErrorID() == OK) {
                CacheManager.saveCacheFile(mUrl, mCacheResult);
                CacheManager.saveCacheFile(mUrl, mPostIdentifier, mCacheResult);
            }

            // we need to reset mCacheResult to be null
@@ -1194,7 +1207,8 @@ class LoadListener extends Handler implements EventHandler {
            // Cache the redirect response
            if (mCacheResult != null) {
                if (getErrorID() == OK) {
                    CacheManager.saveCacheFile(mUrl, mCacheResult);
                    CacheManager.saveCacheFile(mUrl, mPostIdentifier,
                            mCacheResult);
                }
                mCacheResult = null;
            }