[emscripten] CreateBuffer: return nullptr on RangeError

This makes emdawnwebgpu match the behavior of JS and Dawn Wire (and Dawn
Native after the corresponding fix).

No-Try: true
Bug: 42241190
Change-Id: If1ff7db995e73e6d32cbbc0cbc3911a95225f43d
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/230474
Reviewed-by: Loko Kung <lokokung@google.com>
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
diff --git a/src/emdawnwebgpu/BUILD.gn b/src/emdawnwebgpu/BUILD.gn
index 4f0b4c9..c36e58b 100644
--- a/src/emdawnwebgpu/BUILD.gn
+++ b/src/emdawnwebgpu/BUILD.gn
@@ -177,7 +177,7 @@
     sources = get_target_outputs(":emdawnwebgpu_headers_gen") +
               [ "../../third_party/emdawnwebgpu/webgpu.cpp" ]
     inputs = [
-      # FIXME: Changing these files still doesn't cause a relink. Why?
+      # TODO(crbug.com/371024051): Changing these files doesn't seem to trigger a relink. Why?
       "../../third_party/emdawnwebgpu/library_webgpu.js",
     ]
   }
diff --git a/third_party/emdawnwebgpu/library_webgpu.js b/third_party/emdawnwebgpu/library_webgpu.js
index a121f57..5a86163 100644
--- a/third_party/emdawnwebgpu/library_webgpu.js
+++ b/third_party/emdawnwebgpu/library_webgpu.js
@@ -963,7 +963,6 @@
     return data;
   },
 
-  emwgpuBufferWriteMappedRange__deps: ['$warnOnce'],
   emwgpuBufferWriteMappedRange__sig: 'ipppp',
   emwgpuBufferWriteMappedRange: (bufferPtr, offset, data, size) => {
     var buffer = WebGPU.getJsObject(bufferPtr);
@@ -980,7 +979,6 @@
     return {{{ gpu.Status.Success }}};
   },
 
-  emwgpuBufferReadMappedRange__deps: ['$warnOnce'],
   emwgpuBufferReadMappedRange__sig: 'ipppp',
   emwgpuBufferReadMappedRange: (bufferPtr, offset, data, size) => {
     var buffer = WebGPU.getJsObject(bufferPtr);
@@ -1525,10 +1523,23 @@
     };
 
     var device = WebGPU.getJsObject(devicePtr);
-    WebGPU.Internals.jsObjectInsert(bufferPtr, device.createBuffer(desc));
+    var buffer;
+    try {
+      buffer = device.createBuffer(desc);
+    } catch (ex) {
+      // The only exception should be RangeError if mapping at creation ran out of memory.
+      {{{ gpu.makeCheck('ex instanceof RangeError') }}}
+      {{{ gpu.makeCheck('mappedAtCreation') }}}
+#if ASSERTIONS
+      err('createBuffer threw:', ex);
+#endif
+      return false;
+    }
+    WebGPU.Internals.jsObjectInsert(bufferPtr, buffer);
     if (mappedAtCreation) {
       WebGPU.Internals.bufferOnUnmaps[bufferPtr] = [];
     }
+    return true;
   },
 
   wgpuDeviceCreateCommandEncoder__deps: ['emwgpuCreateCommandEncoder'],
diff --git a/third_party/emdawnwebgpu/webgpu.cpp b/third_party/emdawnwebgpu/webgpu.cpp
index 23f0a80..b0beed3 100644
--- a/third_party/emdawnwebgpu/webgpu.cpp
+++ b/third_party/emdawnwebgpu/webgpu.cpp
@@ -54,9 +54,10 @@
 
 // Device functions, i.e. creation functions to create JS backing objects given
 // a pre-allocated handle, and destruction implementations.
-void emwgpuDeviceCreateBuffer(WGPUDevice device,
-                              const WGPUBufferDescriptor* descriptor,
-                              WGPUBuffer buffer);
+[[nodiscard]] bool emwgpuDeviceCreateBuffer(
+    WGPUDevice device,
+    const WGPUBufferDescriptor* descriptor,
+    WGPUBuffer buffer);
 void emwgpuDeviceCreateShaderModule(
     WGPUDevice device,
     const WGPUShaderModuleDescriptor* descriptor,
@@ -150,7 +151,7 @@
  public:
   static constexpr bool HasExternalRefCount = false;
 
-  explicit RefCounted(ImportedFromJSTag tag) : mIsImportedFromJS(true) {}
+  explicit RefCounted(ImportedFromJSTag) : mIsImportedFromJS(true) {}
   RefCounted() = default;
 
   void AddRef() {
@@ -1797,7 +1798,10 @@
 WGPUBuffer wgpuDeviceCreateBuffer(WGPUDevice device,
                                   const WGPUBufferDescriptor* descriptor) {
   WGPUBuffer buffer = new WGPUBufferImpl(device, descriptor->mappedAtCreation);
-  emwgpuDeviceCreateBuffer(device, descriptor, buffer);
+  if (!emwgpuDeviceCreateBuffer(device, descriptor, buffer)) {
+    delete buffer;
+    return nullptr;
+  }
   return buffer;
 }