Support nested pseudo elements styling

Currently, styling for pseudo elements is done in a way that
we have an originating element as a "base for matching" and
pseudo id to tell which pseudo element we want to collect
rules for.

But for nested pseudo elements we can't do it in such way,
since we need to have originating pseudo element as a
"base for matching".

So, this CL adds functionality for pseudo elements to be
a "base for matching", by introducing a vector of ancestor
pseudo elements to match nested pseudo elements against.

Example:
The rule is div::column::scroll-marker and we match:
  a) for div, then we won't match this rule as we can't
  reach the end of the selector;
  b) for column, the vector would be just [column],
  so we start with matching div against originating element
  (which is div), then move to ::column part and match against
  column (from vector), then we see ::scroll-marker, so we set
  ::scroll-marker pseudo style on column.
  c) for scroll marker, the vector would be [column, scroll marker],
  so we go div -> column -> scroll marker.
  d) note, that for div::before::scroll-marker we would fail matching
  at column (from vector) against ::before (from the selector), and
  the same would happen if we have scroll marker inside before inside
  div, but the rule would be div::column::scroll-marker.

Also, it changes other places that were only expecting regular element
before this CL to correctly work with a new resolve schema.

The non-existent pseudo elements are still matched with
originating element + pseudo id way, as there is no PseudoElement
to match against.

This CL also allows to create infinite ::before::before... on the
style resolver part, but it's currently blocked on the parsing site.

The test is removed from selector_checker_test as now it's fully covered
by WPT tests.

Also note that after this CL authors can now style nested markers.

Change-Id: If21a2a4158ebb7a63cebab8a33e5c63f0cd38323
Bug: 373478544
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5891553
Reviewed-by: Rune Lillesveen <futhark@chromium.org>
Commit-Queue: Daniil Sakhapov <sakhapov@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1373874}
27 files changed
tree: b935544f115d13bee160dd90d531b31a1f5731a4
  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. crypto/
  16. dbus/
  17. device/
  18. docs/
  19. extensions/
  20. fuchsia_web/
  21. gin/
  22. google_apis/
  23. gpu/
  24. headless/
  25. infra/
  26. ios/
  27. ipc/
  28. media/
  29. mojo/
  30. native_client_sdk/
  31. net/
  32. pdf/
  33. ppapi/
  34. printing/
  35. remoting/
  36. rlz/
  37. sandbox/
  38. services/
  39. skia/
  40. sql/
  41. storage/
  42. styleguide/
  43. testing/
  44. third_party/
  45. tools/
  46. ui/
  47. url/
  48. webkit/
  49. .clang-format
  50. .clang-tidy
  51. .clangd
  52. .git-blame-ignore-revs
  53. .gitallowed
  54. .gitattributes
  55. .gitignore
  56. .gitmodules
  57. .gn
  58. .mailmap
  59. .rustfmt.toml
  60. .vpython3
  61. .yapfignore
  62. ATL_OWNERS
  63. AUTHORS
  64. BUILD.gn
  65. CODE_OF_CONDUCT.md
  66. codereview.settings
  67. CPPLINT.cfg
  68. CRYPTO_OWNERS
  69. DEPS
  70. DIR_METADATA
  71. LICENSE
  72. LICENSE.chromium_os
  73. OWNERS
  74. PRESUBMIT.py
  75. PRESUBMIT_test.py
  76. PRESUBMIT_test_mocks.py
  77. README.md
  78. 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.