Chromium Code Reviews| OLD | NEW |
|---|---|
| (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/core/browser/autofill_provider_android.h" | |
| 6 | |
| 7 #include "base/android/jni_android.h" | |
| 8 #include "base/android/jni_string.h" | |
| 9 #include "components/autofill/core/browser/autofill_manager.h" | |
| 10 #include "components/autofill/core/browser/form_data_android.h" | |
| 11 #include "content/public/browser/browser_thread.h" | |
| 12 #include "jni/AutofillProvider_jni.h" | |
| 13 #include "ui/gfx/geometry/rect_f.h" | |
| 14 | |
| 15 using base::android::AttachCurrentThread; | |
| 16 using base::android::ConvertUTF16ToJavaString; | |
| 17 using base::android::ConvertUTF8ToJavaString; | |
| 18 using base::android::JavaParamRef; | |
| 19 using base::android::ScopedJavaLocalRef; | |
| 20 using content::BrowserThread; | |
| 21 using gfx::RectF; | |
| 22 | |
| 23 namespace autofill { | |
| 24 | |
| 25 const int kInvalidRequestId = -1; | |
| 26 | |
| 27 static jlong CreateNativePeer(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 JNIEnv* env = AttachCurrentThread(); | |
| 37 java_ref_ = JavaObjectWeakGlobalRef(env, jcaller); | |
| 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 Java_AutofillProvider_onNativeDestroyed(env, obj); | |
| 47 } | |
| 48 | |
| 49 void AutofillProviderAndroid::OnQueryFormFieldAutofill( | |
| 50 AutofillManager* manager, | |
| 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 guaranttes the | |
|
sgurun-gerrit only
2017/04/28 01:46:39
nit: s/guaranttes/guarantees/
michaelbai
2017/05/03 04:43:59
Done.
| |
| 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); | |
| 59 id_ = id; | |
| 60 if (manager_.get() == manager && form_ && form_->SimilarFormAs(form)) { | |
| 61 size_t index; | |
| 62 if (form_->GetSimilarFieldIndex(field, &index)) { | |
| 63 OnFocusChanged(true, index, bounding_box); | |
| 64 } | |
| 65 return; | |
| 66 } | |
| 67 | |
| 68 JNIEnv* env = AttachCurrentThread(); | |
| 69 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | |
| 70 if (obj.is_null()) | |
| 71 return; | |
| 72 | |
| 73 form_.reset(new FormDataAndroid(form)); | |
|
sgurun-gerrit only
2017/04/28 01:46:39
MakeUnique?
michaelbai
2017/05/03 04:43:59
Done.
| |
| 74 | |
| 75 size_t index; | |
| 76 if (!form_->GetFieldIndex(field, &index)) | |
|
sgurun-gerrit only
2017/04/28 01:46:40
I don't understand why we need to do the similarit
michaelbai
2017/05/03 04:43:59
This uses to get index of field.
| |
| 77 return; | |
| 78 | |
| 79 ScopedJavaLocalRef<jobject> formObj = form_->GetJavaPeer(); | |
| 80 manager_ = manager->GetWeakPtr(); | |
| 81 Java_AutofillProvider_queryFormFieldAutofill( | |
|
sgurun-gerrit only
2017/04/28 01:46:40
keep the same name, i.e. onQueryFormFieldAutofill
michaelbai
2017/05/03 04:43:59
I intentionally used different name, OnQueryFormFi
| |
| 82 env, obj, formObj, index, bounding_box.x(), bounding_box.y(), | |
| 83 bounding_box.width(), bounding_box.height()); | |
|
sgurun-gerrit only
2017/04/28 01:46:40
you don't seem to be converting x,y coordinates to
michaelbai
2017/05/03 04:43:59
The bound still wasn't correct, after use the code
| |
| 84 } | |
| 85 | |
| 86 void AutofillProviderAndroid::OnAutofillAvailable(JNIEnv* env, | |
| 87 jobject jcaller, | |
| 88 jobject formData) { | |
| 89 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 90 if (manager_) { | |
| 91 const FormData& form = form_->PullAutofillValues(); | |
| 92 SendFormDataToRenderer(manager_.get(), id_, form); | |
| 93 } | |
| 94 } | |
| 95 | |
| 96 void AutofillProviderAndroid::OnTextFieldDidChange( | |
| 97 AutofillManager* manager, | |
| 98 const FormData& form, | |
| 99 const FormFieldData& field, | |
| 100 const base::TimeTicks& timestamp) { | |
| 101 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 102 if (!ValidateManager(manager)) | |
| 103 return; | |
| 104 | |
| 105 if (!form_->SimilarFormAs(form)) | |
| 106 return; | |
| 107 | |
| 108 size_t index; | |
| 109 if (!form_->GetSimilarFieldIndex(field, &index)) | |
| 110 return; | |
| 111 | |
| 112 form_->OnTextFieldDidChange(index, field.value); | |
| 113 JNIEnv* env = AttachCurrentThread(); | |
| 114 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | |
| 115 if (obj.is_null()) | |
| 116 return; | |
| 117 | |
| 118 Java_AutofillProvider_onTextFieldDidChange(env, obj, index); | |
| 119 } | |
| 120 | |
| 121 void AutofillProviderAndroid::OnWillSubmitForm( | |
| 122 AutofillManager* manager, | |
| 123 const FormData& form, | |
| 124 const base::TimeTicks& timestamp) { | |
| 125 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 126 if (!ValidateManager(manager)) | |
| 127 return; | |
| 128 | |
| 129 if (!form_->SimilarFormAs(form)) | |
| 130 return; | |
| 131 | |
| 132 JNIEnv* env = AttachCurrentThread(); | |
| 133 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | |
| 134 if (obj.is_null()) | |
| 135 return; | |
| 136 Java_AutofillProvider_onWillSubmitForm(env, obj); | |
| 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( | |
| 157 env, obj, focus_on_form, index, bounding_box.x(), bounding_box.y(), | |
| 158 bounding_box.width(), bounding_box.height()); | |
| 159 } | |
| 160 | |
| 161 void AutofillProviderAndroid::OnDidFillAutofillFormData( | |
| 162 AutofillManager* manager, | |
| 163 const FormData& form, | |
| 164 base::TimeTicks timestamp) { | |
| 165 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 166 if (manager != manager_.get() || !form_ || !form_->SimilarFormAs(form)) | |
| 167 return; | |
| 168 | |
| 169 for (auto field : form.fields) { | |
| 170 if (!field.is_autofilled) | |
| 171 continue; | |
| 172 OnTextFieldDidChange(manager, form, field, timestamp); | |
| 173 } | |
| 174 } | |
| 175 | |
| 176 bool AutofillProviderAndroid::ValidateManager(AutofillManager* manager) { | |
| 177 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 178 bool ret = manager == manager_.get(); | |
| 179 if (!ret) | |
| 180 manager_.reset(); | |
| 181 return ret; | |
| 182 } | |
| 183 | |
| 184 bool RegisterAutofillProvider(JNIEnv* env) { | |
| 185 return RegisterNativesImpl(env); | |
| 186 } | |
| 187 | |
| 188 } // namespace autofil | |
| OLD | NEW |