helloadhavan/github_issues huggingface dataset:
Repository: huggingface/transformers
Pull request: [timm] new timm pin

# What does this PR do?

Updates the pin in timm to allow the latest version (1.0.19), but excludes a version that's incompatible with older python versions (1.0.18).

NOTE: `timm==1.0.18` is causing red CI e.g. [here](https://app.circleci.com/pipelines/github/huggingface/transformers/139243/workflows/33c8dbbb-e29b-429c-8cfb-61e28591f902/jobs/1845235/steps) 

Changed files:
filename: setup.py
patch: @@ -188,7 +188,7 @@
     "tf2onnx",
     "timeout-decorator",
     "tiktoken",
-    "timm<=1.0.11",
+    "timm<=1.0.19,!=1.0.18",
     "tokenizers>=0.21,<0.22",
     "torch>=2.1",
     "torchaudio",

filename: src/transformers/dependency_versions_table.py
patch: @@ -90,7 +90,7 @@
     "tf2onnx": "tf2onnx",
     "timeout-decorator": "timeout-decorator",
     "tiktoken": "tiktoken",
-    "timm": "timm<=1.0.11",
+    "timm": "timm<=1.0.19,!=1.0.18",
     "tokenizers": "tokenizers>=0.21,<0.22",
     "torch": "torch>=2.1",
     "torchaudio": "torchaudio",
Repository: denoland/deno
Pull request: fix(ext/node): handle `null` ssl options in `node:https`

Fixes https://github.com/denoland/deno/issues/29364


Changed files:
filename: ext/node/polyfills/http.ts
patch: @@ -522,12 +522,12 @@ class ClientRequest extends OutgoingMessage {
           throw (this.socket.errored || err);
         }
         if (this._encrypted) {
-          const hasCaCerts = this.agent?.options?.ca !== undefined;
+          const hasCaCerts = !!this.agent?.options?.ca;
           const caCerts = hasCaCerts
             ? [this.agent.options.ca.toString("UTF-8")]
             : [];
-          const hasTlsKey = this.agent?.options?.key !== undefined &&
-            this.agent?.options?.cert !== undefined;
+          const hasTlsKey = !!this.agent?.options?.key &&
+            !!this.agent?.options?.cert;
           const keyPair = hasTlsKey
             ? op_tls_key_static(this.agent.options.cert, this.agent.options.key)
             : op_tls_key_null();

filename: tests/unit_node/http_test.ts
patch: @@ -2127,3 +2127,21 @@ Deno.test("[node/http] client http over unix socket works", {
   await promise;
   await server.finished;
 });
+
+Deno.test("[node/https] null ca, key and cert req options", {
+  permissions: { net: ["localhost:5545"] },
+}, async () => {
+  const { promise, resolve } = Promise.withResolvers<void>();
+  https.request("https://localhost:5545/echo.ts", {
+    ca,
+    // @ts-expect-error - key can be null at runtime
+    key: null,
+    // @ts-expect-error - cert can be null at runtime
+    cert: null,
+  }, async (res) => {
+    assertEquals(res.statusCode, 200);
+    assertStringIncludes(await text(res), "function echo(");
+    resolve();
+  }).end();
+  await promise;
+});
Repository: denoland/deno
Pull request: fix(ext/node): prevent stdin double read

Accidental debug code from https://github.com/denoland/deno/commit/28cb8f7011f533e3c79da6832cea098030e35953

Changed files:
filename: ext/node/polyfills/internal_binding/stream_wrap.ts
patch: @@ -144,11 +144,6 @@ export class LibuvStreamWrap extends HandleWrap {
       this.#read();
     }
 
-    if (this.cancelHandle) {
-      this.#reading = true;
-      this.#read();
-    }
-
     return 0;
   }
Repository: electron/electron
Pull request: fix: remove redundant `MediaCaptureDevicesDispatcher::GetInstance()` call

Backport of #45929

See that PR for details.


Notes: none.

Changed files:
filename: shell/browser/electron_browser_main_parts.cc
patch: @@ -344,9 +344,6 @@ int ElectronBrowserMainParts::PreCreateThreads() {
   // Force MediaCaptureDevicesDispatcher to be created on UI thread.
   MediaCaptureDevicesDispatcher::GetInstance();
 
-  // Force MediaCaptureDevicesDispatcher to be created on UI thread.
-  MediaCaptureDevicesDispatcher::GetInstance();
-
 #if BUILDFLAG(IS_MAC)
   ui::InitIdleMonitor();
   Browser::Get()->ApplyForcedRTL();
Repository: denoland/deno
Pull request: fix(task): wildcard match starts at the beginning

Closes https://github.com/denoland/deno/issues/29341

Changed files:
filename: cli/tools/task.rs
patch: @@ -929,12 +929,7 @@ fn match_tasks(
 
   // Match tasks in deno.json
   for name in tasks_config.task_names() {
-    let matches_filter = match &task_name_filter {
-      TaskNameFilter::Exact(n) => *n == name,
-      TaskNameFilter::Regex(re) => re.is_match(name),
-    };
-
-    if matches_filter && !visited.contains(name) {
+    if task_name_filter.matches(name) && !visited.contains(name) {
       matched.insert(name.to_string());
       visit_task_and_dependencies(tasks_config, &mut visited, name);
     }
@@ -957,6 +952,7 @@ fn arg_to_task_name_filter(input: &str) -> Result<TaskNameFilter, AnyError> {
 
   let mut regex_str = regex::escape(input);
   regex_str = regex_str.replace("\\*", ".*");
+  regex_str = format!("^{}", regex_str);
   let re = Regex::new(&regex_str)?;
   Ok(TaskNameFilter::Regex(re))
 }
@@ -967,6 +963,15 @@ enum TaskNameFilter<'s> {
   Regex(regex::Regex),
 }
 
+impl TaskNameFilter<'_> {
+  fn matches(&self, name: &str) -> bool {
+    match self {
+      Self::Exact(n) => *n == name,
+      Self::Regex(re) => re.is_match(name),
+    }
+  }
+}
+
 #[cfg(test)]
 mod tests {
   use super::*;
@@ -985,5 +990,10 @@ mod tests {
       arg_to_task_name_filter("test*").unwrap(),
       TaskNameFilter::Regex(_)
     ));
+
+    let filter = arg_to_task_name_filter("test:*").unwrap();
+    assert!(filter.matches("test:deno"));
+    assert!(filter.matches("test:dprint"));
+    assert!(!filter.matches("update:latest:deno"));
   }
 }
Repository: vercel/next.js
Pull request: Delete unused `renderToString` function

The `renderToString` function's last usage was removed in #78495.

Changed files:
filename: packages/next/src/server/app-render/render-to-string.tsx
patch: @@ -1,15 +0,0 @@
-import { streamToString } from '../stream-utils/node-web-streams-helper'
-
-export async function renderToString({
-  renderToReadableStream,
-  element,
-}: {
-  // `renderToReadableStream()` method could come from different react-dom/server implementations
-  // such as `react-dom/server.edge` or `react-dom/server.node`, etc.
-  renderToReadableStream: typeof import('react-dom/server').renderToReadableStream
-  element: React.ReactElement
-}): Promise<string> {
-  const renderStream = await renderToReadableStream(element)
-  await renderStream.allReady
-  return streamToString(renderStream)
-}
Repository: electron/electron
Pull request: fix: remove redundant `MediaCaptureDevicesDispatcher::GetInstance()` call

#### Description of Change

Remove redundant `MediaCaptureDevicesDispatcher::GetInstance()` call.

This appears to be a copy-paste error introduced in 465dee2c335db1cf081d07e84b757a65b984d881

#### Checklist

- [x] PR description included and stakeholders cc'd
- [x] `npm test` passes
- [x] [PR release notes](https://github.com/electron/clerk/blob/main/README.md) describe the change in a way relevant to app developers, and are [capitalized, punctuated, and past tense](https://github.com/electron/clerk/blob/main/README.md#examples).

#### Release Notes

Notes: none.

Changed files:
filename: shell/browser/electron_browser_main_parts.cc
patch: @@ -344,9 +344,6 @@ int ElectronBrowserMainParts::PreCreateThreads() {
   // Force MediaCaptureDevicesDispatcher to be created on UI thread.
   MediaCaptureDevicesDispatcher::GetInstance();
 
-  // Force MediaCaptureDevicesDispatcher to be created on UI thread.
-  MediaCaptureDevicesDispatcher::GetInstance();
-
 #if BUILDFLAG(IS_MAC)
   ui::InitIdleMonitor();
   Browser::Get()->ApplyForcedRTL();
Repository: ggml-org/llama.cpp
Pull request: examples : support encoder-decoder models in the simple example

I'd like to add support of encoder-decoder models in the simple example.
I believe it will help people who would like to build apps with encoder-decoder (e.g., T5) models based on llama.cpp.
Thanks.


Changed files:
filename: examples/simple/simple.cpp
patch: @@ -145,6 +145,20 @@ int main(int argc, char ** argv) {
 
     llama_batch batch = llama_batch_get_one(prompt_tokens.data(), prompt_tokens.size());
 
+    if (llama_model_has_encoder(model)) {
+        if (llama_encode(ctx, batch)) {
+            fprintf(stderr, "%s : failed to eval\n", __func__);
+            return 1;
+        }
+
+        llama_token decoder_start_token_id = llama_model_decoder_start_token(model);
+        if (decoder_start_token_id == LLAMA_TOKEN_NULL) {
+            decoder_start_token_id = llama_vocab_bos(vocab);
+        }
+
+        batch = llama_batch_get_one(&decoder_start_token_id, 1);
+    }
+
     // main loop
 
     const auto t_main_start = ggml_time_us();
Repository: vercel/next.js
Pull request: Fix build-native.ts on Windows

`process.argv` contains backslashes on Windows, but the `import.meta.url` file URL always uses forward slashes.

Closes PACK-5072

Changed files:
filename: scripts/build-native.ts
patch: @@ -2,6 +2,7 @@
 
 import { promises as fs } from 'node:fs'
 import path from 'node:path'
+import url from 'node:url'
 import execa from 'execa'
 import { NEXT_DIR, logCommand, execFn } from './pack-util'
 
@@ -31,7 +32,7 @@ export default async function buildNative(
 }
 
 // Check if this file is being run directly
-if (import.meta.url === `file://${process.argv[1]}`) {
+if (import.meta.url === url.pathToFileURL(process.argv[1]).toString()) {
   buildNative(process.argv.slice(2)).catch((err) => {
     console.error(err)
     process.exit(1)
Repository: denoland/deno
Pull request: test: Capture output of failing node compat tests

Will actually show test error instead of "error: Test failed"

Changed files:
filename: tests/node_compat/run_all_test_unmodified.ts
patch: @@ -277,9 +277,10 @@ async function runSingle(testPath: string, retry = 0): Promise<SingleResult> {
     if (result.code === 0) {
       return [true];
     } else {
+      const output = usesNodeTest ? result.stdout : result.stderr;
       return [false, {
         code: result.code,
-        stderr: truncateTestOutput(new TextDecoder().decode(result.stderr)),
+        stderr: truncateTestOutput(new TextDecoder().decode(output)),
       }];
     }
   } catch (e) {
Repository: nodejs/node
Pull request: src: update std::vector<v8::Local<T>> to use v8::LocalVector<T>

A follow up of https://github.com/nodejs/node/pull/57578 to replace all std::vector<v8::Local> to use v8::LocalVector

This is the last of these updates, we don't have anymore uses `std::vector<v8::Local>` after this :)

Changed files:
filename: src/node_messaging.cc
patch: @@ -27,6 +27,7 @@ using v8::Isolate;
 using v8::Just;
 using v8::JustVoid;
 using v8::Local;
+using v8::LocalVector;
 using v8::Maybe;
 using v8::MaybeLocal;
 using v8::Nothing;
@@ -74,7 +75,7 @@ class DeserializerDelegate : public ValueDeserializer::Delegate {
       Message* m,
       Environment* env,
       const std::vector<BaseObjectPtr<BaseObject>>& host_objects,
-      const std::vector<Local<SharedArrayBuffer>>& shared_array_buffers,
+      const LocalVector<SharedArrayBuffer>& shared_array_buffers,
       const std::vector<CompiledWasmModule>& wasm_modules,
       const std::optional<SharedValueConveyor>& shared_value_conveyor)
       : env_(env),
@@ -129,7 +130,7 @@ class DeserializerDelegate : public ValueDeserializer::Delegate {
  private:
   Environment* env_;
   const std::vector<BaseObjectPtr<BaseObject>>& host_objects_;
-  const std::vector<Local<SharedArrayBuffer>>& shared_array_buffers_;
+  const LocalVector<SharedArrayBuffer>& shared_array_buffers_;
   const std::vector<CompiledWasmModule>& wasm_modules_;
   const std::optional<SharedValueConveyor>& shared_value_conveyor_;
 };
@@ -188,7 +189,7 @@ MaybeLocal<Value> Message::Deserialize(Environment* env,
   }
   transferables_.clear();
 
-  std::vector<Local<SharedArrayBuffer>> shared_array_buffers;
+  LocalVector<SharedArrayBuffer> shared_array_buffers(env->isolate());
   // Attach all transferred SharedArrayBuffers to their new Isolate.
   for (uint32_t i = 0; i < shared_array_buffers_.size(); ++i) {
     Local<SharedArrayBuffer> sab =
@@ -477,7 +478,7 @@ Maybe<bool> Message::Serialize(Environment* env,
   ValueSerializer serializer(env->isolate(), &delegate);
   delegate.serializer = &serializer;
 
-  std::vector<Local<ArrayBuffer>> array_buffers;
+  LocalVector<ArrayBuffer> array_buffers(env->isolate());
   for (uint32_t i = 0; i < transfer_list_v.length(); ++i) {
     Local<Value> entry_val = transfer_list_v[i];
     if (!entry_val->IsObject()) {
@@ -999,7 +1000,7 @@ static Maybe<bool> ReadIterable(Environment* env,
     return Nothing<bool>();
   if (!next->IsFunction()) return Just(false);
 
-  std::vector<Local<Value>> entries;
+  LocalVector<Value> entries(isolate);
   while (env->can_call_into_js()) {
     Local<Value> result;
     if (!next.As<Function>()->Call(context, iterator, 0, nullptr)
Repository: ggml-org/llama.cpp
Pull request: llama-quant : fix the verification of attention layers for encoder-decoder models

llama.cpp fails to quantize T5 models with unequal encoder-decoder blocks.
The failure was caused by the failing of the verification of attention layers.
```cpp
GGML_ASSERT((qs.n_attention_wv == n_attn_layer - pruned_attention_w) && "n_attention_wv is unexpected");
```

The original verification has assumed that the encoder and decoder have the same number of blocks.
So it fails with unequal encoder-decoder models.
 
Testing: flan-t5-small, t5-small and an unequal encoder-decoder t5 model


Changed files:
filename: src/llama-quant.cpp
patch: @@ -725,7 +725,9 @@ static void llama_model_quantize_impl(const std::string & fname_inp, const std::
         // attention layers have a non-zero number of kv heads
         int32_t n_attn_layer = model.hparams.n_layer - std::count(n_head_kv_iter, n_head_kv_iter + model.hparams.n_layer, 0);
         if (llama_model_has_encoder(&model)) {
-            n_attn_layer *= 3;
+            // now n_attn_layer is the number of attention layers in the encoder
+            // for each decoder block, there are 2 attention layers
+            n_attn_layer += 2 * model.hparams.dec_n_layer;
         }
         GGML_ASSERT((qs.n_attention_wv == n_attn_layer - pruned_attention_w) && "n_attention_wv is unexpected");
     }
Repository: vercel/next.js
Pull request: fix(router): Prevent redirect loop on root data requests with basePath

Fixes #64910

This PR resolves an issue where a client-side navigation to the root page fails when both `basePath` and `middleware` are active. This is caused by an incorrect redirect loop on the `/_next/data` request.

The sequence of events is as follows:
1.  Next.js enforces its `trailingSlash: false` policy by adding an internal redirect from `{basePath}/` to `{basePath}`.
2.  For middleware to be invoked correctly, a data request for the root page is normalized to `/`.
3.  The path is then re-joined with the `basePath` using `path.posix.join(config.basePath, '/')`, which incorrectly results in `{basePath}/`.
4.  This malformed path triggers the redirect from step 1, causing the data fetch to fail with a 308 status code and resulting in empty `pageProps`.

This fix isolates the root path (`/`) during path normalization to prevent an extra trailing slash from being added. By ensuring the path resolves to `{basePath}` instead of `{basePath}/`, the redirect loop is avoided.

The change correctly handles the root path while leaving the logic for all other paths untouched.

Changed files:
filename: packages/next/src/server/lib/router-utils/resolve-routes.ts
patch: @@ -423,7 +423,10 @@ export function getResolveRoutes(
             // base path.
             if (updated) {
               if (hadBasePath) {
-                normalized = path.posix.join(config.basePath, normalized)
+                normalized =
+                  normalized === '/'
+                    ? config.basePath
+                    : path.posix.join(config.basePath, normalized)
               }
 
               // Re-add the trailing slash (if required).

filename: test/e2e/middleware-base-path/app/pages/other.js
patch: @@ -0,0 +1,12 @@
+import Link from 'next/link'
+
+export default function Other() {
+  return (
+    <div>
+      <h1>Other page</h1>
+      <Link href="/" id="go-to-home">
+        Go to home
+      </Link>
+    </div>
+  )
+}

filename: test/e2e/middleware-base-path/test/index.test.ts
patch: @@ -35,6 +35,7 @@ describe('Middleware base tests', () => {
     const $ = cheerio.load(html)
     expect($('.title').text()).toBe('About Page')
   })
+
   it('router.query must exist when Link clicked page routing', async () => {
     const browser = await webdriver(next.url, '/root')
     try {
@@ -45,4 +46,15 @@ describe('Middleware base tests', () => {
       await browser.close()
     }
   })
+
+  it('should allow client-side navigation to the root', async () => {
+    const browser = await webdriver(next.url, '/root/other')
+    try {
+      await browser.elementById('go-to-home').click()
+      const title = await browser.waitForElementByCss('.title').text()
+      expect(title).toMatch('Hello World')
+    } finally {
+      await browser.close()
+    }
+  })
 })
Repository: huggingface/transformers
Pull request: fix: Update pixel_values parameter in hf_model input

# What does this PR do?

## Changes
- Modified hf_model input parameter from original_pixel_values to pixel_values to use correct variable name
- The code shows that original_model takes original_pixel_values as input while hf_model uses pixel_values.
```python
logits = hf_model(
-       pixel_values=original_pixel_values,
+       pixel_values=pixel_values, 
    input_ids=input_ids,
    attention_mask=attention_mask,
    use_image_text_matching_head=True,
)
```

## Before submitting
- [X] This PR fixes a typo or improves the docs (you can dismiss the other checks if that's the case).
- [X] Did you read the [contributor guideline](https://github.com/huggingface/transformers/blob/main/CONTRIBUTING.md#create-a-pull-request),
      Pull Request section?
- [ ] Was this discussed/approved via a Github issue or the [forum](https://discuss.huggingface.co/)? Please add a link
      to it if that's the case.
- [ ] Did you make sure to update the documentation with your changes? Here are the
      [documentation guidelines](https://github.com/huggingface/transformers/tree/main/docs), and
      [here are tips on formatting docstrings](https://github.com/huggingface/transformers/tree/main/docs#writing-source-documentation).
- [ ] Did you write any new necessary tests?


## Who can review?

Anyone in the community is free to review the PR once the tests have passed. Feel free to tag
members/contributors who may be interested in your PR.

@amyeroberts, @qubvel

Changed files:
filename: src/transformers/models/blip_2/convert_blip_2_original_to_pytorch.py
patch: @@ -249,7 +249,7 @@ def convert_blip2_checkpoint(
                 {"image": original_pixel_values, "text_input": [caption]}, match_head="itm"
             )
             logits = hf_model(
-                pixel_values=original_pixel_values,
+                pixel_values=pixel_values,
                 input_ids=input_ids,
                 attention_mask=attention_mask,
                 use_image_text_matching_head=True,
@@ -274,7 +274,7 @@ def convert_blip2_checkpoint(
                 {"image": original_pixel_values, "text_input": [caption]}, match_head="itc"
             )
             logits = hf_model(
-                pixel_values=original_pixel_values,
+                pixel_values=pixel_values,
                 input_ids=input_ids,
                 attention_mask=attention_mask,
                 use_image_text_matching_head=False,
Repository: nodejs/node
Pull request: worker: give names to `MessagePort` functions

This fixes names for:
- `worker_threads.MessagePort.prototype.hasRef` (was: anonymous)
- `worker_threads.MessagePort.prototype.close` (was: anonymous)
- `worker_threads.MessagePort.prototype.[kCreateEvent]` (was: `value`)

Changed files:
filename: lib/internal/worker/io.js
patch: @@ -18,6 +18,7 @@ const {
 } = primordials;
 
 const {
+  assignFunctionName,
   kEnumerableProperty,
   setOwnProperty,
 } = require('internal/util');
@@ -121,7 +122,7 @@ ObjectSetPrototypeOf(MessagePort.prototype, NodeEventTarget.prototype);
 // changing the prototype of MessagePort.prototype implicitly removed them.
 MessagePort.prototype.ref = MessagePortPrototype.ref;
 MessagePort.prototype.unref = MessagePortPrototype.unref;
-MessagePort.prototype.hasRef = function() {
+MessagePort.prototype.hasRef = function hasRef() {
   return !!FunctionPrototypeCall(MessagePortPrototype.hasRef, this);
 };
 
@@ -131,14 +132,14 @@ ObjectDefineProperty(
   kCreateEvent,
   {
     __proto__: null,
-    value: function(data, type) {
+    value: assignFunctionName(kCreateEvent, function(data, type) {
       if (type !== 'message' && type !== 'messageerror') {
         return ReflectApply(originalCreateEvent, this, arguments);
       }
       const ports = this[kCurrentlyReceivingPorts];
       this[kCurrentlyReceivingPorts] = undefined;
       return lazyMessageEvent(type, { data, ports });
-    },
+    }),
     configurable: false,
     writable: false,
     enumerable: false,
@@ -179,7 +180,7 @@ ObjectDefineProperty(MessagePort.prototype, handleOnCloseSymbol, {
   value: onclose,
 });
 
-MessagePort.prototype.close = function(cb) {
+MessagePort.prototype.close = function close(cb) {
   if (typeof cb === 'function')
     this.once('close', cb);
   FunctionPrototypeCall(MessagePortPrototype.close, this);
Repository: electron/electron
Pull request: fix: race condition in utilityProcess tests

Backport of #45926

See that PR for details.


Notes: none.

Changed files:
filename: spec/api-utility-process-spec.ts
patch: @@ -228,7 +228,6 @@ describe('utilityProcess module', () => {
       const child = utilityProcess.fork(fixtureFile, [], {
         stdio: 'pipe'
       });
-      await once(child, 'spawn');
       expect(child.stdout).to.not.be.null();
       let log = '';
       child.stdout!.on('data', (chunk) => {
@@ -293,7 +292,6 @@ describe('utilityProcess module', () => {
       const child = utilityProcess.fork(path.join(fixturesPath, 'log.js'), [], {
         stdio: 'pipe'
       });
-      await once(child, 'spawn');
       expect(child.stdout).to.not.be.null();
       let log = '';
       child.stdout!.on('data', (chunk) => {
@@ -326,7 +324,6 @@ describe('utilityProcess module', () => {
       const child = utilityProcess.fork(path.join(fixturesPath, 'log.js'), [], {
         stdio: ['ignore', 'pipe', 'pipe']
       });
-      await once(child, 'spawn');
       expect(child.stderr).to.not.be.null();
       let log = '';
       child.stderr!.on('data', (chunk) => {
Repository: denoland/deno
Pull request: feat(ext/webgpu): implement GPUQueue.onSubmittedWorkDone

RT

Changed files:
filename: ext/webgpu/queue.rs
patch: @@ -1,6 +1,7 @@
 // Copyright 2018-2025 the Deno authors. MIT license.
 
 use deno_core::cppgc::Ptr;
+use deno_core::futures::channel::oneshot;
 use deno_core::op2;
 use deno_core::GarbageCollected;
 use deno_core::WebIDL;
@@ -77,10 +78,16 @@ impl GPUQueue {
   }
 
   #[async_method]
-  async fn on_submitted_work_done(&self) -> Result<(), JsErrorBox> {
-    Err(JsErrorBox::generic(
-      "This operation is currently not supported",
-    ))
+  async fn on_submitted_work_done(&self) {
+    let (sender, receiver) = oneshot::channel::<()>();
+    let callback = Box::new(move || {
+      // the promise may be dropped, so `send` may fail.
+      let _ = sender.send(());
+    });
+    self
+      .instance
+      .queue_on_submitted_work_done(self.id, callback);
+    receiver.await.unwrap();
   }
 
   #[required(3)]

filename: tests/unit/webgpu_test.ts
patch: @@ -632,6 +632,23 @@ Deno.test({
   device.destroy();
 });
 
+Deno.test({
+  ignore: isWsl || isCIWithoutGPU,
+}, async function testOnSubmittedWorkDone() {
+  const adapter = await navigator.gpu.requestAdapter();
+  assert(adapter);
+
+  const device = await adapter.requestDevice();
+  assert(device);
+
+  const encoder = device.createCommandEncoder();
+  const fut = device.queue.onSubmittedWorkDone();
+  device.queue.submit([encoder.finish()]);
+  await fut;
+
+  device.destroy();
+});
+
 async function checkIsWsl() {
   return Deno.build.os === "linux" && await hasMicrosoftProcVersion();