helloadhavan/github_issues huggingface dataset:
Repository: denoland/deno
Pull request: fix(ext/node): set socket.authorized to true for https request

This PR sets true to `req.socket.authorized` when making https request from `node:https` module.

This makes yarn classic's https client working (e.g. `yarn add cowsay`).

(Note: I avoided introducing yarn dependency for integration testing, which would introduce dependency to the internet in CI)

Changed files:
filename: ext/node/polyfills/http.ts
patch: @@ -538,6 +538,10 @@ class ClientRequest extends OutgoingMessage {
             caCerts: caCerts,
             alpnProtocols: ["http/1.0", "http/1.1"],
           }, keyPair);
+
+          // Simulates "secure" event on TLSSocket
+          // This makes yarn v1's https client working
+          this.socket.authorized = true;
         }
 
         this._req = await op_node_http_request_with_conn(

filename: tests/integration/node_unit_tests.rs
patch: @@ -74,6 +74,7 @@ util::unit_test_factory!(
     fs_test,
     fetch_test,
     http_test,
+    https_test,
     http_no_cert_flag_test,
     http2_test,
     inspector_test,
@@ -119,7 +120,7 @@ fn node_unit_test(test: String) {
     .arg("-A");
 
   // Some tests require the root CA cert file to be loaded.
-  if test == "http2_test" || test == "http_test" {
+  if test == "http2_test" || test == "http_test" || test == "https_test" {
     deno = deno.arg("--cert=./tests/testdata/tls/RootCA.pem");
   }
 

filename: tests/unit_node/https_test.ts
patch: @@ -0,0 +1,27 @@
+// Copyright 2018-2025 the Deno authors. MIT license.
+
+import https from "node:https";
+import { assert } from "../unit/test_util.ts";
+
+Deno.test({
+  name:
+    "request.socket.authorized is true when successfully requested to https server",
+  async fn() {
+    const server = Deno.serve({
+      port: 0,
+      cert: Deno.readTextFileSync("tests/testdata/tls/localhost.crt"),
+      key: Deno.readTextFileSync("tests/testdata/tls/localhost.key"),
+      onListen({ port }) {
+        const req = https.request(`https://localhost:${port}`, (res) => {
+          // deno-lint-ignore no-explicit-any
+          assert((req.socket as any).authorized);
+          res.destroy();
+          server.shutdown();
+        });
+      },
+    }, () => {
+      return new Response("hi");
+    });
+    await server.finished;
+  },
+});
Repository: facebook/react
Pull request: Remove dynamic www flag for disableInputAttributeSyncing

Remove dynamic www flag for disableInputAttributeSyncing


Changed files:
filename: packages/shared/forks/ReactFeatureFlags.www-dynamic.js
patch: @@ -13,7 +13,6 @@
 // Use __VARIANT__ to simulate a GK. The tests will be run twice: once
 // with the __VARIANT__ set to `true`, and once set to `false`.
 
-export const disableInputAttributeSyncing = __VARIANT__;
 export const disableIEWorkarounds = __VARIANT__;
 export const enableBigIntSupport = __VARIANT__;
 export const enableLegacyFBSupport = __VARIANT__;

filename: packages/shared/forks/ReactFeatureFlags.www.js
patch: @@ -15,7 +15,6 @@ import typeof * as DynamicFeatureFlags from './ReactFeatureFlags.www-dynamic';
 const dynamicFeatureFlags: DynamicFeatureFlags = require('ReactFeatureFlags');
 
 export const {
-  disableInputAttributeSyncing,
   disableIEWorkarounds,
   enableBigIntSupport,
   enableTrustedTypesIntegration,
@@ -57,6 +56,7 @@ export const enableUseMemoCacheHook = true;
 export const enableUseEffectEventHook = true;
 export const enableFilterEmptyStringAttributesDOM = true;
 export const enableAsyncActions = true;
+export const disableInputAttributeSyncing = false;
 
 // Logs additional User Timing API marks for use with an experimental profiling tool.
 export const enableSchedulingProfiler: boolean =

filename: scripts/jest/setupTests.www.js
patch: @@ -11,6 +11,10 @@ jest.mock('shared/ReactFeatureFlags', () => {
   // This flag is only used by tests, it should never be set elsewhere.
   actual.forceConcurrentByDefaultForTesting = !__VARIANT__;
 
+  // Flags that aren't currently used, but we still want to force variants to keep the
+  // code live.
+  actual.disableInputAttributeSyncing = __VARIANT__;
+
   return actual;
 });
Repository: nodejs/node
Pull request: watch: batch file restarts

Fixes https://github.com/nodejs/node/issues/51954

Changed files:
filename: lib/internal/main/watch_mode.js
patch: @@ -26,7 +26,7 @@ const { spawn } = require('child_process');
 const { inspect } = require('util');
 const { setTimeout, clearTimeout } = require('timers');
 const { resolve } = require('path');
-const { once, on } = require('events');
+const { once } = require('events');
 
 prepareMainThreadExecution(false, false);
 markBootstrapComplete();
@@ -103,27 +103,28 @@ async function stop() {
   clearGraceReport();
 }
 
+let restarting = false;
 async function restart() {
-  if (!kPreserveOutput) process.stdout.write(clear);
-  process.stdout.write(`${green}Restarting ${kCommandStr}${white}\n`);
-  await stop();
-  start();
-}
-
-(async () => {
-  emitExperimentalWarning('Watch mode');
-
+  if (restarting) return;
+  restarting = true;
   try {
+    if (!kPreserveOutput) process.stdout.write(clear);
+    process.stdout.write(`${green}Restarting ${kCommandStr}${white}\n`);
+    await stop();
     start();
+  } finally {
+    restarting = false;
+  }
+}
 
-    // eslint-disable-next-line no-unused-vars
-    for await (const _ of on(watcher, 'changed')) {
-      await restart();
-    }
-  } catch (error) {
+emitExperimentalWarning('Watch mode');
+start();
+watcher
+  .on('changed', restart)
+  .on('error', (error) => {
+    watcher.off('changed', restart);
     triggerUncaughtException(error, true /* fromPromise */);
-  }
-})();
+  });
 
 // Exiting gracefully to avoid stdout/stderr getting written after
 // parent process is killed.

filename: lib/internal/watch_mode/files_watcher.js
patch: @@ -32,7 +32,7 @@ class FilesWatcher extends EventEmitter {
   #signal;
 
   constructor({ debounce = 200, mode = 'filter', signal } = kEmptyObject) {
-    super();
+    super({ __proto__: null, captureRejections: true });
 
     validateNumber(debounce, 'options.debounce', 0, TIMEOUT_MAX);
     validateOneOf(mode, 'options.mode', ['filter', 'all']);
Repository: ggml-org/llama.cpp
Pull request: model : set res->t_embd in SmallThinker models

Noticed this was missing for SmallThinker too after #16766

Changed files:
filename: src/llama-model.cpp
patch: @@ -19339,6 +19339,7 @@ struct llm_build_smallthinker : public llm_graph_context{
 
         cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1);
         cb(cur, "result_norm", -1);
+        res->t_embd = cur;
 
         // lm_head
         cur = build_lora_mm(model.output, cur);
Repository: ollama/ollama
Pull request: fix model name not matching


Changed files:
filename: cmd/cmd.go
patch: @@ -127,13 +127,9 @@ func RunHandler(cmd *cobra.Command, args []string) error {
 		return err
 	}
 
-	modelName, modelTag, ok := strings.Cut(args[0], ":")
-	if !ok {
-		modelTag = "latest"
-	}
-
+	canonicalModelPath := server.ParseModelPath(args[0])
 	for _, model := range models.Models {
-		if model.Name == strings.Join([]string{modelName, modelTag}, ":") {
+		if model.Name == canonicalModelPath.GetShortTagname() {
 			return RunGenerate(cmd, args)
 		}
 	}
Repository: electron/electron
Pull request: fix: zlib pointer alignment

Backport of #46435

See that PR for details.


Notes: Fixes a possible crash using Node.js on some arm32 devices.

Changed files:
filename: patches/node/.patches
patch: @@ -46,3 +46,4 @@ test_make_eval_snapshot_tests_more_flexible.patch
 build_option_to_use_custom_inspector_protocol_path.patch
 feat_add_oom_error_callback_in_node_isolatesettings.patch
 fix_ensure_traverseparent_bails_on_resource_path_exit.patch
+zlib_fix_pointer_alignment.patch

filename: patches/node/zlib_fix_pointer_alignment.patch
patch: @@ -0,0 +1,50 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jeroen Hofstee <jhofstee@victronenergy.com>
+Date: Tue, 1 Apr 2025 20:09:31 +0000
+Subject: zlib: fix pointer alignment
+
+The function AllocForBrotli prefixes the allocated memory with its
+size, and returns a pointer to the region after it. This pointer can
+however no longer be suitably aligned. Correct this by allocating
+the maximum of the the size of the size_t and the max alignment.
+
+On Arm 32bits the size_t is 4 bytes long, but the alignment is 8 for
+some NEON instructions. When Brotli is compiled with optimizations
+enabled newer GCC versions will use the NEON instructions and trigger
+a bus error killing node.
+
+see https://github.com/google/brotli/issues/1159
+
+diff --git a/src/node_zlib.cc b/src/node_zlib.cc
+index 90307cd4984ae5aa55386f2980ad9cd540322dfd..6f12b5034d1a98da50c064cf2cfdf12fc88137eb 100644
+--- a/src/node_zlib.cc
++++ b/src/node_zlib.cc
+@@ -493,7 +493,8 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
+   }
+ 
+   static void* AllocForBrotli(void* data, size_t size) {
+-    size += sizeof(size_t);
++    constexpr size_t offset = std::max(sizeof(size_t), alignof(max_align_t));
++    size += offset;
+     CompressionStream* ctx = static_cast<CompressionStream*>(data);
+     char* memory = UncheckedMalloc(size);
+     if (memory == nullptr) [[unlikely]] {
+@@ -502,7 +503,7 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
+     *reinterpret_cast<size_t*>(memory) = size;
+     ctx->unreported_allocations_.fetch_add(size,
+                                            std::memory_order_relaxed);
+-    return memory + sizeof(size_t);
++    return memory + offset;
+   }
+ 
+   static void FreeForZlib(void* data, void* pointer) {
+@@ -510,7 +511,8 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
+       return;
+     }
+     CompressionStream* ctx = static_cast<CompressionStream*>(data);
+-    char* real_pointer = static_cast<char*>(pointer) - sizeof(size_t);
++    constexpr size_t offset = std::max(sizeof(size_t), alignof(max_align_t));
++    char* real_pointer = static_cast<char*>(pointer) - offset;
+     size_t real_size = *reinterpret_cast<size_t*>(real_pointer);
+     ctx->unreported_allocations_.fetch_sub(real_size,
+                                            std::memory_order_relaxed);
Repository: nodejs/node
Pull request: doc: correct stream.finished changes

Closes #52544


Changed files:
filename: doc/api/stream.md
patch: @@ -237,9 +237,16 @@ The `pipeline` API provides [callback version][stream-pipeline]:
 
 <!-- YAML
 added: v15.0.0
+changes:
+  - version:
+    - v19.5.0
+    - v18.14.0
+    pr-url: https://github.com/nodejs/node/pull/46205
+    description: Added support for `ReadableStream` and `WritableStream`.
 -->
 
-* `stream` {Stream}
+* `stream` {Stream|ReadableStream|WritableStream} A readable and/or writable
+  stream/webstream.
 * `options` {Object}
   * `error` {boolean|undefined}
   * `readable` {boolean|undefined}
Repository: ollama/ollama
Pull request: add painter message for exit

tell the user how to exit. other options are available (`/exit`, `ctrl+c`) but don't want to be too verbose

Changed files:
filename: cmd/cmd.go
patch: @@ -43,7 +43,7 @@ func (p Painter) Paint(line []rune, _ int) []rune {
 		if p.IsMultiLine {
 			prompt = "Use \"\"\" to end multi-line input"
 		} else {
-			prompt = "Send a message (/? for help)"
+			prompt = "Send a message (/? for help, /bye to exit)"
 		}
 		return []rune(fmt.Sprintf("\033[38;5;245m%s\033[%dD\033[0m", prompt, len(prompt)))
 	}
Repository: electron/electron
Pull request: perf: avoid redundant call to virtual methods GetProcess() and GetID()

Backport of #46409

See that PR for details.


Notes: none

Changed files:
filename: shell/browser/api/electron_api_web_contents.cc
patch: @@ -1788,19 +1788,18 @@ void WebContents::FrameDeleted(content::FrameTreeNodeId frame_tree_node_id) {
 }
 
 void WebContents::RenderViewDeleted(content::RenderViewHost* render_view_host) {
+  const auto id = render_view_host->GetProcess()->GetID().GetUnsafeValue();
   // This event is necessary for tracking any states with respect to
   // intermediate render view hosts aka speculative render view hosts. Currently
   // used by object-registry.js to ref count remote objects.
-  Emit("render-view-deleted",
-       render_view_host->GetProcess()->GetID().GetUnsafeValue());
+  Emit("render-view-deleted", id);
 
   if (web_contents()->GetRenderViewHost() == render_view_host) {
     // When the RVH that has been deleted is the current RVH it means that the
     // the web contents are being closed. This is communicated by this event.
     // Currently tracked by guest-window-manager.ts to destroy the
     // BrowserWindow.
-    Emit("current-render-view-deleted",
-         render_view_host->GetProcess()->GetID().GetUnsafeValue());
+    Emit("current-render-view-deleted", id);
   }
 }
Repository: vercel/next.js
Pull request: Update Rspack production test manifest

This auto-generated PR updates the production integration test manifest used when testing Rspack.

Changed files:
filename: test/rspack-build-tests-manifest.json
patch: @@ -19623,6 +19623,16 @@
     "flakey": [],
     "runtimeError": false
   },
+  "test/production/app-dir/types-gen-nounuselocal/types-gen-nounuselocal.test.ts": {
+    "passed": [
+      "types-gen-nounuselocal should build successfully",
+      "types-gen-nounuselocal should generate route types successfully"
+    ],
+    "failed": [],
+    "pending": [],
+    "flakey": [],
+    "runtimeError": false
+  },
   "test/production/app-dir/unexpected-error/unexpected-error.test.ts": {
     "passed": [
       "unexpected-error cannot change response status when streaming has started",
@@ -20280,11 +20290,10 @@
   },
   "test/production/pnpm-support/index.test.ts": {
     "passed": [
-      "pnpm support should build with dependencies installed via pnpm"
-    ],
-    "failed": [
+      "pnpm support should build with dependencies installed via pnpm",
       "pnpm support should execute client-side JS on each page in output: \"standalone\""
     ],
+    "failed": [],
     "pending": [],
     "flakey": [],
     "runtimeError": false
Repository: ollama/ollama
Pull request: do not unload nouveau driver

unloading this driver on a desktop kills the display which is not optimal. instead, inform the user they need to reboot

Changed files:
filename: scripts/install.sh
patch: @@ -227,12 +227,12 @@ if ! lsmod | grep -q nvidia; then
     fi
 
     if lsmod | grep -q nouveau; then
-        status "Removing nouveau..."
-        $SUDO rmmod nouveau
+        status 'Reboot to complete NVIDIA CUDA driver install.'
+        exit 0
     fi
 
     $SUDO modprobe nvidia
 fi
 
 
-status "NVIDIA GPU installed."
+status "NVIDIA CUDA drivers installed."
Repository: denoland/deno
Pull request: fix(tests): Switch from --nocapture to --no-capture

<!--
Before submitting a PR, please read https://docs.deno.com/runtime/manual/references/contributing

1. Give the PR a descriptive title.

  Examples of good title:
    - fix(std/http): Fix race condition in server
    - docs(console): Update docstrings
    - feat(doc): Handle nested reexports

  Examples of bad title:
    - fix #7123
    - update docs
    - fix bugs

2. Ensure there is a related issue and it is referenced in the PR text.
3. Ensure there are tests that cover the changes.
4. Ensure `cargo test` passes.
5. Ensure `./tools/format.js` passes without changing files.
6. Ensure `./tools/lint.js` passes.
7. Open as a draft PR if your work is still in progress. The CI won't run
   all steps, but you can add '[ci]' to a commit message to force it to.
8. If you would like to run the benchmarks on the CI, add the 'ci-bench' label.
-->
`--no-capture` was added in 1.88, with `--nocapture` being soft-deprecated.
https://releases.rs/docs/1.88.0/#libraries

Changed files:
filename: tests/specs/README.md
patch: @@ -26,11 +26,11 @@ Or just the following, though it might run other tests:
 cargo test test_name
 ```
 
-To run showing the output of every test use `-- --nocapture` (note: this will
+To run showing the output of every test use `-- --no-capture` (note: this will
 cause tests to run sequentially instead of in parallel):
 
 ```
-cargo test test_name -- --nocapture
+cargo test test_name -- --no-capture
 ```
 
 ## `__test__.json` file

filename: tests/specs/mod.rs
patch: @@ -25,8 +25,9 @@ use test_util::tests_path;
 
 const MANIFEST_FILE_NAME: &str = "__test__.jsonc";
 
-static NO_CAPTURE: Lazy<bool> =
-  Lazy::new(|| std::env::args().any(|arg| arg == "--nocapture"));
+static NO_CAPTURE: Lazy<bool> = Lazy::new(|| {
+  std::env::args().any(|arg| arg == "--no-capture" || arg == "--nocapture")
+});
 
 #[derive(Clone, Deserialize)]
 #[serde(untagged)]
Repository: ggml-org/llama.cpp
Pull request: convert: Handle mmproj model output filename properly

Currently when output filename is not specified, script generates file called `mmproj-model-dir` without any extension, in a parent directory. 

This PR changes the way default filename is handled. With this change generated file will look like this `model-dir/model-dir-ftype-mmproj.gguf`.

Note this uses `-mmproj` suffix, instead of `mmproj-` prefix. I opted to follow the established convention.

Example:
Current: `Qwen3VL-2B-Instruct/Qwen3VL-2b-Instruct-F16-mmproj.gguf`
Previous: `mmproj-Qwen3VL-2B-Instruct`, note unspecified filetype, wrong directory and missing extension

Changed files:
filename: convert_hf_to_gguf.py
patch: @@ -1497,6 +1497,17 @@ def get_audio_config(self) -> dict[str, Any] | None:
     def set_type(self):
         self.gguf_writer.add_type(gguf.GGUFType.MMPROJ)
 
+    def prepare_metadata(self, vocab_only: bool):
+        super().prepare_metadata(vocab_only=vocab_only)
+
+        output_type: str = self.ftype.name.partition("_")[2]
+
+        if self.fname_out.is_dir():
+            fname_default: str = gguf.naming_convention(self.metadata.name, self.metadata.basename, self.metadata.finetune, self.metadata.version, size_label=None, output_type=output_type, model_type=None)
+            self.fname_out = self.fname_out / f"mmproj-{fname_default}.gguf"
+        else:
+            self.fname_out = self.fname_out.parent / gguf.fill_templated_filename(self.fname_out.name, output_type)
+
     def set_gguf_parameters(self):
         self.gguf_writer.add_file_type(self.ftype)
 
@@ -9729,10 +9740,6 @@ def main() -> None:
 
     logger.info(f"Loading model: {dir_model.name}")
 
-    if args.mmproj:
-        if "mmproj" not in fname_out.name:
-            fname_out = ModelBase.add_prefix_to_filename(fname_out, "mmproj-")
-
     is_mistral_format = args.mistral_format
     if is_mistral_format and not _mistral_common_installed:
         raise ImportError(_mistral_import_error_msg)
Repository: huggingface/transformers
Pull request: Fix an infinite loop bug in recursive search of relative imports

# What does this PR do?

This PR fixes a bug in `get_relative_import_files` in `dynamic_module_utils`.
The mechanism to exclude already-found imports from the next iteration had a wrong inclusion check, as it was missing a ".py" suffix.
This means that even if an import was in `all_relative_imports`, it wasn't excluded from `files_to_check`.
In most cases it was a silent bug, but for files with circular imports it resulted in an infinite loop.

## Who can review?

Maybe @Rocketknight1, @Cyrilvallez  ?


Changed files:
filename: src/transformers/dynamic_module_utils.py
patch: @@ -130,11 +130,10 @@ def get_relative_import_files(module_file: Union[str, os.PathLike]) -> list[str]
             new_imports.extend(get_relative_imports(f))
 
         module_path = Path(module_file).parent
-        new_import_files = [str(module_path / m) for m in new_imports]
-        new_import_files = [f for f in new_import_files if f not in all_relative_imports]
-        files_to_check = [f"{f}.py" for f in new_import_files]
+        new_import_files = [f"{str(module_path / m)}.py" for m in new_imports]
+        files_to_check = [f for f in new_import_files if f not in all_relative_imports]
 
-        no_change = len(new_import_files) == 0
+        no_change = len(files_to_check) == 0
         all_relative_imports.extend(files_to_check)
 
     return all_relative_imports
Repository: facebook/react
Pull request: Bump nvmrc to Node.js v18

Bump nvmrc to Node.js v18

Node.js v16 is long deprecated, seems like for v20 there's some more stuff to fix.

---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed with [ReviewStack](https://reviewstack.dev/facebook/react/pull/28707).
* #28704
* __->__ #28707

Changed files:
filename: .nvmrc
patch: @@ -1 +1 @@
-v16.19.1
+v18.20.0
Repository: denoland/deno
Pull request: fix(bundle): avoid cloning parsed source, restore owned transpile assertion


Changed files:
filename: cli/tools/bundle/mod.rs
patch: @@ -1252,7 +1252,7 @@ impl DenoPluginHandler {
     source: &Arc<str>,
     is_known_script: Option<bool>,
   ) -> Result<Arc<str>, BundleLoadError> {
-    let parsed_source = self.parsed_source_cache.get_matching_parsed_source(
+    let parsed_source = self.parsed_source_cache.remove_or_parse_module(
       specifier,
       media_type,
       source.clone(),

filename: libs/resolver/emit.rs
patch: @@ -528,7 +528,7 @@ fn transpile(
   let transpiled_source = match transpile_result {
     TranspileResult::Owned(source) => source,
     TranspileResult::Cloned(source) => {
-      // debug_assert!(false, "Transpile owned failed.");
+      debug_assert!(false, "Transpile owned failed.");
       source
     }
   };
Repository: ggml-org/llama.cpp
Pull request: Explicitly set cur to res->t_embd in PLaMo2 models

This PR adds a line to explicitly set `res->t_embd` with `cur` in the PLaMo2 model implementation.
Without this fix, the ollama always crashes because params.embeddings is hard-coded with `true` at [ollama/llama/llama.go:L120](https://github.com/ollama/ollama/blob/ad6f6a1d29f45a5c7266bcd7edb5671621e86810/llama/llama.go#L120) and it results in a call of this assertion:
https://github.com/ollama/ollama/blob/ad6f6a1d29f45a5c7266bcd7edb5671621e86810/llama/llama.cpp/src/llama-graph.cpp#L1894
then it fails because `res->t_embd` here:
https://github.com/ollama/ollama/blob/ad6f6a1d29f45a5c7266bcd7edb5671621e86810/llama/llama.cpp/src/llama-graph.cpp#L1882
 is null with the current code of PLaMo2 model.

This PR intends to fix this problem.

Changed files:
filename: src/llama-model.cpp
patch: @@ -17965,6 +17965,8 @@ struct llm_build_plamo2 : public llm_graph_context_mamba {
         cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1);
         cb(cur, "result_norm", -1);
 
+        res->t_embd = cur;
+
         // lm_head
         cur = build_lora_mm(model.output, cur);
         cb(cur, "result_output", -1);
Repository: electron/electron
Pull request: fix: gin_helper::Promise in GPUInfoManager must be destroyed before destroying Node/V8

Backport of #46434

See that PR for details.


Notes: fix crash on application exit with pending `app.getGPUInfo` promise


Changed files:
filename: shell/browser/api/gpuinfo_manager.cc
patch: @@ -17,7 +17,9 @@
 namespace electron {
 
 GPUInfoManager* GPUInfoManager::GetInstance() {
-  return base::Singleton<GPUInfoManager>::get();
+  // will be deleted by CleanedUpAtExit::DoCleanup
+  static GPUInfoManager* instance = new GPUInfoManager();
+  return instance;
 }
 
 GPUInfoManager::GPUInfoManager()

filename: shell/browser/api/gpuinfo_manager.h
patch: @@ -11,6 +11,7 @@
 #include "content/browser/gpu/gpu_data_manager_impl.h"  // nogncheck
 #include "content/public/browser/gpu_data_manager.h"
 #include "content/public/browser/gpu_data_manager_observer.h"
+#include "shell/common/gin_helper/cleaned_up_at_exit.h"
 
 namespace gin_helper {
 template <typename T>
@@ -20,7 +21,8 @@ class Promise;
 namespace electron {
 
 // GPUInfoManager is a singleton used to manage and fetch GPUInfo
-class GPUInfoManager : private content::GpuDataManagerObserver {
+class GPUInfoManager : private content::GpuDataManagerObserver,
+                       public gin_helper::CleanedUpAtExit {
  public:
   static GPUInfoManager* GetInstance();