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

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

Issue 2745803003: autofill-try
Patch Set: before I leave Created 3 years, 8 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 "components/autofill/content/browser/form_data_android.h"
10 #include "content/public/browser/browser_thread.h"
11 #include "jni/AutofillProvider_jni.h"
12 #include "ui/gfx/geometry/rect_f.h"
13
14 using base::android::AttachCurrentThread;
15 using base::android::ConvertUTF16ToJavaString;
16 using base::android::ConvertUTF8ToJavaString;
17 using base::android::JavaParamRef;
18 using base::android::ScopedJavaLocalRef;
19 using content::BrowserThread;
20 using gfx::RectF;
21
22 namespace autofill {
23
24 const int kInvalidRequestId = -1;
25
26 static jlong CreateNativePeer(
27 JNIEnv* env,
28 const JavaParamRef<jobject>& jcaller) {
29 return reinterpret_cast<jlong>(
30 new autofill::AutofillProviderAndroid(jcaller));
31 }
32
33 AutofillProviderAndroid::AutofillProviderAndroid(
34 const JavaParamRef<jobject>& jcaller)
35 : id_(kInvalidRequestId),
36 driver_(nullptr) {
37 JNIEnv* env = AttachCurrentThread();
38 java_ref_ = JavaObjectWeakGlobalRef(env, jcaller);
39 }
40
41 AutofillProviderAndroid::~AutofillProviderAndroid() {
42 JNIEnv* env = AttachCurrentThread();
43 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
44 if (obj.is_null())
45 return;
46
47 Java_AutofillProvider_OnNativeDestroyed(env, obj);
48 }
49
50 void AutofillProviderAndroid::OnQueryFormFieldAutofill(
51 ContentAutofillDriver* driver,
52 int32_t id,
53 const FormData& form,
54 const FormFieldData& field,
55 const gfx::RectF& bounding_box) {
56 LOG(ERROR) << "bt:" << __PRETTY_FUNCTION__ << " id:" << id;
57 // The id isn't passed to Java side because Android API guaranttes the
58 // response is always for current session, so we just use the current id
59 // in response, see OnAutofillAvailable.
60 DCHECK_CURRENTLY_ON(BrowserThread::UI);
61 id_ = id;
62 if (driver_ == driver && form_ && form_->SameFormAs(form)) {
63 size_t index;
64 if (form_->GetFieldIndex(field, &index)) {
65 OnFocusChanged(true, index, bounding_box);
66 }
67 return;
68 }
69
70 JNIEnv* env = AttachCurrentThread();
71 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
72 if (obj.is_null())
73 return;
74
75 form_.reset(new FormDataAndroid(form));
76
77 size_t index;
78 if (!form_->GetFieldIndex(field, &index))
79 return;
80
81 ScopedJavaLocalRef<jobject> formObj = form_->GetJavaPeer();
82 driver_ = driver;
83 Java_AutofillProvider_queryFormFieldAutofill(env, obj, formObj, index,
84 bounding_box.x(), bounding_box.y(), bounding_box.width(), bounding_box.hei ght());
85 }
86
87 void AutofillProviderAndroid::OnAutofillAvailable(JNIEnv*env,
88 jobject jcaller,
89 jobject formData) {
90 LOG(ERROR) << "bt:" << __PRETTY_FUNCTION__;
91 const FormData& form = form_->PullAutofillValues();
92 if (driver_)
93 SendFormDataToRenderer(driver_, id_, form);
94 }
95
96 void AutofillProviderAndroid::OnTextFieldDidChange(
97 ContentAutofillDriver* driver,
98 const FormData& form,
99 const FormFieldData& field,
100 const base::TimeTicks& timestamp) {
101 DCHECK_CURRENTLY_ON(BrowserThread::UI);
102 LOG(ERROR) << "bt:" << __PRETTY_FUNCTION__;
103 if (!ValidateDriver(driver))
104 return;
105
106 if (!form_->SameFormAs(form)) {
107 LOG(ERROR) << "bt:" << "form fields count is different";
108 return;
109 }
110
111 size_t index;
112 if (!form_->GetFieldIndex(field, &index))
113 return;
114
115 form_->OnTextFieldDidChange(index, field.value);
116 JNIEnv* env = AttachCurrentThread();
117 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
118 if (obj.is_null())
119 return;
120
121 Java_AutofillProvider_onTextFieldDidChange(env, obj, index);
122 }
123
124 void AutofillProviderAndroid::OnWillSubmitForm(
125 ContentAutofillDriver* driver,
126 const FormData& form,
127 const base::TimeTicks& timestamp) {
128 DCHECK_CURRENTLY_ON(BrowserThread::UI);
129 if (!ValidateDriver(driver))
130 return;
131
132 if (!form_->SameFormAs(form)) {
133 LOG(ERROR) << "bt:" << "Submitted form is different than current one";
134 return;
135 }
136
137 JNIEnv* env = AttachCurrentThread();
138 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
139 if (obj.is_null())
140 return;
141 Java_AutofillProvider_OnWillSubmitForm(env, obj);
142 }
143
144 void AutofillProviderAndroid::OnFocusNoLongerOnForm(
145 ContentAutofillDriver* driver) {
146 if (!ValidateDriver(driver))
147 return;
148 OnFocusChanged(false, 0, RectF());
149 }
150
151 void AutofillProviderAndroid::OnFocusChanged(bool focus_on_form,
152 size_t index,
153 const gfx::RectF& bounding_box) {
154 JNIEnv* env = AttachCurrentThread();
155 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
156 if (obj.is_null())
157 return;
158
159 Java_AutofillProvider_OnFocusChanged(env, obj, focus_on_form, index,
160 bounding_box.x(), bounding_box.y(), bounding_box.width(), bounding_box.hei ght());
161 }
162
163 void AutofillProviderAndroid::OnDidFillAutofillFormData(
164 ContentAutofillDriver* driver,
165 const FormData& form,
166 base::TimeTicks timestamp) {
167 if (driver != driver_ || !form_ || !form_->SameFormAs(form))
168 return;
169
170 for (auto field : form.fields) {
171 if (!field.is_autofilled)
172 continue;
173 OnTextFieldDidChange(driver, form, field, timestamp);
174 }
175 }
176
177 void AutofillProviderAndroid::OnContentAutofillDriverDestroyed(
178 ContentAutofillDriver* driver) {
179 if (driver == driver_)
180 driver_ = nullptr;
181 }
182
183 bool AutofillProviderAndroid::ValidateDriver(ContentAutofillDriver* driver) {
184 bool ret = driver == driver_;
185 if (!ret)
186 driver_ = nullptr;
187 return ret;
188 }
189
190 bool RegisterAutofillProvider(JNIEnv* env) {
191 return RegisterNativesImpl(env);
192 }
193
194 } // namespace autofil
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698