createElement should not lowercase non-ASCII characters
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 15 Jan 2016 06:12:56 +0000 (06:12 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 15 Jan 2016 06:12:56 +0000 (06:12 +0000)
https://bugs.webkit.org/show_bug.cgi?id=153114

Reviewed by Alex Christensen.

LayoutTests/imported/w3c:

Rebaselined the tests for document.createElement now that more test cases are passing.

* web-platform-tests/dom/nodes/Document-createElement-expected.txt:
* web-platform-tests/dom/nodes/Document-getElementsByTagName-expected.txt:
* web-platform-tests/dom/nodes/Element-getElementsByTagName-expected.txt:
* web-platform-tests/dom/nodes/case-expected.txt:

Source/WebCore:

According to step 2 in https://dom.spec.whatwg.org/#dom-document-createelement, document.createElement should not
lowercase non-ASCII letters, and this is also what Firefox does. Match that behavior by lowercasing the tag name
by convertToASCIILowercase() instead of lower() in createElement.

Also merged HTMLDocument::createElement into Document::createElement for simplicity and avoid duplicating
the call to isValidName and setting a DOM exception.

No new tests since the behavior change is covered by the existing W3C tests.

* dom/Document.cpp:
(WebCore::Document::createElement): Create a HTML element with ASCII-lowercased tag name inside a HTML document.
* dom/Document.h:
* html/HTMLDocument.cpp:
(WebCore::addLocalNameToSet):
(WebCore::HTMLDocument::createElement): Merged into Document::createElement.
* html/HTMLDocument.h:

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

LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-createElement-expected.txt
LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-getElementsByTagName-expected.txt
LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Element-getElementsByTagName-expected.txt
LayoutTests/imported/w3c/web-platform-tests/dom/nodes/case-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/dom/Document.cpp
Source/WebCore/dom/Document.h
Source/WebCore/html/HTMLDocument.cpp
Source/WebCore/html/HTMLDocument.h

index 9f8a52b..0a08b38 100644 (file)
@@ -1,3 +1,17 @@
+2016-01-14  Ryosuke Niwa  <rniwa@webkit.org>
+
+        createElement should not lowercase non-ASCII characters
+        https://bugs.webkit.org/show_bug.cgi?id=153114
+
+        Reviewed by Alex Christensen.
+
+        Rebaselined the tests for document.createElement now that more test cases are passing.
+
+        * web-platform-tests/dom/nodes/Document-createElement-expected.txt:
+        * web-platform-tests/dom/nodes/Document-getElementsByTagName-expected.txt:
+        * web-platform-tests/dom/nodes/Element-getElementsByTagName-expected.txt:
+        * web-platform-tests/dom/nodes/case-expected.txt:
+
 2016-01-14  Youenn Fablet  <youenn.fablet@crf.canon.fr>
 
         Fix problems with cross-origin redirects
index 88253d6..13e368b 100644 (file)
@@ -19,8 +19,8 @@ PASS createElement("xmlfoo:bar")
 PASS createElement("svg") 
 PASS createElement("math") 
 PASS createElement("FOO") 
-FAIL createElement("marK") assert_equals: expected "marK" but got "mark"
-FAIL createElement("İnput") assert_equals: expected "İnput" but got "i̇nput"
+PASS createElement("marK") 
+PASS createElement("İnput") 
 FAIL createElement("ınput") assert_equals: expected "ıNPUT" but got "INPUT"
 PASS createElement("") 
 PASS createElement("1foo") 
index 5b9e691..7321993 100644 (file)
@@ -14,7 +14,7 @@ PASS Element in non-HTML namespace, no prefix, lowercase name
 PASS Element in non-HTML namespace, no prefix, uppercase name 
 PASS Element in non-HTML namespace, prefix, lowercase name 
 PASS Element in non-HTML namespace, prefix, uppercase name 
-FAIL Element in HTML namespace, no prefix, non-ascii characters in name assert_equals: expected "aÇ" but got "aç"
+PASS Element in HTML namespace, no prefix, non-ascii characters in name 
 PASS Element in non-HTML namespace, non-ascii characters in name 
 PASS Element in HTML namespace, prefix, non-ascii characters in name 
 PASS Element in non-HTML namespace, prefix, non-ascii characters in name 
index 3142de0..8482b8f 100644 (file)
@@ -14,7 +14,7 @@ PASS Element in non-HTML namespace, no prefix, lowercase name
 PASS Element in non-HTML namespace, no prefix, uppercase name 
 PASS Element in non-HTML namespace, prefix, lowercase name 
 PASS Element in non-HTML namespace, prefix, uppercase name 
-FAIL Element in HTML namespace, no prefix, non-ascii characters in name assert_equals: expected "aÇ" but got "aç"
+PASS Element in HTML namespace, no prefix, non-ascii characters in name 
 PASS Element in non-HTML namespace, non-ascii characters in name 
 PASS Element in HTML namespace, prefix, non-ascii characters in name 
 PASS Element in non-HTML namespace, prefix, non-ascii characters in name 
index f9899d3..f42ee70 100644 (file)
@@ -19,7 +19,7 @@ PASS setAttribute ä
 PASS getAttribute ä 
 PASS getElementsByTagName a:ä 
 PASS getElementsByTagName ä 
-FAIL createElement Ä assert_equals: expected "Ä" but got "ä"
+PASS createElement Ä 
 PASS setAttribute Ä 
 PASS getAttribute Ä 
 PASS getElementsByTagName a:Ä 
index eb31fbb..9a10bf3 100644 (file)
@@ -1,3 +1,27 @@
+2016-01-14  Ryosuke Niwa  <rniwa@webkit.org>
+
+        createElement should not lowercase non-ASCII characters
+        https://bugs.webkit.org/show_bug.cgi?id=153114
+
+        Reviewed by Alex Christensen.
+
+        According to step 2 in https://dom.spec.whatwg.org/#dom-document-createelement, document.createElement should not
+        lowercase non-ASCII letters, and this is also what Firefox does. Match that behavior by lowercasing the tag name
+        by convertToASCIILowercase() instead of lower() in createElement.
+
+        Also merged HTMLDocument::createElement into Document::createElement for simplicity and avoid duplicating
+        the call to isValidName and setting a DOM exception.
+
+        No new tests since the behavior change is covered by the existing W3C tests.
+
+        * dom/Document.cpp:
+        (WebCore::Document::createElement): Create a HTML element with ASCII-lowercased tag name inside a HTML document.
+        * dom/Document.h:
+        * html/HTMLDocument.cpp:
+        (WebCore::addLocalNameToSet):
+        (WebCore::HTMLDocument::createElement): Merged into Document::createElement.
+        * html/HTMLDocument.h:
+
 2016-01-14  Brady Eidson  <beidson@apple.com>
 
         Modern IDB: Support opening and deleting SQLite databases on disk.
index c724358..50dd968 100644 (file)
@@ -888,6 +888,9 @@ RefPtr<Element> Document::createElement(const AtomicString& name, ExceptionCode&
         return nullptr;
     }
 
+    if (isHTMLDocument())
+        return HTMLElementFactory::createElement(QualifiedName(nullAtom, name.convertToASCIILowercase(), xhtmlNamespaceURI), *this);
+
     if (isXHTMLDocument())
         return HTMLElementFactory::createElement(QualifiedName(nullAtom, name, xhtmlNamespaceURI), *this);
 
index 16cd373..f369056 100644 (file)
@@ -385,7 +385,7 @@ public:
 
     bool hasManifest() const;
     
-    virtual RefPtr<Element> createElement(const AtomicString& tagName, ExceptionCode&);
+    WEBCORE_EXPORT RefPtr<Element> createElement(const AtomicString& tagName, ExceptionCode&);
     WEBCORE_EXPORT Ref<DocumentFragment> createDocumentFragment();
     WEBCORE_EXPORT Ref<Text> createTextNode(const String& data);
     Ref<Comment> createComment(const String& data);
index 07ebc9a..106299e 100644 (file)
@@ -226,15 +226,6 @@ Ref<DocumentParser> HTMLDocument::createParser()
 // not part of the DOM
 // --------------------------------------------------------------------------
 
-RefPtr<Element> HTMLDocument::createElement(const AtomicString& name, ExceptionCode& ec)
-{
-    if (!isValidName(name)) {
-        ec = INVALID_CHARACTER_ERR;
-        return 0;
-    }
-    return HTMLElementFactory::createElement(QualifiedName(nullAtom, name.lower(), xhtmlNamespaceURI), *this);
-}
-
 static void addLocalNameToSet(HashSet<AtomicStringImpl*>* set, const QualifiedName& qName)
 {
     set->add(qName.localName().impl());
index 318dc7f..d7daeff 100644 (file)
@@ -86,8 +86,6 @@ protected:
     HTMLDocument(Frame*, const URL&, DocumentClassFlags = 0, unsigned constructionFlags = 0);
 
 private:
-    virtual RefPtr<Element> createElement(const AtomicString& tagName, ExceptionCode&) override;
-
     virtual bool isFrameSet() const override;
     virtual Ref<DocumentParser> createParser() override;
     virtual Ref<Document> cloneDocumentWithoutChildren() const override final;