Problema no cache da árvore acessível do Google Chrome com a UI Automation

154

O Google Chrome não atualiza elementos de acessibilidade ( AutomationElement ) quando um usuário rola para baixo no navegador.

Para reproduzi-lo:

  1. Ative a acessibilidade do renderizador com: "chrome --force-render-accessibility"ou configurando Global Accessibility em "chrome://accessibility".
  2. Acesse http://en.wikipedia.org/wiki/Google
  3. Abra o inspect.exe no modo de automação da interface do usuário (no Windows Kits), procure o elemento "Links para artigos relacionados".
  4. Volte ao Chrome, role para baixo até que "Links para artigos relacionados" na parte inferior fique visível
  5. O elemento "Links para artigos relacionados" está marcado fora da tela

Encontrei algumas soluções manuais que podem forçar o Chrome a atualizá-lo:

  1. Defina o zoom para 90% e depois para 100% (muito, muito feio)
  2. Desligue a acessibilidade e ligue-a chrome://accessibility/

O que estou procurando é a capacidade de executar uma dessas operações programaticamente ou qualquer operação que possa fazer o Chrome atualizar sua árvore de cache.


O que eu tentei:

  • Redimensione a janela com PInvoke/MoveWindow
  • Redesenhar janela com PInvoke/Redrawwindow
  • Crie uma extensão do Chrome e force o zoom a 100% sob demanda: chrome.tabs.setZoom(null, 0);(funcionando, mas pisque e diminua a velocidade da janela)

Nenhuma delas está funcionando corretamente.

Edição : Testado com Google Chrome 40.XX, 41.XX, 42.XX, 43.XX, 44.XX, 45.XX, 46.XX, 47.XX.Dev, 48.XX.Dev no Windows 7.

Perfeito28
fonte
13
Você deve reportar isso ao bug de acessibilidade do chromium no Windows: code.google.com/p/chromium/issues/…
Simon Mourier
5
Você pode compartilhar algumas informações sobre o que está tentando fazer depois de resolver o problema? talvez haja uma solução alternativa ...
DoronG
@ Ksv3n poste o link do bug que você postou
Mauricio Gracia Gutierrez
@ Ksv3n Você já tentou fazer o mesmo teste em outro navegador? Firefox pode ser?
PseudoAj
@Emzor, obrigado por tentar fazer edições, mas evite fazer edições triviais para fazer com que os links pareçam "melhores". Às vezes, os links são mostrados melhor na íntegra para que o usuário possa copiá-lo e colá-lo, se necessário.
gitsitgo

Respostas:

1

A rolagem em páginas simples é otimizada para não exigir computação do renderizador. Somente o compositor e a GPU são necessários para rolar, portanto, a árvore de renderização que é atualizada apenas a partir do renderizador ainda é a mesma.

Exigir que o renderizador atravesse o DOM e atualize a árvore Acessibilidade durante uma rolagem é contrário ao esforço de vários anos de rolagem suave, especialmente para dispositivos sensíveis ao toque, para que eu não ache que você irá obter tração em uma correção de bug.

Sua idéia de uma extensão, eu acho, é o melhor (embora feio) compromisso. Mas, em vez disso, mudar o zoom, fazer uma pequena mutação na página (ou DOM) pode ser uma solução melhor. Tente, por exemplo, adicionar um elemento invisível (ou quase isso) com uma ordem z baixa. Você também precisará controlar a taxa de mutação, para que ela aconteça apenas uma vez por segundo ou com menos frequência.

AlienRancher
fonte
1
Quebrar a acessibilidade quando solicitado explicitamente na configuração ou nos parâmetros, em nome de uma rolagem mais lenta, parece ruim.
precisa saber é
1
@ manuell é por isso que existem extensões. Quando suas prioridades são contrárias às prioridades do navegador, você pode assumir o controle. Seu cliente que instala o sinal de extensão concorda com você e não com a equipe do Chrome.
precisa saber é o seguinte
-1

A arquitetura de múltiplos processos do Chrome é diferente da de qualquer outro navegador. Por segurança, a interface do usuário principal do navegador está em um processo e as páginas da Web são executadas em processos separados do renderizador (normalmente um por guia). Os processos do renderizador são os únicos com uma representação do DOM da página da web e, portanto, de todas as informações de acessibilidade, mas especificamente os processos do renderizador não podem interagir com o sistema operacional (enviando ou recebendo eventos ou mensagens) - em particular, o renderizador processos não podem enviar ou receber eventos de acessibilidade.

Rebecca Wright
fonte