webkitgtk密码保存功能简单实现

本文介绍如何在webkitgtk中实现网页密码保存功能,参考chromium的实现方式。通过在WebKit-r86000的FrameLoaderClientGtk.cpp文件中处理form节点,当打开已保存登录信息的网页时自动填充用户名和密码。
摘要由CSDN通过智能技术生成

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.cpp	1970-01-01 08:00:00.000000000 +0800
+++ WebKit-r86000/Source/WebKit/gtk/FormPassword/formPassword.cpp	2011-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.h	1970-01-01 08:00:00.000000000 +0800
+++ WebKit-r86000/Source/WebKit/gtk/FormPassword/formPassword.h	2011-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_H
diff -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.cpp	1970-01-01 08:00:00.000000000 +0800
+++ WebKit-r86000/Source/WebKit/gtk/FormPassword/formPasswordManager.cpp	2011-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.h	1970-01-01 08:00:00.000000000 +0800
+++ WebKit-r86000/Source/WebKit/gtk/FormPassword/formPasswordManager.h	2011-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.am	2011-04-29 16:28:44.000000000 +0800
+++ WebKit-r86000/Source/WebKit/gtk/GNUmakefile.am	2011-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()




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值