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()




原创粉丝点击