/* * This file is part of the WebKit project. * * Copyright (C) 2009 Michelangelo De Simone * Copyright (C) 2010 Google Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #include "config.h" #include "EmailInputType.h" #include "HTMLInputElement.h" #include "LocalizedStrings.h" #include "RegularExpression.h" #include namespace WebCore { static const char emailPattern[] = "[a-z0-9!#$%&'*+/=?^_`{|}~.-]+" // local part "@" "[a-z0-9-]+(\\.[a-z0-9-]+)+"; // domain part static bool isValidEmailAddress(const String& address) { int addressLength = address.length(); if (!addressLength) return false; DEFINE_STATIC_LOCAL(const RegularExpression, regExp, (emailPattern, TextCaseInsensitive)); int matchLength; int matchOffset = regExp.match(address, 0, &matchLength); return !matchOffset && matchLength == addressLength; } PassOwnPtr EmailInputType::create(HTMLInputElement* element) { return adoptPtr(new EmailInputType(element)); } const AtomicString& EmailInputType::formControlType() const { return InputTypeNames::email(); } bool EmailInputType::typeMismatchFor(const String& value) const { if (value.isEmpty()) return false; if (!element()->multiple()) return !isValidEmailAddress(value); Vector addresses; value.split(',', addresses); for (unsigned i = 0; i < addresses.size(); ++i) { if (!isValidEmailAddress(addresses[i])) return true; } return false; } bool EmailInputType::typeMismatch() const { return typeMismatchFor(element()->value()); } String EmailInputType::typeMismatchText() const { return element()->multiple() ? validationMessageTypeMismatchForMultipleEmailText() : validationMessageTypeMismatchForEmailText(); } bool EmailInputType::isEmailField() const { return true; } } // namespace WebCore