fix(session): eliminate memory leak in session managers#14972
fix(session): eliminate memory leak in session managers#14972christian-bromann merged 1 commit intowebdriverio:mainfrom
Conversation
|
I was working on this bug for 2-3 weeks unable to replicate it , in the process I have created 3 repos that replicate the memory leak , on which I have tested the changes which works fine on those. |
create-wdio
eslint-plugin-wdio
@wdio/allure-reporter
@wdio/appium-service
@wdio/browser-runner
@wdio/browserstack-service
@wdio/cli
@wdio/concise-reporter
@wdio/config
@wdio/cucumber-framework
@wdio/dot-reporter
@wdio/firefox-profile-service
@wdio/globals
@wdio/jasmine-framework
@wdio/json-reporter
@wdio/junit-reporter
@wdio/lighthouse-service
@wdio/local-runner
@wdio/logger
@wdio/mocha-framework
@wdio/protocols
@wdio/repl
@wdio/reporter
@wdio/runner
@wdio/sauce-service
@wdio/shared-store-service
@wdio/smoke-test-cjs-service
@wdio/smoke-test-reporter
@wdio/smoke-test-service
@wdio/spec-reporter
@wdio/static-server-service
@wdio/sumologic-reporter
@wdio/testingbot-service
@wdio/types
@wdio/utils
@wdio/webdriver-mock-service
@wdio/xvfb
webdriver
webdriverio
commit: |
|
Hey mccmrunal 👋 Thank you for your contribution to WebdriverIO! Your pull request has been marked as an "Expensable" contribution. We've sent you an email with further instructions on how to claim your expenses from our development fund. We are looking forward to more contributions from you in the future 🙌 Have a nice day, |
fix #14707
Proposed changes
Fixed a memory leak in the session management layer where event listeners were not being properly removed during session reload or deletion.
The issue was caused by using Function.prototype.bind() inline when registering and unregistering event listeners (for example, browser.on('event', this.method.bind(this))).
Since .bind() creates a new function reference every time it is called, the reference used during listener removal did not match the one used during registration. As a result, listeners were never removed and accumulated with each reloadSession() call, eventually triggering a MaxListenersExceededWarning.
Refactored SessionManager, ContextManager, NetworkManager, ShadowRootManager, PolyfillManager, and DialogManager.
Stored bound listener functions in private class properties (for example, #onCommandListener) to ensure a stable reference.
Updated removeListeners() in NetworkManager to use these stored references, ensuring successful listener removal.
Types of changes
Checklist
Backport Request
//: # (The current
mainbranch is the development branch for WebdriverIO v9. If your change should be released to the current major version of WebdriverIO (v8), please raise another PR with the same changes against thev8branch.)v9and doesn't need to be back-ported#XXXXXFurther comments
Reviewers: @webdriverio/project-committers