Skip to content

fix(mcp): propagate abort signal to stop test execution - #40582

Merged
Pavel Feldman (pavelfeldman) merged 3 commits into
microsoft:mainfrom
mxschmitt:mxschmitt/fix-38937
May 6, 2026
Merged

fix(mcp): propagate abort signal to stop test execution#40582
Pavel Feldman (pavelfeldman) merged 3 commits into
microsoft:mainfrom
mxschmitt:mxschmitt/fix-38937

Conversation

@mxschmitt

Copy link
Copy Markdown
Contributor

Summary

  • Propagate AbortSignal from MCP SDK through TestServerBackend → tool handlers → TestContext
  • Serialize test operations via a promise queue to prevent race conditions when abort is followed by an immediate new run
  • On abort, call runner.stopTests() and run global teardown before releasing the queue

Fixes#38937


private _enqueue<T>(fn: () => Promise<T>): Promise<T> {
const result = this._testOpQueue.then(fn);
this._testOpQueue = result.then(() => {}, () => {});

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.

This will catch all the errors silently.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Changed to match the TestRunner.runTests() pattern — single chain with await this._queue, no separate error handler needed since _runTestsImpl has its own try/catch and never rejects.

Use single-chain await style matching TestRunner.runTests(),
avoiding the empty error handler that looked like it was
silently swallowing errors.
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@mxschmitt

Copy link
Copy Markdown
ContributorAuthor

Windows CI failures are pre-existing and unrelated to this PR — dashboard.spec.ts annotate tests are also failing on main: https://github.com/microsoft/playwright/actions/runs/25396744541/job/74485425551

Comment threadpackages/playwright/src/mcp/test/testContext.ts Outdated
Comment threadpackages/playwright/src/mcp/test/testContext.ts Outdated
- Simplify _enqueue to match TestRunner queue pattern
- Extract signalToPromise utility to @isomorphic/manualPromise
@github-actions

Copy link
Copy Markdown
Contributor

Test results for "MCP"

12 failed
❌ [firefox] › mcp/test-run.spec.ts:126 › test_run should stop when aborted @mcp-windows-latest-firefox
❌ [firefox] › mcp/tracing.spec.ts:21 › check that trace is saved with browser_start_tracing @mcp-windows-latest-firefox
❌ [msedge] › mcp/test-run.spec.ts:126 › test_run should stop when aborted @mcp-windows-latest-msedge
❌ [webkit] › mcp/config.ini.spec.ts:57 › ini config sets browser launch options @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:207 › should enter annotate mode on fresh dashboard.tsx mount with -s --annotate @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:231 › should annotate via direct browser_annotate MCP call @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:264 › should annotate when context has no fixed viewport @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:301 › should cancel browser_annotate when the MCP request is aborted @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:332 › should cancel browser_annotate when the MCP client disconnects @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:361 › should switch screencast to -s session on show --annotate @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:410 › should disengage annotate mode when --annotate client disconnects @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:499 › save recording streams WebM bytes to the chosen file @mcp-windows-latest-webkit

6944 passed, 1052 skipped


Merge workflow run.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "tests 1"

1 failed
❌ [firefox-page] › page/page-emulate-media.spec.ts:196 › should report hover and fine pointer for desktop @firefox-ubuntu-22.04-node20

41661 passed, 851 skipped


Merge workflow run.

Sign up for freeto 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.

[Bug]: MCP test_run tool doesn't stop test execution when aborted

2 participants

@mxschmitt@pavelfeldman
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fix(mcp): propagate abort signal to stop test execution by mxschmitt · Pull Request #40582 · microsoft/playwright · GitHub
Skip to content

fix(mcp): propagate abort signal to stop test execution - #40582

Merged
Pavel Feldman (pavelfeldman) merged 3 commits into
microsoft:mainfrom
mxschmitt:mxschmitt/fix-38937
May 6, 2026
Merged

fix(mcp): propagate abort signal to stop test execution#40582
Pavel Feldman (pavelfeldman) merged 3 commits into
microsoft:mainfrom
mxschmitt:mxschmitt/fix-38937

Conversation

@mxschmitt

Copy link
Copy Markdown
Contributor

Summary

  • Propagate AbortSignal from MCP SDK through TestServerBackend → tool handlers → TestContext
  • Serialize test operations via a promise queue to prevent race conditions when abort is followed by an immediate new run
  • On abort, call runner.stopTests() and run global teardown before releasing the queue

Fixes#38937


private _enqueue<T>(fn: () => Promise<T>): Promise<T> {
const result = this._testOpQueue.then(fn);
this._testOpQueue = result.then(() => {}, () => {});

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.

This will catch all the errors silently.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Changed to match the TestRunner.runTests() pattern — single chain with await this._queue, no separate error handler needed since _runTestsImpl has its own try/catch and never rejects.

Use single-chain await style matching TestRunner.runTests(),
avoiding the empty error handler that looked like it was
silently swallowing errors.
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@mxschmitt

Copy link
Copy Markdown
ContributorAuthor

Windows CI failures are pre-existing and unrelated to this PR — dashboard.spec.ts annotate tests are also failing on main: https://github.com/microsoft/playwright/actions/runs/25396744541/job/74485425551

Comment threadpackages/playwright/src/mcp/test/testContext.ts Outdated
Comment threadpackages/playwright/src/mcp/test/testContext.ts Outdated
- Simplify _enqueue to match TestRunner queue pattern
- Extract signalToPromise utility to @isomorphic/manualPromise
@github-actions

Copy link
Copy Markdown
Contributor

Test results for "MCP"

12 failed
❌ [firefox] › mcp/test-run.spec.ts:126 › test_run should stop when aborted @mcp-windows-latest-firefox
❌ [firefox] › mcp/tracing.spec.ts:21 › check that trace is saved with browser_start_tracing @mcp-windows-latest-firefox
❌ [msedge] › mcp/test-run.spec.ts:126 › test_run should stop when aborted @mcp-windows-latest-msedge
❌ [webkit] › mcp/config.ini.spec.ts:57 › ini config sets browser launch options @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:207 › should enter annotate mode on fresh dashboard.tsx mount with -s --annotate @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:231 › should annotate via direct browser_annotate MCP call @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:264 › should annotate when context has no fixed viewport @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:301 › should cancel browser_annotate when the MCP request is aborted @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:332 › should cancel browser_annotate when the MCP client disconnects @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:361 › should switch screencast to -s session on show --annotate @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:410 › should disengage annotate mode when --annotate client disconnects @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:499 › save recording streams WebM bytes to the chosen file @mcp-windows-latest-webkit

6944 passed, 1052 skipped


Merge workflow run.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "tests 1"

1 failed
❌ [firefox-page] › page/page-emulate-media.spec.ts:196 › should report hover and fine pointer for desktop @firefox-ubuntu-22.04-node20

41661 passed, 851 skipped


Merge workflow run.

Sign up for freeto 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.

[Bug]: MCP test_run tool doesn't stop test execution when aborted

2 participants

@mxschmitt@pavelfeldman
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(mcp): propagate abort signal to stop test execution by mxschmitt · Pull Request #40582 · microsoft/playwright · GitHub
Skip to content

fix(mcp): propagate abort signal to stop test execution - #40582

Merged
Pavel Feldman (pavelfeldman) merged 3 commits into
microsoft:mainfrom
mxschmitt:mxschmitt/fix-38937
May 6, 2026
Merged

fix(mcp): propagate abort signal to stop test execution#40582
Pavel Feldman (pavelfeldman) merged 3 commits into
microsoft:mainfrom
mxschmitt:mxschmitt/fix-38937

Conversation

@mxschmitt

Copy link
Copy Markdown
Contributor

Summary

  • Propagate AbortSignal from MCP SDK through TestServerBackend → tool handlers → TestContext
  • Serialize test operations via a promise queue to prevent race conditions when abort is followed by an immediate new run
  • On abort, call runner.stopTests() and run global teardown before releasing the queue

Fixes#38937


private _enqueue<T>(fn: () => Promise<T>): Promise<T> {
const result = this._testOpQueue.then(fn);
this._testOpQueue = result.then(() => {}, () => {});

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.

This will catch all the errors silently.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Changed to match the TestRunner.runTests() pattern — single chain with await this._queue, no separate error handler needed since _runTestsImpl has its own try/catch and never rejects.

Use single-chain await style matching TestRunner.runTests(),
avoiding the empty error handler that looked like it was
silently swallowing errors.
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@mxschmitt

Copy link
Copy Markdown
ContributorAuthor

Windows CI failures are pre-existing and unrelated to this PR — dashboard.spec.ts annotate tests are also failing on main: https://github.com/microsoft/playwright/actions/runs/25396744541/job/74485425551

Comment threadpackages/playwright/src/mcp/test/testContext.ts Outdated
Comment threadpackages/playwright/src/mcp/test/testContext.ts Outdated
- Simplify _enqueue to match TestRunner queue pattern
- Extract signalToPromise utility to @isomorphic/manualPromise
@github-actions

Copy link
Copy Markdown
Contributor

Test results for "MCP"

12 failed
❌ [firefox] › mcp/test-run.spec.ts:126 › test_run should stop when aborted @mcp-windows-latest-firefox
❌ [firefox] › mcp/tracing.spec.ts:21 › check that trace is saved with browser_start_tracing @mcp-windows-latest-firefox
❌ [msedge] › mcp/test-run.spec.ts:126 › test_run should stop when aborted @mcp-windows-latest-msedge
❌ [webkit] › mcp/config.ini.spec.ts:57 › ini config sets browser launch options @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:207 › should enter annotate mode on fresh dashboard.tsx mount with -s --annotate @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:231 › should annotate via direct browser_annotate MCP call @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:264 › should annotate when context has no fixed viewport @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:301 › should cancel browser_annotate when the MCP request is aborted @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:332 › should cancel browser_annotate when the MCP client disconnects @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:361 › should switch screencast to -s session on show --annotate @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:410 › should disengage annotate mode when --annotate client disconnects @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:499 › save recording streams WebM bytes to the chosen file @mcp-windows-latest-webkit

6944 passed, 1052 skipped


Merge workflow run.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "tests 1"

1 failed
❌ [firefox-page] › page/page-emulate-media.spec.ts:196 › should report hover and fine pointer for desktop @firefox-ubuntu-22.04-node20

41661 passed, 851 skipped


Merge workflow run.

Sign up for freeto 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.

[Bug]: MCP test_run tool doesn't stop test execution when aborted

2 participants

@mxschmitt@pavelfeldman
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(mcp): propagate abort signal to stop test execution by mxschmitt · Pull Request #40582 · microsoft/playwright · GitHub
Skip to content

fix(mcp): propagate abort signal to stop test execution - #40582

Merged
Pavel Feldman (pavelfeldman) merged 3 commits into
microsoft:mainfrom
mxschmitt:mxschmitt/fix-38937
May 6, 2026
Merged

fix(mcp): propagate abort signal to stop test execution#40582
Pavel Feldman (pavelfeldman) merged 3 commits into
microsoft:mainfrom
mxschmitt:mxschmitt/fix-38937

Conversation

@mxschmitt

Copy link
Copy Markdown
Contributor

Summary

  • Propagate AbortSignal from MCP SDK through TestServerBackend → tool handlers → TestContext
  • Serialize test operations via a promise queue to prevent race conditions when abort is followed by an immediate new run
  • On abort, call runner.stopTests() and run global teardown before releasing the queue

Fixes#38937


private _enqueue<T>(fn: () => Promise<T>): Promise<T> {
const result = this._testOpQueue.then(fn);
this._testOpQueue = result.then(() => {}, () => {});

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.

This will catch all the errors silently.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Changed to match the TestRunner.runTests() pattern — single chain with await this._queue, no separate error handler needed since _runTestsImpl has its own try/catch and never rejects.

Use single-chain await style matching TestRunner.runTests(),
avoiding the empty error handler that looked like it was
silently swallowing errors.
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@mxschmitt

Copy link
Copy Markdown
ContributorAuthor

Windows CI failures are pre-existing and unrelated to this PR — dashboard.spec.ts annotate tests are also failing on main: https://github.com/microsoft/playwright/actions/runs/25396744541/job/74485425551

Comment threadpackages/playwright/src/mcp/test/testContext.ts Outdated
Comment threadpackages/playwright/src/mcp/test/testContext.ts Outdated
- Simplify _enqueue to match TestRunner queue pattern
- Extract signalToPromise utility to @isomorphic/manualPromise
@github-actions

Copy link
Copy Markdown
Contributor

Test results for "MCP"

12 failed
❌ [firefox] › mcp/test-run.spec.ts:126 › test_run should stop when aborted @mcp-windows-latest-firefox
❌ [firefox] › mcp/tracing.spec.ts:21 › check that trace is saved with browser_start_tracing @mcp-windows-latest-firefox
❌ [msedge] › mcp/test-run.spec.ts:126 › test_run should stop when aborted @mcp-windows-latest-msedge
❌ [webkit] › mcp/config.ini.spec.ts:57 › ini config sets browser launch options @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:207 › should enter annotate mode on fresh dashboard.tsx mount with -s --annotate @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:231 › should annotate via direct browser_annotate MCP call @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:264 › should annotate when context has no fixed viewport @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:301 › should cancel browser_annotate when the MCP request is aborted @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:332 › should cancel browser_annotate when the MCP client disconnects @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:361 › should switch screencast to -s session on show --annotate @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:410 › should disengage annotate mode when --annotate client disconnects @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:499 › save recording streams WebM bytes to the chosen file @mcp-windows-latest-webkit

6944 passed, 1052 skipped


Merge workflow run.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "tests 1"

1 failed
❌ [firefox-page] › page/page-emulate-media.spec.ts:196 › should report hover and fine pointer for desktop @firefox-ubuntu-22.04-node20

41661 passed, 851 skipped


Merge workflow run.

Sign up for freeto 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.

[Bug]: MCP test_run tool doesn't stop test execution when aborted

2 participants

@mxschmitt@pavelfeldman
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' fix(mcp): propagate abort signal to stop test execution by mxschmitt · Pull Request #40582 · microsoft/playwright · GitHub
Skip to content

fix(mcp): propagate abort signal to stop test execution - #40582

Merged
Pavel Feldman (pavelfeldman) merged 3 commits into
microsoft:mainfrom
mxschmitt:mxschmitt/fix-38937
May 6, 2026
Merged

fix(mcp): propagate abort signal to stop test execution#40582
Pavel Feldman (pavelfeldman) merged 3 commits into
microsoft:mainfrom
mxschmitt:mxschmitt/fix-38937

Conversation

@mxschmitt

Copy link
Copy Markdown
Contributor

Summary

  • Propagate AbortSignal from MCP SDK through TestServerBackend → tool handlers → TestContext
  • Serialize test operations via a promise queue to prevent race conditions when abort is followed by an immediate new run
  • On abort, call runner.stopTests() and run global teardown before releasing the queue

Fixes#38937


private _enqueue<T>(fn: () => Promise<T>): Promise<T> {
const result = this._testOpQueue.then(fn);
this._testOpQueue = result.then(() => {}, () => {});

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.

This will catch all the errors silently.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Changed to match the TestRunner.runTests() pattern — single chain with await this._queue, no separate error handler needed since _runTestsImpl has its own try/catch and never rejects.

Use single-chain await style matching TestRunner.runTests(),
avoiding the empty error handler that looked like it was
silently swallowing errors.
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@mxschmitt

Copy link
Copy Markdown
ContributorAuthor

Windows CI failures are pre-existing and unrelated to this PR — dashboard.spec.ts annotate tests are also failing on main: https://github.com/microsoft/playwright/actions/runs/25396744541/job/74485425551

Comment threadpackages/playwright/src/mcp/test/testContext.ts Outdated
Comment threadpackages/playwright/src/mcp/test/testContext.ts Outdated
- Simplify _enqueue to match TestRunner queue pattern
- Extract signalToPromise utility to @isomorphic/manualPromise
@github-actions

Copy link
Copy Markdown
Contributor

Test results for "MCP"

12 failed
❌ [firefox] › mcp/test-run.spec.ts:126 › test_run should stop when aborted @mcp-windows-latest-firefox
❌ [firefox] › mcp/tracing.spec.ts:21 › check that trace is saved with browser_start_tracing @mcp-windows-latest-firefox
❌ [msedge] › mcp/test-run.spec.ts:126 › test_run should stop when aborted @mcp-windows-latest-msedge
❌ [webkit] › mcp/config.ini.spec.ts:57 › ini config sets browser launch options @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:207 › should enter annotate mode on fresh dashboard.tsx mount with -s --annotate @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:231 › should annotate via direct browser_annotate MCP call @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:264 › should annotate when context has no fixed viewport @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:301 › should cancel browser_annotate when the MCP request is aborted @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:332 › should cancel browser_annotate when the MCP client disconnects @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:361 › should switch screencast to -s session on show --annotate @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:410 › should disengage annotate mode when --annotate client disconnects @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:499 › save recording streams WebM bytes to the chosen file @mcp-windows-latest-webkit

6944 passed, 1052 skipped


Merge workflow run.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "tests 1"

1 failed
❌ [firefox-page] › page/page-emulate-media.spec.ts:196 › should report hover and fine pointer for desktop @firefox-ubuntu-22.04-node20

41661 passed, 851 skipped


Merge workflow run.

Sign up for freeto 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.

[Bug]: MCP test_run tool doesn't stop test execution when aborted

2 participants

@mxschmitt@pavelfeldman
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(mcp): propagate abort signal to stop test execution by mxschmitt · Pull Request #40582 · microsoft/playwright · GitHub
Skip to content

fix(mcp): propagate abort signal to stop test execution - #40582

Merged
Pavel Feldman (pavelfeldman) merged 3 commits into
microsoft:mainfrom
mxschmitt:mxschmitt/fix-38937
May 6, 2026
Merged

fix(mcp): propagate abort signal to stop test execution#40582
Pavel Feldman (pavelfeldman) merged 3 commits into
microsoft:mainfrom
mxschmitt:mxschmitt/fix-38937

Conversation

@mxschmitt

Copy link
Copy Markdown
Contributor

Summary

  • Propagate AbortSignal from MCP SDK through TestServerBackend → tool handlers → TestContext
  • Serialize test operations via a promise queue to prevent race conditions when abort is followed by an immediate new run
  • On abort, call runner.stopTests() and run global teardown before releasing the queue

Fixes#38937


private _enqueue<T>(fn: () => Promise<T>): Promise<T> {
const result = this._testOpQueue.then(fn);
this._testOpQueue = result.then(() => {}, () => {});

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.

This will catch all the errors silently.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Changed to match the TestRunner.runTests() pattern — single chain with await this._queue, no separate error handler needed since _runTestsImpl has its own try/catch and never rejects.

Use single-chain await style matching TestRunner.runTests(),
avoiding the empty error handler that looked like it was
silently swallowing errors.
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@mxschmitt

Copy link
Copy Markdown
ContributorAuthor

Windows CI failures are pre-existing and unrelated to this PR — dashboard.spec.ts annotate tests are also failing on main: https://github.com/microsoft/playwright/actions/runs/25396744541/job/74485425551

Comment threadpackages/playwright/src/mcp/test/testContext.ts Outdated
Comment threadpackages/playwright/src/mcp/test/testContext.ts Outdated
- Simplify _enqueue to match TestRunner queue pattern
- Extract signalToPromise utility to @isomorphic/manualPromise
@github-actions

Copy link
Copy Markdown
Contributor

Test results for "MCP"

12 failed
❌ [firefox] › mcp/test-run.spec.ts:126 › test_run should stop when aborted @mcp-windows-latest-firefox
❌ [firefox] › mcp/tracing.spec.ts:21 › check that trace is saved with browser_start_tracing @mcp-windows-latest-firefox
❌ [msedge] › mcp/test-run.spec.ts:126 › test_run should stop when aborted @mcp-windows-latest-msedge
❌ [webkit] › mcp/config.ini.spec.ts:57 › ini config sets browser launch options @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:207 › should enter annotate mode on fresh dashboard.tsx mount with -s --annotate @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:231 › should annotate via direct browser_annotate MCP call @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:264 › should annotate when context has no fixed viewport @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:301 › should cancel browser_annotate when the MCP request is aborted @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:332 › should cancel browser_annotate when the MCP client disconnects @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:361 › should switch screencast to -s session on show --annotate @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:410 › should disengage annotate mode when --annotate client disconnects @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:499 › save recording streams WebM bytes to the chosen file @mcp-windows-latest-webkit

6944 passed, 1052 skipped


Merge workflow run.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "tests 1"

1 failed
❌ [firefox-page] › page/page-emulate-media.spec.ts:196 › should report hover and fine pointer for desktop @firefox-ubuntu-22.04-node20

41661 passed, 851 skipped


Merge workflow run.

Sign up for freeto 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.

[Bug]: MCP test_run tool doesn't stop test execution when aborted

2 participants

@mxschmitt@pavelfeldman
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); fix(mcp): propagate abort signal to stop test execution by mxschmitt · Pull Request #40582 · microsoft/playwright · GitHub
Skip to content

fix(mcp): propagate abort signal to stop test execution - #40582

Merged
Pavel Feldman (pavelfeldman) merged 3 commits into
microsoft:mainfrom
mxschmitt:mxschmitt/fix-38937
May 6, 2026
Merged

fix(mcp): propagate abort signal to stop test execution#40582
Pavel Feldman (pavelfeldman) merged 3 commits into
microsoft:mainfrom
mxschmitt:mxschmitt/fix-38937

Conversation

@mxschmitt

Copy link
Copy Markdown
Contributor

Summary

  • Propagate AbortSignal from MCP SDK through TestServerBackend → tool handlers → TestContext
  • Serialize test operations via a promise queue to prevent race conditions when abort is followed by an immediate new run
  • On abort, call runner.stopTests() and run global teardown before releasing the queue

Fixes#38937


private _enqueue<T>(fn: () => Promise<T>): Promise<T> {
const result = this._testOpQueue.then(fn);
this._testOpQueue = result.then(() => {}, () => {});

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.

This will catch all the errors silently.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Changed to match the TestRunner.runTests() pattern — single chain with await this._queue, no separate error handler needed since _runTestsImpl has its own try/catch and never rejects.

Use single-chain await style matching TestRunner.runTests(),
avoiding the empty error handler that looked like it was
silently swallowing errors.
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@mxschmitt

Copy link
Copy Markdown
ContributorAuthor

Windows CI failures are pre-existing and unrelated to this PR — dashboard.spec.ts annotate tests are also failing on main: https://github.com/microsoft/playwright/actions/runs/25396744541/job/74485425551

Comment threadpackages/playwright/src/mcp/test/testContext.ts Outdated
Comment threadpackages/playwright/src/mcp/test/testContext.ts Outdated
- Simplify _enqueue to match TestRunner queue pattern
- Extract signalToPromise utility to @isomorphic/manualPromise
@github-actions

Copy link
Copy Markdown
Contributor

Test results for "MCP"

12 failed
❌ [firefox] › mcp/test-run.spec.ts:126 › test_run should stop when aborted @mcp-windows-latest-firefox
❌ [firefox] › mcp/tracing.spec.ts:21 › check that trace is saved with browser_start_tracing @mcp-windows-latest-firefox
❌ [msedge] › mcp/test-run.spec.ts:126 › test_run should stop when aborted @mcp-windows-latest-msedge
❌ [webkit] › mcp/config.ini.spec.ts:57 › ini config sets browser launch options @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:207 › should enter annotate mode on fresh dashboard.tsx mount with -s --annotate @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:231 › should annotate via direct browser_annotate MCP call @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:264 › should annotate when context has no fixed viewport @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:301 › should cancel browser_annotate when the MCP request is aborted @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:332 › should cancel browser_annotate when the MCP client disconnects @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:361 › should switch screencast to -s session on show --annotate @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:410 › should disengage annotate mode when --annotate client disconnects @mcp-windows-latest-webkit
❌ [webkit] › mcp/dashboard.spec.ts:499 › save recording streams WebM bytes to the chosen file @mcp-windows-latest-webkit

6944 passed, 1052 skipped


Merge workflow run.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "tests 1"

1 failed
❌ [firefox-page] › page/page-emulate-media.spec.ts:196 › should report hover and fine pointer for desktop @firefox-ubuntu-22.04-node20

41661 passed, 851 skipped


Merge workflow run.

Sign up for freeto 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.

[Bug]: MCP test_run tool doesn't stop test execution when aborted

2 participants

@mxschmitt@pavelfeldman