[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}
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.