| # Copyright (c) 2014 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import os |
| import logging |
| import time |
| |
| from autotest_lib.client.bin import test |
| from autotest_lib.client.bin import utils |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.common_lib.cros import chrome |
| |
| |
| class accessibility_Sanity(test.test): |
| """Enables then disables all a11y features via accessibilityFeatures API.""" |
| version = 1 |
| |
| # Features that do not have their own separate tests |
| _FEATURE_LIST = [ |
| 'largeCursor', |
| 'stickyKeys', |
| 'highContrast', |
| 'screenMagnifier', |
| 'autoclick', |
| 'virtualKeyboard' |
| ] |
| |
| # ChromeVox extension id |
| _CHROMEVOX_ID = 'mndnfokpggljbaajbnioimlmbfngpief' |
| |
| def _set_feature(self, feature, value): |
| """Set given feature to given value using a11y API call. |
| |
| @param feature: string of accessibility feature to change |
| @param value: boolean of expected value |
| """ |
| value_str = 'true' if value else 'false' |
| cmd = ''' |
| window.__result = null; |
| chrome.accessibilityFeatures.%s.set({value: %s}); |
| chrome.accessibilityFeatures.%s.get({}, function(d) { |
| window.__result = d[\'value\']; |
| }); |
| ''' % (feature, value_str, feature) |
| self._extension.ExecuteJavaScript(cmd) |
| |
| poll_cmd = 'window.__result == %s;' % value_str |
| utils.poll_for_condition( |
| lambda: self._extension.EvaluateJavaScript(poll_cmd), |
| exception = error.TestError( |
| 'Timeout while trying to set %s to %s' % |
| (feature, value_str))) |
| |
| def _confirm_chromevox_indicator(self, value): |
| """Fail test unless indicator presence is given value on self._tab.""" |
| poll_cmd = ''' |
| document.getElementsByClassName("cvox_indicator_container").length; |
| ''' |
| def _poll_function(): |
| if value: |
| return self._tab.EvaluateJavaScript(poll_cmd) > 0 |
| else: |
| return self._tab.EvaluateJavaScript(poll_cmd) == 0 |
| |
| utils.poll_for_condition( |
| _poll_function, |
| exception=error.TestError('ChromeVox: "Indicator present" ' |
| 'was not %s.' % value)) |
| |
| def _confirm_chromevox_enabled(self, value): |
| """Fail test unless management.get.enabled is given value.""" |
| cmd = ''' |
| window.__enabled = false; |
| chrome.management.get( |
| '%s', function(r) {window.__enabled = r[\'enabled\']}); |
| ''' % self._CHROMEVOX_ID |
| self._extension.ExecuteJavaScript(cmd) |
| |
| poll_cmd = 'window.__enabled;' |
| utils.poll_for_condition( |
| lambda: self._extension.EvaluateJavaScript(poll_cmd) == value, |
| exception=error.TestError( |
| 'ChromeVox: management.get.enabled not %s.' % value)) |
| |
| def _check_chromevox(self): |
| """Run ChromeVox specific checks. |
| |
| Check result of management.get.enabled before/after enable and |
| for presence of indicator before/after disable. |
| """ |
| # Check for ChromeVox running in the background. |
| self._confirm_chromevox_enabled(False) |
| self._set_feature('spokenFeedback', True) |
| time.sleep(1) |
| self._confirm_chromevox_enabled(True) |
| |
| # Check for presence of ChromeVox indicators. |
| self._confirm_chromevox_indicator(True) |
| self._set_feature('spokenFeedback', False) |
| self._tab.Navigate(self._url) # reload page to remove old indicators |
| self._confirm_chromevox_indicator(False) |
| |
| def run_once(self): |
| """Entry point of this test.""" |
| extension_path = os.path.join(os.path.dirname(__file__), 'a11y_ext') |
| |
| with chrome.Chrome(extension_paths=[extension_path], |
| is_component=False) as cr: |
| self._extension = cr.get_extension(extension_path) |
| |
| # Open test page. |
| self._tab = cr.browser.tabs[0] |
| cr.browser.SetHTTPServerDirectories( |
| os.path.join(os.path.dirname(__file__))) |
| page_path = os.path.join(self.bindir, 'page.html') |
| self._url = cr.browser.http_server.UrlOf(page_path) |
| self._tab.Navigate(self._url) |
| |
| # Check specific features. |
| self._check_chromevox() |
| |
| # Enable then disable all other accessibility features. |
| for value in [True, False]: |
| for feature in self._FEATURE_LIST: |
| logging.info('Setting %s to %s.', feature, value) |
| self._set_feature(feature, value) |
| time.sleep(1) |