Skip to content

Avoid leaking TargetChangedArgs event handlers#3476

Merged
kblok merged 1 commit into
hardkoded:masterfrom
jnyrup:event_handler_leak_TargetChangedArgs
Jun 8, 2026
Merged

Avoid leaking TargetChangedArgs event handlers#3476
kblok merged 1 commit into
hardkoded:masterfrom
jnyrup:event_handler_leak_TargetChangedArgs

Conversation

@jnyrup

@jnyrup jnyrup commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Deregistering events via an anonymous delegate can be problematic.

See e.g.
https://www.jetbrains.com/help/rider/EventUnsubscriptionViaAnonymousDelegate.html
https://pvs-studio.com/en/docs/warnings/v3084/

Used the code below to verify that the memory dump diff after the fix no longer contained instances of TargetChangedArgs.

using System;
using System.Threading.Tasks;
using NUnit.Framework;

namespace PuppeteerSharp.Tests.BrowserContextTests;

public class EventHandlerLeaks
{
    [Test]
    public async Task Event_Handler_leaks()
    {
        GC.Collect(4, GCCollectionMode.Forced, true, true);
        GC.WaitForPendingFinalizers();

        ; // Take memory dump
        {
            var launcher = new Launcher();
            await using var browser = await launcher.LaunchAsync(new()
            {
                Protocol = ProtocolType.WebdriverBiDi,
                Browser = SupportedBrowser.ChromeHeadlessShell
            });
            for (var i = 0; i < 500; i++)
            {
                await using var context = await browser.CreateBrowserContextAsync();
            }

            browser.Disconnect();
            await browser.CloseAsync();
        }

        GC.Collect(4, GCCollectionMode.Forced, true, true);
        GC.WaitForPendingFinalizers();
        ; // Take memory dump and compare
    }
}

@kblok kblok left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch!

@kblok kblok merged commit 98f82a9 into hardkoded:master Jun 8, 2026
13 of 15 checks passed
sondresjolyst pushed a commit to sondresjolyst/garge-api that referenced this pull request Jun 29, 2026
Updated [PuppeteerSharp](https://github.com/hardkoded/puppeteer-sharp)
from 25.1.0 to 25.1.2.

<details>
<summary>Release notes</summary>

_Sourced from [PuppeteerSharp's
releases](https://github.com/hardkoded/puppeteer-sharp/releases)._

## 25.1.2

## What's Changed
* fix: open a new window when creating a page with no existing targets
by @​kblok in hardkoded/puppeteer-sharp#3481
* fix: support WebDriverBiDi 0.0.54+ (fixes #​3479) by @​kblok in
hardkoded/puppeteer-sharp#3480


**Full Changelog**:
hardkoded/puppeteer-sharp@v25.1.1...v25.1.2

## 25.1.1

## What's Changed
* Avoid leaking TargetChangedArgs event handlers by @​jnyrup in
hardkoded/puppeteer-sharp#3476
* fix: ensure CDP-only package is compiled without WebDriverBiDi
references by @​kblok in
hardkoded/puppeteer-sharp#3478


**Full Changelog**:
hardkoded/puppeteer-sharp@v25.1.0...v25.1.1

Commits viewable in [compare
view](hardkoded/puppeteer-sharp@v25.1.0...v25.1.2).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=PuppeteerSharp&package-manager=nuget&previous-version=25.1.0&new-version=25.1.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants