[css-nesting] Add signaling rules to aid use-counting

The CSSWG wants to change a few things about how "bare declarations"
work. Instead of "shifting up" those declarations to the rule's main
declaration block, we want to treat them as wrapped by an &-rule,
except with parse-time expansion of selectors instead of the normal
behavior for '&' [1][2]. The parse-time expansion part also affects
our existing implicit wrappers generated by bare declarations within
nested grouping rules (e.g. nested @media). Those wrappers rules may
get their specificity lowered.

Actually making these changes is easier said than done, since we now
have to worry about the compat risk. A naive use-counter added
previously [3] shows that ~0.16% of page loads at some point parse
bare declarations after a nested rule. This is too high, and we
need a more advanced use-counter. Also, it doesn't cover
the specificity change for the (existing) implicit wrapper rule.

This CL is the first in a chain which (hopefully) gives us
the tools needed to use-count for these changes.

The "signaling rules" added by this CL, are simply normal style rules
which carry a "signal" that is converted to a use-count (or not)
later (see CSSSelector::Signal for more detail). This alone is not
enough to cover the cases we care about for [1] and [2], so for now
this new capability is not used outside of tests.

[1] https://github.com/w3c/csswg-drafts/issues/8738
[2] https://github.com/w3c/csswg-drafts/issues/9492
[3] https://chromestatus.com/metrics/feature/timeline/popularity/4709

Bug: 1517290
Change-Id: Iad193ff1da07039b9876fadd413f5c9654be08ff
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5201402
Commit-Queue: Anders Hartvoll Ruud <andruud@chromium.org>
Reviewed-by: Anders Hartvoll Ruud <andruud@chromium.org>
Reviewed-by: Steinar H Gunderson <sesse@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1251993}
14 files changed
tree: c9115be671da96d1addc3dd90b915194158d26d0
  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. webkit/
  51. .clang-format
  52. .clang-tidy
  53. .clangd
  54. .eslintrc.js
  55. .git-blame-ignore-revs
  56. .gitallowed
  57. .gitattributes
  58. .gitignore
  59. .gitmodules
  60. .gn
  61. .mailmap
  62. .rustfmt.toml
  63. .vpython3
  64. .yapfignore
  65. ATL_OWNERS
  66. AUTHORS
  67. BUILD.gn
  68. CODE_OF_CONDUCT.md
  69. codereview.settings
  70. DEPS
  71. DIR_METADATA
  72. LICENSE
  73. LICENSE.chromium_os
  74. OWNERS
  75. PRESUBMIT.py
  76. PRESUBMIT_test.py
  77. PRESUBMIT_test_mocks.py
  78. README.md
  79. 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.