summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortorne@chromium.org <torne@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-08 12:56:26 +0000
committertorne@chromium.org <torne@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-08 12:56:26 +0000
commit1a64c31010fa61fa92593b52d7063a4d6188c4a8 (patch)
tree3e184adee4a39dcbc03d1f21a1bf2bf017b992b3
parentc1049d02b308da4636b46ba7aa47e9ebae3fde29 (diff)
downloadchromium_src-1a64c31010fa61fa92593b52d7063a4d6188c4a8.zip
chromium_src-1a64c31010fa61fa92593b52d7063a4d6188c4a8.tar.gz
chromium_src-1a64c31010fa61fa92593b52d7063a4d6188c4a8.tar.bz2
Android WebView: post QuotaManager calls to UI thread.
The AwQuotaManagerBridge needs to be usable from any thread, not just the UI thread. Make it refcounted and have its methods post to the UI thread if not already there. Since none of the methods are synchronous there's no need to wait for the posted messages to be handled. BUG=305205 R=benm@chromium.org Review URL: https://codereview.chromium.org/26477002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@227508 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--android_webview/browser/aw_browser_context.cc5
-rw-r--r--android_webview/browser/aw_browser_context.h2
-rw-r--r--android_webview/browser/aw_quota_manager_bridge.cc4
-rw-r--r--android_webview/browser/aw_quota_manager_bridge.h11
-rw-r--r--android_webview/browser/jni_dependency_factory.h4
-rw-r--r--android_webview/lib/main/aw_main_delegate.cc4
-rw-r--r--android_webview/lib/main/aw_main_delegate.h3
-rw-r--r--android_webview/native/aw_quota_manager_bridge_impl.cc53
-rw-r--r--android_webview/native/aw_quota_manager_bridge_impl.h15
9 files changed, 86 insertions, 15 deletions
diff --git a/android_webview/browser/aw_browser_context.cc b/android_webview/browser/aw_browser_context.cc
index 97978ca..7adc6dd 100644
--- a/android_webview/browser/aw_browser_context.cc
+++ b/android_webview/browser/aw_browser_context.cc
@@ -186,9 +186,8 @@ AwBrowserContext::CreateRequestContextForStoragePartition(
}
AwQuotaManagerBridge* AwBrowserContext::GetQuotaManagerBridge() {
- if (!quota_manager_bridge_) {
- quota_manager_bridge_.reset(
- native_factory_->CreateAwQuotaManagerBridge(this));
+ if (!quota_manager_bridge_.get()) {
+ quota_manager_bridge_ = native_factory_->CreateAwQuotaManagerBridge(this);
}
return quota_manager_bridge_.get();
}
diff --git a/android_webview/browser/aw_browser_context.h b/android_webview/browser/aw_browser_context.h
index 1654d9a..c7c3ea9 100644
--- a/android_webview/browser/aw_browser_context.h
+++ b/android_webview/browser/aw_browser_context.h
@@ -112,7 +112,7 @@ class AwBrowserContext : public content::BrowserContext,
scoped_refptr<AwURLRequestContextGetter> url_request_context_getter_;
scoped_refptr<content::GeolocationPermissionContext>
geolocation_permission_context_;
- scoped_ptr<AwQuotaManagerBridge> quota_manager_bridge_;
+ scoped_refptr<AwQuotaManagerBridge> quota_manager_bridge_;
scoped_ptr<AwFormDatabaseService> form_database_service_;
AwDownloadManagerDelegate download_manager_delegate_;
diff --git a/android_webview/browser/aw_quota_manager_bridge.cc b/android_webview/browser/aw_quota_manager_bridge.cc
index 4a87cd6..ad2f3e0 100644
--- a/android_webview/browser/aw_quota_manager_bridge.cc
+++ b/android_webview/browser/aw_quota_manager_bridge.cc
@@ -5,5 +5,9 @@
#include "android_webview/browser/aw_quota_manager_bridge.h"
namespace android_webview {
+
+AwQuotaManagerBridge::AwQuotaManagerBridge() {}
+
AwQuotaManagerBridge::~AwQuotaManagerBridge() {}
+
} // namespace android_webview
diff --git a/android_webview/browser/aw_quota_manager_bridge.h b/android_webview/browser/aw_quota_manager_bridge.h
index 5480cf8..bc4da37 100644
--- a/android_webview/browser/aw_quota_manager_bridge.h
+++ b/android_webview/browser/aw_quota_manager_bridge.h
@@ -5,11 +5,16 @@
#ifndef ANDROID_WEBVIEW_BROWSER_AW_QUOTA_MANAGER_BRIDGE_H_
#define ANDROID_WEBVIEW_BROWSER_AW_QUOTA_MANAGER_BRIDGE_H_
+#include "base/memory/ref_counted.h"
+
namespace android_webview {
-// Empty base class so this can be owned and destroyed by AwBrowserContext.
-class AwQuotaManagerBridge {
- public:
+// Empty base class so this can be refcounted by AwBrowserContext.
+class AwQuotaManagerBridge :
+ public base::RefCountedThreadSafe<AwQuotaManagerBridge> {
+ protected:
+ friend class base::RefCountedThreadSafe<AwQuotaManagerBridge>;
+ AwQuotaManagerBridge();
virtual ~AwQuotaManagerBridge();
};
diff --git a/android_webview/browser/jni_dependency_factory.h b/android_webview/browser/jni_dependency_factory.h
index e6e0ea9..b396ad0 100644
--- a/android_webview/browser/jni_dependency_factory.h
+++ b/android_webview/browser/jni_dependency_factory.h
@@ -5,6 +5,8 @@
#ifndef ANDROID_WEBVIEW_BROWSER_JNI_DEPENDENCY_FACTORY_H_
#define ANDROID_WEBVIEW_BROWSER_JNI_DEPENDENCY_FACTORY_H_
+#include "base/memory/ref_counted.h"
+
namespace content {
class GeolocationPermissionContext;
class WebContents;
@@ -22,7 +24,7 @@ class JniDependencyFactory {
public:
virtual ~JniDependencyFactory() {}
- virtual AwQuotaManagerBridge* CreateAwQuotaManagerBridge(
+ virtual scoped_refptr<AwQuotaManagerBridge> CreateAwQuotaManagerBridge(
AwBrowserContext* browser_context) = 0;
virtual content::GeolocationPermissionContext* CreateGeolocationPermission(
AwBrowserContext* browser_context) = 0;
diff --git a/android_webview/lib/main/aw_main_delegate.cc b/android_webview/lib/main/aw_main_delegate.cc
index 7c9e684..eff0be6 100644
--- a/android_webview/lib/main/aw_main_delegate.cc
+++ b/android_webview/lib/main/aw_main_delegate.cc
@@ -129,9 +129,9 @@ content::ContentRendererClient*
return content_renderer_client_.get();
}
-AwQuotaManagerBridge* AwMainDelegate::CreateAwQuotaManagerBridge(
+scoped_refptr<AwQuotaManagerBridge> AwMainDelegate::CreateAwQuotaManagerBridge(
AwBrowserContext* browser_context) {
- return new AwQuotaManagerBridgeImpl(browser_context);
+ return AwQuotaManagerBridgeImpl::Create(browser_context);
}
content::GeolocationPermissionContext*
diff --git a/android_webview/lib/main/aw_main_delegate.h b/android_webview/lib/main/aw_main_delegate.h
index 8fe2b79..2d07be4 100644
--- a/android_webview/lib/main/aw_main_delegate.h
+++ b/android_webview/lib/main/aw_main_delegate.h
@@ -7,6 +7,7 @@
#include "android_webview/browser/jni_dependency_factory.h"
#include "android_webview/common/aw_content_client.h"
+#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "content/public/app/content_main_delegate.h"
@@ -41,7 +42,7 @@ class AwMainDelegate : public content::ContentMainDelegate,
CreateContentRendererClient() OVERRIDE;
// JniDependencyFactory implementation.
- virtual AwQuotaManagerBridge* CreateAwQuotaManagerBridge(
+ virtual scoped_refptr<AwQuotaManagerBridge> CreateAwQuotaManagerBridge(
AwBrowserContext* browser_context) OVERRIDE;
virtual content::GeolocationPermissionContext* CreateGeolocationPermission(
AwBrowserContext* browser_context) OVERRIDE;
diff --git a/android_webview/native/aw_quota_manager_bridge_impl.cc b/android_webview/native/aw_quota_manager_bridge_impl.cc
index b105c27..549352f 100644
--- a/android_webview/native/aw_quota_manager_bridge_impl.cc
+++ b/android_webview/native/aw_quota_manager_bridge_impl.cc
@@ -10,6 +10,7 @@
#include "android_webview/browser/aw_content_browser_client.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
+#include "base/synchronization/waitable_event.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/common/content_client.h"
@@ -141,6 +142,14 @@ void GetOriginsTask::DoneOnUIThread() {
ui_callback_.Run(origin_, usage_, quota_);
}
+void RunOnUIThread(const base::Closure& task) {
+ if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
+ task.Run();
+ } else {
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, task);
+ }
+}
+
} // namespace
@@ -155,6 +164,12 @@ jint GetDefaultNativeAwQuotaManagerBridge(JNIEnv* env, jclass clazz) {
return reinterpret_cast<jint>(bridge);
}
+// static
+scoped_refptr<AwQuotaManagerBridge> AwQuotaManagerBridgeImpl::Create(
+ AwBrowserContext* browser_context) {
+ return new AwQuotaManagerBridgeImpl(browser_context);
+}
+
AwQuotaManagerBridgeImpl::AwQuotaManagerBridgeImpl(
AwBrowserContext* browser_context)
: weak_factory_(this),
@@ -186,6 +201,11 @@ QuotaManager* AwQuotaManagerBridgeImpl::GetQuotaManager() const {
}
void AwQuotaManagerBridgeImpl::DeleteAllData(JNIEnv* env, jobject object) {
+ RunOnUIThread(base::Bind(&AwQuotaManagerBridgeImpl::DeleteAllDataOnUiThread,
+ this));
+}
+
+void AwQuotaManagerBridgeImpl::DeleteAllDataOnUiThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
GetStoragePartition()->ClearDataForUnboundedRange(
// Clear all web storage data except cookies.
@@ -199,6 +219,15 @@ void AwQuotaManagerBridgeImpl::DeleteAllData(JNIEnv* env, jobject object) {
void AwQuotaManagerBridgeImpl::DeleteOrigin(
JNIEnv* env, jobject object, jstring origin) {
+ base::string16 origin_string(
+ base::android::ConvertJavaStringToUTF16(env, origin));
+ RunOnUIThread(base::Bind(&AwQuotaManagerBridgeImpl::DeleteOriginOnUiThread,
+ this,
+ origin_string));
+}
+
+void AwQuotaManagerBridgeImpl::DeleteOriginOnUiThread(
+ const base::string16& origin) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
StoragePartition* storage_partition = GetStoragePartition();
storage_partition->ClearDataForOrigin(
@@ -208,12 +237,18 @@ void AwQuotaManagerBridgeImpl::DeleteOrigin(
StoragePartition::REMOVE_DATA_MASK_INDEXEDDB |
StoragePartition::REMOVE_DATA_MASK_WEBSQL,
StoragePartition::QUOTA_MANAGED_STORAGE_MASK_TEMPORARY,
- GURL(base::android::ConvertJavaStringToUTF16(env, origin)),
+ GURL(origin),
storage_partition->GetURLRequestContext());
}
void AwQuotaManagerBridgeImpl::GetOrigins(
JNIEnv* env, jobject object, jint callback_id) {
+ RunOnUIThread(base::Bind(&AwQuotaManagerBridgeImpl::GetOriginsOnUiThread,
+ this,
+ callback_id));
+}
+
+void AwQuotaManagerBridgeImpl::GetOriginsOnUiThread(jint callback_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
const GetOriginsCallback ui_callback = base::Bind(
@@ -269,6 +304,20 @@ void AwQuotaManagerBridgeImpl::GetUsageAndQuotaForOrigin(
jstring origin,
jint callback_id,
bool is_quota) {
+ base::string16 origin_string(
+ base::android::ConvertJavaStringToUTF16(env, origin));
+ RunOnUIThread(base::Bind(
+ &AwQuotaManagerBridgeImpl::GetUsageAndQuotaForOriginOnUiThread,
+ this,
+ origin_string,
+ callback_id,
+ is_quota));
+}
+
+void AwQuotaManagerBridgeImpl::GetUsageAndQuotaForOriginOnUiThread(
+ const base::string16& origin,
+ jint callback_id,
+ bool is_quota) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
const QuotaUsageCallback ui_callback = base::Bind(
&AwQuotaManagerBridgeImpl::QuotaUsageCallbackImpl,
@@ -281,7 +330,7 @@ void AwQuotaManagerBridgeImpl::GetUsageAndQuotaForOrigin(
FROM_HERE,
base::Bind(&QuotaManager::GetUsageAndQuota,
GetQuotaManager(),
- GURL(base::android::ConvertJavaStringToUTF16(env, origin)),
+ GURL(origin),
quota::kStorageTypeTemporary,
base::Bind(&OnUsageAndQuotaObtained, ui_callback)));
}
diff --git a/android_webview/native/aw_quota_manager_bridge_impl.h b/android_webview/native/aw_quota_manager_bridge_impl.h
index 8b9d60b..c0158ed 100644
--- a/android_webview/native/aw_quota_manager_bridge_impl.h
+++ b/android_webview/native/aw_quota_manager_bridge_impl.h
@@ -15,6 +15,7 @@
#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
+#include "base/strings/string16.h"
class GURL;
@@ -32,8 +33,8 @@ class AwBrowserContext;
class AwQuotaManagerBridgeImpl : public AwQuotaManagerBridge {
public:
- explicit AwQuotaManagerBridgeImpl(AwBrowserContext* browser_context);
- virtual ~AwQuotaManagerBridgeImpl();
+ static scoped_refptr<AwQuotaManagerBridge> Create(
+ AwBrowserContext* browser_context);
// Called by Java.
void Init(JNIEnv* env, jobject object);
@@ -54,10 +55,20 @@ class AwQuotaManagerBridgeImpl : public AwQuotaManagerBridge {
int64 /* quota */)> QuotaUsageCallback;
private:
+ explicit AwQuotaManagerBridgeImpl(AwBrowserContext* browser_context);
+ virtual ~AwQuotaManagerBridgeImpl();
+
content::StoragePartition* GetStoragePartition() const;
quota::QuotaManager* GetQuotaManager() const;
+ void DeleteAllDataOnUiThread();
+ void DeleteOriginOnUiThread(const base::string16& origin);
+ void GetOriginsOnUiThread(jint callback_id);
+ void GetUsageAndQuotaForOriginOnUiThread(const base::string16& origin,
+ jint callback_id,
+ bool is_quota);
+
void GetOriginsCallbackImpl(
int jcallback_id,
const std::vector<std::string>& origin,