[dom] Implement AbortSignal.any() prototype

This adds the basic functionality for AbortSignal.any(), which creates
a new signal that will be aborted if any of the signals associated
signals are aborted. The API is implemented behind a flag.

The general idea and concepts are:
 - A signal created with this API is a "composite signal", composed of
   0 or more "abort sources".
 - An abort source can be any AbortSignal, but since the relationships
   are established at signal creation time, we can link to non-composite
   signals, i.e. those associated with a controller.
 - If any of the abort sources are already aborted when this API is
   called, it returns an aborted signal (with the culprit's reason).
 - During SignalAbort, a signal will invoke SignalAbort on all of its
   "dependent signals" (those for which it is a source).

Most of this is implemented by AbortSignalCompositionManager. In this CL
this class handles linking source/dependent abort signals, but in
follow-up CLs this will also:

 1. Also manage priority sources for composite TaskSignals, which are
    created by a specialization for TaskSignal.any(). The logic for
    managing abort and priority sources/dependents is the same, so this
    setup is optimized for code reuse. Note also that the WPT tests for
    for AbortSignal.any() are implemented in resources/ and pulled in
    via META statements for reuse with TaskSignal.any().

 2. Handle more complex memory management. Memory leaks can result from
    composite signals following long-lived top-level signals, which we
    expect to be a common pattern and part of the motivation for the UA
    maintaining the signal relationships. This is separated out to keep
    CLs smaller.

Explainer: https://github.com/shaseley/abort-signal-any
I2P: https://groups.google.com/a/chromium.org/g/blink-dev/c/FSH6hrJMaxM/m/Ft8KiGlbAAAJ
Design doc: https://docs.google.com/document/d/1LvmsBLV85p-PhSGvTH-YwgD6onuhh1VXLg8jPlH32H4/edit?usp=sharing

Bug: 1323391
Change-Id: Ibc85815b166fd4242543f30600be99fadf35992e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3703640
Reviewed-by: Nate Chapin <japhet@chromium.org>
Reviewed-by: Mason Freed <masonf@chromium.org>
Commit-Queue: Scott Haseley <shaseley@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1089752}
18 files changed
tree: fff0befa282f209dac0851a8b37e4b0346a7dc3d
  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. ATL_OWNERS
  63. AUTHORS
  64. BUILD.gn
  65. CODE_OF_CONDUCT.md
  66. codereview.settings
  67. DEPS
  68. DIR_METADATA
  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.