Problème de cache d’arborescence accessible dans Google Chrome avec UI Automation

Google Chrome n’actualise pas les éléments d’accessibilité ( AutomationElement ) lorsqu’un utilisateur défile dans le navigateur.

Pour le reproduire:

  1. Activer l’accessibilité du rendu avec: "chrome --force-render-accessibility" ou en définissant Global Accessibility sur "chrome://accessibility" .
  2. Allez à http://en.wikipedia.org/wiki/Google
  3. Ouvrez inspect.exe en mode UI Automation (à partir des kits Windows), recherchez l’élément «Liens vers des articles connexes».
  4. Revenez à Chrome, faites défiler la liste jusqu’à ce que “Liens vers des articles connexes” en bas soit visible
  5. L’élément “Liens vers des articles connexes” est marqué hors écran

J’ai trouvé des solutions manuelles qui peuvent forcer Chrome à le rafraîchir:

  1. Réglez le zoom sur 90%, puis réglez-le sur 100% (très très laid)
  2. Désactivez l’accessibilité, puis activez-la dans chrome://accessibility/

Ce que je recherche, c’est la possibilité d’effectuer l’une de ces opérations par programme, ou toute opération permettant à Chrome d’actualiser son arborescence de cache.


Ce que j’ai essayé:

  • Redimensionner la fenêtre avec PInvoke/MoveWindow
  • Redessiner la fenêtre avec PInvoke/Redrawwindow
  • Construisez une extension chrome et forcez le zoom à 100% à la demande: chrome.tabs.setZoom(null, 0); (fonctionne mais clignote et ralentit la fenêtre)

Aucun d’entre eux ne fonctionne correctement.

EDIT : Testé avec Google Chrome 40.XX, 41.XX, 42.XX, 43.XX, 44.XX, 45.XX, 46.XX, 47.XX.Dev, 48.XX.Dev sous Windows 7.

    Le défilement dans des pages simples est optimisé pour ne pas nécessiter de calcul à partir du rendu. Seuls le compositeur et le GPU sont nécessaires pour faire défiler. L’arborescence de rendu qui est uniquement mise à jour à partir du rendu est toujours la même.

    Obliger le moteur de rendu à traverser le DOM et à mettre à jour l’arborescence de l’accessibilité pendant un défilement est contraire aux nombreuses années de défilement régulier, spécialement pour les périphériques tactiles.

    Je pense que votre idée d’une extension est le meilleur compromis (bien que laid). Mais plutôt que de changer de zoom, faire une petite mutation de la page (ou DOM) pourrait être une meilleure solution. Essayez par exemple d’append un élément invisible (ou presque) avec un ordre z faible. Vous devrez également évaluer le contrôle de la mutation pour qu’elle ne se produise qu’une fois par seconde ou même moins souvent.

    L’architecture multi-processus de Chrome est différente de celle de tout autre navigateur. Pour des raisons de sécurité, l’interface utilisateur du navigateur principal est en un seul processus et les pages Web sont exécutées dans des processus de rendu distincts (généralement un par onglet). Les processus de rendu sont les seuls à représenter le DOM de la page Web et, par conséquent, toutes les informations d’accessibilité, mais les processus de rendu ne sont pas autorisés à interagir avec le système d’exploitation (envoi ou réception d’événements ou de messages). les processus ne peuvent pas envoyer ou recevoir des événements d’accessibilité.