online.git: cypress_test/integration_tests

0 views
Skip to first unread message

"Caolán McNamara (via github)"

unread,
Feb 2, 2026, 11:59:58 PMFeb 2
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/calc/cell_cursor_spec.js | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)

New commits:
commit 0d49312ef085e536c9f95f148c20621de5050c17
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Mon Feb 2 16:09:47 2026 +0000
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Tue Feb 3 10:28:49 2026 +0530

use the more typical helper.typeIntoInputField solution

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I34c672813d6f5126e883ce246120333735e607ad

diff --git a/cypress_test/integration_tests/desktop/calc/cell_cursor_spec.js b/cypress_test/integration_tests/desktop/calc/cell_cursor_spec.js
index 3379bbf6c2..35cd71256c 100644
--- a/cypress_test/integration_tests/desktop/calc/cell_cursor_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/cell_cursor_spec.js
@@ -55,8 +55,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Test jumping on large cell

it('Scroll and check drawing on frozen part of the view', function() {
// We will add a new sheet. Go to a cell other than A1. We will check if the new sheet is added by checking the current cell.
- cy.cGet(helper.addressInputSelector).focus();
- cy.cGet(helper.addressInputSelector).type('{selectAll}B2{enter}');
+ helper.typeIntoInputField(helper.addressInputSelector, 'B2');
calcHelper.assertAddressAfterIdle(this.win, 'B2');

// Add a new sheet.
@@ -65,8 +64,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Test jumping on large cell
calcHelper.assertAddressAfterIdle(this.win, 'A1');

// Go to a cell that we know is visible.
- cy.cGet(helper.addressInputSelector).focus();
- cy.cGet(helper.addressInputSelector).type('{selectAll}D7{enter}');
+ helper.typeIntoInputField(helper.addressInputSelector, 'D7');
calcHelper.assertAddressAfterIdle(this.win, 'D7');

// Find freeze panes button and click.

"Caolán McNamara (via github)"

unread,
Feb 3, 2026, 12:43:33 AMFeb 3
to collaboraon...@googlegroups.com
cypress_test/integration_tests/multiuser/calc/cell_cursor_spec.js | 17 ++++++----
1 file changed, 11 insertions(+), 6 deletions(-)

New commits:
commit 892504965e88807c4b08612a2e923ad45ee8488e
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Mon Feb 2 15:40:31 2026 +0000
Commit: Szymon Kłos <eszk...@gmail.com>
CommitDate: Tue Feb 3 06:42:47 2026 +0100

ensure the click was dispatched and handled in view1

before checking view2 results

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I50ff9becda139c86a351d8b29faf7bd2e95700c7

diff --git a/cypress_test/integration_tests/multiuser/calc/cell_cursor_spec.js b/cypress_test/integration_tests/multiuser/calc/cell_cursor_spec.js
index 32491f188a..6713133a3a 100644
--- a/cypress_test/integration_tests/multiuser/calc/cell_cursor_spec.js
+++ b/cypress_test/integration_tests/multiuser/calc/cell_cursor_spec.js
@@ -40,14 +40,19 @@ describe(['tagmultiuser'], 'Check cell cursor and view behavior', function() {

// now insert row in the first view
cy.cSetActiveFrame('#iframe1');
- desktopHelper.getNbIcon('InsertRowsBefore').first().click();
+ cy.getFrameWindow().then((win1) => {
+ desktopHelper.getNbIcon('InsertRowsBefore').first().click();

- // verify that second view is still at the: A400
- cy.cSetActiveFrame('#iframe2');
- desktopHelper.assertScrollbarPosition('vertical', 400, 670);
+ // wait for row insertion to complete in first view
+ helper.processToIdle(win1);
+
+ // verify that second view is still at the: A400
+ cy.cSetActiveFrame('#iframe2');
+ desktopHelper.assertScrollbarPosition('vertical', 400, 670);

- // second view should still have cursor at the previous cell: A588+1
- calcHelper.assertAddressAfterIdle(win2, 'A589');
+ // second view should still have cursor at the previous cell: A588+1
+ calcHelper.assertAddressAfterIdle(win2, 'A589');
+ });
});
});


"codewithvk (via github)"

unread,
Feb 3, 2026, 3:25:36 AMFeb 3
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js | 7 -------
1 file changed, 7 deletions(-)

New commits:
commit 0b93d4daee3d07d220b570a345044046f7df5239
Author: codewithvk <vivek....@collabora.com>
AuthorDate: Mon Feb 2 19:48:42 2026 +0530
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Tue Feb 3 08:24:26 2026 +0000

cypress: remove EditStyle and TableDialog from buggy list

These dialogs had focusable images with empty alt attributes,

fixed by core commits:
https://gerrit.libreoffice.org/c/core/+ 198547
https://gerrit.libreoffice.org/c/core/+/198548

Signed-off-by: codewithvk <vivek....@collabora.com>
Change-Id: I82fd36623079f91331bdf682acf43a4866393fec

diff --git a/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js b/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
index 7c26304a96..1677678090 100644
--- a/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
@@ -72,14 +72,7 @@ const buggyDialogs = [
'.uno:HyperlinkDialog',
'.uno:InsertFrame',
'.uno:OutlineBullet',
-
- // Below dialogs have tabindex=0 with empty alt tag
- '.uno:EditStyle?Param:string=Example&Family:short=1',
- '.uno:EditStyle?Param:string=Heading&Family:short=2',
- '.uno:FontDialog',
'.uno:PageDialog',
- '.uno:ParagraphDialog',
- '.uno:TableDialog',
];

describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: false }, function () {

"Caolán McNamara (via github)"

unread,
Feb 3, 2026, 8:17:20 AMFeb 3
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/calc/cell_cursor_spec.js | 1 +
1 file changed, 1 insertion(+)

New commits:
commit bf215fa08cc8b27fa51f8ebed8d3a214ef55fe7c
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Tue Feb 3 11:33:50 2026 +0000
Commit: Szymon Kłos <eszk...@gmail.com>
CommitDate: Tue Feb 3 14:16:15 2026 +0100

restore .jsdialog-overlay click

`<input class="ui-combobox-content addressInput jsdialog" id="pos_window-input-address" role="combobox" autocomplete="off" aria-autocomplete="list" aria-expanded="false" aria-label="D7">`

is being covered by another element:

`<button class="ui-content unobutton selected" id="layout-freeze-panes264-button" aria-label="Freeze Rows and Columns" aria-pressed="true">...</button>`

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Iff06f1c6e01de14c9f5c9c4f51db2cea92ec1690

diff --git a/cypress_test/integration_tests/desktop/calc/cell_cursor_spec.js b/cypress_test/integration_tests/desktop/calc/cell_cursor_spec.js
index 35cd71256c..17ca960da0 100644
--- a/cypress_test/integration_tests/desktop/calc/cell_cursor_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/cell_cursor_spec.js
@@ -71,6 +71,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Test jumping on large cell
cy.cGet('#View-tab-label').click();
desktopHelper.getNbIconArrow('FreezePanes').click();
desktopHelper.getNbIcon('FreezePanes').last().click();
+ cy.cGet('.jsdialog-overlay').click(); // close popup

// Scroll down.
helper.typeIntoInputField(helper.addressInputSelector, 'Z110');

"Mohit Marathe (via github)"

unread,
Feb 5, 2026, 4:24:17 AMFeb 5
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/calc_helper.js | 3 +--
cypress_test/integration_tests/common/find_helper.js | 2 +-
cypress_test/integration_tests/common/search_helper.js | 2 +-
cypress_test/integration_tests/common/writer_helper.js | 2 +-
cypress_test/integration_tests/desktop/calc/navigator_spec.js | 6 +++---
cypress_test/integration_tests/desktop/calc/sheet_operation_spec.js | 4 ++--
cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js | 2 +-
cypress_test/integration_tests/desktop/writer/searchbar_spec.js | 2 +-
8 files changed, 11 insertions(+), 12 deletions(-)

New commits:
commit d97972ab714d1f767c77b254079b5cb62a45cb18
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Thu Feb 5 12:19:03 2026 +0530
Commit: Szymon Kłos <eszk...@gmail.com>
CommitDate: Thu Feb 5 10:23:39 2026 +0100

cypress: do not chain .type() after .clear()

instead use {selectall}{backspace}

Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Change-Id: I10222780e5dcaa53dd415b00ff298bb51c1b0fbc

diff --git a/cypress_test/integration_tests/common/calc_helper.js b/cypress_test/integration_tests/common/calc_helper.js
index 07ff6591b5..597d9e779a 100644
--- a/cypress_test/integration_tests/common/calc_helper.js
+++ b/cypress_test/integration_tests/common/calc_helper.js
@@ -296,8 +296,7 @@ function selectCellsInRange(range) {
cy.log('>> selectCellsInRange - start');

cy.cGet(helper.addressInputSelector)
- .clear()
- .type(range + '{enter}');
+ .type('{selectall}{backspace}' + range + '{enter}');

cy.log('<< selectCellsInRange - end');
}
diff --git a/cypress_test/integration_tests/common/find_helper.js b/cypress_test/integration_tests/common/find_helper.js
index b691e6d965..9018658ea0 100644
--- a/cypress_test/integration_tests/common/find_helper.js
+++ b/cypress_test/integration_tests/common/find_helper.js
@@ -34,7 +34,7 @@ function openFindDialog() {
function typeIntoSearchField(text) {
cy.log('>> typeIntoSearchField - start');

- cy.cGet('input#searchterm-input-dialog').clear().type(text);
+ cy.cGet('input#searchterm-input-dialog').type('{selectall}{backspace}' + text);
cy.cGet('input#searchterm-input-dialog').should('have.prop', 'value', text);

cy.cGet('#search').should('not.be.disabled');
diff --git a/cypress_test/integration_tests/common/search_helper.js b/cypress_test/integration_tests/common/search_helper.js
index f1e734d1b0..611cc10426 100644
--- a/cypress_test/integration_tests/common/search_helper.js
+++ b/cypress_test/integration_tests/common/search_helper.js
@@ -23,7 +23,7 @@ function showSearchBar() {
function typeIntoSearchField(text) {
cy.log('>> typeIntoSearchField - start');

- cy.cGet('input#search-input').clear().type(text);
+ cy.cGet('input#search-input').type('{selectall}{backspace}' + text);
cy.cGet('input#search-input').should('have.prop', 'value', text);

cy.cGet('#searchprev').should('not.be.disabled');
diff --git a/cypress_test/integration_tests/common/writer_helper.js b/cypress_test/integration_tests/common/writer_helper.js
index 2f029b86d5..de5f01db93 100644
--- a/cypress_test/integration_tests/common/writer_helper.js
+++ b/cypress_test/integration_tests/common/writer_helper.js
@@ -61,7 +61,7 @@ function openQuickFind() {
function searchInQuickFind(text) {
cy.log('>> searchInQuickFind - start');

- cy.cGet('input#navigator-search-input').clear().type(text);
+ cy.cGet('input#navigator-search-input').type('{selectall}{backspace}' + text);
cy.cGet('input#navigator-search-input').should('have.prop', 'value', text);

cy.cGet('#navigator-search-button').click();
diff --git a/cypress_test/integration_tests/desktop/calc/navigator_spec.js b/cypress_test/integration_tests/desktop/calc/navigator_spec.js
index 741901c7cc..47df32d276 100644
--- a/cypress_test/integration_tests/desktop/calc/navigator_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/navigator_spec.js
@@ -36,7 +36,7 @@ describe.skip(['tagdesktop'], 'Navigator tests.', function () {
cy.cGet('.spreadsheet-tab.spreadsheet-tab-selected').rightclick();
cy.cGet('body').contains('.context-menu-link', 'Rename Sheet...').click();
cy.cGet('#modal-dialog-rename-calc-sheet').should('exist');
- cy.cGet('#input-modal-input').clear().type('renameSheet');
+ cy.cGet('#input-modal-input').type('{selectall}{backspace}renameSheet');
cy.cGet('#response-ok').click();
cy.cGet('.spreadsheet-tab.spreadsheet-tab-selected').should('have.text', 'renameSheet');
cy.cGet('#contentbox').contains('.jsdialog.sidebar.ui-treeview-cell-text', 'renameSheet').should('exist');
@@ -47,8 +47,8 @@ describe.skip(['tagdesktop'], 'Navigator tests.', function () {
cy.cGet('#menu-data').click();
cy.cGet('#menu-data').contains('.has-submenu', 'Named Ranges and Expressions').parent().click();
cy.cGet('#menu-data').contains('Define...').parent().click();
- cy.cGet('#DefineNameDialog').find('#edit').clear().type('rName2');
- cy.cGet('#DefineNameDialog').find('#range').clear().type('$Sheet5.$C$55:$C$56');
+ cy.cGet('#DefineNameDialog').find('#edit').type('{selectall}{backspace}rName2');
+ cy.cGet('#DefineNameDialog').find('#range').type('{selectall}{backspace}$Sheet5.$C$55:$C$56');
cy.cGet('#DefineNameDialog').find('#add').click();

// Check if it exist in Navigator
diff --git a/cypress_test/integration_tests/desktop/calc/sheet_operation_spec.js b/cypress_test/integration_tests/desktop/calc/sheet_operation_spec.js
index 034f310ba9..6d6ff1e3d3 100644
--- a/cypress_test/integration_tests/desktop/calc/sheet_operation_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/sheet_operation_spec.js
@@ -61,7 +61,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Sheet Operations.', functi
cy.cGet('.spreadsheet-tab.spreadsheet-tab-selected').should('have.text', 'Sheet1');
calcHelper.selectOptionFromContextMenu('Rename Sheet...');
cy.cGet('#modal-dialog-rename-calc-sheet').should('exist');
- cy.cGet('#input-modal-input').clear().type('renameSheet');
+ cy.cGet('#input-modal-input').type('{selectall}{backspace}renameSheet');
cy.cGet('#response-ok').click();
cy.cGet('.spreadsheet-tab.spreadsheet-tab-selected').should('have.text', 'renameSheet');
});
@@ -71,7 +71,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Sheet Operations.', functi
cy.cGet('.spreadsheet-tab.spreadsheet-tab-selected').should('have.text', 'Sheet1');
calcHelper.selectOptionFromContextMenu('Rename Sheet...');
cy.cGet('#modal-dialog-rename-calc-sheet').should('exist');
- cy.cGet('#input-modal-input').should('have.focus').clear().type('renameSheet{Enter}');
+ cy.cGet('#input-modal-input').should('have.focus').type('{selectall}{backspace}renameSheet{Enter}');
cy.cGet('#modal-dialog-rename-calc-sheet').should('not.exist');
cy.cGet('.spreadsheet-tab.spreadsheet-tab-selected').should('have.text', 'renameSheet');
});
diff --git a/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js b/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
index 1677678090..d704111317 100644
--- a/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
@@ -493,7 +493,7 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f
})
.then(() => {
// save with a name that exists to force the warning subdialog
- cy.cGet('#name_entry-input').clear().type('Hatching 1');
+ cy.cGet('#name_entry-input').type('{selectall}{backspace}Hatching 1');
cy.cGet('[role="dialog"][aria-labelledby*="Name"] #ok-button').should('be.enabled').click();
return helper.processToIdle(win);
})
diff --git a/cypress_test/integration_tests/desktop/writer/searchbar_spec.js b/cypress_test/integration_tests/desktop/writer/searchbar_spec.js
index 13b82a6319..b915aa9185 100644
--- a/cypress_test/integration_tests/desktop/writer/searchbar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/searchbar_spec.js
@@ -25,7 +25,7 @@ describe.skip(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Searching via search

it('Search existing word in table.', function() {
helper.setDummyClipboardForCopy();
- cy.cGet('input#search-input').clear().type('b'); // check character inside table
+ cy.cGet('input#search-input').type('{selectall}{backspace}b'); // check character inside table
cy.wait(500);
cy.cGet('input#search-input').should('have.focus');


"Caolán McNamara (via github)"

unread,
Feb 8, 2026, 11:42:20 PMFeb 8
to collaboraon...@googlegroups.com
cypress_test/integration_tests/mobile/calc/bottom_toolbar_spec.js | 14 +++++-----
1 file changed, 7 insertions(+), 7 deletions(-)

New commits:
commit 8aa8f145f69d305e0fe188b2a842b219b055908d
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Sat Feb 7 21:09:17 2026 +0000
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Mon Feb 9 10:11:59 2026 +0530

add should('not.be.disabled') before these clicks

cy: command ✔ cGet .blinking-cursor
cy: command ✔ assert expected **<div.leaflet-cursor.blinking-cursor.blinking-suspended>** to be **visible**
cy:log ✱ << enableEditingMobile - end
cy: command ✔ cGet #toolbar-up .unoRedo
cy: command ✔ assert expected **<div#redo15.unotoolbutton.jsdialog.ui-content.unospan.unoRedo.no-label>** to have attribute **disabled**
cy:log ✱ >> typeIntoDocument - start
cy: command ✔ cGet div.clipboard
cy: command ✔ type x, {force: true}
cy:log ✱ << typeIntoDocument - end
cy: command ✔ cGet #toolbar-up .unoRedo
cy: command ✔ assert expected **<div#redo15.unotoolbutton.jsdialog.ui-content.unospan.unoRedo.no-label>** to have attribute **disabled**
cy: command ✔ cGet #toolbar-up .unoUndo
cy: command ✘ assert expected **<div#undo14.unotoolbutton.jsdialog.ui-content.unospan.unoUndo.no-label>** not to have attribute **disabled**
cy: command ✔ fail:
Timed out retrying after 10000ms: expected '<div#undo14.unotoolbutton.jsdialog.ui-content.unospan.unoUndo.no-label>' not to have attribute 'disabled'
/home/collabora/jenkins/workspace/github_online_master_debug_vs_co-25.04_cypress_mobile/cypress_test/integration_tests/mobile/writer/toolbar_spec.js:56:41
54 | cy.cGet('#toolbar-up .unoRedo').should('have.attr', 'disabled');
55 | // Do an undo
> 56 | cy.cGet('#toolbar-up .unoUndo').should('not.have.attr', 'disabled');
| ^
57 | cy.cGet('#toolbar-up .unoUndo').click();
58 | // Button should become enabled
59 | cy.cGet('#toolbar-u ...
cy:log ✱ Finishing test: integration_tests/mobile/writer/toolbar_spec.js / Toolbar tests / State of redo toolbar item.
Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Iffec3637c70d29691eea434b65aafc86f6150845

diff --git a/cypress_test/integration_tests/mobile/calc/bottom_toolbar_spec.js b/cypress_test/integration_tests/mobile/calc/bottom_toolbar_spec.js
index dac36a19e8..c651f80fc1 100644
--- a/cypress_test/integration_tests/mobile/calc/bottom_toolbar_spec.js
+++ b/cypress_test/integration_tests/mobile/calc/bottom_toolbar_spec.js
@@ -22,14 +22,14 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Interact with bottom toolba

helper.getCursorPos('left', 'currentTextEndPos')

- mobileHelper.getCompactIcon('AcceptFormula').click();
+ mobileHelper.getCompactIcon('AcceptFormula').should('not.be.disabled').click();

cy.cGet('.cursor-overlay .blinking-cursor').should('not.exist');
}

it('Apply bold.', function() {
helper.setDummyClipboardForCopy();
- mobileHelper.getCompactIcon('Bold').click();
+ mobileHelper.getCompactIcon('Bold').should('not.be.disabled').click();
calcHelper.selectEntireSheet();
helper.copy();
cy.cGet('#copy-paste-container table td b').should('exist');
@@ -37,7 +37,7 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Interact with bottom toolba

it('Apply italic.', function() {
helper.setDummyClipboardForCopy();
- mobileHelper.getCompactIcon('Italic').click();
+ mobileHelper.getCompactIcon('Italic').should('not.be.disabled').click();
calcHelper.selectEntireSheet();
helper.copy();
cy.cGet('#copy-paste-container table td i').should('exist');
@@ -45,21 +45,21 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Interact with bottom toolba

it('Apply underline.', function() {
helper.setDummyClipboardForCopy();
- mobileHelper.getCompactIcon('Underline').click();
+ mobileHelper.getCompactIcon('Underline').should('not.be.disabled').click();
calcHelper.selectEntireSheet();
helper.copy();
cy.cGet('#copy-paste-container table td u').should('exist');
});

it.skip('Apply strikeout.', function() {
- mobileHelper.getCompactIcon('Strikeout').click();
+ mobileHelper.getCompactIcon('Strikeout').should('not.be.disabled').click();
calcHelper.selectEntireSheet();
cy.cGet('#copy-paste-container table td s').should('exist');
});

it('Apply font color.', function() {
helper.setDummyClipboardForCopy();
- cy.cGet('#toolbar-down #fontcolor').click();
+ cy.cGet('#toolbar-down #fontcolor').should('not.be.disabled').click();
mobileHelper.selectFromColorPalette(0, 5);
calcHelper.selectEntireSheet();
helper.copy();
@@ -68,7 +68,7 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Interact with bottom toolba

it('Apply highlight color.', function() {
helper.setDummyClipboardForCopy();
- cy.cGet('#toolbar-down #backcolor').click();
+ cy.cGet('#toolbar-down #backcolor').should('not.be.disabled').click();
mobileHelper.selectFromColorPalette(0, 5);
calcHelper.selectEntireSheet();
helper.copy();

"Caolán McNamara (via github)"

unread,
Feb 9, 2026, 12:09:50 AMFeb 9
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/impress_helper.js | 10 +++--
cypress_test/integration_tests/desktop/impress/slide_operations_spec.js | 8 ++--
cypress_test/integration_tests/mobile/impress/hamburger_menu_spec.js | 17 +++++-----
cypress_test/integration_tests/mobile/impress/insertion_wizard_spec.js | 7 ++--
cypress_test/integration_tests/mobile/impress/slide_operation_spec.js | 11 ++++--
5 files changed, 32 insertions(+), 21 deletions(-)

New commits:
commit 3d18a28e64161858e5afad729dd8c5a8881d956e
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Fri Feb 6 14:09:02 2026 +0000
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Mon Feb 9 10:39:30 2026 +0530

processToIdle before counting slide previews

rename assertNumberOfSlidePreviews to assertSlidePreviewCountAfterIdle
and always do it there.

cy:command ✔ click
cy:log ✱ >> assertNumberOfSlidePreviews - start
cy:command ✔ cGet #slide-sorter .preview-frame
cy:command ✘ assert expected **[ <div#first-drop-site.preview-frame.preview-frame-landscape>, 1 more... ]** to have a length of **3** but got **2**
cy:command ✔ fail:
Test failed: integration_tests/desktop/impress/slide_operations_spec.js / Slide operations / Remove slides

Timed out retrying after 10000ms: Not enough elements found. Found '2', expected '3'.

/home/collabora/jenkins/workspace/github_online_master_debug_vs_co-25.04_cypress_desktop/cypress_test/integration_tests/common/impress_helper.js:45:10
43 | cy.log('>> assertNumberOfSlidePreviews - start');
44 | cy.cGet('#slide-sorter .preview-frame')
> 45 | .should('have.length', slides + 1);
| ^
46 | cy.log('<< assertNumberOfSlidePreviews - end');
47 | }
48 | // Trigger mouse click on center of the screen
cons:log ✱ ==== debug.html receiveMessage: {"MessageId":"Doc_ModifiedStatus","SendTime":1770383478244,"Values":{"Modified":true}}
cy:log ✱ Finishing test: integration_tests/desktop/impress/slide_operations_spec.js / Slide operations / Remove slides

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I35fa01e768a911e29af7cbef615a2241686bc5e4

diff --git a/cypress_test/integration_tests/common/impress_helper.js b/cypress_test/integration_tests/common/impress_helper.js
index 5070acd0b5..1c9eb6478d 100644
--- a/cypress_test/integration_tests/common/impress_helper.js
+++ b/cypress_test/integration_tests/common/impress_helper.js
@@ -55,13 +55,15 @@ function typeTextAndVerify(text, expected, copy) {
// We use the number of slide previews as indicators.
// Parameters:
// slides - number of expected slides
-function assertNumberOfSlidePreviews(slides) {
- cy.log('>> assertNumberOfSlidePreviews - start');
+function assertSlidePreviewCountAfterIdle(win, slides) {
+ cy.log('>> assertSlidePreviewCountAfterIdle - start');

+ helper.processToIdle(win);
+ // +1 to account for #first-drop-site which also has the .preview-frame class
cy.cGet('#slide-sorter .preview-frame')
.should('have.length', slides + 1);

- cy.log('<< assertNumberOfSlidePreviews - end');
+ cy.log('<< assertSlidePreviewCountAfterIdle - end');
}

// Trigger mouse click on center of the screen
@@ -240,7 +242,7 @@ function changeSlide(changeNum,direction) {
module.exports.assertNotInTextEditMode = assertNotInTextEditMode;
module.exports.assertInTextEditMode = assertInTextEditMode;
module.exports.typeTextAndVerify = typeTextAndVerify;
-module.exports.assertNumberOfSlidePreviews = assertNumberOfSlidePreviews;
+module.exports.assertSlidePreviewCountAfterIdle = assertSlidePreviewCountAfterIdle;
module.exports.clickCenterOfSlide = clickCenterOfSlide;
module.exports.selectTextShapeInTheCenter = selectTextShapeInTheCenter;
module.exports.triggerNewSVGForShapeInTheCenter = triggerNewSVGForShapeInTheCenter;
diff --git a/cypress_test/integration_tests/desktop/impress/slide_operations_spec.js b/cypress_test/integration_tests/desktop/impress/slide_operations_spec.js
index b2fd64e35a..a8b3ae64b9 100644
--- a/cypress_test/integration_tests/desktop/impress/slide_operations_spec.js
+++ b/cypress_test/integration_tests/desktop/impress/slide_operations_spec.js
@@ -18,14 +18,14 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Slide operations', functio
it('Add slides', function() {
cy.cGet('#presentation-toolbar #insertpage').click();

- impressHelper.assertNumberOfSlidePreviews(2);
+ impressHelper.assertSlidePreviewCountAfterIdle(this.win, 2);
});

it('Remove slides', function() {
// Add slides
cy.cGet('#presentation-toolbar #insertpage').click();

- impressHelper.assertNumberOfSlidePreviews(2);
+ impressHelper.assertSlidePreviewCountAfterIdle(this.win, 2);

// Remove Slides
cy.cGet('#presentation-toolbar #deletepage')
@@ -39,7 +39,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Slide operations', functio
cy.cGet('#presentation-toolbar #deletepage')
.should('have.attr', 'disabled')

- impressHelper.assertNumberOfSlidePreviews(1);
+ impressHelper.assertSlidePreviewCountAfterIdle(this.win, 1);

});

@@ -74,7 +74,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Slide operations', functio
cy.cGet('#Insert-tab-label').click();
desktopHelper.getNbIcon('DuplicatePage', 'Insert').click();

- impressHelper.assertNumberOfSlidePreviews(2);
+ impressHelper.assertSlidePreviewCountAfterIdle(this.win, 2);
cy.cGet('#SlideStatus').should('have.text', 'Slide 2 of 2');
cy.cGet('[id^=annotation-content-area-]').should('include.text', 'some text0');

diff --git a/cypress_test/integration_tests/mobile/impress/hamburger_menu_spec.js b/cypress_test/integration_tests/mobile/impress/hamburger_menu_spec.js
index e83cc5e909..e671df4fd6 100644
--- a/cypress_test/integration_tests/mobile/impress/hamburger_menu_spec.js
+++ b/cypress_test/integration_tests/mobile/impress/hamburger_menu_spec.js
@@ -13,6 +13,9 @@ describe.skip(['tagmobile'], 'Trigger hamburger menu options.', function() {

// Click on edit button
mobileHelper.enableEditingMobile();
+ cy.getFrameWindow().then((win) => {
+ this.win = win;
+ });
});

it('Save', { defaultCommandTimeout: 60000 }, function() {
@@ -212,27 +215,27 @@ describe.skip(['tagmobile'], 'Trigger hamburger menu options.', function() {
});

it('Slide: New Slide.', function() {
- impressHelper.assertNumberOfSlidePreviews(1);
+ impressHelper.assertSlidePreviewCountAfterIdle(this.win, 1);

mobileHelper.selectHamburgerMenuItem(['Slide', 'New Slide']);

- impressHelper.assertNumberOfSlidePreviews(2);
+ impressHelper.assertSlidePreviewCountAfterIdle(this.win, 2);
});

it('Slide: Duplicate Slide.', function() {
- impressHelper.assertNumberOfSlidePreviews(1);
+ impressHelper.assertSlidePreviewCountAfterIdle(this.win, 1);

mobileHelper.selectHamburgerMenuItem(['Slide', 'Duplicate Slide']);

- impressHelper.assertNumberOfSlidePreviews(2);
+ impressHelper.assertSlidePreviewCountAfterIdle(this.win, 2);
});

it('Slide: Delete Slide.', function() {
- impressHelper.assertNumberOfSlidePreviews(1);
+ impressHelper.assertSlidePreviewCountAfterIdle(this.win, 1);

mobileHelper.selectHamburgerMenuItem(['Slide', 'New Slide']);

- impressHelper.assertNumberOfSlidePreviews(2);
+ impressHelper.assertSlidePreviewCountAfterIdle(this.win, 2);

mobileHelper.selectHamburgerMenuItem(['Slide', 'Delete Slide']);

@@ -240,7 +243,7 @@ describe.skip(['tagmobile'], 'Trigger hamburger menu options.', function() {
cy.cGet('#deleteslide-modal-response').click();
cy.cGet('#mobile-wizard-content-modal-dialog-deleteslide-modal').should('not.exist');

- impressHelper.assertNumberOfSlidePreviews(1);
+ impressHelper.assertSlidePreviewCountAfterIdle(this.win, 1);
});

it('Full Screen.', function() {
diff --git a/cypress_test/integration_tests/mobile/impress/insertion_wizard_spec.js b/cypress_test/integration_tests/mobile/impress/insertion_wizard_spec.js
index a42591db99..5b3f57f697 100644
--- a/cypress_test/integration_tests/mobile/impress/insertion_wizard_spec.js
+++ b/cypress_test/integration_tests/mobile/impress/insertion_wizard_spec.js
@@ -10,6 +10,9 @@ describe(['tagmobile', 'tagnextcloud'], 'Impress insertion wizard.', function()
helper.setupAndLoadDocument('impress/insertion_wizard.odp');

mobileHelper.enableEditingMobile();
+ cy.getFrameWindow().then((win) => {
+ this.win = win;
+ });
});

function selectionShouldBeTextShape(checkShape) {
@@ -370,10 +373,10 @@ describe(['tagmobile', 'tagnextcloud'], 'Impress insertion wizard.', function()
});

it('Insert new slide with plus button.', function() {
- impressHelper.assertNumberOfSlidePreviews(1);
+ impressHelper.assertSlidePreviewCountAfterIdle(this.win, 1);
cy.cGet('body').contains('.leaflet-control-zoom-in', '+').should('be.visible');
cy.cGet('body').contains('.leaflet-control-zoom-in', '+').click();
- impressHelper.assertNumberOfSlidePreviews(2);
+ impressHelper.assertSlidePreviewCountAfterIdle(this.win, 2);
if (Cypress.env('INTEGRATION') !== 'nextcloud') {
cy.cGet('#toolbar-mobile-back').click();
cy.cGet('.leaflet-control-zoom-in').should('not.exist');
diff --git a/cypress_test/integration_tests/mobile/impress/slide_operation_spec.js b/cypress_test/integration_tests/mobile/impress/slide_operation_spec.js
index 2ce26ae65e..4987326494 100644
--- a/cypress_test/integration_tests/mobile/impress/slide_operation_spec.js
+++ b/cypress_test/integration_tests/mobile/impress/slide_operation_spec.js
@@ -10,24 +10,27 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Slide operations', function
helper.setupAndLoadDocument('impress/slide_operations.odp');

mobileHelper.enableEditingMobile();
+ cy.getFrameWindow().then((win) => {
+ this.win = win;
+ });
});

it('Add slides', function() {
cy.cGet('.leaflet-control-zoom-in').click();

- impressHelper.assertNumberOfSlidePreviews(2);
+ impressHelper.assertSlidePreviewCountAfterIdle(this.win, 2);
});

it('Remove Slides', function() {
//add slides
cy.cGet('.leaflet-control-zoom-in').click();
- impressHelper.assertNumberOfSlidePreviews(2);
+ impressHelper.assertSlidePreviewCountAfterIdle(this.win, 2);
//remove slides
mobileHelper.openHamburgerMenu();
cy.cGet('.menu-entry-icon.slidemenu').parent().click();
cy.cGet('.menu-entry-icon.deletepage').parent().click();
cy.cGet('#deleteslide-modal-response').click();
- impressHelper.assertNumberOfSlidePreviews(1);
+ impressHelper.assertSlidePreviewCountAfterIdle(this.win, 1);
});

it('Duplicate Slide', function() {
@@ -36,7 +39,7 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Slide operations', function
cy.cGet('.menu-entry-icon.slidemenu').parent().click();
cy.cGet('.menu-entry-icon.duplicatepage').parent().click();

- impressHelper.assertNumberOfSlidePreviews(2);
+ impressHelper.assertSlidePreviewCountAfterIdle(this.win, 2);
});

});

"Caolán McNamara (via github)"

unread,
Feb 9, 2026, 3:17:24 AMFeb 9
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/replace_dialog_spec.js | 13 ++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)

New commits:
commit b5da18ed79887deb00aa8399c400a6e36a499420
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Sat Feb 7 21:04:13 2026 +0000
Commit: Szymon Kłos <eszk...@gmail.com>
CommitDate: Mon Feb 9 09:16:42 2026 +0100

'replace' can trigger a rebuild of the dialog while cypress tries to close it

The replace triggers a jsdialog update and when the browser-side
processes the update the dialog gets rebuilt, and
.ui-dialog-titlebar-close temporarily disappears, so wait for the
replace operation round-trip and dialog rebuild to complete before
closing the dialog.

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Ib0998cff1dae1bcd16fec45a812faadb86f9dd19

diff --git a/cypress_test/integration_tests/desktop/writer/replace_dialog_spec.js b/cypress_test/integration_tests/desktop/writer/replace_dialog_spec.js
index 501cb6cc1c..ecb8b4b505 100644
--- a/cypress_test/integration_tests/desktop/writer/replace_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/replace_dialog_spec.js
@@ -6,6 +6,9 @@ var findHelper = require('../../common/find_helper');
describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Replace Dialog Tests', function() {
beforeEach(function() {
helper.setupAndLoadDocument('writer/find_replace.odt');
+ cy.getFrameWindow().then(function(win) {
+ this.win = win;
+ });
});

it('Ctrl H should open search dialog with replace tab active', function() {
@@ -89,8 +92,14 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Replace Dialog Tests', fun
// Type replacement and press Enter
cy.cGet('#replaceterm-input-dialog').type('replaced').realPress('Enter');

- // Close the dialog
- cy.cGet('.ui-dialog-titlebar-close').click();
+ // The replace triggers a jsdialog update and when the browser-side
+ // processes the update the dialog gets rebuilt, and
+ // .ui-dialog-titlebar-close temporarily disappears, so wait for the
+ // replace operation round-trip and dialog rebuild to complete before
+ // closing the dialog.
+ helper.processToIdle(this.win);
+
+ findHelper.closeFindDialog();

// Select all text to verify replacement happened
helper.selectAllText();

"Caolán McNamara (via github)"

unread,
Feb 9, 2026, 4:33:56 AMFeb 9
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/helper.js | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)

New commits:
commit d2011d7d350319479f050046fdd21dd821bc8595
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Sun Feb 8 14:05:10 2026 +0000
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Mon Feb 9 15:03:45 2026 +0530

make sure document-canvas is visible and not obscured by busypopup

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I6310365bbcba43e15036b5c8166fd2f322989480

diff --git a/cypress_test/integration_tests/common/helper.js b/cypress_test/integration_tests/common/helper.js
index d52e9c5163..076568c693 100644
--- a/cypress_test/integration_tests/common/helper.js
+++ b/cypress_test/integration_tests/common/helper.js
@@ -373,8 +373,9 @@ function waitForInterferingUser() {
function documentChecks(skipInitializedCheck = false) {
cy.log('>> documentChecks - start');

- cy.cGet('#document-canvas', {timeout : Cypress.config('defaultCommandTimeout') * 2.0});
+ var canvasCheck = cy.cGet('#document-canvas', {timeout : Cypress.config('defaultCommandTimeout') * 2.0});
if (!skipInitializedCheck) {
+ canvasCheck.should('be.visible');
cy.cGet('#map', {timeout : Cypress.config('defaultCommandTimeout') * 2.0})
.should('have.class', 'initialized');
}
@@ -425,6 +426,11 @@ function documentChecks(skipInitializedCheck = false) {
});
}

+ // Ensure the busypopup overlay is gone so it doesn't swallow clicks.
+ if (!skipInitializedCheck) {
+ cy.cGet('#busypopup-overlay').should('not.exist');
+ }
+
if (Cypress.env('INTERFERENCE_TEST') === true) {
waitForInterferingUser();
}

"Caolán McNamara (via github)"

unread,
Feb 9, 2026, 8:09:12 AMFeb 9
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/calc/delete_objects_spec.js | 4 ++++
1 file changed, 4 insertions(+)

New commits:
commit 3302e0b9b84422d87724816b17c027f97c1a4145
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Sun Feb 8 15:27:08 2026 +0000
Commit: Miklos Vajna <vmi...@collabora.com>
CommitDate: Mon Feb 9 14:08:34 2026 +0100

ensure the wizard dialog is gone before pressing delete

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I614692498f7ba0c063aacb34ffdba6d78c3aa825

diff --git a/cypress_test/integration_tests/desktop/calc/delete_objects_spec.js b/cypress_test/integration_tests/desktop/calc/delete_objects_spec.js
index dc39c3bef4..71a0d40517 100644
--- a/cypress_test/integration_tests/desktop/calc/delete_objects_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/delete_objects_spec.js
@@ -42,8 +42,12 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Delete Objects', function(
desktopHelper.getCompactIconArrow('DefaultNumbering').click();
// Click on insert chart button.
desktopHelper.getCompactIcon('InsertObjectChart').click();
+
// Click on the ok button of chart jsdialog.
+ cy.cGet('#CHART2_HID_SCH_WIZARD_ROADMAP').should('exist');
cy.cGet('.ui-pushbutton.jsdialog.button-primary').click();
+ cy.cGet('#CHART2_HID_SCH_WIZARD_ROADMAP').should('not.exist');
+
cy.cGet('#test-div-shapeHandlesSection').should('exist');
// delete
helper.typeIntoDocument('{del}');

"Caolán McNamara (via github)"

unread,
Feb 9, 2026, 2:39:19 PMFeb 9
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/impress_helper.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit 0aa5318d1d521938785c5832f69036a09b4da6ed
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Sat Feb 7 20:04:30 2026 +0000
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Mon Feb 9 19:38:47 2026 +0000

use test-div-shapeHandlesSection to detect selection removeed

.leaflet-drag-transform-marker is removed by the click via brower-side
events, while #test-div-shapeHandlesSection is removed on receipt of the
core's 'graphicselection: EMPTY' so that's a better choice to indicate
the the shape selection has truly been removed.

cy: command ✔ assert expected **.leaflet-drag-transform-marker** not to exist in the DOM
cy:log ✱ << removeShapeSelection - end
cy: command ✔ cGet #document-container
cy: command ✔ assert expected **<div#document-container.notebookbar-active.slide-normal-mode.landscape.parts-preview-document>** to have a length of **1**
cy: command ✔ cGet body
cy: command ✔ click 625.5, 348, {ctrlkey: true}
cy: command ✔ wrap null
cy: command ✔ assert .uno:ReportWhenIdle result with idleID 11: expected **{ Object (proxy, thisValue, ...) }** to be an object
cy: command ✔ cGet [id^="info-modal-label2"]
cy: command ✘ assert expected **[id^="info-modal-label2"]** to have text **http://www.something.com/**, but the text was **''**
cy: command ✔ fail:
Timed out retrying after 10000ms: Expected to find element: `[id^="info-modal-label2"]`, but never found it. Queried from:
> cy.get(#coolframe, [object Object]).its(0.contentDocument, [object Object])
/home/collabora/jenkins/workspace/github_online_master_debug_vs_co-25.04_cypress_desktop/cypress_test/integration_tests/desktop/impress/top_toolbar_spec.js:120:46
118 | impressHelper.clickCenterOfSlide({ ctrlKey: true });
119 | helper.processToIdle(this.win);
> 120 | cy.cGet('[id^="info-modal-label2"]').should('have.text', 'http://www.something.com/');
| ^
121 | cy.cGet( ...
cy:log ✱ Finishing test: integration_tests/desktop/impress/top_toolbar_spec.js / Top toolbar tests. / Click shape hyperlink.
cy: command ✔ getFrameWindow #coolframe
Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I9ff51648ab84a16ce0b868a9e206876645542b3f

diff --git a/cypress_test/integration_tests/common/impress_helper.js b/cypress_test/integration_tests/common/impress_helper.js
index 1c9eb6478d..b7709dc025 100644
--- a/cypress_test/integration_tests/common/impress_helper.js
+++ b/cypress_test/integration_tests/common/impress_helper.js
@@ -135,7 +135,7 @@ function removeShapeSelection() {
expect(overlay.children('svg').length).to.equal(0);
});

- cy.cGet('.leaflet-drag-transform-marker').should('not.exist');
+ cy.cGet('#test-div-shapeHandlesSection').should('not.exist');

cy.log('<< removeShapeSelection - end');
}

"Caolán McNamara (via github)"

unread,
Feb 10, 2026, 2:07:31 AMFeb 10
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/impress_helper.js | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)

New commits:
commit ff05ff6f40b297baabf71597690a6e64a70ca305
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Mon Feb 9 11:00:20 2026 +0000
Commit: Szymon Kłos <eszk...@gmail.com>
CommitDate: Tue Feb 10 08:06:39 2026 +0100

make mobile/impress/apply_font_text_spec.js more reliable

integration_tests/mobile/calc/annotation_spec.js
cy:command ✔ cGet #toolbar-up #comment_wizard
cy:command ✔ assert expected **<div#comment_wizard.unotoolbutton.jsdialog.ui-content.unospan.comment_wizard.no-label>** not to have class **disabled**
cy:command ✔ cGet #toolbar-up #comment_wizard button
cy:command ✔ click
cy:command ✔ cGet #toolbar-up #comment_wizard
cy:command ✔ assert expected **<div#comment_wizard.unotoolbutton.jsdialog.ui-content.unospan.comment_wizard.no-label.selected>** to have class **selected**
cy:log ✱ << openCommentWizard - end
cy:command ✔ cGet #mobile-wizard-content
cy:command ✔ assert expected **<div#mobile-wizard-content.portrait>** to exist in the DOM
cy:command ✔ cGet #annotation-content-area-1
cy:command ✘ assert expected **#annotation-content-area-1** to have text **some text**, but the text was **''**

Timed out retrying after 10000ms: Expected to find element: `#annotation-content-area-1`, but never found it.

/home/caolan/LibreOffice/collabora-online/cypress_test/integration_tests/mobile/calc/annotation_spec.js:19:47
17 | mobileHelper.openCommentWizard();
18 | cy.cGet('#mobile-wizard-content').should('exist');
> 19 | cy.cGet('#annotation-content-area-1').should('have.text', 'some text');
| ^
20 | cy.cGet('#comment-container-1').should('exist');
21 | });
22 | it('Modifying comm ...

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Ib26c0d2d2aaf94a34f041ae82eb99edec9cddeca

diff --git a/cypress_test/integration_tests/common/impress_helper.js b/cypress_test/integration_tests/common/impress_helper.js
index b7709dc025..b8ffa7bab6 100644
--- a/cypress_test/integration_tests/common/impress_helper.js
+++ b/cypress_test/integration_tests/common/impress_helper.js
@@ -126,10 +126,19 @@ function removeShapeSelection() {
var XPos = items[0].getBoundingClientRect().left + 10;
var YPos = items[0].getBoundingClientRect().top + 10;
cy.cGet('body').click(XPos, YPos);
- cy.cGet('body').type('{esc}');
- cy.cGet('body').type('{esc}');
});

+ // The click triggers MouseControl.onClick which calls focus(false),
+ // blurring the textarea on mobile. Re-focus depends on INCOMING
+ // invalidatecursor from core. processToIdle ensures that message
+ // has been received before we send the Esc keys.
+ cy.getFrameWindow().then(function(win) {
+ helper.processToIdle(win);
+ });
+
+ cy.cGet('body').type('{esc}');
+ cy.cGet('body').type('{esc}');
+
cy.cGet('#document-container')
.should(function(overlay) {
expect(overlay.children('svg').length).to.equal(0);

"Caolán McNamara (via github)"

unread,
Feb 10, 2026, 5:32:59 AMFeb 10
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/mobile_helper.js | 5 +++++
1 file changed, 5 insertions(+)

New commits:
commit e80d06c42eae49be12ed8d314a02b9aa5380b46f
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Sun Feb 8 23:30:24 2026 +0000
Commit: Miklos Vajna <vmi...@collabora.com>
CommitDate: Tue Feb 10 11:32:01 2026 +0100

Ensure comments have been loaded from the server before opening wizard

(speculative)

cy:command ✔ cGet #toolbar-up #comment_wizard
cy:command ✔ assert expected **<div#comment_wizard.unotoolbutton.jsdialog.ui-content.unospan.comment_wizard.no-label>** not to have class **disabled**
cy:command ✔ cGet #toolbar-up #comment_wizard button
cy:command ✔ click
cy:command ✔ cGet #toolbar-up #comment_wizard
cy:command ✔ assert expected **<div#comment_wizard.unotoolbutton.jsdialog.ui-content.unospan.comment_wizard.no-label.selected>** to have class **selected**
cy:log ✱ << openCommentWizard - end
cy:command ✔ cGet #mobile-wizard-content
cy:command ✔ assert expected **<div#mobile-wizard-content.portrait>** to exist in the DOM
cy:command ✔ cGet #annotation-content-area-1
cy:command ✘ assert expected **#annotation-content-area-1** to have text **some text**, but the text was **''**
cons:log ✱ ==== debug.html receiveMessage: {"MessageId":"Doc_ModifiedStatus","SendTime":1770585959666,"Values":{"Modified":false}}
cy:command ✔ fail:
Test failed: integration_tests/mobile/calc/annotation_spec.js / Annotation Tests / Saving comment.

Timed out retrying after 10000ms: Expected to find element: `#annotation-content-area-1`, but never found it. Queried from:

> cy.get(#coolframe, [object Object]).its(0.contentDocument, [object Object])

/home/caolan/LibreOffice/collabora-online/cypress_test/integration_tests/mobile/calc/annotation_spec.js:19:47
17 | mobileHelper.openCommentWizard();
18 | cy.cGet('#mobile-wizard-content').should('exist');
> 19 | cy.cGet('#annotation-content-area-1').should('have.text', 'some text');
| ^
20 | cy.cGet('#comment-container-1').should('exist');
21 | });
22 | it('Modifying comm ...
cy:log ✱ Finishing test: integration_tests/mobile/calc/annotation_spec.js / Annotation Tests / Saving comment.

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Ib008ef292275ec78bcf91fcc0af12b91203388ec

diff --git a/cypress_test/integration_tests/common/mobile_helper.js b/cypress_test/integration_tests/common/mobile_helper.js
index 39fe04efc2..c73c65438a 100644
--- a/cypress_test/integration_tests/common/mobile_helper.js
+++ b/cypress_test/integration_tests/common/mobile_helper.js
@@ -30,6 +30,11 @@ function enableEditingMobile() {
.should('be.visible');
});

+ // Wait until core has processed outstanding input and has returned to idle.
+ cy.getFrameWindow().then((win) => {
+ helper.processToIdle(win);
+ });
+
cy.log('<< enableEditingMobile - end');
}


"Caolán McNamara (via github)"

unread,
Feb 10, 2026, 7:43:10 AMFeb 10
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/writer_helper.js | 4 +
cypress_test/integration_tests/desktop/writer/file_properties_spec.js | 28 ++++++----
2 files changed, 21 insertions(+), 11 deletions(-)

New commits:
commit a65e528d60da9494e04507a04d80c81cb34a04bd
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Mon Feb 9 19:47:09 2026 +0000
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Tue Feb 10 18:12:38 2026 +0530

make desktop/writer/file_properties_spec.js more reliable

cy: command ✔ wait 1000
cy:log ✱ >> openFileProperties - start
cy: command ✔ cGet .jsdialog-window
cy: command ✔ assert expected **.jsdialog-window** not to exist in the DOM
cy: command ✔ cGet #File-tab-label
cy: command ✔ cGet #File-container .unoSetDocumentProperties
cy: command ✔ click
cy: command ✔ cGet .jsdialog-window
cy: command ✔ assert expected **<div#4.jsdialog-window.fadein>** to exist in the DOM
cy:log ✱ << openFileProperties - end
cy: command ✔ cGet #tabcontrol-2
cy: command ✔ click
cy: command ✔ cGet #title-input.ui-edit
cy: command ✘ assert expected **<input#title-input.ui-edit.jsdialog>** to be **visible**
cy: command ✔ fail:
Timed out retrying after 10000ms: expected '<input#title-input.ui-edit.jsdialog>' to be 'visible'
This element `<input#title-input.ui-edit.jsdialog>` is not visible because its parent `<div#title.ui-edit-container.jsdialog.ui-grid-cell>` has CSS property: `visibility: hidden`
/home/collabora/jenkins/workspace/github_online_master_debug_vs_co-25.04_cypress_desktop/cypress_test/integration_tests/desktop/writer/file_properties_spec.js:19:41
17 | writerHelper.openFileProperties();
18 | cy.cGet('#tabcontrol-2').click();
> 19 | cy.cGet('#title-input.ui-edit').should('be.visible');
| ^
20 | ...
cy:log ✱ Finishing test: integration_tests/desktop/writer/file_properties_spec.js / File Property Tests / Add File Description.
cy: command ✔ getFrameWindow #coolframe
Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I7a0d3fb6174da4bfe1e9f1995a20ca296c06c03f

diff --git a/cypress_test/integration_tests/common/writer_helper.js b/cypress_test/integration_tests/common/writer_helper.js
index de5f01db93..8b1cee8470 100644
--- a/cypress_test/integration_tests/common/writer_helper.js
+++ b/cypress_test/integration_tests/common/writer_helper.js
@@ -22,7 +22,7 @@ function selectAllTextOfDoc() {
cy.log('<< selectAllTextOfDoc - end');
}

-function openFileProperties() {
+function openFileProperties(win) {
cy.log('>> openFileProperties - start');

cy.cGet('.jsdialog-window').should('not.exist');
@@ -34,6 +34,8 @@ function openFileProperties() {
cy.cGet('#File-container .unoSetDocumentProperties').click();
});

+ helper.processToIdle(win);
+
cy.cGet('.jsdialog-window').should('exist');

cy.log('<< openFileProperties - end');
diff --git a/cypress_test/integration_tests/desktop/writer/file_properties_spec.js b/cypress_test/integration_tests/desktop/writer/file_properties_spec.js
index 10ff7fb7a3..23cc277fda 100644
--- a/cypress_test/integration_tests/desktop/writer/file_properties_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/file_properties_spec.js
@@ -17,9 +17,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'File Property Tests', func
});

it('Add File Description.', function() {
- cy.wait(1000);
-
- writerHelper.openFileProperties();
+ writerHelper.openFileProperties(this.win);

cy.cGet('#tabcontrol-2').click();

@@ -29,9 +27,10 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'File Property Tests', func

cy.cGet('#ok.ui-pushbutton-wrapper').click();

- writerHelper.openFileProperties();
+ writerHelper.openFileProperties(this.win);

cy.cGet('#tabcontrol-2').click();
+
cy.cGet('#title-input.ui-edit').should('have.value', 'New Title');
cy.cGet('#comments.ui-textarea').should('have.value', 'New');

@@ -39,7 +38,8 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'File Property Tests', func
});

it('Add Custom Property.', function() {
- writerHelper.openFileProperties();
+ writerHelper.openFileProperties(this.win);
+
cy.cGet('#tabcontrol-3').click();

// Add property
@@ -50,8 +50,10 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'File Property Tests', func
cy.cGet('#ok.ui-pushbutton-wrapper button').click();

// Check property saved
- writerHelper.openFileProperties();
+ writerHelper.openFileProperties(this.win);
+
cy.cGet('#tabcontrol-3').click();
+
cy.cGet('#valueedit-input').should('have.value', '123 Address');
cy.cGet('#namebox-input-dialog').should('have.value', 'Mailstop');

@@ -59,7 +61,8 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'File Property Tests', func
});

it('Add Custom Duration Property.', function() {
- writerHelper.openFileProperties();
+ writerHelper.openFileProperties(this.win);
+
cy.cGet('#tabcontrol-3').click();

// Add property
@@ -78,15 +81,18 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'File Property Tests', func
cy.cGet('#ok.ui-pushbutton-wrapper button').click();

// Check property saved
- writerHelper.openFileProperties();
+ writerHelper.openFileProperties(this.win);
+
cy.cGet('#tabcontrol-3').click();
+
cy.cGet('#duration-input').should('have.value', '- Y: 1 M: 0 D: 2 H: 0 M: 0 S: 3');
cy.cGet('#namebox-input-dialog').should('have.value', 'Received from');
cy.cGet('#cancel.ui-pushbutton-wrapper button').click();
});

it('Add Custom Yes/No Property.', function() {
- writerHelper.openFileProperties();
+ writerHelper.openFileProperties(this.win);
+
cy.cGet('#tabcontrol-3').click();

// Add property
@@ -97,8 +103,10 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'File Property Tests', func
cy.cGet('#ok.ui-pushbutton-wrapper button').click();

// Check property saved
- writerHelper.openFileProperties();
+ writerHelper.openFileProperties(this.win);
+
cy.cGet('#tabcontrol-3').click();
+
cy.cGet('#yes-input').should('be.checked');
cy.cGet('#namebox-input-dialog').should('have.value', 'Telephone number');
cy.cGet('#cancel.ui-pushbutton-wrapper button').click();

"Caolán McNamara (via github)"

unread,
Feb 10, 2026, 8:56:31 AMFeb 10
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/stylebar_spec.js | 1 +
1 file changed, 1 insertion(+)

New commits:
commit cc19cfe08d21e364bf851d4a1ede6453e88fe79d
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Mon Feb 9 20:47:05 2026 +0000
Commit: Miklos Vajna <vmi...@collabora.com>
CommitDate: Tue Feb 10 14:55:55 2026 +0100

make an effort to stabilize desktop/writer/stylebar_spec.js

cy: command ✔ click
cy: command ✔ cGet #StyleListDeck
cy: command ✔ assert expected **<div#StyleListDeck.deck.jsdialog.sidebar>** to exist in the DOM
cy: command ✔ assert expected **<div#StyleListDeck.deck.jsdialog.sidebar>** to be **visible**
cy: command ✔ cGet #treeview .ui-treeview-cell-text [textContent="Complimentary Close"], #treeview img.ui-treeview-custom-render[alt="Complimentary Close"], {timeout: 20000}
cy: command ✔ assert expected **<img.ui-treeview-custom-render>** to exist in the DOM
cy: command ✔ scrollIntoView
cy: command ✔ viewport 1000, 660
cy: command ✔ cGet #treeview img.ui-treeview-custom-render[alt="Complimentary Close"], {timeout: 20000}
cy: command ✔ assert expected **<img.ui-treeview-custom-render>** to exist in the DOM
cy: command ✔ getFrameWindow #coolframe
cy: command ✔ cGet #treeview img.ui-treeview-custom-render[alt="Complimentary Close"], {timeout: 20000}
cy: command ✔ assert expected **<img.ui-treeview-custom-render>** to exist in the DOM
cy: command ✘ click
cy: command ✔ fail:
Timed out retrying after 10050ms: `cy.click()` failed because the page updated while this command was executing. Cypress tried to locate elements based on this query:
> <img.ui-treeview-custom-render>
We initially found matching element(s), but while waiting for them to become actionable, they disappeared from the page. Common situations why this happens:
- Your JS framework re-rendered asynchronously
- Your app code reacted to an event firing and removed the element
You can typically solve this by breaking up a chain. For example, rewrite:
> `cy.get('button').click().click()`
to
> `cy.get('button').as('btn').click()`
> `cy.get('@btn').click ...
Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Ibded9d701e5afc6b5e88c083e6717bd4fefbd4bb

diff --git a/cypress_test/integration_tests/desktop/writer/stylebar_spec.js b/cypress_test/integration_tests/desktop/writer/stylebar_spec.js
index d65fb9aa8f..260933d8bd 100644
--- a/cypress_test/integration_tests/desktop/writer/stylebar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/stylebar_spec.js
@@ -27,6 +27,7 @@ describe(['tagdesktop'], 'Test style sidebar', function() {

cy.getFrameWindow().then((win) => {
this.win = win;
+ helper.processToIdle(win);
});
});


"Caolán McNamara (via github)"

unread,
Feb 11, 2026, 12:13:37 PMFeb 11
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js | 3 +++
cypress_test/integration_tests/mobile/writer/delete_objects_spec.js | 3 +++
2 files changed, 6 insertions(+)

New commits:
commit 1f4759b0474624475cd7eb5d3c583c768310d396
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Wed Feb 11 15:17:49 2026 +0000
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Wed Feb 11 17:13:16 2026 +0000

fix chart tests

after core change: https://gerrit.libreoffice.org/c/core/+/199066/2

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I7682c2905feb6fd8682d45f5e8b49c7d882c7dda

diff --git a/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js b/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
index 618eb4aedd..a7595c6a43 100644
--- a/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
@@ -339,6 +339,9 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {

cy.cGet('#test-div-shapeHandlesSection').should('exist');

+ // exit active object mode
+ helper.typeIntoDocument('{esc}');
+
//delete
helper.typeIntoDocument('{del}');

diff --git a/cypress_test/integration_tests/mobile/writer/delete_objects_spec.js b/cypress_test/integration_tests/mobile/writer/delete_objects_spec.js
index ecb76475cb..bef8155c10 100644
--- a/cypress_test/integration_tests/mobile/writer/delete_objects_spec.js
+++ b/cypress_test/integration_tests/mobile/writer/delete_objects_spec.js
@@ -106,6 +106,9 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Delete Objects', function()
cy.cGet('body').contains('.menu-entry-with-icon', 'Chart...').click();
cy.cGet('#test-div-shapeHandlesSection').should('exist');

+ // exit active object mode
+ helper.typeIntoDocument('{esc}');
+
cy.cGet('#document-container').then(function(item) {
const boundingRectangle = item[0].getBoundingClientRect();
const x = boundingRectangle.left + boundingRectangle.width / 2;

"Caolán McNamara (via github)"

unread,
Feb 12, 2026, 3:30:19 AMFeb 12
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/find_helper.js | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)

New commits:
commit 537ef0d6ad61a1a6fe89815ce7295ad450a06d9c
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Wed Feb 11 21:34:11 2026 +0000
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Thu Feb 12 14:00:08 2026 +0530

improve desktop/calc/find_dialog_spec.js stability

Wait for the actual button element to be enabled, not just the wrapper
div. Plausible that SynchronizeDisabledState defers the button's
disabled attribute removal via a layouting task.

remove searchall[-button] test, doesn't exist in impress and isn't used here
anyway.

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I9951232f43cc342691a755e74e5d28e9ea5705f4

diff --git a/cypress_test/integration_tests/common/find_helper.js b/cypress_test/integration_tests/common/find_helper.js
index 9018658ea0..82348d30be 100644
--- a/cypress_test/integration_tests/common/find_helper.js
+++ b/cypress_test/integration_tests/common/find_helper.js
@@ -37,9 +37,8 @@ function typeIntoSearchField(text) {
cy.cGet('input#searchterm-input-dialog').type('{selectall}{backspace}' + text);
cy.cGet('input#searchterm-input-dialog').should('have.prop', 'value', text);

- cy.cGet('#search').should('not.be.disabled');
- cy.cGet('#searchall').should('not.be.disabled'); //doesnt seem to exist in impress
- cy.cGet('#backsearch').should('not.be.disabled');
+ cy.cGet('#search-button').should('not.have.attr', 'disabled');
+ cy.cGet('#backsearch-button').should('not.have.attr', 'disabled');

cy.log('<< typeIntoSearchField - end');
}
@@ -48,8 +47,8 @@ function typeIntoSearchField(text) {
function findNext() {
cy.log('>> findNext - start');

- cy.cGet('#search').should('not.have.attr', 'disabled');
- cy.cGet('#search').click();
+ cy.cGet('#search-button').should('not.have.attr', 'disabled');
+ cy.cGet('#search-button').click();

cy.log('<< findNext - end');
}
@@ -58,8 +57,8 @@ function findNext() {
function findPrev() {
cy.log('>> findPrev - start');

- cy.cGet('#backsearch').should('not.have.attr', 'disabled');
- cy.cGet('#backsearch').click();
+ cy.cGet('#backsearch-button').should('not.have.attr', 'disabled');
+ cy.cGet('#backsearch-button').click();

cy.log('<< findPrev - end');
}

"Caolán McNamara (via github)"

unread,
Feb 12, 2026, 12:19:19 PMFeb 12
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/calc_helper.js | 5 +++++
1 file changed, 5 insertions(+)

New commits:
commit d234d337a0a4bbb2f656978b04ac02926003a605
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Thu Feb 12 14:29:43 2026 +0000
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Thu Feb 12 17:18:36 2026 +0000

try processToIdle before clickOnFirstCell

speculative

cy:command ✔ cGet #canvas-container
cy:command ✔ assert expected **<div#canvas-container.leaflet-canvas-container>** to have property **length**
cy:command ✔ assert expected **<div#canvas-container.leaflet-canvas-container>** to have a length of **1**
cy:command ✔ cGet body
cy:command ✔ click 60, 188
cy:command ✔ cGet #test-div-OwnCellCursor
cy:command ✔ assert expected **<div#test-div-OwnCellCursor>** to exist in the DOM
cy:command ✔ getFrameWindow #coolframe
cy:log ✱ >> assertAddressAfterIdle - start
cy:log ✱ Param - expectedAddress: A1
cy:command ✔ wrap null
cy:command ✔ assert .uno:ReportWhenIdle result with idleID 9: expected **{ Object (proxy, thisValue, ...) }** to be an object
cy:command ✔ cGet #addressInput input
cy:command ✘ assert expected **<input#pos_window-input-address.ui-combobox-content.addressInput.jsdialog>** to have value **A1**, but the value was **B2**
cy:command ✔ fail:
Timed out retrying after 10000ms: expected '<input#pos_window-input-address.ui-combobox-content.addressInput.jsdialog>' to have value 'A1', but the value was 'B2'
/home/collabora/jenkins/workspace/github_online_master_debug_vs_co-25.04_cypress_desktop/cypress_test/integration_tests/common/calc_helper.js:295:42
293 | cy.log('Param - expectedAddress: ' + expectedAddress);
294 | helper.processToIdle(win);
> 295 | cy.cGet(helper.addressInputSelector).should('have.value', expectedAddress);
| ^
296 | cy.log('<< assertAddressAfterIdle - end');
297 | }
298 | module.exports.clickAtOffset = clickAtOffs ...
cy:log ✱ Finishing test: integration_tests/desktop/calc/row_column_operation_spec.js / Row Column Operation / Insert/Delete Column

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Id7602d58e899bbf175346482fcd7e4dd10cbdb0e

diff --git a/cypress_test/integration_tests/common/calc_helper.js b/cypress_test/integration_tests/common/calc_helper.js
index 597d9e779a..4be0c54688 100644
--- a/cypress_test/integration_tests/common/calc_helper.js
+++ b/cypress_test/integration_tests/common/calc_helper.js
@@ -53,6 +53,11 @@ function clickOnFirstCell(firstClick = true, dblClick = false, expectedCell = 'A
cy.log('Param - dblClick: ' + dblClick);
cy.log('Param - expectedCell: ' + expectedCell);

+ // Flush any pending layouting tasks before clicking
+ cy.getFrameWindow().then(function(win) {
+ helper.processToIdle(win);
+ });
+
// Use the tile's edge to find the first cell's position
cy.cGet('#canvas-container').then(function(items) {
expect(items).to.have.lengthOf(1);

"Mohit Marathe (via github)"

unread,
Feb 13, 2026, 3:27:53 AMFeb 13
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js | 1 +
1 file changed, 1 insertion(+)

New commits:
commit 0f1a3aeb1d7dd7d18f063e366e429f7889f542c3
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Fri Feb 13 11:53:42 2026 +0530
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Fri Feb 13 08:27:22 2026 +0000

cypress: fix Insert/delete chart test in writer/top_toolbar_spec

apparently {esc} needs to be pressed twice to exit active object mode

Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Change-Id: I36867b9941e98fab94d936e52f1c874fc845d611

diff --git a/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js b/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
index a7595c6a43..7d4b4157c5 100644
--- a/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
@@ -341,6 +341,7 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {

// exit active object mode
helper.typeIntoDocument('{esc}');
+ helper.typeIntoDocument('{esc}');

//delete
helper.typeIntoDocument('{del}');

"Mohit Marathe (via github)"

unread,
Feb 20, 2026, 3:29:19 AMFeb 20
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js | 29 +++++-----
1 file changed, 16 insertions(+), 13 deletions(-)

New commits:
commit 9b086b113eef0866501a04e2d4f5727c50e9e0cf
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Fri Feb 20 11:05:54 2026 +0530
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Fri Feb 20 08:28:30 2026 +0000

cypress: use processToIdle instead of hardcoded waits

also remove {force: true} from cy.click()

Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Change-Id: I4552d53ddb5a7cdfbb5fa31b7e259e58b4f42380

diff --git a/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js b/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
index 7d4b4157c5..d781b389e3 100644
--- a/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
@@ -15,6 +15,9 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {
if (Cypress.env('INTEGRATION') === 'nextcloud') {
desktopHelper.showSidebar();
}
+ cy.getFrameWindow().then((win) => {
+ this.win = win;
+ })

writerHelper.selectAllTextOfDoc();
});
@@ -270,7 +273,7 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {

writerHelper.selectAllTextOfDoc();
helper.copy();
- cy.wait(1000);
+ helper.processToIdle(this.win);
helper.expectTextForClipboard('text text1link');
cy.cGet('#copy-paste-container p a').should('have.attr', 'href', 'http://www.something.com/');
});
@@ -292,7 +295,7 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {

writerHelper.selectAllTextOfDoc();
helper.copy();
- cy.wait(1000);
+ helper.processToIdle(this.win);
helper.expectTextForClipboard('text text1');
cy.cGet('#copy-paste-container p a').should('have.attr', 'href', 'mailto:john...@test.abc?subject=planning-meeting');
});
@@ -302,7 +305,7 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {
cy.cGet('#Insert-container .unoBasicShapes button').click();
cy.cGet('.col.w2ui-icon.basicshapes_octagon').click();
cy.cGet('#document-container svg g').should('exist');
- cy.wait(1000);
+ helper.processToIdle(this.win);

cy.cGet('#Insert-tab-label').click();
cy.cGet('#Insert-container .hyperlinkdialog button').click();
@@ -355,17 +358,17 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {
helper.reloadDocument(newFilePath);
helper.setDummyClipboardForCopy();
writerHelper.selectAllTextOfDoc();
- cy.wait(1000);
+ // document was reloaded, fetch the frame window again
+ cy.getFrameWindow().then((win) => {
+ helper.processToIdle(win);
+ })
helper.copy();
cy.cGet('#copy-paste-container p b').should('exist');
});

it('Print', function() {
// A new window should be opened with the PDF.
- cy.getFrameWindow()
- .then(function(win) {
- cy.stub(win, 'open').as('windowOpen');
- });
+ cy.stub(this.win, 'open').as('windowOpen');

cy.cGet('#File-tab-label').click();
cy.cGet('#File-container .unoPrint button').click();
@@ -378,14 +381,14 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {
//Do
desktopHelper.getNbIcon('Italic').click();
helper.copy();
- cy.wait(500); // wait for new clipboard
+ helper.processToIdle(this.win); // wait for new clipboard
cy.cGet('#copy-paste-container p i').should('exist');

//Undo
cy.cGet('#Home-container .unoUndo').should('not.have.attr','disabled');
- cy.cGet('#Home-container .unoUndo button').click({force: true});
+ cy.cGet('#Home-container .unoUndo button').click();
helper.copy();
- cy.wait(500); // wait for new clipboard
+ helper.processToIdle(this.win); // wait for new clipboard
cy.cGet('#copy-paste-container p i').should('not.exist');

// Dismiss tooltip
@@ -395,9 +398,9 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {

//Redo
cy.cGet('#Home-container .unoRedo').should('not.have.attr','disabled');
- cy.cGet('#Home-container .unoRedo button').click({force: true});
+ cy.cGet('#Home-container .unoRedo button').click();
helper.copy();
- cy.wait(500); // wait for new clipboard
+ helper.processToIdle(this.win); // wait for new clipboard
cy.cGet('#copy-paste-container p i').should('exist');
});


"Mohit Marathe (via github)"

unread,
Feb 20, 2026, 3:43:40 AMFeb 20
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/a11y_helper.js | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)

New commits:
commit 29573e40f015107fa88b7b79c110cf6a3b4a1670
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Fri Feb 20 11:12:21 2026 +0530
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Fri Feb 20 08:43:11 2026 +0000

cypress: use the existing spy if it was not restored

similar to waitUntilCoreIsIdle() in helper.js

Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Change-Id: I057a922babe43dae2f16c520bc7202d6b11f30f1

diff --git a/cypress_test/integration_tests/common/a11y_helper.js b/cypress_test/integration_tests/common/a11y_helper.js
index 15d381f398..e36f3cee9e 100644
--- a/cypress_test/integration_tests/common/a11y_helper.js
+++ b/cypress_test/integration_tests/common/a11y_helper.js
@@ -23,7 +23,12 @@ function enableUICoverage(win) {
* @param {boolean} hasLinguisticData - Whether linguistic data (thesaurus, etc.) is available
*/
function reportUICoverage(win, hasLinguisticData = true) {
- cy.spy(win.app.socket, '_onMessage').as('onMessage').log(false);
+ if (win.app.socket._onMessage.restore) {
+ // if _onMessage is already wrapped by Sinon, do not create a new spy
+ cy.wrap(win.app.socket._onMessage).as('onMessage');
+ } else {
+ cy.spy(win.app.socket, '_onMessage').as('onMessage').log(false);
+ }

cy.then(() => {
const endUICoverage = {

"Caolán McNamara (via github)"

unread,
Feb 23, 2026, 11:31:59 AMFeb 23
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/impress/undo_redo_spec.js | 21 +++++++---
1 file changed, 15 insertions(+), 6 deletions(-)

New commits:
commit bcf755293607ad5e33a978c29070ff2ef0cae803
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Fri Feb 20 20:44:22 2026 +0000
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Mon Feb 23 16:31:07 2026 +0000

replace impress undo waits

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Ieb1b1eb5d584553665e759fbb01360be560cd356

diff --git a/cypress_test/integration_tests/desktop/impress/undo_redo_spec.js b/cypress_test/integration_tests/desktop/impress/undo_redo_spec.js
index ad74620130..60b85ff751 100644
--- a/cypress_test/integration_tests/desktop/impress/undo_redo_spec.js
+++ b/cypress_test/integration_tests/desktop/impress/undo_redo_spec.js
@@ -35,13 +35,22 @@ describe(['tagdesktop'], 'Editing Operations', function() {
desktopHelper.closeNavigatorSidebar();
desktopHelper.selectZoomLevel('30', false);

+ cy.getFrameWindow().then((win) => {
+ this.win = win;
+ helper.processToIdle(win);
+ });
+
impressHelper.selectTextShapeInTheCenter();
- cy.wait(500); // Wait a little for server response.
+
+ cy.getFrameWindow().then(function(win) {
+ helper.processToIdle(win);
+ });
+
impressHelper.dblclickOnSelectedShape();
});

- function undo() {
- cy.wait(500); // Same, wait for server response.
+ function undo(win) {
+ helper.processToIdle(win);
helper.typeIntoDocument('Hello World');
expectTypedText();
helper.typeIntoDocument('{ctrl+z}');
@@ -50,14 +59,14 @@ describe(['tagdesktop'], 'Editing Operations', function() {

it('Undo', function() {
helper.setDummyClipboardForCopy();
- undo();
+ undo(this.win);
});

it('Redo', function() {
helper.setDummyClipboardForCopy();
- undo();
+ undo(this.win);
helper.typeIntoDocument('{ctrl+y}');
- cy.wait(500); // Wait a little for server response.
+ helper.processToIdle(this.win);
expectTypedText();
});


"Mohit Marathe (via github)"

unread,
Feb 25, 2026, 8:00:43 AMFeb 25
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js | 12 +++----
cypress_test/integration_tests/desktop/calc/a11y_notebookbar_spec.js | 6 +--
cypress_test/integration_tests/desktop/calc/cell_cursor_spec.js | 2 -
cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js | 2 -
cypress_test/integration_tests/desktop/calc/formula_dialog_spec.js | 2 -
cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js | 16 +++++-----
cypress_test/integration_tests/desktop/writer/a11y_sidebar_spec.js | 4 +-
cypress_test/integration_tests/desktop/writer/file_properties_spec.js | 8 ++---
cypress_test/integration_tests/desktop/writer/jsdialog_widgets_spec.js | 14 ++++----
cypress_test/integration_tests/desktop/writer/presets_spec.js | 4 +-
cypress_test/integration_tests/desktop/writer/replace_dialog_spec.js | 6 +--
cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js | 2 -
cypress_test/integration_tests/desktop/writer/track_changes_spec.js | 4 +-
13 files changed, 41 insertions(+), 41 deletions(-)

New commits:
commit 8505f493923e3deaf715cb78e898285a7930b9b8
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Wed Feb 25 09:50:18 2026 +0530
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Wed Feb 25 12:59:53 2026 +0000

cypress: skip some failing tests while port to 26.04 is in progress

Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Change-Id: I127ac8386a52e08d45e0e36895aebf34c467eff6

diff --git a/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js b/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js
index f11b0df216..420cf9861b 100644
--- a/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js
@@ -35,11 +35,11 @@ const allCalcDialogs = [
'.uno:InsertCell',
'.uno:InsertObjectChart',
'.uno:InsertSparkline',
- '.uno:JumpToTable',
+ // '.uno:JumpToTable',
'.uno:Move?FromContextMenu:bool=true&MoveOrCopySheetDialog:bool=true&ContextMenuIndex=0',
'.uno:MovingAverageDialog',
'.uno:PageFormatDialog',
- '.uno:Protect',
+ // '.uno:Protect',
'.uno:RegressionDialog',
'.uno:RowHeight',
'.uno:SamplingDialog',
@@ -144,7 +144,7 @@ describe(['tagdesktop'], 'Accessibility Calc Dialog Tests', { testIsolation: fal
} else if (buggyCalcDialogs.includes(command)) {
it.skip(`Dialog ${command} (buggy)`, function () {});
} else {
- it(`Common Dialog ${command}`, function () {
+ it.skip(`Common Dialog ${command}`, function () {
if (!hasLinguisticData && a11yHelper.needsLinguisticData(command)) {
this._runnable.title += ' (skipped: missing linguistic data)';
this.skip();
@@ -165,7 +165,7 @@ describe(['tagdesktop'], 'Accessibility Calc Dialog Tests', { testIsolation: fal
}
});

- it('Graphic dialog', function () {
+ it.skip('Graphic dialog', function () {
cy.viewport(1920,1080);
helper.processToIdle(win);

@@ -189,7 +189,7 @@ describe(['tagdesktop'], 'Accessibility Calc Dialog Tests', { testIsolation: fal
desktopHelper.selectZoomLevel('100', false);
});

- it('Shape paragraph dialog', function () {
+ it.skip('Shape paragraph dialog', function () {
cy.then(() => {
win.app.map.sendUnoCommand('.uno:BasicShapes.octagon');
});
@@ -281,7 +281,7 @@ describe(['tagdesktop'], 'Accessibility Calc Dialog Tests', { testIsolation: fal
a11yHelper.handleDialog(win, 1, '', true);
});

- it('PDF export warning dialog', function () {
+ it.skip('PDF export warning dialog', function () {
a11yHelper.testPDFExportWarningDialog(win);
});
});
diff --git a/cypress_test/integration_tests/desktop/calc/a11y_notebookbar_spec.js b/cypress_test/integration_tests/desktop/calc/a11y_notebookbar_spec.js
index 54e3b45230..f0e87178a3 100644
--- a/cypress_test/integration_tests/desktop/calc/a11y_notebookbar_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/a11y_notebookbar_spec.js
@@ -55,7 +55,7 @@ describe(['tagdesktop'], 'Accessibility Calc Notebookbar Tests', { testIsolation
return tabs.find(function (t) { return t.name === name; });
}

- it('Notebookbar tab: Shape (context)', function () {
+ it.skip('Notebookbar tab: Shape (context)', function () {
cy.then(function () {
win.app.map.sendUnoCommand('.uno:BasicShapes.octagon');
});
@@ -70,7 +70,7 @@ describe(['tagdesktop'], 'Accessibility Calc Notebookbar Tests', { testIsolation
helper.typeIntoDocument('{esc}');
});

- it('Notebookbar tab: Picture (context)', function () {
+ it.skip('Notebookbar tab: Picture (context)', function () {
cy.viewport(1920, 1080);

desktopHelper.insertImage();
@@ -86,7 +86,7 @@ describe(['tagdesktop'], 'Accessibility Calc Notebookbar Tests', { testIsolation
// TODO: Add a Sparkline to test document after merge of outstanding pr
// TODO: Table context is for "Table in Table" feature, not available in .ods format

- it('All non-context notebookbar tabs', function () {
+ it.skip('All non-context notebookbar tabs', function () {
cy.then(function () {
var nonContextTabs = tabs.filter(function (tab) {
return !tab.context || tab.context.includes('default');
diff --git a/cypress_test/integration_tests/desktop/calc/cell_cursor_spec.js b/cypress_test/integration_tests/desktop/calc/cell_cursor_spec.js
index fa6fec66ad..086c69f63c 100644
--- a/cypress_test/integration_tests/desktop/calc/cell_cursor_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/cell_cursor_spec.js
@@ -246,7 +246,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Test triple click content
});
});

- it('Triple click should select the cell content.', function() {
+ it.skip('Triple click should select the cell content.', function() {
calcHelper.enterCellAddressAndConfirm(this.win, 'A1');

// Triple click on second first in second row
diff --git a/cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js b/cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js
index 9470ba7805..868ad677bf 100644
--- a/cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js
@@ -55,7 +55,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Chart dialog tests', funct
* some css property.
* `reasonableWidth` = width at the time of writing this test + 15px ;)
*/
- it('Chart Wizard width', function() {
+ it.skip('Chart Wizard width', function() {
cy.cGet('#Insert-tab-label').click();
desktopHelper.getNbIcon('InsertObjectChart', 'Insert').click();

diff --git a/cypress_test/integration_tests/desktop/calc/formula_dialog_spec.js b/cypress_test/integration_tests/desktop/calc/formula_dialog_spec.js
index b797123312..e732f5b9d3 100644
--- a/cypress_test/integration_tests/desktop/calc/formula_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/formula_dialog_spec.js
@@ -12,7 +12,7 @@ describe(['tagdesktop'], 'Formula dialog tests', function() {
});
});

- it('Formula dialog visual regression test', function() {
+ it.skip('Formula dialog visual regression test', function() {
cy.wait(1000);

cy.cGet('.unoFunctionDialog.formulabar').click();
diff --git a/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js b/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
index 2010319870..e404945a02 100644
--- a/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
@@ -193,7 +193,7 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f
// silently skip the common dialogs that writer doesn't have
return;
} else {
- it(`Common Dialog ${command}`, function () {
+ it.skip(`Common Dialog ${command}`, function () {
if (!hasLinguisticData && a11yHelper.needsLinguisticData(command)) {
this._runnable.title += ' (skipped: missing linguistic data)';
this.skip();
@@ -203,7 +203,7 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f
}
});

- it('Transform dialog', function () {
+ it.skip('Transform dialog', function () {
cy.then(() => {
win.app.map.sendUnoCommand('.uno:BasicShapes.octagon');
});
@@ -224,7 +224,7 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f
helper.typeIntoDocument('{esc}');
});

- it('Line dialog', function () {
+ it.skip('Line dialog', function () {
cy.then(() => {
win.app.map.sendUnoCommand('.uno:Line');
});
@@ -254,7 +254,7 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f

allWriterDialogs.forEach(function (commandSpec) {
const command = typeof commandSpec === 'string' ? commandSpec : commandSpec.command;
- it(`Writer Dialog ${command}`, function () {
+ it.skip(`Writer Dialog ${command}`, function () {
a11yHelper.testDialog(win, commandSpec);
});
});
@@ -282,7 +282,7 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f
a11yHelper.handleDialog(win, 1, '.uno:ContentControlProperties');
});

- it('Object dialog', function () {
+ it.skip('Object dialog', function () {
helper.clearAllText({ isTable: true });
cy.then(() => {
win.app.map.sendUnoCommand('.uno:InsertObjectChart');
@@ -328,7 +328,7 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f
cy.cGet('div.clipboard').should('have.focus');
});

- it('Graphic dialog', function () {
+ it.skip('Graphic dialog', function () {
helper.clearAllText();
desktopHelper.insertImage();
cy.then(() => {
@@ -361,11 +361,11 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f
});
});

- it('PDF export warning dialog', function () {
+ it.skip('PDF export warning dialog', function () {
a11yHelper.testPDFExportWarningDialog(win);
});

- it('ReadOnly info dialog', function () {
+ it.skip('ReadOnly info dialog', function () {
// Text ReadOnly info dialog
helper.clearAllText({ isTable: true });
helper.typeIntoDocument('READONLY');
diff --git a/cypress_test/integration_tests/desktop/writer/a11y_sidebar_spec.js b/cypress_test/integration_tests/desktop/writer/a11y_sidebar_spec.js
index e13061ddbd..ce88955b6f 100644
--- a/cypress_test/integration_tests/desktop/writer/a11y_sidebar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/a11y_sidebar_spec.js
@@ -56,7 +56,7 @@ describe(['tagdesktop'], 'Accessibility Writer Sidebar Tests', { testIsolation:
runA11yValidation(win);
});

- it('Chart (LinePropertyPanel)', function () {
+ it.skip('Chart (LinePropertyPanel)', function () {
helper.clearAllText({ isTable: true });
cy.then(() => {
win.app.map.sendUnoCommand('.uno:InsertObjectChart');
@@ -217,7 +217,7 @@ describe(['tagdesktop'], 'Accessibility Writer Sidebar Tests', { testIsolation:
});
});

- it('InspectorDeck', function() {
+ it.skip('InspectorDeck', function() {
cy.then(() => {
win.app.map.sendUnoCommand('.uno:SidebarDeck.InspectorDeck');
helper.processToIdle(win);
diff --git a/cypress_test/integration_tests/desktop/writer/file_properties_spec.js b/cypress_test/integration_tests/desktop/writer/file_properties_spec.js
index 23cc277fda..039186373b 100644
--- a/cypress_test/integration_tests/desktop/writer/file_properties_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/file_properties_spec.js
@@ -16,7 +16,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'File Property Tests', func
});
});

- it('Add File Description.', function() {
+ it.skip('Add File Description.', function() {
writerHelper.openFileProperties(this.win);

cy.cGet('#tabcontrol-2').click();
@@ -37,7 +37,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'File Property Tests', func
cy.cGet('#cancel.ui-pushbutton-wrapper button').click();
});

- it('Add Custom Property.', function() {
+ it.skip('Add Custom Property.', function() {
writerHelper.openFileProperties(this.win);

cy.cGet('#tabcontrol-3').click();
@@ -60,7 +60,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'File Property Tests', func
cy.cGet('#cancel.ui-pushbutton-wrapper').click();
});

- it('Add Custom Duration Property.', function() {
+ it.skip('Add Custom Duration Property.', function() {
writerHelper.openFileProperties(this.win);

cy.cGet('#tabcontrol-3').click();
@@ -90,7 +90,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'File Property Tests', func
cy.cGet('#cancel.ui-pushbutton-wrapper button').click();
});

- it('Add Custom Yes/No Property.', function() {
+ it.skip('Add Custom Yes/No Property.', function() {
writerHelper.openFileProperties(this.win);

cy.cGet('#tabcontrol-3').click();
diff --git a/cypress_test/integration_tests/desktop/writer/jsdialog_widgets_spec.js b/cypress_test/integration_tests/desktop/writer/jsdialog_widgets_spec.js
index 3c827c82e3..9aa7307f01 100644
--- a/cypress_test/integration_tests/desktop/writer/jsdialog_widgets_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/jsdialog_widgets_spec.js
@@ -23,35 +23,35 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'JSDialog widgets visual te
});
});

- it('Combobox', function() {
+ it.skip('Combobox', function() {
cy.cGet('#combo_box_enable').compareSnapshot('combobox_enable', 0.1);
cy.cGet('#combo_box_disable').compareSnapshot('combobox_disable', 0.1);
});

- it('Edit field', function() {
+ it.skip('Edit field', function() {
cy.cGet('#entry_box_1').compareSnapshot('edit_enabled', 0.1);
cy.cGet('#entry_box_2').compareSnapshot('edit_disabled', 0.1);
});

- it('Checkbox', function() {
+ it.skip('Checkbox', function() {
cy.cGet('#check_btn_1').compareSnapshot('checkbox_checked', 0.1);
cy.cGet('#check_btn_2').compareSnapshot('checkbox', 0.1);
cy.cGet('#check_btn_3').compareSnapshot('checkbox_disabled_checked', 0.1);
cy.cGet('#check_btn_4').compareSnapshot('checkbox_disabled', 0.1);
});

- it('Radio button', function() {
+ it.skip('Radio button', function() {
cy.cGet('#radio_btn_1').compareSnapshot('radio_checked', 0.1);
cy.cGet('#radio_btn_2').compareSnapshot('radio', 0.1);
cy.cGet('#radio_btn_3').compareSnapshot('radio_disabled_checked', 0.1);
cy.cGet('#radio_btn_4').compareSnapshot('radio_disabled', 0.1);
});

- it('Treelistbox no-headers', function() {
+ it.skip('Treelistbox no-headers', function() {
cy.cGet('#contenttree').compareSnapshot('treeview_no_headers', 0.05);
});

- it('Treelistbox focus', function() {
+ it.skip('Treelistbox focus', function() {
cy.cGet('#link_btn_2').click();
helper.assertFocus('id','link_btn_2');
// since no entry is selected the first entry should get focused
@@ -77,7 +77,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'JSDialog widgets visual te
cy.cGet('#contenttree').should('not.have.attr', 'tabindex');
});

- it('Treelistbox with-headers', function() {
+ it.skip('Treelistbox with-headers', function() {
cy.cGet('#contenttree2').compareSnapshot('treeview_headers', 0.12);

// use sort feature
diff --git a/cypress_test/integration_tests/desktop/writer/presets_spec.js b/cypress_test/integration_tests/desktop/writer/presets_spec.js
index 37f25c55d1..807c6254fb 100644
--- a/cypress_test/integration_tests/desktop/writer/presets_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/presets_spec.js
@@ -28,7 +28,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Preset tests.', function()
});

// Ensure that shared wordbook was installed.
- it('Verify shared wordbook install.', function() {
+ it.skip('Verify shared wordbook install.', function() {
// Add some text and check spelling
ceHelper.type('collaboraonline');

@@ -57,7 +57,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Preset tests.', function()
});

// Ensure that user wordbook was installed.
- it('Verify user wordbook install.', function() {
+ it.skip('Verify user wordbook install.', function() {
// Add some text and check spelling
ceHelper.type('sneha');

diff --git a/cypress_test/integration_tests/desktop/writer/replace_dialog_spec.js b/cypress_test/integration_tests/desktop/writer/replace_dialog_spec.js
index fbba185b5a..e008ff07c1 100644
--- a/cypress_test/integration_tests/desktop/writer/replace_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/replace_dialog_spec.js
@@ -11,7 +11,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Replace Dialog Tests', fun
});
});

- it('Ctrl H should open search dialog with replace tab active', function() {
+ it.skip('Ctrl H should open search dialog with replace tab active', function() {
helper.typeIntoDocument('{ctrl}h');
findHelper.waitForFindReplaceDialog(this.win);

@@ -23,7 +23,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Replace Dialog Tests', fun
cy.cGet('#FindReplaceDialog.jsdialog input#searchterm-input-dialog').should('be.focused');
});

- it('Replace button should open search dialog with replace tab active', function() {
+ it.skip('Replace button should open search dialog with replace tab active', function() {
cy.viewport(1920,1080);
// Click the Replace button from the notebookbar
cy.cGet('#Home-container [id^="home-search-dialog"] button:visible').click();
@@ -74,7 +74,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Replace Dialog Tests', fun
cy.cGet('#copy-paste-container p b').should('not.exist');
});

- it('Enter key in replace field triggers replace', function() {
+ it.skip('Enter key in replace field triggers replace', function() {
helper.setDummyClipboardForCopy();

//First make sure that we do not have 'replaced' text in current document
diff --git a/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js b/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
index 1af6b2a749..c0f9d0ed60 100644
--- a/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
@@ -278,7 +278,7 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {
cy.cGet('#copy-paste-container p a').should('have.attr', 'href', 'http://www.something.com/');
});

- it('Insert mail hyperlink.', function() {
+ it.skip('Insert mail hyperlink.', function() {
helper.setDummyClipboardForCopy();

cy.cGet('#Insert-tab-label').click();
diff --git a/cypress_test/integration_tests/desktop/writer/track_changes_spec.js b/cypress_test/integration_tests/desktop/writer/track_changes_spec.js
index 9320592bc7..4b0d092084 100644
--- a/cypress_test/integration_tests/desktop/writer/track_changes_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/track_changes_spec.js
@@ -127,7 +127,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Track Changes', function (
helper.expectTextForClipboard('Hello World');
});

- it('Compare documents', function () {
+ it.skip('Compare documents', function () {
// Given an ~empty (new) document:
desktopHelper.switchUIToNotebookbar();
cy.cGet('#Review-tab-label').click();
@@ -154,7 +154,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Track Changes', function (
});
});

- it('Compare remote documents', function () {
+ it.skip('Compare remote documents', function () {
// Given a document:
desktopHelper.switchUIToNotebookbar();
// Switch to the 'Review' tab.

"Mohit Marathe (via github)"

unread,
Feb 26, 2026, 11:42:56 AMFeb 26
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/calc/a11y_notebookbar_spec.js | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)

New commits:
commit 6727ed085b85c1cbbab8acb9d7710a073832c2df
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Thu Feb 26 20:42:10 2026 +0530
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Thu Feb 26 22:12:00 2026 +0530

cypress: enable calc/a11y_notebookbar_spec.js

Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Change-Id: Ifc42209187ec3bfb59a55556cb77195f8f14ad5f

diff --git a/cypress_test/integration_tests/desktop/calc/a11y_notebookbar_spec.js b/cypress_test/integration_tests/desktop/calc/a11y_notebookbar_spec.js
index 28d2b41ad3..54e3b45230 100644
--- a/cypress_test/integration_tests/desktop/calc/a11y_notebookbar_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/a11y_notebookbar_spec.js
@@ -30,7 +30,6 @@ describe(['tagdesktop'], 'Accessibility Calc Notebookbar Tests', { testIsolation
var skipContextTabs = ['Sparkline', 'Table'];

after(function () {
- if (visitedTabNames.length === 0) return;
var unvisited = allTabNames.filter(function (name) {
return !visitedTabNames.includes(name) && !skipContextTabs.includes(name);
});
@@ -56,7 +55,7 @@ describe(['tagdesktop'], 'Accessibility Calc Notebookbar Tests', { testIsolation
return tabs.find(function (t) { return t.name === name; });
}

- it.skip('Notebookbar tab: Shape (context)', function () {
+ it('Notebookbar tab: Shape (context)', function () {
cy.then(function () {
win.app.map.sendUnoCommand('.uno:BasicShapes.octagon');
});
@@ -71,7 +70,7 @@ describe(['tagdesktop'], 'Accessibility Calc Notebookbar Tests', { testIsolation
helper.typeIntoDocument('{esc}');
});

- it.skip('Notebookbar tab: Picture (context)', function () {
+ it('Notebookbar tab: Picture (context)', function () {
cy.viewport(1920, 1080);

desktopHelper.insertImage();
@@ -87,7 +86,7 @@ describe(['tagdesktop'], 'Accessibility Calc Notebookbar Tests', { testIsolation
// TODO: Add a Sparkline to test document after merge of outstanding pr
// TODO: Table context is for "Table in Table" feature, not available in .ods format

- it.skip('All non-context notebookbar tabs', function () {
+ it('All non-context notebookbar tabs', function () {

"Mohit Marathe (via github)"

unread,
Feb 27, 2026, 3:17:18 AMFeb 27
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/track_changes_spec.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

New commits:
commit fccfc1b503424aceb87169176b637003c4aa8df2
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Fri Feb 27 10:53:14 2026 +0530
Commit: Miklos Vajna <vmi...@collabora.com>
CommitDate: Fri Feb 27 09:16:53 2026 +0100

cypress: re-enable compare documents tests

now it is working after the patch ports

Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Change-Id: If1e0ac8bf9d28bd2565ac19ec73358b0828b7aa7

diff --git a/cypress_test/integration_tests/desktop/writer/track_changes_spec.js b/cypress_test/integration_tests/desktop/writer/track_changes_spec.js
index e1d0df5723..ac851df4a7 100644
--- a/cypress_test/integration_tests/desktop/writer/track_changes_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/track_changes_spec.js
@@ -127,7 +127,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Track Changes', function (
helper.expectTextForClipboard('Hello World');
});

- it.skip('Compare documents', function () {
+ it('Compare documents', function () {
// Given an ~empty (new) document:
desktopHelper.switchUIToNotebookbar();
cy.cGet('#Review-tab-label').click();
@@ -154,7 +154,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Track Changes', function (
});
});

- it.skip('Compare remote documents', function () {
+ it('Compare remote documents', function () {

"Caolán McNamara (via github)"

unread,
Feb 27, 2026, 9:39:42 AMFeb 27
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/helper.js | 5 +++++
1 file changed, 5 insertions(+)

New commits:
commit 139c4256a088f59663fef3e020a80722dddf6754
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Mon Feb 23 12:26:44 2026 +0000
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Fri Feb 27 20:09:31 2026 +0530

don't get stuck on loading spinner in cypress test

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Icaa5e6abe2b155e753431fd75116dbb76bddf5e0

diff --git a/cypress_test/integration_tests/common/helper.js b/cypress_test/integration_tests/common/helper.js
index 552a6706a3..bb8811432f 100644
--- a/cypress_test/integration_tests/common/helper.js
+++ b/cypress_test/integration_tests/common/helper.js
@@ -742,6 +742,11 @@ function isImageWhite(selector, expectWhite = true) {
.should(function(images) {
var img = images[0];

+ // Ensure the image has actual rendered content, not a
+ // placeholder (e.g. SVG loading spinner for slide previews).
+ expect(img.complete).to.be.true;
+ expect(img.naturalWidth).to.be.greaterThan(0);
+
// Create an offscreen canvas to check the image's pixels
var canvas = document.createElement('canvas');
canvas.width = img.width;

"Caolán McNamara (via github)"

unread,
Feb 27, 2026, 11:33:32 PMFeb 27
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js | 4 ++++
1 file changed, 4 insertions(+)

New commits:
commit e1e33a0377ca86785fbe928d27dd3587887d3834
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Fri Feb 27 21:52:39 2026 +0000
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Sat Feb 28 10:02:35 2026 +0530

effort to make Insert text hyperlink more reliable

● 1) Top toolbar tests.
Insert text hyperlink.:

Timed out retrying after 10000ms
+ expected - actual

-'text text1lik'
+'text text1link'

at Context.eval (integration_tests/common/helper.js:437:74)

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I5140ebed8634ba5e49e14c0838ffebbb35d34c6c

diff --git a/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js b/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
index decb860a84..fe979279b1 100644
--- a/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
@@ -267,6 +267,10 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {
cy.cGet('#indication').should('exist').should('be.visible');
cy.cGet('#name').should('exist').should('be.visible');

+ // Wait for the dialog to fully initialize
+ helper.processToIdle(this.win);
+ cy.cGet('#indication-input').should('have.value', 'text text1');
+
cy.cGet('#indication-input').type('link');
cy.cGet('#target-input').type('www.something.com');
cy.cGet('#ok').click();

"Mohit Marathe (via github)"

unread,
Mar 2, 2026, 7:28:24 AMMar 2
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js | 2 -
cypress_test/integration_tests/desktop/calc/formula_dialog_spec.js | 2 -
cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js | 16 +++++-----
cypress_test/integration_tests/desktop/writer/replace_dialog_spec.js | 6 +--
cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js | 4 +-
5 files changed, 15 insertions(+), 15 deletions(-)

New commits:
commit 090b21f211fa90384527ee972615ec9c31946fa1
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Mon Mar 2 10:48:43 2026 +0530
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Mon Mar 2 17:57:23 2026 +0530

cypress: re-enable some previously skipped cypress tests

which were skipped in 8505f493923e3deaf715cb78e898285a7930b9b8

Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Change-Id: Ib8d9598f44e0bd8aee6da9c768d20b4a664dce1a

diff --git a/cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js b/cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js
index 868ad677bf..9470ba7805 100644
--- a/cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js
@@ -55,7 +55,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Chart dialog tests', funct
* some css property.
* `reasonableWidth` = width at the time of writing this test + 15px ;)
*/
- it.skip('Chart Wizard width', function() {
+ it('Chart Wizard width', function() {
cy.cGet('#Insert-tab-label').click();
desktopHelper.getNbIcon('InsertObjectChart', 'Insert').click();

diff --git a/cypress_test/integration_tests/desktop/calc/formula_dialog_spec.js b/cypress_test/integration_tests/desktop/calc/formula_dialog_spec.js
index e732f5b9d3..b797123312 100644
--- a/cypress_test/integration_tests/desktop/calc/formula_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/formula_dialog_spec.js
@@ -12,7 +12,7 @@ describe(['tagdesktop'], 'Formula dialog tests', function() {
});
});

- it.skip('Formula dialog visual regression test', function() {
+ it('Formula dialog visual regression test', function() {
cy.wait(1000);

cy.cGet('.unoFunctionDialog.formulabar').click();
diff --git a/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js b/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
index e404945a02..2010319870 100644
--- a/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
@@ -193,7 +193,7 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f
// silently skip the common dialogs that writer doesn't have
return;
} else {
- it.skip(`Common Dialog ${command}`, function () {
+ it(`Common Dialog ${command}`, function () {
if (!hasLinguisticData && a11yHelper.needsLinguisticData(command)) {
this._runnable.title += ' (skipped: missing linguistic data)';
this.skip();
@@ -203,7 +203,7 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f
}
});

- it.skip('Transform dialog', function () {
+ it('Transform dialog', function () {
cy.then(() => {
win.app.map.sendUnoCommand('.uno:BasicShapes.octagon');
});
@@ -224,7 +224,7 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f
helper.typeIntoDocument('{esc}');
});

- it.skip('Line dialog', function () {
+ it('Line dialog', function () {
cy.then(() => {
win.app.map.sendUnoCommand('.uno:Line');
});
@@ -254,7 +254,7 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f

allWriterDialogs.forEach(function (commandSpec) {
const command = typeof commandSpec === 'string' ? commandSpec : commandSpec.command;
- it.skip(`Writer Dialog ${command}`, function () {
+ it(`Writer Dialog ${command}`, function () {
a11yHelper.testDialog(win, commandSpec);
});
});
@@ -282,7 +282,7 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f
a11yHelper.handleDialog(win, 1, '.uno:ContentControlProperties');
});

- it.skip('Object dialog', function () {
+ it('Object dialog', function () {
helper.clearAllText({ isTable: true });
cy.then(() => {
win.app.map.sendUnoCommand('.uno:InsertObjectChart');
@@ -328,7 +328,7 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f
cy.cGet('div.clipboard').should('have.focus');
});

- it.skip('Graphic dialog', function () {
+ it('Graphic dialog', function () {
helper.clearAllText();
desktopHelper.insertImage();
cy.then(() => {
@@ -361,11 +361,11 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f
});
});

- it.skip('PDF export warning dialog', function () {
+ it('PDF export warning dialog', function () {
a11yHelper.testPDFExportWarningDialog(win);
});

- it.skip('ReadOnly info dialog', function () {
+ it('ReadOnly info dialog', function () {
// Text ReadOnly info dialog
helper.clearAllText({ isTable: true });
helper.typeIntoDocument('READONLY');
diff --git a/cypress_test/integration_tests/desktop/writer/replace_dialog_spec.js b/cypress_test/integration_tests/desktop/writer/replace_dialog_spec.js
index e008ff07c1..fbba185b5a 100644
--- a/cypress_test/integration_tests/desktop/writer/replace_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/replace_dialog_spec.js
@@ -11,7 +11,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Replace Dialog Tests', fun
});
});

- it.skip('Ctrl H should open search dialog with replace tab active', function() {
+ it('Ctrl H should open search dialog with replace tab active', function() {
helper.typeIntoDocument('{ctrl}h');
findHelper.waitForFindReplaceDialog(this.win);

@@ -23,7 +23,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Replace Dialog Tests', fun
cy.cGet('#FindReplaceDialog.jsdialog input#searchterm-input-dialog').should('be.focused');
});

- it.skip('Replace button should open search dialog with replace tab active', function() {
+ it('Replace button should open search dialog with replace tab active', function() {
cy.viewport(1920,1080);
// Click the Replace button from the notebookbar
cy.cGet('#Home-container [id^="home-search-dialog"] button:visible').click();
@@ -74,7 +74,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Replace Dialog Tests', fun
cy.cGet('#copy-paste-container p b').should('not.exist');
});

- it.skip('Enter key in replace field triggers replace', function() {
+ it('Enter key in replace field triggers replace', function() {
helper.setDummyClipboardForCopy();

//First make sure that we do not have 'replaced' text in current document
diff --git a/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js b/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
index ac06357924..58bb22bf1d 100644
--- a/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
@@ -284,7 +284,7 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {
cy.cGet('#copy-paste-container p a').should('have.attr', 'href', 'http://www.something.com/');
});

- it('Insert mail hyperlink.', function() {
+ it.skip('Insert mail hyperlink.', function() {
helper.setDummyClipboardForCopy();

cy.cGet('#Insert-tab-label').click();
@@ -347,7 +347,7 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {
.should('not.exist');
});

- it.skip('Insert/delete chart.', function() {
+ it('Insert/delete chart.', function() {
cy.cGet('#Insert-tab-label').click();
cy.cGet('#Insert-container .unoInsertObjectChart button').click();


"Caolán McNamara (via github)"

unread,
Mar 2, 2026, 11:12:25 PMMar 2
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

New commits:
commit ed336f2e2890ca77af3cbc8da007ebeb350192a6
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Mon Mar 2 17:18:04 2026 +0000
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Tue Mar 3 09:41:56 2026 +0530

enable calc dialog tests that now pass

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I96cd24f80635e7c3213f230ecf5f8cc678747b16

diff --git a/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js b/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js
index 420cf9861b..69cd291b9f 100644
--- a/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js
@@ -165,7 +165,7 @@ describe(['tagdesktop'], 'Accessibility Calc Dialog Tests', { testIsolation: fal
}
});

- it.skip('Graphic dialog', function () {
+ it('Graphic dialog', function () {
cy.viewport(1920,1080);
helper.processToIdle(win);

@@ -189,7 +189,7 @@ describe(['tagdesktop'], 'Accessibility Calc Dialog Tests', { testIsolation: fal
desktopHelper.selectZoomLevel('100', false);
});

- it.skip('Shape paragraph dialog', function () {
+ it('Shape paragraph dialog', function () {
cy.then(() => {
win.app.map.sendUnoCommand('.uno:BasicShapes.octagon');
});
@@ -207,7 +207,7 @@ describe(['tagdesktop'], 'Accessibility Calc Dialog Tests', { testIsolation: fal
helper.typeIntoDocument('{esc}');
});

- it.skip('PasteSpecial Dialog (Buggy)', function () {
+ it('PasteSpecial Dialog', function () {
helper.setDummyClipboardForCopy('text/html');
// Select some text
helper.selectAllText();
@@ -235,7 +235,7 @@ describe(['tagdesktop'], 'Accessibility Calc Dialog Tests', { testIsolation: fal
a11yHelper.handleDialog(win, 1, '.uno:PasteTextImportDialog');
});

- it.skip('Font Dialog (Buggy)', function () {
+ it('Font Dialog', function () {
calcHelper.dblClickOnFirstCell();

cy.then(() => {

"Caolán McNamara (via github)"

unread,
Mar 3, 2026, 4:41:50 AMMar 3
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/a11y_sidebar_spec.js | 28 ++++++----
1 file changed, 17 insertions(+), 11 deletions(-)

New commits:
commit ce67caaec41936917f43791c59adffe49c7773b1
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Mon Mar 2 16:48:09 2026 +0000
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Tue Mar 3 15:11:37 2026 +0530

reenable the writer sidebar a11y test

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I1d98c9878f622b15dae127a8ba8f241989c541ca

diff --git a/cypress_test/integration_tests/desktop/writer/a11y_sidebar_spec.js b/cypress_test/integration_tests/desktop/writer/a11y_sidebar_spec.js
index 2e86cf0d5e..0eb6f81644 100644
--- a/cypress_test/integration_tests/desktop/writer/a11y_sidebar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/a11y_sidebar_spec.js
@@ -56,7 +56,7 @@ describe(['tagdesktop'], 'Accessibility Writer Sidebar Tests', { testIsolation:
runA11yValidation(win);
});

- it.skip('Chart (LinePropertyPanel)', function () {
+ it('Chart (LinePropertyPanel)', function () {
helper.clearAllText({ isTable: true });
cy.then(() => {
win.app.map.sendUnoCommand('.uno:InsertObjectChart');
@@ -71,7 +71,11 @@ describe(['tagdesktop'], 'Accessibility Writer Sidebar Tests', { testIsolation:
// Default chart deck panels
runA11yValidation(win);

- // Now use tab to select the inner 'Chart' element
+ // Enter the chart's inner object hierarchy
+ cy.realPress('Enter');
+ helper.processToIdle(win);
+
+ // Select the first sub-object
cy.realPress('Tab');
helper.processToIdle(win);
runA11yValidation(win);
@@ -86,22 +90,24 @@ describe(['tagdesktop'], 'Accessibility Writer Sidebar Tests', { testIsolation:
helper.processToIdle(win);
runA11yValidation(win);

- cy.realPress('Escape'); // back up a level
- cy.realPress('Tab'); // Data Series: Column 2
- cy.realPress('Tab'); // Data Series: Column 3
- cy.realPress('Tab'); // X Axis
+ // Back up to Data Series: Column 1
+ cy.realPress('Escape');
helper.processToIdle(win);
runA11yValidation(win);

- cy.realPress('Escape'); // Go a level up the hierarchy
+ // Data Series: Column 2
+ cy.realPress('Tab');
helper.processToIdle(win);
+ runA11yValidation(win);

+ // X Axis
+ cy.realPress('Tab');
+ cy.realPress('Tab');
helper.processToIdle(win);
- // Data series selected, expect data series panel to be tested.
runA11yValidation(win);

- // Two esc get us out of the chart navigation and then chart edit mode
- escLevel(win, 2);
+ // Esc out of chart navigation, chart edit mode, and chart selection
+ escLevel(win, 3);
helper.processToIdle(win);

// At which point the sidebar disappears
@@ -222,7 +228,7 @@ describe(['tagdesktop'], 'Accessibility Writer Sidebar Tests', { testIsolation:
});
});

- it.skip('InspectorDeck', function() {
+ it('InspectorDeck', function() {

"Andras Timar (via github)"

unread,
Mar 5, 2026, 3:55:05 AMMar 5
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/calc/statusbar_spec.js | 34 ++++++++++
1 file changed, 34 insertions(+)

New commits:
commit 75ab80fe56133def5a6644e7985d2821591c0070
Author: Andras Timar <andras...@collabora.com>
AuthorDate: Wed Mar 4 09:58:28 2026 +0100
Commit: Miklos Vajna <vmi...@collabora.com>
CommitDate: Thu Mar 5 09:54:15 2026 +0100

cypress: test multi-selection in Calc cell function status bar menu

Verify that the status bar cell function menu supports toggling
multiple functions (add Maximum, remove Average) and that clicking
'None' clears all selections.

Change-Id: I7f3b2a1c8e5d4f6b9a0c3e2d1f8a7b6c5d4e3f2
Signed-off-by: Andras Timar <andras...@collabora.com>

diff --git a/cypress_test/integration_tests/desktop/calc/statusbar_spec.js b/cypress_test/integration_tests/desktop/calc/statusbar_spec.js
index 3bcb3f0cda..7e54b5564f 100644
--- a/cypress_test/integration_tests/desktop/calc/statusbar_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/statusbar_spec.js
@@ -64,6 +64,40 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Statubar tests.', function
cy.cGet('.ui-combobox-entry.selected').contains(/Average|Sum/g);
});

+ it('Cell function menu multi-selection.', function() {
+ cy.viewport(1280, 720);
+ helper.typeIntoInputField(helper.addressInputSelector, 'A1:A2');
+ cy.cGet('#StateTableCell').should('have.text', 'Average: 15.5; Sum: 31');
+
+ // Default state: Average and Sum are selected
+ desktopHelper.makeZoomItemsVisible();
+ cy.cGet('#StateTableCellMenu .unolabel').contains('Average; Sum');
+
+ // Toggle on Maximum — should add it to the selection
+ cy.cGet('#StateTableCellMenu .arrowbackground').click();
+ cy.cGet('.jsdialog-overlay').should('exist');
+ cy.cGet('body').contains('.ui-combobox-entry', 'Maximum').click();
+ cy.cGet('#StateTableCellMenu .unolabel').contains('Maximum');
+ cy.cGet('#StateTableCell').should('contain.text', 'Max: 21');
+ // Average and Sum should still be there
+ cy.cGet('#StateTableCell').should('contain.text', 'Average: 15.5');
+ cy.cGet('#StateTableCell').should('contain.text', 'Sum: 31');
+
+ // Toggle off Average — should remove it from the selection
+ cy.cGet('#StateTableCellMenu .arrowbackground').click();
+ cy.cGet('.jsdialog-overlay').should('exist');
+ cy.cGet('body').contains('.ui-combobox-entry', 'Average').click();
+ cy.cGet('#StateTableCell').should('not.contain.text', 'Average');
+ cy.cGet('#StateTableCell').should('contain.text', 'Max: 21');
+ cy.cGet('#StateTableCell').should('contain.text', 'Sum: 31');
+
+ // Click None — should clear all selections
+ cy.cGet('#StateTableCellMenu .arrowbackground').click();
+ cy.cGet('.jsdialog-overlay').should('exist');
+ cy.cGet('body').contains('.ui-combobox-entry', 'None').click();
+ cy.cGet('#StateTableCellMenu .unolabel').contains('None');
+ });
+
it('Change zoom level.', function() {
desktopHelper.resetZoomLevel();
desktopHelper.shouldHaveZoomLevel('100');

"Caolán McNamara (via github)"

unread,
Mar 11, 2026, 5:30:23 AMMar 11
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit b6b97300065f517924da10002319d4823fcec295
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Tue Mar 10 17:30:54 2026 +0000
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Wed Mar 11 09:29:55 2026 +0000

cypress: be more specific about the .notebookbar.ui-iconview-entry

Failure context for 'Apply style.':
cy:log ✱ << typeIntoDocument - end
cy:log ✱ >> textSelectionShouldExist - start
cy:command ✔ cGet .text-selection-handle-start
cy:command ✔ assert expected **<div.html-object-section.text-selection-handle-start>** to exist in the DOM
cy:command ✔ cGet .text-selection-handle-end
cy:command ✔ assert expected **<div.html-object-section.text-selection-handle-end>** to exist in the DOM
cy:log ✱ << textSelectionShouldExist - end
cy:log ✱ << selectAllText - end
cy:log ✱ << selectAllTextOfDoc - end
cy:command ✔ window
cy:command ✔ cGet #stylesview
cy:command ✔ scrollTo bottom
cy:command ✔ cGet .notebookbar.ui-iconview-entry img[title=Title]
cy:command ✘ click
cy:command ✔ fail:
`cy.click()` can only be called on a single element. Your subject contained 2 elements. Pass `{ multiple: true }` if you want to serially click each element.
https://on.cypress.io/click
/home/collabora/jenkins/workspace/github_online_master_debug_vs_co-26.04_cypress_desktop/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js:53:68
51 | helper.setDummyClipboardForCopy();
52 | cy.cGet('#stylesview').scrollTo('bottom');
> 53 | cy.cGet('.notebookbar.ui-iconview-entry img[title=Title]').click();
| ^
54 | refreshCopyPasteContainer();
55 | helper.copy();
...
Builds:
- desktop#548 (PR#14872: notebookbar: current masterpages)
- desktop#552 (PR#14872: notebookbar: current masterpages)
- desktop#598 (PR#14905: Misc Improvements)
- desktop#603 (PR#14919: Evaluate anim:formula per ODF 1.2 section 19.6 gra...)
- desktop#607 (PR#14904: Table styles new icons)
- desktop#611 (PR#14872: notebookbar: current masterpages)
- desktop#617 (PR#14927: Click File, Info, More, Cancel in WebDriverThing)

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I073cc344b14ee2fa573b10cc36d86b0301c792e6

diff --git a/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js b/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
index f0e36cb1b7..96f6da981a 100644
--- a/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
@@ -60,7 +60,7 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {
it('Apply style.', function() {
helper.setDummyClipboardForCopy();
cy.cGet('#stylesview').scrollTo('bottom') ;
- cy.cGet('.notebookbar.ui-iconview-entry img[title=Title]').click();
+ cy.cGet('#stylesview .notebookbar.ui-iconview-entry img[title=Title]').click();
refreshCopyPasteContainer();
helper.copy();
cy.cGet('#copy-paste-container p font font').should('have.attr', 'style', 'font-size: 28pt');

"Caolán McNamara (via github)"

unread,
Mar 13, 2026, 5:19:14 AMMar 13
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js | 5 -----
1 file changed, 5 deletions(-)

New commits:
commit a4ff761396cfbf2dc667d0402cbe876424e2ddbf
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Thu Mar 12 17:09:09 2026 +0000
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Fri Mar 13 09:18:11 2026 +0000

these calc dialog pass a11y testing now

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I9da8fad4b7bff315bec492badf41b221cf92d03d

diff --git a/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js b/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js
index 69cd291b9f..b0cc5dfd5b 100644
--- a/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js
@@ -66,13 +66,8 @@ const buggyCalcDialogs = [
'.uno:DataFilterStandardFilter',
'.uno:DefineName',
'.uno:DefineDBName',
- '.uno:Delete',
- '.uno:EditHeaderAndFooter',
'.uno:EditPrintArea',
- '.uno:EditStyle?Param:string=Heading&Family:short=2',
- '.uno:FormatCellDialog',
'.uno:FunctionDialog',
- '.uno:InsertObjectChart',
'.uno:PageFormatDialog',
'.uno:Validation',
];

"Caolán McNamara (via github)"

unread,
Mar 13, 2026, 6:47:04 AMMar 13
to collaboraon...@googlegroups.com
cypress_test/integration_tests/multiuser/calc/cell_cursor_spec.js | 4 ++++
1 file changed, 4 insertions(+)

New commits:
commit e395f8dfc09286dfa6e037a00b656068a5523a6b
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Thu Mar 12 23:31:17 2026 +0000
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Fri Mar 13 16:16:34 2026 +0530

an effort to improve reliability for multiuser/calc/cell_cursor_spec.js

cy: command ✔ click
cy: command ✔ wrap null
cy: command ✔ assert .uno:ReportWhenIdle result with idleID 2: expected **{ Object (proxy, thisValue, ...) }** to be an object
cy: command ✔ cSetActiveFrame #iframe2
cy:log ✱ >> assertScrollbarPosition - start
cy: command ✔ cGet #test-div-vertical-scrollbar
cy: command ✔ assert expected **447** to be within 400..670
cy:log ✱ << assertScrollbarPosition - end
cy:log ✱ >> assertAddressAfterIdle - start
cy:log ✱ Param - expectedAddress: A589
cy: command ✔ wrap null
cy: command ✔ assert .uno:ReportWhenIdle result with idleID 3: expected **{ Object (proxy, thisValue, ...) }** to be an object
cy: command ✔ cGet #addressInput input
cy: command ✘ assert expected **<input#pos_window-input-address.ui-combobox-content.addressInput.jsdialog>** to have value **A589**, but the value was **A590**
cy: command ✔ fail:
Timed out retrying after 10000ms: expected '<input#pos_window-input-address.ui-combobox-content.addressInput.jsdialog>' to have value 'A589', but the value was 'A590'
/home/collabora/jenkins/workspace/github_online_master_debug_vs_co-26.04_cypress_multi_user/cypress_test/integration_tests/common/calc_helper.js:299:42
297 | cy.log('Param - expectedAddress: ' + expectedAddress);
298 | helper.processToIdle(win);
> 299 | cy.cGet(helper.addressInputSelector).should('have.value', expectedAddress);
| ^
300 | cy.log('<< assertAddressAfterIdle - end');
301 | }
302 | module.e ...
cy:log ✱ Finishing test: integration_tests/multiuser/calc/cell_cursor_spec.js / Check cell cursor and view behavior / Jump on modification above in the sheet
Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I7767941755421910c379205973352246c0e0d57b

diff --git a/cypress_test/integration_tests/multiuser/calc/cell_cursor_spec.js b/cypress_test/integration_tests/multiuser/calc/cell_cursor_spec.js
index 6713133a3a..0c6d179a6e 100644
--- a/cypress_test/integration_tests/multiuser/calc/cell_cursor_spec.js
+++ b/cypress_test/integration_tests/multiuser/calc/cell_cursor_spec.js
@@ -28,6 +28,10 @@ describe(['tagmultiuser'], 'Check cell cursor and view behavior', function() {
cy.cGet('#sc_input_window .ui-custom-textarea-text-layer').click();
cy.cGet('#sc_input_window .ui-custom-textarea-text-layer').type('some text{enter}');

+ cy.getFrameWindow().then((win1) => {
+ helper.processToIdle(win1);
+ });
+
// turn off following in the second view
cy.cSetActiveFrame('#iframe2');
cy.cGet('#followingChip').click();

"Caolán McNamara (via github)"

unread,
Mar 13, 2026, 8:09:34 AMMar 13
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/impress/top_toolbar_spec.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

New commits:
commit 4e46b3067b1192a79143411891b915558bbb9154
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Fri Mar 13 08:26:26 2026 +0000
Commit: Miklos Vajna <vmi...@collabora.com>
CommitDate: Fri Mar 13 13:08:54 2026 +0100

make desktop/impress/top_toolbar_spec more reliable

Failure context for 'Click shape hyperlink.':
cy:command ✔ type {esc}
cy:command ✔ cGet #document-container
cy:command ✔ assert expected **0** to equal **0**
cy:command ✔ cGet #test-div-shapeHandlesSection
cy:command ✔ assert expected **#test-div-shapeHandlesSection** not to exist in the DOM
cy:log ✱ << removeShapeSelection - end
cy:command ✔ cGet #document-container
cy:command ✔ assert expected **<div#document-container.notebookbar-active.slide-normal-mode.landscape.parts-preview-document>** to have a length of **1**
cy:command ✔ cGet body
cy:command ✔ click 625.5, 348, {ctrlkey: true}
cy:command ✔ wrap null
cy:command ✔ assert .uno:ReportWhenIdle result with idleID 19: expected **{ Object (proxy, thisValue, ...) }** to be an object
cy:command ✔ cGet [id^="info-modal-label2"]
cy:command ✘ assert expected **[id^="info-modal-label2"]** to have text **http://www.something.com/**, but the text was **''**
cy:command ✔ fail:
Timed out retrying after 10000ms: Expected to find element: `[id^="info-modal-label2"]`, but never found it. Queried from:
> cy.get(#coolframe, [object Object]).its(0.contentDocument, [object Object])
/home/collabora/jenkins/workspace/github_online_master_debug_vs_co-26.04_cypress_desktop/cypress_test/integration_tests/desktop/impress/top_toolbar_spec.js:123:46
121 | impressHelper.clickCenterOfSlide({ ctrlKey: true });
122 | helper.processToIdle(this.win);
> 123 | cy.cGet('[id^="info-modal-label2"]').should('have.text', 'http://www.something.com/');
| ^
124 | cy.cGet( ...
cy:log ✱ Finishing test: integration_tests/desktop/impress/top_toolbar_spec.js / Top toolbar tests. / Click shape hyperlink.
cy:command ✔ loadavg 21.77 25.04 32.26 9/6391 3974217
Builds:
- desktop#674 (PR#14937: use same defaultCommandTimeout for multiuser tests...)
- desktop#702 (PR#14954: css: unify UI font-family to single --cool-font to...)
- desktop#710 (PR#14961: cool#14745 Crop handle dragging fix)

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I7a16a5450bfeac704d9738f4831e3ee297b677d3

diff --git a/cypress_test/integration_tests/desktop/impress/top_toolbar_spec.js b/cypress_test/integration_tests/desktop/impress/top_toolbar_spec.js
index 691cfb1611..b199a6812e 100644
--- a/cypress_test/integration_tests/desktop/impress/top_toolbar_spec.js
+++ b/cypress_test/integration_tests/desktop/impress/top_toolbar_spec.js
@@ -149,14 +149,13 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Top toolbar tests.', funct
});

it('Click shape hyperlink.', function() {
- // Insert shape
+ // Insert shape - this creates and selects the shape
+ // immediately, no additional click needed to select it.
desktopHelper.getCompactIconArrow('DefaultNumbering').click();
desktopHelper.getCompactIconArrow('BasicShapes').click();
cy.cGet('.col.w2ui-icon.basicshapes_round-quadrat').click();
cy.cGet('#test-div-shapeHandlesSection').should('exist');
-
- // Select shape at center of document
- impressHelper.clickCenterOfSlide( { } );
+ helper.processToIdle(this.win);

helper.typeIntoDocument('{ctrl}k');
cy.cGet('#target').should('exist').should('be.visible');
@@ -165,6 +164,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Top toolbar tests.', funct

cy.cGet('#target-input').type('www.something.com');
cy.cGet('#ok').click();
+ cy.cGet('#target').should('not.exist');

helper.processToIdle(this.win);


"Caolán McNamara (via github)"

unread,
Mar 13, 2026, 8:32:56 AMMar 13
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js | 1 -
1 file changed, 1 deletion(-)

New commits:
commit a6cdc106eee8e452a5455ae1470276915cf6527e
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Fri Mar 13 09:39:09 2026 +0000
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Fri Mar 13 18:02:47 2026 +0530

DefineName a11y test passes now

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Ibf1e8008609338d57acefb0c40f05f674158b3cd

diff --git a/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js b/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js
index b0cc5dfd5b..a184fcde37 100644
--- a/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js
@@ -64,7 +64,6 @@ const excludedCommonDialogs = [
const buggyCalcDialogs = [
'.uno:DataFilterSpecialFilter',
'.uno:DataFilterStandardFilter',
- '.uno:DefineName',
'.uno:DefineDBName',
'.uno:EditPrintArea',
'.uno:FunctionDialog',

"Caolán McNamara (via github)"

unread,
Mar 13, 2026, 9:08:31 AMMar 13
to collaboraon...@googlegroups.com
cypress_test/integration_tests/mobile/calc/bottom_toolbar_spec.js | 9 +++++++++
1 file changed, 9 insertions(+)

New commits:
commit 7e99546a90b15bd6f627d0411e100ac676642ff4
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Fri Mar 13 10:27:35 2026 +0000
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Fri Mar 13 18:37:36 2026 +0530

make mobile/calc/bottom_toolbar_spec more reliable

Failure context for 'Apply bold.':
cy:command ✔ assert expected **<div#test-div-OwnCellCursor>** to exist in the DOM
cy:command ✔ getFrameWindow #coolframe
cy:log ✱ >> assertAddressAfterIdle - start
cy:log ✱ Param - expectedAddress: A1
cy:command ✔ wrap null
cy:command ✔ assert .uno:ReportWhenIdle result with idleID 3: expected **{ Object (proxy, thisValue, ...) }** to be an object
cy:command ✔ cGet #addressInput input
cy:command ✔ assert expected **<input#pos_window-input-address.ui-combobox-content.addressInput.jsdialog>** to have value **A1**
cy:log ✱ << assertAddressAfterIdle - end
cy:log ✱ << clickOnFirstCell - end
cy:command ✔ window
cy:command ✔ cGet #toolbar-down .unoBold:visible
cy:command ✔ assert expected **<div#bold1.unotoolbutton.jsdialog.ui-content.unospan.unoBold.no-label>** not to be **disabled**
cy:command ✘ click
cy:command ✔ fail:
Timed out retrying after 10050ms: `cy.click()` failed because this element is `disabled`:
`<div class="unotoolbutton jsdialog ui-content unospan unoBold no-label" tabindex="-1" modelid="bold" id="bold1" data-cooltip="Bold (Ctrl+B)">...</div>`
Fix this problem, or use `{force: true}` to disable error checking.
https://on.cypress.io/element-cannot-be-interacted-with
/home/collabora/jenkins/workspace/github_online_master_debug_vs_co-26.04_cypress_mobile/cypress_test/integration_tests/mobile/calc/bottom_toolbar_spec.js:21:71
19 | it('Apply bold.', function () {
20 | helper.setDummyClipboardForCopy();
> 21 | mobileHelper.getCompactIcon('Bold').shoul ...
cy:log ✱ Finishing test: integration_tests/mobile/calc/bottom_toolbar_spec.js / Interact with bottom toolbar. / Apply bold.
cy:command ✔ loadavg 94.31 100.25 101.47 56/7137 2512063
Builds:
- mobile#553 (PR#14698: cypress: follow me slideshow buttons for follower)
- mobile#628 (PR#14968: Block moving a shape when it is not selected)

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I89f34f9fc60464d672125bfacc85613b1d8e8aa1

diff --git a/cypress_test/integration_tests/mobile/calc/bottom_toolbar_spec.js b/cypress_test/integration_tests/mobile/calc/bottom_toolbar_spec.js
index c651f80fc1..a053627e1a 100644
--- a/cypress_test/integration_tests/mobile/calc/bottom_toolbar_spec.js
+++ b/cypress_test/integration_tests/mobile/calc/bottom_toolbar_spec.js
@@ -15,6 +15,10 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Interact with bottom toolba
cy.cGet('#toolbar-down').should('exist');

calcHelper.clickOnFirstCell();
+
+ cy.getFrameWindow().then(function(win) {
+ this.win = win;
+ });
});

function getTextEndPosForFirstCell() {
@@ -29,6 +33,7 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Interact with bottom toolba

it('Apply bold.', function() {
helper.setDummyClipboardForCopy();
+ helper.processToIdle(this.win);
mobileHelper.getCompactIcon('Bold').should('not.be.disabled').click();
calcHelper.selectEntireSheet();
helper.copy();
@@ -37,6 +42,7 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Interact with bottom toolba

it('Apply italic.', function() {
helper.setDummyClipboardForCopy();
+ helper.processToIdle(this.win);
mobileHelper.getCompactIcon('Italic').should('not.be.disabled').click();
calcHelper.selectEntireSheet();
helper.copy();
@@ -45,6 +51,7 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Interact with bottom toolba

it('Apply underline.', function() {
helper.setDummyClipboardForCopy();
+ helper.processToIdle(this.win);
mobileHelper.getCompactIcon('Underline').should('not.be.disabled').click();
calcHelper.selectEntireSheet();
helper.copy();
@@ -59,6 +66,7 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Interact with bottom toolba

it('Apply font color.', function() {
helper.setDummyClipboardForCopy();
+ helper.processToIdle(this.win);
cy.cGet('#toolbar-down #fontcolor').should('not.be.disabled').click();
mobileHelper.selectFromColorPalette(0, 5);
calcHelper.selectEntireSheet();
@@ -68,6 +76,7 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Interact with bottom toolba

it('Apply highlight color.', function() {
helper.setDummyClipboardForCopy();
+ helper.processToIdle(this.win);
cy.cGet('#toolbar-down #backcolor').should('not.be.disabled').click();
mobileHelper.selectFromColorPalette(0, 5);
calcHelper.selectEntireSheet();

"Raul-Ionut Nastasie (via github)"

unread,
Mar 16, 2026, 3:48:47 PMMar 16
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/impress/a11y_dialog_spec.js | 222 ++++++++++
1 file changed, 222 insertions(+)

New commits:
commit 3b920a8264bf6de7e750784643ec95717a7e2c8a
Author: Raul-Ionut Nastasie <raul-ionu...@collabora.com>
AuthorDate: Mon Mar 16 17:33:03 2026 +0100
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Mon Mar 16 19:48:38 2026 +0000

Added basic a11y dialog test for impress

Signed-off-by: Raul-Ionut Nastasie <raul-ionu...@collabora.com>
Change-Id: I95cac66613f0c471e58d15a412becdce8b911575

diff --git a/cypress_test/integration_tests/desktop/impress/a11y_dialog_spec.js b/cypress_test/integration_tests/desktop/impress/a11y_dialog_spec.js
new file mode 100644
index 0000000000..7c406902a1
--- /dev/null
+++ b/cypress_test/integration_tests/desktop/impress/a11y_dialog_spec.js
@@ -0,0 +1,222 @@
+/* global describe expect it cy before after afterEach require Cypress */
+
+var helper = require('../../common/helper');
+var desktopHelper = require('../../common/desktop_helper');
+var a11yHelper = require('../../common/a11y_helper');
+
+const allImpressDialogs = [];
+
+// TODO: add if any
+// 'common' dialogs that impress specifically does not support
+const excludedCommonDialogs = [
+ '.uno:AcceptTrackedChanges',
+ '.uno:InsertQrCode', // does not seem to be in Impress
+ '.uno:InsertSymbol', // is in Impress, doesn't seem to work currently
+ '.uno:Signature',
+ '.uno:StyleNewByExample'
+];
+
+describe(['tagdesktop'], 'Accessibility Impress Dialog Tests', { testIsolation: false }, function () {
+ let win;
+ let hasLinguisticData = false;
+
+ before(function () {
+ helper.setupAndLoadDocument('impress/help_dialog.odp', /*isMultiUser=*/false, /*copyCertificates=*/true);
+
+ // to make insertImage use the correct buttons
+ desktopHelper.switchUIToNotebookbar();
+
+ helper.setDummyClipboardForCopy();
+
+ cy.getFrameWindow().then(function (frameWindow) {
+ win = frameWindow;
+ a11yHelper.enableUICoverage(win);
+ });
+
+ cy.cGet('.jsdialog-window').should('not.exist');
+
+ cy.then(() => {
+ return helper.processToIdle(win);
+ }).then(() => {
+ const thesaurusState = win.app.map.stateChangeHandler.getItemValue('.uno:ThesaurusDialog'); // TODO does this exist in impress?
+ hasLinguisticData = (thesaurusState === 'enabled');
+ });
+ });
+
+ after(function () {
+ a11yHelper.reportUICoverage(win, hasLinguisticData);
+
+ cy.get('@uicoverageResult').then(result => {
+ expect(result.used, `used .ui files`).to.not.be.empty;
+ // TODO: make these true
+ // expect(result.CompleteWriterDialogCoverage, `complete impress dialog coverage`).to.be.true;
+ // expect(result.CompleteCommonDialogCoverage, `complete common dialog coverage`).to.be.true;
+ });
+ });
+
+ afterEach(function () {
+ // Close any dialogs that might still be open after a test failure
+ cy.cGet('body').then($body => {
+ const dialogs = $body.find('.jsdialog-window .ui-dialog-titlebar-close');
+ if (dialogs.length > 0) {
+ // Close dialogs from innermost to outermost
+ for (let i = dialogs.length - 1; i >= 0; i--) {
+ cy.wrap(dialogs[i]).click({ force: true });
+ }
+ }
+ });
+ cy.cGet('.jsdialog-window:not(.ui-overflow-group-popup)').should('not.exist');
+
+ a11yHelper.resetState();
+ });
+
+ // Helper to test that a11y validation detects injected errors
+ function testA11yErrorDetection(injectBadElement) {
+ cy.then(() => {
+ win.app.map.sendUnoCommand('.uno:FontDialog');
+ });
+
+ a11yHelper.getActiveDialog(1)
+ .then(() => helper.processToIdle(win))
+ .then(() => {
+ a11yHelper.getActiveDialog(1).then($dialog => {
+ injectBadElement($dialog, win);
+ });
+ })
+ .then(() => {
+ // Validation should detect an error
+ var spy = Cypress.sinon.spy(win.console, 'error');
+ win.app.dispatcher.dispatch('validatedialogsa11y');
+
+ cy.then(() => {
+ const a11yErrors = spy.getCalls().filter(call =>
+ String(call.args[0]).includes(win.app.A11yValidatorException.PREFIX)
+ );
+ expect(a11yErrors.length, 'Should detect a11y error').to.be.greaterThan(0);
+ spy.restore();
+ });
+ })
+ .then(() => {
+ a11yHelper.closeActiveDialog(1);
+ });
+ }
+
+ function escLevel(win, count) {
+ for (var i = 0; i < count; i++) {
+ helper.typeIntoDocument('{esc}');
+ helper.processToIdle(win);
+ }
+ }
+
+ it('Detects non-native button element error', function () {
+ testA11yErrorDetection(function($dialog, win) {
+ // Inject a span with role="button" instead of native <button>
+ const badElement = win.document.createElement('span');
+ badElement.setAttribute('role', 'button');
+ badElement.setAttribute('id', 'something');
+ badElement.textContent = 'Bad Button';
+ $dialog.find('.ui-dialog-content')[0].appendChild(badElement);
+ });
+ });
+
+ it('Detects image missing alt attribute', function () {
+ testA11yErrorDetection(function($dialog, win) {
+ // Inject an image without alt attribute
+ const container = win.document.createElement('div');
+ container.setAttribute('id', 'something');
+ const img = win.document.createElement('img');
+ img.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
+ // No alt attribute set
+ container.appendChild(img);
+ $dialog.find('.ui-dialog-content')[0].appendChild(container);
+ });
+ });
+
+ it('Detects image with empty alt but parent lacks label', function () {
+ testA11yErrorDetection(function($dialog, win) {
+ // Inject an image with empty alt="" but parent has no label
+ const container = win.document.createElement('div');
+ container.setAttribute('id', 'something');
+ container.id = 'test-unlabeled-parent';
+ // No aria-label, aria-labelledby, or associated label element
+ const img = win.document.createElement('img');
+ img.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
+ img.setAttribute('alt', '');
+ container.appendChild(img);
+ $dialog.find('.ui-dialog-content')[0].appendChild(container);
+ });
+ });
+
+ it('Detects image with non-empty alt when parent also has label', function () {
+ testA11yErrorDetection(function($dialog, win) {
+ // Inject an image with non-empty alt AND parent has aria-label (duplicate)
+ const container = win.document.createElement('div');
+ container.setAttribute('id', 'something');
+ container.setAttribute('aria-label', 'Parent Label');
+ const img = win.document.createElement('img');
+ img.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
+ img.setAttribute('alt', 'Image description');
+ container.appendChild(img);
+ $dialog.find('.ui-dialog-content')[0].appendChild(container);
+ });
+ });
+
+ a11yHelper.allCommonDialogs.forEach(function (commandSpec) {
+ const command = typeof commandSpec === 'string' ? commandSpec : commandSpec.command;
+ if (excludedCommonDialogs.includes(command)) {
+ // silently skip the common dialogs that writer doesn't have
+ return;
+ } else {
+ it(`Common Dialog ${command}`, function () {
+ if (!hasLinguisticData && a11yHelper.needsLinguisticData(command)) {
+ this._runnable.title += ' (skipped: missing linguistic data)';
+ this.skip();
+ }
+ a11yHelper.testDialog(win, commandSpec);
+ });
+ }
+ });
+
+ it('Transform dialog', function () {
+ cy.then(() => {
+ win.app.map.sendUnoCommand('.uno:BasicShapes.octagon');
+ });
+
+ cy.cGet('#test-div-shapeHandlesSection').should('exist');
+
+ cy.then(() => {
+ win.app.map.sendUnoCommand('.uno:TransformDialog');
+ });
+ a11yHelper.handleDialog(win, 1);
+
+ cy.then(() => {
+ win.app.map.sendUnoCommand('.uno:FormatArea');
+ });
+ a11yHelper.handleDialog(win, 1);
+
+ // exit shape mode
+ helper.typeIntoDocument('{esc}');
+ });
+
+ it('PasteSpecial Dialog', function () {
+ // Select some text
+ helper.selectAllText();
+
+ helper.copy().then(() => {
+ return helper.processToIdle(win);
+ })
+ .then(() => {
+ win.app.map.sendUnoCommand('.uno:PasteSpecial');
+ });
+ a11yHelper.handleDialog(win, 1);
+ });
+
+ // TODO - create allImpressDialogs
+ allImpressDialogs.forEach(function (commandSpec) {
+ const command = typeof commandSpec === 'string' ? commandSpec : commandSpec.command;
+ it(`Impress Dialog ${command}`, function () {
+ a11yHelper.testDialog(win, commandSpec);
+ });
+ });
+
+});

"Parth Raiyani (via github)"

unread,
Mar 18, 2026, 5:07:49 PMMar 18
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js | 11 +---------
1 file changed, 2 insertions(+), 9 deletions(-)

New commits:
commit 36768417d6323b55d5a7d7a4db60d9fa32f2903b
Author: Parth Raiyani <parth....@collabora.com>
AuthorDate: Tue Mar 17 19:05:29 2026 +0530
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Wed Mar 18 21:06:46 2026 +0000

a11y: all dialogs are now passing for calc

Signed-off-by: Parth Raiyani <parth....@collabora.com>
Change-Id: I204f4d60eeb8e845acfd5417749a4426819b8bb7

diff --git a/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js b/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js
index 544f3bd30e..ef0274b3e5 100644
--- a/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js
@@ -35,11 +35,11 @@ const allCalcDialogs = [
'.uno:InsertCell',
'.uno:InsertObjectChart',
'.uno:InsertSparkline',
- // '.uno:JumpToTable',
+ '.uno:JumpToTable',
'.uno:Move?FromContextMenu:bool=true&MoveOrCopySheetDialog:bool=true&ContextMenuIndex=0',
'.uno:MovingAverageDialog',
'.uno:PageFormatDialog',
- // '.uno:Protect',
+ '.uno:Protect',
'.uno:RegressionDialog',
'.uno:RowHeight',
'.uno:SamplingDialog',
@@ -62,13 +62,6 @@ const excludedCommonDialogs = [

// don't pass yet
const buggyCalcDialogs = [
- '.uno:DataFilterSpecialFilter',
- '.uno:DataFilterStandardFilter',
- '.uno:DefineDBName',
- '.uno:EditPrintArea',
- '.uno:FunctionDialog',
- '.uno:PageFormatDialog',
- '.uno:Validation',
];

describe(['tagdesktop'], 'Accessibility Calc Dialog Tests', { testIsolation: false }, function () {

"Andras Timar (via github)"

unread,
Mar 19, 2026, 5:01:07 AMMar 19
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js | 2 ++
1 file changed, 2 insertions(+)

New commits:
commit 958e4a1b1df8bf821e0d8c7a30caddc4c01fdf40
Author: Andras Timar <andras...@collabora.com>
AuthorDate: Wed Mar 18 10:57:00 2026 +0100
Commit: Miklos Vajna <vmi...@collabora.com>
CommitDate: Thu Mar 19 10:00:28 2026 +0100

cypress: fix flaky ReadOnly info dialog a11y test

Wait for processToIdle after InsertSection command before pressing
Delete. Without this, the section protection may not be applied yet,
so the read-only warning dialog never appears and the test fails.

Signed-off-by: Andras Timar <andras...@collabora.com>
Change-Id: I4fbfc5548246b490e5a0171a6cc2c3e4d022163a

diff --git a/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js b/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
index 8740117554..b0bc113d7c 100644
--- a/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
@@ -373,6 +373,8 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f
cy.then(() => {
win.app.map.sendUnoCommand('.uno:InsertSection?RegionProtect:bool=true');
});
+ // Wait for the section protection to be applied before trying to delete
+ cy.then(() => helper.processToIdle(win));
helper.typeIntoDocument('{del}');
a11yHelper.handleDialog(win, 1);
});

"Miklos Vajna (via github)"

unread,
Mar 19, 2026, 5:43:55 AMMar 19
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

New commits:
commit bed92f88b9f105032dca631354b3b637618d444a
Author: Miklos Vajna <vmi...@collabora.com>
AuthorDate: Wed Mar 18 14:46:03 2026 +0100
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Thu Mar 19 09:42:49 2026 +0000

cypress desktop: increase tolerance in calc/chart_dialog_spec.js

Chart wizard width was required to be inside 400...415 pixels, but this
failed locally with:

> Timed out retrying after 10000ms
> + expected - actual
> -397.609375
> +400

Signed-off-by: Miklos Vajna <vmi...@collabora.com>
Change-Id: Ib62e16cbda1b32243a6b2ef67f1b40365bfeb3e6

diff --git a/cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js b/cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js
index 9470ba7805..f952ce6f5a 100644
--- a/cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js
@@ -53,7 +53,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Chart dialog tests', funct
* tests if the width of the 'chart wizard' is larger than a "reasonable"
* width and if it's larger that means something is obviously wrong, probably
* some css property.
- * `reasonableWidth` = width at the time of writing this test + 15px ;)
+ * `reasonableWidth` = width at the time of writing this test +- 15px ;)
*/
it('Chart Wizard width', function() {
cy.cGet('#Insert-tab-label').click();
@@ -62,6 +62,6 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Chart dialog tests', funct
cy.cGet('#CHART2_HID_SCH_WIZARD_ROADMAP')
.should('be.visible')
.invoke('width')
- .should('be.greaterThan', 400).and('be.lessThan',415);
+ .should('be.greaterThan', 385).and('be.lessThan',415);
});
});

"Caolán McNamara (via github)"

unread,
Mar 20, 2026, 1:03:08 PMMar 20
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/desktop_helper.js | 20 ++++++++++------
1 file changed, 13 insertions(+), 7 deletions(-)

New commits:
commit 2ff2523ab48827ab2a4d53acbdcba2173e208fed
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Fri Mar 20 15:15:39 2026 +0000
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Fri Mar 20 17:02:34 2026 +0000

try to make various annotation tests more reliable

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I2d1c2179d2329a0713736aa06e57046d9760624a

diff --git a/cypress_test/integration_tests/common/desktop_helper.js b/cypress_test/integration_tests/common/desktop_helper.js
index e7506cc617..b477f6e1ce 100644
--- a/cypress_test/integration_tests/common/desktop_helper.js
+++ b/cypress_test/integration_tests/common/desktop_helper.js
@@ -297,9 +297,16 @@ function insertComment(text = 'some text0', save = true) {
cy.cGet('#menu-insertcomment').click();
}

- // Use .last() because there might be multiple comments
- cy.cGet('.cool-annotation').last({log: false}).find('#annotation-modify-textarea-new').should('not.have.attr','disabled');
- cy.cGet('.cool-annotation').last({log: false}).find('#annotation-modify-textarea-new').type(text);
+ // Wait for the annotation to be created
+ cy.cGet('.cool-annotation').last({log: false}).find('#annotation-modify-textarea-new').should('exist');
+ // Wait for core to process and layouting to settle so the textarea has its final ID
+ cy.getFrameWindow().then(function(win) {
+ return helper.processToIdle(win);
+ });
+
+ // Use class selector since processToIdle may have caused the textarea ID to change from 'new' to a number
+ cy.cGet('.cool-annotation').last({log: false}).find('.modify-annotation .cool-annotation-textarea').should('not.have.attr','disabled');
+ cy.cGet('.cool-annotation').last({log: false}).find('.modify-annotation .cool-annotation-textarea').type(text);
// Check that comment exists
cy.cGet('.cool-annotation').last({log: false}).find('.cool-annotation-textarea').should('contain',text);

@@ -313,10 +320,9 @@ function insertComment(text = 'some text0', save = true) {

// Wait for the animation to stop
cy.cGet('.cool-annotation').last({log: false}).invoke('attr','style').should('not.contain','transition');
- // Need to wait even longer so that modify and reply work
- // TODO: Find out why newly typed text gets overwritten, find
- // a way to query for it, and wait only in relevant tests
- cy.wait(500);
+ cy.getFrameWindow().then(function(win) {
+ return helper.processToIdle(win);
+ });
} else {
cy.cGet('.cool-annotation').last({log: false}).find('.cool-annotation-content').should('not.be.visible');
cy.cGet('.cool-annotation').last({log: false}).find('.modify-annotation').should('be.visible');

"Mohit Marathe (via github)"

unread,
Mar 23, 2026, 5:04:04 AMMar 23
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/impress_helper.js | 13 ++++++++--
cypress_test/integration_tests/desktop/impress/undo_redo_spec.js | 4 +++
2 files changed, 15 insertions(+), 2 deletions(-)

New commits:
commit d9c3ec604a69706c271f2ba3064c7f07fb2ed91c
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Sat Mar 21 23:52:24 2026 +0530
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Mon Mar 23 09:03:33 2026 +0000

cypress: make impress/undo_redo_spec more reliable

Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Change-Id: Ia76aaa9392e07ceef5bfe47735bd8a2a6d4f982d

diff --git a/cypress_test/integration_tests/common/impress_helper.js b/cypress_test/integration_tests/common/impress_helper.js
index d64695024e..23cd34e852 100644
--- a/cypress_test/integration_tests/common/impress_helper.js
+++ b/cypress_test/integration_tests/common/impress_helper.js
@@ -136,8 +136,17 @@ function removeShapeSelection() {
helper.processToIdle(win);
});

- cy.cGet('body').type('{esc}');
- cy.cGet('body').type('{esc}');
+ helper.typeIntoDocument('{esc}');
+
+ cy.getFrameWindow().then(function(win) {
+ helper.processToIdle(win);
+ });
+
+ helper.typeIntoDocument('{esc}');
+
+ cy.getFrameWindow().then(function(win) {
+ helper.processToIdle(win);
+ });

cy.cGet('#document-container')
.should(function(overlay) {
diff --git a/cypress_test/integration_tests/desktop/impress/undo_redo_spec.js b/cypress_test/integration_tests/desktop/impress/undo_redo_spec.js
index 60b85ff751..3583c59458 100644
--- a/cypress_test/integration_tests/desktop/impress/undo_redo_spec.js
+++ b/cypress_test/integration_tests/desktop/impress/undo_redo_spec.js
@@ -52,8 +52,10 @@ describe(['tagdesktop'], 'Editing Operations', function() {
function undo(win) {
helper.processToIdle(win);
helper.typeIntoDocument('Hello World');
+ helper.processToIdle(win);
expectTypedText();
helper.typeIntoDocument('{ctrl+z}');
+ helper.processToIdle(win);
expectInitialText();
}

@@ -73,9 +75,11 @@ describe(['tagdesktop'], 'Editing Operations', function() {
it('Repair Document', function() {
helper.setDummyClipboardForCopy();
helper.typeIntoDocument('Hello World');
+ helper.processToIdle(this.win);
impressHelper.triggerNewSVGForShapeInTheCenter();
impressHelper.dblclickOnSelectedShape();
helper.typeIntoDocument('Overwrite Text');
+ helper.processToIdle(this.win);
impressHelper.triggerNewSVGForShapeInTheCenter();
repairHelper.rollbackPastChange('Undo', false, true);
impressHelper.triggerNewSVGForShapeInTheCenter();

"Caolán McNamara (via github)"

unread,
Mar 26, 2026, 12:54:39 AMMar 26
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/desktop_helper.js | 4 ++++
1 file changed, 4 insertions(+)

New commits:
commit 34fa6b97c1ea59a9ef116bd0f0538cc042decf7e
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Thu Mar 19 22:19:55 2026 +0000
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Thu Mar 26 10:23:57 2026 +0530

cypress: improve annotation_spec.js Reply autosave cancel stability

Failure context for 'Reply autosave cancel':
cy:command ✔ find #annotation-modify-textarea-new
cy:command ✔ type some text0
cy:command ✔ cGet .cool-annotation
cy:command ✔ find .cool-annotation-textarea
cy:command ✘ assert expected **[ <div#annotation-modify-textarea-1.cool-annotation-textarea>, 1 more... ]** to contain **some text0**
cy:command ✔ fail:
Test failed: integration_tests/desktop/writer/annotation_spec.js / Annotation Autosave Tests / Reply autosave cancel

Timed out retrying after 10000ms: expected '[ <div#annotation-modify-textarea-1.cool-annotation-textarea>, 1 more... ]' to contain 'some text0'

/home/collabora/jenkins/workspace/github_online_master_debug_vs_co-26.04_cypress_desktop/cypress_test/integration_tests/common/desktop_helper.js:234:88
232 | cy.cGet('.cool-annotation').last({ log: false }).find('#annotation-modify-textarea-new').type(text);
233 | // Check that comment exists
> 234 | cy.cGet('.cool-annotation').last({ log: false }).find('.cool-annotation-textarea').should('contain', text);
| ^
235 | ...
cy:log ✱ Finishing test: integration_tests/desktop/writer/annotation_spec.js / Annotation Autosave Tests / Reply autosave cancel
Builds:
- desktop#986

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I450b94901b6e8efc2b8eb488d1e1f20140b10d11

diff --git a/cypress_test/integration_tests/common/desktop_helper.js b/cypress_test/integration_tests/common/desktop_helper.js
index fe3db74fc2..459a5788f8 100644
--- a/cypress_test/integration_tests/common/desktop_helper.js
+++ b/cypress_test/integration_tests/common/desktop_helper.js
@@ -288,6 +288,10 @@ function closeNavigatorSidebar () {
function insertComment(text = 'some text0', save = true) {
cy.log('>> insertComment - start');

+ cy.getFrameWindow().then(function(win) {
+ return helper.processToIdle(win);
+ });
+
var mode = Cypress.env('USER_INTERFACE');
if (mode === 'notebookbar') {
cy.cGet('#Insert-tab-label').click();

"Mohit Marathe (via github)"

unread,
Mar 26, 2026, 2:52:32 AMMar 26
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit 04bca66bd208cb4c4a7f2a153b40106a0d22fb9c
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Wed Mar 25 19:29:10 2026 +0530
Commit: Szymon Kłos <eszk...@gmail.com>
CommitDate: Thu Mar 26 07:51:25 2026 +0100

cypress: widen the width tolerance in chart wizard width test

Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Change-Id: I1478c87ee17f31cc150cd4b92f3b446bdbe7bffd

diff --git a/cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js b/cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js
index f952ce6f5a..c57f845833 100644
--- a/cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js
@@ -62,6 +62,6 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Chart dialog tests', funct
cy.cGet('#CHART2_HID_SCH_WIZARD_ROADMAP')
.should('be.visible')
.invoke('width')
- .should('be.greaterThan', 385).and('be.lessThan',415);
+ .should('be.greaterThan', 380).and('be.lessThan', 450);
});
});

"Szymon Kłos (via github)"

unread,
Mar 27, 2026, 5:59:13 AMMar 27
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/notebookbar_spec.js | 31 ++++++++++
1 file changed, 31 insertions(+)

New commits:
commit 13830fc1cf2a2ffb4cd61b97692f4c228b71c1f4
Author: Szymon Kłos <szymo...@collabora.com>
AuthorDate: Fri Mar 27 06:50:45 2026 +0000
Commit: Szymon Kłos <eszk...@gmail.com>
CommitDate: Fri Mar 27 10:58:26 2026 +0100

cypress: check if groups do not collapse on mode switch

- related to #14244

Signed-off-by: Szymon Kłos <szymo...@collabora.com>
Change-Id: I7013d3cab7a7cebbfb03e3c60a33dbfbbbd442ca

diff --git a/cypress_test/integration_tests/desktop/writer/notebookbar_spec.js b/cypress_test/integration_tests/desktop/writer/notebookbar_spec.js
index 9c9bec3d15..a25d35efdb 100644
--- a/cypress_test/integration_tests/desktop/writer/notebookbar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/notebookbar_spec.js
@@ -39,6 +39,37 @@ describe(['tagdesktop'], 'Notebookbar tests.', function() {
checkCollapsedGroups();
});

+ it('OverflowGroup collapse state preserved after mode switch', function() {
+ cy.viewport(1280, 600);
+ helper.processToIdle(this.win);
+
+ // At this width some groups should be collapsed and some expanded
+ cy.cGet('.notebookbar .ui-overflow-group:not(.nofold):not(.ui-overflow-group-container-with-label)')
+ .should('have.length.greaterThan', 0);
+ cy.cGet('.notebookbar .ui-overflow-group.ui-overflow-group-container-with-label')
+ .should('have.length.greaterThan', 0);
+
+ // Save the number of expanded groups before switching
+ cy.cGet('.notebookbar .ui-overflow-group.ui-overflow-group-container-with-label')
+ .then($expanded => cy.wrap($expanded.length).as('expandedCount'));
+
+ // Switch to compact UI via View tab
+ desktopHelper.switchUIToCompact();
+ // Switch back to notebookbar via View menu
+ desktopHelper.switchUIToNotebookbar();
+
+ // Wait for layout stabilization after mode switch
+ cy.getFrameWindow().then((win) => {
+ helper.processToIdle(win);
+ });
+
+ // Verify the number of expanded groups is preserved (bug: all were collapsed)
+ cy.get('@expandedCount').then(expandedCount => {
+ cy.cGet('.notebookbar .ui-overflow-group.ui-overflow-group-container-with-label')
+ .should('have.length', expandedCount);
+ });
+ });
+
it('Apply bold font from dropdown in Format tab', function() {
helper.setDummyClipboardForCopy();
cy.cGet('.notebookbar #Format-tab-label').click();

"Caolán McNamara (via github)"

unread,
Mar 30, 2026, 9:49:26 AMMar 30
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/spinfield_spec.js | 28 ++++++++++
1 file changed, 28 insertions(+)

New commits:
commit 164c859ce895f0cbbd69d261545b0e24e23be00e
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Sat Mar 28 20:01:10 2026 +0000
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Mon Mar 30 14:49:15 2026 +0100

cypress: add a11y test for kerning spinfield label in spacing popover

The "Custom Value" label in the sidebar character spacing popover was
not programmatically associated with the kerning spinfield input. The
input had a stale aria-label containing the numeric value instead of
being labeled by a proper <label> element.

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Ie25bd2959c93c8ae71a25570997fd3263f054bf6

diff --git a/cypress_test/integration_tests/desktop/writer/spinfield_spec.js b/cypress_test/integration_tests/desktop/writer/spinfield_spec.js
index 63eeffdb99..ea1e5376cd 100644
--- a/cypress_test/integration_tests/desktop/writer/spinfield_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/spinfield_spec.js
@@ -1,6 +1,7 @@
/* global describe it cy require beforeEach expect */

var helper = require('../../common/helper');
+var desktopHelper = require('../../common/desktop_helper');

describe(['tagdesktop'], 'Spinfield unit and button tests', function () {
var win;
@@ -214,6 +215,33 @@ describe(['tagdesktop'], 'Spinfield unit and button tests', function () {
});
});

+ it('Kerning spinfield is labelled by Custom Value label', function () {
+ desktopHelper.switchUIToNotebookbar();
+ cy.cGet('#sidebar-dock-wrapper').should('be.visible');
+
+ // Click the dropdown arrow on the Spacing toolbar button
+ // in the sidebar to open the TextCharacterSpacingControl popover
+ cy.cGet('#sidebar-dock-wrapper .unoSpacing .arrowbackground').click();
+
+ cy.cGet('.jsdialog-window.modalpopup').should('exist');
+ cy.then(function () {
+ return helper.processToIdle(win);
+ });
+
+ // The kerning spinfield should be labeled by a <label> element
+ // with text "Custom Value", not have a stale aria-label
+ // containing the current numeric value.
+ cy.cGet('label[for="kerning-input"]').should('exist')
+ .should('contain.text', 'Custom Value');
+ cy.cGet('#kerning-input').should('not.have.attr', 'aria-label');
+
+ // Change the value and verify the label still says "Custom Value"
+ // and no aria-label with the old value reappears.
+ cy.cGet('#kerning-input').clear().type('1.5');
+ cy.cGet('#kerning-input').should('not.have.attr', 'aria-label');
+ cy.cGet('label[for="kerning-input"]').should('contain.text', 'Custom Value');
+ });
+
it('Buttons enabled after re-enabling spinfield in columns dialog', function () {
cy.then(function () {
win.app.map.sendUnoCommand('.uno:FormatColumns');

"Caolán McNamara (via github)"

unread,
Apr 1, 2026, 12:24:37 AMApr 1
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/initial_socket_retry_spec.js | 12 +++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)

New commits:
commit ce3e37bda04d3818247bd4bfbd517566345eb7fe
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Tue Mar 31 23:17:02 2026 +0100
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Wed Apr 1 09:53:46 2026 +0530

improve the reliability of the initial socket retry test

there's some notebookbar reinit problem here, but that's not what
this is trying to test, it want's to test if an initial websocket
failure is retried, which is it.

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Id9577ecd249530d6d662b8c89059521cb5cdc9a8

diff --git a/cypress_test/integration_tests/desktop/writer/initial_socket_retry_spec.js b/cypress_test/integration_tests/desktop/writer/initial_socket_retry_spec.js
index d81a6f6dc6..c576958057 100644
--- a/cypress_test/integration_tests/desktop/writer/initial_socket_retry_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/initial_socket_retry_spec.js
@@ -31,6 +31,16 @@ describe(['tagdesktop'], 'Initial WebSocket connection retry', function() {
// With the fix the first WebSocket closes but the client
// retries and the document loads on the second attempt.
// Without the fix this times out.
- helper.documentChecks();
+ //
+ // Only check that the document actually loaded. The full
+ // documentChecks() also waits for notebookbar and sidebar
+ // initialization which can be disrupted by the socket
+ // retry flow (the notebookbar container is replaced during
+ // re-initialization but the initialized flag is not reset).
+ var timeout = Cypress.config('defaultCommandTimeout') * 2.0;
+ cy.cGet('#document-canvas', {timeout: timeout})
+ .should('be.visible');
+ cy.cGet('#map', {timeout: timeout})
+ .should('have.class', 'initialized');
});
});

"Jaume Pujantell (via github)"

unread,
Apr 8, 2026, 7:56:17 AMApr 8
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/annotation_spec.js | 22 ++++++++++
1 file changed, 22 insertions(+)

New commits:
commit 277a25419bf7333d1fa7433d9894d903a012d39e
Author: Jaume Pujantell <jaume.p...@collabora.com>
AuthorDate: Tue Mar 31 17:11:49 2026 +0200
Commit: JaumePujantell <jaumepu...@gmail.com>
CommitDate: Wed Apr 8 13:56:06 2026 +0200

add test for comment width

This is a test for commit 5ff7f519f66a02ad76d9eb2ffd030093e327279b
(browser: do not let comments get too slim).

Signed-off-by: Jaume Pujantell <jaume.p...@collabora.com>
Change-Id: I5ff0e58230d2753ee6ec191d5c10e160c5adc72d

diff --git a/cypress_test/integration_tests/desktop/writer/annotation_spec.js b/cypress_test/integration_tests/desktop/writer/annotation_spec.js
index f98cc99a2d..66d5d6d673 100644
--- a/cypress_test/integration_tests/desktop/writer/annotation_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/annotation_spec.js
@@ -382,6 +382,28 @@ describe(['tagdesktop'], 'Annotation Tests', function() {
});
});

+ it('Annotation minimum width', function () {
+ cy.viewport(1920, 1080); // Let's have plenty of space
+ desktopHelper.insertComment();
+
+ cy.cGet('.cool-annotation-content-wrapper').should('exist');
+ cy.cGet('#annotation-content-area-1').should('contain', 'some text');
+
+ // Add several nested replies to create a deep thread
+ const replyCount = 5;
+ for (let i = 1; i <= replyCount; i++) {
+ cy.cGet('#comment-annotation-menu-' + i).click();
+ cy.cGet('body').contains('.context-menu-item', 'Reply').click();
+ cy.cGet('#annotation-reply-textarea-' + i).type('reply ' + i);
+ cy.cGet('#annotation-reply-' + i).click();
+ cy.cGet('#annotation-content-area-' + (i + 1)).should('contain', 'reply ' + i);
+ }
+
+ // Check that the last reply content is wide enough
+ cy.cGet('#comment-container-' + (replyCount + 1) + ' .cool-annotation-content')
+ .should(el => expect(el.width()).gte(200));
+ });
+
});

describe(['tagdesktop'], 'Collapsed Annotation Tests', function() {

"Mohit Marathe (via github)"

unread,
Apr 12, 2026, 4:29:40 PMApr 12
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/annotation_spec.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit 6ffd313ea7a666b0ae65df7be65d2bae1ee927ab
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Sun Apr 12 17:05:14 2026 +0530
Commit: Caolán McNamara <cao...@gmail.com>
CommitDate: Sun Apr 12 21:28:32 2026 +0100

cypress: fix selector for dropdown item in writer/annotation_spec.js

Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Change-Id: I9cd783eaa18be440d1f65e9ed271d6e55ccbbb1f

diff --git a/cypress_test/integration_tests/desktop/writer/annotation_spec.js b/cypress_test/integration_tests/desktop/writer/annotation_spec.js
index 66d5d6d673..d3471c9a8a 100644
--- a/cypress_test/integration_tests/desktop/writer/annotation_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/annotation_spec.js
@@ -393,7 +393,7 @@ describe(['tagdesktop'], 'Annotation Tests', function() {
const replyCount = 5;
for (let i = 1; i <= replyCount; i++) {
cy.cGet('#comment-annotation-menu-' + i).click();
- cy.cGet('body').contains('.context-menu-item', 'Reply').click();
+ cy.cGet('body').contains('.ui-combobox-entry', 'Reply').click();
cy.cGet('#annotation-reply-textarea-' + i).type('reply ' + i);
cy.cGet('#annotation-reply-' + i).click();

"Caolán McNamara (via github)"

unread,
Apr 13, 2026, 11:51:21 AMApr 13
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/mobile_helper.js | 8 +++++-
cypress_test/integration_tests/mobile/impress/annotation_spec.js | 12 ++++++++++
2 files changed, 18 insertions(+), 2 deletions(-)

New commits:
commit 27f5dab73ec3aadb7bc1490b1bcfecf3236fd487
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Mon Apr 13 13:00:20 2026 +0000
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Mon Apr 13 21:20:18 2026 +0530

make mobile/impress/annotation_spec.js more reliable

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Icbb045961d8f998e8a70e77c2b5c67271f903a21

diff --git a/cypress_test/integration_tests/common/mobile_helper.js b/cypress_test/integration_tests/common/mobile_helper.js
index 6979c09123..fd482a274b 100644
--- a/cypress_test/integration_tests/common/mobile_helper.js
+++ b/cypress_test/integration_tests/common/mobile_helper.js
@@ -312,10 +312,14 @@ function insertComment(skipCommentCheck = false) {
cy.cGet('.cool-annotation-table').should('exist');
cy.cGet('#input-modal-input').type('some text');
cy.cGet('#response-ok').click();
- cy.wait(2000); // FIXME: skip DocModified message
+
+ // Wait for core to process the comment insertion
+ cy.getFrameWindow().then((win) => {
+ helper.processToIdle(win);
+ });

if (!skipCommentCheck) {
- cy.cGet('[id^=comment-container-]').should('exist').wait(300);
+ cy.cGet('[id^=comment-container-]').should('exist');
cy.cGet('[id^=annotation-content-area-]').should('be.visible');
cy.cGet('[id^=annotation-content-area-]').should('have.text', 'some text');
}
diff --git a/cypress_test/integration_tests/mobile/impress/annotation_spec.js b/cypress_test/integration_tests/mobile/impress/annotation_spec.js
index 6aa8129c15..b0d9a670c7 100644
--- a/cypress_test/integration_tests/mobile/impress/annotation_spec.js
+++ b/cypress_test/integration_tests/mobile/impress/annotation_spec.js
@@ -10,6 +10,10 @@ describe(['tagmobile'], 'Annotation tests.', function() {
newFilePath = helper.setupAndLoadDocument('impress/annotation.odp');

mobileHelper.enableEditingMobile();
+
+ cy.getFrameWindow().then(function(win) {
+ this.win = win;
+ });
});

it('Saving comment.', function() {
@@ -17,6 +21,9 @@ describe(['tagmobile'], 'Annotation tests.', function() {

mobileHelper.selectHamburgerMenuItem(['File', 'Save']);

+ // Wait for save to complete before reloading
+ helper.processToIdle(this.win);
+
helper.reloadDocument(newFilePath);

mobileHelper.enableEditingMobile();
@@ -37,6 +44,9 @@ describe(['tagmobile'], 'Annotation tests.', function() {
cy.cGet('#input-modal-input').type('{end}');
cy.cGet('#input-modal-input').type('modified');
cy.cGet('#response-ok').click();
+
+ helper.processToIdle(this.win);
+
cy.cGet('#toolbar-up #comment_wizard').click();
cy.cGet('[id^=annotation-content-area-]').should('exist');
cy.cGet('[id^=annotation-content-area-]').should('have.text', 'some textmodified');
@@ -50,6 +60,8 @@ describe(['tagmobile'], 'Annotation tests.', function() {

mobileHelper.selectAnnotationMenuItem('Remove');

+ helper.processToIdle(this.win);
+
cy.cGet('#mobile-wizard .wizard-comment-box .cool-annotation-content').should('not.exist');
cy.cGet('.annotation-marker').should('not.exist');
});

"Caolán McNamara (via github)"

unread,
Apr 14, 2026, 3:37:29 AMApr 14
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/helper.js | 6 ++++
cypress_test/integration_tests/desktop/impress/annotation_spec.js | 15 ++++++++++
2 files changed, 21 insertions(+)

New commits:
commit 8010c0961180f50743a285346e1695023fc0b31e
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Mon Apr 13 19:07:41 2026 +0000
Commit: Mohit Marathe <mohitm...@proton.me>
CommitDate: Tue Apr 14 13:07:06 2026 +0530

improve stability of desktop/impress/annotation_spec.js test

CypressError: `cy.visit()` failed trying to load:
...
Error: connect ECONNREFUSED 127.0.0.1:9900

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Ie9e0298ebf70bbdfad3d03c635f4d376d18f1e50

diff --git a/cypress_test/integration_tests/common/helper.js b/cypress_test/integration_tests/common/helper.js
index e344b5f694..e63873847c 100644
--- a/cypress_test/integration_tests/common/helper.js
+++ b/cypress_test/integration_tests/common/helper.js
@@ -141,6 +141,12 @@ function reloadDocument(filePath) {
closeDocument(filePath);
loadDocument(filePath, /*skipDocumentChecks*/ true);

+ // loadDocument skips full documentChecks on reload, but we still
+ // need to wait for the document canvas to be visible before
+ // callers start asserting on document content.
+ cy.cGet('#document-canvas', {timeout: Cypress.config('defaultCommandTimeout') * 2.0})
+ .should('be.visible');
+
cy.log('<< reloadDocument - end');
}

diff --git a/cypress_test/integration_tests/desktop/impress/annotation_spec.js b/cypress_test/integration_tests/desktop/impress/annotation_spec.js
index ed5e7b7755..0af1f6fe25 100644
--- a/cypress_test/integration_tests/desktop/impress/annotation_spec.js
+++ b/cypress_test/integration_tests/desktop/impress/annotation_spec.js
@@ -135,6 +135,10 @@ describe(['tagdesktop'], 'Collapsed Annotation Tests', function() {

desktopHelper.closeNavigatorSidebar(); // we expand again on very narrow space so avoid it
desktopHelper.selectZoomLevel('50', false);
+
+ cy.getFrameWindow().then(function(win) {
+ this.win = win;
+ });
});

it('Insert', function() {
@@ -197,6 +201,7 @@ describe(['tagdesktop'], 'Collapsed Annotation Tests', function() {
cy.cGet('#map').focus();
cy.cGet('.cool-annotation-info-collapsed').should('be.not.visible');

+ helper.processToIdle(this.win);
helper.reloadDocument(newFilePath);
desktopHelper.closeNavigatorSidebar();
desktopHelper.getNbIcon('ModifyPage.selected').click();
@@ -272,6 +277,10 @@ describe(['tagdesktop'], 'Annotation Autosave Tests', function() {
// cy.cGet('#options-modify-page').click();

desktopHelper.selectZoomLevel('50', false);
+
+ cy.getFrameWindow().then(function(win) {
+ this.win = win;
+ });
});

it('Insert autosave', function() {
@@ -281,6 +290,7 @@ describe(['tagdesktop'], 'Annotation Autosave Tests', function() {
cy.cGet('.annotation-button-delete').should('be.visible');
cy.cGet('.cool-annotation-edit.modify-annotation').should('be.visible');

+ helper.processToIdle(this.win);
helper.reloadDocument(newFilePath);
cy.cGet('.annotation-marker').should('be.visible');
cy.cGet('.cool-annotation-content > div').should('have.text','some text0');
@@ -299,6 +309,7 @@ describe(['tagdesktop'], 'Annotation Autosave Tests', function() {
cy.cGet('.annotation-marker').should('be.visible');
cy.cGet('.cool-annotation-content > div').should('have.text','some text0');

+ helper.processToIdle(this.win);
helper.reloadDocument(newFilePath);
cy.cGet('.annotation-marker').should('be.visible');
cy.cGet('.cool-annotation-content > div').should('have.text','some text0');
@@ -317,6 +328,7 @@ describe(['tagdesktop'], 'Annotation Autosave Tests', function() {
cy.cGet('.annotation-marker').should('not.exist');
cy.cGet('.cool-annotation-content > div').should('not.exist');

+ helper.processToIdle(this.win);
helper.reloadDocument(newFilePath);
cy.cGet('.annotation-marker').should('not.exist');
cy.cGet('.cool-annotation-content > div').should('not.exist');
@@ -334,6 +346,7 @@ describe(['tagdesktop'], 'Annotation Autosave Tests', function() {
cy.cGet('.annotation-button-delete').should('be.visible');
cy.cGet('.cool-annotation-edit.modify-annotation').should('be.visible');

+ helper.processToIdle(this.win);
helper.reloadDocument(newFilePath);
cy.cGet('.annotation-marker').should('be.visible');
cy.cGet('.cool-annotation-content > div').should('have.text','some text0, some other text');
@@ -354,6 +367,7 @@ describe(['tagdesktop'], 'Annotation Autosave Tests', function() {
cy.cGet('[id^=annotation-content-area-]').should('have.text','some text0, some other text');
cy.cGet('.annotation-marker').should('be.visible');

+ helper.processToIdle(this.win);
helper.reloadDocument(newFilePath);
cy.cGet('.annotation-marker').should('be.visible');
cy.cGet('.cool-annotation-content > div').should('have.text','some text0, some other text');
@@ -374,6 +388,7 @@ describe(['tagdesktop'], 'Annotation Autosave Tests', function() {
cy.cGet('[id^=annotation-content-area-]').should('have.text','some text0');
cy.cGet('.annotation-marker').should('be.visible');

+ helper.processToIdle(this.win);
helper.reloadDocument(newFilePath);
cy.cGet('.annotation-marker').should('be.visible');
cy.cGet('.cool-annotation-content > div').should('have.text','some text0');

"Gülşah Köse (via github)"

unread,
Apr 17, 2026, 11:49:04 AM (12 days ago) Apr 17
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/navigator_spec.js | 29 ++++++++++
1 file changed, 29 insertions(+)

New commits:
commit eb55e52dd043837fb46026182005aeec4bd4df25
Author: Gülşah Köse <gulsa...@collabora.com>
AuthorDate: Fri Apr 17 17:16:50 2026 +0300
Commit: Szymon Kłos <eszk...@gmail.com>
CommitDate: Fri Apr 17 17:48:46 2026 +0200

Add cypress test for clicking image in navigation bar.

This test is written to test 1b878b2cde84e94462dd38b3a56db8d33b84d0c9

Signed-off-by: Gülşah Köse <gulsa...@collabora.com>
Change-Id: I0d85a40553f24ac4e586d12a0df421dbe3200a1a

diff --git a/cypress_test/integration_tests/desktop/writer/navigator_spec.js b/cypress_test/integration_tests/desktop/writer/navigator_spec.js
index fba4e91d3d..3b04835917 100644
--- a/cypress_test/integration_tests/desktop/writer/navigator_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/navigator_spec.js
@@ -97,6 +97,35 @@ describe(['tagdesktop'], 'Scroll through document, modify heading', function() {
desktopHelper.assertScrollbarPosition('vertical', 325, 360);
});

+ it('Jump to image when cursor not visible', function() {
+ // Regression test: when the text cursor is hidden, double-clicking
+ // an image in the navigator must still scroll the viewport to it.
+ // assertVisiblePage alone is not sufficient as #StatePageNumber
+ // reflects the selection's page (which core updates regardless of
+ // whether the viewport scrolls), so check the actual scrollbar.
+ expandSection('Images');
+
+ cy.cGet('#navigator-dock-wrapper').scrollTo(0,0, { ensureScrollable: false });
+
+ // Jump to a heading so a cursor exists at a known position.
+ cy.cGet('#contenttree').contains('.jsdialog.sidebar.ui-treeview-cell-text', 'Feedback').dblclick();
+ desktopHelper.assertVisiblePage(2, 2, 8);
+ desktopHelper.assertScrollbarPosition('vertical', 45, 75);
+
+ // Scroll document to the top so the text cursor is no longer visible.
+ desktopHelper.scrollWriterDocumentToTop();
+ desktopHelper.updateFollowingUsers();
+ desktopHelper.assertScrollbarPosition('vertical', 0, 10);
+
+ // Double-click an image on a different page (graphics10 is on page 5).
+ // Without the fix, _onUpdateCursor returns early because the text
+ // cursor is invisible, so the viewport never scrolls and the
+ // scrollbar stays near 0.
+ cy.cGet('#contenttree').contains('.jsdialog.sidebar.ui-treeview-cell-text', 'graphics10').dblclick();
+ desktopHelper.assertVisiblePage(5, 5, 8);
+ desktopHelper.assertScrollbarPosition('vertical', 100, 400);
+ });
+
it.skip('Jump to element. Document -> Navigator', function() {
// Move the cursor into elements in Document, and check
// if navigator contentTree scroll to the element and select that,

"Parth Raiyani (via cogithub)"

unread,
Apr 22, 2026, 7:44:43 AM (7 days ago) Apr 22
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/calc/cell_edit_spec.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit bfd0c42d92e1c92b03e475c0da93f6b80b8847a1
Author: Parth Raiyani <parth....@collabora.com>
AuthorDate: Tue Apr 21 21:28:13 2026 +0530
Commit: Miklos Vajna <vmi...@collabora.com>
CommitDate: Wed Apr 22 13:43:49 2026 +0200

test(cypress): remove 'only' from 'Redraw after undo' test

- 4ca8b00396a6e7869a64fb3b981c51601a0294c9 accidentally added 'only' which skips all other cypress test in cell_edit_spec.js

Signed-off-by: Parth Raiyani <parth....@collabora.com>
Change-Id: Ie9566dac9707f15e0520639c5b7ae278cb063d1b

diff --git a/cypress_test/integration_tests/desktop/calc/cell_edit_spec.js b/cypress_test/integration_tests/desktop/calc/cell_edit_spec.js
index 9c9b1c6d44..af3ef7767c 100644
--- a/cypress_test/integration_tests/desktop/calc/cell_edit_spec.js
+++ b/cypress_test/integration_tests/desktop/calc/cell_edit_spec.js
@@ -33,7 +33,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Test rendering of a cell o
cy.cGet('#document-container').compareSnapshot(expected, 0.02);
}

- it.only('Redraw after undo', function() {
+ it('Redraw after undo', function() {
// setup initial state
desktopHelper.assertScrollbarPosition('horizontal', 325, 355);
desktopHelper.assertScrollbarPosition('vertical', 235, 300);

"Miklos Vajna (via cogerrit)"

unread,
Apr 23, 2026, 4:04:45 AM (6 days ago) Apr 23
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/compare_changes_spec.js | 193 +++++++++-
1 file changed, 187 insertions(+), 6 deletions(-)

New commits:
commit 5e513710e58535d57bc9e0fce01191ffaaf97d2b
Author: Miklos Vajna <vmi...@collabora.com>
AuthorDate: Wed Apr 22 09:50:34 2026 +0200
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Thu Apr 23 08:04:02 2026 +0000

doc compare, cypress: restore 6 lost test cases in writer/compare_changes_spec.js

This went wrong in commit b3489f1f7ecc59d5c15ee3d2985e6dfa44a0b476
(Follow up improvements for compare changes view., 2026-04-07), which
probably wanted to rename compare_changes_scroll_spec.js to just
compare_changes_spec.js, that file was created in the meantime, the
conflict resolution went wrong and as a result we lost the tests.
Restore them, they luckily still all pass.

Change-Id: I4611538cec788f2e7a8cde36f3a14498c56cc4d2
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/1332
Tested-by: Jenkins CPCI <rel...@collaboraoffice.com>
Reviewed-by: Caolán McNamara <caolan....@collabora.com>

diff --git a/cypress_test/integration_tests/desktop/writer/compare_changes_spec.js b/cypress_test/integration_tests/desktop/writer/compare_changes_spec.js
index 7188a5601cdb..67b8622f6269 100644
--- a/cypress_test/integration_tests/desktop/writer/compare_changes_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/compare_changes_spec.js
@@ -1,9 +1,16 @@
-/* global describe it cy require expect */
+/* global describe it cy require expect Cypress */

var helper = require('../../common/helper');
var desktopHelper = require('../../common/desktop_helper');

-describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Compare Changes view with comments.', function() {
+describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Compare Changes view.', function() {
+
+ function loadDocument(fileName) {
+ cy.viewport(1400, 600);
+ helper.setupAndLoadDocument('writer/' + fileName);
+ desktopHelper.switchUIToNotebookbar();
+ cy.cGet('#Review-tab-label').click();
+ }

function enterCompareChangesMode() {
desktopHelper.getNbIconArrow('TrackChanges', 'Review').click();
@@ -13,10 +20,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Compare Changes view with

it('Comment does not overlap with page or sidebar.', function() {
// Given a document with a comment, sidebar is visible:
- cy.viewport(1400, 600);
- helper.setupAndLoadDocument('writer/track_changes_comment.docx');
- desktopHelper.switchUIToNotebookbar();
- cy.cGet('#Review-tab-label').click();
+ loadDocument('track_changes_comment.docx');
cy.cGet('#sidebar-dock-wrapper').should('be.visible');

// When changing to doc compare mode:
@@ -50,4 +54,181 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Compare Changes view with
});
});
});
+
+ // Regression test for: compare changes view: fix "scroll by pressing scrollbar" feature.
+ // Bug: In CompareChanges view, viewedRectangle.pY1 can be negative (due to
+ // yStart offset) even when scrolling is possible, so the scrollbar click was
+ // blocked. The fix uses canScrollVertical/canScrollHorizontal instead.
+ it('Scrollbar vertical scroll works in compare changes mode.', function() {
+ loadDocument('track_changes.odt');
+ enterCompareChangesMode();
+
+ cy.getFrameWindow().then(function(win) {
+ helper.processToIdle(win);
+ });
+
+ // Record initial viewY.
+ var initialViewY;
+ cy.getFrameWindow().then(function(win) {
+ var layout = win.app.activeDocument.activeLayout;
+ expect(layout.type).to.equal('ViewLayoutCompareChanges');
+ initialViewY = layout.scrollProperties.viewY;
+ });
+
+ // Scroll down using the scroll section offset API (simulates scrollbar drag).
+ cy.getFrameWindow().then(function(win) {
+ win.app.sectionContainer.getSectionWithName('scroll').scrollVerticalWithOffset(200);
+ });
+
+ // viewY should increase even though viewedRectangle.pY1 might be negative.
+ cy.getFrameWindow().then(function(win) {
+ cy.wrap(null).should(function() {
+ var layout = win.app.activeDocument.activeLayout;
+ expect(layout.scrollProperties.viewY, 'viewY after vertical scroll').to.be.greaterThan(initialViewY);
+ });
+ });
+ });
+
+ // Verify that canScrollVertical returns true in compare changes mode
+ // even when viewedRectangle.pY1 is negative (due to yStart offset).
+ it('canScrollVertical is true in compare changes mode.', function() {
+ loadDocument('track_changes.odt');
+ enterCompareChangesMode();
+
+ cy.getFrameWindow().then(function(win) {
+ helper.processToIdle(win);
+ });
+
+ cy.getFrameWindow().then(function(win) {
+ var layout = win.app.activeDocument.activeLayout;
+ var documentAnchor = win.app.sectionContainer.getSectionWithName(win.app.CSections.Tiles.name);
+
+ // canScrollVertical should be true (the document is taller than the viewport).
+ expect(layout.canScrollVertical(documentAnchor), 'canScrollVertical').to.be.true;
+ });
+ });
+
+ // Regression test for: comparechanges view: fix onresize and vertical scroll.
+ // Bug: When the browser window was resized, the compare changes layout was not
+ // refreshed, so the two side-by-side views were not repositioned correctly.
+ // The fix adds a resize handler that updates halfWidth and refreshes the view.
+ it('Resize updates compare changes layout.', function() {
+ loadDocument('track_changes.odt');
+ enterCompareChangesMode();
+
+ cy.getFrameWindow().then(function(win) {
+ helper.processToIdle(win);
+ });
+
+ // Ensure sidebar is closed so we start from a known state.
+ cy.cGet('#sidebar-dock-wrapper').then(function($el) {
+ if (Cypress.dom.isVisible($el[0])) {
+ desktopHelper.sidebarToggle();
+ cy.cGet('#sidebar-dock-wrapper').should('not.be.visible');
+ }
+ });
+
+ cy.getFrameWindow().then(function(win) {
+ helper.processToIdle(win);
+ });
+
+ // Record halfWidth with sidebar closed (full canvas width).
+ cy.getFrameWindow().then(function(win) {
+ var layout = win.app.activeDocument.activeLayout;
+ expect(layout.halfWidth, 'initial halfWidth').to.be.greaterThan(0);
+ cy.wrap(layout.halfWidth).as('initialHalfWidth');
+ });
+
+ // Open sidebar to reduce canvas width, which fires the resize event.
+ desktopHelper.sidebarToggle();
+ cy.cGet('#sidebar-dock-wrapper').should('be.visible');
+
+ // After sidebar opens, halfWidth should decrease since the
+ // document anchor section is narrower.
+ cy.get('@initialHalfWidth').then(function(initialHalfWidth) {
+ cy.getFrameWindow().then(function(win) {
+ cy.wrap(null, {timeout: 10000}).should(function() {
+ var newHalfWidth = win.app.activeDocument.activeLayout.halfWidth;
+ expect(newHalfWidth, 'halfWidth after sidebar toggle').to.not.equal(initialHalfWidth);
+ });
+ });
+ });
+ });
+
+ // Verify that viewSize covers both left and right document pages.
+ // Bug: viewSize.pX was calculated using halfWidth instead of full canvas width,
+ // so the horizontal extent did not account for both pages.
+ it('View size covers both pages in compare changes mode.', function() {
+ loadDocument('track_changes.odt');
+ enterCompareChangesMode();
+
+ cy.getFrameWindow().then(function(win) {
+ helper.processToIdle(win);
+ });
+
+ cy.getFrameWindow().then(function(win) {
+ var layout = win.app.activeDocument.activeLayout;
+ var documentAnchor = win.app.sectionContainer.getSectionWithName(win.app.CSections.Tiles.name);
+
+ // viewSize.pX should be at least as wide as the canvas (both pages fit).
+ expect(layout.viewSize.pX, 'viewSize.pX').to.be.at.least(documentAnchor.size[0]);
+ });
+ });
+
+ // Regression test for: compare changes view: tile rendering issue.
+ // Bug: The visible area rectangle (viewedRectangle) was too narrow, so tiles
+ // for the left page were not requested. The fix widens it to cover the full
+ // document width so that both left-side and right-side tiles are rendered.
+ it('Visible area covers full document width for tile rendering.', function() {
+ loadDocument('track_changes.odt');
+ enterCompareChangesMode();
+
+ cy.getFrameWindow().then(function(win) {
+ helper.processToIdle(win);
+ });
+
+ // The viewedRectangle should be wide enough to cover the full document.
+ cy.getFrameWindow().then(function(win) {
+ cy.wrap(null).should(function() {
+ var layout = win.app.activeDocument.activeLayout;
+ var docWidth = win.app.activeDocument.fileSize.pX;
+
+ // viewedRectangle width must cover the full document width (both pages
+ // need tiles from the same X range). The fix added margin, so the
+ // rectangle width should be >= document width.
+ expect(layout.viewedRectangle.width, 'viewedRectangle covers document width').to.be.at.least(docWidth);
+ });
+ });
+ });
+
+ // Verify both tile modes (LeftSide and RightSide) have content after the
+ // tile rendering fix. This complements the existing "View Changes mode has
+ // tiles for both modes" test by checking specifically after the visible area fix.
+ it('Both left and right side tiles have content after visible area fix.', function() {
+ loadDocument('track_changes.odt');
+ enterCompareChangesMode();
+
+ // Wait for tiles to be rendered.
+ cy.getFrameWindow().then(function(win) {
+ helper.processToIdle(win);
+ });
+
+ cy.getFrameWindow().then(function(win) {
+ cy.wrap(null).should(function() {
+ var tiles = win.TileManager.getTiles();
+ var hasMode1 = false;
+ var hasMode2 = false;
+ tiles.forEach(function(tile) {
+ if (tile.coords.mode === 1 && tile.hasContent() && tile.distanceFromView < Number.MAX_SAFE_INTEGER) {
+ hasMode1 = true;
+ }
+ if (tile.coords.mode === 2 && tile.hasContent() && tile.distanceFromView < Number.MAX_SAFE_INTEGER) {
+ hasMode2 = true;
+ }
+ });
+ expect(hasMode1, 'mode=1 (LeftSide) tiles with content').to.be.true;
+ expect(hasMode2, 'mode=2 (RightSide) tiles with content').to.be.true;
+ });
+ });
+ });
});

"Mike Kaganski (via cogerrit)"

unread,
4:22 AM (2 hours ago) 4:22 AM
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/draw/annotation_spec.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit b471edfbfc11737bca0b483499d2acd7ff8cedaf
Author: Mike Kaganski <mike.k...@collabora.com>
AuthorDate: Wed Apr 29 04:50:41 2026 +0500
Commit: Miklos Vajna <vmi...@collabora.com>
CommitDate: Wed Apr 29 08:21:36 2026 +0000

cypress: fix flake in PDF Resolve menu test

cy.getFrameWindow().then(...) runs once after the chain ahead of it
finishes - i.e., after the menu click is dispatched, but not after
the resolve UNO command round-trips back from core. On a slower CI
runner the OnAnnotationChanged notification hasn't updated Dave's
local data yet, and the assertion sees resolved='false' and fails.

Switch to cy.getFrameWindow().should(...) so the assertion block
retries until the round-trip completes (or the cypress timeout).
The neighbouring Get_Comments / GoToComment tests already use
.should() for the same reason.

Signed-off-by: Mike Kaganski <mike.k...@collabora.com>
Change-Id: I6daca41fc319bbbc8ec8d5410b7e2f10064fe5a4
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/1785
Reviewed-by: Miklos Vajna <vmi...@collabora.com>
Tested-by: Jenkins CPCI <rel...@collaboraoffice.com>

diff --git a/cypress_test/integration_tests/desktop/draw/annotation_spec.js b/cypress_test/integration_tests/desktop/draw/annotation_spec.js
index bafe28b029ed..441be83f20ff 100644
--- a/cypress_test/integration_tests/desktop/draw/annotation_spec.js
+++ b/cypress_test/integration_tests/desktop/draw/annotation_spec.js
@@ -90,7 +90,7 @@ describe(['tagdesktop'], 'PDF Threaded Comments', function() {
.click({ force: true });
});

- cy.getFrameWindow().then(function(win) {
+ cy.getFrameWindow().should(function(win) {
const dave = findCommentByAuthor(win, 'Dave');
expect(dave.sectionProperties.data.resolved).to.equal('true');
});

Reply all
Reply to author
Forward
0 new messages