summaryrefslogtreecommitdiffstats
path: root/android_webview
diff options
context:
space:
mode:
authorsgurun@chromium.org <sgurun@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-08 16:16:37 +0000
committersgurun@chromium.org <sgurun@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-08 16:16:37 +0000
commit1140180828d318fe4d096484dd1a110b714ec285 (patch)
treeb45a687a3fa16b41c3847b1ad0c8d57f13a6bb84 /android_webview
parent5558ebad44509c3574cf5dce1ad2929b1b0bdeb2 (diff)
downloadchromium_src-1140180828d318fe4d096484dd1a110b714ec285.zip
chromium_src-1140180828d318fe4d096484dd1a110b714ec285.tar.gz
chromium_src-1140180828d318fe4d096484dd1a110b714ec285.tar.bz2
Implement WebViewDatabase's hasFormData API for chromium based webview.
BUG=b/6234236 Review URL: https://chromiumcodereview.appspot.com/14503010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@198919 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'android_webview')
-rw-r--r--android_webview/android_webview.gyp2
-rw-r--r--android_webview/android_webview_tests.gypi3
-rw-r--r--android_webview/browser/DEPS4
-rw-r--r--android_webview/browser/aw_browser_context.cc11
-rw-r--r--android_webview/browser/aw_browser_context.h6
-rw-r--r--android_webview/browser/aw_form_database_service.cc105
-rw-r--r--android_webview/browser/aw_form_database_service.h63
-rw-r--r--android_webview/browser/aw_form_database_service_unittest.cc73
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwFormDatabase.java6
-rw-r--r--android_webview/native/android_webview_jni_registrar.cc2
-rw-r--r--android_webview/native/aw_form_database.cc48
-rw-r--r--android_webview/native/aw_form_database.h2
-rw-r--r--android_webview/native/webview_native.gyp1
13 files changed, 309 insertions, 17 deletions
diff --git a/android_webview/android_webview.gyp b/android_webview/android_webview.gyp
index 6480f08..bdf91bf 100644
--- a/android_webview/android_webview.gyp
+++ b/android_webview/android_webview.gyp
@@ -110,6 +110,8 @@
'browser/aw_devtools_delegate.h',
'browser/aw_download_manager_delegate.cc',
'browser/aw_download_manager_delegate.h',
+ 'browser/aw_form_database_service.cc',
+ 'browser/aw_form_database_service.h',
'browser/aw_http_auth_handler_base.cc',
'browser/aw_http_auth_handler_base.h',
'browser/aw_javascript_dialog_manager.cc',
diff --git a/android_webview/android_webview_tests.gypi b/android_webview/android_webview_tests.gypi
index 69cc234..bb9cc0f 100644
--- a/android_webview/android_webview_tests.gypi
+++ b/android_webview/android_webview_tests.gypi
@@ -67,10 +67,12 @@
'type': '<(gtest_target_type)',
'dependencies': [
'../base/base.gyp:test_support_base',
+ '../content/content.gyp:test_support_content',
'../net/net.gyp:net_test_support',
'../testing/android/native_test.gyp:native_test_native_code',
'../testing/gmock.gyp:gmock',
'../testing/gtest.gyp:gtest',
+ '../ui/ui.gyp:ui_jni_headers',
'android_webview_common',
],
'include_dirs': [
@@ -79,6 +81,7 @@
'<(SHARED_INTERMEDIATE_DIR)/android_webview_unittests',
],
'sources': [
+ 'browser/aw_form_database_service_unittest.cc',
'browser/net/android_stream_reader_url_request_job_unittest.cc',
'browser/net/input_stream_reader_unittest.cc',
'lib/main/webview_tests.cc',
diff --git a/android_webview/browser/DEPS b/android_webview/browser/DEPS
index cb5b561..555efd1 100644
--- a/android_webview/browser/DEPS
+++ b/android_webview/browser/DEPS
@@ -7,10 +7,14 @@ include_rules = [
"+cc",
"+components/auto_login_parser",
+ "+components/autofill/browser",
+ "+components/autofill/common",
"+components/navigation_interception",
"+components/visitedlink/browser",
+ "+components/webdata/common",
"+content/public/browser",
+ "+content/public/test",
"+gpu/command_buffer/client",
diff --git a/android_webview/browser/aw_browser_context.cc b/android_webview/browser/aw_browser_context.cc
index 983cd3e..1ecf9ec 100644
--- a/android_webview/browser/aw_browser_context.cc
+++ b/android_webview/browser/aw_browser_context.cc
@@ -4,6 +4,7 @@
#include "android_webview/browser/aw_browser_context.h"
+#include "android_webview/browser/aw_form_database_service.h"
#include "android_webview/browser/aw_quota_manager_bridge.h"
#include "android_webview/browser/jni_dependency_factory.h"
#include "android_webview/browser/net/aw_url_request_context_getter.h"
@@ -99,6 +100,16 @@ AwQuotaManagerBridge* AwBrowserContext::GetQuotaManagerBridge() {
return quota_manager_bridge_.get();
}
+// TODO(sgurun) we may need to do this at the constructor, depending on
+// how the rest of the implementation to enable autocomplete unwraps itself.
+AwFormDatabaseService* AwBrowserContext::GetFormDatabaseService() {
+ if (!form_database_service_) {
+ form_database_service_.reset(
+ new AwFormDatabaseService(context_storage_path_));
+ }
+ return form_database_service_.get();
+}
+
base::FilePath AwBrowserContext::GetPath() {
return context_storage_path_;
}
diff --git a/android_webview/browser/aw_browser_context.h b/android_webview/browser/aw_browser_context.h
index 254a247..177c612 100644
--- a/android_webview/browser/aw_browser_context.h
+++ b/android_webview/browser/aw_browser_context.h
@@ -32,8 +32,9 @@ class WebContents;
namespace android_webview {
-class AwURLRequestContextGetter;
+class AwFormDatabaseService;
class AwQuotaManagerBridge;
+class AwURLRequestContextGetter;
class JniDependencyFactory;
class AwBrowserContext : public content::BrowserContext,
@@ -67,6 +68,8 @@ class AwBrowserContext : public content::BrowserContext,
AwQuotaManagerBridge* GetQuotaManagerBridge();
+ AwFormDatabaseService* GetFormDatabaseService();
+
// content::BrowserContext implementation.
virtual base::FilePath GetPath() OVERRIDE;
virtual bool IsOffTheRecord() const OVERRIDE;
@@ -101,6 +104,7 @@ class AwBrowserContext : public content::BrowserContext,
scoped_refptr<content::GeolocationPermissionContext>
geolocation_permission_context_;
scoped_ptr<AwQuotaManagerBridge> quota_manager_bridge_;
+ scoped_ptr<AwFormDatabaseService> form_database_service_;
AwDownloadManagerDelegate download_manager_delegate_;
diff --git a/android_webview/browser/aw_form_database_service.cc b/android_webview/browser/aw_form_database_service.cc
new file mode 100644
index 0000000..d08ed0e
--- /dev/null
+++ b/android_webview/browser/aw_form_database_service.cc
@@ -0,0 +1,105 @@
+// 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.
+
+#include "android_webview/browser/aw_form_database_service.h"
+#include "base/logging.h"
+#include "components/autofill/browser/webdata/autofill_table.h"
+#include "components/webdata/common/webdata_constants.h"
+#include "content/public/browser/browser_thread.h"
+#include "ui/base/l10n/l10n_util_android.h"
+
+using content::BrowserThread;
+
+namespace {
+
+// Callback to handle database error. It seems chrome uses this to
+// display an error dialog box only.
+void DatabaseErrorCallback(sql::InitStatus status) {
+ LOG(WARNING) << "initializing autocomplete database failed";
+}
+
+} // namespace
+
+namespace android_webview {
+
+AwFormDatabaseService::AwFormDatabaseService(const base::FilePath path)
+ : pending_query_handle_(0),
+ has_form_data_(false),
+ completion_(false, false) {
+
+ web_database_ = new WebDatabaseService(path.Append(kWebDataFilename));
+ web_database_->AddTable(
+ scoped_ptr<WebDatabaseTable>(new autofill::AutofillTable(
+ l10n_util::GetDefaultLocale())));
+ web_database_->LoadDatabase();
+
+ autofill_data_ = new autofill::AutofillWebDataService(
+ web_database_, base::Bind(&DatabaseErrorCallback));
+ autofill_data_->Init();
+}
+
+AwFormDatabaseService::~AwFormDatabaseService() {
+ CancelPendingQuery();
+ Shutdown();
+}
+
+void AwFormDatabaseService::Shutdown() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ autofill_data_->ShutdownOnUIThread();
+ web_database_->ShutdownDatabase();
+}
+
+void AwFormDatabaseService::CancelPendingQuery() {
+ if (pending_query_handle_) {
+ if (autofill_data_)
+ autofill_data_->CancelRequest(pending_query_handle_);
+ pending_query_handle_ = 0;
+ }
+}
+
+scoped_refptr<autofill::AutofillWebDataService>
+AwFormDatabaseService::get_autofill_webdata_service() {
+ return autofill_data_;
+}
+
+void AwFormDatabaseService::ClearFormData() {
+ base::Time begin;
+ base::Time end = base::Time::Max();
+ autofill_data_->RemoveFormElementsAddedBetween(begin, end);
+ autofill_data_->RemoveAutofillDataModifiedBetween(begin, end);
+}
+
+bool AwFormDatabaseService::HasFormData() {
+ BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
+ base::Bind(&AwFormDatabaseService::HasFormDataImpl,
+ base::Unretained(this)));
+ completion_.Wait();
+ return has_form_data_;
+}
+
+void AwFormDatabaseService::HasFormDataImpl() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
+ pending_query_handle_ = autofill_data_->HasFormElements(this);
+}
+
+
+void AwFormDatabaseService::OnWebDataServiceRequestDone(
+ WebDataServiceBase::Handle h,
+ const WDTypedResult* result) {
+
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
+ DCHECK_EQ(pending_query_handle_, h);
+ pending_query_handle_ = 0;
+ has_form_data_ = false;
+
+ if (result) {
+ DCHECK_EQ(AUTOFILL_VALUE_RESULT, result->GetType());
+ const WDResult<bool>* autofill_result =
+ static_cast<const WDResult<bool>*>(result);
+ has_form_data_ = autofill_result->GetValue();
+ }
+ completion_.Signal();
+}
+
+} // namespace android_webview
diff --git a/android_webview/browser/aw_form_database_service.h b/android_webview/browser/aw_form_database_service.h
new file mode 100644
index 0000000..cb66d4e
--- /dev/null
+++ b/android_webview/browser/aw_form_database_service.h
@@ -0,0 +1,63 @@
+// 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.
+
+#ifndef ANDROID_WEBVIEW_BROWSER_AW_FORM_DATABASE_SERVICE_H_
+#define ANDROID_WEBVIEW_BROWSER_AW_FORM_DATABASE_SERVICE_H_
+
+#include "base/basictypes.h"
+#include "base/files/file_path.h"
+#include "base/synchronization/waitable_event.h"
+#include "components/autofill/browser/webdata/autofill_webdata_service.h"
+#include "components/webdata/common/web_data_service_consumer.h"
+#include "components/webdata/common/web_database_service.h"
+
+namespace android_webview {
+
+// Handles the database operations necessary to implement the autocomplete
+// functionality. This includes creating and initializing the components that
+// handle the database backend, and providing a synchronous interface when
+// needed (the chromium database components have an async. interface).
+class AwFormDatabaseService : public WebDataServiceConsumer {
+ public:
+ AwFormDatabaseService(const base::FilePath path);
+
+ virtual ~AwFormDatabaseService();
+
+ void Shutdown();
+
+ // Returns whether the database has any data stored. May do
+ // IO access and block.
+ bool HasFormData();
+
+ // Clear any saved form data. Executes asynchronously.
+ void ClearFormData();
+
+ scoped_refptr<autofill::AutofillWebDataService>
+ get_autofill_webdata_service();
+
+ // WebDataServiceConsumer implementation.
+ virtual void OnWebDataServiceRequestDone(
+ WebDataServiceBase::Handle h,
+ const WDTypedResult* result) OVERRIDE;
+
+ private:
+ // Cancels the currently pending WebDataService query, if there is one.
+ void CancelPendingQuery();
+
+ void HasFormDataImpl();
+
+ // Stores the query handle when an async database query is executed.
+ WebDataServiceBase::Handle pending_query_handle_;
+ bool has_form_data_;
+ base::WaitableEvent completion_;
+
+ scoped_refptr<autofill::AutofillWebDataService> autofill_data_;
+ scoped_refptr<WebDatabaseService> web_database_;
+
+ DISALLOW_COPY_AND_ASSIGN(AwFormDatabaseService);
+};
+
+} // namespace android_webview
+
+#endif // ANDROID_WEBVIEW_BROWSER_AW_FORM_DATABASE_SERVICE_H_
diff --git a/android_webview/browser/aw_form_database_service_unittest.cc b/android_webview/browser/aw_form_database_service_unittest.cc
new file mode 100644
index 0000000..e269a62
--- /dev/null
+++ b/android_webview/browser/aw_form_database_service_unittest.cc
@@ -0,0 +1,73 @@
+// 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.
+
+#include <vector>
+
+#include "android_webview/browser/aw_form_database_service.h"
+#include "base/android/jni_android.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/message_loop.h"
+#include "base/utf_string_conversions.h"
+#include "components/autofill/browser/webdata/autofill_webdata_service.h"
+#include "components/autofill/common/form_field_data.h"
+#include "content/public/test/test_browser_thread.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/l10n/l10n_util_android.h"
+
+using autofill::AutofillWebDataService;
+using autofill::FormFieldData;
+using base::android::AttachCurrentThread;
+using content::BrowserThread;
+using testing::Test;
+
+namespace android_webview {
+
+class AwFormDatabaseServiceTest : public Test {
+ public:
+ AwFormDatabaseServiceTest()
+ : ui_thread_(BrowserThread::UI, &message_loop_),
+ db_thread_(BrowserThread::DB) {
+ db_thread_.Start();
+ }
+
+ protected:
+ virtual void SetUp() {
+ ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
+ env_ = AttachCurrentThread();
+ ASSERT_TRUE(env_ != NULL);
+ ASSERT_TRUE(l10n_util::RegisterLocalizationUtil(env_));
+
+ service_.reset(new AwFormDatabaseService(temp_dir_.path()));
+ }
+
+ virtual void TearDown() {
+ service_->Shutdown();
+ }
+
+ // The path to the temporary directory used for the test operations.
+ base::ScopedTempDir temp_dir_;
+ // A message loop for UI thread.
+ MessageLoop message_loop_;
+ content::TestBrowserThread ui_thread_;
+ content::TestBrowserThread db_thread_;
+ JNIEnv* env_;
+
+ scoped_ptr<AwFormDatabaseService> service_;
+};
+
+TEST_F(AwFormDatabaseServiceTest, HasAndClearFormData) {
+ EXPECT_FALSE(service_->HasFormData());
+ std::vector<FormFieldData> fields;
+ FormFieldData field;
+ field.name = ASCIIToUTF16("foo");
+ field.value = ASCIIToUTF16("bar");
+ fields.push_back(field);
+ service_->get_autofill_webdata_service()->AddFormFields(fields);
+ EXPECT_TRUE(service_->HasFormData());
+ service_->ClearFormData();
+ EXPECT_FALSE(service_->HasFormData());
+}
+
+} // namespace android_webview
diff --git a/android_webview/java/src/org/chromium/android_webview/AwFormDatabase.java b/android_webview/java/src/org/chromium/android_webview/AwFormDatabase.java
index 368d658..9687a1c 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwFormDatabase.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwFormDatabase.java
@@ -13,6 +13,10 @@ import org.chromium.base.JNINamespace;
@JNINamespace("android_webview")
public class AwFormDatabase {
+ public static boolean hasFormData() {
+ return nativeHasFormData();
+ }
+
public static void clearFormData() {
nativeClearFormData();
}
@@ -20,5 +24,7 @@ public class AwFormDatabase {
//--------------------------------------------------------------------------------------------
// Native methods
//--------------------------------------------------------------------------------------------
+ private static native boolean nativeHasFormData();
+
private static native void nativeClearFormData();
}
diff --git a/android_webview/native/android_webview_jni_registrar.cc b/android_webview/native/android_webview_jni_registrar.cc
index 993ca7d..05f4388 100644
--- a/android_webview/native/android_webview_jni_registrar.cc
+++ b/android_webview/native/android_webview_jni_registrar.cc
@@ -8,6 +8,7 @@
#include "android_webview/native/aw_contents.h"
#include "android_webview/native/aw_contents_client_bridge.h"
#include "android_webview/native/aw_contents_io_thread_client_impl.h"
+#include "android_webview/native/aw_form_database.h"
#include "android_webview/native/aw_http_auth_handler.h"
#include "android_webview/native/aw_quota_manager_bridge_impl.h"
#include "android_webview/native/aw_resource.h"
@@ -29,6 +30,7 @@ static base::android::RegistrationMethod kWebViewRegisteredMethods[] = {
{ "AwContents", RegisterAwContents },
{ "AwContentsClientBridge", RegisterAwContentsClientBridge },
{ "AwContentsIoThreadClientImpl", RegisterAwContentsIoThreadClientImpl},
+ { "AwFormDatabase", RegisterAwFormDatabase},
{ "AwSettings", RegisterAwSettings },
{ "AwHttpAuthHandler", RegisterAwHttpAuthHandler },
{ "AwQuotaManagerBridge", RegisterAwQuotaManagerBridge },
diff --git a/android_webview/native/aw_form_database.cc b/android_webview/native/aw_form_database.cc
index f0d42fd..5ebdf12 100644
--- a/android_webview/native/aw_form_database.cc
+++ b/android_webview/native/aw_form_database.cc
@@ -6,33 +6,51 @@
#include "android_webview/browser/aw_browser_context.h"
#include "android_webview/browser/aw_content_browser_client.h"
+#include "android_webview/browser/aw_form_database_service.h"
#include "base/android/jni_android.h"
#include "base/logging.h"
#include "base/time.h"
#include "components/autofill/browser/webdata/autofill_webdata_service.h"
#include "jni/AwFormDatabase_jni.h"
+// static
+scoped_refptr<autofill::AutofillWebDataService>
+autofill::AutofillWebDataService::FromBrowserContext(
+ content::BrowserContext* context) {
+
+ DCHECK(context);
+ android_webview::AwFormDatabaseService* service =
+ static_cast<android_webview::AwBrowserContext*>(
+ context)->GetFormDatabaseService();
+ DCHECK(service);
+ return service->get_autofill_webdata_service();
+}
+
namespace android_webview {
-// static
-void ClearFormData(JNIEnv*, jclass) {
+namespace {
+
+AwFormDatabaseService* GetFormDatabaseService() {
+
AwBrowserContext* context = AwContentBrowserClient::GetAwBrowserContext();
- DCHECK(context);
+ AwFormDatabaseService* service = context->GetFormDatabaseService();
+ return service;
+}
+
+} // anonymous namespace
- autofill::AutofillWebDataService* service =
- autofill::AutofillWebDataService::FromBrowserContext(context).get();
- if (service == NULL) {
- LOG(WARNING) << "No webdata service found, ignoring ClearFormData";
- return;
- }
-
- base::Time begin;
- base::Time end = base::Time::Max();
- service->RemoveFormElementsAddedBetween(begin, end);
- service->RemoveAutofillDataModifiedBetween(begin, end);
+
+// static
+jboolean HasFormData(JNIEnv*, jclass) {
+ return GetFormDatabaseService()->HasFormData();
+}
+
+// static
+void ClearFormData(JNIEnv*, jclass) {
+ GetFormDatabaseService()->ClearFormData();
}
-bool RegisterFormDatabase(JNIEnv* env) {
+bool RegisterAwFormDatabase(JNIEnv* env) {
return RegisterNativesImpl(env) >= 0;
}
diff --git a/android_webview/native/aw_form_database.h b/android_webview/native/aw_form_database.h
index 9f6ebae..ae1ceb0 100644
--- a/android_webview/native/aw_form_database.h
+++ b/android_webview/native/aw_form_database.h
@@ -9,7 +9,7 @@
namespace android_webview {
-bool RegisterFormDatabase(JNIEnv* env);
+bool RegisterAwFormDatabase(JNIEnv* env);
} // namespace android_webview
diff --git a/android_webview/native/webview_native.gyp b/android_webview/native/webview_native.gyp
index cdd2f71..2ac370d 100644
--- a/android_webview/native/webview_native.gyp
+++ b/android_webview/native/webview_native.gyp
@@ -12,6 +12,7 @@
'dependencies': [
'../../base/base.gyp:base_static',
'../../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
+ '../../components/components.gyp:autofill_browser',
'../../components/components.gyp:web_contents_delegate_android',
'../../cc/cc.gyp:cc',
'../../net/net.gyp:net',