commit 67a756fad65850b74fa89fb667462aab78ec2a64
parent 4ee93eb431d0d47049c0c72f4941d3a6571774e8
Author: Dan Baker <dbaker@mozilla.com>
Date: Mon, 1 Dec 2025 23:39:43 -0700
Bug 2000941 - Vendor libwebrtc from 797bd0afe3
Essentially a no-op since we're going to see this change
reverted when we vendor in fa7d10eb73.
Upstream commit: https://webrtc.googlesource.com/src/+/797bd0afe38685b635179f0870fbc4b019d049b5
Define a movable variant of SequenceChecker
and use it to instrument the (movable/copyable) IceCandidateCollection
Bug: None
Change-Id: I055b13d3c8c94eff5e045df691df5c0c523886ed
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/409546
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45716}
Diffstat:
5 files changed, 761 insertions(+), 422 deletions(-)
diff --git a/third_party/libwebrtc/README.mozilla.last-vendor b/third_party/libwebrtc/README.mozilla.last-vendor
@@ -1,4 +1,4 @@
# ./mach python dom/media/webrtc/third_party_build/vendor-libwebrtc.py --from-local /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc --commit mozpatches libwebrtc
-libwebrtc updated from /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-12-02T06:36:40.952005+00:00.
+libwebrtc updated from /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-12-02T06:39:30.295022+00:00.
# base of lastest vendoring
-412ea40eeb
+797bd0afe3
diff --git a/third_party/libwebrtc/moz-patch-stack/fa7d10eb73.no-op-cherry-pick-msg b/third_party/libwebrtc/moz-patch-stack/fa7d10eb73.no-op-cherry-pick-msg
@@ -0,0 +1 @@
+We already cherry-picked this when we vendored 797bd0afe3.
diff --git a/third_party/libwebrtc/moz-patch-stack/p0001.patch b/third_party/libwebrtc/moz-patch-stack/p0001.patch
@@ -1,118 +1,669 @@
From: Daniel Baker <dbaker@mozilla.com>
-Date: Mon, 1 Dec 2025 19:31:22 -0700
-Subject: (tmp-cherry-pick) [M142] Revert "Add instructions for removing a
- Trampoline-wrapped Signal" (29d6eabaf0)
+Date: Mon, 1 Dec 2025 23:38:54 -0700
+Subject: (tmp-cherry-pick) Revert "Define a movable variant of
+ SequenceChecker" (fa7d10eb73)
-This reverts commit bb6b3aab159ebcd825526cf831f54170ccb2584d.
+This reverts commit 797bd0afe38685b635179f0870fbc4b019d049b5.
-Reason for revert: Need to fix downstream Chromium issues.
+Reason for revert: A lock detector downstream didn't like it.
Original change's description:
-> Add instructions for removing a Trampoline-wrapped Signal
+> Define a movable variant of SequenceChecker
>
-> Also apply the instructions to one Signal.
+> and use it to instrument the (movable/copyable) IceCandidateCollection
>
-> Bug: webrtc:42222066
-> Change-Id: I63409d968d27a843b0ac7c61a122a1b685cb7a6f
-> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/408883
+> Bug: None
+> Change-Id: I055b13d3c8c94eff5e045df691df5c0c523886ed
+> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/409546
> Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
> Commit-Queue: Harald Alvestrand <hta@webrtc.org>
-> Cr-Commit-Position: refs/heads/main@{#45624}
+> Cr-Commit-Position: refs/heads/main@{#45716}
-(cherry picked from commit 716c8eb942a74ad641bbace8c1db521b4857c636)
-
-Bug: webrtc:42222066, chromium:449225599, chromium:450516559
-No-IWYU: Revert
-Change-Id: I7fdf1694664b11ffcfd91916f1e98ef88254059d
-Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/413923
+Bug: None
+No-Presubmit: true
+No-Tree-Checks: true
+No-Try: true
+Change-Id: Ic29d440e65c34c7034d87c8da7f39126376cb306
+Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/411781
+Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
+Commit-Queue: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Auto-Submit: Harald Alvestrand <hta@webrtc.org>
-Commit-Queue: Harald Alvestrand <hta@webrtc.org>
-Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
-Reviewed-by: Guido Urdaneta <guidou@webrtc.org>
-Cr-Original-Commit-Position: refs/heads/main@{#45840}
-Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/415743
-Commit-Queue: Guido Urdaneta <guidou@webrtc.org>
-Reviewed-by: Harald Alvestrand <hta@webrtc.org>
-Cr-Commit-Position: refs/branch-heads/7444@{#2}
-Cr-Branched-From: f70dc714a073397356f6ed866481da73f90f0b96-refs/heads/main@{#45766}
+Cr-Commit-Position: refs/heads/main@{#45720}
---
- p2p/base/ice_transport_internal.cc | 5 +++--
- p2p/base/ice_transport_internal.h | 9 ++++++---
- rtc_base/sigslot_trampoline.h | 12 ------------
- 3 files changed, 9 insertions(+), 17 deletions(-)
+ api/DEPS | 1 -
+ api/jsep.h | 43 +++----
+ api/jsep_ice_candidate.cc | 15 +--
+ api/sequence_checker.h | 49 --------
+ api/sequence_checker_unittest.cc | 119 ------------------
+ pc/BUILD.gn | 1 -
+ pc/jsep_ice_candidate.cc | 4 +-
+ pc/jsep_session_description.cc | 13 +-
+ .../sequence_checker_internal.cc | 28 -----
+ .../sequence_checker_internal.h | 62 ---------
+ 10 files changed, 21 insertions(+), 314 deletions(-)
-diff --git a/p2p/base/ice_transport_internal.cc b/p2p/base/ice_transport_internal.cc
-index 7843a8b37d..a4b96db00b 100644
---- a/p2p/base/ice_transport_internal.cc
-+++ b/p2p/base/ice_transport_internal.cc
-@@ -236,7 +236,8 @@ RTCError IceConfig::IsValid() const {
+diff --git a/api/DEPS b/api/DEPS
+index 3a5554e188..51421a4e23 100644
+--- a/api/DEPS
++++ b/api/DEPS
+@@ -115,7 +115,6 @@ specific_include_rules = {
+ "+absl/strings/has_absl_stringify.h",
+ "+absl/strings/str_format.h",
+ "+rtc_base/system/no_unique_address.h",
+- "+rtc_base/thread_annotations.h"
+ ],
+
+ "local_network_access_permission\.h": [
+diff --git a/api/jsep.h b/api/jsep.h
+index 9befa94cf3..408a92982b 100644
+--- a/api/jsep.h
++++ b/api/jsep.h
+@@ -37,7 +37,6 @@
+ #include "api/sequence_checker.h"
+ #include "rtc_base/system/no_unique_address.h"
+ #include "rtc_base/system/rtc_export.h"
+-#include "rtc_base/thread_annotations.h"
+
+ namespace webrtc {
+
+@@ -147,14 +146,8 @@ class IceCandidateCollection final {
+ IceCandidateCollection(const IceCandidateCollection&) = delete;
+ IceCandidateCollection& operator=(const IceCandidateCollection&) = delete;
+
+- size_t count() const {
+- RTC_DCHECK_RUN_ON(&sequence_checker_);
+- return candidates_.size();
+- }
+- bool empty() const {
+- RTC_DCHECK_RUN_ON(&sequence_checker_);
+- return candidates_.empty();
+- }
++ size_t count() const { return candidates_.size(); }
++ bool empty() const { return candidates_.empty(); }
+ const IceCandidate* at(size_t index) const;
+
+ // Adds and takes ownership of the IceCandidate.
+@@ -178,12 +171,9 @@ class IceCandidateCollection final {
+ bool HasCandidate(const IceCandidate* candidate) const;
+
+ IceCandidateCollection Clone() const;
+- void RelinquishThreadOwnership();
+
+ private:
+- RTC_NO_UNIQUE_ADDRESS AutoDetachingSequenceChecker sequence_checker_;
+- std::vector<std::unique_ptr<IceCandidate>> candidates_
+- RTC_GUARDED_BY(sequence_checker_);
++ std::vector<std::unique_ptr<IceCandidate>> candidates_;
+ };
+
+ // TODO: webrtc:406795492 - Deprecate.
+@@ -240,6 +230,12 @@ class SessionDescriptionInternal {
+
+ ~SessionDescriptionInternal();
+
++ // Resets the internal sequence_checker_ to not be attached to a particular
++ // thread. Used when transfering object ownership between threads. Must be
++ // called by the thread that currently owns the object before transferring the
++ // ownership.
++ void RelinquishThreadOwnership();
++
+ protected:
+ // Only meant for the SessionDescriptionInterface implementation.
+ SdpType sdp_type() const { return sdp_type_; }
+@@ -249,8 +245,15 @@ class SessionDescriptionInternal {
+ SessionDescription* description() { return description_.get(); }
+ size_t mediasection_count() const;
+
++ protected:
++ // This method is necessarily `protected`, and not private, while
++ // the SessionDescriptionInterface implementation is being consolidated
++ // into a single class.
++ const SequenceChecker* sequence_checker() const { return &sequence_checker_; }
+
+ private:
++ RTC_NO_UNIQUE_ADDRESS SequenceChecker sequence_checker_{
++ SequenceChecker::kDetached};
+ const SdpType sdp_type_;
+ const std::string id_;
+ const std::string version_;
+@@ -353,12 +356,6 @@ class RTC_EXPORT SessionDescriptionInterface
+ sink.Append("--- END SDP ---\n");
+ }
+
+- // Resets the internal sequence_checker_ to not be attached to a particular
+- // thread. Used when transfering object ownership between threads. Must be
+- // called by the thread that currently owns the object before transferring the
+- // ownership.
+- void RelinquishThreadOwnership();
+-
+ protected:
+ explicit SessionDescriptionInterface(
+ SdpType type,
+@@ -367,19 +364,11 @@ class RTC_EXPORT SessionDescriptionInterface
+ absl::string_view version,
+ std::vector<IceCandidateCollection> candidates = {});
+
+- protected:
+- // This method is necessarily `protected`, and not private, while
+- // the SessionDescriptionInterface implementation is being consolidated
+- // into a single class.
+- const SequenceChecker* sequence_checker() const { return &sequence_checker_; }
+-
+ private:
+ bool IsValidMLineIndex(int index) const;
+ bool GetMediasectionIndex(const IceCandidate* candidate, size_t* index) const;
+ int GetMediasectionIndex(absl::string_view mid) const;
+
+- RTC_NO_UNIQUE_ADDRESS SequenceChecker sequence_checker_{
+- SequenceChecker::kDetached};
+ std::vector<IceCandidateCollection> candidate_collection_
+ RTC_GUARDED_BY(sequence_checker());
+ };
+diff --git a/api/jsep_ice_candidate.cc b/api/jsep_ice_candidate.cc
+index 9cc8b93b23..ce0304f599 100644
+--- a/api/jsep_ice_candidate.cc
++++ b/api/jsep_ice_candidate.cc
+@@ -12,7 +12,6 @@
+
+ #include <cstddef>
+ #include <cstdint>
+-#include <iterator>
+ #include <limits>
+ #include <memory>
+ #include <string>
+@@ -23,7 +22,6 @@
+ #include "absl/strings/string_view.h"
+ #include "api/candidate.h"
+ #include "api/jsep.h"
+-#include "api/sequence_checker.h"
+ #include "rtc_base/checks.h"
+ #include "rtc_base/logging.h"
+
+@@ -53,30 +51,24 @@ IceCandidate::IceCandidate(absl::string_view sdp_mid,
}
- IceTransportInternal::IceTransportInternal()
-- : role_conflict_trampoline_(this),
-+ : candidate_gathered_trampoline_(this),
-+ role_conflict_trampoline_(this),
- ice_transport_state_changed_trampoline_(this),
- destroyed_trampoline_(this) {}
-
-@@ -265,7 +266,7 @@ void IceTransportInternal::RemoveGatheringStateCallback(
- void IceTransportInternal::SubscribeCandidateGathered(
- absl::AnyInvocable<void(IceTransportInternal*, const Candidate&)>
- callback) {
-- candidate_gathered_callbacks_.AddReceiver(std::move(callback));
-+ candidate_gathered_trampoline_.Subscribe(std::move(callback));
+ void IceCandidateCollection::add(std::unique_ptr<IceCandidate> candidate) {
+- RTC_DCHECK_RUN_ON(&sequence_checker_);
+ candidates_.push_back(std::move(candidate));
}
- void IceTransportInternal::SubscribeRoleConflict(
-diff --git a/p2p/base/ice_transport_internal.h b/p2p/base/ice_transport_internal.h
-index 9f6722c8ad..c83a7d70d7 100644
---- a/p2p/base/ice_transport_internal.h
-+++ b/p2p/base/ice_transport_internal.h
-@@ -352,9 +352,11 @@ class RTC_EXPORT IceTransportInternal : public PacketTransportInternal {
- void RemoveGatheringStateCallback(const void* removal_tag);
-
- // Handles sending and receiving of candidates.
-+ sigslot::signal2<IceTransportInternal*, const Candidate&>
-+ SignalCandidateGathered;
- void NotifyCandidateGathered(IceTransportInternal* transport,
- const Candidate& candidate) {
-- candidate_gathered_callbacks_.Send(transport, candidate);
-+ SignalCandidateGathered(transport, candidate);
- }
- void SubscribeCandidateGathered(
- absl::AnyInvocable<void(IceTransportInternal*, const Candidate&)>
-@@ -462,8 +464,9 @@ class RTC_EXPORT IceTransportInternal : public PacketTransportInternal {
- candidate_pair_change_callback_;
+ void IceCandidateCollection::add(IceCandidate* candidate) {
+- RTC_DCHECK_RUN_ON(&sequence_checker_);
+ candidates_.push_back(absl::WrapUnique(candidate));
+ }
+
+ void IceCandidateCollection::Append(IceCandidateCollection collection) {
+- RTC_DCHECK_RUN_ON(&sequence_checker_);
+- RTC_DCHECK_RUN_ON(&collection.sequence_checker_);
+ candidates_.insert(candidates_.end(),
+ std::make_move_iterator(collection.candidates_.begin()),
+ std::make_move_iterator(collection.candidates_.end()));
+ }
+
+ const IceCandidate* IceCandidateCollection::at(size_t index) const {
+- RTC_DCHECK_RUN_ON(&sequence_checker_);
+ return candidates_[index].get();
+ }
+
+ bool IceCandidateCollection::HasCandidate(const IceCandidate* candidate) const {
+- RTC_DCHECK_RUN_ON(&sequence_checker_);
+ const auto sdp_mid = candidate->sdp_mid(); // avoid string copy per entry.
+ return absl::c_any_of(
+ candidates_, [&](const std::unique_ptr<IceCandidate>& entry) {
+@@ -92,8 +84,7 @@ bool IceCandidateCollection::HasCandidate(const IceCandidate* candidate) const {
+ });
+ }
+-size_t IceCandidateCollection::remove(const IceCandidate* candidate) {
+- RTC_DCHECK_RUN_ON(&sequence_checker_);
++size_t JsepCandidateCollection::remove(const IceCandidate* candidate) {
+ RTC_DCHECK(candidate);
+ auto iter =
+ absl::c_find_if(candidates_, [&](const std::unique_ptr<IceCandidate>& c) {
+@@ -106,8 +97,4 @@ size_t IceCandidateCollection::remove(const IceCandidate* candidate) {
+ return 0u;
+ }
+
+-void IceCandidateCollection::RelinquishThreadOwnership() {
+- sequence_checker_.Detach();
+-}
+-
+ } // namespace webrtc
+diff --git a/api/sequence_checker.h b/api/sequence_checker.h
+index d05bb2da5e..0d2d83806a 100644
+--- a/api/sequence_checker.h
++++ b/api/sequence_checker.h
+@@ -10,8 +10,6 @@
+ #ifndef API_SEQUENCE_CHECKER_H_
+ #define API_SEQUENCE_CHECKER_H_
+
+-#include <utility>
+-
+ #include "api/task_queue/task_queue_base.h"
+ #include "rtc_base/checks.h"
+ #include "rtc_base/synchronization/sequence_checker_internal.h"
+@@ -74,53 +72,6 @@ class RTC_LOCKABLE SequenceChecker
+ void Detach() { Impl::Detach(); }
+ };
+
+-// A variant of SequenceChecker where moving and copying is allowed,
+-// and will automatically detach from the current thread.
+-// This allows a SequenceChecker to be used in objects that are used
+-// with standard classes such as std::vector.
+-//
+-// The behavior of AutoDetachingSequenceChecker is:
+-// - When created on its own, it is detached.
+-// - When created using the copy constructor, the new object is attached
+-// to the same thread as the original (which may be different from
+-// the thread that invokes the copy operator).
+-// - When copied using the copy operator, the new object is attached
+-// to the same thread as the original (which may be different from
+-// the thread that invokes the copy operator).
+-// - When created using the move constructor, it is detached.
+-// - When moved using the move operator, both the original object and
+-// the moved-into object will be detached.
+-
+-class RTC_LOCKABLE AutoDetachingSequenceChecker
+-#if RTC_DCHECK_IS_ON
+- : public webrtc_sequence_checker_internal::
+- AutoDetachingSequenceCheckerImpl {
+- using Impl =
+- webrtc_sequence_checker_internal::AutoDetachingSequenceCheckerImpl;
+-#else
+- : public webrtc_sequence_checker_internal::
+- AutoDetachingSequenceCheckerDoNothing {
+- using Impl =
+- webrtc_sequence_checker_internal::AutoDetachingSequenceCheckerDoNothing;
+-#endif
+- public:
+- AutoDetachingSequenceChecker() : Impl() {}
+- AutoDetachingSequenceChecker(const AutoDetachingSequenceChecker& o)
+- : Impl(o) {}
+- AutoDetachingSequenceChecker& operator=(
+- const AutoDetachingSequenceChecker& o) {
+- Impl::operator=(o);
+- return *this;
+- }
+-
+- AutoDetachingSequenceChecker(AutoDetachingSequenceChecker&& o)
+- : Impl(std::move(o)) {}
+- AutoDetachingSequenceChecker& operator=(AutoDetachingSequenceChecker&& o) {
+- Impl::operator=(std::move(o));
+- return *this;
+- }
+-};
+-
+ } // namespace webrtc
+
+ // RTC_RUN_ON/RTC_GUARDED_BY/RTC_DCHECK_RUN_ON macros allows to annotate
+diff --git a/api/sequence_checker_unittest.cc b/api/sequence_checker_unittest.cc
+index 77ea3cf145..b6e432c2d3 100644
+--- a/api/sequence_checker_unittest.cc
++++ b/api/sequence_checker_unittest.cc
+@@ -12,7 +12,6 @@
+
+ #include <functional>
+ #include <memory>
+-#include <utility>
+
+ #include "absl/functional/any_invocable.h"
+ #include "api/function_view.h"
+@@ -26,7 +25,6 @@
+ #include "test/gmock.h"
+ #include "test/gtest.h"
+
+-using testing::Eq;
+ using testing::HasSubstr;
+
+ namespace webrtc {
+@@ -234,121 +232,4 @@ TEST(SequenceCheckerTest, TestAnnotationsOnWrongQueueRelease) {
+ }
+ #endif
+ #endif // GTEST_HAS_DEATH_TEST
+-
+-// This class is a helper for verifying that AutoDetachingSequenceChecker
+-// can be made a member of a class with default copy and move operations.
+-class MovableObject {
+- public:
+- MovableObject() = default;
+- // Copy operators
+- MovableObject(const MovableObject& o) = default;
+- MovableObject& operator=(const MovableObject& o) = default;
+- // Move operators
+- MovableObject(MovableObject&& o) = default;
+- MovableObject& operator=(MovableObject&& o) = default;
+-
+- int any_member RTC_GUARDED_BY(sequence_checker_) = 4711;
+- AutoDetachingSequenceChecker sequence_checker_;
+-};
+-
+-TEST(AutoDetachingSequenceCheckerTest, CanDeclareMovableObject) {
+- MovableObject foo;
+- RTC_DCHECK_RUN_ON(&foo.sequence_checker_);
+- EXPECT_THAT(foo.any_member, Eq(4711));
+-}
+-
+-TEST(AutoDetachingSequenceCheckerTest, CanCopyMovableObject) {
+- MovableObject foo;
+- RTC_DCHECK_RUN_ON(&foo.sequence_checker_);
+- foo.any_member = 12;
+- MovableObject bar = foo;
+- RTC_DCHECK_RUN_ON(&bar.sequence_checker_);
+- EXPECT_THAT(bar.any_member, Eq(12));
+-}
+-
+-#if RTC_DCHECK_IS_ON
+-// The tests below use the helper functions IsAttachedForTesting and
+-// HasSameAttachmentForTesting, which are only present on the
+-// AutoDetachingSequenceChecker when compiled with DCHECK on.
+-TEST(AutoDetachingSequenceCheckerTest, InitialStateIsDetached) {
+- AutoDetachingSequenceChecker foo;
+- EXPECT_FALSE(foo.IsAttachedForTesting());
+-}
+-
+-TEST(AutoDetachingSequenceCheckerTest, CopyConstructorKeepsAttachment) {
+- AutoDetachingSequenceChecker foo;
+- EXPECT_FALSE(foo.IsAttachedForTesting());
+- AutoDetachingSequenceChecker bar(foo);
+- EXPECT_FALSE(bar.IsAttachedForTesting());
+- RTC_DCHECK_RUN_ON(&foo);
+- EXPECT_TRUE(foo.IsAttachedForTesting());
+- AutoDetachingSequenceChecker baz(foo);
+- EXPECT_TRUE(baz.IsAttachedForTesting());
+- EXPECT_TRUE(baz.HasSameAttachmentForTesting(foo));
+-}
+-
+-TEST(AutoDetachingSequenceCheckerTest, MoveDetachesFromCurrentThread) {
+- TaskQueueForTest queue;
+- AutoDetachingSequenceChecker foo;
+- EXPECT_FALSE(foo.IsAttachedForTesting());
+- RTC_DCHECK_RUN_ON(&foo);
+- EXPECT_TRUE(foo.IsAttachedForTesting());
+- AutoDetachingSequenceChecker bar = std::move(foo);
+- EXPECT_FALSE(bar.IsAttachedForTesting());
+- EXPECT_FALSE(foo.IsAttachedForTesting());
+-}
+-
+-TEST(AutoDetachingSequenceCheckerTest, MoveDetachesFromCurrentThreadInCapture) {
+- TaskQueueForTest queue;
+- AutoDetachingSequenceChecker foo;
+- RTC_DCHECK_RUN_ON(&foo);
+- queue.SendTask([bar = std::move(foo)]() {
+- EXPECT_FALSE(bar.IsAttachedForTesting());
+- RTC_DCHECK_RUN_ON(&bar);
+- EXPECT_TRUE(bar.IsAttachedForTesting());
+- });
+- EXPECT_FALSE(foo.IsAttachedForTesting());
+-}
+-
+-TEST(AutoDetachingSequenceCheckerTest, CopyOperatorKeepsOldThread) {
+- TaskQueueForTest queue;
+- AutoDetachingSequenceChecker object1;
+- AutoDetachingSequenceChecker object2;
+- // Attach object1 to current thread.
+- RTC_DCHECK_RUN_ON(&object1);
+- queue.SendTask([&]() {
+- // Attach object2 to this task queue
+- RTC_DCHECK_RUN_ON(&object2);
+- // Overwriting will attach object2 to object1's bound thread.
+- object2 = object1;
+- });
+- EXPECT_TRUE(object1.HasSameAttachmentForTesting(object2));
+-}
+-#endif // RTC_DCHECK_IS_ON
+-
+-#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) && RTC_DCHECK_IS_ON
+-TEST(AutoDetachingSequenceCheckerDeathTest, NotMovingCrashes) {
+- TaskQueueForTest queue;
+- AutoDetachingSequenceChecker unmoved_object;
+- // Attach `unmoved_object` to the queue, not the main thread
+- queue.SendTask([&unmoved_object]() { RTC_DCHECK_RUN_ON(&unmoved_object); });
+- ASSERT_DEATH({RTC_DCHECK_RUN_ON(&unmoved_object)}, "IsCurrent");
+-}
+-
+-TEST(AutoDetachingSequenceCheckerDeathTest,
+- CopyOperatorKeepsOldThreadAndCrashes) {
+- TaskQueueForTest queue;
+- AutoDetachingSequenceChecker object1;
+- AutoDetachingSequenceChecker object2;
+- // Attach object2 to current thread.
+- RTC_DCHECK_RUN_ON(&object2);
+- queue.SendTask([&]() {
+- RTC_DCHECK_RUN_ON(&object1);
+- object2 = object1; // This assignment overwrites the attachment.
+- });
+- // object2 is now attached to the task queue.
+- ASSERT_DEATH({RTC_DCHECK_RUN_ON(&object2)}, "IsCurrent");
+-}
+-
+-#endif
+ } // namespace webrtc
+diff --git a/pc/BUILD.gn b/pc/BUILD.gn
+index 949b8ff106..139f78efe7 100644
+--- a/pc/BUILD.gn
++++ b/pc/BUILD.gn
+@@ -1434,7 +1434,6 @@ rtc_library("webrtc_sdp") {
+ "../api:rtc_error",
+ "../api:rtp_parameters",
+ "../api:rtp_transceiver_direction",
+- "../api:sequence_checker",
+ "../api/audio:audio_frame_api",
+ "../media:codec",
+ "../media:media_constants",
+diff --git a/pc/jsep_ice_candidate.cc b/pc/jsep_ice_candidate.cc
+index e236eb52ed..710587a3ff 100644
+--- a/pc/jsep_ice_candidate.cc
++++ b/pc/jsep_ice_candidate.cc
+@@ -10,6 +10,7 @@
+
+ #include "api/jsep_ice_candidate.h"
+
++#include <cstddef>
+ #include <memory>
+ #include <string>
+
+@@ -17,7 +18,6 @@
+ #include "absl/strings/string_view.h"
+ #include "api/candidate.h"
+ #include "api/jsep.h"
+-#include "api/sequence_checker.h"
+ #include "pc/webrtc_sdp.h"
+
+ // This file contains IceCandidate-related functions that are not
+@@ -60,8 +60,6 @@ std::unique_ptr<IceCandidate> IceCandidate::Create(absl::string_view mid,
+
+ IceCandidateCollection IceCandidateCollection::Clone() const {
+ IceCandidateCollection new_collection;
+- RTC_DCHECK_RUN_ON(&sequence_checker_);
+- RTC_DCHECK_RUN_ON(&new_collection.sequence_checker_);
+ new_collection.candidates_.reserve(candidates_.size());
+ for (const auto& candidate : candidates_) {
+ new_collection.candidates_.push_back(std::make_unique<IceCandidate>(
+diff --git a/pc/jsep_session_description.cc b/pc/jsep_session_description.cc
+index fbd8bfacc0..d1f1dd006b 100644
+--- a/pc/jsep_session_description.cc
++++ b/pc/jsep_session_description.cc
+@@ -14,6 +14,7 @@
+ #include <cstddef>
+ #include <iterator>
+ #include <memory>
++#include <optional>
+ #include <string>
+ #include <utility>
+ #include <vector>
+@@ -22,7 +23,6 @@
+ #include "absl/strings/string_view.h"
+ #include "api/candidate.h"
+ #include "api/jsep.h"
+-#include "api/sequence_checker.h"
+ #include "p2p/base/p2p_constants.h"
+ #include "p2p/base/transport_description.h"
+ #include "p2p/base/transport_info.h"
+@@ -31,6 +31,7 @@
+ #include "pc/webrtc_sdp.h"
+ #include "rtc_base/checks.h"
+ #include "rtc_base/ip_address.h"
++#include "rtc_base/logging.h"
+ #include "rtc_base/net_helper.h"
+ #include "rtc_base/net_helpers.h"
+ #include "rtc_base/socket_address.h"
+@@ -180,7 +181,7 @@ size_t SessionDescriptionInternal::mediasection_count() const {
+ return description_ ? description_->contents().size() : 0u;
+ }
+
+-void SessionDescriptionInterface::RelinquishThreadOwnership() {
++void SessionDescriptionInternal::RelinquishThreadOwnership() {
+ // Ideally we should require that the method can only be called from the
+ // thread that the sequence checker is currently attached to. However that's
+ // not compatible with some cases outside of webrtc where initializations
+@@ -188,13 +189,6 @@ void SessionDescriptionInterface::RelinquishThreadOwnership() {
+ // signaling) where a call is made into webrtc. At that point we'd hit a
+ // dcheck like this in webrtc: RTC_DCHECK_RUN_ON(&sequence_checker_);
+ sequence_checker_.Detach();
+- // Tie the checker to the current thread, which permits iterating
+- // `candidate_collection_`
+- RTC_DCHECK_RUN_ON(sequence_checker());
+- for (IceCandidateCollection& collection : candidate_collection_) {
+- collection.RelinquishThreadOwnership();
+- }
+- sequence_checker_.Detach(); // Unties the checker from the current thread.
+ }
+
+ SessionDescriptionInterface::SessionDescriptionInterface(
+@@ -341,5 +335,4 @@ int SessionDescriptionInterface::GetMediasectionIndex(
+ [&](const auto& content) { return mid == content.mid(); });
+ return it == contents.end() ? -1 : std::distance(contents.begin(), it);
+ }
+-
+ } // namespace webrtc
+diff --git a/rtc_base/synchronization/sequence_checker_internal.cc b/rtc_base/synchronization/sequence_checker_internal.cc
+index a6f9adb53d..3b0a0b123d 100644
+--- a/rtc_base/synchronization/sequence_checker_internal.cc
++++ b/rtc_base/synchronization/sequence_checker_internal.cc
+@@ -54,14 +54,6 @@ void SequenceCheckerImpl::Detach() {
+ }
+
+ #if RTC_DCHECK_IS_ON
+-void SequenceCheckerImpl::AssignStateFrom(const SequenceCheckerImpl& o) {
+- MutexLock this_lock(&lock_);
+- MutexLock that_lock(&o.lock_);
+- attached_ = o.attached_;
+- valid_thread_ = o.valid_thread_;
+- valid_queue_ = o.valid_queue_;
+-}
+-
+ std::string SequenceCheckerImpl::ExpectationToString() const {
+ const TaskQueueBase* const current_queue = TaskQueueBase::Current();
+ const PlatformThreadRef current_thread = CurrentThreadRef();
+@@ -91,26 +83,6 @@ std::string SequenceCheckerImpl::ExpectationToString() const {
+
+ return message.Release();
+ }
+-
+-bool SequenceCheckerImpl::IsAttachedForTesting() const {
+- MutexLock scoped_lock(&lock_);
+- return attached_;
+-}
+-
+-bool SequenceCheckerImpl::HasSameAttachmentForTesting(
+- const SequenceCheckerImpl& o) const {
+- MutexLock scoped_lock_1(&lock_);
+- MutexLock scoped_lock_2(&o.lock_);
+- if (attached_ != o.attached_) {
+- return false;
+- }
+- if (attached_ &&
+- (valid_queue_ != o.valid_queue_ || valid_thread_ != o.valid_thread_)) {
+- return false;
+- }
+- return true;
+-}
+-
+ #endif // RTC_DCHECK_IS_ON
+
+ } // namespace webrtc_sequence_checker_internal
+diff --git a/rtc_base/synchronization/sequence_checker_internal.h b/rtc_base/synchronization/sequence_checker_internal.h
+index 8094e4445b..19370706ff 100644
+--- a/rtc_base/synchronization/sequence_checker_internal.h
++++ b/rtc_base/synchronization/sequence_checker_internal.h
+@@ -41,24 +41,11 @@ class RTC_EXPORT SequenceCheckerImpl {
+ // used exclusively on another thread.
+ void Detach();
+
+- // Makes the task queue or thread that is checked for in `this`.IsCurrent()
+- // be the same as in `o`.IsCurrent().
+- void AssignStateFrom(const SequenceCheckerImpl& o);
+-
+ // Returns a string that is formatted to match with the error string printed
+ // by RTC_CHECK() when a condition is not met.
+ // This is used in conjunction with the RTC_DCHECK_RUN_ON() macro.
+ std::string ExpectationToString() const;
+
+- // Returns whether or not the checker is attached.
+- // Exists only in the SequenceChecker that is used when RTC_DCHECK_IS_ON
+- // is set, so tests using it must check that flag.
+- bool IsAttachedForTesting() const;
+-
+- // Returns true if the two sequence checkers are either both detached
+- // or attached to the same thread.
+- bool HasSameAttachmentForTesting(const SequenceCheckerImpl& o) const;
+-
private:
-- CallbackList<IceTransportInternal*, const Candidate&>
-- candidate_gathered_callbacks_;
-+ SignalTrampoline<IceTransportInternal,
-+ &IceTransportInternal::SignalCandidateGathered>
-+ candidate_gathered_trampoline_;
- SignalTrampoline<IceTransportInternal,
- &IceTransportInternal::SignalRoleConflict>
- role_conflict_trampoline_;
-diff --git a/rtc_base/sigslot_trampoline.h b/rtc_base/sigslot_trampoline.h
-index a399e4177f..590e73d97b 100644
---- a/rtc_base/sigslot_trampoline.h
-+++ b/rtc_base/sigslot_trampoline.h
-@@ -51,18 +51,6 @@ namespace webrtc {
- // my_class_object.SubscibeMyNamedEvent(
- // SafeInvocable(target.safety_flag_.flag(),
- // [target] { target.function(); }
--// WHEN REMOVING THE SIGNAL
--// Make a CL that will:
--// - Delete the SignalMyNamedEvent signal
--// - Change my_named_event_trampoline_ to my_named_event_callbacks,
--// of type CallbackList<function arguments>
--// - Change SubscribeMyNamedEvent to call my_named_event_callbacks.AddReceiver
--// - Change NotifyMyNamedEvent to call my_named_event_callbacks_.Send
--// - If UnsubscribeMyNamedEvent exists, change that also.
--// - Delete the initialization of my_named_event_trampoline_ from the
--// relevant constructor.
--// Sending this through the bots will flush out remaining references to
--// SignalMyNamedEvent.
- namespace internal {
- template <typename MemberPtrT>
- struct member_pointer_traits;
+ mutable Mutex lock_;
+ // These are mutable so that IsCurrent can set them.
+@@ -98,55 +85,6 @@ ExpectationToString(const ThreadLikeObject*) {
+ return std::string();
+ }
+
+-class AutoDetachingSequenceCheckerImpl : public SequenceCheckerImpl {
+- public:
+- enum InitialState : bool { kDetached = false, kAttached = true };
+-
+- AutoDetachingSequenceCheckerImpl() : SequenceCheckerImpl(kDetached) {}
+-
+- AutoDetachingSequenceCheckerImpl(const AutoDetachingSequenceCheckerImpl& o)
+- : SequenceCheckerImpl(kDetached) {
+- AssignStateFrom(o);
+- }
+-
+- AutoDetachingSequenceCheckerImpl& operator=(
+- const AutoDetachingSequenceCheckerImpl& o) {
+- AssignStateFrom(o);
+- return *this;
+- }
+-
+- AutoDetachingSequenceCheckerImpl(AutoDetachingSequenceCheckerImpl&& o)
+- : SequenceCheckerImpl(kDetached) {
+- o.Detach();
+- }
+-
+- AutoDetachingSequenceCheckerImpl& operator=(
+- AutoDetachingSequenceCheckerImpl&& o) {
+- Detach();
+- o.Detach();
+- return *this;
+- }
+-};
+-
+-class AutoDetachingSequenceCheckerDoNothing {
+- public:
+- AutoDetachingSequenceCheckerDoNothing() {}
+- AutoDetachingSequenceCheckerDoNothing(
+- const AutoDetachingSequenceCheckerDoNothing& o) {}
+- AutoDetachingSequenceCheckerDoNothing& operator=(
+- const AutoDetachingSequenceCheckerDoNothing& o) {
+- return *this;
+- }
+- AutoDetachingSequenceCheckerDoNothing(
+- AutoDetachingSequenceCheckerDoNothing&& o) {}
+- AutoDetachingSequenceCheckerDoNothing& operator=(
+- AutoDetachingSequenceCheckerDoNothing&& o) {
+- return *this;
+- }
+- bool IsCurrent() const { return true; }
+- void Detach() {}
+-};
+-
+ } // namespace webrtc_sequence_checker_internal
+ } // namespace webrtc
+
diff --git a/third_party/libwebrtc/moz-patch-stack/p0002.patch b/third_party/libwebrtc/moz-patch-stack/p0002.patch
@@ -1,331 +1,118 @@
-From: Palak Agarwal <agpalak@google.com>
-Date: Tue, 7 Oct 2025 13:45:52 +0200
-Subject: (cherry-pick-branch-heads/7390) [M141] Add logging while creating
- {Window|Screen}Capturer
+From: Daniel Baker <dbaker@mozilla.com>
+Date: Mon, 1 Dec 2025 19:31:22 -0700
+Subject: (tmp-cherry-pick) [M142] Revert "Add instructions for removing a
+ Trampoline-wrapped Signal" (29d6eabaf0)
-(cherry picked from commit 6908505ae0eba5d530ad0bb4b37d4654a4f36c95)
+This reverts commit bb6b3aab159ebcd825526cf831f54170ccb2584d.
-Fixed: chromium:450184498
-Bug: chromium:448881311
-Change-Id: I0f043f58bf831e6822451cac99a8972a054ffdf7
-Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/414800
-Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
+Reason for revert: Need to fix downstream Chromium issues.
+
+Original change's description:
+> Add instructions for removing a Trampoline-wrapped Signal
+>
+> Also apply the instructions to one Signal.
+>
+> Bug: webrtc:42222066
+> Change-Id: I63409d968d27a843b0ac7c61a122a1b685cb7a6f
+> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/408883
+> Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
+> Commit-Queue: Harald Alvestrand <hta@webrtc.org>
+> Cr-Commit-Position: refs/heads/main@{#45624}
+
+(cherry picked from commit 716c8eb942a74ad641bbace8c1db521b4857c636)
+
+Bug: webrtc:42222066, chromium:449225599, chromium:450516559
+No-IWYU: Revert
+Change-Id: I7fdf1694664b11ffcfd91916f1e98ef88254059d
+Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/413923
+Auto-Submit: Harald Alvestrand <hta@webrtc.org>
+Commit-Queue: Harald Alvestrand <hta@webrtc.org>
+Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
+Reviewed-by: Guido Urdaneta <guidou@webrtc.org>
+Cr-Original-Commit-Position: refs/heads/main@{#45840}
+Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/415743
+Commit-Queue: Guido Urdaneta <guidou@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
-Commit-Queue: Palak Agarwal <agpalak@google.com>
-Cr-Original-Commit-Position: refs/heads/main@{#45856}
-Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/415420
-Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org>
-Cr-Commit-Position: refs/branch-heads/7390@{#3}
-Cr-Branched-From: 2f553bf8d573c90176d51559b76dfc836996c8f5-refs/heads/main@{#45520}
+Cr-Commit-Position: refs/branch-heads/7444@{#2}
+Cr-Branched-From: f70dc714a073397356f6ed866481da73f90f0b96-refs/heads/main@{#45766}
---
- modules/desktop_capture/desktop_capturer.cc | 15 +++++++++++++++
- .../linux/x11/screen_capturer_x11.cc | 6 ++++++
- .../linux/x11/window_capturer_x11.cc | 4 ++++
- modules/desktop_capture/screen_capturer_darwin.mm | 7 +++++++
- .../desktop_capture/screen_capturer_fuchsia.cc | 3 +++
- modules/desktop_capture/screen_capturer_linux.cc | 4 ++++
- modules/desktop_capture/screen_capturer_null.cc | 4 ++++
- modules/desktop_capture/screen_capturer_win.cc | 6 ++++++
- modules/desktop_capture/window_capturer_linux.cc | 4 ++++
- modules/desktop_capture/window_capturer_mac.mm | 2 ++
- modules/desktop_capture/window_capturer_null.cc | 3 +++
- modules/desktop_capture/window_capturer_win.cc | 7 +++++++
- 12 files changed, 65 insertions(+)
+ p2p/base/ice_transport_internal.cc | 5 +++--
+ p2p/base/ice_transport_internal.h | 9 ++++++---
+ rtc_base/sigslot_trampoline.h | 12 ------------
+ 3 files changed, 9 insertions(+), 17 deletions(-)
-diff --git a/modules/desktop_capture/desktop_capturer.cc b/modules/desktop_capture/desktop_capturer.cc
-index ae9aba26ee..bf63f73178 100644
---- a/modules/desktop_capture/desktop_capturer.cc
-+++ b/modules/desktop_capture/desktop_capturer.cc
-@@ -21,6 +21,7 @@
- #include "modules/desktop_capture/desktop_capturer_differ_wrapper.h"
- #include "modules/desktop_capture/desktop_geometry.h"
- #include "modules/desktop_capture/shared_memory.h"
-+#include "rtc_base/logging.h"
- #include "system_wrappers/include/metrics.h"
-
- #if defined(WEBRTC_WIN)
-@@ -81,18 +82,26 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateWindowCapturer(
- #if defined(RTC_ENABLE_WIN_WGC)
- if (options.allow_wgc_window_capturer() &&
- IsWgcSupported(CaptureType::kWindow)) {
-+ RTC_LOG(LS_INFO) << "video capture: DesktopCapturer::CreateWindowCapturer "
-+ "creates DesktopCapturer of type WgcCapturerWin";
- return WgcCapturerWin::CreateRawWindowCapturer(options);
- }
- #endif // defined(RTC_ENABLE_WIN_WGC)
-
- #if defined(WEBRTC_WIN)
- if (options.allow_cropping_window_capturer()) {
-+ RTC_LOG(LS_INFO)
-+ << "video capture: DesktopCapturer::CreateWindowCapturer "
-+ "creates DesktopCapturer of type CroppingWindowCapturerWin";
- return CroppingWindowCapturer::CreateCapturer(options);
- }
- #endif // defined(WEBRTC_WIN)
-
- std::unique_ptr<DesktopCapturer> capturer = CreateRawWindowCapturer(options);
- if (capturer && options.detect_updated_region()) {
-+ RTC_LOG(LS_INFO) << "video capture: DesktopCapturer::CreateWindowCapturer "
-+ "creates DesktopCapturer of type "
-+ "DesktopCapturerDifferWrapper over a base capturer";
- capturer.reset(new DesktopCapturerDifferWrapper(std::move(capturer)));
- }
-
-@@ -105,12 +114,18 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateScreenCapturer(
- #if defined(RTC_ENABLE_WIN_WGC)
- if (options.allow_wgc_screen_capturer() &&
- IsWgcSupported(CaptureType::kScreen)) {
-+ RTC_LOG(LS_INFO) << "video capture: DesktopCapturer::CreateScreenCapturer "
-+ "creates DesktopCapturer of type WgcCapturerWin";
- return WgcCapturerWin::CreateRawScreenCapturer(options);
- }
- #endif // defined(RTC_ENABLE_WIN_WGC)
-
- std::unique_ptr<DesktopCapturer> capturer = CreateRawScreenCapturer(options);
- if (capturer && options.detect_updated_region()) {
-+ RTC_LOG(LS_INFO)
-+ << "video capture: DesktopCapturer::CreateScreenCapturer creates "
-+ "DesktopCapturer of type DesktopCapturerDifferWrapper over a base "
-+ "capturer";
- capturer.reset(new DesktopCapturerDifferWrapper(std::move(capturer)));
- }
-
-diff --git a/modules/desktop_capture/linux/x11/screen_capturer_x11.cc b/modules/desktop_capture/linux/x11/screen_capturer_x11.cc
-index 90dd797cb3..f10dcabc7e 100644
---- a/modules/desktop_capture/linux/x11/screen_capturer_x11.cc
-+++ b/modules/desktop_capture/linux/x11/screen_capturer_x11.cc
-@@ -511,8 +511,14 @@ std::unique_ptr<DesktopCapturer> ScreenCapturerX11::CreateRawScreenCapturer(
- if (!options.x_display())
- return nullptr;
-
-+ RTC_LOG(LS_INFO)
-+ << "video capture: ScreenCapturerX11::CreateRawScreenCapturer creates "
-+ "DesktopCapturer of type ScreenCapturerX11";
- std::unique_ptr<ScreenCapturerX11> capturer(new ScreenCapturerX11());
- if (!capturer->Init(options)) {
-+ RTC_LOG(LS_INFO)
-+ << "video capture: ScreenCapturerX11::CreateRawScreenCapturer "
-+ "DesktopCapturer is null because it can not be initiated";
- return nullptr;
- }
-
-diff --git a/modules/desktop_capture/linux/x11/window_capturer_x11.cc b/modules/desktop_capture/linux/x11/window_capturer_x11.cc
-index 8e592ff2d9..9505205b76 100644
---- a/modules/desktop_capture/linux/x11/window_capturer_x11.cc
-+++ b/modules/desktop_capture/linux/x11/window_capturer_x11.cc
-@@ -247,6 +247,10 @@ std::unique_ptr<DesktopCapturer> WindowCapturerX11::CreateRawWindowCapturer(
- const DesktopCaptureOptions& options) {
- if (!options.x_display())
- return nullptr;
-+
-+ RTC_LOG(LS_INFO)
-+ << "video capture: WindowCapturerX11::CreateRawWindowCapturer creates "
-+ "DesktopCapturer of type WindowCapturerX11";
- return std::unique_ptr<DesktopCapturer>(new WindowCapturerX11(options));
+diff --git a/p2p/base/ice_transport_internal.cc b/p2p/base/ice_transport_internal.cc
+index 7843a8b37d..a4b96db00b 100644
+--- a/p2p/base/ice_transport_internal.cc
++++ b/p2p/base/ice_transport_internal.cc
+@@ -236,7 +236,8 @@ RTCError IceConfig::IsValid() const {
}
-diff --git a/modules/desktop_capture/screen_capturer_darwin.mm b/modules/desktop_capture/screen_capturer_darwin.mm
-index 95a877c45d..3f14ddfe58 100644
---- a/modules/desktop_capture/screen_capturer_darwin.mm
-+++ b/modules/desktop_capture/screen_capturer_darwin.mm
-@@ -12,6 +12,7 @@
-
- #include "modules/desktop_capture/mac/screen_capturer_mac.h"
- #include "modules/desktop_capture/mac/screen_capturer_sck.h"
-+#include "rtc_base/logging.h"
-
- namespace webrtc {
-
-@@ -27,10 +28,16 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawScreenCapturer(
- std::unique_ptr<DesktopCapturer> sck_capturer =
- CreateScreenCapturerSck(options);
- if (sck_capturer) {
-+ RTC_LOG(LS_INFO)
-+ << "video capture: DesktopCapturer::CreateRawScreenCapturer creates "
-+ "DesktopCapturer of type ScreenCapturerSck";
- return sck_capturer;
- }
- }
-
-+ RTC_LOG(LS_INFO)
-+ << "video capture: DesktopCapturer::CreateRawScreenCapturer creates "
-+ "DesktopCapturer of type ScreenCapturerMac";
- auto capturer =
- std::make_unique<ScreenCapturerMac>(options.configuration_monitor(),
- options.detect_updated_region(),
-diff --git a/modules/desktop_capture/screen_capturer_fuchsia.cc b/modules/desktop_capture/screen_capturer_fuchsia.cc
-index c3f51ef0fc..2a6c5e753d 100644
---- a/modules/desktop_capture/screen_capturer_fuchsia.cc
-+++ b/modules/desktop_capture/screen_capturer_fuchsia.cc
-@@ -56,6 +56,9 @@ size_t RoundUpToMultiple(size_t value, size_t multiple) {
-
- std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawScreenCapturer(
- const DesktopCaptureOptions& options) {
-+ RTC_LOG(LS_INFO)
-+ << "video capture: DesktopCapturer::CreateRawScreenCapturer creates "
-+ "DesktopCapturer of type ScreenCapturerFuchsia";
- std::unique_ptr<ScreenCapturerFuchsia> capturer(new ScreenCapturerFuchsia());
- return capturer;
- }
-diff --git a/modules/desktop_capture/screen_capturer_linux.cc b/modules/desktop_capture/screen_capturer_linux.cc
-index 94726750c5..f25e08fb59 100644
---- a/modules/desktop_capture/screen_capturer_linux.cc
-+++ b/modules/desktop_capture/screen_capturer_linux.cc
-@@ -13,6 +13,7 @@
- #include "modules/desktop_capture/desktop_capture_options.h"
- #include "modules/desktop_capture/desktop_capture_types.h"
- #include "modules/desktop_capture/desktop_capturer.h"
-+#include "rtc_base/logging.h"
-
- #if defined(WEBRTC_USE_PIPEWIRE)
- #include "modules/desktop_capture/linux/wayland/base_capturer_pipewire.h"
-@@ -29,6 +30,9 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawScreenCapturer(
- const DesktopCaptureOptions& options) {
- #if defined(WEBRTC_USE_PIPEWIRE)
- if (options.allow_pipewire() && BaseCapturerPipeWire::IsSupported()) {
-+ RTC_LOG(LS_INFO)
-+ << "video capture: DesktopCapturer::CreateRawScreenCapturer creates "
-+ "DesktopCapturer of type BaseCapturerPipeWire";
- return std::make_unique<BaseCapturerPipeWire>(options,
- CaptureType::kScreen);
- }
-diff --git a/modules/desktop_capture/screen_capturer_null.cc b/modules/desktop_capture/screen_capturer_null.cc
-index aa6d4991a0..21b2f46c4d 100644
---- a/modules/desktop_capture/screen_capturer_null.cc
-+++ b/modules/desktop_capture/screen_capturer_null.cc
-@@ -11,12 +11,16 @@
- #include <memory>
-
- #include "modules/desktop_capture/desktop_capturer.h"
-+#include "rtc_base/logging.h"
-
- namespace webrtc {
-
- // static
- std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawScreenCapturer(
- const DesktopCaptureOptions& options) {
-+ RTC_LOG(LS_INFO)
-+ << "video capture: DesktopCapturer::CreateRawScreenCapturer creates null "
-+ "DesktopCapturer";
- return nullptr;
+ IceTransportInternal::IceTransportInternal()
+- : role_conflict_trampoline_(this),
++ : candidate_gathered_trampoline_(this),
++ role_conflict_trampoline_(this),
+ ice_transport_state_changed_trampoline_(this),
+ destroyed_trampoline_(this) {}
+
+@@ -265,7 +266,7 @@ void IceTransportInternal::RemoveGatheringStateCallback(
+ void IceTransportInternal::SubscribeCandidateGathered(
+ absl::AnyInvocable<void(IceTransportInternal*, const Candidate&)>
+ callback) {
+- candidate_gathered_callbacks_.AddReceiver(std::move(callback));
++ candidate_gathered_trampoline_.Subscribe(std::move(callback));
}
-diff --git a/modules/desktop_capture/screen_capturer_win.cc b/modules/desktop_capture/screen_capturer_win.cc
-index a5f2052979..6620888f18 100644
---- a/modules/desktop_capture/screen_capturer_win.cc
-+++ b/modules/desktop_capture/screen_capturer_win.cc
-@@ -19,6 +19,7 @@
- #include "modules/desktop_capture/win/dxgi_duplicator_controller.h"
- #include "modules/desktop_capture/win/screen_capturer_win_directx.h"
- #include "modules/desktop_capture/win/screen_capturer_win_gdi.h"
-+#include "rtc_base/logging.h"
-
- namespace webrtc {
-
-@@ -26,6 +27,9 @@ namespace {
-
- std::unique_ptr<DesktopCapturer> CreateScreenCapturerWinDirectx(
- const DesktopCaptureOptions& options) {
-+ RTC_LOG(LS_INFO)
-+ << "video capture: DesktopCapturer::CreateRawScreenCapturer creates "
-+ "DesktopCapturer of type ScreenCapturerWinDirectx";
- std::unique_ptr<DesktopCapturer> capturer(
- new ScreenCapturerWinDirectx(options));
- capturer.reset(new BlankDetectorDesktopCapturerWrapper(
-@@ -39,6 +43,8 @@ std::unique_ptr<DesktopCapturer> CreateScreenCapturerWinDirectx(
- std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawScreenCapturer(
- const DesktopCaptureOptions& options) {
- // Default capturer if no options are enabled is GDI.
-+ RTC_LOG(LS_INFO) << "video capture: DesktopCapturer::CreateRawScreenCapturer "
-+ "creates DesktopCapturer of type ScreenCapturerWinGdi";
- std::unique_ptr<DesktopCapturer> capturer(new ScreenCapturerWinGdi(options));
-
- // If DirectX is enabled use it as main capturer with GDI as fallback.
-diff --git a/modules/desktop_capture/window_capturer_linux.cc b/modules/desktop_capture/window_capturer_linux.cc
-index f621a63e72..87ea3d5721 100644
---- a/modules/desktop_capture/window_capturer_linux.cc
-+++ b/modules/desktop_capture/window_capturer_linux.cc
-@@ -13,6 +13,7 @@
- #include "modules/desktop_capture/desktop_capture_options.h"
- #include "modules/desktop_capture/desktop_capture_types.h"
- #include "modules/desktop_capture/desktop_capturer.h"
-+#include "rtc_base/logging.h"
-
- #if defined(WEBRTC_USE_PIPEWIRE)
- #include "modules/desktop_capture/linux/wayland/base_capturer_pipewire.h"
-@@ -29,6 +30,9 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawWindowCapturer(
- const DesktopCaptureOptions& options) {
- #if defined(WEBRTC_USE_PIPEWIRE)
- if (options.allow_pipewire() && BaseCapturerPipeWire::IsSupported()) {
-+ RTC_LOG(LS_INFO)
-+ << "video capture: DesktopCapturer::CreateRawWindowCapturer creates "
-+ "DesktopCapturer of type BaseCapturerPipeWire";
- return std::make_unique<BaseCapturerPipeWire>(options,
- CaptureType::kWindow);
+ void IceTransportInternal::SubscribeRoleConflict(
+diff --git a/p2p/base/ice_transport_internal.h b/p2p/base/ice_transport_internal.h
+index 9f6722c8ad..c83a7d70d7 100644
+--- a/p2p/base/ice_transport_internal.h
++++ b/p2p/base/ice_transport_internal.h
+@@ -352,9 +352,11 @@ class RTC_EXPORT IceTransportInternal : public PacketTransportInternal {
+ void RemoveGatheringStateCallback(const void* removal_tag);
+
+ // Handles sending and receiving of candidates.
++ sigslot::signal2<IceTransportInternal*, const Candidate&>
++ SignalCandidateGathered;
+ void NotifyCandidateGathered(IceTransportInternal* transport,
+ const Candidate& candidate) {
+- candidate_gathered_callbacks_.Send(transport, candidate);
++ SignalCandidateGathered(transport, candidate);
}
-diff --git a/modules/desktop_capture/window_capturer_mac.mm b/modules/desktop_capture/window_capturer_mac.mm
-index a1e6157b87..731090d3fb 100644
---- a/modules/desktop_capture/window_capturer_mac.mm
-+++ b/modules/desktop_capture/window_capturer_mac.mm
-@@ -217,6 +217,8 @@ void WindowCapturerMac::CaptureFrame() {
- // static
- std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawWindowCapturer(
- const DesktopCaptureOptions& options) {
-+ RTC_LOG(LS_INFO) << "video capture: DesktopCapturer::CreateRawWindowCapturer "
-+ "creates DesktopCapturer of type WindowCapturerMac";
- return std::unique_ptr<DesktopCapturer>(new WindowCapturerMac(
- options.full_screen_window_detector(), options.configuration_monitor()));
- }
-diff --git a/modules/desktop_capture/window_capturer_null.cc b/modules/desktop_capture/window_capturer_null.cc
-index 2061dc5248..384e186d20 100644
---- a/modules/desktop_capture/window_capturer_null.cc
-+++ b/modules/desktop_capture/window_capturer_null.cc
-@@ -12,6 +12,7 @@
-
- #include "modules/desktop_capture/desktop_capturer.h"
- #include "rtc_base/checks.h"
-+#include "rtc_base/logging.h"
-
- namespace webrtc {
-
-@@ -65,6 +66,8 @@ void WindowCapturerNull::CaptureFrame() {
- // static
- std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawWindowCapturer(
- const DesktopCaptureOptions& options) {
-+ RTC_LOG(LS_INFO) << "video capture: DesktopCapturer::CreateRawWindowCapturer "
-+ "creates DesktopCapturer of type WindowCapturerNull";
- return std::unique_ptr<DesktopCapturer>(new WindowCapturerNull());
- }
-
-diff --git a/modules/desktop_capture/window_capturer_win.cc b/modules/desktop_capture/window_capturer_win.cc
-index 115bc7d9b0..15ed7f5121 100644
---- a/modules/desktop_capture/window_capturer_win.cc
-+++ b/modules/desktop_capture/window_capturer_win.cc
-@@ -15,6 +15,7 @@
- #include "modules/desktop_capture/desktop_capturer.h"
- #include "modules/desktop_capture/rgba_color.h"
- #include "modules/desktop_capture/win/window_capturer_win_gdi.h"
-+#include "rtc_base/logging.h"
-
- #if defined(RTC_ENABLE_WIN_WGC)
- #include "modules/desktop_capture/blank_detector_desktop_capturer_wrapper.h"
-@@ -28,6 +29,8 @@ namespace webrtc {
- // static
- std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawWindowCapturer(
- const DesktopCaptureOptions& options) {
-+ RTC_LOG(LS_INFO) << "video capture: DesktopCapturer::CreateRawWindowCapturer "
-+ "creates DesktopCapturer of type WindowCapturerWinGdi";
- std::unique_ptr<DesktopCapturer> capturer(
- WindowCapturerWinGdi::CreateRawWindowCapturer(options));
- #if defined(RTC_ENABLE_WIN_WGC)
-@@ -36,6 +39,10 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawWindowCapturer(
- // BlankDectector capturer will send an error when it detects a failed
- // GDI rendering, then Fallback capturer will try to capture it again with
- // WGC.
-+ RTC_LOG(LS_INFO)
-+ << "video capture: DesktopCapturer::CreateRawWindowCapturer creates "
-+ "DesktopCapturer of type FallbackDesktopCapturerWrapper which has a "
-+ "fallback capturer of type WgcCapturerWin";
- capturer = std::make_unique<BlankDetectorDesktopCapturerWrapper>(
- std::move(capturer), RgbaColor(0, 0, 0, 0),
- /*check_per_capture*/ true);
+ void SubscribeCandidateGathered(
+ absl::AnyInvocable<void(IceTransportInternal*, const Candidate&)>
+@@ -462,8 +464,9 @@ class RTC_EXPORT IceTransportInternal : public PacketTransportInternal {
+ candidate_pair_change_callback_;
+
+ private:
+- CallbackList<IceTransportInternal*, const Candidate&>
+- candidate_gathered_callbacks_;
++ SignalTrampoline<IceTransportInternal,
++ &IceTransportInternal::SignalCandidateGathered>
++ candidate_gathered_trampoline_;
+ SignalTrampoline<IceTransportInternal,
+ &IceTransportInternal::SignalRoleConflict>
+ role_conflict_trampoline_;
+diff --git a/rtc_base/sigslot_trampoline.h b/rtc_base/sigslot_trampoline.h
+index a399e4177f..590e73d97b 100644
+--- a/rtc_base/sigslot_trampoline.h
++++ b/rtc_base/sigslot_trampoline.h
+@@ -51,18 +51,6 @@ namespace webrtc {
+ // my_class_object.SubscibeMyNamedEvent(
+ // SafeInvocable(target.safety_flag_.flag(),
+ // [target] { target.function(); }
+-// WHEN REMOVING THE SIGNAL
+-// Make a CL that will:
+-// - Delete the SignalMyNamedEvent signal
+-// - Change my_named_event_trampoline_ to my_named_event_callbacks,
+-// of type CallbackList<function arguments>
+-// - Change SubscribeMyNamedEvent to call my_named_event_callbacks.AddReceiver
+-// - Change NotifyMyNamedEvent to call my_named_event_callbacks_.Send
+-// - If UnsubscribeMyNamedEvent exists, change that also.
+-// - Delete the initialization of my_named_event_trampoline_ from the
+-// relevant constructor.
+-// Sending this through the bots will flush out remaining references to
+-// SignalMyNamedEvent.
+ namespace internal {
+ template <typename MemberPtrT>
+ struct member_pointer_traits;
diff --git a/third_party/libwebrtc/moz-patch-stack/p0002.patch b/third_party/libwebrtc/moz-patch-stack/p0003.patch