summaryrefslogtreecommitdiffstats
path: root/WebKit
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2010-09-10 21:21:28 +0100
committerSteve Block <steveblock@google.com>2010-09-23 17:07:42 +0100
commitc95d7f499ee3250e2d4a51f7e8f04bb6ebfc6add (patch)
treec0a08b300482f0cef7e37a0305bcef1898f8ace3 /WebKit
parent45ca37e14f3f68f52a77e0d06514716809ed89ab (diff)
downloadexternal_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
Diffstat (limited to 'WebKit')
-rw-r--r--WebKit/android/WebCoreSupport/autofill/AutoFillHostAndroid.cpp2
-rw-r--r--WebKit/android/WebCoreSupport/autofill/WebAutoFill.cpp35
-rw-r--r--WebKit/android/WebCoreSupport/autofill/WebAutoFill.h18
-rw-r--r--WebKit/android/jni/WebCoreFrameBridge.cpp4
-rw-r--r--WebKit/android/jni/WebViewCore.cpp28
-rw-r--r--WebKit/android/jni/WebViewCore.h1
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; }