2015-05-25 40 views
156

Google Chrome nie odświeża elementów ułatwień dostępu (AutomationElement), gdy użytkownik przewija przeglądarkę w dół.Google Chrome - problem z pamięcią podręczną drzewa z automatyczną obsługą interfejsu użytkownika

Aby odtworzyć go:

  1. Włącz dostęp renderujący z: "chrome --force-render-accessibility" lub poprzez ustawienie na globalnej dostępności na "chrome://accessibility".
  2. idź do http://en.wikipedia.org/wiki/Google
  3. Otwarte inspect.exe w trybie UI Automation (z systemem Windows Kits), poszukaj "Linki do artykułów powiązanych" element.
  4. Wracaj do Chrome, W dół, aż „Odnośniki do artykułów powiązanych” na dno jest widoczne
  5. „Linki do artykułów powiązanych” elementu jest oznaczony wyłączyć ekran

znalazłem kilka ręcznych rozwiązań które mogą wymusić Chrome, aby odświeżyć go:

  1. zoom do 90%, a następnie ustawić go z powrotem do 100% (bardzo brzydki sposób)
  2. Przełącznik accessibil ity off następnie włączyć w chrome://accessibility/

Co szukam jest zdolność do wykonaj jedną z tych operacji programowo lub jakakolwiek operacja, która może sprawić, Chrome odświeżyć swoje drzewo cache.


Co próbowałem:

  • okno Resize z PInvoke/MoveWindow
  • przerysować Okno z PInvoke/Redrawwindow
  • Budowanie rozszerzenie Chrome i siły powiększenia do 100% na żądanie: chrome.tabs.setZoom(null, 0); (praca ale migaj i zwalniaj okno)

Żadne z nich nie działa poprawnie.

EDIT: Przetestowano w Google Chrome 40.XX, 41.XX, 42.XX, 43.XX, 44.XX, 45.XX, 46.XX, 47.XX.Dev, 48.XX. Dev pod Windows 7.

+13

Powinieneś zgłosić to błędowi dostępności chromu w systemie Windows: https://code.google.com/p/chromium/issues/list?q=Cr%3DUI-Accessibility+os%3Dwindows –

+5

Czy możesz udostępnić pewne informacje na temat co próbujesz zrobić po rozwiązaniu problemu? może jest obejście ... – DoronG

+0

@ Ksv3n proszę wysłać link do błędu, który wysłałeś –

Odpowiedz

-1

Architektura wieloprocesowa Chrome różni się od każdej innej przeglądarki. Ze względów bezpieczeństwa główny interfejs przeglądarki jest w jednym procesie, a strony internetowe są uruchamiane w oddzielnych procesach renderowania (zwykle jedna na kartę). Procesy renderowania są jedynymi z reprezentacją DOM strony, a zatem wszystkich informacji o dostępności, ale procesy renderer nie są wyraźnie dozwolone do interakcji z systemem operacyjnym (wysyłanie lub odbieranie zdarzeń lub wiadomości) - w szczególności renderer procesy nie mogą wysyłać ani odbierać zdarzeń dostępności.

1

Przewijanie w prostych stronach jest zoptymalizowane, aby nie wymagać obliczania z renderera. Do przewijania potrzebny jest tylko compositor i GPU, dlatego drzewo renderowania, które jest aktualizowane tylko z renderera, jest wciąż takie samo.

Wymaganie renderera do przechodzenia przez DOM i aktualizowania drzewa dostępności podczas przewijania działa wbrew kilkunastoletniemu wysiłkowi polegającemu na płynnym przewijaniu, specjalnie dla urządzeń dotykowych, więc nie sądzę, aby uzyskać przyczepność do błędu naprawić.

Twój pomysł na przedłużenie uważam za najlepszy (choć brzydki) kompromis. Ale zamiast tego zmieniającego się zoomu lepszym rozwiązaniem może być niewielka mutacja strony (lub DOM). Spróbuj na przykład dodać element niewidoczny (lub prawie taki) z niską kolejnością. Będziesz także musiał kontrolować mutację, tak aby zdarzyła się tylko 1 razy na sekundę, a nawet rzadziej.

+0

Łamanie dostępu, gdy jest jawnie zadawane w konfiguracji lub parametrach, w nazwie tłumienia przewijania wydaje się złe. – manuell

+1

@manuell, dlatego istnieją rozszerzenia. Kiedy priorytety działają wbrew priorytetom przeglądarki, możesz przejąć. Twój klient instalujący sygnał rozszerzenia zgadza się z Tobą, a nie z zespołem Chrome. – AlienRancher