[wgpu-headers] Update device lost and uncaptured error callbacks.

- Updates the callbacks to allow for 2 userdatas.
- Updates the C++ DeviceDescriptor to expose setters for the callbacks.
- Updates internal usages to remove to-be-deprecated versions.

Bug: 42241461
Change-Id: I583eb334284ee4ae8d197ed57bd5fee3048be4b8
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/192741
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Loko Kung <lokokung@google.com>
diff --git a/generator/templates/mock_api.cpp b/generator/templates/mock_api.cpp
index 7cd252a..7e28170 100644
--- a/generator/templates/mock_api.cpp
+++ b/generator/templates/mock_api.cpp
@@ -76,12 +76,11 @@
 
 //* Generate the older Call*Callback if there is no Future call equivalent.
 //* Includes:
-//*   - setUncapturedErrorCallback
 //*   - setLoggingCallback
-{% set LegacyCallbackFunctions = ['set uncaptured error callback', 'set logging callback'] %}
+{% set LegacyCallbackFunctions = ['set logging callback'] %}
 
 //* Manually implemented mock functions due to incompatibility.
-{% set ManuallyMockedFunctions = ['set device lost callback'] %}
+{% set ManuallyMockedFunctions = ['set device lost callback', 'set uncaptured error callback'] %}
 
 {% for type in by_category["object"] %}
     {% for method in type.methods if method.name.get() not in ManuallyMockedFunctions %}
@@ -168,7 +167,7 @@
                 return {mNextFutureID++};
             }
             {% set CallbackInfoType = (method.arguments|last).type %}
-            {% set CallbackType = (CallbackInfoType.members|first).type %}
+            {% set CallbackType = find_by_name(CallbackInfoType.members, "callback").type %}
             void ProcTableAsClass::Call{{Suffix}}Callback(
                 {{-as_cType(type.name)}} {{as_varName(type.name)}}
                 {%- for arg in CallbackType.arguments -%}
@@ -223,13 +222,21 @@
     {% endfor %}
 {% endfor %}
 
-// Manually implement device lost related callback helpers for testing.
+// Manually implement some callback helpers for testing.
 void ProcTableAsClass::DeviceSetDeviceLostCallback(WGPUDevice device,
                                                    WGPUDeviceLostCallback callback,
                                                    void* userdata) {
     ProcTableAsClass::Object* object = reinterpret_cast<ProcTableAsClass::Object*>(device);
-    object->mDeviceLostOldCallback = callback;
-    object->mDeviceLostUserdata = userdata;
+    object->mDeviceLostCallback = [](WGPUDevice const*, WGPUDeviceLostReason reason,
+                                     char const* message, void* callback, void* userdata) {
+        if (callback == nullptr) {
+            return;
+        }
+        auto cb = reinterpret_cast<WGPUDeviceLostCallback>(callback);
+        cb(reason, message, userdata);
+    };
+    object->mDeviceLostUserdata1 = reinterpret_cast<void*>(callback);
+    object->mDeviceLostUserdata2 = userdata;
 
     OnDeviceSetDeviceLostCallback(device, callback, userdata);
 }
@@ -237,12 +244,32 @@
                                                                WGPUDeviceLostReason reason,
                                                                char const* message) {
     ProcTableAsClass::Object* object = reinterpret_cast<ProcTableAsClass::Object*>(device);
-    // If we have an old callback set, call that one, otherwise call the new one.
-    if (object->mDeviceLostOldCallback != nullptr) {
-        object->mDeviceLostOldCallback(reason, message, object->mDeviceLostUserdata);
-    } else {
-        object->mDeviceLostCallback(&device, reason, message, object->mDeviceLostUserdata);
-    }
+    object->mDeviceLostCallback(&device, reason, message, object->mDeviceLostUserdata1,
+                                object->mDeviceLostUserdata2);
+}
+void ProcTableAsClass::DeviceSetUncapturedErrorCallback(WGPUDevice device,
+                                                        WGPUErrorCallback callback,
+                                                        void* userdata) {
+    ProcTableAsClass::Object* object = reinterpret_cast<ProcTableAsClass::Object*>(device);
+    object->mUncapturedErrorCallback = [](WGPUDevice const*, WGPUErrorType type,
+                                          char const* message, void* callback, void* userdata) {
+        if (callback == nullptr) {
+            return;
+        }
+        auto cb = reinterpret_cast<WGPUErrorCallback>(callback);
+        cb(type, message, userdata);
+    };
+    object->mUncapturedErrorUserdata1 = reinterpret_cast<void*>(callback);
+    object->mUncapturedErrorUserdata2 = userdata;
+
+    OnDeviceSetUncapturedErrorCallback(device, callback, userdata);
+}
+void ProcTableAsClass::CallDeviceSetUncapturedErrorCallbackCallback(WGPUDevice device,
+                                                                    WGPUErrorType type,
+                                                                    char const* message) {
+    ProcTableAsClass::Object* object = reinterpret_cast<ProcTableAsClass::Object*>(device);
+    object->mUncapturedErrorCallback(&device, type, message, object->mUncapturedErrorUserdata1,
+                                     object->mUncapturedErrorUserdata2);
 }
 
 {% for type in by_category["object"] %}