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/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 |
OLD | NEW |