Allow SequenceChecker to be initialized detached.

The motivation for this is to not have to implement this pattern:

foo.h:

class Foo {
 public:
  Foo();
 private:
  SequenceChecker checker_;
};

foo.cc:

Foo::Foo() {
  checker_.Detach();
}

And instead be able to do this inline in the .h file:

class Foo {
 public:
  Foo();
 private:
  SequenceChecker checker_{SequenceChecker::kDetached};
};

Bug: none
Change-Id: Idd7ca82d15c2f77f3aaccf26f1943a49f4b40661
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/298445
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39616}
diff --git a/api/sequence_checker.h b/api/sequence_checker.h
index a79d04f..33e0f3c 100644
--- a/api/sequence_checker.h
+++ b/api/sequence_checker.h
@@ -44,6 +44,11 @@
   using Impl = webrtc_sequence_checker_internal::SequenceCheckerDoNothing;
 #endif
  public:
+  enum InitialState : bool { kDetached = false, kAttached = true };
+
+  explicit SequenceChecker(InitialState initial_state = kAttached)
+      : Impl(initial_state) {}
+
   // Returns true if sequence checker is attached to the current sequence.
   bool IsCurrent() const { return Impl::IsCurrent(); }
   // Detaches checker from sequence to which it is attached. Next attempt
diff --git a/api/sequence_checker_unittest.cc b/api/sequence_checker_unittest.cc
index a929c59..3efb5c7 100644
--- a/api/sequence_checker_unittest.cc
+++ b/api/sequence_checker_unittest.cc
@@ -122,8 +122,7 @@
 TEST(SequenceCheckerTest, ExpectationToString) {
   TaskQueueForTest queue1;
 
-  SequenceChecker sequence_checker;
-  sequence_checker.Detach();
+  SequenceChecker sequence_checker(SequenceChecker::kDetached);
 
   rtc::Event blocker;
   queue1.PostTask([&blocker, &sequence_checker]() {
@@ -149,6 +148,24 @@
 #endif
 }
 
+TEST(SequenceCheckerTest, InitiallyDetached) {
+  TaskQueueForTest queue1;
+
+  SequenceChecker sequence_checker(SequenceChecker::kDetached);
+
+  rtc::Event blocker;
+  queue1.PostTask([&blocker, &sequence_checker]() {
+    EXPECT_TRUE(sequence_checker.IsCurrent());
+    blocker.Set();
+  });
+
+  blocker.Wait(rtc::Event::kForever);
+
+#if RTC_DCHECK_IS_ON
+  EXPECT_FALSE(sequence_checker.IsCurrent());
+#endif
+}
+
 class TestAnnotations {
  public:
   TestAnnotations() : test_var_(false) {}
diff --git a/rtc_base/synchronization/sequence_checker_internal.cc b/rtc_base/synchronization/sequence_checker_internal.cc
index 2612e9e..9831f07 100644
--- a/rtc_base/synchronization/sequence_checker_internal.cc
+++ b/rtc_base/synchronization/sequence_checker_internal.cc
@@ -33,8 +33,8 @@
 
 }  // namespace
 
-SequenceCheckerImpl::SequenceCheckerImpl()
-    : attached_(true),
+SequenceCheckerImpl::SequenceCheckerImpl(bool attach_to_current_thread)
+    : attached_(attach_to_current_thread),
       valid_thread_(rtc::CurrentThreadRef()),
       valid_queue_(TaskQueueBase::Current()),
       valid_system_queue_(GetSystemQueueRef()) {}
diff --git a/rtc_base/synchronization/sequence_checker_internal.h b/rtc_base/synchronization/sequence_checker_internal.h
index a20fbb0..a66e9ee 100644
--- a/rtc_base/synchronization/sequence_checker_internal.h
+++ b/rtc_base/synchronization/sequence_checker_internal.h
@@ -30,7 +30,7 @@
 // right version for your build configuration.
 class RTC_EXPORT SequenceCheckerImpl {
  public:
-  SequenceCheckerImpl();
+  explicit SequenceCheckerImpl(bool attach_to_current_thread);
   ~SequenceCheckerImpl() = default;
 
   bool IsCurrent() const;
@@ -59,6 +59,7 @@
 // right version for your build configuration.
 class SequenceCheckerDoNothing {
  public:
+  explicit SequenceCheckerDoNothing(bool attach_to_current_thread) {}
   bool IsCurrent() const { return true; }
   void Detach() {}
 };