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

Side by Side Diff: components/autofill/content/browser/autofill_provider_android.cc

Issue 2839023003: WebView autofill implementation (Closed)
Patch Set: fix coordinates 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/content/browser/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/core/browser/autofill_manager.h"
11 #include "components/autofill/core/browser/form_data_android.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::JavaParamRef;
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 ScopedJavaLocalRef<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 }
37
38 AutofillProviderAndroid::~AutofillProviderAndroid() {
39 JNIEnv* env = AttachCurrentThread();
40 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
41 if (obj.is_null())
42 return;
43
44 Java_AutofillProvider_reset(env, obj, reinterpret_cast<long>(this));
Roger McFarlane (Chromium) 2017/05/05 21:19:43 are sizeof(long) and sizeof(ptr_t) always the same
michaelbai 2017/05/09 00:27:03 Thanks, to make it more clear, I changed it to jlo
45 }
46
47 void AutofillProviderAndroid::OnQueryFormFieldAutofill(
48 AutofillManager* manager,
49 int32_t id,
50 const FormData& form,
51 const FormFieldData& field,
52 const gfx::RectF& bounding_box) {
53 // The id isn't passed to Java side because Android API guarantees the
54 // response is always for current session, so we just use the current id
55 // in response, see OnAutofillAvailable.
56 DCHECK_CURRENTLY_ON(BrowserThread::UI);
57 id_ = id;
58
59 JNIEnv* env = AttachCurrentThread();
60 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
61 if (obj.is_null())
62 return;
63
64 form_ = base::MakeUnique<FormDataAndroid>(form);
65
66 size_t index;
67 if (!form_->GetFieldIndex(field, &index))
68 return;
69
70 gfx::Rect client_area = web_contents_->GetContainerBounds();
71 gfx::RectF transformed_bounding =
72 bounding_box + client_area.OffsetFromOrigin();
73
74 ScopedJavaLocalRef<jobject> formObj = form_->GetJavaPeer();
75 manager_ = manager->GetWeakPtr();
76 Java_AutofillProvider_startAutofillSession(
77 env, obj, reinterpret_cast<long>(this),
78 web_contents_->GetJavaWebContents(), formObj, index,
79 transformed_bounding.x(), transformed_bounding.y(),
80 transformed_bounding.width(), transformed_bounding.height());
81 }
82
83 void AutofillProviderAndroid::OnAutofillAvailable(JNIEnv* env,
84 jobject jcaller,
85 jobject formData) {
86 DCHECK_CURRENTLY_ON(BrowserThread::UI);
87 if (manager_) {
88 const FormData& form = form_->PullAutofillValues();
89 SendFormDataToRenderer(manager_.get(), id_, form);
90 }
91 }
92
93 void AutofillProviderAndroid::OnTextFieldDidChange(
94 AutofillManager* manager,
95 const FormData& form,
96 const FormFieldData& field,
97 const base::TimeTicks& timestamp) {
98 DCHECK_CURRENTLY_ON(BrowserThread::UI);
99 if (!ValidateManager(manager))
100 return;
101
102 if (!form_->SimilarFormAs(form))
103 return;
104
105 size_t index;
106 if (!form_->GetSimilarFieldIndex(field, &index))
107 return;
108
109 form_->OnTextFieldDidChange(index, field.value);
110 JNIEnv* env = AttachCurrentThread();
111 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
112 if (obj.is_null())
113 return;
114
115 Java_AutofillProvider_onTextFieldDidChange(
116 env, obj, reinterpret_cast<long>(this),
117 web_contents_->GetJavaWebContents(), index);
118 }
119
120 void AutofillProviderAndroid::OnWillSubmitForm(
121 AutofillManager* manager,
122 const FormData& form,
123 const base::TimeTicks& timestamp) {
124 DCHECK_CURRENTLY_ON(BrowserThread::UI);
125 if (!ValidateManager(manager))
126 return;
127
128 if (!form_->SimilarFormAs(form))
129 return;
130
131 JNIEnv* env = AttachCurrentThread();
132 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
133 if (obj.is_null())
134 return;
135 Java_AutofillProvider_onWillSubmitForm(env, obj,
136 reinterpret_cast<long>(this));
137 }
138
139 void AutofillProviderAndroid::OnFocusNoLongerOnForm(AutofillManager* manager) {
140 DCHECK_CURRENTLY_ON(BrowserThread::UI);
141 if (!ValidateManager(manager))
142 return;
143
144 OnFocusChanged(false, 0, RectF());
145 }
146
147 void AutofillProviderAndroid::OnFocusChanged(bool focus_on_form,
148 size_t index,
149 const gfx::RectF& bounding_box) {
150 DCHECK_CURRENTLY_ON(BrowserThread::UI);
151 JNIEnv* env = AttachCurrentThread();
152 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
153 if (obj.is_null())
154 return;
155
156 Java_AutofillProvider_onFocusChanged(env, obj, reinterpret_cast<long>(this),
157 web_contents_->GetJavaWebContents(),
158 focus_on_form, index, bounding_box.x(),
159 bounding_box.y(), bounding_box.width(),
160 bounding_box.height());
161 }
162
163 void AutofillProviderAndroid::OnDidFillAutofillFormData(
164 AutofillManager* manager,
165 const FormData& form,
166 base::TimeTicks timestamp) {
167 DCHECK_CURRENTLY_ON(BrowserThread::UI);
168 if (manager != manager_.get() || !form_ || !form_->SimilarFormAs(form))
169 return;
170
171 for (auto field : form.fields) {
172 if (!field.is_autofilled)
173 continue;
174 OnTextFieldDidChange(manager, form, field, timestamp);
175 }
176 }
177
178 void AutofillProviderAndroid::Reset(AutofillManager* manager) {
179 DCHECK_CURRENTLY_ON(BrowserThread::UI);
180 if (manager == manager_.get()) {
181 manager_.reset();
182 JNIEnv* env = AttachCurrentThread();
183 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
184 if (obj.is_null())
185 return;
186
187 Java_AutofillProvider_reset(env, obj, reinterpret_cast<long>(this));
188 }
189 }
190
191 bool AutofillProviderAndroid::ValidateManager(AutofillManager* manager) {
192 DCHECK_CURRENTLY_ON(BrowserThread::UI);
193 bool ret = manager == manager_.get();
194 if (!ret)
195 manager_.reset();
196 return ret;
197 }
198
199 bool RegisterAutofillProvider(JNIEnv* env) {
200 return RegisterNativesImpl(env);
201 }
202
203 } // namespace autofil
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698