Index: android_webview/java/src/org/chromium/android_webview/AwQuotaManagerBridge.java |
diff --git a/android_webview/java/src/org/chromium/android_webview/AwQuotaManagerBridge.java b/android_webview/java/src/org/chromium/android_webview/AwQuotaManagerBridge.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6e94134f1bb751da62cf5dc6569dcffffa4c86d9 |
--- /dev/null |
+++ b/android_webview/java/src/org/chromium/android_webview/AwQuotaManagerBridge.java |
@@ -0,0 +1,162 @@ |
+// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.android_webview; |
+ |
+import org.chromium.base.CalledByNative; |
+import org.chromium.base.JNINamespace; |
+import org.chromium.base.ThreadUtils; |
+ |
+import android.webkit.ValueCallback; |
+ |
+import java.util.Map; |
+import java.util.HashMap; |
+ |
+/** |
+ * Bridge between android.webview.WebStorage and native QuotaManager. This object is owned by Java |
+ * AwBrowserContext and the native side is owned by the native AwBrowserContext. |
+ * |
+ * TODO(boliu): Actually make this true after Java AwBrowserContext is added. |
+ */ |
+@JNINamespace("android_webview") |
+public class AwQuotaManagerBridge { |
+ // TODO(boliu): This should be obtained from Java AwBrowserContext that owns this. |
+ private static native int nativeGetDefaultNativeAwQuotaManagerBridge(); |
+ |
+ // TODO(boliu): This should be owned by Java AwBrowserContext, not a singleton. |
+ private static AwQuotaManagerBridge sInstance; |
+ public static AwQuotaManagerBridge getInstance() { |
+ ThreadUtils.assertOnUiThread(); |
+ if (sInstance == null) { |
+ sInstance = new AwQuotaManagerBridge(nativeGetDefaultNativeAwQuotaManagerBridge()); |
+ } |
+ return sInstance; |
+ } |
+ |
+ /** |
+ * This class represent the callback value of android.webview.WebStorage.getOrigins. The values |
+ * are optimized for JNI convenience and need to be converted. |
+ */ |
+ public static class Origins { |
+ // Origin, usage, and quota data in parallel arrays of same length. |
+ public final String[] mOrigins; |
+ public final long[] mUsages; |
+ public final long[] mQuotas; |
+ |
+ Origins(String[] origins, long[] usages, long[] quotas) { |
+ mOrigins = origins; |
+ mUsages = usages; |
+ mQuotas = quotas; |
+ } |
+ } |
+ |
+ // This is not owning. The native object is owned by the native AwBrowserContext. |
+ private int mNativeAwQuotaManagerBridgeImpl; |
+ |
+ // The Java callbacks are saved here. An incrementing callback id is generated for each saved |
+ // callback and is passed to the native side to identify callback. |
+ private int mNextId; |
+ private Map<Integer, ValueCallback<Origins>> mPendingGetOriginCallbacks; |
+ private Map<Integer, ValueCallback<Long>> mPendingGetQuotaForOriginCallbacks; |
+ private Map<Integer, ValueCallback<Long>> mPendingGetUsageForOriginCallbacks; |
+ |
+ private AwQuotaManagerBridge(int nativeAwQuotaManagerBridgeImpl) { |
+ mNativeAwQuotaManagerBridgeImpl = nativeAwQuotaManagerBridgeImpl; |
+ mPendingGetOriginCallbacks = |
+ new HashMap<Integer, ValueCallback<Origins>>(); |
+ mPendingGetQuotaForOriginCallbacks = new HashMap<Integer, ValueCallback<Long>>(); |
+ mPendingGetUsageForOriginCallbacks = new HashMap<Integer, ValueCallback<Long>>(); |
+ nativeInit(mNativeAwQuotaManagerBridgeImpl); |
+ } |
+ |
+ private int getNextId() { |
+ ThreadUtils.assertOnUiThread(); |
+ return ++mNextId; |
+ } |
+ |
+ /* |
+ * There are five HTML5 offline storage APIs. |
+ * 1) Web Storage (ie the localStorage and sessionStorage variables) |
+ * 2) Web SQL database |
+ * 3) Application cache |
+ * 4) Indexed Database |
+ * 5) Filesystem API |
+ */ |
+ |
+ /** |
+ * Implements WebStorage.deleteAllData(). Clear the storage of all five offline APIs. |
+ * |
+ * TODO(boliu): Actually clear Web Storage. |
+ */ |
+ public void deleteAllData() { |
+ nativeDeleteAllData(mNativeAwQuotaManagerBridgeImpl); |
+ } |
+ |
+ /** |
+ * Implements WebStorage.deleteOrigin(). Clear the storage of APIs 2-5 for the given origin. |
+ */ |
+ public void deleteOrigin(String origin) { |
+ nativeDeleteOrigin(mNativeAwQuotaManagerBridgeImpl, origin); |
+ } |
+ |
+ /** |
+ * Implements WebStorage.getOrigins. Get the per origin usage and quota of APIs 2-5 in |
+ * aggregate. |
+ */ |
+ public void getOrigins(ValueCallback<Origins> callback) { |
+ int callbackId = getNextId(); |
+ assert !mPendingGetOriginCallbacks.containsKey(callbackId); |
+ mPendingGetOriginCallbacks.put(callbackId, callback); |
+ nativeGetOrigins(mNativeAwQuotaManagerBridgeImpl, callbackId); |
+ } |
+ |
+ /** |
+ * Implements WebStorage.getQuotaForOrigin. Get the quota of APIs 2-5 in aggregate for given |
+ * origin. |
+ */ |
+ public void getQuotaForOrigin(String origin, ValueCallback<Long> callback) { |
+ int callbackId = getNextId(); |
+ assert !mPendingGetQuotaForOriginCallbacks.containsKey(callbackId); |
+ mPendingGetQuotaForOriginCallbacks.put(callbackId, callback); |
+ nativeGetUsageAndQuotaForOrigin(mNativeAwQuotaManagerBridgeImpl, origin, callbackId, true); |
+ } |
+ |
+ /** |
+ * Implements WebStorage.getUsageForOrigin. Get the usage of APIs 2-5 in aggregate for given |
+ * origin. |
+ */ |
+ public void getUsageForOrigin(String origin, ValueCallback<Long> callback) { |
+ int callbackId = getNextId(); |
+ assert !mPendingGetUsageForOriginCallbacks.containsKey(callbackId); |
+ mPendingGetUsageForOriginCallbacks.put(callbackId, callback); |
+ nativeGetUsageAndQuotaForOrigin(mNativeAwQuotaManagerBridgeImpl, origin, callbackId, false); |
+ } |
+ |
+ @CalledByNative |
+ private void onGetOriginsCallback(int callbackId, String[] origin, long[] usages, |
+ long[] quotas) { |
+ assert mPendingGetOriginCallbacks.containsKey(callbackId); |
+ mPendingGetOriginCallbacks.remove(callbackId).onReceiveValue( |
+ new Origins(origin, usages, quotas)); |
+ } |
+ |
+ @CalledByNative |
+ private void onGetUsageAndQuotaForOriginCallback( |
+ int callbackId, boolean isQuota, long usage, long quota) { |
+ if (isQuota) { |
+ assert mPendingGetQuotaForOriginCallbacks.containsKey(callbackId); |
+ mPendingGetQuotaForOriginCallbacks.remove(callbackId).onReceiveValue(quota); |
+ } else { |
+ assert mPendingGetUsageForOriginCallbacks.containsKey(callbackId); |
+ mPendingGetUsageForOriginCallbacks.remove(callbackId).onReceiveValue(usage); |
+ } |
+ } |
+ |
+ private native void nativeInit(int nativeAwQuotaManagerBridgeImpl); |
+ private native void nativeDeleteAllData(int nativeAwQuotaManagerBridgeImpl); |
+ private native void nativeDeleteOrigin(int nativeAwQuotaManagerBridgeImpl, String origin); |
+ private native void nativeGetOrigins(int nativeAwQuotaManagerBridgeImpl, int callbackId); |
+ private native void nativeGetUsageAndQuotaForOrigin(int nativeAwQuotaManagerBridgeImpl, |
+ String origin, int callbackId, boolean isQuota); |
+} |