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

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

Issue 2745803003: autofill-try
Patch Set: autofill-try Created 3 years, 6 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
46 // Remove the reference to this object on the Java side.
47 Java_AutofillProvider_setNativeAutofillProvider(env, obj, 0);
48 }
49
50 void AutofillProviderAndroid::OnQueryFormFieldAutofill(
51 AutofillHandlerProxy* handler,
52 int32_t id,
53 const FormData& form,
54 const FormFieldData& field,
55 const gfx::RectF& bounding_box) {
56 // The id isn't passed to Java side because Android API guarantees the
57 // response is always for current session, so we just use the current id
58 // in response, see OnAutofillAvailable.
59 DCHECK_CURRENTLY_ON(BrowserThread::UI);
60 id_ = id;
61
62 JNIEnv* env = AttachCurrentThread();
63 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
64 if (obj.is_null())
65 return;
66
67 form_ = base::MakeUnique<FormDataAndroid>(form);
68
69 size_t index;
70 if (!form_->GetFieldIndex(field, &index))
71 return;
72
73 gfx::Rect client_area = web_contents_->GetContainerBounds();
74 gfx::RectF transformed_bounding =
75 bounding_box + client_area.OffsetFromOrigin();
76
77 ScopedJavaLocalRef<jobject> form_obj = form_->GetJavaPeer();
78 handler_ = handler->GetWeakPtr();
79 Java_AutofillProvider_startAutofillSession(
80 env, obj, form_obj, index, transformed_bounding.x(),
81 transformed_bounding.y(), transformed_bounding.width(),
82 transformed_bounding.height());
83 }
84
85 void AutofillProviderAndroid::OnAutofillAvailable(JNIEnv* env,
86 jobject jcaller,
87 jobject formData) {
88 DCHECK_CURRENTLY_ON(BrowserThread::UI);
89 if (handler_) {
90 const FormData& form = form_->GetAutofillValues();
91 SendFormDataToRenderer(handler_.get(), id_, form);
92 }
93 }
94
95 void AutofillProviderAndroid::OnTextFieldDidChange(
96 AutofillHandlerProxy* handler,
97 const FormData& form,
98 const FormFieldData& field,
99 const base::TimeTicks timestamp) {
100 DCHECK_CURRENTLY_ON(BrowserThread::UI);
101 if (!ValidateHandler(handler) || !form_->SimilarFormAs(form))
102 return;
103
104 size_t index;
105 if (!form_->GetSimilarFieldIndex(field, &index))
106 return;
107
108 form_->OnTextFieldDidChange(index, field.value);
109 JNIEnv* env = AttachCurrentThread();
110 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
111 if (obj.is_null())
112 return;
113
114 Java_AutofillProvider_onTextFieldDidChange(env, obj, index);
115 }
116
117 bool AutofillProviderAndroid::OnWillSubmitForm(
118 AutofillHandlerProxy* handler,
119 const FormData& form,
120 const base::TimeTicks timestamp) {
121 DCHECK_CURRENTLY_ON(BrowserThread::UI);
122 if (!ValidateHandler(handler) || !form_->SimilarFormAs(form))
123 return false;
124
125 JNIEnv* env = AttachCurrentThread();
126 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
127 if (obj.is_null())
128 return false;
129 Java_AutofillProvider_onWillSubmitForm(env, obj);
130 return true;
131 }
132
133 void AutofillProviderAndroid::OnFocusNoLongerOnForm(
134 AutofillHandlerProxy* handler) {
135 DCHECK_CURRENTLY_ON(BrowserThread::UI);
136 if (!ValidateHandler(handler))
137 return;
138
139 OnFocusChanged(false, 0, RectF());
140 }
141
142 void AutofillProviderAndroid::OnFocusChanged(bool focus_on_form,
143 size_t index,
144 const gfx::RectF& bounding_box) {
145 DCHECK_CURRENTLY_ON(BrowserThread::UI);
146 JNIEnv* env = AttachCurrentThread();
147 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
148 if (obj.is_null())
149 return;
150
151 Java_AutofillProvider_onFocusChanged(
152 env, obj, focus_on_form, index, bounding_box.x(), bounding_box.y(),
153 bounding_box.width(), bounding_box.height());
154 }
155
156 void AutofillProviderAndroid::OnDidFillAutofillFormData(
157 AutofillHandlerProxy* handler,
158 const FormData& form,
159 base::TimeTicks timestamp) {
160 DCHECK_CURRENTLY_ON(BrowserThread::UI);
161 if (handler != handler_.get() || !form_ || !form_->SimilarFormAs(form))
162 return;
163
164 for (const FormFieldData& field : form.fields) {
165 if (!field.is_autofilled)
166 continue;
167 OnTextFieldDidChange(handler, form, field, timestamp);
168 }
169 }
170
171 void AutofillProviderAndroid::Reset(AutofillHandlerProxy* handler) {
172 DCHECK_CURRENTLY_ON(BrowserThread::UI);
173 if (handler == handler_.get()) {
174 handler_.reset();
175 JNIEnv* env = AttachCurrentThread();
176 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
177 if (obj.is_null())
178 return;
179
180 Java_AutofillProvider_reset(env, obj);
181 }
182 }
183
184 bool AutofillProviderAndroid::ValidateHandler(AutofillHandlerProxy* handler) {
185 DCHECK_CURRENTLY_ON(BrowserThread::UI);
186 bool ret = handler == handler_.get();
187 if (!ret)
188 handler_.reset();
189 return ret;
190 }
191
192 bool RegisterAutofillProvider(JNIEnv* env) {
193 return RegisterNativesImpl(env);
194 }
195
196 } // namespace autofill
OLDNEW
« no previous file with comments | « components/autofill/android/autofill_provider_android.h ('k') | components/autofill/android/form_data_android.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698