RFR: JDK-8186466: Fix accessibility and other minor issues in java.base

Jonathan Gibbons jonathan.gibbons at oracle.com
Sat Aug 19 16:10:04 UTC 2017

On 8/18/17 6:35 PM, Martin Buchholz wrote:
> Thanks as usual for the modern html lessons.  Looks good.
> Things I wonder about:
> - I expected to find scope= attributes in BlockingDeque.java tables. 
> TIL about colgroup and rowgroup.  (or does headers=... make that 
> redundant?)
> - I see "font-style: italic" but that seems rather low-level and I 
> expected something higher level.
> - I was surprised by
> 178 * <th id="peek" style="font-weight:normal; text-align:left">{@link 
> #peek() peek()}</th>179 * <td headers="Examine BDeque peek">{@link 
> #peekFirst() peekFirst()}</td>
> because these two cells are "parallel" and so I expected them to have 
> similar definitions.  I can see they are "related" and the headers= 
> makes that clear, but it still feels slightly wrong to make one of 
> them a <th> and the other a <td>.

Hi Martin,

We're dealing with the intersection of rules and standards here. I 
personally agree with your queasiness about the distinction between 
th/td for "similar" cells but ...

The general intent is that every data cell (td) in a table has to 
identify the header cells (th) that provide details about the row and 
column in which that data cell appears. This implies that every column 
has header cells that describe the column and that every row has header 
cells that define the row. There's also an implication of uniqueness. 
The header cells for each row/column in the table must be unique.

There are two alternative ways to associate data cells with header cells.

1. The "easiest" way, for most tables, is to put scope={row,col} etc on 
the header cells.
2. The more flexible way, for complex tables, is to put id= on header 
cells and headers="list-of-ids" on data cells.

In HTML 4, the rules were more lax about the distinction between header 
cells and data cells. In HTML 5, the rules are more strict. In HTML, you 
can only put scope=row|col on a header (th) cell, and the headers 
attribute on a data cell (td) can only refer to ids on header cells 
(th). This is the reason that so many tables throughout these changes 
have had data cells converted to header cells, which in turn leads to 
using styles to get/retain the desired visual presentation.

Now for BlockingDequeue, as here:
It's really two tables in one: an upper table, for "First Element 
(Head)" and a lower table, for "Last Element (Tail)". It's not a 
candidate for using the scope attribute because of the split nature of 
the table. With reference to a similarly structured table elsewhere in 
the API, I was advised by an expert in Oracle's Accessibility Office 
that some screen readers would read all the column headers for a cell, 
and not just those that might visually seem to be applicable. So, with 
the simple solution ruled out, there were 3 possibilities for this table.

1. Split it into two tables. That might work OK for this table, because 
of the similar content, but the general problem of using distinct tables 
is that to have the tables use the same widths, you generally have to 
fix the widths, as compared to letting the tables be sized 
automatically. If you don't specify widths, the tables will generally 
end up with different geometries leading to unaligned columns and/or a 
ragged right edge.

2. Move the subheaders (the First Element and Last Element cells) to a 
new column on the left, with appropriate rowspan attributes, and remove 
the second row of the italic headings. Then, the table becomes simple 
enough to use scope=row|col, at the cost of making the table wider. That 
would probably work in this case, but it would conflict with the pattern 
of Insert/Remove/Examine cells in the first column, as in other tables 
in related classes.

3. Use the headers attribute instead of the scope attribute. Although it 
leads to more complex markup, it has the advantage of preserving the 
authors' original layout.

As for your comment about using style="font-weight:italic"... You say it 
seems low level and you expected something higher level. In this case, 
the higher level you are looking for is that the enclosing HTML tag was 
changed from <td> to <th>. But "unfortunately", the default style for a 
<th> is bold text, and so I changed it to italic using a style 
attribute, to preserve the original presentation. It would be wrong to 
use <i> (See https://www.w3.org/International/questions/qa-b-and-i-tags 
) and somewhat wrong to use <em> because that would indicate that these 
headings are to be emphasized more than other headings. If the entire 
page was a standalone HTML document, this would be a classic use of a 
table-specific style, setting an id on the table node, and then 
providing out-of-line style info in either a <style> node in the <head>, 
or in an associated stylesheet. With such a mechanism, we could "move" 
all style declarations out of the flow of semantic content ... which is 
the way that HTML5 is intended to be used. But this is javadoc, and we 
don't (yet) have any such ability, although you can be sure that it has 
triggered discussions about how we can improve the use of styles in 
javadoc comments.

As an aside, I note that there are some places in the W3C website that 
hint at the possibility of being able to use <style> anywhere, and not 
just in <head>. Were that true, that would be wonderful and would 
simplify the use of styles in javadoc comments. My best guess is that 
this was considered in early versions of HTML5, and is even supported by 
some browsers, but our general rule is to follow the rules in the 
official W3C specification of HTML, and not any examples in wiki pages 
or tutorials.

Back on BlockingDequeue, if you would prefer me to change the code to 
use one of the other options (1,2,3) listed above, I will do so.

-- Jon

More information about the core-libs-dev mailing list