Import Cobalt 19.master.0.205881
diff --git a/src/base/memory/weak_ptr.cc b/src/base/memory/weak_ptr.cc
index 9dec8fd..c993fcb 100644
--- a/src/base/memory/weak_ptr.cc
+++ b/src/base/memory/weak_ptr.cc
@@ -7,66 +7,89 @@
 namespace base {
 namespace internal {
 
-WeakReference::Flag::Flag() : is_valid_(true) {
+WeakReference::Flag::Flag() {
+  // Flags only become bound when checked for validity, or invalidated,
+  // so that we can check that later validity/invalidation operations on
+  // the same Flag take place on the same sequenced thread.
+  DETACH_FROM_SEQUENCE(sequence_checker_);
 }
 
 void WeakReference::Flag::Invalidate() {
   // The flag being invalidated with a single ref implies that there are no
   // weak pointers in existence. Allow deletion on other thread in this case.
-  DCHECK(thread_checker_.CalledOnValidThread() || HasOneRef());
-  is_valid_ = false;
+#if DCHECK_IS_ON()
+  DCHECK(sequence_checker_.CalledOnValidSequence() || HasOneRef())
+      << "WeakPtrs must be invalidated on the same sequenced thread.";
+#endif
+  invalidated_.Set();
 }
 
 bool WeakReference::Flag::IsValid() const {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  return is_valid_;
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_)
+      << "WeakPtrs must be checked on the same sequenced thread.";
+  return !invalidated_.IsSet();
 }
 
-WeakReference::Flag::~Flag() {
+bool WeakReference::Flag::MaybeValid() const {
+  return !invalidated_.IsSet();
 }
 
-WeakReference::WeakReference() {
-}
+WeakReference::Flag::~Flag() = default;
 
-WeakReference::WeakReference(const Flag* flag) : flag_(flag) {
-}
+WeakReference::WeakReference() = default;
 
-WeakReference::~WeakReference() {
-}
+WeakReference::WeakReference(const scoped_refptr<Flag>& flag) : flag_(flag) {}
 
-bool WeakReference::is_valid() const {
+WeakReference::~WeakReference() = default;
+
+WeakReference::WeakReference(WeakReference&& other) = default;
+
+WeakReference::WeakReference(const WeakReference& other) = default;
+
+bool WeakReference::IsValid() const {
   return flag_ && flag_->IsValid();
 }
 
-WeakReferenceOwner::WeakReferenceOwner() {
+bool WeakReference::MaybeValid() const {
+  return flag_ && flag_->MaybeValid();
 }
 
+WeakReferenceOwner::WeakReferenceOwner() = default;
+
 WeakReferenceOwner::~WeakReferenceOwner() {
   Invalidate();
 }
 
 WeakReference WeakReferenceOwner::GetRef() const {
-  // We also want to reattach to the current thread if all previous references
-  // have gone away.
+  // If we hold the last reference to the Flag then create a new one.
   if (!HasRefs())
     flag_ = new WeakReference::Flag();
+
   return WeakReference(flag_);
 }
 
 void WeakReferenceOwner::Invalidate() {
   if (flag_) {
     flag_->Invalidate();
-    flag_ = NULL;
+    flag_ = nullptr;
   }
 }
 
-WeakPtrBase::WeakPtrBase() {
+WeakPtrBase::WeakPtrBase() : ptr_(0) {}
+
+WeakPtrBase::~WeakPtrBase() = default;
+
+WeakPtrBase::WeakPtrBase(const WeakReference& ref, uintptr_t ptr)
+    : ref_(ref), ptr_(ptr) {
+  DCHECK(ptr_);
 }
 
-WeakPtrBase::~WeakPtrBase() {
+WeakPtrFactoryBase::WeakPtrFactoryBase(uintptr_t ptr) : ptr_(ptr) {
+  DCHECK(ptr_);
 }
 
-WeakPtrBase::WeakPtrBase(const WeakReference& ref) : ref_(ref) {
+WeakPtrFactoryBase::~WeakPtrFactoryBase() {
+  ptr_ = 0;
 }
 
 }  // namespace internal