[dawn] Replace a few new[] with HeapArray

Bug: 512465980
Change-Id: Iddc8a366833679344175af414915a39e3088845b
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/302596
Commit-Queue: Shrek Shao <shrekshao@google.com>
Reviewed-by: Shrek Shao <shrekshao@google.com>
Auto-Submit: Kai Ninomiya <kainino@chromium.org>
diff --git a/src/dawn/wire/client/LimitsAndFeatures.cpp b/src/dawn/wire/client/LimitsAndFeatures.cpp
index 17b285c..97b888c 100644
--- a/src/dawn/wire/client/LimitsAndFeatures.cpp
+++ b/src/dawn/wire/client/LimitsAndFeatures.cpp
@@ -30,6 +30,7 @@
 #include "src/dawn/wire/SupportedFeatures.h"
 #include "src/utils/assert.h"
 #include "src/utils/compiler.h"
+#include "src/utils/heap_array.h"
 
 namespace dawn::wire::client {
 
@@ -75,22 +76,9 @@
         return;
     }
 
-    const size_t count = mFeatures.size();
-    supportedFeatures->featureCount = count;
-    supportedFeatures->features = nullptr;
-
-    if (count == 0) {
-        return;
-    }
-
     // This will be freed by wgpuSupportedFeaturesFreeMembers.
-    WGPUFeatureName* features = new WGPUFeatureName[count];
-    uint32_t index = 0;
-    for (WGPUFeatureName f : mFeatures) {
-        DAWN_UNSAFE_TODO(features[index++]) = f;
-    }
-    DAWN_ASSERT(index == count);
-    supportedFeatures->features = features;
+    std::tie(supportedFeatures->featureCount, supportedFeatures->features) =
+        HeapArrayFrom(mFeatures).MoveToRawPointer();
 }
 
 void LimitsAndFeatures::SetLimits(const WGPULimits* limits) {
diff --git a/src/dawn/wire/client/Surface.cpp b/src/dawn/wire/client/Surface.cpp
index cc4b5b3..6603caf 100644
--- a/src/dawn/wire/client/Surface.cpp
+++ b/src/dawn/wire/client/Surface.cpp
@@ -115,20 +115,13 @@
     capabilities->nextInChain = nullptr;
     capabilities->usages = mSupportedUsages;
 
-    capabilities->presentModeCount = mSupportedPresentModes.size();
-    WGPUPresentMode* presentModes = new WGPUPresentMode[capabilities->presentModeCount];
-    std::copy(mSupportedPresentModes.begin(), mSupportedPresentModes.end(), presentModes);
-    capabilities->presentModes = presentModes;
-
-    capabilities->formatCount = mSupportedFormats.size();
-    WGPUTextureFormat* formats = new WGPUTextureFormat[capabilities->formatCount];
-    std::copy(mSupportedFormats.begin(), mSupportedFormats.end(), formats);
-    capabilities->formats = formats;
-
-    capabilities->alphaModeCount = mSupportedAlphaModes.size();
-    WGPUCompositeAlphaMode* alphaModes = new WGPUCompositeAlphaMode[capabilities->alphaModeCount];
-    std::copy(mSupportedAlphaModes.begin(), mSupportedAlphaModes.end(), alphaModes);
-    capabilities->alphaModes = alphaModes;
+    // These will be freed by APIFreeMembers.
+    std::tie(capabilities->presentModeCount, capabilities->presentModes) =
+        HeapArrayFrom(mSupportedPresentModes).MoveToRawPointer();
+    std::tie(capabilities->formatCount, capabilities->formats) =
+        HeapArrayFrom(mSupportedFormats).MoveToRawPointer();
+    std::tie(capabilities->alphaModeCount, capabilities->alphaModes) =
+        HeapArrayFrom(mSupportedAlphaModes).MoveToRawPointer();
 
     return WGPUStatus_Success;
 }
diff --git a/src/dawn/wire/server/ServerQueue.cpp b/src/dawn/wire/server/ServerQueue.cpp
index 42d0ca3..7f8286a 100644
--- a/src/dawn/wire/server/ServerQueue.cpp
+++ b/src/dawn/wire/server/ServerQueue.cpp
@@ -31,6 +31,7 @@
 
 #include "src/dawn/wire/server/Server.h"
 #include "src/utils/assert.h"
+#include "src/utils/heap_array.h"
 
 namespace dawn::wire::server {