[ios] Fix thread safety of WKHTTPSystemCookieStore

The WKHTTPSystemCookieStore is an IO sequence affine object which
delegates its operation to an CRWWKHTTPCookieStore an UI sequence
affine object.

This introduces many hop between sequence. In addition callers of
the WKHTTPSystemCookieStore pass objects that may be bound to the
IO sequence and should no longer be used after the destruction of
the sequence (i.e. when the thread is terminated).

However, CRWWKHTTPCookieStore invokes system API that execute on
a background queue (Grand Central Dispatch). When the block runs
on the background queue it has escaped the sequence API. This
can cause test (e.g. ChromeBrowserStateManagerImpl) which starts
and destroy the IO thread to have block be invoked after the IO
thread has been destroyed.

To prevents this, introduce helper classes that allow to cancel
callbacks while they are still in flight, and cancel them when
the WKHTTPSystemCookieStore is destroyed (which happens as part
of the IO thread shutdown). This ensure that even if the system
invokes the block after the IO sequence has been terminated, it
will not try to use objects that are bound to that sequence.

Locally checked ios_chrome_unittests pass when run with (before
the patch, those tests failed reliably if --gtest_repeat=10 was
used):

    --gtest_filter=ChromeBrowserStateManagerImplTest.*
    --gtest_repeat=1000

This also allow to remove the "workaround" that was present in
ChromeBrowserStateManagerImplTest destructor which tried to
wait for all background tasks to complete.

Add SEQUENCE_CHECKER() to all classes involved in this message
sending API to ensure they are used on the correct sequence.

Fix tests that did not spin the RunLoop.

Fixed: 356847780
Change-Id: Idabe22c2d1f099dd2666ee5dd0c79d2ee72a930e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5756823
Code-Coverage: findit-for-me@appspot.gserviceaccount.com <findit-for-me@appspot.gserviceaccount.com>
Reviewed-by: Aliona Dangla <alionadangla@chromium.org>
Commit-Queue: Aliona Dangla <alionadangla@chromium.org>
Auto-Submit: Sylvain Defresne <sdefresne@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1336629}
5 files changed
tree: cbcd9bc6415532885abce6998c41435625f4096b
  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. CPPLINT.cfg
  71. DEPS
  72. DIR_METADATA
  73. LICENSE
  74. LICENSE.chromium_os
  75. OWNERS
  76. PRESUBMIT.py
  77. PRESUBMIT_test.py
  78. PRESUBMIT_test_mocks.py
  79. README.md
  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.