Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1259)

Unified Diff: android_webview/java/src/org/chromium/android_webview/AwQuotaManagerBridge.java

Issue 12253057: Implement WebStorage API methods (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments from joth. Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..1ee2bdb7c128d0d0a824a65ea4dc574031538b86
--- /dev/null
+++ b/android_webview/java/src/org/chromium/android_webview/AwQuotaManagerBridge.java
@@ -0,0 +1,159 @@
+// 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 android.os.Looper;
+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() {
+ assert Looper.myLooper() == Looper.getMainLooper();
+ 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.
sgurun-gerrit only 2013/02/22 02:44:02 maybe we should be consistent in plural and singul
boliu 2013/02/22 02:54:04 Wikitionary confirms: usage -> usages quota -> quo
+ public final String[] mOrigins;
+ public final long[] mUsage;
+ public final long[] mQuota;
+
+ Origins(String[] origins, long[] usage, long[] quota) {
+ mOrigins = origins;
+ mUsage = usage;
+ mQuota = quota;
+ }
+ }
+
+ // 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() {
+ assert Looper.myLooper() == Looper.getMainLooper();
+ return ++mNextId;
+ }
+
+ /*
+ * There are five HTML5 offline storage APIs. Not all of them are enabled for Android WebView.
+ * 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.getOrigins. Get the quota of APIs 2-5 in aggregate for given origin.
sgurun-gerrit only 2013/02/22 02:44:02 copy paste error? I think this should be WebStorag
boliu 2013/02/22 02:54:04 Done.
+ */
+ 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.getOrigins. Get the usage of APIs 2-5 in aggregate for given origin.
sgurun-gerrit only 2013/02/22 02:44:02 WebStorage.getUsage?
boliu 2013/02/22 02:54:04 Done.
+ */
+ 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[] usage, long[] quota) {
+ assert mPendingGetOriginCallbacks.containsKey(callbackId);
+ mPendingGetOriginCallbacks.remove(callbackId).onReceiveValue(
+ new Origins(origin, usage, quota));
+ }
+
+ @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);
+}

Powered by Google App Engine
This is Rietveld 408576698