Don't let :not(<feature>) match host elements

For featureless elements such as shadow hosts, matching selectors from
the shadow tree scope, only a limited set of selectors are allowed to
match. Also, :not() is not allowed to match if the selector inside
:not() contains simple selectors for features which are not exposed from
featureless elements.

The latter did not work correctly in Blink. To support that, we need to
keep track of such features inside :not(), :is(), etc. This CL
introduces a separate code path for matching selectors on hosts, which
uses kSelectorFailsCompletely to track features which should never
match.

style_perf numbers:

Initial style (µs)     Before     After    Perf      95% CI (BCa)
=================== ========= ========= ======= =================
ECommerce               13753     13858   -0.8%  [ -1.5%,  -0.2%]
Encyclopedia           125730    126230   -0.4%  [ -1.0%,  +0.3%]
Extension              142066    143072   -0.7%  [ -1.0%,  -0.4%]
News                    52917     52937   -0.0%  [ -0.7%,  +0.6%]
Search                  17451     17525   -0.4%  [ -1.0%,  +0.0%]
Social1                 31689     31777   -0.3%  [ -1.7%,  +0.4%]
Social2                 20578     20630   -0.2%  [ -0.6%,  +0.2%]
Sports                  75059     74622   +0.6%  [ -0.5%,  +1.9%]
Video                   43845     43963   -0.3%  [ -0.9%,  +0.5%]
Geometric mean                            -0.3%  [ -0.6%,  +0.0%]

Parse (µs)             Before     After    Perf      95% CI (BCa)
=================== ========= ========= ======= =================
ECommerce                2270      2272   -0.1%  [ -1.8%,  +1.3%]
Encyclopedia            13085     13073   +0.1%  [ -0.4%,  +0.6%]
Extension                2288      2312   -1.0%  [ -2.2%,  +0.5%]
News                    13900     13905   -0.0%  [ -0.5%,  +0.4%]
Search                   8543      8612   -0.8%  [ -2.5%,  +0.1%]
Social1                 25312     25488   -0.7%  [ -3.1%,  +0.1%]
Social2                  1016      1032   -1.6%  [ -3.4%,  -0.0%]
Sports                  94789     95190   -0.4%  [ -1.0%,  -0.1%]
Video                   55723     56098   -0.7%  [ -2.0%,  +0.5%]
Geometric mean                            -0.6%  [ -1.0%,  -0.2%]

Recalc style (µs)      Before     After    Perf      95% CI (BCa)
=================== ========= ========= ======= =================
ECommerce                7481      7408   +1.0%  [ -1.0%,  +6.2%]
Encyclopedia           104240    104587   -0.3%  [ -0.8%,  +0.0%]
Extension              108181    109160   -0.9%  [ -1.2%,  -0.5%]
News                    28254     28184   +0.2%  [ -0.8%,  +3.4%]
Search                   7030      7095   -0.9%  [ -1.9%,  +0.1%]
Social1                 15966     15926   +0.3%  [ -0.4%,  +1.3%]
Social2                 10399     10440   -0.4%  [ -0.8%,  -0.0%]
Sports                  42798     42744   +0.1%  [ -0.5%,  +0.7%]
Video                   20571     20398   +0.9%  [ -0.1%,  +3.1%]
Geometric mean                            -0.0%  [ -0.4%,  +0.5%]


Bug: 378966977
Change-Id: Id7d29c4e72275149e541f49b98eb6b8c328e6461
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6624272
Reviewed-by: Steinar H Gunderson <sesse@chromium.org>
Commit-Queue: Rune Lillesveen <futhark@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1470493}
5 files changed
tree: f821d3ce841726850de3b554968b12e0d92bb671
  1. .github/
  2. android_webview/
  3. apps/
  4. ash/
  5. base/
  6. build/
  7. build_overrides/
  8. buildtools/
  9. cc/
  10. chrome/
  11. chromecast/
  12. chromeos/
  13. codelabs/
  14. components/
  15. content/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia_web/
  22. gin/
  23. google_apis/
  24. gpu/
  25. headless/
  26. infra/
  27. ios/
  28. ipc/
  29. media/
  30. mojo/
  31. native_client_sdk/
  32. net/
  33. pdf/
  34. ppapi/
  35. printing/
  36. remoting/
  37. rlz/
  38. sandbox/
  39. services/
  40. skia/
  41. sql/
  42. storage/
  43. styleguide/
  44. testing/
  45. third_party/
  46. tools/
  47. ui/
  48. url/
  49. webkit/
  50. .clang-format
  51. .clang-tidy
  52. .clangd
  53. .git-blame-ignore-revs
  54. .gitallowed
  55. .gitattributes
  56. .gitignore
  57. .gitmodules
  58. .gn
  59. .mailmap
  60. .rustfmt.toml
  61. .vpython3
  62. .yapfignore
  63. ATL_OWNERS
  64. AUTHORS
  65. BUILD.gn
  66. CODE_OF_CONDUCT.md
  67. codereview.settings
  68. CPPLINT.cfg
  69. CRYPTO_OWNERS
  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. SECURITY_OWNERS
  80. 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.