Skip to content

Conversation

@SimonSiefke
Copy link
Contributor

Fix an event listener leak in the extensions editor features tab.

Event listeners (before)

One end-to-end test showed an auxclick and keydown event listener leak from markdownRenderer.ts.

{
  "eventListenersWithStackTrace": [
    {
      "type": "auxclick",
      "description": "n=>this.a.fire(n)",
      "objectId": "-6737128020740298089.4.35825",
      "stack": [
        "listener (file:///workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:69:53100)",
        "Object.onWillAddFirstListener (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:70:53162)",
        "u (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:29:1565)",
        "vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:27:6613",
        "Array.map (<anonymous>)",
        "vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:27:6605",
        "b0 (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:384:2706)",
        "Yxe.r (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:2126:72)",
        "Yxe.n (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:2111:336)"
      ],
      "count": 194,
      "originalStack": [
        "file:/Users/cloudtest/vss/_work/1/s/src/vs/base/browser/event.ts:40:14"
      ],
      "originalName": "e"
    },
    {
      "type": "keydown",
      "description": "b=>{const v=new yi(b);!v.equals(10)&&!v.equals(3)||K$t(i,e,v)}",
      "objectId": "-6737128020740298089.4.35827",
      "stack": [
        "listener (file:///workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:383:2826)",
        "new N5i (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:32:8619)",
        "K (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:32:8780)",
        "b0 (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:384:2813)",
        "Yxe.r (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:2126:72)",
        "Yxe.n (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:2111:336)",
        "Yxe.render (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:2109:24451)",
        "Cat.H (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:2126:9844)",
        "Cat.t (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:2126:8377)"
      ],
      "count": 97,
      "originalStack": [
        "file:/Users/cloudtest/vss/_work/1/s/src/vs/base/browser/markdownRenderer.ts:189:87"
      ],
      "originalName": "e"
    }
  ],
  "isLeak": true
}

After checking where the markdownRenderer connects to the extensionFeatures module, one suspicious disposable from below was discovered. The change registers renderer.render(this.manifest) as a disposable so that it can be properly disposed.

Event listeners (after)

Running the same test again with the fix in place shows no more leaking event listeners

{
  "eventListeners": [],
  "isLeak": false
}

@vs-code-engineering vs-code-engineering bot added this to the July 2025 milestone Jul 22, 2025
@sandy081 sandy081 merged commit 5096b44 into microsoft:main Jul 22, 2025
17 checks passed
@vs-code-engineering vs-code-engineering bot locked and limited conversation to collaborators Sep 5, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants