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/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_manager.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<jlong>(this)); | |
| 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 | |
|
sgurun-gerrit only
2017/05/11 00:13:29
by guarantee, if you mean that android won't make
michaelbai
2017/05/12 00:37:23
As we discussed, this statement is still true.
| |
| 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 | |
|
sgurun-gerrit only
2017/05/11 00:13:29
nit: s/autofil/autofill
michaelbai
2017/05/12 00:37:23
Done.
| |
| OLD | NEW |