Skip to content

Backend esm vitest#7605

Draft
SamTV12345 wants to merge 101 commits into
developfrom
backend-esm-vitest
Draft

Backend esm vitest#7605
SamTV12345 wants to merge 101 commits into
developfrom
backend-esm-vitest

Conversation

@SamTV12345
Copy link
Copy Markdown
Member

No description provided.

SamTV12345 and others added 30 commits April 26, 2026 12:15
Converted: customError, Stream, NodeVersion, checkValidRev, AbsolutePaths
(+__dirname shim), run_cmd, Cleanup, ExportHelper, padDiff, ExportTxt,
LibreOffice, UpdateCheck, ImportHtml.

Still CJS in utils/: Settings, Minify, toolbar, ExportEtherpad,
ImportEtherpad, ExportHtml. Their consumers will surface errors until
they're flipped too. ts-check: 530 -> 526 errors.
…ad, ImportEtherpad, ExportHtml, toolbar)

All 26 files in node/utils/ now ESM. Settings.ts CJS shim removed (dead code
under "type": module); plugins doing require() get .default-wrapped namespace
via Node interop, the createRequire bridge in pluginfw will preserve sync
loading once that lands. toolbar.ts's module.exports.availableButtons
self-reference replaced by a module-private toolbar const.

ts-check: 526 -> 539 errors. The +13 is from default-imports landing on
modules that still live in db/ as CJS; resolves once db/ is flipped.
Self-referential exports.X pattern replaced by a module-private `eejs` object
that's also the default export. __dirname shimmed via import.meta.url.
`require` (used by templates as args.require) preserved via createRequire.
DB.ts: wrapped mutable exports as default-exported `dbModule` so init() can
still re-bind get/set/findKeys at runtime.
AuthorManager / GroupManager / PadManager / SessionManager: exports.X -> export
const X. Internal self-references (exports.X(...)) replaced with bare X(...).
Aliases (doesAuthorExists, doesPadExists, getAuthor4Token-deprecated)
preserved.
SecurityManager / ReadOnlyManager: imports flipped to .js.
SessionStore: module.exports -> export default.
Pad: `exports.cleanText` and `exports.Pad = Pad` now `export const cleanText`
and `export { Pad }`. Internal exports.cleanText() calls -> cleanText().
API: ~40 `exports.X = ...` rewritten to `export const X = ...`.
crypto.ts: util.promisify wrappers exported as named consts.
SecretRotator: import flips, all internal refs already named.
OIDCAdapter / OAuth2Provider / OAuth2User: already ESM, just .js suffixes.
APIHandler / APIKeyHandler / SocketIORouter / ExportHandler / ImportHandler /
RestAPI: imports flipped to .js, exports.X -> export const X.
PadMessageHandler: full conversion incl. internal exports.X() callsites
(sendChatMessageToPadClients, updatePadClients, composePadChangesets) rewritten
to bare names. Default export object added so existing
`import padMessageHandler from '...'` callers keep working without changes.
Conditional require() of LibreOffice in ImportHandler/ExportHandler hoisted
to a top-level namespace import (`import * as converterModule`).
…s/* files)

Done: express.ts (incl. https/http hoisted to top-level imports, exports.server
+ exports.sessionMiddleware -> export let), i18n.ts, admin.ts, webaccess.ts
(authnFailureDelayMs preserved as export let + setter), padurlsanitize.ts,
pwa.ts, errorhandling.ts (exports.app preserved as export let), tokenTransfer.ts,
adminplugins.ts.

Still CJS in hooks/express/: adminsettings, apicalls, importexport, openapi,
socketio, specialpages, static.
…tsort to ESM, add createRequire bridge in shared.ts
…toreRevision, instance, health, fuzzImportTest

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ctor, export_list

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…y, sanitizePluginsForWire, messages

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…gression-db, lowerCasePadIds

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ebaccess, undo_clear_authorship, specialpages, socketio

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Change 'import common from' to 'import * as common from' in 20 test files
to use named imports instead of default import.

Co-authored-by: GitHub Copilot <copilot@github.com>
Replace default imports with namespace imports for modules that only export
named exports:
- PadManager.ts: export const getPad, listAllPads, etc.
- AuthorManager.ts: export const getAuthor, etc.
- ImportHtml.ts: export const setPadHTML
- ExportHtml.ts: export const getPadHTMLDocument

Changed 'import X from Y' to 'import * as X from Y' in:
- Test files (export_list, chat, messages, etc.)
- Utility files (ExportHtml, ExportTxt, ExportEtherpad, ImportEtherpad, Cleanup)
- API test files (pad, restoreRevision)

This fixes ESM module resolution errors when these modules are imported as
default exports despite only providing named exports.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Convert const X = require('Y') to import X from 'Y.js'
- Convert const {A, B} = require('Y') to import {A, B} from 'Y.js'
- Add .js extensions to relative imports
- Keep external packages without .js (e.g., 'tinycon/tinycon')
- Convert exports.X = Y to export {X}

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Convert const X = require('Y') to import X from 'Y.js'
- Convert const {A, B} = require('Y') to import {A, B} from 'Y.js'
- Add .js extensions to relative imports
- Keep external packages without .js (e.g., 'tinycon/tinycon')
- Convert exports.X = Y to export {X}

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Convert const X = require('Y') to import X from 'Y.js'
- Convert const {A, B} = require('Y') to import {A, B} from 'Y.js'
- Add .js extensions to relative imports
- Keep external packages without .js (e.g., 'tinycon/tinycon')
- Convert exports.X = Y to export {X}
- Update self-references to avoid circular dependency issues

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Convert const X = require('Y') to import X from 'Y.js'
- Convert const {A, B} = require('Y') to import {A, B} from 'Y.js'
- Add .js extensions to relative imports
- Keep external packages without .js (e.g., 'tinycon/tinycon')
- Convert exports.X = Y to export {X}
- Refactor forward references to allow function reordering

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Convert const X = require('Y') to import X from 'Y.js'
- Convert const {A, B} = require('Y') to import {A, B} from 'Y.js'
- Add .js extensions to relative imports
- Keep external packages without .js (e.g., 'tinycon/tinycon', 'underscore')
- Convert exports.X = Y to export {X}
- Convert module.exports to export default

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Convert const X = require('Y') to import X from 'Y.js'
- Add .js extensions to relative imports
- Convert exports.X = Y to export {X}
- Convert dynamic requires to dynamic imports for circular dependency handling

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Convert dynamic requires to dynamic imports for circular dependency handling
- Make timeslider.init async to support dynamic imports
- Update exports references to use module scope or window
- Add ESM export default for jquery library
- Keep CommonJS compatibility for jquery

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- pad_automatic_reconnect.ts: export const showCountDownTimerToReconnectOnModal
- pad_cookie.ts: convert to named export with const class instance
- pad_impexp.ts: export {padimpexp}
- pad_savedrevs.ts: export const saveNow, export const init
- skin_variants.ts: export multiple functions
- changesettracker.ts: export {makeChangesetTracker}
- broadcast_revisions.ts: export {loadBroadcastRevisionsJS}
- AttributeManager.ts: add .js extensions to imports, export default AttributeManager

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Convert remaining exports.baseURL references to use the baseURL const defined at module level.
This completes the conversion from CommonJS require/exports to ESM import/export syntax.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
SamTV12345 and others added 10 commits May 25, 2026 18:28
CJS plugins frequently do `require('ep_etherpad-lite/node/db/PadManager')`
or `require('.../node/db/DB').db.set(...)`. Two things blocked this on the
ESM branch and one new thing was needed for it to work end-to-end:

1. DB.ts and ImportEtherpad.ts had a top-level `import {Database} from
   'ueberdb2'`. ueberdb2 v6 is ESM-only — no `require` export condition —
   so the CJS twin's `require('ueberdb2')` crashed with "No 'exports' main
   defined". Convert both to `import type` (erased) plus a lazy
   `await import('ueberdb2')` inside the call sites (init() in DB.ts, the
   `new Database('memory', ...)` site in ImportEtherpad.ts).

2. Node's module cache treats the ESM source and the CJS twin as two
   separate module records. Etherpad's startup calls init() on the ESM
   record only; the plugin's CJS-required dbModule would otherwise have
   its own `db: null` forever. Stash the live `db` handle and the
   wrapper-method closures on globalThis under a private key; replace
   dbModule with a Proxy that reads/writes through the shared store.
   The Proxy also routes writes for the wrapper names (`set`, `get`, …)
   into the shared store, so existing tests that monkey-patch
   `dbModule.set = ...` (e.g. regression-db.ts, SessionStore.ts)
   continue to see their stub from both module records.

3. prom-instruments.ts unconditionally constructs three prom-client
   metrics at load time and registers them with the default Registry.
   When the CJS twin loads (because a plugin transitively pulls it via
   PadMessageHandler → prom-instruments), the second registration throws
   "metric with the name X has already been registered". Wrap each
   metric construction with a `getSingleMetric()` lookup so re-loads
   reuse the existing handle instead of crashing.

Then turn the exports-map `./node/db/*` and `./node/db/*.js` entries
from import-only into dual-condition (import + require), re-enable
`node/db/**` and `node/utils/ImportEtherpad.ts` in tsdown's CJS entry
list, and update exports_map.ts to assert that db subpaths are now
require-able.

Local test result: 2220 passed | 25 skipped | 0 failed (parity with
pre-change baseline). New tests verify that
require('ep_etherpad-lite/node/db/PadManager') no longer throws.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Plugins call eejs.require('./templates/x.html', {}, module) where `module`
is the CJS module global of the calling plugin. Some module-loader shims
do not populate .filename — notably vite-node's CJS shim, and the
Module._extensions['.ts'] handler in pluginfw/plugins.ts for plugins
that ship .ts files (e.g. ep_markdown). Calling path.dirname(undefined)
threw TypeError and surfaced as 500 Internal Server Error on every pad
page that rendered an affected plugin's eejsBlock_* template — broke
3 socketio.ts tests under WITH_PLUGINS once ep_markdown started loading
successfully (it used to crash earlier in the load chain).

Skip the mod.filename branch when filename isn't a string; keep the
existing basedir (file_stack top or __dirname) and adopt mod.paths
only if it's actually an array.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ep_markdown@12.0.12 (and other plugins using ep_plugin_helpers/eejs)
call eejs.require('./templates/x.html', {}, module). In vite-node's
CJS-in-ESM bridge and the .ts CJS-extension handler in pluginfw/plugins.ts,
the `module` shim handed to the plugin doesn't have .filename populated.
Previously this threw TypeError on path.dirname(undefined); my last commit
silenced the throw but left basedir at the eejs file's own directory,
which then failed resolve.sync with "Cannot find module './templates/x.html'
from .../dist-cjs/node/eejs". 500 Internal Server Error on every pad
page that touches an affected plugin's eejsBlock_* hook.

When the relative basedir is genuinely unusable (no module.filename
AND no outer template on file_stack), walk the JS Error stack to find
the first frame outside eejs — that's the plugin's source file — and
use its directory. Defensive coding for an upstream-shim shortcoming;
the path.dirname-of-undefined throw is also gone for good.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Plugins sometimes schedule deferred custom-message emits via setTimeout —
ep_set_title_on_pad's debounced rename queue is the immediate example —
and those timers can outlive the server. In test shutdown (and during
graceful restarts in production) socketioServer is unset before the
queued timer fires; reaching into its `.sockets` throws "Cannot read
properties of null" which surfaces as an uncaughtException and kills
the vitest worker even after every test in the file has passed.

CI failure mode on PR #7605: backend tests showed `Test Files 48 passed,
Tests 1230 passed | 0 failed, Errors 1` — the worker exited unexpectedly
because of this exact stack:

  TypeError: Cannot read properties of null (reading 'sockets')
    at handleCustomObjectMessage (PadMessageHandler:476:18)
    at Timeout._onTimeout (ep_set_title_on_pad/index.js:49:23)

Add an early no-op when socketioServer (or its .sockets) is null. The
intended recipients are gone too; dropping the message is the correct
behavior in that window.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
specialpages.ts uses esbuild's buildSync() with default browser
platform to bundle client-side JS at server startup. Browser platform
honors the conditions ['browser', 'default', ...] — NOT
['import', 'require']. Our exports map only had import + require, so
every 'ep_etherpad-lite/static/js/*' reference in the client bundle
failed to resolve, exploding into ~12 'Could not resolve' errors and
killing the Playwright Firefox/Chrome jobs at boot.

Add a 'default' fallback to every conditional exports entry pointing
to the same .mjs target as the import condition. 'default' is the
catch-all and is consulted after import/require, so it doesn't change
behavior for Node ESM or CJS consumers; it only adds matches for
esbuild's browser mode and similar non-node resolvers.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
`pnpm run prod` boots etherpad which calls esbuild.buildSync() during
client-JS bundling. esbuild resolves ep_etherpad-lite/static/js/* refs
through the package's exports map, which points at dist/dist-cjs files.
Without a preceding build those files don't exist on CI, and the boot
fails with ~12 "Could not resolve" errors — which is why all four
Playwright jobs (.github/workflows/frontend-tests.yml) and the
upgrade-from-release job failed even after my prior exports-map fix.

Add a `preprod` script mirroring `pretest`/`predev`. Anyone running
`pnpm run prod` from a clean tree gets a usable dist/ + dist-cjs/
without needing a workflow-side build step.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ui/src/main.ts imports `from 'ep_etherpad-lite/node/types/MapType.js'`
for a single type-only reference. tsc resolves through the exports map,
ends up at dist/node/types/MapType.mjs (no .d.ts sibling, since tsdown
runs with dts:false), and gives up with TS7016 — "Could not find a
declaration file for module". This crashed the Docker build step that
the rate-limit job uses for its container image (see Dockerfile line
25: 'RUN pnpm run build:ui').

Add a `types` condition on every wildcard/exact exports entry, pointing
to the source .ts file. tsc picks `types` before any other condition
when looking for declarations, so type-only imports find the .ts and
resolve cleanly without needing a generated .d.ts.

Also fixes the ui/src/main.ts import that ended in '.ts' (incorrect per
TS conventions; should be '.js' even when the source is .ts).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Three issues surfaced by the ESM migration that pre-existing CI exercised:

1. Dockerfile CMD used `node --require tsx/cjs ...`. tsx/cjs is the
   CJS-only hook — it doesn't intercept Node's native ESM resolver.
   server.ts is now an ESM module (uses import/export syntax), so on
   the first `import './foo.js'` Node tries to load a literal .js
   file off disk and crashes with ERR_MODULE_NOT_FOUND
   (Cannot find module .../node/types/Plugin.js). Switch to
   `--import tsx`, which registers ESM-aware loader hooks. This is the
   immediate cause of the rate-limit job's docker container exiting
   on boot ("No such container: etherpad-docker").

2. The same docker image never ran `pnpm run build`. The runtime
   esbuild-bundles the client JS at server startup and resolves
   `ep_etherpad-lite/static/js/*` through the package's exports map,
   which now points at dist/ + dist-cjs/. Without those directories
   the bundle fails with 12+ "Could not resolve" errors. Add
   `RUN cd src && pnpm run build` after dependencies are installed so
   the dist surface is baked into the image.

3. The test-admin script in src/package.json still passed
   `tests/frontend-new/admin-spec --project=chromium`, but the
   playwright.config.ts merged in from develop moved admin specs under
   a dedicated `chromium-admin` project (testMatch =
   'tests/frontend-new/admin-spec/**'). The chromium project's
   testMatch is the regular frontend specs, so Playwright filtered to
   zero matching tests and exited with "Error: No tests found",
   crashing the Frontend admin tests workflow. Align with develop:
   drop the redundant path arg, use --project=chromium-admin.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
tsdown is in src/'s devDependencies, which installDeps.sh strips in
the production stage. Move the 'pnpm run build' invocation into the
adminbuild stage (which keeps all deps) and COPY --from=adminbuild
the resulting dist + dist-cjs into the production image.

Previous attempt ran the build in the production stage after
installDeps.sh and crashed with 'sh: tsdown: not found'.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…CJS branch

jQuery's UMD wrapper at the top of vendors/jquery.ts has two branches:

  if (typeof module === "object" && typeof module.exports === "object") {
    module.exports = factory(global, true);   // noGlobal=true
  } else {
    factory(global);                          // sets window.jQuery
  }

The `factory(global, true)` form skips its own
`window.jQuery = window.$ = jQuery` assignment (the `if (typeof noGlobal
=== "undefined")` guard inside the factory rejects when noGlobal is true).
That was fine in develop's CJS world because consumers did
`require('./vendors/jquery')` and got the function via module.exports.

In our ESM/bundled world, specialpages.ts's runtime esbuild wraps every
module in a CJS-style shim — `typeof module === "object"` becomes truthy
inside the IIFE — so the CJS branch fires, but the ESM consumer
(rjquery.ts) reads `window.jQuery` and finds it undefined:

  Error: Failed to initialize jQuery from ./vendors/jquery.js
    at rjquery.ts → cascades into every iframe-create path → no editor
    iframe → frontend tests time out waiting for ace_outer.

Fix is purely defensive: after the IIFE, if window.jQuery is still
missing AND module.exports holds the jQuery function (which it does on
the CJS branch), promote it onto window. Original behavior is preserved
on the non-CJS branch (window.jQuery already set, conditional no-ops).

Also fix the export-default expression: the old `typeof window.$ ===
"object"` was wrong — jQuery is a function, not an object — and would
have returned null even if globals were set. Replace with `window.$ ??
null`.

Reproduced locally: a11y_dialogs.spec.ts goes from 0/20 timing out to
20/20 passing. The whole Playwright failure on PR #7605 collapses to
this single root cause.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@qodo-free-for-open-source-projects
Copy link
Copy Markdown

CI Feedback 🧐

A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

Action: Playwright Chrome

Failed stage: Run the frontend tests [❌]

Failed test name: tests/frontend-new/specs/chat.spec.ts:67:1; tests/frontend-new/specs/chat.spec.ts:85:1

Failure summary:

The action failed because the Playwright UI test run (pnpm run test-ui --project=chromium) had 2
failing tests that repeatedly hit the 90s timeout.
- tests/frontend-new/specs/chat.spec.ts:67:1
timed out waiting for the chat box to become sticky after toggling the setting. The code in
tests/frontend-new/helper/settingsHelper.ts:26 waited for #chatbox to gain the stickyChat class
(page.waitForFunction(() => document.querySelector('#chatbox')?.classList.contains('stickyChat')))
but it never happened within 90000ms (including retries).
-
tests/frontend-new/specs/chat.spec.ts:85:1 timed out waiting for the chat box to become sticky after
clicking the sticky icon. The code in tests/frontend-new/helper/padHelper.ts:97 waited for #chatbox
to gain the stickyChat class (page.waitForFunction(...)) but it never happened within 90000ms
(including retries).
As a result, Playwright reported 2 failed, and the job exited with [ELIFECYCLE]
Command failed with exit code 1.

Relevant error logs:
1:  ##[group]Runner Image Provisioner
2:  Hosted Compute Agent
...

224:  │   to run scripts.                                                            │
225:  │                                                                              │
226:  ╰──────────────────────────────────────────────────────────────────────────────╯
227:  Done in 2.4s using pnpm v11.1.2
228:  ##[group]Run cp ./src/tests/settings.json settings.json
229:  �[36;1mcp ./src/tests/settings.json settings.json�[0m
230:  shell: /usr/bin/bash -e {0}
231:  env:
232:  PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
233:  ##[endgroup]
234:  ##[group]Run set -euo pipefail
235:  �[36;1mset -euo pipefail�[0m
236:  �[36;1mpnpm run prod > /tmp/etherpad-server.log 2>&1 &�[0m
237:  �[36;1m# Generous 90s budget so a slow runner (or, in the with-plugins�[0m
238:  �[36;1m# variant, plugin boot) doesn't lose the race against the test�[0m
239:  �[36;1m# phase. Fail loudly on timeout rather than silently falling�[0m
240:  �[36;1m# through to tests against a half-started server.�[0m
241:  �[36;1m# --max-time bounds each probe so a stuck server can't make a�[0m
242:  �[36;1m# single curl call eat the whole 90s budget.�[0m
243:  �[36;1mcan_connect() { curl --max-time 3 -sSfo /dev/null http://localhost:9001/; }�[0m
244:  �[36;1mfor i in $(seq 1 90); do can_connect && break; sleep 1; done�[0m
245:  �[36;1mif ! can_connect; then�[0m
246:  �[36;1m  echo "::error::Etherpad did not respond on :9001 within 90s"�[0m
247:  �[36;1m  echo "----- server log -----"�[0m
248:  �[36;1m  tail -n 200 /tmp/etherpad-server.log || true�[0m
249:  �[36;1m  exit 1�[0m
250:  �[36;1mfi�[0m
251:  �[36;1mcd src�[0m
252:  �[36;1mpnpm exec playwright install chromium  --with-deps�[0m
253:  �[36;1mpnpm run test-ui --project=chromium�[0m
254:  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
255:  env:
256:  PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
257:  ##[endgroup]
258:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
259:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
260:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
261:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
262:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
263:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
264:  Installing dependencies...
...

475:  ✓   28 [chromium] › tests/frontend-new/specs/bold_paste.spec.ts:9:1 › bold text retains formatting after copy-paste (3.7s)
476:  ✓   31 [chromium] › tests/frontend-new/specs/change_user_color.spec.ts:10:3 › change user color › Color picker matches original color and remembers the user color after a refresh (3.0s)
477:  ✓   32 [chromium] › tests/frontend-new/specs/change_user_color.spec.ts:59:3 › change user color › Own user color is shown when you enter a chat @feature:chat @feature:authorship-bg-color (1.9s)
478:  ✓   33 [chromium] › tests/frontend-new/specs/change_user_name.spec.ts:11:1 › Remembers the username after a refresh @feature:username (1.2s)
479:  ✓   35 [chromium] › tests/frontend-new/specs/change_user_name.spec.ts:46:1 › #myusernameform has 10px left margin and is not width-capped @feature:username (588ms)
480:  ✓   34 [chromium] › tests/frontend-new/specs/change_user_name.spec.ts:25:1 › Own user name is shown when you enter a chat @feature:chat @feature:username (1.5s)
481:  ✓   36 [chromium] › tests/frontend-new/specs/chat.spec.ts:23:1 › opens chat, sends a message, makes sure it exists on the page and hides chat @feature:chat (980ms)
482:  ✓   37 [chromium] › tests/frontend-new/specs/chat.spec.ts:43:1 › makes sure that an empty message can't be sent @feature:chat (1.0s)
483:  Chat �[33mfalse�[39m
484:  ✘   38 [chromium] › tests/frontend-new/specs/chat.spec.ts:67:1 › makes chat stick to right side of the screen via settings, remove sticky via settings, close it @feature:chat (1.5m)
485:  ✘   39 [chromium] › tests/frontend-new/specs/chat.spec.ts:85:1 › makes chat stick to right side of the screen via icon on the top right, remove sticky via icon, close it @feature:chat (1.5m)
486:  Chat �[33mfalse�[39m
487:  ✘   40 [chromium] › tests/frontend-new/specs/chat.spec.ts:67:1 › makes chat stick to right side of the screen via settings, remove sticky via settings, close it @feature:chat (retry #1) (1.6m)
488:  ✘   41 [chromium] › tests/frontend-new/specs/chat.spec.ts:85:1 › makes chat stick to right side of the screen via icon on the top right, remove sticky via icon, close it @feature:chat (retry #1) (1.6m)
489:  Chat �[33mfalse�[39m
490:  ##[error]  1) [chromium] › tests/frontend-new/specs/chat.spec.ts:67:1 › makes chat stick to right side of the screen via settings, remove sticky via settings, close it @feature:chat 
491:      Test timeout of 90000ms exceeded.
492:  ##[error]  1) [chromium] › tests/frontend-new/specs/chat.spec.ts:67:1 › makes chat stick to right side of the screen via settings, remove sticky via settings, close it @feature:chat 
493:      Error: page.waitForFunction: Test timeout of 90000ms exceeded.
494:  
495:         at tests/frontend-new/helper/settingsHelper.ts:26
496:  
497:        24 |   if(checked) return
498:        25 |   await page.locator('label[for="options-stickychat"]').click()
499:      > 26 |   await page.waitForFunction(() => document.querySelector('#chatbox')?.classList.contains('stickyChat'))
500:           |              ^
501:        27 | }
502:        28 |
503:        29 | export const disableStickyChat = async (page: Page) => {
504:          at enableStickyChatviaSettings (/home/runner/work/etherpad/etherpad/src/tests/frontend-new/helper/settingsHelper.ts:26:14)
505:          at /home/runner/work/etherpad/etherpad/src/tests/frontend-new/specs/chat.spec.ts:72:3
506:  ##[error]  1) [chromium] › tests/frontend-new/specs/chat.spec.ts:67:1 › makes chat stick to right side of the screen via settings, remove sticky via settings, close it @feature:chat 
507:  
508:      Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
509:      Test timeout of 90000ms exceeded.
510:  ##[error]  1) [chromium] › tests/frontend-new/specs/chat.spec.ts:67:1 › makes chat stick to right side of the screen via settings, remove sticky via settings, close it @feature:chat 
511:  
512:      Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
513:      Error: page.waitForFunction: Test timeout of 90000ms exceeded.
514:  
515:         at tests/frontend-new/helper/settingsHelper.ts:26
516:  
517:        24 |   if(checked) return
518:        25 |   await page.locator('label[for="options-stickychat"]').click()
519:      > 26 |   await page.waitForFunction(() => document.querySelector('#chatbox')?.classList.contains('stickyChat'))
520:           |              ^
521:        27 | }
522:        28 |
523:        29 | export const disableStickyChat = async (page: Page) => {
524:          at enableStickyChatviaSettings (/home/runner/work/etherpad/etherpad/src/tests/frontend-new/helper/settingsHelper.ts:26:14)
525:          at /home/runner/work/etherpad/etherpad/src/tests/frontend-new/specs/chat.spec.ts:72:3
526:  ##[error]  1) [chromium] › tests/frontend-new/specs/chat.spec.ts:67:1 › makes chat stick to right side of the screen via settings, remove sticky via settings, close it @feature:chat 
527:  
528:      Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
529:      Test timeout of 90000ms exceeded.
530:  ##[error]  1) [chromium] › tests/frontend-new/specs/chat.spec.ts:67:1 › makes chat stick to right side of the screen via settings, remove sticky via settings, close it @feature:chat 
531:  
532:      Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
533:      Error: page.waitForFunction: Test timeout of 90000ms exceeded.
534:  
535:         at tests/frontend-new/helper/settingsHelper.ts:26
536:  
537:        24 |   if(checked) return
538:        25 |   await page.locator('label[for="options-stickychat"]').click()
539:      > 26 |   await page.waitForFunction(() => document.querySelector('#chatbox')?.classList.contains('stickyChat'))
540:           |              ^
541:        27 | }
542:        28 |
543:        29 | export const disableStickyChat = async (page: Page) => {
544:          at enableStickyChatviaSettings (/home/runner/work/etherpad/etherpad/src/tests/frontend-new/helper/settingsHelper.ts:26:14)
545:          at /home/runner/work/etherpad/etherpad/src/tests/frontend-new/specs/chat.spec.ts:72:3
546:  ✘   42 [chromium] › tests/frontend-new/specs/chat.spec.ts:67:1 › makes chat stick to right side of the screen via settings, remove sticky via settings, close it @feature:chat (retry #2) (1.5m)
547:  ##[error]  2) [chromium] › tests/frontend-new/specs/chat.spec.ts:85:1 › makes chat stick to right side of the screen via icon on the top right, remove sticky via icon, close it @feature:chat 
548:      Test timeout of 90000ms exceeded.
549:  ##[error]  2) [chromium] › tests/frontend-new/specs/chat.spec.ts:85:1 › makes chat stick to right side of the screen via icon on the top right, remove sticky via icon, close it @feature:chat 
550:      Error: page.waitForFunction: Test timeout of 90000ms exceeded.
551:  
552:         at tests/frontend-new/helper/padHelper.ts:97
553:  
554:         95 |   if(await isChatBoxSticky(page)) return
555:         96 |   await page.locator('#titlesticky').click()
556:      >  97 |   await page.waitForFunction(`document.querySelector('#chatbox').classList.contains('stickyChat')`)
557:            |              ^
558:         98 | }
559:         99 |
560:        100 | export const disableStickyChatviaIcon = async (page: Page) => {
561:          at enableStickyChatviaIcon (/home/runner/work/etherpad/etherpad/src/tests/frontend-new/helper/padHelper.ts:97:14)
562:          at /home/runner/work/etherpad/etherpad/src/tests/frontend-new/specs/chat.spec.ts:91:3
563:  ##[error]  2) [chromium] › tests/frontend-new/specs/chat.spec.ts:85:1 › makes chat stick to right side of the screen via icon on the top right, remove sticky via icon, close it @feature:chat 
564:  
565:      Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
566:      Test timeout of 90000ms exceeded.
567:  ##[error]  2) [chromium] › tests/frontend-new/specs/chat.spec.ts:85:1 › makes chat stick to right side of the screen via icon on the top right, remove sticky via icon, close it @feature:chat 
568:  
569:      Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
570:      Error: page.waitForFunction: Test timeout of 90000ms exceeded.
571:  
572:         at tests/frontend-new/helper/padHelper.ts:97
573:  
574:         95 |   if(await isChatBoxSticky(page)) return
575:         96 |   await page.locator('#titlesticky').click()
576:      >  97 |   await page.waitForFunction(`document.querySelector('#chatbox').classList.contains('stickyChat')`)
577:            |              ^
578:         98 | }
579:         99 |
580:        100 | export const disableStickyChatviaIcon = async (page: Page) => {
581:          at enableStickyChatviaIcon (/home/runner/work/etherpad/etherpad/src/tests/frontend-new/helper/padHelper.ts:97:14)
582:          at /home/runner/work/etherpad/etherpad/src/tests/frontend-new/specs/chat.spec.ts:91:3
583:  ##[error]  2) [chromium] › tests/frontend-new/specs/chat.spec.ts:85:1 › makes chat stick to right side of the screen via icon on the top right, remove sticky via icon, close it @feature:chat 
584:  
585:      Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
586:      Test timeout of 90000ms exceeded.
587:  ##[error]  2) [chromium] › tests/frontend-new/specs/chat.spec.ts:85:1 › makes chat stick to right side of the screen via icon on the top right, remove sticky via icon, close it @feature:chat 
588:  
589:      Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
590:      Error: page.waitForFunction: Test timeout of 90000ms exceeded.
591:  
...

604:  ✓   44 [chromium] › tests/frontend-new/specs/chat.spec.ts:105:1 › Checks showChat=false URL Parameter hides chat then when removed it shows chat @feature:chat (1.2s)
605:  ✓   46 [chromium] › tests/frontend-new/specs/chat.spec.ts:152:1 › chat title bar lays out as a centred flex row with underscore minimize @feature:chat @feature:rtl-toggle (672ms)
606:  ✓   47 [chromium] › tests/frontend-new/specs/chat.spec.ts:207:1 › chat icon click reliably opens the chat box @feature:chat (579ms)
607:  ✓   45 [chromium] › tests/frontend-new/specs/chat.spec.ts:133:1 › chat icon click reveals chatbox after a disable → enable cycle @feature:chat (1.7s)
608:  ✓   48 [chromium] › tests/frontend-new/specs/clear_authorship_color.spec.ts:17:1 › clear authorship color @feature:clear-authorship (1.0s)
609:  ✓   49 [chromium] › tests/frontend-new/specs/clear_authorship_color.spec.ts:40:1 › clear authorship colors can be undone to restore author colors @feature:clear-authorship (1.0s)
610:  ✓   50 [chromium] › tests/frontend-new/specs/clear_authorship_color.spec.ts:77:1 › clears authorship when first line has line attributes @feature:clear-authorship (1.3s)
611:  ✓   52 [chromium] › tests/frontend-new/specs/delete.spec.ts:10:1 › delete keystroke (814ms)
612:  ✓   53 [chromium] › tests/frontend-new/specs/editbar.spec.ts:9:1 › should go to home on pad (615ms)
613:  ✓   51 [chromium] › tests/frontend-new/specs/collab_client.spec.ts:47:3 › Messages in the COLLABROOM › bug #4978 regression test (3.4s)
614:  ✓   54 [chromium] › tests/frontend-new/specs/embed_value.spec.ts:66:7 › embed links › read and write › the share link is the actual pad url (833ms)
615:  ✓   56 [chromium] › tests/frontend-new/specs/embed_value.spec.ts:97:7 › embed links › when read only option is set › the share link shows a read only url (920ms)
616:  ✓   55 [chromium] › tests/frontend-new/specs/embed_value.spec.ts:78:5 › embed links › read and write › is an iframe with the correct url parameters and correct size (1.1s)
617:  ✓   58 [chromium] › tests/frontend-new/specs/enter.spec.ts:11:3 › enter keystroke › creates a new line & puts cursor onto a new line (665ms)
618:  ✓   57 [chromium] › tests/frontend-new/specs/embed_value.spec.ts:114:7 › embed links › when read only option is set › the embed as iframe code is an iframe with the correct url parameters and correct size (1.1s)
619:  ✓   60 [chromium] › tests/frontend-new/specs/error_sanitization.spec.ts:12:3 › error sanitization › production mode hides error details from gritter popup @feature:error-gritter (640ms)
620:  ✓   59 [chromium] › tests/frontend-new/specs/enter.spec.ts:33:3 › enter keystroke › enter is always visible after event (1.5s)
621:  ✓   61 [chromium] › tests/frontend-new/specs/error_sanitization.spec.ts:47:3 › error sanitization › development mode shows full error details in gritter popup @feature:error-gritter (596ms)
622:  ✓   62 [chromium] › tests/frontend-new/specs/error_sanitization.spec.ts:72:3 › error sanitization › duplicate errors are deduplicated in both modes @feature:error-gritter (613ms)
623:  ✓   63 [chromium] › tests/frontend-new/specs/error_sanitization.spec.ts:95:3 › error sanitization › errors before clientVars handshake default to hiding details @feature:error-gritter (605ms)
624:  ✓   65 [chromium] › tests/frontend-new/specs/hide_menu_right.spec.ts:13:3 › showMenuRight URL parameter › without the parameter, .menu_right is visible (574ms)
...

653:  ✓   93 [chromium] › tests/frontend-new/specs/language.spec.ts:76:3 › Language select and change › changes direction when picking an ltr lang (1.3s)
654:  ✓   94 [chromium] › tests/frontend-new/specs/line_ops.spec.ts:20:3 › Line ops (#6433) › Ctrl+Shift+D duplicates the current line below itself (1.2s)
655:  ✓   95 [chromium] › tests/frontend-new/specs/line_ops.spec.ts:41:3 › Line ops (#6433) › Ctrl+Shift+K deletes the current line (1.2s)
656:  ✓   97 [chromium] › tests/frontend-new/specs/list_wrap_indent.spec.ts:10:3 › numbered list wrapped line indentation › wrapped lines in a numbered list item are indented (634ms)
657:  ✓   96 [chromium] › tests/frontend-new/specs/line_ops.spec.ts:65:3 › Line ops (#6433) › Ctrl+Shift+D duplicates every line in a multi-line selection (1.6s)
658:  ✓   98 [chromium] › tests/frontend-new/specs/ordered_list.spec.ts:11:5 › ordered_list.js › issue #4748 keeps numbers increment on OL (696ms)
659:  ✓   99 [chromium] › tests/frontend-new/specs/ordered_list.spec.ts:34:5 › ordered_list.js › issue #1125 keeps the numbered list on enter for the new line (796ms)
660:  ✓  101 [chromium] › tests/frontend-new/specs/ordered_list.spec.ts:97:3 › issue #5718 consecutive numbering works after indented sub-bullets (885ms)
661:  ✓  100 [chromium] › tests/frontend-new/specs/ordered_list.spec.ts:59:3 › issue #5160 ordered list increments correctly after unordered list (1.4s)
662:  ✓  102 [chromium] › tests/frontend-new/specs/ordered_list.spec.ts:142:5 › Pressing Tab in an OL increases and decreases indentation › indent and de-indent list item with keypress (633ms)
663:  ✓  103 [chromium] › tests/frontend-new/specs/ordered_list.spec.ts:169:5 › Pressing indent/outdent button in an OL increases and decreases indentation and bullet / ol formatting › indent and de-indent list item with indent button (725ms)
664:  ✓  104 [chromium] › tests/frontend-new/specs/outdated_notice.spec.ts:43:3 › outdated notice (gritter-based) › outdated:null — no outdated-notice gritter is shown (682ms)
665:  ✓  105 [chromium] › tests/frontend-new/specs/outdated_notice.spec.ts:54:3 › outdated notice (gritter-based) › outdated:minor, isFirstAuthor:false — no gritter shown (client guard) (655ms)
666:  ✓  106 [chromium] › tests/frontend-new/specs/outdated_notice.spec.ts:66:3 › outdated notice (gritter-based) › outdated:minor, isFirstAuthor:true — gritter appears with correct text (659ms)
667:  ✓  107 [chromium] › tests/frontend-new/specs/outdated_notice.spec.ts:82:3 › outdated notice (gritter-based) › user dismisses by clicking X — gritter disappears (1.5s)
668:  ✓  108 [chromium] › tests/frontend-new/specs/outdated_notice.spec.ts:96:3 › outdated notice (gritter-based) › server returns 500 — no gritter and no user-visible error (1.0s)
669:  ✓  110 [chromium] › tests/frontend-new/specs/pad_deletion_token.spec.ts:22:3 › pad deletion token › creator sees a token modal exactly once and can dismiss it (581ms)
...

706:  ✓  146 [chromium] › tests/frontend-new/specs/privacy_banner.spec.ts:162:3 › privacy banner (gritter-based) › javascript: learnMoreUrl is rejected — no anchor rendered (571ms)
707:  ✓  147 [chromium] › tests/frontend-new/specs/privacy_banner.spec.ts:175:3 › privacy banner (gritter-based) › data: learnMoreUrl is rejected — no anchor rendered (568ms)
708:  ✓  149 [chromium] › tests/frontend-new/specs/privacy_banner.spec.ts:210:3 › privacy banner (gritter-based) › mailto: learnMoreUrl is allowed (520ms)
709:  ✓  148 [chromium] › tests/frontend-new/specs/privacy_banner.spec.ts:187:3 › privacy banner (gritter-based) › unknown dismissal value is treated as dismissible (defense-in-depth) (1.4s)
710:  ✓  150 [chromium] › tests/frontend-new/specs/redo.spec.ts:12:3 › undo button then redo button › redo some typing with button (1.0s)
711:  ✓  151 [chromium] › tests/frontend-new/specs/redo.spec.ts:39:3 › undo button then redo button › redo some typing with keypress (981ms)
712:  ✓  152 [chromium] › tests/frontend-new/specs/rtl_url_param.spec.ts:11:3 › RTL URL parameter › rtl=true enables RTL mode (887ms)
713:  ✓  153 [chromium] › tests/frontend-new/specs/rtl_url_param.spec.ts:16:3 › RTL URL parameter › rtl=false disables RTL mode after rtl=true @feature:rtl-toggle (1.2s)
714:  ✓  154 [chromium] › tests/frontend-new/specs/rtl_url_param.spec.ts:26:3 › RTL URL parameter › no rtl param falls back to the pad setting after an RTL URL override @feature:rtl-toggle (1.3s)
715:  -  155 [chromium] › tests/frontend-new/specs/select_focus_restore.spec.ts:8:1 › toolbar select change returns focus to the pad editor (#7589)
716:  ✓  156 [chromium] › tests/frontend-new/specs/strikethrough.spec.ts:10:3 › strikethrough button › makes text strikethrough (641ms)
717:  ✓  158 [chromium] › tests/frontend-new/specs/theme_color_dark_mode.spec.ts:33:3 › dark color scheme › theme-color meta follows the auto dark-mode switch on dark-OS clients (554ms)
718:  ✓  157 [chromium] › tests/frontend-new/specs/theme_color_dark_mode.spec.ts:10:3 › light color scheme › theme-color meta tracks the dark-mode toggle (1.3s)
719:  ✓  159 [chromium] › tests/frontend-new/specs/timeslider_follow.spec.ts:15:3 › timeslider follow › content as it's added to timeslider (2.4s)
720:  ✓  160 [chromium] › tests/frontend-new/specs/timeslider_follow.spec.ts:56:3 › timeslider follow › only to lines that exist in the pad view, regression test for #4389 (2.4s)
721:  ✓  162 [chromium] › tests/frontend-new/specs/timeslider_identity_changeset.spec.ts:61:3 › Timeslider with identity changesets (bug #5214) › timeslider can scrub through all revisions without error (4.4s)
722:  ✓  163 [chromium] › tests/frontend-new/specs/timeslider_line_numbers.spec.ts:10:3 › timeslider line numbers › shows line numbers aligned with the rendered document lines (2.8s)
...

770:  ✓  210 [chromium] › tests/frontend-new/specs/urls_become_clickable.spec.ts:48:5 › punctuation after URL is ignored › https://etherpad.org, (978ms)
771:  ✓  211 [chromium] › tests/frontend-new/specs/urls_become_clickable.spec.ts:48:5 › punctuation after URL is ignored › https://etherpad.org; (992ms)
772:  ✓  212 [chromium] › tests/frontend-new/specs/urls_become_clickable.spec.ts:48:5 › punctuation after URL is ignored › https://etherpad.org? (941ms)
773:  ✓  213 [chromium] › tests/frontend-new/specs/urls_become_clickable.spec.ts:48:5 › punctuation after URL is ignored › https://etherpad.org! (930ms)
774:  ✓  214 [chromium] › tests/frontend-new/specs/urls_become_clickable.spec.ts:48:5 › punctuation after URL is ignored › https://etherpad.org) (954ms)
775:  ✓  215 [chromium] › tests/frontend-new/specs/urls_become_clickable.spec.ts:48:5 › punctuation after URL is ignored › https://etherpad.org] (949ms)
776:  ✓  216 [chromium] › tests/frontend-new/specs/urls_become_clickable.spec.ts:48:5 › punctuation after URL is ignored › https://etherpad.org' (963ms)
777:  ✓  217 [chromium] › tests/frontend-new/specs/urls_become_clickable.spec.ts:48:5 › punctuation after URL is ignored › https://etherpad.org* (958ms)
778:  ✓  218 [chromium] › tests/frontend-new/specs/userlist_click_to_chat.spec.ts:33:3 › userlist click → chat prefill › clicking another user opens chat and prefills @<name> @feature:chat @feature:username (2.6s)
779:  ✓  219 [chromium] › tests/frontend-new/specs/userlist_click_to_chat.spec.ts:72:3 › userlist click → chat prefill › clicking the swatch opens the color picker, not chat @feature:chat @feature:username (3.0s)
780:  ✓  220 [chromium] › tests/frontend-new/specs/userlist_click_to_chat.spec.ts:104:3 › userlist click → chat prefill › clicking the rename input on an unnamed user does not steal focus @feature:chat @feature:username (2.5s)
781:  ✓  221 [chromium] › tests/frontend-new/specs/userlist_click_to_chat.spec.ts:140:3 › userlist click → chat prefill › partial message in chat input is preserved when prefilling @feature:chat @feature:username (2.7s)
782:  ✓  222 [chromium] › tests/frontend-new/specs/wcag_author_color.spec.ts:64:3 › WCAG author colour (issue #7377) › issue scenario: #9AB3FA renders >= AA against the author text @feature:authorship-bg-color (2.2s)
783:  ✓  223 [chromium] › tests/frontend-new/specs/wcag_author_color.spec.ts:73:3 › WCAG author colour (issue #7377) › pure red #ff0000 renders >= AA after the clamp @feature:authorship-bg-color (2.2s)
784:  ✓  224 [chromium] › tests/frontend-new/specs/wcag_author_color.spec.ts:82:3 › WCAG author colour (issue #7377) › already-AA-friendly #ffeedd is rendered unchanged @feature:authorship-bg-color (2.1s)
785:  ##[notice]  2 failed
786:      [chromium] › tests/frontend-new/specs/chat.spec.ts:67:1 › makes chat stick to right side of the screen via settings, remove sticky via settings, close it @feature:chat 
787:      [chromium] › tests/frontend-new/specs/chat.spec.ts:85:1 › makes chat stick to right side of the screen via icon on the top right, remove sticky via icon, close it @feature:chat 
788:    1 skipped
789:    217 passed (7.2m)
790:  1) [chromium] › tests/frontend-new/specs/chat.spec.ts:67:1 › makes chat stick to right side of the screen via settings, remove sticky via settings, close it @feature:chat 
791:  �[31mTest timeout of 90000ms exceeded.�[39m
792:  Error: page.waitForFunction: Test timeout of 90000ms exceeded.
793:  at tests/frontend-new/helper/settingsHelper.ts:26
794:  24 |   if(checked) return
795:  25 |   await page.locator('label[for="options-stickychat"]').click()
796:  > 26 |   await page.waitForFunction(() => document.querySelector('#chatbox')?.classList.contains('stickyChat'))
797:  |              ^
798:  27 | }
799:  28 |
800:  29 | export const disableStickyChat = async (page: Page) => {
801:  at enableStickyChatviaSettings (/home/runner/work/etherpad/etherpad/src/tests/frontend-new/helper/settingsHelper.ts:26:14)
802:  at /home/runner/work/etherpad/etherpad/src/tests/frontend-new/specs/chat.spec.ts:72:3
803:  Error Context: test-results/tests-frontend-new-specs-c-5297b-ticky-via-settings-close-it-chromium/error-context.md
804:  Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
805:  �[31mTest timeout of 90000ms exceeded.�[39m
806:  Error: page.waitForFunction: Test timeout of 90000ms exceeded.
807:  at tests/frontend-new/helper/settingsHelper.ts:26
808:  24 |   if(checked) return
809:  25 |   await page.locator('label[for="options-stickychat"]').click()
810:  > 26 |   await page.waitForFunction(() => document.querySelector('#chatbox')?.classList.contains('stickyChat'))
811:  |              ^
812:  27 | }
813:  28 |
814:  29 | export const disableStickyChat = async (page: Page) => {
815:  at enableStickyChatviaSettings (/home/runner/work/etherpad/etherpad/src/tests/frontend-new/helper/settingsHelper.ts:26:14)
816:  at /home/runner/work/etherpad/etherpad/src/tests/frontend-new/specs/chat.spec.ts:72:3
817:  attachment #1: video (video/webm) ──────────────────────────────────────────────────────────────
818:  test-results/tests-frontend-new-specs-c-5297b-ticky-via-settings-close-it-chromium-retry1/video.webm
819:  ────────────────────────────────────────────────────────────────────────────────────────────────
820:  Error Context: test-results/tests-frontend-new-specs-c-5297b-ticky-via-settings-close-it-chromium-retry1/error-context.md
821:  attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
822:  test-results/tests-frontend-new-specs-c-5297b-ticky-via-settings-close-it-chromium-retry1/trace.zip
823:  Usage:
824:  pnpm exec playwright show-trace test-results/tests-frontend-new-specs-c-5297b-ticky-via-settings-close-it-chromium-retry1/trace.zip
825:  ────────────────────────────────────────────────────────────────────────────────────────────────
826:  Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
827:  �[31mTest timeout of 90000ms exceeded.�[39m
828:  Error: page.waitForFunction: Test timeout of 90000ms exceeded.
829:  at tests/frontend-new/helper/settingsHelper.ts:26
830:  24 |   if(checked) return
831:  25 |   await page.locator('label[for="options-stickychat"]').click()
832:  > 26 |   await page.waitForFunction(() => document.querySelector('#chatbox')?.classList.contains('stickyChat'))
833:  |              ^
834:  27 | }
835:  28 |
836:  29 | export const disableStickyChat = async (page: Page) => {
837:  at enableStickyChatviaSettings (/home/runner/work/etherpad/etherpad/src/tests/frontend-new/helper/settingsHelper.ts:26:14)
838:  at /home/runner/work/etherpad/etherpad/src/tests/frontend-new/specs/chat.spec.ts:72:3
839:  Error Context: test-results/tests-frontend-new-specs-c-5297b-ticky-via-settings-close-it-chromium-retry2/error-context.md
840:  2) [chromium] › tests/frontend-new/specs/chat.spec.ts:85:1 › makes chat stick to right side of the screen via icon on the top right, remove sticky via icon, close it @feature:chat 
841:  �[31mTest timeout of 90000ms exceeded.�[39m
842:  Error: page.waitForFunction: Test timeout of 90000ms exceeded.
843:  at tests/frontend-new/helper/padHelper.ts:97
844:  95 |   if(await isChatBoxSticky(page)) return
845:  96 |   await page.locator('#titlesticky').click()
846:  >  97 |   await page.waitForFunction(`document.querySelector('#chatbox').classList.contains('stickyChat')`)
847:  |              ^
848:  98 | }
849:  99 |
850:  100 | export const disableStickyChatviaIcon = async (page: Page) => {
851:  at enableStickyChatviaIcon (/home/runner/work/etherpad/etherpad/src/tests/frontend-new/helper/padHelper.ts:97:14)
852:  at /home/runner/work/etherpad/etherpad/src/tests/frontend-new/specs/chat.spec.ts:91:3
853:  Error Context: test-results/tests-frontend-new-specs-c-83d8f-ve-sticky-via-icon-close-it-chromium/error-context.md
854:  Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
855:  �[31mTest timeout of 90000ms exceeded.�[39m
856:  Error: page.waitForFunction: Test timeout of 90000ms exceeded.
857:  at tests/frontend-new/helper/padHelper.ts:97
858:  95 |   if(await isChatBoxSticky(page)) return
859:  96 |   await page.locator('#titlesticky').click()
860:  >  97 |   await page.waitForFunction(`document.querySelector('#chatbox').classList.contains('stickyChat')`)
861:  |              ^
862:  98 | }
863:  99 |
864:  100 | export const disableStickyChatviaIcon = async (page: Page) => {
865:  at enableStickyChatviaIcon (/home/runner/work/etherpad/etherpad/src/tests/frontend-new/helper/padHelper.ts:97:14)
866:  at /home/runner/work/etherpad/etherpad/src/tests/frontend-new/specs/chat.spec.ts:91:3
867:  attachment #1: video (video/webm) ──────────────────────────────────────────────────────────────
868:  test-results/tests-frontend-new-specs-c-83d8f-ve-sticky-via-icon-close-it-chromium-retry1/video.webm
869:  ────────────────────────────────────────────────────────────────────────────────────────────────
870:  Error Context: test-results/tests-frontend-new-specs-c-83d8f-ve-sticky-via-icon-close-it-chromium-retry1/error-context.md
871:  attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
872:  test-results/tests-frontend-new-specs-c-83d8f-ve-sticky-via-icon-close-it-chromium-retry1/trace.zip
873:  Usage:
874:  pnpm exec playwright show-trace test-results/tests-frontend-new-specs-c-83d8f-ve-sticky-via-icon-close-it-chromium-retry1/trace.zip
875:  ────────────────────────────────────────────────────────────────────────────────────────────────
876:  Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
877:  �[31mTest timeout of 90000ms exceeded.�[39m
878:  Error: page.waitForFunction: Test timeout of 90000ms exceeded.
879:  at tests/frontend-new/helper/padHelper.ts:97
880:  95 |   if(await isChatBoxSticky(page)) return
881:  96 |   await page.locator('#titlesticky').click()
882:  >  97 |   await page.waitForFunction(`document.querySelector('#chatbox').classList.contains('stickyChat')`)
883:  |              ^
884:  98 | }
885:  99 |
886:  100 | export const disableStickyChatviaIcon = async (page: Page) => {
887:  at enableStickyChatviaIcon (/home/runner/work/etherpad/etherpad/src/tests/frontend-new/helper/padHelper.ts:97:14)
888:  at /home/runner/work/etherpad/etherpad/src/tests/frontend-new/specs/chat.spec.ts:91:3
889:  Error Context: test-results/tests-frontend-new-specs-c-83d8f-ve-sticky-via-icon-close-it-chromium-retry2/error-context.md
890:  2 failed
891:  [chromium] › tests/frontend-new/specs/chat.spec.ts:67:1 › makes chat stick to right side of the screen via settings, remove sticky via settings, close it @feature:chat 
892:  [chromium] › tests/frontend-new/specs/chat.spec.ts:85:1 › makes chat stick to right side of the screen via icon on the top right, remove sticky via icon, close it @feature:chat 
893:  1 skipped
894:  217 passed (7.2m)
895:  [ELIFECYCLE] Command failed with exit code 1.
896:  ##[error]Process completed with exit code 1.
897:  ##[group]Run actions/upload-artifact@v7

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