Remove eager querying of image-rendering property in <canvas>.

Before this change, it was possible for any canvas 2d draw call to
result in style recalculation because the lazy initialization of canvas
resource providers would query the 'image-rendering' CSS property to
determine whether the canvas backing use bilinear filtering when
presented to screen.  This was a problem because style recalc sometime
results in the allocation of objects on the v8 heap, which is
incompatible with Fast API call.

The solution implemented in this CL is to rely solely on
"StyleDidChange" notifications to track the image-rendering property,
which is sufficient to unambiguously determine the right filtering mode
at any time.  To make this work, HTMLCanvasElement now has to track the
property internally to ensure that its value can be retrieved without
querying the style framework when it is time to to lazily allocate a
CanvasResourceProvider.  OffscreenCanvas was already doing something
similar so the filter_quality state was moved up to the common base
class CanvasResourceHost so the implementation can be shared between
OffscreenCanvas and <canvas>.

This fixes a DCHECK failure cause by illegal V8 allocations during fast
API calls.

BUG=1185479

Change-Id: Ib6a2e6d0465264c398bca7660f570f51bf19dd30
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2744456
Commit-Queue: Justin Novosad <junov@chromium.org>
Auto-Submit: Justin Novosad <junov@chromium.org>
Reviewed-by: Juanmi Huertas <juanmihd@chromium.org>
Cr-Commit-Position: refs/heads/master@{#861588}
7 files changed
tree: 50865d434317139ae2995cb72ca845022e678e49
  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. codelabs/
  14. components/
  15. content/
  16. courgette/
  17. crypto/
  18. dbus/
  19. device/
  20. docs/
  21. extensions/
  22. fuchsia/
  23. gin/
  24. google_apis/
  25. google_update/
  26. gpu/
  27. headless/
  28. infra/
  29. ios/
  30. ipc/
  31. jingle/
  32. media/
  33. mojo/
  34. native_client_sdk/
  35. net/
  36. pdf/
  37. ppapi/
  38. printing/
  39. remoting/
  40. rlz/
  41. sandbox/
  42. services/
  43. skia/
  44. sql/
  45. storage/
  46. styleguide/
  47. testing/
  48. third_party/
  49. tools/
  50. ui/
  51. url/
  52. weblayer/
  53. .clang-format
  54. .clang-tidy
  55. .eslintrc.js
  56. .git-blame-ignore-revs
  57. .gitattributes
  58. .gitignore
  59. .gn
  60. .vpython
  61. .vpython3
  62. .yapfignore
  63. AUTHORS
  64. BUILD.gn
  65. CODE_OF_CONDUCT.md
  66. codereview.settings
  67. DEPS
  68. DIR_METADATA
  69. ENG_REVIEW_OWNERS
  70. LICENSE
  71. LICENSE.chromium_os
  72. OWNERS
  73. PRESUBMIT.py
  74. PRESUBMIT_test.py
  75. PRESUBMIT_test_mocks.py
  76. README.md
  77. 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.

To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.

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.