Ir para o conteúdo

Blogue ·

Uma exceção de acessibilidade que se mede

Um verificador de acessibilidade acaba sempre numa lista de exceções. A nossa tem duas, cada qual com a sua medição, e a execução falha se deixarem de encaixar.

Por Provibr

Aponte um verificador automático de acessibilidade a um produto a sério e obtém um número. Corrija tudo o que ele encontrou e obtém um número menor. Algures nesse processo vai encontrar uma constatação que genuinamente não é um defeito e, nesse momento, escreve a sua primeira exceção.

É essa a parte interessante, porque uma lista de exceções é onde um programa de acessibilidade morre em silêncio. Começa com duas entradas bem argumentadas. Um ano depois tem onze, três das quais já não encaixam em nada, uma das quais esconde um problema real, e ninguém consegue lembrar-se porque é que alguma delas lá está. O relatório diz zero e não quer dizer nada.

Construímos o verificador do nosso painel este mês. Não comunica constatação nenhuma, em nenhum grau de gravidade, e este texto é sobretudo sobre a razão pela qual não acreditamos nesse número por si só.

Três regras vinham desligadas de origem, e duas escondiam constatações

A biblioteca que usamos vem com algumas regras desativadas por predefinição. Verificámos quais, perguntando-lhe em vez de assumir: divergência entre nome e conteúdo, células de tabela sem cabeçalho e tamanho do alvo vêm todas desligadas de origem.

Duas delas produziram constatações reais no nosso painel, 36 no conjunto, incluindo os dois pontos que uma ronda anterior tinha deixado em aberto. Um verificador a correr o conjunto de regras predefinido fica portanto verde exatamente nas falhas que alguém já tinha ido procurar, o que é o pior tipo de verde: é indistinguível de um produto que está bem.

Foram ligadas explicitamente, e essa única decisão mudou a linha de base mais do que qualquer outra opção de configuração.

Nove idiomas, porque um idioma é uma moeda ao ar

O seletor de idioma no nosso cabeçalho mostra um código de duas letras e tem um nome acessível que diz qual é o idioma. Em inglês o botão diz EN e chama-se «Language: English», e a regra passa, porque en calha aparecer dentro de English.

Em neerlandês falha. O mesmo componente, o mesmo código, a mesma marcação.

Medido em todos os nove idiomas que publicamos: três falham e seis passam, e cada um desses seis passa por coincidência: en dentro de English, de dentro de Deutsch, fr dentro de Français, it dentro de Italiano, es dentro de Español, ro dentro de Română. Testar um idioma aqui é um verde vazio.

Por isso o percurso de marketing corre todos os idiomas nas regras cujo resultado pode depender do idioma. Custa tempo e é a única forma de essa constatação existir.

A linha de base, e de que era feita

A primeira execução completa sobre o marketing, a autenticação e o painel autenticado comunicou 3 críticas, 51 graves, 72 moderadas e 6 menores. Oito regras respondiam por tudo isso.

RegraConstatações
conteúdo fora de um landmark60
divergência entre nome e conteúdo33
contraste de cor13
sem landmark principal9
cabeçalho de tabela vazio6
região com deslocamento sem foco5
célula de tabela sem cabeçalho3
ordem dos títulos3

Quase tudo era estrutural e não visual. As páginas de autenticação e o painel não tinham elemento main nem ligação de salto. As tabelas dos artigos tinham cabeçalhos vazios. Os blocos de código deslocam-se na horizontal e não podiam ser alcançados pelo teclado, o que significa que quem usa teclado simplesmente não consegue ler o lado direito de um comando comprido. O separador das estatísticas punha o título de um gráfico no nível errado por baixo do título da página.

Depois das reparações: zero, zero, zero, zero. O que nos devolve à pergunta de quanto vale esse zero.

Duas exceções, cada uma com uma medição

A lista de exceções tem exatamente duas entradas, e cada uma delas transporta uma razão e uma medição que foi realmente feita.

Contraste de cor com cores forçadas. Correr o painel com as cores forçadas ativas produziu 610 falhas de contraste em doze páginas. Isso não é um defeito do produto, é uma interação entre o verificador e o navegador. O verificador lê -webkit-text-fill-color antes de color, e o Chrome não força o primeiro. Na página de autenticação, no mesmo título, no mesmo carregamento de página:

propriedadenormalcores forçadas
colorrgb(16, 19, 25)rgb(255, 255, 255)
-webkit-text-fill-colorrgb(16, 19, 25)rgb(16, 19, 25)
fundo da páginargb(244, 246, 248)rgb(0, 0, 0)

Ou seja, compara o primeiro plano escrito pelo autor contra o fundo forçado e comunica 1,12 para 1 onde o ecrã mostra na realidade 21 para 1. Nesse modo o requisito de contraste não se aplica de qualquer maneira, porque a paleta pertence ao utilizador.

A regra está desligada nesse único modo, e a razão é medida de novo em cada execução. Se o Chrome ou o verificador corrigirem isto, essa autoverificação falha e a exceção tem de voltar a ser argumentada. Uma exceção sem autoverificação é uma lista de permissões silenciosa.

O botão da conta. A regra da divergência entre nome e conteúdo dispara no botão do menu de utilizador do painel. Seis nomes acessíveis candidatos foram colocados no botão verdadeiro e a regra foi corrida contra cada um. Só passa quando o nome contém literalmente a cadeia DKDemo Klant€0.00, na qual as iniciais e o nome da conta ficaram colados, e falha com esse mesmo texto espaçado como DK Demo Klant €0.00, e com o nome verdadeiro. Os três filhos daquele botão estão todos escondidos da tecnologia de apoio, coisa que a regra ignora.

Passar significaria portanto um leitor de ecrã a anunciar DKDemo como uma só palavra. Isso é um botão pior, adotado para satisfazer uma regra que a própria biblioteca marca como experimental e entrega desativada. O requisito funcional está cumprido: quem usa controlo por voz diz «Demo Klant», e isso está no nome.

A exceção que morreu sem dizer nada

Esta é a parte que justifica o artigo inteiro.

Uma exceção tem de reconhecer o elemento a que se aplica. O seletor CSS do próprio verificador não é suficientemente estável para isso: o mesmo botão de conta era identificado de uma maneira numa página e de outra na página seguinte, portanto uma exceção que encaixa no seletor cobre uma página e não a outra. Em vez disso, a exceção encaixa num atributo marcador que o próprio componente define, no fragmento de HTML do elemento.

O fragmento que o verificador comunica é truncado aos 140 caracteres.

O rótulo acessível do botão cresceu, porque lhe foi acrescentado o saldo da conta. O marcador deslizou para lá da fronteira dos 140 caracteres. O fragmento passou a terminar em ... Credit €0.00." data-us. A exceção deixou de encaixar em coisa nenhuma, em silêncio, e a execução comunicou 27 constatações graves que tinha coberto na execução anterior.

Nada nessa falha é ruidoso. A exceção não deu erro, a lista não encolheu, nenhuma configuração mudou. Uma alteração de interface numa funcionalidade sem relação deslocou uma cadeia de texto, e uma peça de infraestrutura de segurança deixou de funcionar. A correção é encaixar contra a etiqueta de abertura não truncada, que o verificador também fornece.

A lição geral é maior do que a acessibilidade: tudo o que encaixa contra texto truncado é uma salvaguarda que falha exatamente no momento em que alguma coisa muda, que é o único momento em que era precisa.

Uma exceção que não encaixa em nada faz a execução falhar

Todas as entradas são contadas. Se uma execução completa terminar com uma exceção que foi acionada zero vezes, a execução fica vermelha.

É a mesma forma que uma lista de constantes noutro ponto deste código, e pela mesma razão: uma exceção que já não cobre nada deve ser apagada e não deixada de pé. Deixada de pé, é mais uma linha sobre a qual a pessoa seguinte tem de raciocinar, e acaba por deixar de ser lida de todo.

A contagem só se aplica a uma execução completa. Restrinja a execução a um percurso ou a um modo e «não acionada» não quer dizer nada.

Provar que um zero é um zero verdadeiro

O tamanho do alvo, o requisito de que um controlo tem pelo menos 24 por 24 pixels, é uma das três regras que a biblioteca entrega desativadas. Ligámo-la e escrevemos ao lado uma segunda medição nossa, porque as duas exceções que a própria norma concede têm de ser medidas e não presumidas. A execução final examinou 2056 alvos. 155 ficavam abaixo do tamanho. 70 desses caíam na exceção de texto corrido da norma, ou seja, o alvo está dentro de uma frase, e 85 na exceção de espaçamento, ou seja, um círculo de 24 pixels à volta dele não toca em mais nada. Sobrou zero.

Um zero vindo de uma sonda escrita por nós próprios não se distingue de uma sonda que não consegue comunicar coisa nenhuma. Por isso um script separado injeta um botão de 16 por 16 pixels ao lado de um vizinho numa página em funcionamento e corre este mesmo texto de sonda, lido do ficheiro de origem em vez de copiado, sobre ele. Passa de 0 para 1 e nomeia o elemento. O caminho de comunicação funciona, portanto o zero é um resultado e não silêncio.

As duas exceções da norma são medidas e não adivinhadas. Texto corrido significa que o valor calculado de apresentação é exatamente inline e que o antepassado de bloco mais próximo contém também outro texto, que é o que «está dentro de uma frase» realmente quer dizer. Isso não é uma lista de nomes de classes. E o teste de espaçamento mede o círculo contra os retângulos dos outros alvos e não contra os seus círculos, o que é mais estrito do que a norma: pode produzir um vermelho falso, nunca um verde falso.

O que uma máquina não consegue fazer

Existe um pequeno manual de quatro portas que precisam de uma pessoa, porque são as coisas a que nenhum verificador chega: se a ordem de leitura faz sentido e um anúncio chega mesmo, se um percurso é fazível só com o teclado e não apenas alcançável, se a disposição continua legível a 200 por cento e não apenas cabe, e se o ecrã continua a querer dizer alguma coisa na paleta do próprio utilizador.

Essas quatro estão em aberto. Dizê-lo faz parte do argumento: um relatório que diz zero e não diz aquilo para que não olhou é a mesma falha que uma exceção sem medição.

O que registaríamos

  1. Perguntar à biblioteca que regras estão desligadas, não assumir. As desativadas eram onde estavam as nossas constatações.
  2. Correr todos os idiomas que se publicam em qualquer regra cujo resultado possa depender do texto.
  3. Dar a cada exceção uma razão e uma medição, escritas onde a exceção vive.
  4. Fazer com que uma exceção que não encaixa em nada faça a execução falhar.
  5. Nunca encaixar uma salvaguarda contra texto truncado.
  6. Provar os zeros injetando alguma coisa que devia ser apanhada.
  7. Publicar aquilo que uma máquina não consegue verificar, para que o número seja lido pelo que é.

O mesmo instinto, aplicado às traduções em vez da marcação, está em dezasseis mil chaves em nove idiomas.

Do trabalho de painel no Provibr.

Comece com um host e um agente

Crie uma conta, instale o agente com um único comando e ligue o seu primeiro host Proxmox. O período experimental dura 14 dias e não pede quaisquer dados de pagamento.