Do not store self-invalidation sets for classes.

This saves a lot of memory for sites with lots of simple class
selectors, at the cost of self-invalidation for any element that
gets a class added or removed. Note in particular that adding or
removing a style sheet then self-invalidates all DOM nodes that
have a class attribute.

We add a Bloom filter to mitigate this (inserting each such class
name into the Bloom filter), which should be 95% effective at
rejecting the spurious self-invalidations whenever we're below ~2000
such sets, but it will deteriorate if we have a lot of them.
To investigate this on the real web, we put this behind a new Finch
experiment called InvalidationSetClassBloomFilter, since it's
potentially a CPU/RAM tradeoff and we'd like to see exactly how
good/bad it is.

Style perftest, PartitionAlloc memory:

  ECommerce       1388 →  1371 kB (  -17 kB)
  Encyclopedia    6403 →  6259 kB ( -144 kB)
  Extension       6145 →  6141 kB (   -4 kB)
  News            3866 →  3803 kB (  -63 kB)
  Search          1880 →  1763 kB ( -117 kB)
  Social1         5606 →  4589 kB (-1017 kB)
  Social2          488 →   453 kB (  -35 kB)
  Sports          3713 →  3325 kB ( -388 kB)
  Video          11191 → 11058 kB ( -133 kB)

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

If you found a bug, please file it at https://crbug.com/new.