Fix layer/phase violation of custom scrollbar painting

TL;DR, with this CL:
- We no longer update custom scrollbar part position during paint;
- We avoid unnecessary ScheduleAnimation when painting custom
  scrollbars;
- CustomScrollbar::*Rect() methods no longer have side effects;
- Some FIXMEs are fixed.

Details:

Previously LayoutCustomScrollbarPart::FrameRect() stored different
values at different document lifecycle stages:

- Before paint, its location was always zero, and the size was not the
actual size for some parts, but the minimum size calculated from the
style, not based on layout, though updated in UpdateLayout().
UpdateLayout() was called not during layout (as a scrollbar part is
not in the layout tree), but anytime we wanted the minimum size from
const methods of CustomScrollbar.

- During paint, as the FrameRect() calculated during UpdateLayout was
not the real frame rect, we updated the frame rect to make sure they
would be painted correctly. This caused unnecessary
SetShouldCheckForPaintInvalidation when the FrameRect changed and
unnecessary ScheduleAnimation().

This CL contains the following changes:
- Removes LayoutCustomScrollbarPart::UpdateLayout().
  Adds ComputeThickness() and ComputeLength(), and lets Margin*() get
  style directly, to replace the original UpdateLayout() (which called
  SetSize()/SetMargin*()) + Size()/Margin*() in the const methods of
  CustomScrollbar. This removes the dependency of the const methods
  on the temporary incorrect FrameRect().

- Adds CustomScrollbar::PositionScrollbarParts() to set the correct
  FrameRect() for scrollbar parts. It's called from several places that
  position of scrollbar parts can change. This replaces the Set* called
  from CustomScrollbarTheme::Paint*.

Bug: 856802
Change-Id: I5b120294a31a7f91831441cb361adfd27aefa44e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2167602
Reviewed-by: Philip Rogers <pdr@chromium.org>
Commit-Queue: Xianzhu Wang <wangxianzhu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#771890}
15 files changed
tree: 11c65b1d1363c308ef3bade92773b6ea35fc32a5
  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.