Torne (Richard Coles) | 5c87bf8 | 2012-11-14 11:46:17 +0000 | [diff] [blame] | 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 | |
Torne (Richard Coles) | 5c87bf8 | 2012-11-14 11:46:17 +0000 | [diff] [blame] | 46 | #include "HTMLNames.h" |
Torne (Richard Coles) | 53e740f | 2013-05-09 18:38:43 +0100 | [diff] [blame] | 47 | #include "core/html/HTMLFormElement.h" |
| 48 | #include "core/html/HTMLInputElement.h" |
Torne (Richard Coles) | 5c87bf8 | 2012-11-14 11:46:17 +0000 | [diff] [blame] | 49 | |
| 50 | using namespace WebCore; |
| 51 | |
Torne (Richard Coles) | 51b2906 | 2013-11-28 11:56:03 +0000 | [diff] [blame] | 52 | namespace blink { |
Torne (Richard Coles) | 5c87bf8 | 2012-11-14 11:46:17 +0000 | [diff] [blame] | 53 | |
| 54 | // Maximum number of password fields we will observe before throwing our |
| 55 | // hands in the air and giving up with a given form. |
| 56 | static const size_t maxPasswords = 3; |
| 57 | |
| 58 | void findPasswordFormFields(HTMLFormElement* form, PasswordFormFields* fields) |
| 59 | { |
| 60 | ASSERT(form); |
| 61 | ASSERT(fields); |
| 62 | |
Torne (Richard Coles) | 926b001 | 2013-03-28 15:32:48 +0000 | [diff] [blame] | 63 | HTMLInputElement* latestInputElement = 0; |
Torne (Richard Coles) | 5c87bf8 | 2012-11-14 11:46:17 +0000 | [diff] [blame] | 64 | const Vector<FormAssociatedElement*>& formElements = form->associatedElements(); |
| 65 | for (size_t i = 0; i < formElements.size(); i++) { |
| 66 | if (!formElements[i]->isFormControlElement()) |
| 67 | continue; |
Ben Murdoch | 591b958 | 2013-07-10 11:41:44 +0100 | [diff] [blame] | 68 | HTMLFormControlElement* control = toHTMLFormControlElement(formElements[i]); |
| 69 | if (control->isActivatedSubmit()) |
| 70 | fields->submit = control; |
Torne (Richard Coles) | 5c87bf8 | 2012-11-14 11:46:17 +0000 | [diff] [blame] | 71 | |
Torne (Richard Coles) | d5428f3 | 2014-03-18 10:21:16 +0000 | [diff] [blame] | 72 | if (!isHTMLInputElement(*control)) |
Torne (Richard Coles) | 5c87bf8 | 2012-11-14 11:46:17 +0000 | [diff] [blame] | 73 | continue; |
| 74 | |
Torne (Richard Coles) | d5428f3 | 2014-03-18 10:21:16 +0000 | [diff] [blame] | 75 | HTMLInputElement& inputElement = toHTMLInputElement(*control); |
| 76 | if (inputElement.isDisabledFormControl()) |
Torne (Richard Coles) | 5c87bf8 | 2012-11-14 11:46:17 +0000 | [diff] [blame] | 77 | continue; |
| 78 | |
| 79 | if ((fields->passwords.size() < maxPasswords) |
Torne (Richard Coles) | d5428f3 | 2014-03-18 10:21:16 +0000 | [diff] [blame] | 80 | && inputElement.isPasswordField()) { |
Torne (Richard Coles) | 926b001 | 2013-03-28 15:32:48 +0000 | [diff] [blame] | 81 | // We assume that the username is the input element before the |
| 82 | // first password element. |
| 83 | if (fields->passwords.isEmpty() && latestInputElement) { |
| 84 | fields->userName = latestInputElement; |
| 85 | // Remove the selected username from alternateUserNames. |
| 86 | if (!fields->alternateUserNames.isEmpty() && !latestInputElement->value().isEmpty()) |
| 87 | fields->alternateUserNames.removeLast(); |
| 88 | } |
Torne (Richard Coles) | d5428f3 | 2014-03-18 10:21:16 +0000 | [diff] [blame] | 89 | fields->passwords.append(&inputElement); |
Torne (Richard Coles) | 5c87bf8 | 2012-11-14 11:46:17 +0000 | [diff] [blame] | 90 | } |
Torne (Richard Coles) | 5c87bf8 | 2012-11-14 11:46:17 +0000 | [diff] [blame] | 91 | |
Torne (Richard Coles) | 926b001 | 2013-03-28 15:32:48 +0000 | [diff] [blame] | 92 | // Various input types such as text, url, email can be a username field. |
Torne (Richard Coles) | d5428f3 | 2014-03-18 10:21:16 +0000 | [diff] [blame] | 93 | if (inputElement.isTextField() && !inputElement.isPasswordField()) { |
| 94 | latestInputElement = &inputElement; |
Torne (Richard Coles) | 926b001 | 2013-03-28 15:32:48 +0000 | [diff] [blame] | 95 | // We ignore elements that have no value. Unlike userName, alternateUserNames |
| 96 | // is used only for autofill, not for form identification, and blank autofill |
| 97 | // entries are not useful. |
Torne (Richard Coles) | d5428f3 | 2014-03-18 10:21:16 +0000 | [diff] [blame] | 98 | if (!inputElement.value().isEmpty()) |
| 99 | fields->alternateUserNames.append(inputElement.value()); |
Torne (Richard Coles) | 5c87bf8 | 2012-11-14 11:46:17 +0000 | [diff] [blame] | 100 | } |
| 101 | } |
| 102 | } |
| 103 | |
Torne (Richard Coles) | 51b2906 | 2013-11-28 11:56:03 +0000 | [diff] [blame] | 104 | } // namespace blink |