a11y: Make handling of device scale factor consistent

This patch fixes several issues that were causing problems with
accessibility hit testing and bounding rectangles when device scale
factor was something other than 1, for example on a high-DPI monitor.

In making these changes I'm adopting Blink terminology for various
coordinate spaces:
http://www.chromium.org/developers/design-documents/blink-coordinate-spaces

- Device scale factor: Blink will apply device scale factor either at
the transition from screen coordinates to physical pixels, or at the
transition from CSS pixels to document pixels, depending on whether
use-zoom-for-dsf is enabled. By contrast, Views will always apply device
scale factor at the transition from screen coordinates to physical
pixels in order to present UI in device-independent pixels. For
accessibility this means that at the node level, application of device
scale factor must be handled at the delegate level. That in turn means
that callers of AXPlatformNodeDelegate must pass and receive values in
physical pixels.

- Windows: There may be flags to control what Windows platform APIs
report and expect, but it appears that in our configuration the answer
is always "physical pixels" regardless of monitor DPI. Platform API
implementations have been adjusted to reflect this fact.

- Also on Windows, when retrieving view bounds from the render widget,
we were incorrectly always applying device scale factor regardless of
use-zoom-for-dsf feature state. Fixed the code to take feature state
into account and added an explanatory comment.

- I could not find any test coverage exercising various combinations of
device-scale-factor and use-zoom-for-dsf cross-platform -- all of the
existing tests run according to the host device's defaults. Added a test
to exercise these combinations independent of device configuration.

Bug: 1007488
Change-Id: If111a7ce3f60829bb9c69cc4d641b0d204409c4d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2117330
Reviewed-by: Dominic Mazzoni <dmazzoni@chromium.org>
Reviewed-by: Ian Prest <iapres@microsoft.com>
Reviewed-by: Scott Violet <sky@chromium.org>
Commit-Queue: Kevin Babbitt <kbabbitt@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#755358}
38 files changed
tree: e7b9948e63155e59c69dae25b4d92befbedc1281
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. cloud_print/
  13. components/
  14. content/
  15. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia/
  22. gin/
  23. google_apis/
  24. google_update/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. jingle/
  31. media/
  32. mojo/
  33. native_client_sdk/
  34. net/
  35. pdf/
  36. ppapi/
  37. printing/
  38. remoting/
  39. rlz/
  40. sandbox/
  41. services/
  42. skia/
  43. sql/
  44. storage/
  45. styleguide/
  46. testing/
  47. third_party/
  48. tools/
  49. ui/
  50. url/
  51. weblayer/
  52. .clang-format
  53. .clang-tidy
  54. .eslintrc.js
  55. .git-blame-ignore-revs
  56. .gitattributes
  57. .gitignore
  58. .gn
  59. .vpython
  60. .vpython3
  61. .yapfignore
  62. AUTHORS
  63. BUILD.gn
  64. CODE_OF_CONDUCT.md
  65. codereview.settings
  66. DEPS
  67. ENG_REVIEW_OWNERS
  68. LICENSE
  69. LICENSE.chromium_os
  70. OWNERS
  71. PRESUBMIT.py
  72. PRESUBMIT_test.py
  73. PRESUBMIT_test_mocks.py
  74. README.md
  75. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure .

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.