webkitgtk密码保存功能简单实现
来源:互联网 发布:小仙女的网络用语意思 编辑:程序博客网 时间:2024/06/05 16:31
webkitgtk网页密码保存功能实现(应用WebKit-r86000.tar.bz2, http://builds.nightly.webkit.org/files/trunk/src/WebKit-r86000.tar.bz2)
由于客户需要实现浏览器保存网页“登录密码”的功能, 而这功能在webkit中并没有实现,需要自己来实现这个功能,而chromium中实现了该功能,所以仿照chromium的实现来实现webkitgtk保存密码的功能。
1. 所有的登录密码区域的网页源码都是应用form, 所以在浏览器解析完网页后提取form节点, 该节点提取时机在 WebKit-r86000/Source/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp 文件中,下面函数即为操作函数。 如果有本地保存了用户名和密码,比如保存了“https://accounts.google.com/ServiceLogin”页面中的用户名和密码时, 当打开该页面时则自动填写“所保存的用户名和密码”。
void FrameLoaderClient::dispatchDidFinishDocumentLoad()
{
WebKitWebView* webView = getViewFromFrame(m_frame);
g_signal_emit_by_name(webView, "document-load-finished", m_frame);
FormPassword fps; //added by zhenghe
fps.didFinishDocumentLoad(m_frame);
}
2. 在用户点击提交按键时, 需要保存用户填写在form悾件中的用户名和密码,该时机也在 WebKit-r86000/Source/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp 文件中,
void FrameLoaderClient::dispatchWillSubmitForm(FramePolicyFunction policyFunction, PassRefPtr<FormState>)
{
// FIXME: This is surely too simple
ASSERT(policyFunction);
if (!policyFunction)
return;
(core(m_frame)->loader()->policyChecker()->*policyFunction)(PolicyUse);
FormPassword fpw; //added by zhenghe
fpw.writePasswordFormFieldsToFile();
}
本补丁只是实现了一个非常简单的保存密码的功能。
不善言辞, 好多都描述不出来,望谅解! 请查看附件源码补丁,如果有错误或者不好的地方,请批评指正, 共同进步,thx!
chromium保存密码功能请看: http://www.szkway.cn/webinfo/GoogleChromeruhebaocunmimakouling.html
下面是补丁文件webkit.patch
diff -Nur tmp/WebKit-r86000/Source/WebKit/gtk/FormPassword/formPassword.cpp WebKit-r86000/Source/WebKit/gtk/FormPassword/formPassword.cpp--- tmp/WebKit-r86000/Source/WebKit/gtk/FormPassword/formPassword.cpp1970-01-01 08:00:00.000000000 +0800+++ WebKit-r86000/Source/WebKit/gtk/FormPassword/formPassword.cpp2011-10-13 14:19:50.000000000 +0800@@ -0,0 +1,239 @@+/*+ * formPassword.cpp+ * Copyright (C) Zhenghe Zhang 2011 <zhangzhenghe@xxx.com>+ * + * webkit is free software: you can redistribute it and/or modify it+ * under the terms of the GNU General Public License as published by the+ * Free Software Foundation, either version 3 of the License, or+ * (at your option) any later version.+ * + * webkit is distributed in the hope that it will be useful, but+ * WITHOUT ANY WARRANTY; without even the implied warranty of+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.+ * See the GNU General Public License for more details.+ * + * You should have received a copy of the GNU General Public License along+ * with this program. If not, see <http://www.gnu.org/licenses/>.+ */++#include "config.h"++#include "Frame.h"+#include "Document.h"+#include "HTMLCollection.h"+#include "HTMLElement.h"+#include "HTMLFormElement.h"+#include "HTMLInputElement.h"+#include "HTMLNames.h"+#include "webkitwebframe.h"+#include "webkitwebframeprivate.h"++#include "formPassword.h"+#include "formPasswordManager.h"++using namespace WebCore;++namespace WebKit{++PasswordFormFields FormPassword::m_pwFormFields;+PasswordString FormPassword::m_pwForm;++// Helped method to clear url of unneeded parts.+KURL stripURL(const KURL& url)+{+ KURL strippedURL = url;+ strippedURL.setUser(String());+ strippedURL.setPass(String());+ strippedURL.setQuery(String());+ strippedURL.setFragmentIdentifier(String());+ return strippedURL;+}++bool FormPassword::writePasswordFormFieldsToFile()+{+ bool flag = false;+ FormPasswordManager fpm;++ savePasswordFormFields();+ clearPasswordFormFields();+ + if(fpm.find_form_password_manager_xml(m_pwForm)){+ printf("username_value = %s, password_value = %s, successfully\n", + m_pwForm.username_value.ascii().data(), m_pwForm.password_value.ascii().data());+ flag = fpm.alter_form_password_manager_xml(m_pwForm);+ }else{+ printf("username_value = %s, password_value = %s, successfully\n", + m_pwForm.username_value.ascii().data(), m_pwForm.password_value.ascii().data());+ if(!fpm.form_password_manager_xml_is_exist()){+ flag = fpm.create_form_password_manager_xml(m_pwForm);+ }else{+ flag = fpm.add_form_password_manager_xml(m_pwForm);+ }+ }++ return flag;+}++bool FormPassword::readPasswordFormFieldsFromFile()+{+ bool flag = false;+ FormPasswordManager fpm;++ savePasswordFormFields();++ if(fpm.find_form_password_manager_xml(m_pwForm)){+ printf("username_value = %s, password_value = %s, successfully\n", + m_pwForm.username_value.ascii().data(), m_pwForm.password_value.ascii().data());+ flag = true;+ }else+ printf("failed\n");++ return flag;+}++void FormPassword::findPasswordFormFields(HTMLFormElement *form)+{+ ASSERT(form);++ bool flag = false;+ size_t firstPasswordIndex = -1;++ // First, find the password fields and activated submit button+ const Vector<FormAssociatedElement*>& formElements = form->associatedElements();+ for (size_t i = 0; i < formElements.size(); i++) {+ if (!formElements[i]->isFormControlElement())+ continue;++ HTMLFormControlElement* formElement = static_cast<HTMLFormControlElement*>(formElements[i]);+ if (formElement->isActivatedSubmit())+ m_pwFormFields.submit = formElement;++ if (!formElement->hasLocalName(HTMLNames::inputTag))+ continue;++ HTMLInputElement* inputElement = NULL;+ if (formElement->isHTMLElement()+ && static_cast<HTMLElement*>(formElement)->hasTagName(HTMLNames::inputTag)) {+ inputElement = static_cast<HTMLInputElement*>(formElement);+ }++ if(!inputElement)+ continue;++ if (!inputElement->isEnabledFormControl())+ continue;++ if (!flag && inputElement->isPasswordField() && inputElement->autoComplete()) {+ m_pwFormFields.password = inputElement;+ firstPasswordIndex = i;+ flag = true;+ }+ }+ if (m_pwFormFields.password) {+ // Then, search backwards for the username field+ for (int i = firstPasswordIndex - 1; i >= 0; i--) {+ if (!formElements[i]->isFormControlElement())+ continue;+ HTMLFormControlElement* formElement = static_cast<HTMLFormControlElement*>(formElements[i]);+ if (!formElement->hasLocalName(HTMLNames::inputTag))+ continue;++ HTMLInputElement* inputElement = NULL;+ if (formElement->isHTMLElement()+ && static_cast<HTMLElement*>(formElement)->hasTagName(HTMLNames::inputTag)) {+ inputElement = static_cast<HTMLInputElement*>(formElement);+ }++ if(!inputElement)+ continue;++ if (!inputElement->isEnabledFormControl())+ continue;++ // Various input types such as text, url, email can be a username field.+ if ((inputElement->isTextField() + && !inputElement->isPasswordField()) && (inputElement->autoComplete())) {+ m_pwFormFields.userName = inputElement;+ break;+ }+ }+ }+}++void FormPassword::findPasswordDocumentFields(HTMLFormElement *form)+{+ ASSERT(form);+ findPasswordFormFields(form);++ Frame* frame = form->document()->frame();+ if (!frame)+ return;++ // Get the document URL+ KURL fullOrigin(ParsedURLString, form->document()->documentURI());+ m_pwFormFields.origin = stripURL(fullOrigin);++ // Calculate the canonical action URL+ String action = form->action();+ if (action.isNull())+ action = ""; // missing 'action' attribute implies current URL++ KURL fullAction = frame->loader()->completeURL(action);+ if (!fullAction.isValid())+ return;++ m_pwFormFields.action = stripURL(fullAction);+}++void FormPassword::didFinishDocumentLoad(WebKitWebFrame* frame){+ Frame* core_frame = core(frame);+ Document *core_document = core_frame->document();+ PassRefPtr<HTMLCollection> forms = core_document->forms();+ size_t sourceLength = forms->length();++ for (size_t i = 0; i < sourceLength; ++i) {+ Node *node = forms->item(i);+ if (node && node->isHTMLElement())+ findPasswordDocumentFields(static_cast<HTMLFormElement*>(node));+ }++ if(readPasswordFormFieldsFromFile())+ fillPasswordFormFields();+}++void FormPassword::savePasswordFormFields()+{+ if(m_pwFormFields.userName){+ m_pwForm.username_name = m_pwFormFields.userName->name();+ m_pwForm.username_value = m_pwFormFields.userName->value();+ }++ if(m_pwFormFields.password){+ m_pwForm.password_name = m_pwFormFields.password->name();+ m_pwForm.password_value = m_pwFormFields.password->value();+ }++ m_pwForm.action = String(m_pwFormFields.action.string());+ m_pwForm.origin = String(m_pwFormFields.origin.string());+}++void FormPassword::fillPasswordFormFields()+{+ if(m_pwFormFields.userName){+ m_pwFormFields.userName->setValue(m_pwForm.username_value);+ }++ if(m_pwFormFields.password){+ m_pwFormFields.password->setValue(m_pwForm.password_value);+ }+}++void FormPassword::clearPasswordFormFields()+{+ m_pwFormFields.userName = NULL;+ m_pwFormFields.password = NULL;+ m_pwFormFields.submit = NULL;+}++}//namespace WebKit+diff -Nur tmp/WebKit-r86000/Source/WebKit/gtk/FormPassword/formPassword.h WebKit-r86000/Source/WebKit/gtk/FormPassword/formPassword.h--- tmp/WebKit-r86000/Source/WebKit/gtk/FormPassword/formPassword.h1970-01-01 08:00:00.000000000 +0800+++ WebKit-r86000/Source/WebKit/gtk/FormPassword/formPassword.h2011-10-13 14:40:04.000000000 +0800@@ -0,0 +1,71 @@+/*+ * formPassword.h+ * Copyright (C) Zhenghe Zhang 2011 <zhangzhenghe@xxx.com>+ * + * webkit is free software: you can redistribute it and/or modify it+ * under the terms of the GNU General Public License as published by the+ * Free Software Foundation, either version 3 of the License, or+ * (at your option) any later version.+ * + * webkit is distributed in the hope that it will be useful, but+ * WITHOUT ANY WARRANTY; without even the implied warranty of+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.+ * See the GNU General Public License for more details.+ * + * You should have received a copy of the GNU General Public License along+ * with this program. If not, see <http://www.gnu.org/licenses/>.+ */+++#ifndef FORM_PASSWORD_H+#define FORM_PASSWORD_H++namespace WebCore {+class HTMLInputElement;+class HTMLFormControlElement;+class HTMLFormElement;+class KURL;+}++typedef struct _WebKitWebFrame WebKitWebFrame;++namespace WebKit{++struct PasswordString;++struct PasswordFormFields{+ WebCore::HTMLInputElement* userName;+ WebCore::HTMLInputElement* password;+ WebCore::HTMLFormControlElement* submit;++ WebCore::KURL origin;+ WebCore::KURL action;++ PasswordFormFields() : userName(0), password(0), submit(0) { } +};++class FormPassword{+ public:+ FormPassword() {}+ ~FormPassword() {}+++ bool writePasswordFormFieldsToFile();+ bool readPasswordFormFieldsFromFile(); ++ void findPasswordFormFields(WebCore::HTMLFormElement* form);+ void findPasswordDocumentFields(WebCore::HTMLFormElement *form);+ void didFinishDocumentLoad(WebKitWebFrame* frame);++ void fillPasswordFormFields();+ void savePasswordFormFields();+ void clearPasswordFormFields();++ private:+ static PasswordFormFields m_pwFormFields;+ static PasswordString m_pwForm;+};++}//namespace WebKit++#endif //FORM_PASSWORD_Hdiff -Nur tmp/WebKit-r86000/Source/WebKit/gtk/FormPassword/formPasswordManager.cpp WebKit-r86000/Source/WebKit/gtk/FormPassword/formPasswordManager.cpp--- tmp/WebKit-r86000/Source/WebKit/gtk/FormPassword/formPasswordManager.cpp1970-01-01 08:00:00.000000000 +0800+++ WebKit-r86000/Source/WebKit/gtk/FormPassword/formPasswordManager.cpp2011-10-13 14:19:05.000000000 +0800@@ -0,0 +1,326 @@+/*+ * formPasswordManager.cpp+ * Copyright (C) Zhenghe Zhang 2011 <zhangzhenghe@xxx.com>+ * + * webkit is free software: you can redistribute it and/or modify it+ * under the terms of the GNU General Public License as published by the+ * Free Software Foundation, either version 3 of the License, or+ * (at your option) any later version.+ * + * webkit is distributed in the hope that it will be useful, but+ * WITHOUT ANY WARRANTY; without even the implied warranty of+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.+ * See the GNU General Public License for more details.+ * + * You should have received a copy of the GNU General Public License along+ * with this program. If not, see <http://www.gnu.org/licenses/>.+ */+ +#include "config.h"++#include "formPasswordManager.h"++#include <stdio.h>+++namespace WebKit{++bool FormPasswordManager::m_first_flag = false;+const char* FormPasswordManager::m_xml_file = "/tmp/password.txt"; ++bool FormPasswordManager::create_form_password_manager_xml(PasswordString &pwForm)+{+ xmlDocPtr doc;+ xmlNodePtr node, root_node;++ /*Creates a new document, a node and set it as a root node */+ doc = xmlNewDoc((const xmlChar*)"1.0");+ if(!doc)+ return false;++ root_node = xmlNewNode(NULL, (const xmlChar*)"passwords");+ xmlDocSetRootElement(doc, root_node);++ /*creates a new node, which is "attached" as child node of root_node node. */+ node = xmlNewChild(root_node, NULL, + (const xmlChar*)"passwordItem", NULL);++ xmlNewChild(node, NULL, (const xmlChar*)"origin",+ (const xmlChar*)pwForm.origin.ascii().data());+ xmlNewChild(node, NULL, (const xmlChar*)"action",+ (const xmlChar*)pwForm.action.ascii().data());++ xmlNewChild(node, NULL, (const xmlChar*)"usernameName",+ (const xmlChar*)pwForm.username_name.ascii().data());+ xmlNewChild(node, NULL, (const xmlChar*)"usernameValue",+ (const xmlChar*)pwForm.username_value.ascii().data());++ xmlNewChild(node, NULL, (const xmlChar*)"passwordName",+ (const xmlChar*)pwForm.password_name.ascii().data());+ xmlNewChild(node, NULL, (const xmlChar*)"passwordValue",+ (const xmlChar*)pwForm.password_value.ascii().data());++ xmlSaveFormatFileEnc(m_xml_file, doc, "UTF-8", 1); +++ /*free the document */+ xmlFreeDoc(doc);+ xmlCleanupParser();+ xmlMemoryDump();+ + return true;+}++bool FormPasswordManager::find_form_password_manager_xml(PasswordString &pwForm)+{+ xmlDocPtr doc; + xmlNodePtr cur;+ bool f_flag = false;++ doc = xmlParseFile(m_xml_file);+ if(!doc)+ return false;++ cur = xmlDocGetRootElement(doc);+ if (!cur) {+ xmlFreeDoc(doc);+ return false;+ }++ if (xmlStrcmp(cur->name, (const xmlChar*)"passwords")){+ xmlFreeDoc(doc);+ return false;+ }++ cur = cur->xmlChildrenNode;+ while (cur != NULL) {+ if ((!xmlStrcmp(cur->name, (const xmlChar*)"passwordItem"))){+ f_flag = parse_form_password_manager_xml(XML_FLAG_FIND, cur, pwForm);+ if(f_flag)+ break;+ }+ cur = cur->next;+ }++ xmlFreeDoc(doc);+ return f_flag; +}++bool FormPasswordManager::add_form_password_manager_xml(PasswordString &pwForm)+{+ xmlDocPtr doc;+ xmlNodePtr node, add_node;+ xmlKeepBlanksDefault(0);+ + doc = xmlParseFile(m_xml_file);+ if(!doc)+ return false; + + node = xmlDocGetRootElement (doc);+ if(!node){+ xmlFreeDoc (doc);+ return false; + }+ + add_node = xmlNewNode(NULL, (const xmlChar*)"passwordItem");+ xmlAddChild(node, add_node);+ + xmlNewChild(add_node, NULL, (const xmlChar*)"origin",+ (const xmlChar*)pwForm.origin.ascii().data());+ xmlNewChild (add_node, NULL, (const xmlChar*)"action",+ (const xmlChar*)pwForm.action.ascii().data());++ xmlNewChild (add_node, NULL, (const xmlChar*)"usernameName",+ (const xmlChar*)pwForm.username_name.ascii().data());+ xmlNewChild (add_node, NULL, (const xmlChar*)"usernameValue",+ (const xmlChar*)pwForm.username_value.ascii().data());++ xmlNewChild (add_node, NULL, (const xmlChar*)"passwordName",+ (const xmlChar*)pwForm.password_name.ascii().data());+ xmlNewChild (add_node, NULL, (const xmlChar*)"passwordValue",+ (const xmlChar*)pwForm.password_value.ascii().data()); ++ xmlSaveFormatFileEnc(m_xml_file, doc, (const char *)doc->encoding, 1); ++ /* free the document */+ xmlFreeDoc(doc);+ xmlCleanupParser();+ xmlMemoryDump(); + + return true;+}++bool FormPasswordManager::delete_form_password_manager_xml(PasswordString &pwForm)+{+ xmlDocPtr doc;+ xmlNodePtr node, tmpNode;+ xmlKeepBlanksDefault (0);++ doc = xmlParseFile(m_xml_file);+ if (!doc)+ return false;++ node = xmlDocGetRootElement(doc);+ if(!node){+ xmlFreeDoc(doc);+ return false;+ }+ + node = node->xmlChildrenNode;+ while (node != NULL){+ tmpNode = node->next;+ if (!xmlStrcmp(node->name, (const xmlChar*)"passwordItem"))+ parse_form_password_manager_xml(XML_FLAG_DELETE, node, pwForm);+ + node = tmpNode;+ }+ + xmlSaveFormatFileEnc(m_xml_file, doc, (const char*)doc->encoding, 1);++ /* free the document */+ xmlFreeDoc(doc);+ xmlCleanupParser();+ xmlMemoryDump();+ + return true;+}++bool FormPasswordManager::alter_form_password_manager_xml(PasswordString &pwForm)+{+ xmlDocPtr doc;+ xmlNodePtr node, tmpNode;+ + xmlKeepBlanksDefault(0);+ + doc = xmlParseFile(m_xml_file);+ if(!doc)+ return false;+ + node = xmlDocGetRootElement(doc);+ if(!node){+ xmlFreeDoc(doc);+ return false;+ }+ + node = node->xmlChildrenNode;+ while(node != NULL)+ {+ tmpNode = node->next;+ if(!xmlStrcmp(node->name, (const xmlChar*)"passwordItem"))+ parse_form_password_manager_xml(XML_FLAG_ALTER, node, pwForm);+ + node = tmpNode;+ }+ + xmlSaveFormatFileEnc(m_xml_file, doc, (const gchar*)doc->encoding, 1);++ /* free the document */+ xmlFreeDoc(doc);+ xmlCleanupParser ();+ xmlMemoryDump ();++ return 0;+}++bool FormPasswordManager::form_password_manager_xml_is_exist()+{+ if(m_first_flag)+ return true;+ else{+ if(access(m_xml_file, 0) == 0)+ m_first_flag = true;+ }++ return m_first_flag;+}++bool FormPasswordManager::parse_form_password_manager_xml(XML_FLAG flag, xmlNodePtr cur, PasswordString &pwForm)+{+ int pwv_cnt = 0;+ bool p_flag = false;+ Vector<xmlNodePtr> pwvNode;++ xmlNodePtr tmpNode;+ xmlNodePtr alterNode;+ xmlChar *value = NULL;++ alterNode = cur->xmlChildrenNode;+ while(alterNode != NULL){+ tmpNode = alterNode->next;+ if(!xmlStrcmp(alterNode->name, (const xmlChar*)"origin")){+ value = xmlNodeGetContent(alterNode);+ if(!xmlStrcmp(value, (const xmlChar*)pwForm.origin.ascii().data())){+ pwvNode.append(alterNode);+ ++pwv_cnt;+ } + }else if(!xmlStrcmp(alterNode->name, (const xmlChar*)"action")){+ value = xmlNodeGetContent(alterNode);+ if(!xmlStrcmp(value, (const xmlChar*)pwForm.action.ascii().data())){+ pwvNode.append(alterNode);+ ++pwv_cnt;+ } + }else if(!xmlStrcmp(alterNode->name, (const xmlChar*)"usernameName")){+ value = xmlNodeGetContent(alterNode);+ if(!xmlStrcmp(value, (const xmlChar*)pwForm.username_name.ascii().data())){+ pwvNode.append(alterNode);+ ++pwv_cnt;+ } + }else if(!xmlStrcmp(alterNode->name, (const xmlChar*)"usernameValue")){+ pwvNode.append(alterNode); + }else if(!xmlStrcmp(alterNode->name, (const xmlChar*)"passwordName")){+ value = xmlNodeGetContent(alterNode);+ if(!xmlStrcmp(value, (const xmlChar*)pwForm.password_name.ascii().data())){+ pwvNode.append(alterNode);+ ++pwv_cnt;+ } + }else if(!xmlStrcmp(alterNode->name, (const xmlChar*)"passwordValue")){+ pwvNode.append(alterNode);+ }+ alterNode = tmpNode;+ }++ if(pwv_cnt == 4){+ for(int i = 0; i < (int)pwvNode.size(); ++i){+ if(XML_FLAG_ALTER == flag){+ if(!xmlStrcmp(pwvNode[i]->name, (const xmlChar*)"usernameValue")){+ xmlNodeSetContent(pwvNode[i], (const xmlChar*)pwForm.username_value.ascii().data()); + }else if(!xmlStrcmp(pwvNode[i]->name, (const xmlChar*)"passwordValue")){+ xmlNodeSetContent(pwvNode[i], (const xmlChar*)pwForm.password_value.ascii().data()); + }++ p_flag = true;+ }else if(XML_FLAG_FIND == flag){+ if(!xmlStrcmp(pwvNode[i]->name, (const xmlChar*)"usernameValue")){+ p_flag = true;+ value = xmlNodeGetContent(pwvNode[i]);+ pwForm.username_value = (const char*)value;+ xmlFree(value);+ }else if(!xmlStrcmp(pwvNode[i]->name, (const xmlChar*)"passwordValue")){+ value = xmlNodeGetContent(pwvNode[i]);+ pwForm.password_value = (const char*)value;+ xmlFree(value); + } + }else if(XML_FLAG_DELETE == flag){+ xmlUnlinkNode(pwvNode[i]);+ xmlFreeNode(pwvNode[i]);+ } + }++ if(XML_FLAG_DELETE == flag){ + xmlUnlinkNode(cur);+ xmlFreeNode(cur);+ p_flag = true;+ }+ }++ return p_flag;+}++} //Webkit+ diff -Nur tmp/WebKit-r86000/Source/WebKit/gtk/FormPassword/formPasswordManager.h WebKit-r86000/Source/WebKit/gtk/FormPassword/formPasswordManager.h--- tmp/WebKit-r86000/Source/WebKit/gtk/FormPassword/formPasswordManager.h1970-01-01 08:00:00.000000000 +0800+++ WebKit-r86000/Source/WebKit/gtk/FormPassword/formPasswordManager.h2011-10-13 14:04:49.000000000 +0800@@ -0,0 +1,78 @@+/*+ * formPasswordManager.h+ * Copyright (C) Zhenghe Zhang 2011 <zhangzhenghe@xx.com>+ * + * webkit is free software: you can redistribute it and/or modify it+ * under the terms of the GNU General Public License as published by the+ * Free Software Foundation, either version 3 of the License, or+ * (at your option) any later version.+ * + * webkit is distributed in the hope that it will be useful, but+ * WITHOUT ANY WARRANTY; without even the implied warranty of+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.+ * See the GNU General Public License for more details.+ * + * You should have received a copy of the GNU General Public License along+ * with this program. If not, see <http://www.gnu.org/licenses/>.+ */++#ifndef PASSWORD_MANAGER_H+#define PASSWORD_MANAGER_H++#include <wtf/Vector.h>+#include <wtf/text/CString.h>+#include <wtf/text/StringBuffer.h>+#include <wtf/text/WTFString.h>++#include <libxml/xpath.h>+#include <libxml/parser.h>+++namespace WebKit+{++class FormPassword;++struct PasswordString{+ String username_name;+ String username_value;+ String password_name;+ String password_value;++ String origin;+ String action;+};++enum XML_FLAG{+ XML_FLAG_FIND, + XML_FLAG_DELETE, + XML_FLAG_ALTER+};++class FormPasswordManager+{+ public:+ FormPasswordManager() {}+ ~FormPasswordManager() {}++ bool create_form_password_manager_xml(PasswordString &pwForm);+ bool find_form_password_manager_xml(PasswordString &pwForm);+ bool add_form_password_manager_xml(PasswordString &pwForm);+ bool delete_form_password_manager_xml(PasswordString &pwForm);+ bool alter_form_password_manager_xml(PasswordString &pwForm);++ bool form_password_manager_xml_is_exist();++ friend class FormPassword;++ private: + bool parse_form_password_manager_xml(XML_FLAG flag, xmlNodePtr cur, PasswordString &pwForm);+ + static bool m_first_flag;+ static const char *m_xml_file; +};++} //WebKit++#endif //PASSWORD_MANAGER_H+diff -Nur tmp/WebKit-r86000/Source/WebKit/gtk/GNUmakefile.am WebKit-r86000/Source/WebKit/gtk/GNUmakefile.am--- tmp/WebKit-r86000/Source/WebKit/gtk/GNUmakefile.am2011-04-29 16:28:44.000000000 +0800+++ WebKit-r86000/Source/WebKit/gtk/GNUmakefile.am2011-10-13 14:17:10.000000000 +0800@@ -48,6 +48,7 @@ -I$(WebCore)/bindings/gobject \ -I$(WebKit) \ -I$(WebKit)/WebCoreSupport \+ -I$(WebKit)/FormPassword \ -I$(WebKit)/webkit \ -I$(GENSOURCES_WEBKIT) \ -ISource/WebKit/gtk/webkit \@@ -242,7 +243,11 @@ Source/WebKit/gtk/webkit/webkitwebview.cpp \ Source/WebKit/gtk/webkit/webkitwebviewprivate.h \ Source/WebKit/gtk/webkit/webkitwebwindowfeatures.cpp \-Source/WebKit/gtk/webkit/webkitwebwindowfeaturesprivate.h+Source/WebKit/gtk/webkit/webkitwebwindowfeaturesprivate.h \+ Source/WebKit/gtk/FormPassword/formPasswordManager.cpp \+ Source/WebKit/gtk/FormPassword/formPasswordManager.h \+ Source/WebKit/gtk/FormPassword/formPassword.cpp \+ Source/WebKit/gtk/FormPassword/formPassword.h pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = \diff -Nur tmp/WebKit-r86000/Source/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp WebKit-r86000/Source/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp--- tmp/WebKit-r86000/Source/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp 2011-04-29 16:28:44.000000000 +0800+++ WebKit-r86000/Source/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp 2011-10-13 14:17:10.000000000 +0800@@ -85,6 +85,7 @@ #include "webkitwebsettingsprivate.h" #include "webkitwebview.h" #include "webkitwebviewprivate.h"+#include "formPassword.h" //added by zhenghe #include <JavaScriptCore/APICast.h> #include <gio/gio.h> #include <glib.h>@@ -311,6 +312,9 @@ if (!policyFunction) return; (core(m_frame)->loader()->policyChecker()->*policyFunction)(PolicyUse);++ FormPassword fpw; //added by zhenghe+ fpw.writePasswordFormFieldsToFile(); } void FrameLoaderClient::committedLoad(WebCore::DocumentLoader* loader, const char* data, int length)@@ -1009,8 +1013,11 @@ void FrameLoaderClient::dispatchDidFinishDocumentLoad() {- WebKitWebView* webView = getViewFromFrame(m_frame);+ WebKitWebView* webView = getViewFromFrame(m_frame); //marked by zhenghe, form password g_signal_emit_by_name(webView, "document-load-finished", m_frame);++ FormPassword fps; //added by zhenghe+ fps.didFinishDocumentLoad(m_frame); } void FrameLoaderClient::dispatchDidFirstLayout()
- webkitgtk密码保存功能简单实现
- webkitgtk密码保存功能简单实现
- webkitgtk密码保存功能简单实现
- webkitgtk简单示例
- 记住密码实现登陆功能,简单,易懂。
- ios实现用户登录的保存密码功能
- ios实现用户登录的保存密码功能
- ios实现用户登录的保存密码功能
- ios实现用户登录的保存密码功能
- javascript客户端保存cookie实现记住密码功能
- 用SharePreference实现简单的保存账号密码
- 在IOS中使用KeychainItemWrapper保存用户名和密码实现记住密码功能
- 在IOS中使用KeychainItemWrapper保存用户名和密码实现记住密码功能
- 在IOS中使用KeychainItemWrapper保存用户名和密码实现记住密码功能
- 在IOS中使用KeychainItemWrapper保存用户名和密码实现记住密码功能
- 在IOS中使用KeychainItemWrapper保存用户名和密码实现记住密码功能
- 在IOS中使用KeychainItemWrapper保存用户名和密码实现记住密码功能
- 在IOS中使用KeychainItemWrapper保存用户名和密码实现记住密码功能
- C++ 优先级
- DudaMobile推出自己的移动版
- 广播的注册与注销
- use wizards framework
- how to start a new goal
- webkitgtk密码保存功能简单实现
- quartz 基本概念
- try speaking English
- linux+audio(OSS)驱动的读写buff分析(jz4760B)
- C语言字节对齐详解
- DotNetBar office2007效果
- mysql常用命令
- 关于mount nfs时-o nolock的问题
- how to make a task achieved