diff options
| author | Ben Murdoch <benm@google.com> | 2010-09-10 21:21:28 +0100 |
|---|---|---|
| committer | Steve Block <steveblock@google.com> | 2010-09-23 17:07:42 +0100 |
| commit | c95d7f499ee3250e2d4a51f7e8f04bb6ebfc6add (patch) | |
| tree | c0a08b300482f0cef7e37a0305bcef1898f8ace3 | |
| parent | 45ca37e14f3f68f52a77e0d06514716809ed89ab (diff) | |
| download | external_webkit-c95d7f499ee3250e2d4a51f7e8f04bb6ebfc6add.zip external_webkit-c95d7f499ee3250e2d4a51f7e8f04bb6ebfc6add.tar.gz external_webkit-c95d7f499ee3250e2d4a51f7e8f04bb6ebfc6add.tar.bz2 | |
Integrate AutoFill with WebTextView in Java.
Adds the necessary JNI hooks so that when the user focuses a form
field that AutoFill has identified as "autofillable", the Java side
WebTextView will show an option in the auto complete drop down box
that when selected will call back to AutoFill in native code and
actually fill out the form.
AutoFill is still disabled at compile time by default. To test the
feature set ENABLE_AUTOFILL=true and rebuild WebKit.
Needs a corresponding frameworks/base change.
Change-Id: Ie76ff9cbf0b44f3f3644079ed64ce71bfbc9859a
| -rw-r--r-- | WebKit/android/WebCoreSupport/autofill/AutoFillHostAndroid.cpp | 2 | ||||
| -rw-r--r-- | WebKit/android/WebCoreSupport/autofill/WebAutoFill.cpp | 35 | ||||
| -rw-r--r-- | WebKit/android/WebCoreSupport/autofill/WebAutoFill.h | 18 | ||||
| -rw-r--r-- | WebKit/android/jni/WebCoreFrameBridge.cpp | 4 | ||||
| -rw-r--r-- | WebKit/android/jni/WebViewCore.cpp | 28 | ||||
| -rw-r--r-- | WebKit/android/jni/WebViewCore.h | 1 |
6 files changed, 81 insertions, 7 deletions
diff --git a/WebKit/android/WebCoreSupport/autofill/AutoFillHostAndroid.cpp b/WebKit/android/WebCoreSupport/autofill/AutoFillHostAndroid.cpp index 51f7a93..abe4b35 100644 --- a/WebKit/android/WebCoreSupport/autofill/AutoFillHostAndroid.cpp +++ b/WebKit/android/WebCoreSupport/autofill/AutoFillHostAndroid.cpp @@ -38,7 +38,7 @@ AutoFillHostAndroid::AutoFillHostAndroid(WebAutoFill* autoFill) void AutoFillHostAndroid::AutoFillSuggestionsReturned(int queryId, const std::vector<string16>& names, const std::vector<string16>& labels, const std::vector<int>& uniqueIds) { if (mAutoFill) - mAutoFill->fillFormFields(queryId, names[0], labels[0], uniqueIds[0]); + mAutoFill->querySuccessful(queryId, names[0], labels[0], uniqueIds[0]); } void AutoFillHostAndroid::AutoFillFormDataFilled(int queryId, const webkit_glue::FormData& form) diff --git a/WebKit/android/WebCoreSupport/autofill/WebAutoFill.cpp b/WebKit/android/WebCoreSupport/autofill/WebAutoFill.cpp index 2046f46..278889c 100644 --- a/WebKit/android/WebCoreSupport/autofill/WebAutoFill.cpp +++ b/WebKit/android/WebCoreSupport/autofill/WebAutoFill.cpp @@ -42,10 +42,13 @@ #include "WebUrlLoaderClient.h" #include "WebViewCore.h" +#define FORM_NOT_AUTOFILLABLE -1 + namespace android { WebAutoFill::WebAutoFill() + : mWebViewCore(0) { mFormManager = new FormManager(); mQueryId = 1; @@ -77,6 +80,7 @@ WebAutoFill::WebAutoFill() WebAutoFill::~WebAutoFill() { mQueryMap.clear(); + mSuggestionMap.clear(); } void WebAutoFill::searchDocument(WebCore::Document* document) @@ -90,6 +94,7 @@ void WebAutoFill::searchDocument(WebCore::Document* document) return; mQueryMap.clear(); + mSuggestionMap.clear(); mQueryId = 1; mAutoFillManager->Reset(); mFormManager->Reset(); @@ -110,14 +115,38 @@ void WebAutoFill::formFieldFocused(WebCore::HTMLFormControlElement* formFieldEle mFormManager->FindFormWithFormControlElement(*formFieldElement, FormManager::REQUIRE_AUTOCOMPLETE, form); mQueryMap[mQueryId] = form; - mAutoFillManager->GetAutoFillSuggestions(mQueryId, false, formField); + bool suggestions = mAutoFillManager->GetAutoFillSuggestions(mQueryId, false, formField); mQueryId++; + if (!suggestions) { + ASSERT(mWebViewCore); + // Tell Java no autofill suggestions for this form. + mWebViewCore->setWebTextViewAutoFillable(FORM_NOT_AUTOFILLABLE); + return; + } +} + +void WebAutoFill::querySuccessful(int queryId, const string16& value, const string16& label, int uniqueId) +{ + // Store the results for the query and inform java that autofill suggestions for this form are available. + // Pass java the queryId so that it can pass it back if the user decides to use autofill. + AutoFillSuggestion suggestion; + suggestion.value = value; + suggestion.label = label; + suggestion.uniqueId = uniqueId; + mSuggestionMap[queryId] = AutoFillSuggestion(); + + ASSERT(mWebViewCore); + mWebViewCore->setWebTextViewAutoFillable(queryId); } -void WebAutoFill::fillFormFields(int queryId, const string16& value, const string16& label, int uniqueId) +void WebAutoFill::fillFormFields(int queryId) { webkit_glue::FormData* form = mQueryMap[queryId]; - mAutoFillManager->FillAutoFillFormData(queryId, *form, value, label, uniqueId); + AutoFillQuerySuggestionMap::iterator iter = mSuggestionMap.find(queryId); + ASSERT(iter != mSuggestionMap.end()); + AutoFillSuggestion* suggestion = &iter->second; + mAutoFillManager->FillAutoFillFormData(queryId, *form, suggestion->value, suggestion->label, suggestion->uniqueId); + mSuggestionMap.erase(iter); } void WebAutoFill::fillFormInPage(int queryId, const webkit_glue::FormData& form) diff --git a/WebKit/android/WebCoreSupport/autofill/WebAutoFill.h b/WebKit/android/WebCoreSupport/autofill/WebAutoFill.h index 335f9b2..986e1a2 100644 --- a/WebKit/android/WebCoreSupport/autofill/WebAutoFill.h +++ b/WebKit/android/WebCoreSupport/autofill/WebAutoFill.h @@ -57,8 +57,10 @@ public: void searchDocument(WebCore::Document*); void formFieldFocused(WebCore::HTMLFormControlElement*); - void fillFormFields(int queryId, const string16& value, const string16& label, int uniqueId); + void fillFormFields(int queryId); + void querySuccessful(int queryId, const string16& value, const string16& label, int uniqueId); void fillFormInPage(int queryId, const webkit_glue::FormData& form); + void setWebViewCore(WebViewCore* webViewCore) { mWebViewCore = webViewCore; } private: OwnPtr<FormManager> mFormManager; @@ -69,9 +71,19 @@ private: typedef std::vector<webkit_glue::FormData, std::allocator<webkit_glue::FormData> > FormList; FormList mForms; - typedef std::map<int, webkit_glue::FormData*> AutoFillQueryMap; - AutoFillQueryMap mQueryMap; + typedef std::map<int, webkit_glue::FormData*> AutoFillQueryFormDataMap; + AutoFillQueryFormDataMap mQueryMap; + + typedef struct { + string16 value; + string16 label; + int uniqueId; + } AutoFillSuggestion; + typedef std::map<int, AutoFillSuggestion> AutoFillQuerySuggestionMap; + AutoFillQuerySuggestionMap mSuggestionMap; int mQueryId; + + WebViewCore* mWebViewCore; }; } diff --git a/WebKit/android/jni/WebCoreFrameBridge.cpp b/WebKit/android/jni/WebCoreFrameBridge.cpp index 1d5eacb..d6dd4bc 100644 --- a/WebKit/android/jni/WebCoreFrameBridge.cpp +++ b/WebKit/android/jni/WebCoreFrameBridge.cpp @@ -977,6 +977,10 @@ static void CreateFrame(JNIEnv* env, jobject obj, jobject javaview, jobject jAss // Create a WebViewCore to access the Java WebViewCore associated with this page WebViewCore* webViewCore = new WebViewCore(env, javaview, frame); +#if ENABLE(WEB_AUTOFILL) + editorC->getAutoFill()->setWebViewCore(webViewCore); +#endif + // Create a FrameView RefPtr<WebCore::FrameView> frameView = WebCore::FrameView::create(frame); // Create a WebFrameView diff --git a/WebKit/android/jni/WebViewCore.cpp b/WebKit/android/jni/WebViewCore.cpp index 1ae92d1..b9af546 100644 --- a/WebKit/android/jni/WebViewCore.cpp +++ b/WebKit/android/jni/WebViewCore.cpp @@ -58,6 +58,7 @@ #include "HTMLAnchorElement.h" #include "HTMLAreaElement.h" #include "HTMLElement.h" +#include "HTMLFormControlElement.h" #include "HTMLImageElement.h" #include "HTMLInputElement.h" #include "HTMLLabelElement.h" @@ -108,6 +109,7 @@ #include "WebFrameView.h" #include "WindowsKeyboardCodes.h" #include "android_graphics.h" +#include "autofill/WebAutoFill.h" #include "markup.h" #include <JNIHelp.h> @@ -262,6 +264,7 @@ struct WebViewCore::JavaGlue { jmethodID m_centerFitRect; jmethodID m_setScrollbarModes; jmethodID m_setInstallableWebApp; + jmethodID m_setWebTextViewAutoFillable; AutoJObject object(JNIEnv* env) { return getRealObject(env, m_obj); } @@ -352,6 +355,7 @@ WebViewCore::WebViewCore(JNIEnv* env, jobject javaWebViewCore, WebCore::Frame* m m_javaGlue->m_centerFitRect = GetJMethod(env, clazz, "centerFitRect", "(IIII)V"); m_javaGlue->m_setScrollbarModes = GetJMethod(env, clazz, "setScrollbarModes", "(II)V"); m_javaGlue->m_setInstallableWebApp = GetJMethod(env, clazz, "setInstallableWebApp", "()V"); + m_javaGlue->m_setWebTextViewAutoFillable = GetJMethod(env, clazz, "setWebTextViewAutoFillable", "(I)V"); env->SetIntField(javaWebViewCore, gWebViewCoreFields.m_nativeClass, (jint)this); @@ -3214,6 +3218,12 @@ void WebViewCore::notifyWebAppCanBeInstalled() checkException(env); } +void WebViewCore::setWebTextViewAutoFillable(int queryId) +{ + JNIEnv* env = JSC::Bindings::getJNIEnv(); + env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_setWebTextViewAutoFillable, queryId); +} + bool WebViewCore::drawIsPaused() const { JNIEnv* env = JSC::Bindings::getJNIEnv(); @@ -3864,6 +3874,22 @@ static jobject GetTouchHighlightRects(JNIEnv* env, jobject obj, jint x, jint y, return array; } +static void AutoFillForm(JNIEnv* env, jobject obj, jint queryId) +{ +#if ENABLE(WEB_AUTOFILL) + WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj); + if (!viewImpl) + return; + + WebCore::Frame* frame = viewImpl->mainFrame(); + if (frame) { + EditorClientAndroid* editorC = static_cast<EditorClientAndroid*>(frame->page()->editorClient()); + WebAutoFill* autoFill = editorC->getAutoFill(); + autoFill->fillFormFields(queryId); + } +#endif +} + // ---------------------------------------------------------------------------- /* @@ -3965,6 +3991,8 @@ static JNINativeMethod gJavaWebViewCoreMethods[] = { (void*) ValidNodeAndBounds }, { "nativeGetTouchHighlightRects", "(III)Ljava/util/ArrayList;", (void*) GetTouchHighlightRects }, + { "nativeAutoFillForm", "(I)V", + (void*) AutoFillForm }, }; int register_webviewcore(JNIEnv* env) diff --git a/WebKit/android/jni/WebViewCore.h b/WebKit/android/jni/WebViewCore.h index 00054f3..61ddd7d 100644 --- a/WebKit/android/jni/WebViewCore.h +++ b/WebKit/android/jni/WebViewCore.h @@ -489,6 +489,7 @@ namespace android { void splitContent(PictureSet*); void notifyWebAppCanBeInstalled(); + void setWebTextViewAutoFillable(int queryId); DeviceOrientationManager* deviceOrientationManager() { return &m_deviceOrientationManager; } |
