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. .clang-format
  2. .clang-tidy
  3. .eslintrc.js
  4. .git-blame-ignore-revs
  5. .gitattributes
  6. .gitignore
  7. .gn
  8. .vpython
  9. .vpython3
  10. .yapfignore
  11. AUTHORS
  12. BUILD.gn
  13. CODE_OF_CONDUCT.md
  14. DEPS
  15. ENG_REVIEW_OWNERS
  16. LICENSE
  17. LICENSE.chromium_os
  18. OWNERS
  19. PRESUBMIT.py
  20. PRESUBMIT_test.py
  21. PRESUBMIT_test_mocks.py
  22. README.md
  23. WATCHLISTS
  24. android_webview/
  25. apps/
  26. ash/
  27. base/
  28. build/
  29. build_overrides/
  30. buildtools/
  31. cc/
  32. chrome/
  33. chromecast/
  34. chromeos/
  35. cloud_print/
  36. codereview.settings
  37. components/
  38. content/
  39. courgette/
  40. crypto/
  41. dbus/
  42. device/
  43. docs/
  44. extensions/
  45. fuchsia/
  46. gin/
  47. google_apis/
  48. google_update/
  49. gpu/
  50. headless/
  51. infra/
  52. ios/
  53. ipc/
  54. jingle/
  55. media/
  56. mojo/
  57. native_client_sdk/
  58. net/
  59. pdf/
  60. ppapi/
  61. printing/
  62. remoting/
  63. rlz/
  64. sandbox/
  65. services/
  66. skia/
  67. sql/
  68. storage/
  69. styleguide/
  70. testing/
  71. third_party/
  72. tools/
  73. ui/
  74. url/
  75. weblayer/
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.