Re: [whatwg/dom] createElementNS() QName/Name confusion (#671)

But `Name` is *not* a subset of `QName`.

[`QName`](https://www.w3.org/TR/xml-names/#NT-QName) allows for only one colon which *must* be preceded by a [`NCName`](https://www.w3.org/TR/xml-names/#NT-NCName):

    QName          ::= PrefixedName | UnprefixedName
    PrefixedName   ::= Prefix ':' LocalPart
    UnprefixedName ::= LocalPart
    Prefix         ::= NCName
    LocalPart      ::= NCName

[`Name`](https://www.w3.org/TR/REC-xml/#NT-Name), however, allows for multiple colons, even at the start of the token:

    NameStartChar ::=    ":" | [A-Z] /* etc. */
    NameChar      ::=    NameStartChar | "-" /* etc. */
    Name          ::=    NameStartChar (NameChar)*

As an aside: 
In my previous comments my interpretation of how lenient `createElementNS()` actually is, was incorrect. I interpreted it as though a `null` namespace allowed for a `Name` production element name, and I even thought I was reassured by testing it in Firefox, but it seems I must have confused a `createElement()` test with a `createElementNS()` test, in that I thought the latter actually allowed `createElementNS( null, '::p' )`. However, it doesn't, as it *shouldn't* anyway, now that I've inspected the specs more carefully. In other words `createElement( '::p' )` does not produce the same result as `createElementNS( null, '::p' )`.

This is the outcome of some tests in Firefox 61: 

    console.log( document.createElement( 'p' ) ) /* <p> */
    console.log( document.createElement( ':p' ) ) /* <:p> */
    console.log( document.createElement( '::p' ) ) /* <::p> */
    console.log( document.createElementNS( 'my-namespace', 'mn:p' ) ) /* <mn:p>*/
    console.log( document.createElementNS( null, 'p' ) ) /* <p> */
    console.log( document.createElementNS( null, '::p' ) ) /* throws InvalidCharacterError */
    console.log( document.createElementNS( null, ':p' ) ) /* throws InvalidCharacterError */
    console.log( document.createElementNS( null, 'mn:p' ) ) /* throws NamespaceError */

So, to conclude:
`Name` is not a subset of `QName` and the specs for `createElementNS()` should *not* allow `Name`, given its current state. Unless, of course, the goal is to actually let it be more lenient, in that it would, for instance, accept `createElementNS( null, '::p' )` as valid.

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/dom/issues/671#issuecomment-409185870

Received on Tuesday, 31 July 2018 11:21:38 UTC