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

Side by Side Diff: components/autofill/android/autofill_provider_android.cc

Issue 2839023003: WebView autofill implementation (Closed)
Patch Set: Refactoring AutofillManager Created 3 years, 7 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/autofill/android/autofill_provider_android.h"
6
7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h"
9 #include "base/memory/ptr_util.h"
10 #include "components/autofill/android/form_data_android.h"
11 #include "components/autofill/core/browser/autofill_handler_proxy.h"
12 #include "content/public/browser/browser_thread.h"
13 #include "content/public/browser/web_contents.h"
14 #include "jni/AutofillProvider_jni.h"
15 #include "ui/gfx/geometry/rect_f.h"
16
17 using base::android::AttachCurrentThread;
18 using base::android::ConvertUTF16ToJavaString;
19 using base::android::ConvertUTF8ToJavaString;
20 using base::android::JavaRef;
21 using base::android::ScopedJavaLocalRef;
22 using content::BrowserThread;
23 using content::WebContents;
24 using gfx::RectF;
25
26 namespace autofill {
27
28 const int kInvalidRequestId = -1;
29
30 AutofillProviderAndroid::AutofillProviderAndroid(
31 const JavaRef<jobject>& jcaller,
32 content::WebContents* web_contents)
33 : id_(kInvalidRequestId), web_contents_(web_contents) {
34 JNIEnv* env = AttachCurrentThread();
35 java_ref_ = JavaObjectWeakGlobalRef(env, jcaller);
36 Java_AutofillProvider_setNativeAutofillProvider(
37 env, jcaller, reinterpret_cast<jlong>(this));
38 }
39
40 AutofillProviderAndroid::~AutofillProviderAndroid() {
41 JNIEnv* env = AttachCurrentThread();
42 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
43 if (obj.is_null())
44 return;
45
Mathieu 2017/05/24 18:02:01 // Remove the reference to this object on the Java
michaelbai 2017/05/26 23:12:06 Done.
46 Java_AutofillProvider_setNativeAutofillProvider(env, obj, 0);
47 }
48
49 void AutofillProviderAndroid::OnQueryFormFieldAutofill(
50 AutofillHandlerProxy* handler,
51 int32_t id,
52 const FormData& form,
53 const FormFieldData& field,
54 const gfx::RectF& bounding_box) {
55 // The id isn't passed to Java side because Android API guarantees the
56 // response is always for current session, so we just use the current id
57 // in response, see OnAutofillAvailable.
58 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Mathieu 2017/05/24 18:02:01 From their sample code, is it typical to query And
michaelbai 2017/05/24 20:57:54 This isn't synchronous query and pretty safe to ca
59 id_ = id;
60
61 JNIEnv* env = AttachCurrentThread();
62 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
63 if (obj.is_null())
64 return;
65
66 form_ = base::MakeUnique<FormDataAndroid>(form);
67
68 size_t index;
69 if (!form_->GetFieldIndex(field, &index))
70 return;
71
72 gfx::Rect client_area = web_contents_->GetContainerBounds();
73 gfx::RectF transformed_bounding =
74 bounding_box + client_area.OffsetFromOrigin();
75
76 ScopedJavaLocalRef<jobject> formObj = form_->GetJavaPeer();
Mathieu 2017/05/24 18:02:01 hacker case: form_obj
michaelbai 2017/05/26 23:12:07 Done.
77 handler_ = handler->GetWeakPtr();
78 Java_AutofillProvider_startAutofillSession(
79 env, obj, formObj, index, transformed_bounding.x(),
80 transformed_bounding.y(), transformed_bounding.width(),
81 transformed_bounding.height());
82 }
83
84 void AutofillProviderAndroid::OnAutofillAvailable(JNIEnv* env,
85 jobject jcaller,
86 jobject formData) {
87 DCHECK_CURRENTLY_ON(BrowserThread::UI);
88 if (handler_) {
89 const FormData& form = form_->PullAutofillValues();
90 SendFormDataToRenderer(handler_.get(), id_, form);
91 }
92 }
93
94 void AutofillProviderAndroid::OnTextFieldDidChange(
95 AutofillHandlerProxy* handler,
96 const FormData& form,
97 const FormFieldData& field,
98 const base::TimeTicks& timestamp) {
99 DCHECK_CURRENTLY_ON(BrowserThread::UI);
100 if (!ValidateHandler(handler))
Mathieu 2017/05/24 18:02:01 This function would benefit from high-level commen
michaelbai 2017/05/26 23:12:06 Could you suggest the comments? from my aspect, th
101 return;
102
103 if (!form_->SimilarFormAs(form))
Mathieu 2017/05/24 18:02:01 can you combine those in a big if statement for th
michaelbai 2017/05/26 23:12:06 Done.
104 return;
105
106 size_t index;
107 if (!form_->GetSimilarFieldIndex(field, &index))
108 return;
109
110 form_->OnTextFieldDidChange(index, field.value);
111 JNIEnv* env = AttachCurrentThread();
112 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
113 if (obj.is_null())
114 return;
115
116 Java_AutofillProvider_onTextFieldDidChange(env, obj, index);
117 }
118
119 void AutofillProviderAndroid::OnWillSubmitForm(
120 AutofillHandlerProxy* handler,
121 const FormData& form,
122 const base::TimeTicks& timestamp) {
123 DCHECK_CURRENTLY_ON(BrowserThread::UI);
124 if (!ValidateHandler(handler))
125 return;
126
127 if (!form_->SimilarFormAs(form))
128 return;
129
130 JNIEnv* env = AttachCurrentThread();
131 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
132 if (obj.is_null())
133 return;
134 Java_AutofillProvider_onWillSubmitForm(env, obj);
135 }
136
137 void AutofillProviderAndroid::OnFocusNoLongerOnForm(
138 AutofillHandlerProxy* handler) {
139 DCHECK_CURRENTLY_ON(BrowserThread::UI);
140 if (!ValidateHandler(handler))
141 return;
142
143 OnFocusChanged(false, 0, RectF());
144 }
145
146 void AutofillProviderAndroid::OnFocusChanged(bool focus_on_form,
147 size_t index,
148 const gfx::RectF& bounding_box) {
149 DCHECK_CURRENTLY_ON(BrowserThread::UI);
150 JNIEnv* env = AttachCurrentThread();
151 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
152 if (obj.is_null())
153 return;
154
155 Java_AutofillProvider_onFocusChanged(
156 env, obj, focus_on_form, index, bounding_box.x(), bounding_box.y(),
157 bounding_box.width(), bounding_box.height());
158 }
159
160 void AutofillProviderAndroid::OnDidFillAutofillFormData(
161 AutofillHandlerProxy* handler,
162 const FormData& form,
163 base::TimeTicks timestamp) {
164 DCHECK_CURRENTLY_ON(BrowserThread::UI);
165 if (handler != handler_.get() || !form_ || !form_->SimilarFormAs(form))
166 return;
167
168 for (auto field : form.fields) {
Mathieu 2017/05/24 18:02:01 const FormFieldData& ?
michaelbai 2017/05/24 20:57:54 Interesting, do we have any guideline about when a
michaelbai 2017/05/26 23:12:06 OK, I found something about auto here https://goog
169 if (!field.is_autofilled)
170 continue;
171 OnTextFieldDidChange(handler, form, field, timestamp);
172 }
173 }
174
175 void AutofillProviderAndroid::Reset(AutofillHandlerProxy* handler) {
176 DCHECK_CURRENTLY_ON(BrowserThread::UI);
177 if (handler == handler_.get()) {
178 handler_.reset();
179 JNIEnv* env = AttachCurrentThread();
180 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
181 if (obj.is_null())
182 return;
183
184 Java_AutofillProvider_reset(env, obj);
185 }
186 }
187
188 bool AutofillProviderAndroid::ValidateHandler(AutofillHandlerProxy* handler) {
189 DCHECK_CURRENTLY_ON(BrowserThread::UI);
190 bool ret = handler == handler_.get();
191 if (!ret)
192 handler_.reset();
193 return ret;
194 }
195
196 bool RegisterAutofillProvider(JNIEnv* env) {
197 return RegisterNativesImpl(env);
198 }
199
200 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698