diff --git a/content/html/content/src/HTMLInputElement.cpp b/content/html/content/src/HTMLInputElement.cpp
index 1e9dc4e502c7..91340235ddbe 100644
--- a/content/html/content/src/HTMLInputElement.cpp
+++ b/content/html/content/src/HTMLInputElement.cpp
@@ -5743,50 +5743,30 @@ HTMLInputElement::IsValidEmailAddress(const nsAString& aValue)
uint32_t i = 0;
uint32_t length = value.Length();
- // Email addresses can't be empty and can't end with a '.' or '-'.
- if (length == 0 || value[length - 1] == '.' || value[length - 1] == '-') {
- return false;
- }
-
- uint32_t atPos = (uint32_t)value.FindChar('@');
- // Email addresses must contain a '@', but can't begin or end with it.
- if (atPos == (uint32_t)kNotFound || atPos == 0 || atPos == length - 1) {
- return false;
- }
-
// Puny-encode the string if needed before running the validation algorithm.
nsCOMPtr idnSrv = do_GetService(NS_IDNSERVICE_CONTRACTID);
if (idnSrv) {
- // ConvertUTF8toACE() treats 'username@domain' as a single label so we need
- // to puny-encode the username and domain parts separately.
- const nsDependentCSubstring username = Substring(value, 0, atPos);
bool ace;
- if (NS_SUCCEEDED(idnSrv->IsACE(username, &ace)) && !ace) {
- nsAutoCString usernameACE;
- // TODO: Bug 901347: Usernames longer than 63 chars are not converted by
- // ConvertUTF8toACE(). For now, continue on even if the conversion fails.
- if (NS_SUCCEEDED(idnSrv->ConvertUTF8toACE(username, usernameACE))) {
- value.Replace(0, atPos, usernameACE);
- atPos = usernameACE.Length();
+ if (NS_SUCCEEDED(idnSrv->IsACE(value, &ace)) && !ace) {
+ nsAutoCString punyCodedValue;
+ if (NS_SUCCEEDED(idnSrv->ConvertUTF8toACE(value, punyCodedValue))) {
+ value = punyCodedValue;
+ length = value.Length();
}
}
-
- const nsDependentCSubstring domain = Substring(value, atPos + 1);
- if (NS_SUCCEEDED(idnSrv->IsACE(domain, &ace)) && !ace) {
- nsAutoCString domainACE;
- if (NS_FAILED(idnSrv->ConvertUTF8toACE(domain, domainACE))) {
- return false;
- }
- value.Replace(atPos + 1, domain.Length(), domainACE);
- }
-
- length = value.Length();
} else {
NS_ERROR("nsIIDNService isn't present!");
}
+ // If the email address is empty, begins with an '@'
+ // or ends with a '.' or '-', we know it's invalid.
+ if (length == 0 || value[0] == '@' || value[length-1] == '.' ||
+ value[length-1] == '-') {
+ return false;
+ }
+
// Parsing the username.
- for (; i < atPos; ++i) {
+ for (; i < length && value[i] != '@'; ++i) {
PRUnichar c = value[i];
// The username characters have to be in this list to be valid.
@@ -5799,8 +5779,10 @@ HTMLInputElement::IsValidEmailAddress(const nsAString& aValue)
}
}
- // Skip the '@'.
- ++i;
+ // If there is no domain name, that's not a valid email address.
+ if (++i >= length) {
+ return false;
+ }
// The domain name can't begin with a dot or a dash.
if (value[i] == '.' || value[i] == '-') {
diff --git a/content/html/content/test/forms/test_input_email.html b/content/html/content/test/forms/test_input_email.html
index e172188cf767..dd5482db5a62 100644
--- a/content/html/content/test/forms/test_input_email.html
+++ b/content/html/content/test/forms/test_input_email.html
@@ -112,20 +112,6 @@ var values = [
// Long strings with UTF-8.
[ 'this.is.email.should.be.longer.than.sixty.four.characters.föö@mözillä.tld', true ],
[ 'this-is-email-should-be-longer-than-sixty-four-characters-föö@mözillä.tld', true, true ],
- // Long labels.
- [ 'foo@thislabelisexactly63characterssssssssssssssssssssssssssssssssss', true ],
- [ 'foo@thislabelisexactly63characterssssssssssssssssssssssssssssssssss.com', true ],
- [ 'foo@foo.thislabelisexactly63characterssssssssssssssssssssssssssssssssss.com', true ],
- [ 'foo@foo.thislabelisexactly63characterssssssssssssssssssssssssssssssssss', true ],
- [ 'foo@thislabelisexactly64charactersssssssssssssssssssssssssssssssssss', false ],
- [ 'foo@thislabelisexactly64charactersssssssssssssssssssssssssssssssssss.com', false ],
- [ 'foo@foo.thislabelisexactly64charactersssssssssssssssssssssssssssssssssss.com', false ],
- [ 'foo@foo.thislabelisexactly64charactersssssssssssssssssssssssssssssssssss', false ],
- // Long labels with UTF-8.
- [ 'foo@thisläbelisexäctly63charäcterssssssssssssssssssssssssssssssssss', false ],
- [ 'foo@thisläbelisexäctly63charäcterssssssssssssssssssssssssssssssssss.com', false ],
- [ 'foo@foo.thisläbelisexäctly63charäcterssssssssssssssssssssssssssssssssss.com', false ],
- [ 'foo@foo.thisläbelisexäctly63charäcterssssssssssssssssssssssssssssssssss', false ],
// The domains labels (sub-domains or tld) can't start or finish with a '-'
[ 'foo@foo-bar', true ],
[ 'foo@-foo', false ],
@@ -193,7 +179,7 @@ for (c of legalCharacters) {
values.push(["foo@foo.bar" + c, true]);
}
// Add the concatenation of all legal characters too.
-values.push(["foo@bar." + legalCharacters, true]);
+values.push(["foo@bar.com" + legalCharacters, true]);
// Add domain illegal characters.
illegalCharacters = "()<>[]:;@\\,!#$%&'*+/=?^_`{|}~ \t";