dawn/wire: Fix dangling pointers in future-related objects - Part I

This patch fixes all the dangling pointer issues in
`Buffer::MapAsyncEvent`, `PopErrorScopeEvent` and `WorkDoneEvent`.

Bug: dawn:2345
Change-Id: I8d63bea0a29e72a63187cb801ae7242361bc2fa6
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/183024
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Jiawei Shao <jiawei.shao@intel.com>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/dawn/wire/client/Buffer.cpp b/src/dawn/wire/client/Buffer.cpp
index 1caaf47..c824a18 100644
--- a/src/dawn/wire/client/Buffer.cpp
+++ b/src/dawn/wire/client/Buffer.cpp
@@ -66,7 +66,7 @@
         mBuffer->Reference();
     }
 
-    ~MapAsyncEvent() override { mBuffer->Release(); }
+    ~MapAsyncEvent() override { mBuffer.ExtractAsDangling()->Release(); }
 
     EventType GetType() override { return kType; }
 
@@ -169,7 +169,7 @@
 
         auto Callback = [this, &status]() {
             if (mCallback) {
-                mCallback(status, mUserdata);
+                mCallback(status, mUserdata.ExtractAsDangling());
             }
         };
 
@@ -201,14 +201,12 @@
     }
 
     WGPUBufferMapCallback mCallback;
-    // TODO(https://crbug.com/dawn/2345): Investigate `DanglingUntriaged` in dawn/wire.
-    raw_ptr<void, DanglingUntriaged> mUserdata;
+    raw_ptr<void> mUserdata;
 
     std::optional<WGPUBufferMapAsyncStatus> mStatus;
 
     // Strong reference to the buffer so that when we call the callback we can pass the buffer.
-    // TODO(https://crbug.com/dawn/2345): Investigate `DanglingUntriaged` in dawn/wire.
-    const raw_ptr<Buffer, DanglingUntriaged> mBuffer;
+    raw_ptr<Buffer> mBuffer;
 };
 
 // static
diff --git a/src/dawn/wire/client/Device.cpp b/src/dawn/wire/client/Device.cpp
index a54d3e5..3762b98 100644
--- a/src/dawn/wire/client/Device.cpp
+++ b/src/dawn/wire/client/Device.cpp
@@ -71,19 +71,19 @@
             mStatus = WGPUPopErrorScopeStatus_InstanceDropped;
             mMessage = std::nullopt;
         }
+        void* userdata = mUserdata.ExtractAsDangling();
         if (mOldCallback) {
-            mOldCallback(mType, mMessage ? mMessage->c_str() : nullptr, mUserdata);
+            mOldCallback(mType, mMessage ? mMessage->c_str() : nullptr, userdata);
         }
         if (mCallback) {
-            mCallback(mStatus, mType, mMessage ? mMessage->c_str() : nullptr, mUserdata);
+            mCallback(mStatus, mType, mMessage ? mMessage->c_str() : nullptr, userdata);
         }
     }
 
     // TODO(crbug.com/dawn/2021) Remove the old callback type.
     WGPUPopErrorScopeCallback mCallback;
     WGPUErrorCallback mOldCallback;
-    // TODO(https://crbug.com/dawn/2345): Investigate `DanglingUntriaged` in dawn/wire.
-    raw_ptr<void, DanglingUntriaged> mUserdata;
+    raw_ptr<void> mUserdata;
 
     WGPUPopErrorScopeStatus mStatus = WGPUPopErrorScopeStatus_Success;
     WGPUErrorType mType = WGPUErrorType_Unknown;
diff --git a/src/dawn/wire/client/Queue.cpp b/src/dawn/wire/client/Queue.cpp
index 18f696d..cfdf86b 100644
--- a/src/dawn/wire/client/Queue.cpp
+++ b/src/dawn/wire/client/Queue.cpp
@@ -62,13 +62,12 @@
             mStatus = WGPUQueueWorkDoneStatus_Success;
         }
         if (mCallback) {
-            mCallback(mStatus, mUserdata);
+            mCallback(mStatus, mUserdata.ExtractAsDangling());
         }
     }
 
     WGPUQueueWorkDoneCallback mCallback;
-    // TODO(https://crbug.com/dawn/2345): Investigate `DanglingUntriaged` in dawn/wire.
-    raw_ptr<void, DanglingUntriaged> mUserdata;
+    raw_ptr<void> mUserdata;
 
     WGPUQueueWorkDoneStatus mStatus = WGPUQueueWorkDoneStatus_Success;
 };