2011-06-28 Kentaro Hara <haraken@google.com>
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 28 Jun 2011 09:46:08 +0000 (09:46 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 28 Jun 2011 09:46:08 +0000 (09:46 +0000)
        Reviewed by Kent Tamura.

        Allow spaces between e-mail addresses in 'email' input type.
        https://bugs.webkit.org/show_bug.cgi?id=55987

        Allowed spaces between e-mail addresses in 'email' input type,
        e.g. ' a@p.com , b@p.com ' is a valid value. Implemented the
        value sanitization algorithm for an e-mail value.  Added more unit
        tests that check the e-mail value parser.

        * fast/forms/ValidityState-typeMismatch-email-expected.txt:
        * fast/forms/resources/ValidityState-typeMismatch-email.js:
2011-06-28  Kentaro Hara  <haraken@google.com>

        Reviewed by Kent Tamura.

        Allow spaces between e-mail addresses in 'email' input type.
        https://bugs.webkit.org/show_bug.cgi?id=55987

        Allowed spaces between e-mail addresses in 'email' input type,
        e.g. ' a@p.com , b@p.com ' is a valid value. Implemented the
        value sanitization algorithm for an e-mail value.  Added more unit
        tests that check the e-mail value parser.

        Test: fast/forms/ValidityState-typeMismatch-email.html

        * html/EmailInputType.cpp:
        (WebCore::EmailInputType::typeMismatchFor):
        (WebCore::EmailInputType::sanitizeValue):
        * html/EmailInputType.h:
        * html/parser/HTMLParserIdioms.cpp:
        (WebCore::stripHTMLLineBreaks):
        * html/parser/HTMLParserIdioms.h:
        (WebCore::isHTMLLineBreak):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@89915 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/forms/ValidityState-typeMismatch-email-expected.txt
LayoutTests/fast/forms/resources/ValidityState-typeMismatch-email.js
Source/WebCore/ChangeLog
Source/WebCore/html/EmailInputType.cpp
Source/WebCore/html/EmailInputType.h
Source/WebCore/html/parser/HTMLParserIdioms.cpp
Source/WebCore/html/parser/HTMLParserIdioms.h

index 78c0109..7d509ba 100644 (file)
@@ -1,3 +1,18 @@
+2011-06-28  Kentaro Hara  <haraken@google.com>
+
+        Reviewed by Kent Tamura.
+
+        Allow spaces between e-mail addresses in 'email' input type.
+        https://bugs.webkit.org/show_bug.cgi?id=55987
+
+        Allowed spaces between e-mail addresses in 'email' input type,
+        e.g. ' a@p.com , b@p.com ' is a valid value. Implemented the
+        value sanitization algorithm for an e-mail value.  Added more unit
+        tests that check the e-mail value parser.
+
+        * fast/forms/ValidityState-typeMismatch-email-expected.txt:
+        * fast/forms/resources/ValidityState-typeMismatch-email.js:
+
 2011-06-28  Csaba Osztrogonác  <ossy@webkit.org>
 
         Qt specific results committed in r89901, but some of them fail on Qt-WK2 and/or Qt-Mac platform
index 833388a..74fde94 100644 (file)
-This test aims to check for typeMismatch flag with type=email input fields.
+This test aims to check for typeMismatch flag and sanitization with type=email input fields.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS something@something.com is a correct valid email address 
-PASS someone@localhost.localdomain is a correct valid email address 
-PASS someone@127.0.0.1 is a correct valid email address 
-PASS a@b.b is a correct valid email address 
-PASS a/b@domain.com is a correct valid email address 
-PASS {}@domain.com is a correct valid email address 
-PASS ddjk-s-jk@asl-.com is a correct valid email address 
-PASS m*'!%@something.sa is a correct valid email address 
-PASS tu!!7n7.ad##0!!!@company.ca is a correct valid email address 
-PASS %@com.com is a correct valid email address 
-PASS !#$%&'*+/=?^_`{|}~.-@com.com is a correct valid email address 
-PASS .wooly@example.com is a correct valid email address 
-PASS wo..oly@example.com is a correct valid email address 
-PASS someone@do-ma-in.com is a correct valid email address 
-PASS someone@do-.com is a correct valid email address 
-PASS somebody@-.com is a correct valid email address 
-PASS somebody@example is a correct valid email address 
-PASS invalid:email@example.com is a correct invalid email address 
-PASS @somewhere.com is a correct invalid email address 
-PASS example.com is a correct invalid email address 
-PASS @@example.com is a correct invalid email address 
-PASS a space@example.com is a correct invalid email address 
-PASS something@ex..ample.com is a correct invalid email address 
-PASS a\b@c is a correct invalid email address 
-PASS someone@somewhere.com. is a correct invalid email address 
-PASS ""test\blah""@example.com is a correct invalid email address 
-PASS "testblah"@example.com is a correct invalid email address 
-PASS someone@somewhere.com@ is a correct invalid email address 
-PASS someone@somewhere_com is a correct invalid email address 
-PASS someone@some:where.com is a correct invalid email address 
-PASS . is a correct invalid email address 
-PASS F/s/f/a@feo+re.com is a correct invalid email address 
-PASS some+long+email+address@some+host-weird-/looking.com is a correct invalid email address 
-PASS someone@somewhere.com,john@doe.com,a@b.c,a/b@c.c,ualla@ualla.127 is a correct valid email address list
-PASS tu!!7n7.ad##0!!!@company.ca,F/s/f/a@feo-re.com,m*'@a.b is a correct valid email address list
-PASS ,,,,,,,,,,, is a correct valid email address list
-PASS someone@somewhere.com,john@doe..com,a@b,a/b@c,ualla@ualla.127 is a correct invalid email address list
-PASS some+long+email+address@some+host:weird-/looking.com,F/s/f/a@feo+re.com,,m*'@'!% is a correct invalid email address list
-PASS ,,,,,,,,, ,, is a correct invalid email address list
+Valid single addresses when 'multiple' attribute is not set.
+PASS "something@something.com" is a valid email address. 
+PASS "someone@localhost.localdomain" is a valid email address. 
+PASS "someone@127.0.0.1" is a valid email address. 
+PASS "a@b.b" is a valid email address. 
+PASS "a/b@domain.com" is a valid email address. 
+PASS "{}@domain.com" is a valid email address. 
+PASS "ddjk-s-jk@asl-.com" is a valid email address. 
+PASS "m*'!%@something.sa" is a valid email address. 
+PASS "tu!!7n7.ad##0!!!@company.ca" is a valid email address. 
+PASS "%@com.com" is a valid email address. 
+PASS "!#$%&'*+/=?^_`{|}~.-@com.com" is a valid email address. 
+PASS ".wooly@example.com" is a valid email address. 
+PASS "wo..oly@example.com" is a valid email address. 
+PASS "someone@do-ma-in.com" is a valid email address. 
+PASS "someone@do-.com" is a valid email address. 
+PASS "somebody@-.com" is a valid email address. 
+PASS "somebody@example" is a valid email address. 
+PASS "
+a@p.com
+" is a valid email address. It was sanitized to "a@p.com".
+PASS "
+a@p.com
+" is a valid email address. It was sanitized to "a@p.com".
+PASS "a
+@p.com" is a valid email address. It was sanitized to "a@p.com".
+PASS "a
+@p.com" is a valid email address. It was sanitized to "a@p.com".
+PASS "" is a valid email address. 
+Invalid single addresses when 'multiple' attribute is not set.
+PASS "invalid:email@example.com" is a invalid email address. 
+PASS "@somewhere.com" is a invalid email address. 
+PASS "example.com" is a invalid email address. 
+PASS "@@example.com" is a invalid email address. 
+PASS "a space@example.com" is a invalid email address. 
+PASS "something@ex..ample.com" is a invalid email address. 
+PASS "a\b@c" is a invalid email address. 
+PASS "someone@somewhere.com." is a invalid email address. 
+PASS """test\blah""@example.com" is a invalid email address. 
+PASS ""testblah"@example.com" is a invalid email address. 
+PASS "someone@somewhere.com@" is a invalid email address. 
+PASS "someone@somewhere_com" is a invalid email address. 
+PASS "someone@some:where.com" is a invalid email address. 
+PASS "." is a invalid email address. 
+PASS "F/s/f/a@feo+re.com" is a invalid email address. 
+PASS "some+long+email+address@some+host-weird-/looking.com" is a invalid email address. 
+PASS " " is a invalid email address. 
+PASS " a@p.com" is a invalid email address. 
+PASS "a@p.com " is a invalid email address. 
+PASS " a@p.com " is a invalid email address. 
+PASS " a@p.com " is a invalid email address. 
+PASS " a@p.com " is a invalid email address. 
+PASS "\va@p.com\v" is a invalid email address. 
+PASS "\fa@p.com\f" is a invalid email address. 
+PASS " a@p.com " is a invalid email address. 
+PASS " a@p.com " is a invalid email address. 
+PASS "a @p.com" is a invalid email address. 
+PASS "a @p.com" is a invalid email address. 
+PASS "a        @p.com" is a invalid email address. 
+PASS "a\v@p.com" is a invalid email address. 
+PASS "a\f@p.com" is a invalid email address. 
+PASS "a @p.com" is a invalid email address. 
+PASS "a @p.com" is a invalid email address. 
+Valid single addresses when 'multiple' attribute is set.
+PASS "something@something.com" is a valid email address list. 
+PASS "someone@localhost.localdomain" is a valid email address list. 
+PASS "someone@127.0.0.1" is a valid email address list. 
+PASS "a@b.b" is a valid email address list. 
+PASS "a/b@domain.com" is a valid email address list. 
+PASS "{}@domain.com" is a valid email address list. 
+PASS "ddjk-s-jk@asl-.com" is a valid email address list. 
+PASS "m*'!%@something.sa" is a valid email address list. 
+PASS "tu!!7n7.ad##0!!!@company.ca" is a valid email address list. 
+PASS "%@com.com" is a valid email address list. 
+PASS "!#$%&'*+/=?^_`{|}~.-@com.com" is a valid email address list. 
+PASS ".wooly@example.com" is a valid email address list. 
+PASS "wo..oly@example.com" is a valid email address list. 
+PASS "someone@do-ma-in.com" is a valid email address list. 
+PASS "someone@do-.com" is a valid email address list. 
+PASS "somebody@-.com" is a valid email address list. 
+PASS "somebody@example" is a valid email address list. 
+PASS " a@p.com " is a valid email address list. It was sanitized to "a@p.com".
+PASS " a@p.com " is a valid email address list. It was sanitized to "a@p.com".
+PASS "
+a@p.com
+" is a valid email address list. It was sanitized to "a@p.com".
+PASS "\fa@p.com\f" is a valid email address list. It was sanitized to "a@p.com".
+PASS "
+a@p.com
+" is a valid email address list. It was sanitized to "a@p.com".
+PASS "a
+@p.com" is a valid email address list. It was sanitized to "a@p.com".
+PASS "a
+@p.com" is a valid email address list. It was sanitized to "a@p.com".
+PASS "" is a valid email address list. 
+PASS " " is a valid email address list. It was sanitized to "".
+PASS " a@p.com" is a valid email address list. It was sanitized to "a@p.com".
+PASS "a@p.com " is a valid email address list. It was sanitized to "a@p.com".
+PASS " a@p.com " is a valid email address list. It was sanitized to "a@p.com".
+Invalid single addresses when 'multiple' attribute is set.
+PASS "invalid:email@example.com" is a invalid email address list. 
+PASS "@somewhere.com" is a invalid email address list. 
+PASS "example.com" is a invalid email address list. 
+PASS "@@example.com" is a invalid email address list. 
+PASS "a space@example.com" is a invalid email address list. 
+PASS "something@ex..ample.com" is a invalid email address list. 
+PASS "a\b@c" is a invalid email address list. 
+PASS "someone@somewhere.com." is a invalid email address list. 
+PASS """test\blah""@example.com" is a invalid email address list. 
+PASS ""testblah"@example.com" is a invalid email address list. 
+PASS "someone@somewhere.com@" is a invalid email address list. 
+PASS "someone@somewhere_com" is a invalid email address list. 
+PASS "someone@some:where.com" is a invalid email address list. 
+PASS "." is a invalid email address list. 
+PASS "F/s/f/a@feo+re.com" is a invalid email address list. 
+PASS "some+long+email+address@some+host-weird-/looking.com" is a invalid email address list. 
+PASS "\va@p.com\v" is a invalid email address list. 
+PASS " a@p.com " is a invalid email address list. 
+PASS " a@p.com " is a invalid email address list. 
+PASS "a @p.com" is a invalid email address list. 
+PASS "a @p.com" is a invalid email address list. 
+PASS "a        @p.com" is a invalid email address list. 
+PASS "a\v@p.com" is a invalid email address list. 
+PASS "a\f@p.com" is a invalid email address list. 
+PASS "a @p.com" is a invalid email address list. 
+PASS "a @p.com" is a invalid email address list. 
+Valid multiple addresses when 'multiple' attribute is set.
+PASS "someone@somewhere.com,john@doe.com,a@b.c,a/b@c.c,ualla@ualla.127" is a valid email address list. 
+PASS "tu!!7n7.ad##0!!!@company.ca,F/s/f/a@feo-re.com,m*'@a.b" is a valid email address list. 
+PASS " a@p.com,b@p.com" is a valid email address list. It was sanitized to "a@p.com,b@p.com".
+PASS "a@p.com ,b@p.com" is a valid email address list. It was sanitized to "a@p.com,b@p.com".
+PASS "a@p.com, b@p.com" is a valid email address list. It was sanitized to "a@p.com,b@p.com".
+PASS "a@p.com,b@p.com " is a valid email address list. It was sanitized to "a@p.com,b@p.com".
+PASS "   a@p.com   ,   b@p.com   " is a valid email address list. It was sanitized to "a@p.com,b@p.com".
+PASS " a@p.com , b@p.com " is a valid email address list. It was sanitized to "a@p.com,b@p.com".
+PASS " a@p.com ,       b@p.com " is a valid email address list. It was sanitized to "a@p.com,b@p.com".
+PASS "
+a@p.com
+,
+b@p.com
+" is a valid email address list. It was sanitized to "a@p.com,b@p.com".
+PASS "\fa@p.com\f,\fb@p.com\f" is a valid email address list. It was sanitized to "a@p.com,b@p.com".
+PASS "
+a@p.com
+,
+b@p.com
+" is a valid email address list. It was sanitized to "a@p.com,b@p.com".
+Invalid multiple addresses when 'multiple' attribute is set.
+PASS "someone@somewhere.com,john@doe..com,a@b,a/b@c,ualla@ualla.127" is a invalid email address list. 
+PASS "some+long+email+address@some+host:weird-/looking.com,F/s/f/a@feo+re.com,,m*'@'!%" is a invalid email address list. 
+PASS "   a @p.com   ,   b@p.com   " is a invalid email address list. It was sanitized to "a @p.com,b@p.com".
+PASS "   a@p.com   ,   b @p.com   " is a invalid email address list. It was sanitized to "a@p.com,b @p.com".
+PASS "\va@p.com\v,\vb@p.com\v" is a invalid email address list. 
+PASS " a@p.com , b@p.com " is a invalid email address list. 
+PASS " a@p.com , b@p.com " is a invalid email address list. 
+PASS ",," is a invalid email address list. 
+PASS " ,," is a invalid email address list. It was sanitized to ",,".
+PASS ", ," is a invalid email address list. It was sanitized to ",,".
+PASS ",, " is a invalid email address list. It was sanitized to ",,".
+PASS "  ,  ,  " is a invalid email address list. It was sanitized to ",,".
+PASS " , , " is a invalid email address list. It was sanitized to ",,".
+PASS " ,       ,       " is a invalid email address list. It was sanitized to ",,".
+PASS "
+,
+,
+" is a invalid email address list. It was sanitized to ",,".
+PASS "\v,\v,\v" is a invalid email address list. 
+PASS "\f,\f,\f" is a invalid email address list. It was sanitized to ",,".
+PASS "
+,
+,
+" is a invalid email address list. It was sanitized to ",,".
+PASS " , , " is a invalid email address list. 
+PASS " , , " is a invalid email address list. 
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 8d32891..222ece7 100644 (file)
-description("This test aims to check for typeMismatch flag with type=email input fields.");
+description("This test aims to check for typeMismatch flag and sanitization with type=email input fields.");
 
 var i = document.createElement('input');
 i.type = 'email';
 
-function emailCheck(val, expectedValid)
+function emailCheck(value, expectedValue, expectedMismatch, multiple)
 {
-    i.value = val;
-    var vs = i.validity.typeMismatch;
-    var didPass = vs == expectedValid;
-    var didPassText = didPass ? "a correct" : "an incorrect";
-    var validityText = vs ? "invalid" : "valid";
-    var multipleText = i.multiple ? "list" : "";
-    var resultText = val + " is " + didPassText + " " + validityText + " email address " + multipleText;
-    if (didPass)
-        testPassed(resultText);
+    i.value = value;
+    i.multiple = !!multiple;
+    var mismatch = i.validity.typeMismatch;
+    var mismatchPass = mismatch == expectedMismatch;
+    var sanitizePass = i.value == expectedValue;
+    var mismatchResult = '"' + value + '" is a ' + (mismatch ? 'invalid' : 'valid') + ' email address' + (multiple ? ' list. ' : '. ');
+    var sanitizeResult = 'It was sanitized to "' + i.value + '"' + (sanitizePass ? '.' : ', but should be sanitized to "' + expectedValue + '"');
+    var result = mismatchResult;
+    if (value != expectedValue || !sanitizePass)
+        result += sanitizeResult;
+
+    if (mismatchPass && sanitizePass)
+        testPassed(result);
     else
-        testFailed(resultText);
+        testFailed(result);
 }
 
-// VALID
-emailCheck("something@something.com", false);
-emailCheck("someone@localhost.localdomain", false);
-emailCheck("someone@127.0.0.1", false);
-emailCheck("a@b.b", false);
-emailCheck("a/b@domain.com", false);
-emailCheck("{}@domain.com", false);
-emailCheck("ddjk-s-jk@asl-.com", false);
-emailCheck("m*'!%@something.sa", false);
-emailCheck("tu!!7n7.ad##0!!!@company.ca", false);
-emailCheck("%@com.com", false);
-emailCheck("!#$%&'*+/=?^_`{|}~.-@com.com", false);
-emailCheck(".wooly@example.com", false);
-emailCheck("wo..oly@example.com", false);
-emailCheck("someone@do-ma-in.com", false);
-emailCheck("someone@do-.com", false);
-emailCheck("somebody@-.com", false);
-emailCheck("somebody@example", false);
+var expectValid = false;
+var expectInvalid = true;
+var multiple = true;
+
+debug("Valid single addresses when 'multiple' attribute is not set.");
+emailCheck("something@something.com", "something@something.com", expectValid);
+emailCheck("someone@localhost.localdomain", "someone@localhost.localdomain", expectValid);
+emailCheck("someone@127.0.0.1", "someone@127.0.0.1", expectValid);
+emailCheck("a@b.b", "a@b.b", expectValid);
+emailCheck("a/b@domain.com", "a/b@domain.com", expectValid);
+emailCheck("{}@domain.com", "{}@domain.com", expectValid);
+emailCheck("ddjk-s-jk@asl-.com", "ddjk-s-jk@asl-.com", expectValid);
+emailCheck("m*'!%@something.sa", "m*'!%@something.sa", expectValid);
+emailCheck("tu!!7n7.ad##0!!!@company.ca", "tu!!7n7.ad##0!!!@company.ca", expectValid);
+emailCheck("%@com.com", "%@com.com", expectValid);
+emailCheck("!#$%&'*+/=?^_`{|}~.-@com.com", "!#$%&'*+/=?^_`{|}~.-@com.com", expectValid);
+emailCheck(".wooly@example.com", ".wooly@example.com", expectValid);
+emailCheck("wo..oly@example.com", "wo..oly@example.com", expectValid);
+emailCheck("someone@do-ma-in.com", "someone@do-ma-in.com", expectValid);
+emailCheck("someone@do-.com", "someone@do-.com", expectValid);
+emailCheck("somebody@-.com", "somebody@-.com", expectValid);
+emailCheck("somebody@example", "somebody@example", expectValid);
+emailCheck("\u000Aa@p.com\u000A", "a@p.com", expectValid);
+emailCheck("\u000Da@p.com\u000D", "a@p.com", expectValid);
+emailCheck("a\u000A@p.com", "a@p.com", expectValid);
+emailCheck("a\u000D@p.com", "a@p.com", expectValid);
+emailCheck("", "", expectValid);
+
+debug("Invalid single addresses when 'multiple' attribute is not set.");
+emailCheck("invalid:email@example.com", "invalid:email@example.com", expectInvalid);
+emailCheck("@somewhere.com", "@somewhere.com", expectInvalid);
+emailCheck("example.com", "example.com", expectInvalid);
+emailCheck("@@example.com", "@@example.com", expectInvalid);
+emailCheck("a space@example.com", "a space@example.com", expectInvalid);
+emailCheck("something@ex..ample.com", "something@ex..ample.com", expectInvalid);
+emailCheck("a\b@c", "a\b@c", expectInvalid);
+emailCheck("someone@somewhere.com.", "someone@somewhere.com.", expectInvalid);
+emailCheck("\"\"test\blah\"\"@example.com", "\"\"test\blah\"\"@example.com", expectInvalid);
+emailCheck("\"testblah\"@example.com", "\"testblah\"@example.com", expectInvalid);
+emailCheck("someone@somewhere.com@", "someone@somewhere.com@", expectInvalid);
+emailCheck("someone@somewhere_com", "someone@somewhere_com", expectInvalid);
+emailCheck("someone@some:where.com", "someone@some:where.com", expectInvalid);
+emailCheck(".", ".", expectInvalid);
+emailCheck("F/s/f/a@feo+re.com", "F/s/f/a@feo+re.com", expectInvalid);
+emailCheck("some+long+email+address@some+host-weird-/looking.com", "some+long+email+address@some+host-weird-/looking.com", expectInvalid);
+emailCheck(" ", " ", expectInvalid);
+emailCheck(" a@p.com", " a@p.com", expectInvalid);
+emailCheck("a@p.com ", "a@p.com ", expectInvalid);
+emailCheck(" a@p.com ", " a@p.com ", expectInvalid);
+emailCheck("\u0020a@p.com\u0020", "\u0020a@p.com\u0020", expectInvalid);
+emailCheck("\u0009a@p.com\u0009", "\u0009a@p.com\u0009", expectInvalid);
+emailCheck("\u000Ba@p.com\u000B", "\u000Ba@p.com\u000B", expectInvalid);
+emailCheck("\u000Ca@p.com\u000C", "\u000Ca@p.com\u000C", expectInvalid);
+emailCheck("\u2003a@p.com\u2003", "\u2003a@p.com\u2003", expectInvalid);
+emailCheck("\u3000a@p.com\u3000", "\u3000a@p.com\u3000", expectInvalid);
+emailCheck("a @p.com", "a @p.com", expectInvalid);
+emailCheck("a\u0020@p.com", "a\u0020@p.com", expectInvalid);
+emailCheck("a\u0009@p.com", "a\u0009@p.com", expectInvalid);
+emailCheck("a\u000B@p.com", "a\u000B@p.com", expectInvalid);
+emailCheck("a\u000C@p.com", "a\u000C@p.com", expectInvalid);
+emailCheck("a\u2003@p.com", "a\u2003@p.com", expectInvalid);
+emailCheck("a\u3000@p.com", "a\u3000@p.com", expectInvalid);
+
+debug("Valid single addresses when 'multiple' attribute is set.");
+emailCheck("something@something.com", "something@something.com", expectValid, multiple);
+emailCheck("someone@localhost.localdomain", "someone@localhost.localdomain", expectValid, multiple);
+emailCheck("someone@127.0.0.1", "someone@127.0.0.1", expectValid, multiple);
+emailCheck("a@b.b", "a@b.b", expectValid, multiple);
+emailCheck("a/b@domain.com", "a/b@domain.com", expectValid, multiple);
+emailCheck("{}@domain.com", "{}@domain.com", expectValid, multiple);
+emailCheck("ddjk-s-jk@asl-.com", "ddjk-s-jk@asl-.com", expectValid, multiple);
+emailCheck("m*'!%@something.sa", "m*'!%@something.sa", expectValid, multiple);
+emailCheck("tu!!7n7.ad##0!!!@company.ca", "tu!!7n7.ad##0!!!@company.ca", expectValid, multiple);
+emailCheck("%@com.com", "%@com.com", expectValid, multiple);
+emailCheck("!#$%&'*+/=?^_`{|}~.-@com.com", "!#$%&'*+/=?^_`{|}~.-@com.com", expectValid, multiple);
+emailCheck(".wooly@example.com", ".wooly@example.com", expectValid, multiple);
+emailCheck("wo..oly@example.com", "wo..oly@example.com", expectValid, multiple);
+emailCheck("someone@do-ma-in.com", "someone@do-ma-in.com", expectValid, multiple);
+emailCheck("someone@do-.com", "someone@do-.com", expectValid, multiple);
+emailCheck("somebody@-.com", "somebody@-.com", expectValid, multiple);
+emailCheck("somebody@example", "somebody@example", expectValid, multiple);
+emailCheck("\u0020a@p.com\u0020", "a@p.com", expectValid, multiple);
+emailCheck("\u0009a@p.com\u0009", "a@p.com", expectValid, multiple);
+emailCheck("\u000Aa@p.com\u000A", "a@p.com", expectValid, multiple);
+emailCheck("\u000Ca@p.com\u000C", "a@p.com", expectValid, multiple);
+emailCheck("\u000Da@p.com\u000D", "a@p.com", expectValid, multiple);
+emailCheck("a\u000A@p.com", "a@p.com", expectValid, multiple);
+emailCheck("a\u000D@p.com", "a@p.com", expectValid, multiple);
+emailCheck("", "", expectValid, multiple);
+emailCheck(" ", "", expectValid, multiple);
+emailCheck(" a@p.com", "a@p.com", expectValid, multiple);
+emailCheck("a@p.com ", "a@p.com", expectValid, multiple);
+emailCheck(" a@p.com ", "a@p.com", expectValid, multiple);
 
-// INVALID
-emailCheck("invalid:email@example.com", true);
-emailCheck("@somewhere.com", true);
-emailCheck("example.com", true);
-emailCheck("@@example.com", true);
-emailCheck("a space@example.com", true);
-emailCheck("something@ex..ample.com", true);
-emailCheck("a\b@c", true);
-emailCheck("someone@somewhere.com.", true);
-emailCheck("\"\"test\blah\"\"@example.com", true);
-emailCheck("\"testblah\"@example.com", true);
-emailCheck("someone@somewhere.com@", true);
-emailCheck("someone@somewhere_com", true);
-emailCheck("someone@some:where.com", true);
-emailCheck(".", true);
-emailCheck("F/s/f/a@feo+re.com", true);
-emailCheck("some+long+email+address@some+host-weird-/looking.com", true);
+debug("Invalid single addresses when 'multiple' attribute is set.");
+emailCheck("invalid:email@example.com", "invalid:email@example.com", expectInvalid, multiple);
+emailCheck("@somewhere.com", "@somewhere.com", expectInvalid, multiple);
+emailCheck("example.com", "example.com", expectInvalid, multiple);
+emailCheck("@@example.com", "@@example.com", expectInvalid, multiple);
+emailCheck("a space@example.com", "a space@example.com", expectInvalid, multiple);
+emailCheck("something@ex..ample.com", "something@ex..ample.com", expectInvalid, multiple);
+emailCheck("a\b@c", "a\b@c", expectInvalid, multiple);
+emailCheck("someone@somewhere.com.", "someone@somewhere.com.", expectInvalid, multiple);
+emailCheck("\"\"test\blah\"\"@example.com", "\"\"test\blah\"\"@example.com", expectInvalid, multiple);
+emailCheck("\"testblah\"@example.com", "\"testblah\"@example.com", expectInvalid, multiple);
+emailCheck("someone@somewhere.com@", "someone@somewhere.com@", expectInvalid, multiple);
+emailCheck("someone@somewhere_com", "someone@somewhere_com", expectInvalid, multiple);
+emailCheck("someone@some:where.com", "someone@some:where.com", expectInvalid, multiple);
+emailCheck(".", ".", expectInvalid, multiple);
+emailCheck("F/s/f/a@feo+re.com", "F/s/f/a@feo+re.com", expectInvalid, multiple);
+emailCheck("some+long+email+address@some+host-weird-/looking.com", "some+long+email+address@some+host-weird-/looking.com", expectInvalid, multiple);
+emailCheck("\u000Ba@p.com\u000B", "\u000Ba@p.com\u000B", expectInvalid, multiple);
+emailCheck("\u2003a@p.com\u2003", "\u2003a@p.com\u2003", expectInvalid, multiple);
+emailCheck("\u3000a@p.com\u3000", "\u3000a@p.com\u3000", expectInvalid, multiple);
+emailCheck("a @p.com", "a @p.com", expectInvalid, multiple);
+emailCheck("a\u0020@p.com", "a\u0020@p.com", expectInvalid, multiple);
+emailCheck("a\u0009@p.com", "a\u0009@p.com", expectInvalid, multiple);
+emailCheck("a\u000B@p.com", "a\u000B@p.com", expectInvalid, multiple);
+emailCheck("a\u000C@p.com", "a\u000C@p.com", expectInvalid, multiple);
+emailCheck("a\u2003@p.com", "a\u2003@p.com", expectInvalid, multiple);
+emailCheck("a\u3000@p.com", "a\u3000@p.com", expectInvalid, multiple);
 
-i.multiple = true;
+debug("Valid multiple addresses when 'multiple' attribute is set.");
+emailCheck("someone@somewhere.com,john@doe.com,a@b.c,a/b@c.c,ualla@ualla.127", "someone@somewhere.com,john@doe.com,a@b.c,a/b@c.c,ualla@ualla.127", expectValid, multiple);
+emailCheck("tu!!7n7.ad##0!!!@company.ca,F/s/f/a@feo-re.com,m*'@a.b", "tu!!7n7.ad##0!!!@company.ca,F/s/f/a@feo-re.com,m*'@a.b", expectValid, multiple);
+emailCheck(" a@p.com,b@p.com", "a@p.com,b@p.com", expectValid, multiple);
+emailCheck("a@p.com ,b@p.com", "a@p.com,b@p.com", expectValid, multiple);
+emailCheck("a@p.com, b@p.com", "a@p.com,b@p.com", expectValid, multiple);
+emailCheck("a@p.com,b@p.com ", "a@p.com,b@p.com", expectValid, multiple);
+emailCheck("   a@p.com   ,   b@p.com   ", "a@p.com,b@p.com", expectValid, multiple);
+emailCheck("\u0020a@p.com\u0020,\u0020b@p.com\u0020", "a@p.com,b@p.com", expectValid, multiple);
+emailCheck("\u0009a@p.com\u0009,\u0009b@p.com\u0009", "a@p.com,b@p.com", expectValid, multiple);
+emailCheck("\u000Aa@p.com\u000A,\u000Ab@p.com\u000A", "a@p.com,b@p.com", expectValid, multiple);
+emailCheck("\u000Ca@p.com\u000C,\u000Cb@p.com\u000C", "a@p.com,b@p.com", expectValid, multiple);
+emailCheck("\u000Da@p.com\u000D,\u000Db@p.com\u000D", "a@p.com,b@p.com", expectValid, multiple);
 
-// VALID MULTIPLE
-emailCheck("someone@somewhere.com,john@doe.com,a@b.c,a/b@c.c,ualla@ualla.127", false)
-emailCheck("tu!!7n7.ad##0!!!@company.ca,F/s/f/a@feo-re.com,m*'@a.b", false)
-emailCheck(",,,,,,,,,,,", false)
+debug("Invalid multiple addresses when 'multiple' attribute is set.");
+emailCheck("someone@somewhere.com,john@doe..com,a@b,a/b@c,ualla@ualla.127", "someone@somewhere.com,john@doe..com,a@b,a/b@c,ualla@ualla.127", expectInvalid, multiple);
+emailCheck("some+long+email+address@some+host:weird-/looking.com,F/s/f/a@feo+re.com,,m*'@'!%", "some+long+email+address@some+host:weird-/looking.com,F/s/f/a@feo+re.com,,m*'@'!%", expectInvalid, multiple);
+emailCheck("   a @p.com   ,   b@p.com   ", "a @p.com,b@p.com", expectInvalid, multiple);
+emailCheck("   a@p.com   ,   b @p.com   ", "a@p.com,b @p.com", expectInvalid, multiple);
+emailCheck("\u000Ba@p.com\u000B,\u000Bb@p.com\u000B", "\u000Ba@p.com\u000B,\u000Bb@p.com\u000B", expectInvalid, multiple);
+emailCheck("\u2003a@p.com\u2003,\u2003b@p.com\u2003", "\u2003a@p.com\u2003,\u2003b@p.com\u2003", expectInvalid, multiple);
+emailCheck("\u3000a@p.com\u3000,\u3000b@p.com\u3000", "\u3000a@p.com\u3000,\u3000b@p.com\u3000", expectInvalid, multiple);
+emailCheck(",,", ",,", expectInvalid, multiple);
+emailCheck(" ,,", ",,", expectInvalid, multiple);
+emailCheck(", ,", ",,", expectInvalid, multiple);
+emailCheck(",, ", ",,", expectInvalid, multiple);
+emailCheck("  ,  ,  ", ",,", expectInvalid, multiple);
+emailCheck("\u0020,\u0020,\u0020", ",,", expectInvalid, multiple);
+emailCheck("\u0009,\u0009,\u0009", ",,", expectInvalid, multiple);
+emailCheck("\u000A,\u000A,\u000A", ",,", expectInvalid, multiple);
+emailCheck("\u000B,\u000B,\u000B", "\u000B,\u000B,\u000B", expectInvalid, multiple);
+emailCheck("\u000C,\u000C,\u000C", ",,", expectInvalid, multiple);
+emailCheck("\u000D,\u000D,\u000D", ",,", expectInvalid, multiple);
+emailCheck("\u2003,\u2003,\u2003", "\u2003,\u2003,\u2003", expectInvalid, multiple);
+emailCheck("\u3000,\u3000,\u3000", "\u3000,\u3000,\u3000", expectInvalid, multiple);
 
-// INVALID MULTIPLE (true on the first invalid occurrence)
-emailCheck("someone@somewhere.com,john@doe..com,a@b,a/b@c,ualla@ualla.127", true)
-emailCheck("some+long+email+address@some+host:weird-/looking.com,F/s/f/a@feo+re.com,,m*'@'!%", true)
-emailCheck(",,,,,,,,, ,,", true)
 
 var successfullyParsed = true;
index 6870ed2..64f1db0 100644 (file)
@@ -1,3 +1,26 @@
+2011-06-28  Kentaro Hara  <haraken@google.com>
+
+        Reviewed by Kent Tamura.
+
+        Allow spaces between e-mail addresses in 'email' input type.
+        https://bugs.webkit.org/show_bug.cgi?id=55987
+
+        Allowed spaces between e-mail addresses in 'email' input type,
+        e.g. ' a@p.com , b@p.com ' is a valid value. Implemented the
+        value sanitization algorithm for an e-mail value.  Added more unit
+        tests that check the e-mail value parser.
+
+        Test: fast/forms/ValidityState-typeMismatch-email.html
+
+        * html/EmailInputType.cpp:
+        (WebCore::EmailInputType::typeMismatchFor):
+        (WebCore::EmailInputType::sanitizeValue):
+        * html/EmailInputType.h:
+        * html/parser/HTMLParserIdioms.cpp:
+        (WebCore::stripHTMLLineBreaks):
+        * html/parser/HTMLParserIdioms.h:
+        (WebCore::isHTMLLineBreak):
+
 2011-06-28  Kent Tamura  <tkent@chromium.org>
 
         Reviewed by Hajime Morita.
index 47b337a..2f9c264 100644 (file)
 #include "EmailInputType.h"
 
 #include "HTMLInputElement.h"
+#include "HTMLParserIdioms.h"
 #include "LocalizedStrings.h"
 #include "RegularExpression.h"
 #include <wtf/PassOwnPtr.h>
+#include <wtf/text/StringBuilder.h>
 
 namespace WebCore {
 
@@ -67,9 +69,9 @@ bool EmailInputType::typeMismatchFor(const String& value) const
     if (!element()->multiple())
         return !isValidEmailAddress(value);
     Vector<String> addresses;
-    value.split(',', addresses);
+    value.split(',', true, addresses);
     for (unsigned i = 0; i < addresses.size(); ++i) {
-        if (!isValidEmailAddress(addresses[i]))
+        if (!isValidEmailAddress(stripLeadingAndTrailingHTMLSpaces(addresses[i])))
             return true;
     }
     return false;
@@ -90,4 +92,20 @@ bool EmailInputType::isEmailField() const
     return true;
 }
 
+String EmailInputType::sanitizeValue(const String& proposedValue)
+{
+    String noLineBreakValue = proposedValue.removeCharacters(isHTMLLineBreak);
+    if (!element()->multiple())
+        return noLineBreakValue;
+    Vector<String> addresses;
+    noLineBreakValue.split(',', true, addresses);
+    StringBuilder strippedValue;
+    for (unsigned i = 0; i < addresses.size(); ++i) {
+        if (i > 0)
+            strippedValue.append(",");
+        strippedValue.append(stripLeadingAndTrailingHTMLSpaces(addresses[i]));
+    }
+    return strippedValue.toString();
+}
+
 } // namespace WebCore
index b94ae9c..bde6fc0 100644 (file)
@@ -46,6 +46,7 @@ private:
     virtual bool typeMismatch() const;
     virtual String typeMismatchText() const;
     virtual bool isEmailField() const;
+    virtual String sanitizeValue(const String&);
 };
 
 } // namespace WebCore
index 2be6af9..8975e57 100644 (file)
@@ -29,6 +29,7 @@
 #include <wtf/MathExtras.h>
 #include <wtf/dtoa.h>
 #include <wtf/text/AtomicString.h>
+#include <wtf/text/StringBuilder.h>
 
 namespace WebCore {
 
index 4e8e58f..ba711af 100644 (file)
@@ -32,6 +32,7 @@ namespace WebCore {
 
 // Space characters as defined by the HTML specification.
 bool isHTMLSpace(UChar);
+bool isHTMLLineBreak(UChar);
 bool isNotHTMLSpace(UChar);
 
 // Strip leading and trailing whitespace as defined by the HTML specification. 
@@ -66,6 +67,11 @@ inline bool isHTMLSpace(UChar character)
     return character <= ' ' && (character == ' ' || character == '\n' || character == '\t' || character == '\r' || character == '\f');
 }
 
+inline bool isHTMLLineBreak(UChar character)
+{
+    return character <= '\r' && (character == '\n' || character == '\r');
+}
+
 inline bool isNotHTMLSpace(UChar character)
 {
     return !isHTMLSpace(character);