WebKit/chromium/src/WebPasswordFormUtils.cpp
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     1 /* ***** BEGIN LICENSE BLOCK *****
       
     2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
       
     3 *
       
     4 * The contents of this file are subject to the Mozilla Public License Version
       
     5 * 1.1 (the "License"); you may not use this file except in compliance with
       
     6 * the License. You may obtain a copy of the License at
       
     7 * http://www.mozilla.org/MPL/
       
     8 *
       
     9 * Software distributed under the License is distributed on an "AS IS" basis,
       
    10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
       
    11 * for the specific language governing rights and limitations under the
       
    12 * License.
       
    13 *
       
    14 * The Original Code is Mozilla Password Manager.
       
    15 *
       
    16 * The Initial Developer of the Original Code is
       
    17 * Brian Ryner.
       
    18 * Portions created by the Initial Developer are Copyright (C) 2003
       
    19 * the Initial Developer. All Rights Reserved.
       
    20 *
       
    21 * Contributor(s):
       
    22 *  Brian Ryner <bryner@brianryner.com>
       
    23 *
       
    24 * Alternatively, the contents of this file may be used under the terms of
       
    25 * either the GNU General Public License Version 2 or later (the "GPL"), or
       
    26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
       
    27 * in which case the provisions of the GPL or the LGPL are applicable instead
       
    28 * of those above. If you wish to allow use of your version of this file only
       
    29 * under the terms of either the GPL or the LGPL, and not to allow others to
       
    30 * use your version of this file under the terms of the MPL, indicate your
       
    31 * decision by deleting the provisions above and replace them with the notice
       
    32 * and other provisions required by the GPL or the LGPL. If you do not delete
       
    33 * the provisions above, a recipient may use your version of this file under
       
    34 * the terms of any one of the MPL, the GPL or the LGPL.
       
    35 *
       
    36 * ***** END LICENSE BLOCK ***** */
       
    37 
       
    38 // Helper to WebPasswordFormData to do the locating of username/password
       
    39 // fields.
       
    40 // This method based on Firefox2 code in
       
    41 //   toolkit/components/passwordmgr/base/nsPasswordManager.cpp
       
    42 
       
    43 #include "config.h"
       
    44 #include "WebPasswordFormUtils.h"
       
    45 
       
    46 #include "HTMLFormElement.h"
       
    47 #include "HTMLInputElement.h"
       
    48 #include "HTMLNames.h"
       
    49 #include "KURL.h"
       
    50 
       
    51 #include "DOMUtilitiesPrivate.h"
       
    52 
       
    53 using namespace WebCore;
       
    54 
       
    55 namespace WebKit {
       
    56 
       
    57 // Maximum number of password fields we will observe before throwing our
       
    58 // hands in the air and giving up with a given form.
       
    59 static const size_t maxPasswords = 3;
       
    60 
       
    61 void findPasswordFormFields(HTMLFormElement* form, PasswordFormFields* fields)
       
    62 {
       
    63     ASSERT(form);
       
    64     ASSERT(fields);
       
    65 
       
    66     int firstPasswordIndex = 0;
       
    67     // First, find the password fields and activated submit button
       
    68     const Vector<HTMLFormControlElement*>& formElements = form->associatedElements();
       
    69     for (size_t i = 0; i < formElements.size(); i++) {
       
    70         HTMLFormControlElement* formElement = formElements[i];
       
    71         if (formElement->isActivatedSubmit())
       
    72             fields->submit = formElement;
       
    73 
       
    74         if (!formElement->hasLocalName(HTMLNames::inputTag))
       
    75             continue;
       
    76 
       
    77         HTMLInputElement* inputElement = toHTMLInputElement(formElement);
       
    78         if (!inputElement->isEnabledFormControl())
       
    79             continue;
       
    80 
       
    81         if ((fields->passwords.size() < maxPasswords)
       
    82             && (inputElement->inputType() == HTMLInputElement::PASSWORD)
       
    83             && (inputElement->autoComplete())) {
       
    84             if (fields->passwords.isEmpty())
       
    85                 firstPasswordIndex = i;
       
    86             fields->passwords.append(inputElement);
       
    87         }
       
    88     }
       
    89 
       
    90     if (!fields->passwords.isEmpty()) {
       
    91         // Then, search backwards for the username field
       
    92         for (int i = firstPasswordIndex - 1; i >= 0; i--) {
       
    93             HTMLFormControlElement* formElement = formElements[i];
       
    94             if (!formElement->hasLocalName(HTMLNames::inputTag))
       
    95                 continue;
       
    96 
       
    97             HTMLInputElement* inputElement = toHTMLInputElement(formElement);
       
    98             if (!inputElement->isEnabledFormControl())
       
    99                 continue;
       
   100 
       
   101             if ((inputElement->inputType() == HTMLInputElement::TEXT)
       
   102                 && (inputElement->autoComplete())) {
       
   103                 fields->userName = inputElement;
       
   104                 break;
       
   105             }
       
   106         }
       
   107     }
       
   108 }
       
   109 
       
   110 } // namespace WebKit