am 9002eb44: am 67166b6e: Merge "Cleanup the cache file when we decide not saving it. This logic was lost when we switched back using FLASH instead of RAM for the cache." into eclair-mr2
Merge commit '9002eb44043868a2f5fc38128748464492f297c6'
* commit '9002eb44043868a2f5fc38128748464492f297c6':
Cleanup the cache file when we decide not saving it.
diff --git a/core/java/android/webkit/CacheManager.java b/core/java/android/webkit/CacheManager.java
index c4e26bc..22dca3a 100644
--- a/core/java/android/webkit/CacheManager.java
+++ b/core/java/android/webkit/CacheManager.java
@@ -56,6 +56,9 @@
private static long CACHE_THRESHOLD = 6 * 1024 * 1024;
private static long CACHE_TRIM_AMOUNT = 2 * 1024 * 1024;
+ // Limit the maximum cache file size to half of the normal capacity
+ static long CACHE_MAX_SIZE = (CACHE_THRESHOLD - CACHE_TRIM_AMOUNT) / 2;
+
private static boolean mDisabled;
// Reference count the enable/disable transaction
@@ -448,7 +451,6 @@
return;
}
- cacheRet.contentLength = cacheRet.outFile.length();
boolean redirect = checkCacheRedirect(cacheRet.httpStatusCode);
if (redirect) {
// location is in database, no need to keep the file
@@ -470,6 +472,15 @@
}
}
+ static boolean cleanupCacheFile(CacheResult cacheRet) {
+ try {
+ cacheRet.outStream.close();
+ } catch (IOException e) {
+ return false;
+ }
+ return cacheRet.outFile.delete();
+ }
+
/**
* remove all cache files
*
@@ -644,6 +655,9 @@
private static CacheResult parseHeaders(int statusCode, Headers headers,
String mimeType) {
+ // if the contentLength is already larger than CACHE_MAX_SIZE, skip it
+ if (headers.getContentLength() > CACHE_MAX_SIZE) return null;
+
// TODO: if authenticated or secure, return null
CacheResult ret = new CacheResult();
ret.httpStatusCode = statusCode;
diff --git a/core/java/android/webkit/LoadListener.java b/core/java/android/webkit/LoadListener.java
index c2b9f20..cdc6608 100644
--- a/core/java/android/webkit/LoadListener.java
+++ b/core/java/android/webkit/LoadListener.java
@@ -936,8 +936,11 @@
void downloadFile() {
// Setting the Cache Result to null ensures that this
// content is not added to the cache
- mCacheResult = null;
-
+ if (mCacheResult != null) {
+ CacheManager.cleanupCacheFile(mCacheResult);
+ mCacheResult = null;
+ }
+
// Inform the client that they should download a file
mBrowserFrame.getCallbackProxy().onDownloadStart(url(),
mBrowserFrame.getUserAgentString(),
@@ -1096,10 +1099,18 @@
if (c.mLength != 0) {
if (mCacheResult != null) {
- try {
- mCacheResult.outStream.write(c.mArray, 0, c.mLength);
- } catch (IOException e) {
+ mCacheResult.contentLength += c.mLength;
+ if (mCacheResult.contentLength > CacheManager.CACHE_MAX_SIZE) {
+ CacheManager.cleanupCacheFile(mCacheResult);
mCacheResult = null;
+ } else {
+ try {
+ mCacheResult.outStream
+ .write(c.mArray, 0, c.mLength);
+ } catch (IOException e) {
+ CacheManager.cleanupCacheFile(mCacheResult);
+ mCacheResult = null;
+ }
}
}
nativeAddData(c.mArray, c.mLength);
@@ -1117,6 +1128,8 @@
if (mCacheResult != null) {
if (getErrorID() == OK) {
CacheManager.saveCacheFile(mUrl, mPostIdentifier, mCacheResult);
+ } else {
+ CacheManager.cleanupCacheFile(mCacheResult);
}
// we need to reset mCacheResult to be null
@@ -1181,7 +1194,10 @@
mRequestHandle = null;
}
- mCacheResult = null;
+ if (mCacheResult != null) {
+ CacheManager.cleanupCacheFile(mCacheResult);
+ mCacheResult = null;
+ }
mCancelled = true;
clearNativeLoader();
@@ -1246,6 +1262,8 @@
if (getErrorID() == OK) {
CacheManager.saveCacheFile(mUrl, mPostIdentifier,
mCacheResult);
+ } else {
+ CacheManager.cleanupCacheFile(mCacheResult);
}
mCacheResult = null;
}