Index: android_webview/browser/aw_contents.cc |
diff --git a/android_webview/browser/aw_contents.cc b/android_webview/browser/aw_contents.cc |
index 45fc4ff0747ec3bd09332abdd8eb28a86b0176aa..1cf6be1f699cca77356ec79ce0b3279ca4a0aa9e 100644 |
--- a/android_webview/browser/aw_contents.cc |
+++ b/android_webview/browser/aw_contents.cc |
@@ -52,6 +52,7 @@ |
#include "base/strings/string16.h" |
#include "base/supports_user_data.h" |
#include "base/threading/thread_task_runner_handle.h" |
+#include "components/autofill/android/autofill_provider_android.h" |
#include "components/autofill/content/browser/content_autofill_driver_factory.h" |
#include "components/autofill/core/browser/autofill_manager.h" |
#include "components/autofill/core/browser/webdata/autofill_webdata_service.h" |
@@ -249,7 +250,8 @@ void AwContents::SetJavaPeers( |
const JavaParamRef<jobject>& web_contents_delegate, |
const JavaParamRef<jobject>& contents_client_bridge, |
const JavaParamRef<jobject>& io_thread_client, |
- const JavaParamRef<jobject>& intercept_navigation_delegate) { |
+ const JavaParamRef<jobject>& intercept_navigation_delegate, |
+ const JavaParamRef<jobject>& autofill_provider) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
// The |aw_content| param is technically spurious as it duplicates |obj| but |
// is passed over anyway to make the binding more explicit. |
@@ -271,6 +273,11 @@ void AwContents::SetJavaPeers( |
web_contents_.get(), base::MakeUnique<InterceptNavigationDelegate>( |
env, intercept_navigation_delegate)); |
+ if (!autofill_provider.is_null()) { |
+ autofill_provider_ = base::MakeUnique<autofill::AutofillProviderAndroid>( |
+ autofill_provider, web_contents_.get()); |
+ } |
+ |
// Finally, having setup the associations, release any deferred requests |
for (content::RenderFrameHost* rfh : web_contents_->GetAllFrames()) { |
int render_process_id = rfh->GetProcess()->GetID(); |
@@ -291,20 +298,29 @@ void AwContents::SetSaveFormData(bool enabled) { |
} |
} |
-void AwContents::InitAutofillIfNecessary(bool enabled) { |
- // Do not initialize if the feature is not enabled. |
- if (!enabled) |
- return; |
+void AwContents::InitAutofillIfNecessary(bool autocomplete_enabled) { |
// Check if the autofill driver factory already exists. |
content::WebContents* web_contents = web_contents_.get(); |
if (ContentAutofillDriverFactory::FromWebContents(web_contents)) |
return; |
+ // Check if AutofillProvider is available. |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ JNIEnv* env = AttachCurrentThread(); |
+ ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
+ if (obj.is_null()) |
+ return; |
+ |
+ // Just return, if the app neither runs on O sdk nor enables autocomplete. |
+ if (!autofill_provider_ && !autocomplete_enabled) |
+ return; |
+ |
AwAutofillClient::CreateForWebContents(web_contents); |
ContentAutofillDriverFactory::CreateForWebContentsAndDelegate( |
web_contents, AwAutofillClient::FromWebContents(web_contents), |
base::android::GetDefaultLocaleString(), |
- AutofillManager::DISABLE_AUTOFILL_DOWNLOAD_MANAGER); |
+ AutofillManager::DISABLE_AUTOFILL_DOWNLOAD_MANAGER, |
+ autofill_provider_.get()); |
} |
void AwContents::SetAwAutofillClient(const JavaRef<jobject>& client) { |
@@ -1361,6 +1377,12 @@ void AwContents::ResumeLoadingCreatedPopupWebContents( |
web_contents_->ResumeLoadingCreatedWebContents(); |
} |
+jlong AwContents::GetAutofillProvider( |
+ JNIEnv* env, |
+ const base::android::JavaParamRef<jobject>& obj) { |
+ return reinterpret_cast<jlong>(autofill_provider_.get()); |
+} |
+ |
void SetShouldDownloadFavicons(JNIEnv* env, |
const JavaParamRef<jclass>& jclazz) { |
g_should_download_favicons = true; |