[emscripten] Fix missing external ref in CreateBuffer

(No-Try because this only affects Emdawnwebgpu and all the tests passed
except for one bot that is having trouble.)

No-Try: true
Fixed: 429140223
Change-Id: I4d6457066637c36b263d57a9104706a5b1e04fbc
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/255556
Reviewed-by: Loko Kung <lokokung@google.com>
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
diff --git a/src/emdawnwebgpu/tests/SpotTests.cpp b/src/emdawnwebgpu/tests/SpotTests.cpp
index 59e7a16..7866cb4 100644
--- a/src/emdawnwebgpu/tests/SpotTests.cpp
+++ b/src/emdawnwebgpu/tests/SpotTests.cpp
@@ -117,4 +117,21 @@
     }
 }
 
+TEST_F(SpotTests, ExternalRefCount) {
+    wgpu::BufferDescriptor bufferDesc{
+        .usage = wgpu::BufferUsage::MapRead, .size = 16, .mappedAtCreation = true};
+
+    wgpu::Buffer buffer = device.CreateBuffer(&bufferDesc);
+    ASSERT_TRUE(buffer);
+    EXPECT_EQ(buffer.GetMapState(), wgpu::BufferMapState::Mapped);
+    {
+        // Add and then release an extra external ref.
+        wgpu::Buffer tmp = buffer;
+    }
+
+    // Make sure the device wasn't implicitly destroyed (because we thought
+    // the last external ref was dropped).
+    EXPECT_EQ(buffer.GetMapState(), wgpu::BufferMapState::Mapped);
+}
+
 }  // namespace
diff --git a/third_party/emdawnwebgpu/pkg/webgpu/src/webgpu.cpp b/third_party/emdawnwebgpu/pkg/webgpu/src/webgpu.cpp
index 19edd14..d483e49 100644
--- a/third_party/emdawnwebgpu/pkg/webgpu/src/webgpu.cpp
+++ b/third_party/emdawnwebgpu/pkg/webgpu/src/webgpu.cpp
@@ -1986,12 +1986,12 @@
 
 WGPUBuffer wgpuDeviceCreateBuffer(WGPUDevice device,
                                   const WGPUBufferDescriptor* descriptor) {
-  WGPUBuffer buffer = new WGPUBufferImpl(device, descriptor->mappedAtCreation);
-  if (!emwgpuDeviceCreateBuffer(device, descriptor, buffer)) {
-    delete buffer;
+  Ref<WGPUBufferImpl> buffer =
+      AcquireRef(new WGPUBufferImpl(device, descriptor->mappedAtCreation));
+  if (!emwgpuDeviceCreateBuffer(device, descriptor, buffer.Get())) {
     return nullptr;
   }
-  return buffer;
+  return ReturnToAPI(std::move(buffer));
 }
 
 WGPUFuture wgpuDeviceCreateComputePipelineAsync(