diff options
author | sgurun@chromium.org <sgurun@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-08 16:16:37 +0000 |
---|---|---|
committer | sgurun@chromium.org <sgurun@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-08 16:16:37 +0000 |
commit | 1140180828d318fe4d096484dd1a110b714ec285 (patch) | |
tree | b45a687a3fa16b41c3847b1ad0c8d57f13a6bb84 /android_webview | |
parent | 5558ebad44509c3574cf5dce1ad2929b1b0bdeb2 (diff) | |
download | chromium_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.gyp | 2 | ||||
-rw-r--r-- | android_webview/android_webview_tests.gypi | 3 | ||||
-rw-r--r-- | android_webview/browser/DEPS | 4 | ||||
-rw-r--r-- | android_webview/browser/aw_browser_context.cc | 11 | ||||
-rw-r--r-- | android_webview/browser/aw_browser_context.h | 6 | ||||
-rw-r--r-- | android_webview/browser/aw_form_database_service.cc | 105 | ||||
-rw-r--r-- | android_webview/browser/aw_form_database_service.h | 63 | ||||
-rw-r--r-- | android_webview/browser/aw_form_database_service_unittest.cc | 73 | ||||
-rw-r--r-- | android_webview/java/src/org/chromium/android_webview/AwFormDatabase.java | 6 | ||||
-rw-r--r-- | android_webview/native/android_webview_jni_registrar.cc | 2 | ||||
-rw-r--r-- | android_webview/native/aw_form_database.cc | 48 | ||||
-rw-r--r-- | android_webview/native/aw_form_database.h | 2 | ||||
-rw-r--r-- | android_webview/native/webview_native.gyp | 1 |
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', |