Reland "[css-pseudo] Set default ::marker styles in a real UA sheet"

This is a reland of a53560e3c83ab4d7b379247d16995ca774e772ba

The problem in the reverted original patch was that I forgot to clear
marker_style_sheet_ in CSSDefaultStyleSheets::PrepareForLeakDetection.
Then, when running tests with --enable-leak-detection, it could happen
that EnsureDefaultStyleSheetsForPseudoElement would think that the UA
rules for ::marker were already in default_pseudo_element_style_. But
it would actually be empty, so the ::marker could get no rule, making
HasMatchedProperties() be false, so PseudoStyleForElementInternal would
return false, and PseudoStyleForElement would return a nullptr style.
So there would be no ::marker.

Original change's description:
> [css-pseudo] Set default ::marker styles in a real UA sheet
> Before this patch, default styles for ::marker were assigned manually
> when resolving the style. The problem was that, since the rules didn't
> actually exist in any stylesheet, they were not exposed in devtools.
> Also, devtools assume that if a pseudo-element exists, it must have some
> rule. This could not hold for ::marker, and then trying to add styles
> to it would fail.
> This patch fixes that by making the styles actual UA rules. However,
> adding a '::marker' selector directly to the UA sheet for elements would
> be bad: it would match every single element (even non-list-items) due to
> the universal selector, and then it would set an internal bit for the
> marker. So HasAnyPseudoElementStyles() would return true, which means
> extra work when handling style changes.
> Therefore, this patch adds a new UA sheet just for pseudo-elements. This
> sheet is not used for elements, ensuring that HasAnyPseudoElementStyles
> is still false if there are no author styles for a pseudo-element.
> The selector parser was treating ::marker as invalid if the runtime flag
> CSSMarkerPseudoElement was disabled. But now it's accepted in that case
> for UA styles.
> There already was a kHasMarkerPseudoElement counter to track how widely
> used is ::marker on the web. Now this counter will only be incremented
> for author rules.
> Bug: 457718, 1082377
> TEST=blink_unittests --gtest_filter=StyleResolverTest.CSSMarkerPseudoElement
> TEST=blink_unittests --gtest_filter=UseCounterHelperTest.CSSMarkerPseudoElementUA
> TEST=blink_unittests --gtest_filter=UseCounterHelperTest.CSSMarkerPseudoElementAuthor
> TEST=http/tests/devtools/elements/styles-2/pseudo-elements.js
> Change-Id: Ib5583dc1952bfec2cce8f33fe8332cc39016c34a
> Reviewed-on:
> Reviewed-by: Mike West <>
> Reviewed-by: Rune Lillesveen <>
> Commit-Queue: Oriol Brufau <>
> Cr-Commit-Position: refs/heads/master@{#778303}

Bug: 457718, 1082377
Change-Id: Ib6a2482ac474a424c3dfeb05fb2e2c00ce29b732
Reviewed-by: Rune Lillesveen <>
Commit-Queue: Oriol Brufau <>
Cr-Commit-Position: refs/heads/master@{#779284}
14 files changed
tree: 02389b844084813187aab58c6462df1bfcfd847c
  1. .clang-format
  2. .clang-tidy
  3. .eslintrc.js
  4. .git-blame-ignore-revs
  5. .gitattributes
  6. .gitignore
  7. .gn
  8. .vpython
  9. .vpython3
  10. .yapfignore
  14. DEPS
  17. LICENSE.chromium_os
  18. OWNERS
  24. android_webview/
  25. apps/
  26. ash/
  27. base/
  28. build/
  29. build_overrides/
  30. buildtools/
  31. cc/
  32. chrome/
  33. chromecast/
  34. chromeos/
  35. cloud_print/
  36. codereview.settings
  37. components/
  38. content/
  39. courgette/
  40. crypto/
  41. dbus/
  42. device/
  43. docs/
  44. extensions/
  45. fuchsia/
  46. gin/
  47. google_apis/
  48. google_update/
  49. gpu/
  50. headless/
  51. infra/
  52. ios/
  53. ipc/
  54. jingle/
  55. media/
  56. mojo/
  57. native_client_sdk/
  58. net/
  59. pdf/
  60. ppapi/
  61. printing/
  62. remoting/
  63. rlz/
  64. sandbox/
  65. services/
  66. skia/
  67. sql/
  68. storage/
  69. styleguide/
  70. testing/
  71. third_party/
  72. tools/
  73. ui/
  74. url/
  75. weblayer/

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

Documentation in the source is rooted in docs/

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.