W3C home > Mailing lists > Public > public-html@w3.org > May 2008

Re: In body other end tag handling convoluted to get at most one error

From: Ian Hickson <ian@hixie.ch>
Date: Sat, 24 May 2008 09:03:22 +0000 (UTC)
To: Henri Sivonen <hsivonen@iki.fi>
Cc: HTML WG <public-html@w3.org>
Message-ID: <Pine.LNX.4.62.0805240849370.12911@hixie.dreamhostps.com>

On Fri, 4 Apr 2008, Henri Sivonen wrote:
> > 
> > An end tag token not covered by the previous entries [...]
> 
> I think the above formulation is confusing, because it runs through 
> complicated steps in the simple case: when the node on the stack indeed 
> matches the token.

When the token matches the current node, the steps are:

   1. Let node = current node
   2. If node == token:
      2.1. Generate implied end tags (no-op, current node doesn't have
           an impliable end tag).
      2.2. If current node != token: n/a
      2.3. Pop node.
           Abort.

I guess that's mildly more complicated than necessary, but it's hardly 
"complicated steps". Still, UAs can trivially optimise it by adding:

   If current node == token:
      Pop node. Abort.

...to the top of the algorithm, without affecting black box conformance in 
any way.


> It seems to me that the whole purpose of the complication (searching 
> stack first and then batch-popping instead of popping as the search 
> proceeds) is to give on error about premature end tag instead of giving 
> many error one per each unclosed element.

Partially, but it's also to avoid the bug your code has:

> >                         if (isCurrent(name)) {
> >                             pop();
> >                             return;
> >                         }
> >                         for(;;) {
> >                             generateImpliedEndTags();
> >                             if (isCurrent(name)) {
> >                                 pop();
> >                                 return;
> >                             }
> >                             StackNode<T> node = stack[currentPtr];
> >                             if (!(node.scoping || node.special)) {
> >                                 err("Unclosed element \u201C" + node.name
> >                                         + "\u201D.");
> >                                 pop();
> >                             } else {
> >                                 err("Stray end tag \u201C" + name
> >                                         + "\u201D.");
> >                                 return;
> >                             }
> >                         }

What does your code do with this?:

   <div><p>Hello</x> World

I tried testing it with parsetree.validator.nu but it failed more than I 
expected:

   http://parsetree.validator.nu/?doc=http%3A%2F%2Fjunkyard.damowmow.com%2F323&submit=Print+Tree

However, from reading the code above, it looks like your code will close 
the <p>. It shouldn't close anything unless a tag is matched.

-- 
Ian Hickson               U+1047E                )\._.,--....,'``.    fL
http://ln.hixie.ch/       U+263A                /,   _.. \   _\  ;`._ ,.
Things that are impossible just take longer.   `._.-(,_..'--(,_..'`-.;.'
Received on Saturday, 24 May 2008 09:04:04 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Wednesday, 9 May 2012 00:16:17 GMT