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 AMApr 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 AMApr 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 AMApr 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,
Apr 29, 2026, 4:22:09 AMApr 29
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');
});

"Mike Kaganski (via cogerrit)"

unread,
Apr 29, 2026, 10:36:20 AMApr 29
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/draw/annotation_spec.js | 2 --
1 file changed, 2 deletions(-)

New commits:
commit 8089d6fc1c24ace4155d911edbe01beec1d2306a
Author: Mike Kaganski <mike.k...@collabora.com>
AuthorDate: Wed Apr 29 15:00:02 2026 +0500
Commit: Miklos Vajna <vmi...@collabora.com>
CommitDate: Wed Apr 29 14:36:13 2026 +0000

cypress: drop part-equality check from same-part Action_GoToComment test

scrollCommentIntoView fits the whole comment dialog into view, so for
an anchor near the bottom of page 1 (Alice's case here) the viewport
ends up straddling the page-1/page-2 boundary. ScrollSection's scroll
handlers then call CanvasTileLayer._checkSelectedPart, which reconciles
_selectedPart to whichever part is most visible - timing- and layout-
dependent, and sometimes ends up at part 1 on CI.

The test only added the equality check as a sanity guard, but it was
asserting an implementation detail rather than something users care
about. What matters is that the anchor is on screen and the dialog is
visible, both already covered by assertCommentShownAndAnchorVisible.

The cross-part Zoe sibling keeps its check: there the part flip is the
behaviour under test, not a side effect.

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

diff --git a/cypress_test/integration_tests/desktop/draw/annotation_spec.js b/cypress_test/integration_tests/desktop/draw/annotation_spec.js
index fd7b79b35ff3..dc032968505d 100644
--- a/cypress_test/integration_tests/desktop/draw/annotation_spec.js
+++ b/cypress_test/integration_tests/desktop/draw/annotation_spec.js
@@ -158,8 +158,6 @@ describe(['tagdesktop'], 'PDF Threaded Comments', function() {
});

cy.getFrameWindow().should(function(win) {
- expect(win.app.map._docLayer._selectedPart,
- 'current part unexpectedly changed').to.equal(0);
assertCommentShownAndAnchorVisible(win, 'Alice');
});
});

"Mike Kaganski (via cogerrit)"

unread,
Apr 30, 2026, 8:33:26 AMApr 30
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/draw/annotation_spec.js | 105 ++++++++++
1 file changed, 105 insertions(+)

New commits:
commit 202a5dc29d06b478a77be4b38c21153d4a8efc1d
Author: Mike Kaganski <mike.k...@collabora.com>
AuthorDate: Wed Apr 29 20:06:25 2026 +0500
Commit: Miklos Vajna <vmi...@collabora.com>
CommitDate: Thu Apr 30 12:32:42 2026 +0000

cypress: lock in drag-on-existing-area-no-op for PDF comments

Add a test asked about in gerrit review of commit
3673c9029f4e7a4ceb705dd75a7d4d8d82f651a5 (PDF comments: drag a
rectangle to anchor a comment over an area, 2026-04-29): when a
drag-to-area gesture starts on top of an existing area-anchored
comment, no new comment must be created. The CommentAnchorAreaSubSection
div catches mousedown and stops propagation, so the canvas-level
placement gesture is never armed - this test pins that behaviour.

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

diff --git a/cypress_test/integration_tests/desktop/draw/annotation_spec.js b/cypress_test/integration_tests/desktop/draw/annotation_spec.js
index dc032968505d..862e3c933002 100644
--- a/cypress_test/integration_tests/desktop/draw/annotation_spec.js
+++ b/cypress_test/integration_tests/desktop/draw/annotation_spec.js
@@ -638,4 +638,109 @@ describe(['tagdesktop'], 'PDF Threaded Comments', function() {
.to.equal(acked);
});
});
+
+ // Starting a drag-to-area gesture on top of an existing area-anchored
+ // comment must not create a new comment: the area sub-section catches
+ // mousedown and stops propagation, so the canvas placement gesture is
+ // never armed. Note: this tests the status quo; if you decide to change
+ // the behavior, just change the test.
+ it('Insert Comment starting over an existing area does not create a new one', { env: { 'pdf-view': true } }, function() {
+ const existingText = 'over-existing-area ' + Date.now();
+ let countWithExisting = 0;
+
+ // Create an existing area-anchored comment in the upper-left of page 1.
+ cy.getFrameWindow().then(function(win) {
+ win.app.map.insertComment();
+ });
+
+ cy.getFrameWindow().then(function(win) {
+ const canvas = win.document.getElementById('document-canvas');
+ const rect = canvas.getBoundingClientRect();
+ const docLayer = win.app.map._docLayer;
+ const sx = (docLayer._partWidthTwips * 0.10 * win.app.twipsToPixels) / win.app.dpiScale;
+ const sy = (docLayer._partHeightTwips * 0.10 * win.app.twipsToPixels) / win.app.dpiScale;
+ const ex = (docLayer._partWidthTwips * 0.30 * win.app.twipsToPixels) / win.app.dpiScale;
+ const ey = (docLayer._partHeightTwips * 0.20 * win.app.twipsToPixels) / win.app.dpiScale;
+ canvas.dispatchEvent(new win.MouseEvent('mousedown', {
+ clientX: rect.left + sx, clientY: rect.top + sy, button: 0, bubbles: true,
+ }));
+ canvas.dispatchEvent(new win.MouseEvent('mousemove', {
+ clientX: rect.left + ex, clientY: rect.top + ey, button: 0, bubbles: true,
+ }));
+ canvas.dispatchEvent(new win.MouseEvent('mouseup', {
+ clientX: rect.left + ex, clientY: rect.top + ey, button: 0, bubbles: true,
+ }));
+ });
+
+ cy.cGet('.cool-annotation').last({log: false})
+ .find('#annotation-modify-textarea-new').should('exist');
+ cy.getFrameWindow().then(function(win) { return helper.processToIdle(win); });
+ 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(existingText);
+ cy.cGet('.cool-annotation').last({log: false})
+ .find('[value="Save"]').click();
+
+ cy.getFrameWindow().should(function(win) {
+ const section = win.app.sectionContainer.getSectionWithName(
+ win.app.CSections.CommentList.name);
+ const acked = section.sectionProperties.commentList.find(function(c) {
+ return c.sectionProperties.data.text === existingText;
+ });
+ expect(acked, 'first comment must be saved').to.exist;
+ expect(acked.sectionProperties.commentAnchorAreaSubSection,
+ 'first comment must own an anchor-area sub-section').to.exist;
+ countWithExisting = section.sectionProperties.commentList.length;
+ });
+
+ // Re-enter placement mode and start a drag whose mousedown lands on
+ // the existing area. mousemove and mouseup are dispatched on the
+ // canvas to mimic a real drag - the area's mousedown stopPropagation
+ // should keep this from arming the gesture.
+ cy.getFrameWindow().then(function(win) {
+ win.app.map.insertComment();
+ });
+
+ cy.getFrameWindow().should(function(win) {
+ expect(win.document.getElementById('document-canvas').style.cursor,
+ 'placement mode must be active').to.equal('crosshair');
+ });
+
+ cy.getFrameWindow().then(function(win) {
+ const section = win.app.sectionContainer.getSectionWithName(
+ win.app.CSections.CommentList.name);
+ const acked = section.sectionProperties.commentList.find(function(c) {
+ return c.sectionProperties.data.text === existingText;
+ });
+ const div = acked.sectionProperties.commentAnchorAreaSubSection
+ .sectionProperties.objectDiv;
+ const r = div.getBoundingClientRect();
+ const canvas = win.document.getElementById('document-canvas');
+ const downX = r.left + r.width / 2;
+ const downY = r.top + r.height / 2;
+ const upX = r.right + 100;
+ const upY = r.bottom + 100;
+ div.dispatchEvent(new win.MouseEvent('mousedown', {
+ clientX: downX, clientY: downY, button: 0, bubbles: true,
+ }));
+ canvas.dispatchEvent(new win.MouseEvent('mousemove', {
+ clientX: upX, clientY: upY, button: 0, bubbles: true,
+ }));
+ canvas.dispatchEvent(new win.MouseEvent('mouseup', {
+ clientX: upX, clientY: upY, button: 0, bubbles: true,
+ }));
+ return helper.processToIdle(win);
+ });
+
+ cy.getFrameWindow().should(function(win) {
+ const section = win.app.sectionContainer.getSectionWithName(
+ win.app.CSections.CommentList.name);
+ expect(section.sectionProperties.commentList.length,
+ 'starting drag-to-area on an existing area must not add a comment')
+ .to.equal(countWithExisting);

"Szymon Kłos (via cogerrit)"

unread,
May 4, 2026, 5:35:26 AMMay 4
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/stylesview_spec.js | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)

New commits:
commit fd25ed82d0a35acabb71796f7cf5a68cc642baec
Author: Szymon Kłos <szymo...@collabora.com>
AuthorDate: Fri Apr 24 15:08:07 2026 +0000
Commit: Tomaž Vajngerl <tomaz.v...@collabora.com>
CommitDate: Mon May 4 09:35:05 2026 +0000

oox: adjust visible styles in tests

- in docx there is possible to hide styles
- adjust existing tests to the new behavior

Signed-off-by: Szymon Kłos <szymo...@collabora.com>
Change-Id: Ic3ce41a4072312ef38070b7d016f32232de8c10e
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/1597
Reviewed-by: Tomaž Vajngerl <tomaz.v...@collabora.com>
Tested-by: Jenkins CPCI <rel...@collaboraoffice.com>

diff --git a/cypress_test/integration_tests/desktop/writer/stylesview_spec.js b/cypress_test/integration_tests/desktop/writer/stylesview_spec.js
index 656523a06d29..81dfe81becb4 100644
--- a/cypress_test/integration_tests/desktop/writer/stylesview_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/stylesview_spec.js
@@ -13,11 +13,11 @@ describe(['tagdesktop'], 'Stylesview Iconview Tests', function() {
}

beforeEach(function() {
- cy.viewport(1920, 1080);
+ cy.viewport(1280, 720);
helper.setupAndLoadDocument('writer/styles.odt');
desktopHelper.switchUIToNotebookbar();
desktopHelper.sidebarToggle();
- cy.cGet('.notebookbar #stylesview').should('exist').should('be.visible');
+ cy.cGet('.notebookbar #stylesview').should('exist').should('be.visible').should('not.be.empty');
});

it('Scroll Up/Down Buttons', function() {
@@ -32,9 +32,9 @@ describe(['tagdesktop'], 'Stylesview Iconview Tests', function() {
});

it('Expander Button', function() {
+ cy.cGet('.jsdialog #stylesview_9').should('not.exist');
openExpander();
- cy.cGet('.jsdialog #stylesview_59').should('exist').should('be.visible'); // Contents 9
- cy.cGet('.jsdialog #stylesview_60').should('exist').should('not.be.visible');
+ cy.cGet('.jsdialog #stylesview_9').should('exist').should('be.visible');
});

it('Open Styles Sidebar Button', function() {
@@ -50,7 +50,7 @@ describe(['tagdesktop'], 'Stylesview Iconview Tests', function() {
cy.cGet('#StyleListDeck').should('exist').should('be.visible');
});

- it.only('Resize', function() {
+ it('Resize', function() {
// the dropdown should close on resize
openExpander();
cy.cGet('#stylesview-iconview-list-dropdown').should('exist').should('be.visible');

"Sahil Gautam (via cogerrit)"

unread,
May 5, 2026, 4:44:20 AMMay 5
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/statusbar_spec.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

New commits:
commit 7a1480564c5c6f30733defc2d14cd5493e9cc3f4
Author: Sahil Gautam <printfd...@gmail.com>
AuthorDate: Fri Apr 24 17:01:21 2026 +0530
Commit: Szymon Kłos <szymo...@collabora.com>
CommitDate: Tue May 5 08:43:09 2026 +0000

Revert "adjust test tolerances to match the new zoom behavior"

This reverts commit 383f2ed6685c00eb37f5fe7a6f4d931dd0daea11.

Signed-off-by: Sahil Gautam <sahil....@collabora.com>
Change-Id: Iea4b36ff1c22c7584a600981154341787d1cc3ae
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/1575
Tested-by: Jenkins CPCI <rel...@collaboraoffice.com>
Reviewed-by: Szymon Kłos <szymo...@collabora.com>

diff --git a/cypress_test/integration_tests/desktop/writer/statusbar_spec.js b/cypress_test/integration_tests/desktop/writer/statusbar_spec.js
index 12c034050d7a..8af4f3e39a7f 100644
--- a/cypress_test/integration_tests/desktop/writer/statusbar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/statusbar_spec.js
@@ -13,7 +13,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Statusbar tests.', functio
desktopHelper.showStatusBarIfHidden ();
}

- desktopHelper.shouldHaveZoomLevel('70');
+ desktopHelper.shouldHaveZoomLevel('100');
});

it('Text selection.', function() {
@@ -32,7 +32,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Statusbar tests.', functio
desktopHelper.assertScrollbarPosition('vertical', 0, 10);
cy.cGet('#toolbar-down #nextpage').click();
desktopHelper.assertVisiblePage(1, 2, 2);
- desktopHelper.assertScrollbarPosition('vertical',195, 205);
+ desktopHelper.assertScrollbarPosition('vertical',220, 230);
});

it('Text entering mode.', function() {

"Mohit Marathe (via cogerrit)"

unread,
May 6, 2026, 4:34:11 AMMay 6
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/helper.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit 3597250447933e505e8b602ea19268827545df21
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Wed May 6 09:53:14 2026 +0530
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Wed May 6 08:33:34 2026 +0000

cypress: extend waitUntilCoreIsIdle retry window to 20s

Under heavy CI load, the default 10s retry window expires before
the unocommandresult of .uno:ReportWhenIdle arrives, causing
intermittent failures.

Change-Id: Icf9c1a6b2dc181e2a689c537f1f9085917465b16
Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2067
Reviewed-by: Caolán McNamara <caolan....@collabora.com>
Tested-by: Caolán McNamara <caolan....@collabora.com>

diff --git a/cypress_test/integration_tests/common/helper.js b/cypress_test/integration_tests/common/helper.js
index e63873847c64..d957ee67bcfc 100644
--- a/cypress_test/integration_tests/common/helper.js
+++ b/cypress_test/integration_tests/common/helper.js
@@ -1301,7 +1301,7 @@ function waitUntilCoreIsIdle(win) {
win.app.socket.sendMessage('uno .uno:ReportWhenIdle ' + JSON.stringify(idleArgs));
});

- cy.wrap(null).should(function() {
+ cy.wrap(null, { timeout: Cypress.config('defaultCommandTimeout') * 2.0 }).should(function() {
var matchingCall = spy.getCalls().find(function(call) {
var evt = call.args && call.args[0];
var textMsg = evt && evt.textMsg;

"Caolán McNamara (via cogerrit)"

unread,
May 7, 2026, 12:37:18 PMMay 7
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/desktop_helper.js | 21 ++++++++++
cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js | 6 --
cypress_test/integration_tests/desktop/writer/a11y_sidebar_spec.js | 6 --
3 files changed, 23 insertions(+), 10 deletions(-)

New commits:
commit 549cf9d6425b557f3efd919b3b29ac07b6db7337
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Thu May 7 10:20:33 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Thu May 7 16:36:12 2026 +0000

cypress: improve a11y_sidebar_spec.js Chart (LinePropertyPanel) stability

Drain layouting first so the sidebar update task has run and the
timer is registered, then waitForTimers properly waits for it to
fire, and the second waitUntilLayoutingIsIdle drains the focus task.

Extract the assertion into desktopHelper.assertSidebarStealsFocus and
reuse it.

Failure context for 'Chart (LinePropertyPanel)':
cy:command ✔ wrap null, {timeout: 20000}
cy:command ✔ assert .uno:ReportWhenIdle result with idleID 17: expected **{ Object (proxy, thisValue, ...) }** to be an object
cy:command ✔ waitUntil Object{3}
cy:command ✔ waitUntil true
cy:command ✔ wrap null, {timeout: 20000}
cy:command ✔ assert .uno:ReportWhenIdle result with idleID 18: expected **{ Object (proxy, thisValue, ...) }** to be an object
cy:command ✔ waitUntil Object{3}
cy:command ✔ waitUntil true
cy:command ✔ cGet #sidebar-dock-wrapper
cy:command ✔ assert expected **<div#sidebar-dock-wrapper.visible.coreBased>** to be **visible**
cy:command ✔ waitUntil Object{3}
cy:command ✔ waitUntil true
cy:command ✔ getFrameWindow #coolframe
cy:command ✘ assert expected **false** to equal **true**
cy:command ✔ fail:
expected false to equal true
/home/collabora/jenkins/workspace/gerrit_cypress_main/cypress_test/integration_tests/common/helper.js:1064:70
1062 | function containsFocusElement(container, doesContain) {
1063 | cy.getFrameWindow().then(function (win) {
> 1064 | cy.expect(container.contains(win.document.activeElement)).to.equal(doesContain);
| ^
1065 | });
1066 | }
1067 | function getMenuEntry(index) {
cy:log ✱ >> undoAll - start

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Ia10aa567b59b08d4bb089985efcec2b401ed9335
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2129
Reviewed-by: Mohit Marathe <mohit....@collabora.com>

diff --git a/cypress_test/integration_tests/common/desktop_helper.js b/cypress_test/integration_tests/common/desktop_helper.js
index 459a5788f828..82ba3ce58625 100644
--- a/cypress_test/integration_tests/common/desktop_helper.js
+++ b/cypress_test/integration_tests/common/desktop_helper.js
@@ -49,6 +49,26 @@ function sidebarToggle() {
cy.cGet('#optionscontainer [id^="SidebarDeck.PropertyDeck"] button').click();
}

+// Wait for the sidebar to reshow and grab focus to its first focusable
+// element via the 'sidebarstealfocus' timer scheduled in
+// Control.Sidebar.ts.
+function assertSidebarStealsFocus(win) {
+ cy.log('>> assertSidebarStealsFocus - start');
+
+ cy.cGet('#sidebar-dock-wrapper').should('be.visible').then(function(sidebar) {
+ // This first waitUntilLayoutingIsIdle ensures the sidebar
+ // update task has run and registered the timer.
+ helper.waitUntilLayoutingIsIdle(win);
+ // Wait for that timer to complete
+ helper.waitForTimers(win, 'sidebarstealfocus');
+ // Wait until dispatched tasks get done
+ helper.waitUntilLayoutingIsIdle(win);
+ helper.containsFocusElement(sidebar[0], true);
+ });
+
+ cy.log('<< assertSidebarStealsFocus - end');
+}
+
// Make the status bar visible if it's hidden at the moment.
// We use the menu option under 'View' menu to make it visible.
function showStatusBarIfHidden() {
@@ -634,6 +654,7 @@ module.exports.updateFollowingUsers = updateFollowingUsers;
module.exports.assertVisiblePage = assertVisiblePage;
module.exports.closeNavigatorSidebar = closeNavigatorSidebar;
module.exports.sidebarToggle = sidebarToggle;
+module.exports.assertSidebarStealsFocus = assertSidebarStealsFocus;
module.exports.getCompactIcon = getCompactIcon;
module.exports.getNbIcon = getNbIcon;
module.exports.getCompactIconArrow = getCompactIconArrow;
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 67d17b3ad4a8..b24e84e4aed4 100644
--- a/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
@@ -476,11 +476,7 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f
helper.processToIdle(win);

// sidebar starts again, and grabs focus to itself
- cy.cGet('#sidebar-dock-wrapper').should('be.visible').then(function(sidebar) {
- helper.waitForTimers(win, 'sidebarstealfocus');
- helper.waitUntilLayoutingIsIdle(win);
- helper.containsFocusElement(sidebar[0], true);
- });
+ desktopHelper.assertSidebarStealsFocus(win);

// esc to send focus back to main document
escLevel(win, 1);
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 470f92ec0312..018b17670ed8 100644
--- a/cypress_test/integration_tests/desktop/writer/a11y_sidebar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer/a11y_sidebar_spec.js
@@ -119,11 +119,7 @@ describe(['tagdesktop'], 'Accessibility Writer Sidebar Tests', { testIsolation:
helper.processToIdle(win);

// sidebar starts again, and grabs focus to itself
- cy.cGet('#sidebar-dock-wrapper').should('be.visible').then(function(sidebar) {
- helper.waitForTimers(win, 'sidebarstealfocus');
- helper.waitUntilLayoutingIsIdle(win);
- helper.containsFocusElement(sidebar[0], true);
- });
+ desktopHelper.assertSidebarStealsFocus(win);

// esc to send focus back to main document
escLevel(win, 1);

"Noel Grandin (via cogerrit)"

unread,
May 8, 2026, 5:12:18 AMMay 8
to collaboraon...@googlegroups.com
0 files changed

New commits:
commit 3a270671ff67e2f319be5e1973245fe9846ba313
Author: Noel Grandin <noel.g...@collabora.co.uk>
AuthorDate: Wed May 6 13:47:41 2026 +0200
Commit: Noel Grandin <noel.g...@collabora.com>
CommitDate: Fri May 8 09:11:17 2026 +0000

split cypress tests into subfolders to increase parallelism

Our makefiles run each folder of cypress tests as a single process,
so we can only do as much parallelism as we have folders.

So split the writer and calc tests into different
folders, since those are the largest test folders by fair.
I just did a simple split putting roughly equal numbers
in each new folder.

Will still need a small adjustment to the jenkins
script to take advantage of this (because it is currently using -j4)

Change-Id: I879e2d4eea2ddd35a9ee95398a7bdb60d838fc0e
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2091
Reviewed-by: Mohit Marathe <mohit....@collabora.com>
Tested-by: Jenkins CPCI <rel...@collaboraoffice.com>

diff --git a/cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js b/cypress_test/integration_tests/desktop/calc1/a11y_dialog_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/a11y_dialog_spec.js
rename to cypress_test/integration_tests/desktop/calc1/a11y_dialog_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/a11y_notebookbar_spec.js b/cypress_test/integration_tests/desktop/calc1/a11y_notebookbar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/a11y_notebookbar_spec.js
rename to cypress_test/integration_tests/desktop/calc1/a11y_notebookbar_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/a11y_sidebar_spec.js b/cypress_test/integration_tests/desktop/calc1/a11y_sidebar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/a11y_sidebar_spec.js
rename to cypress_test/integration_tests/desktop/calc1/a11y_sidebar_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/annotation_spec.js b/cypress_test/integration_tests/desktop/calc1/annotation_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/annotation_spec.js
rename to cypress_test/integration_tests/desktop/calc1/annotation_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/autofilter_spec.js b/cypress_test/integration_tests/desktop/calc1/autofilter_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/autofilter_spec.js
rename to cypress_test/integration_tests/desktop/calc1/autofilter_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/bottom_bar_spec.js b/cypress_test/integration_tests/desktop/calc1/bottom_bar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/bottom_bar_spec.js
rename to cypress_test/integration_tests/desktop/calc1/bottom_bar_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/cell_appearance_spec.js b/cypress_test/integration_tests/desktop/calc1/cell_appearance_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/cell_appearance_spec.js
rename to cypress_test/integration_tests/desktop/calc1/cell_appearance_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/cell_cursor_spec.js b/cypress_test/integration_tests/desktop/calc1/cell_cursor_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/cell_cursor_spec.js
rename to cypress_test/integration_tests/desktop/calc1/cell_cursor_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/cell_edit_spec.js b/cypress_test/integration_tests/desktop/calc1/cell_edit_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/cell_edit_spec.js
rename to cypress_test/integration_tests/desktop/calc1/cell_edit_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js b/cypress_test/integration_tests/desktop/calc1/chart_dialog_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/chart_dialog_spec.js
rename to cypress_test/integration_tests/desktop/calc1/chart_dialog_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/chart_wizard_data_series_spec.js b/cypress_test/integration_tests/desktop/calc1/chart_wizard_data_series_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/chart_wizard_data_series_spec.js
rename to cypress_test/integration_tests/desktop/calc1/chart_wizard_data_series_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/clipboard_spec.js b/cypress_test/integration_tests/desktop/calc1/clipboard_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/clipboard_spec.js
rename to cypress_test/integration_tests/desktop/calc1/clipboard_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/context_menu_spec.js b/cypress_test/integration_tests/desktop/calc1/context_menu_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/context_menu_spec.js
rename to cypress_test/integration_tests/desktop/calc1/context_menu_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/debug_tools_spec.js b/cypress_test/integration_tests/desktop/calc2/debug_tools_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/debug_tools_spec.js
rename to cypress_test/integration_tests/desktop/calc2/debug_tools_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/delete_objects_spec.js b/cypress_test/integration_tests/desktop/calc2/delete_objects_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/delete_objects_spec.js
rename to cypress_test/integration_tests/desktop/calc2/delete_objects_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/doc_partchanged_spec.js b/cypress_test/integration_tests/desktop/calc2/doc_partchanged_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/doc_partchanged_spec.js
rename to cypress_test/integration_tests/desktop/calc2/doc_partchanged_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/find_dialog_spec.js b/cypress_test/integration_tests/desktop/calc2/find_dialog_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/find_dialog_spec.js
rename to cypress_test/integration_tests/desktop/calc2/find_dialog_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/focus_spec.js b/cypress_test/integration_tests/desktop/calc2/focus_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/focus_spec.js
rename to cypress_test/integration_tests/desktop/calc2/focus_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/formula_dialog_spec.js b/cypress_test/integration_tests/desktop/calc2/formula_dialog_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/formula_dialog_spec.js
rename to cypress_test/integration_tests/desktop/calc2/formula_dialog_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/formulabar_spec.js b/cypress_test/integration_tests/desktop/calc2/formulabar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/formulabar_spec.js
rename to cypress_test/integration_tests/desktop/calc2/formulabar_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/help_dialog_update_spec.js b/cypress_test/integration_tests/desktop/calc2/help_dialog_update_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/help_dialog_update_spec.js
rename to cypress_test/integration_tests/desktop/calc2/help_dialog_update_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/image_operation_spec.js b/cypress_test/integration_tests/desktop/calc2/image_operation_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/image_operation_spec.js
rename to cypress_test/integration_tests/desktop/calc2/image_operation_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/jsdialog_help_spec.js b/cypress_test/integration_tests/desktop/calc3/jsdialog_help_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/jsdialog_help_spec.js
rename to cypress_test/integration_tests/desktop/calc3/jsdialog_help_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/jsdialog_spec.js b/cypress_test/integration_tests/desktop/calc3/jsdialog_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/jsdialog_spec.js
rename to cypress_test/integration_tests/desktop/calc3/jsdialog_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/macro_spec.js b/cypress_test/integration_tests/desktop/calc3/macro_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/macro_spec.js
rename to cypress_test/integration_tests/desktop/calc3/macro_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/manage_names_spec.js b/cypress_test/integration_tests/desktop/calc3/manage_names_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/manage_names_spec.js
rename to cypress_test/integration_tests/desktop/calc3/manage_names_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/mouse_cursor_spec.js b/cypress_test/integration_tests/desktop/calc3/mouse_cursor_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/mouse_cursor_spec.js
rename to cypress_test/integration_tests/desktop/calc3/mouse_cursor_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/navigator_spec.js b/cypress_test/integration_tests/desktop/calc3/navigator_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/navigator_spec.js
rename to cypress_test/integration_tests/desktop/calc3/navigator_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/notebookbar_tooltip_spec.js b/cypress_test/integration_tests/desktop/calc3/notebookbar_tooltip_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/notebookbar_tooltip_spec.js
rename to cypress_test/integration_tests/desktop/calc3/notebookbar_tooltip_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/number_format_spec.js b/cypress_test/integration_tests/desktop/calc3/number_format_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/number_format_spec.js
rename to cypress_test/integration_tests/desktop/calc3/number_format_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/open_different_file_types_spec.js b/cypress_test/integration_tests/desktop/calc3/open_different_file_types_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/open_different_file_types_spec.js
rename to cypress_test/integration_tests/desktop/calc3/open_different_file_types_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/row_column_operation_spec.js b/cypress_test/integration_tests/desktop/calc3/row_column_operation_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/row_column_operation_spec.js
rename to cypress_test/integration_tests/desktop/calc3/row_column_operation_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/rtl_spec.js b/cypress_test/integration_tests/desktop/calc3/rtl_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/rtl_spec.js
rename to cypress_test/integration_tests/desktop/calc3/rtl_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/scrolling_spec.js b/cypress_test/integration_tests/desktop/calc4/scrolling_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/scrolling_spec.js
rename to cypress_test/integration_tests/desktop/calc4/scrolling_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/sheet_operation_spec.js b/cypress_test/integration_tests/desktop/calc4/sheet_operation_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/sheet_operation_spec.js
rename to cypress_test/integration_tests/desktop/calc4/sheet_operation_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/sheet_switch_spec.js b/cypress_test/integration_tests/desktop/calc4/sheet_switch_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/sheet_switch_spec.js
rename to cypress_test/integration_tests/desktop/calc4/sheet_switch_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/sidebar_dialog_image_caching_spec.js b/cypress_test/integration_tests/desktop/calc4/sidebar_dialog_image_caching_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/sidebar_dialog_image_caching_spec.js
rename to cypress_test/integration_tests/desktop/calc4/sidebar_dialog_image_caching_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/statusbar_spec.js b/cypress_test/integration_tests/desktop/calc4/statusbar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/statusbar_spec.js
rename to cypress_test/integration_tests/desktop/calc4/statusbar_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/threaded_comment_spec.js b/cypress_test/integration_tests/desktop/calc4/threaded_comment_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/threaded_comment_spec.js
rename to cypress_test/integration_tests/desktop/calc4/threaded_comment_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/top_toolbar_spec.js b/cypress_test/integration_tests/desktop/calc4/top_toolbar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/top_toolbar_spec.js
rename to cypress_test/integration_tests/desktop/calc4/top_toolbar_spec.js
diff --git a/cypress_test/integration_tests/desktop/calc/undo_redo_spec.js b/cypress_test/integration_tests/desktop/calc4/undo_redo_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/calc/undo_redo_spec.js
rename to cypress_test/integration_tests/desktop/calc4/undo_redo_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js b/cypress_test/integration_tests/desktop/writer1/a11y_dialog_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/a11y_dialog_spec.js
rename to cypress_test/integration_tests/desktop/writer1/a11y_dialog_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/a11y_notebookbar_spec.js b/cypress_test/integration_tests/desktop/writer1/a11y_notebookbar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/a11y_notebookbar_spec.js
rename to cypress_test/integration_tests/desktop/writer1/a11y_notebookbar_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/a11y_sidebar_spec.js b/cypress_test/integration_tests/desktop/writer1/a11y_sidebar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/a11y_sidebar_spec.js
rename to cypress_test/integration_tests/desktop/writer1/a11y_sidebar_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/aichat_sidebar_spec.js b/cypress_test/integration_tests/desktop/writer1/aichat_sidebar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/aichat_sidebar_spec.js
rename to cypress_test/integration_tests/desktop/writer1/aichat_sidebar_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/annotation_spec.js b/cypress_test/integration_tests/desktop/writer1/annotation_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/annotation_spec.js
rename to cypress_test/integration_tests/desktop/writer1/annotation_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/chart_datatable_spec.js b/cypress_test/integration_tests/desktop/writer1/chart_datatable_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/chart_datatable_spec.js
rename to cypress_test/integration_tests/desktop/writer1/chart_datatable_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/chart_wizard_spec.js b/cypress_test/integration_tests/desktop/writer1/chart_wizard_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/chart_wizard_spec.js
rename to cypress_test/integration_tests/desktop/writer1/chart_wizard_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/compare_changes_spec.js b/cypress_test/integration_tests/desktop/writer1/compare_changes_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/compare_changes_spec.js
rename to cypress_test/integration_tests/desktop/writer1/compare_changes_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/complex_image_operation_spec.js b/cypress_test/integration_tests/desktop/writer1/complex_image_operation_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/complex_image_operation_spec.js
rename to cypress_test/integration_tests/desktop/writer1/complex_image_operation_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/context_toolbar_spec.js b/cypress_test/integration_tests/desktop/writer1/context_toolbar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/context_toolbar_spec.js
rename to cypress_test/integration_tests/desktop/writer1/context_toolbar_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/copy_paste_spec.js b/cypress_test/integration_tests/desktop/writer1/copy_paste_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/copy_paste_spec.js
rename to cypress_test/integration_tests/desktop/writer1/copy_paste_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/doc_partchanged_spec.js b/cypress_test/integration_tests/desktop/writer1/doc_partchanged_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/doc_partchanged_spec.js
rename to cypress_test/integration_tests/desktop/writer1/doc_partchanged_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/editable_area_spec.js b/cypress_test/integration_tests/desktop/writer1/editable_area_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/editable_area_spec.js
rename to cypress_test/integration_tests/desktop/writer1/editable_area_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/file_properties_spec.js b/cypress_test/integration_tests/desktop/writer2/file_properties_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/file_properties_spec.js
rename to cypress_test/integration_tests/desktop/writer2/file_properties_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/focus_spec.js b/cypress_test/integration_tests/desktop/writer2/focus_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/focus_spec.js
rename to cypress_test/integration_tests/desktop/writer2/focus_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/form_field_spec.js b/cypress_test/integration_tests/desktop/writer2/form_field_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/form_field_spec.js
rename to cypress_test/integration_tests/desktop/writer2/form_field_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/help_dialog_update_spec.js b/cypress_test/integration_tests/desktop/writer2/help_dialog_update_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/help_dialog_update_spec.js
rename to cypress_test/integration_tests/desktop/writer2/help_dialog_update_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/image_operation_spec.js b/cypress_test/integration_tests/desktop/writer2/image_operation_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/image_operation_spec.js
rename to cypress_test/integration_tests/desktop/writer2/image_operation_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/initial_socket_retry_spec.js b/cypress_test/integration_tests/desktop/writer2/initial_socket_retry_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/initial_socket_retry_spec.js
rename to cypress_test/integration_tests/desktop/writer2/initial_socket_retry_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/invalidations_spec.js b/cypress_test/integration_tests/desktop/writer2/invalidations_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/invalidations_spec.js
rename to cypress_test/integration_tests/desktop/writer2/invalidations_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/jsdialog_widgets_spec.js b/cypress_test/integration_tests/desktop/writer2/jsdialog_widgets_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/jsdialog_widgets_spec.js
rename to cypress_test/integration_tests/desktop/writer2/jsdialog_widgets_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/manage_changes_dialog_spec.js b/cypress_test/integration_tests/desktop/writer2/manage_changes_dialog_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/manage_changes_dialog_spec.js
rename to cypress_test/integration_tests/desktop/writer2/manage_changes_dialog_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/multipage_scrollbar_spec.js b/cypress_test/integration_tests/desktop/writer2/multipage_scrollbar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/multipage_scrollbar_spec.js
rename to cypress_test/integration_tests/desktop/writer2/multipage_scrollbar_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/multipage_view_reset_spec.js b/cypress_test/integration_tests/desktop/writer2/multipage_view_reset_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/multipage_view_reset_spec.js
rename to cypress_test/integration_tests/desktop/writer2/multipage_view_reset_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/navigator_spec.js b/cypress_test/integration_tests/desktop/writer2/navigator_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/navigator_spec.js
rename to cypress_test/integration_tests/desktop/writer2/navigator_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/notebookbar_spec.js b/cypress_test/integration_tests/desktop/writer2/notebookbar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/notebookbar_spec.js
rename to cypress_test/integration_tests/desktop/writer2/notebookbar_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/open_different_file_types_spec.js b/cypress_test/integration_tests/desktop/writer3/open_different_file_types_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/open_different_file_types_spec.js
rename to cypress_test/integration_tests/desktop/writer3/open_different_file_types_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/page_style_dialog_spec.js b/cypress_test/integration_tests/desktop/writer3/page_style_dialog_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/page_style_dialog_spec.js
rename to cypress_test/integration_tests/desktop/writer3/page_style_dialog_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/presets_spec.js b/cypress_test/integration_tests/desktop/writer3/presets_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/presets_spec.js
rename to cypress_test/integration_tests/desktop/writer3/presets_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/quickfind_spec.js b/cypress_test/integration_tests/desktop/writer3/quickfind_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/quickfind_spec.js
rename to cypress_test/integration_tests/desktop/writer3/quickfind_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/reconnect_spec.js b/cypress_test/integration_tests/desktop/writer3/reconnect_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/reconnect_spec.js
rename to cypress_test/integration_tests/desktop/writer3/reconnect_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/replace_dialog_spec.js b/cypress_test/integration_tests/desktop/writer3/replace_dialog_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/replace_dialog_spec.js
rename to cypress_test/integration_tests/desktop/writer3/replace_dialog_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/ruler_spacer_spec.js b/cypress_test/integration_tests/desktop/writer3/ruler_spacer_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/ruler_spacer_spec.js
rename to cypress_test/integration_tests/desktop/writer3/ruler_spacer_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/save_progress_bar_spec.js b/cypress_test/integration_tests/desktop/writer3/save_progress_bar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/save_progress_bar_spec.js
rename to cypress_test/integration_tests/desktop/writer3/save_progress_bar_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/scrolling_spec.js b/cypress_test/integration_tests/desktop/writer3/scrolling_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/scrolling_spec.js
rename to cypress_test/integration_tests/desktop/writer3/scrolling_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/searchbar_spec.js b/cypress_test/integration_tests/desktop/writer3/searchbar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/searchbar_spec.js
rename to cypress_test/integration_tests/desktop/writer3/searchbar_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/sidebar_spec.js b/cypress_test/integration_tests/desktop/writer3/sidebar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/sidebar_spec.js
rename to cypress_test/integration_tests/desktop/writer3/sidebar_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/sign_spec.js b/cypress_test/integration_tests/desktop/writer3/sign_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/sign_spec.js
rename to cypress_test/integration_tests/desktop/writer3/sign_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/spinfield_spec.js b/cypress_test/integration_tests/desktop/writer3/spinfield_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/spinfield_spec.js
rename to cypress_test/integration_tests/desktop/writer3/spinfield_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/statusbar_spec.js b/cypress_test/integration_tests/desktop/writer4/statusbar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/statusbar_spec.js
rename to cypress_test/integration_tests/desktop/writer4/statusbar_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/stylebar_spec.js b/cypress_test/integration_tests/desktop/writer4/stylebar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/stylebar_spec.js
rename to cypress_test/integration_tests/desktop/writer4/stylebar_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/stylesview_spec.js b/cypress_test/integration_tests/desktop/writer4/stylesview_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/stylesview_spec.js
rename to cypress_test/integration_tests/desktop/writer4/stylesview_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/table_accessibility_spec.js b/cypress_test/integration_tests/desktop/writer4/table_accessibility_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/table_accessibility_spec.js
rename to cypress_test/integration_tests/desktop/writer4/table_accessibility_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/table_operation_spec.js b/cypress_test/integration_tests/desktop/writer4/table_operation_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/table_operation_spec.js
rename to cypress_test/integration_tests/desktop/writer4/table_operation_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/text_selection_deselect_spec.js b/cypress_test/integration_tests/desktop/writer4/text_selection_deselect_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/text_selection_deselect_spec.js
rename to cypress_test/integration_tests/desktop/writer4/text_selection_deselect_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js b/cypress_test/integration_tests/desktop/writer4/top_toolbar_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/top_toolbar_spec.js
rename to cypress_test/integration_tests/desktop/writer4/top_toolbar_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/track_changes_spec.js b/cypress_test/integration_tests/desktop/writer4/track_changes_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/track_changes_spec.js
rename to cypress_test/integration_tests/desktop/writer4/track_changes_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/treeview_keyboard_spec.js b/cypress_test/integration_tests/desktop/writer4/treeview_keyboard_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/treeview_keyboard_spec.js
rename to cypress_test/integration_tests/desktop/writer4/treeview_keyboard_spec.js
diff --git a/cypress_test/integration_tests/desktop/writer/undo_redo_spec.js b/cypress_test/integration_tests/desktop/writer4/undo_redo_spec.js
similarity index 100%
rename from cypress_test/integration_tests/desktop/writer/undo_redo_spec.js
rename to cypress_test/integration_tests/desktop/writer4/undo_redo_spec.js
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/cell_cursor_spec.js/scroll-check.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc1/cell_cursor_spec.js/scroll-check.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/cell_cursor_spec.js/scroll-check.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc1/cell_cursor_spec.js/scroll-check.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/cell_cursor_spec.js/selections.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc1/cell_cursor_spec.js/selections.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/cell_cursor_spec.js/selections.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc1/cell_cursor_spec.js/selections.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/cell_cursor_spec.js/text-selection.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc1/cell_cursor_spec.js/text-selection.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/cell_cursor_spec.js/text-selection.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc1/cell_cursor_spec.js/text-selection.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/cell_cursor_spec.js/triple-click.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc1/cell_cursor_spec.js/triple-click.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/cell_cursor_spec.js/triple-click.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc1/cell_cursor_spec.js/triple-click.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/cell_edit_spec.js/empty.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc1/cell_edit_spec.js/empty.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/cell_edit_spec.js/empty.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc1/cell_edit_spec.js/empty.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/cell_edit_spec.js/empty_selected.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc1/cell_edit_spec.js/empty_selected.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/cell_edit_spec.js/empty_selected.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc1/cell_edit_spec.js/empty_selected.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/cell_edit_spec.js/teststring.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc1/cell_edit_spec.js/teststring.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/cell_edit_spec.js/teststring.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc1/cell_edit_spec.js/teststring.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/chart_wizard_data_series_spec.js/chart_wizard_data_series.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc1/chart_wizard_data_series_spec.js/chart_wizard_data_series.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/chart_wizard_data_series_spec.js/chart_wizard_data_series.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc1/chart_wizard_data_series_spec.js/chart_wizard_data_series.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/formula_dialog_spec.js/formula_dialog_accrintm.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc2/formula_dialog_spec.js/formula_dialog_accrintm.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/formula_dialog_spec.js/formula_dialog_accrintm.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc2/formula_dialog_spec.js/formula_dialog_accrintm.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/formula_dialog_spec.js/formula_dialog_accrintm_collapsed.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc2/formula_dialog_spec.js/formula_dialog_accrintm_collapsed.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/formula_dialog_spec.js/formula_dialog_accrintm_collapsed.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc2/formula_dialog_spec.js/formula_dialog_accrintm_collapsed.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/formulabar_spec.js/formulausage.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc2/formulabar_spec.js/formulausage.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/formulabar_spec.js/formulausage.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc2/formulabar_spec.js/formulausage.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/sheet_switch_spec.js/b1_text_step1.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc4/sheet_switch_spec.js/b1_text_step1.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/sheet_switch_spec.js/b1_text_step1.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc4/sheet_switch_spec.js/b1_text_step1.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/sheet_switch_spec.js/b1_text_step2.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc4/sheet_switch_spec.js/b1_text_step2.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/sheet_switch_spec.js/b1_text_step2.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc4/sheet_switch_spec.js/b1_text_step2.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/sheet_switch_spec.js/b1_text_step3.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc4/sheet_switch_spec.js/b1_text_step3.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc/sheet_switch_spec.js/b1_text_step3.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/calc4/sheet_switch_spec.js/b1_text_step3.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/checkbox.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/checkbox.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/checkbox.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/checkbox.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/checkbox_checked.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/checkbox_checked.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/checkbox_checked.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/checkbox_checked.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/checkbox_disabled.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/checkbox_disabled.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/checkbox_disabled.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/checkbox_disabled.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/checkbox_disabled_checked.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/checkbox_disabled_checked.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/checkbox_disabled_checked.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/checkbox_disabled_checked.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/combobox_disable.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/combobox_disable.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/combobox_disable.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/combobox_disable.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/combobox_enable.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/combobox_enable.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/combobox_enable.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/combobox_enable.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/edit_disabled.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/edit_disabled.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/edit_disabled.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/edit_disabled.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/edit_enabled.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/edit_enabled.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/edit_enabled.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/edit_enabled.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/radio.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/radio.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/radio.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/radio.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/radio_checked.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/radio_checked.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/radio_checked.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/radio_checked.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/radio_disabled.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/radio_disabled.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/radio_disabled.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/radio_disabled.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/radio_disabled_checked.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/radio_disabled_checked.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/radio_disabled_checked.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/radio_disabled_checked.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/treeview_headers.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/treeview_headers.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/treeview_headers.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/treeview_headers.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/treeview_headers_filter.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/treeview_headers_filter.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/treeview_headers_filter.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/treeview_headers_filter.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/treeview_headers_sort.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/treeview_headers_sort.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/treeview_headers_sort.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/treeview_headers_sort.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/treeview_no_headers.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/treeview_no_headers.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/jsdialog_widgets_spec.js/treeview_no_headers.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/jsdialog_widgets_spec.js/treeview_no_headers.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/manage_changes_dialog_spec.js/writer_manage_changes_tree.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/manage_changes_dialog_spec.js/writer_manage_changes_tree.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/manage_changes_dialog_spec.js/writer_manage_changes_tree.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/manage_changes_dialog_spec.js/writer_manage_changes_tree.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/manage_changes_dialog_spec.js/writer_manage_changes_tree_sorted.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/manage_changes_dialog_spec.js/writer_manage_changes_tree_sorted.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/manage_changes_dialog_spec.js/writer_manage_changes_tree_sorted.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/manage_changes_dialog_spec.js/writer_manage_changes_tree_sorted.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/navigator_spec.js/navigator_writer.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/navigator_spec.js/navigator_writer.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/navigator_spec.js/navigator_writer.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer2/navigator_spec.js/navigator_writer.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/sidebar_spec.js/sidebar_writer.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer3/sidebar_spec.js/sidebar_writer.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/sidebar_spec.js/sidebar_writer.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer3/sidebar_spec.js/sidebar_writer.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/stylebar_spec.js/style_added.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_added.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/stylebar_spec.js/style_added.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_added.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/stylebar_spec.js/style_initial.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_initial.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/stylebar_spec.js/style_initial.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_initial.png
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/stylebar_spec.js/style_sidebar_context_menu.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_sidebar_context_menu.png
similarity index 100%
rename from cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer/stylebar_spec.js/style_sidebar_context_menu.png
rename to cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_sidebar_context_menu.png

"Parth Raiyani (via cogerrit)"

unread,
May 11, 2026, 4:39:50 AMMay 11
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/calc1/a11y_sidebar_spec.js | 41 ++++++++++
1 file changed, 41 insertions(+)

New commits:
commit c5760e668ed67b0ec3354d909b596e4b579c76c4
Author: Parth Raiyani <parth....@collabora.com>
AuthorDate: Sun May 10 21:30:33 2026 +0530
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Mon May 11 08:38:46 2026 +0000

cypress-a11y: add negative test for missing visible label check

Pin the behavior of checkVisibleLabelsForFormControls by stripping the label association from a real labelled sidebar form control and asserting that the validator now reports a 'missing a visible label' violation for that exact id. The associations are restored in a finally block so subsequent tests see the original state.

Signed-off-by: Parth Raiyani <parth....@collabora.com>
Change-Id: I8959857d3d2f417182d07905d518cb216d777808
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2326
Tested-by: Jenkins CPCI <rel...@collaboraoffice.com>
Tested-by: Caolán McNamara <caolan....@collabora.com>
Reviewed-by: Caolán McNamara <caolan....@collabora.com>

diff --git a/cypress_test/integration_tests/desktop/calc1/a11y_sidebar_spec.js b/cypress_test/integration_tests/desktop/calc1/a11y_sidebar_spec.js
index b1efdb97d020..5ebab283f565 100644
--- a/cypress_test/integration_tests/desktop/calc1/a11y_sidebar_spec.js
+++ b/cypress_test/integration_tests/desktop/calc1/a11y_sidebar_spec.js
@@ -47,6 +47,47 @@ describe(['tagdesktop'], 'Accessibility Calc Sidebar Tests', { testIsolation: fa
runA11yValidation(win);
});

+ it('Detects sidebar form control missing visible label', function () {
+ helper.processToIdle(win);
+
+ cy.then(() => {
+ const container = win.app.map.sidebar.getContainer();
+ const allInputs = container.querySelectorAll('input, select');
+ const target = Array.prototype.find.call(allInputs, function (el) {
+ if (!el.id) return false;
+ if (el.hasAttribute('aria-labelledby')) return true;
+ return !!win.document.querySelector('label[for="' + el.id + '"]');
+ });
+ expect(target, 'a labelled sidebar form control').to.exist;
+
+ const originalLabelledBy = target.getAttribute('aria-labelledby');
+ const labelEl = win.document.querySelector('label[for="' + target.id + '"]');
+ const originalLabelFor = labelEl ? labelEl.getAttribute('for') : null;
+
+ if (originalLabelledBy !== null) target.removeAttribute('aria-labelledby');
+ if (labelEl) labelEl.removeAttribute('for');
+
+ let matchedCount = 0;
+ try {
+ const spy = Cypress.sinon.spy(win.console, 'error');
+ win.app.dispatcher.dispatch('validatesidebara11y');
+
+ const prefix = win.app.A11yValidatorException.PREFIX;
+ matchedCount = spy.getCalls().filter(function (call) {
+ const s = String(call.args[0]);
+ return s.includes(prefix) &&
+ s.includes("'" + target.id + "'") &&
+ s.includes('missing a visible label');
+ }).length;
+ spy.restore();
+ } finally {
+ if (originalLabelledBy !== null) target.setAttribute('aria-labelledby', originalLabelledBy);
+ if (labelEl && originalLabelFor !== null) labelEl.setAttribute('for', originalLabelFor);
+ }
+ expect(matchedCount, 'visible label violation for ' + target.id).to.be.greaterThan(0);
+ });
+ });
+
it('PropertyDeck: Graphic Context', function () {
cy.viewport(1920, 1080);


"Mohit Marathe (via cogerrit)"

unread,
May 12, 2026, 10:43:16 AM (13 days ago) May 12
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/impress/slide_operations_spec.js | 33 ++++++++--
1 file changed, 27 insertions(+), 6 deletions(-)

New commits:
commit ec0a3ad27baac51db4a38df230314f58f757f762
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Mon May 11 18:08:32 2026 +0530
Commit: Mohit Marathe <mohit....@collabora.com>
CommitDate: Tue May 12 14:42:24 2026 +0000

cypress: check slide-sorter focus when Alt or Meta is pressed

related to 9dc1732edf3b9d8f6f91cb8ba4e27a7b49db7a90

Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Change-Id: Ia361acaecc1f0f9c7c5f40492e8aa032d06b469a
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2371
Tested-by: Jenkins CPCI <rel...@collaboraoffice.com>
Reviewed-by: Michael Stahl <michae...@collabora.com>

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 a8b3ae64b908..d197bb79c05e 100644
--- a/cypress_test/integration_tests/desktop/impress/slide_operations_spec.js
+++ b/cypress_test/integration_tests/desktop/impress/slide_operations_spec.js
@@ -52,16 +52,37 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Slide operations', functio
cy.cGet('#preview-frame-part-1').click();

// Slide sorter should keep focus while user clicks on different slides.
- cy.window().then(win => {
- const app = win['0'].app;
- cy.expect(app.map._docLayer._preview.partsFocused).to.be.equal(true);
+ cy.then(() => {
+ expect(this.win.app.map._docLayer._preview.partsFocused).to.equal(true);
});

cy.cGet('#toolbar-up').click();
// Slide sorter should have lost the focus after user clicked somewhere.
- cy.window().then(win => {
- const app = win['0'].app;
- cy.expect(app.map._docLayer._preview.partsFocused).to.be.equal(false);
+ cy.then(() => {
+ expect(this.win.app.map._docLayer._preview.partsFocused).to.equal(false);
+ });
+ });
+
+ it('Slide sorter keeps focus when Alt or Meta is pressed', function() {
+ cy.cGet('#insertpage-button').click();
+ helper.processToIdle(this.win);
+
+ cy.cGet('#preview-frame-part-0').click();
+
+ cy.then(() => {
+ expect(this.win.app.map._docLayer._preview.partsFocused).to.equal(true);
+ });
+
+ cy.cGet('#preview-frame-part-0').trigger('keydown', { key: 'Alt', code: 'AltLeft', which: 18 });
+
+ cy.then(() => {
+ expect(this.win.app.map._docLayer._preview.partsFocused).to.equal(true);
+ });
+
+ cy.cGet('#preview-frame-part-0').trigger('keydown', { key: 'Meta', code: 'MetaLeft', which: 91 });
+
+ cy.then(() => {
+ expect(this.win.app.map._docLayer._preview.partsFocused).to.equal(true);
});
});


"Mohit Marathe (via cogerrit)"

unread,
May 13, 2026, 3:47:45 AM (13 days ago) May 13
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/helper.js | 29 ++++++++++
cypress_test/integration_tests/desktop/impress/sidebar_spec.js | 6 ++
2 files changed, 35 insertions(+)

New commits:
commit 6fd0bba62e5fddb272eda1083769b80cadaa02a7
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Tue May 12 06:46:26 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Wed May 13 07:46:45 2026 +0000

cypress: gate impress sidebar visual test on OnDemandRenderer drain

Add waitForOnDemandRenders helper that waits for every in-flight
render_entry sent by jsdialog/Util.OnDemandRenderer to be answered.
processToIdle returns once core is idle and the layout queue has
drained, but the iconview's IntersectionObserver-driven on-demand
renders can still be in flight after that, replacing placeholders
with images and shifting layout. Visual tests that capture an
element below such an iconview must wait for the counter to reach
zero, or cypress computes the element bbox before the shift and
captures a stale rect.

Use it in impress/sidebar_spec.js before compareSnapshot on

Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Change-Id: I8c8e6b0b9dfedd0e7577b8df25ced21b006ee011
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2430
Tested-by: Caolán McNamara <caolan....@collabora.com>
Reviewed-by: Caolán McNamara <caolan....@collabora.com>

diff --git a/cypress_test/integration_tests/common/helper.js b/cypress_test/integration_tests/common/helper.js
index d957ee67bcfc..64868a067c50 100644
--- a/cypress_test/integration_tests/common/helper.js
+++ b/cypress_test/integration_tests/common/helper.js
@@ -1384,6 +1384,34 @@ function waitForTimers(win, tag) {
}, { timeout: Cypress.config('defaultCommandTimeout'), interval: 50 });
}

+// Wait until every in-flight render_entry request from
+// jsdialog/Util.OnDemandRenderer has been answered. processToIdle
+// returns once core is idle and the layout queue has drained, but
+// the iconview's IntersectionObserver-driven on-demand renders can
+// still be in flight after that, replacing placeholders with images
+// and shifting layout. Visual tests that capture an element below
+// such an iconview must wait for this counter to reach zero, or
+// cypress will compute the element bbox before the shift and capture
+// a stale rect.
+//
+// Two RAFs precede the counter check because IntersectionObserver
+// callbacks dispatched by observe() fire on the next animation frame,
+// not synchronously - we need to give them a chance to run and
+// increment the counter before we sample it.
+function waitForOnDemandRenders(win) {
+ return cy.then(function() {
+ return new Cypress.Promise(function(resolve) {
+ win.requestAnimationFrame(function() {
+ win.requestAnimationFrame(resolve);
+ });
+ });
+ }).then(function() {
+ return cy.waitUntil(function() {
+ return (win.app.pendingOnDemandRenders || 0) === 0;
+ }, { timeout: Cypress.config('defaultCommandTimeout'), interval: 50 });
+ });
+}
+
// Waits for a map stateChangeHandler item to reach the expected value.
// Useful after sending uno commands where the state change message from
// core may arrive asynchronously based on a state change timer from core
@@ -1493,6 +1521,7 @@ module.exports.waitUntilCoreIsIdle = waitUntilCoreIsIdle;
module.exports.waitUntilLayoutingIsIdle = waitUntilLayoutingIsIdle;
module.exports.processToIdle = processToIdle;
module.exports.waitForTimers = waitForTimers;
+module.exports.waitForOnDemandRenders = waitForOnDemandRenders;
module.exports.waitForMapState = waitForMapState;
module.exports.maxScreenshotableViewportHeight = maxScreenshotableViewportHeight;
module.exports.getContextMenuItem = getContextMenuItem;
diff --git a/cypress_test/integration_tests/desktop/impress/sidebar_spec.js b/cypress_test/integration_tests/desktop/impress/sidebar_spec.js
index 5efb8b71edb4..802c99ebcf52 100644
--- a/cypress_test/integration_tests/desktop/impress/sidebar_spec.js
+++ b/cypress_test/integration_tests/desktop/impress/sidebar_spec.js
@@ -41,6 +41,12 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Sidebar Tests', function()
cy.cGet('#fillattr').should('be.visible');
cy.cGet('#fillattr').should('contain.text', 'Light Blue');
helper.processToIdle(this.win);
+ // The slide layout iconview above #fillattr uses OnDemandRenderer
+ // to fetch its preview images. Those round-trips can land after
+ // processToIdle returns and shift #fillattr down between the
+ // bbox computation and the chrome screenshot. Wait for every
+ // in-flight render_entry to be answered first.
+ helper.waitForOnDemandRenders(this.win);
cy.cGet('#fillattr').compareSnapshot('sidebar_menubutton_color', 0.1);
});
});

"Mohit Marathe (via cogerrit)"

unread,
May 14, 2026, 2:14:05 AM (12 days ago) May 14
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer1/annotation_spec.js | 8 ++++----
cypress_test/integration_tests/multiuser/writer/annotation_spec.js | 10 +++++-----
2 files changed, 9 insertions(+), 9 deletions(-)

New commits:
commit bfbf8a4e1161d2d7efb52e8a4047bd9819865393
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Wed May 13 19:06:47 2026 +0530
Commit: Szymon Kłos <szymo...@collabora.com>
CommitDate: Thu May 14 06:13:43 2026 +0000

cypress: fix annotation_spec.js Modify tests prepending typed text

CommentListSection.modify() schedules annotation.edit() and
annotation.focus() inside a setTimeout(1ms) loop. Under CI load,
Cypress's .type() could run before that chain places focus on the
modify-textarea, so isFocusedOrInFocused returns false and Cypress fires
a forced click prelude. That triggers chrome's selectAll + collapseToEnd
contenteditable normalisation: the text node gets re-wrapped in a <div>,
the caret lands at offset 1 of the container (between elements), and
execCommand('insertText') then inserts each char at offset 0 of the
trailing block. Typed text prepends instead of appends:

expected 'some text0, some other text' actual ', some other textsome
text0'

Prefix '{end}' to the affected .type() calls.

Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Change-Id: I1aa13755554489c06b371cb1e5a62c651f0f5917
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2561
Tested-by: Jenkins CPCI <rel...@collaboraoffice.com>
Reviewed-by: Szymon Kłos <szymo...@collabora.com>

diff --git a/cypress_test/integration_tests/desktop/writer1/annotation_spec.js b/cypress_test/integration_tests/desktop/writer1/annotation_spec.js
index dff9bd420763..54ce62401d1e 100644
--- a/cypress_test/integration_tests/desktop/writer1/annotation_spec.js
+++ b/cypress_test/integration_tests/desktop/writer1/annotation_spec.js
@@ -27,7 +27,7 @@ describe(['tagdesktop'], 'Annotation Tests', function() {
cy.cGet('#annotation-content-area-1').should('contain','some text0');
cy.cGet('#comment-annotation-menu-1').click();
cy.cGet('body').contains('.ui-combobox-entry.jsdialog.ui-grid-cell', 'Modify').click();
- cy.cGet('#annotation-modify-textarea-1').type(', some other text');
+ cy.cGet('#annotation-modify-textarea-1').type('{end}, some other text');
cy.cGet('#annotation-save-1').click();
cy.cGet('.cool-annotation-content-wrapper').should('exist');
cy.cGet('#annotation-content-area-1').should('contain','some text0, some other text');
@@ -620,7 +620,7 @@ describe(['tagdesktop'], 'Collapsed Annotation Tests', function() {
cy.cGet('.cool-annotation-img').click();
cy.cGet('#comment-annotation-menu-1').click();
cy.cGet('body').contains('.ui-combobox-entry.jsdialog.ui-grid-cell', 'Modify').click();
- cy.cGet('#annotation-modify-textarea-1').type(', some other text');
+ cy.cGet('#annotation-modify-textarea-1').type('{end}, some other text');
cy.cGet('#annotation-save-1').click();
cy.cGet('.cool-annotation-content-wrapper').should('exist');
cy.cGet('#annotation-content-area-1').should('contain','some text0, some other text');
@@ -745,7 +745,7 @@ describe(['tagdesktop'], 'Annotation Autosave Tests', function() {
cy.cGet('#annotation-content-area-1').should('have.text','some text0');
cy.cGet('#comment-annotation-menu-1').click();
cy.cGet('body').contains('.ui-combobox-entry.jsdialog.ui-grid-cell', 'Modify').click();
- cy.cGet('#annotation-modify-textarea-1').type(', some other text');
+ cy.cGet('#annotation-modify-textarea-1').type('{end}, some other text');
cy.cGet('#map').focus();
cy.cGet('.annotation-button-autosaved').should('be.visible');
cy.cGet('.annotation-button-delete').should('be.visible');
@@ -763,7 +763,7 @@ describe(['tagdesktop'], 'Annotation Autosave Tests', function() {
cy.cGet('#annotation-content-area-1').should('have.text','some text0');
cy.cGet('#comment-annotation-menu-1').click();
cy.cGet('body').contains('.ui-combobox-entry.jsdialog.ui-grid-cell', 'Modify').click();
- cy.cGet('#annotation-modify-textarea-1').type(', some other text');
+ cy.cGet('#annotation-modify-textarea-1').type('{end}, some other text');
cy.cGet('#map').focus();
cy.cGet('.annotation-button-autosaved').should('be.visible');
cy.cGet('.annotation-button-delete').should('be.visible');
diff --git a/cypress_test/integration_tests/multiuser/writer/annotation_spec.js b/cypress_test/integration_tests/multiuser/writer/annotation_spec.js
index 99d66d536353..b59b511a9a64 100644
--- a/cypress_test/integration_tests/multiuser/writer/annotation_spec.js
+++ b/cypress_test/integration_tests/multiuser/writer/annotation_spec.js
@@ -41,7 +41,7 @@ describe(['tagmultiuser'], 'Multiuser Annotation Tests', function () {
cy.cGet('#annotation-content-area-1').should('contain','some text0');
cy.cGet('#comment-annotation-menu-1').click();
cy.cGet('body').contains('.ui-combobox-entry.jsdialog.ui-grid-cell', 'Modify').click();
- cy.cGet('#annotation-modify-textarea-1').type(', some other text');
+ cy.cGet('#annotation-modify-textarea-1').type('{end}, some other text');
cy.cGet('#annotation-save-1').click();
cy.cGet('.cool-annotation-content-wrapper').should('exist');
cy.cGet('#annotation-content-area-1').should('contain','some text0, some other text');
@@ -109,7 +109,7 @@ describe(['tagmultiuser'], 'Multiuser Annotation Tests', function () {
cy.cGet('.cool-annotation-img').click();
cy.cGet('#comment-annotation-menu-1').click();
cy.cGet('body').contains('.ui-combobox-entry.jsdialog.ui-grid-cell', 'Modify').click();
- cy.cGet('#annotation-modify-textarea-1').type(', some other text');
+ cy.cGet('#annotation-modify-textarea-1').type('{end}, some other text');
cy.cGet('#annotation-save-1').click();
cy.cGet('.cool-annotation-content-wrapper').should('exist');
cy.cGet('#annotation-content-area-1').should('contain','some text0, some other text');
@@ -216,7 +216,7 @@ describe(['tagmultiuser'], 'Multiuser Annotation Tests', function () {
cy.cGet('#annotation-content-area-1').should('have.text','some text0');
cy.cGet('#comment-annotation-menu-1').click();
cy.cGet('body').contains('.ui-combobox-entry.jsdialog.ui-grid-cell', 'Modify').click();
- cy.cGet('#annotation-modify-textarea-1').type(', some other text');
+ cy.cGet('#annotation-modify-textarea-1').type('{end}, some other text');
cy.cGet('#map').focus();
cy.cGet('.annotation-button-autosaved').should('be.visible');
cy.cGet('.annotation-button-delete').should('be.visible');
@@ -235,7 +235,7 @@ describe(['tagmultiuser'], 'Multiuser Annotation Tests', function () {
cy.cGet('#annotation-content-area-1').should('have.text','some text0');
cy.cGet('#comment-annotation-menu-1').click();
cy.cGet('body').contains('.ui-combobox-entry.jsdialog.ui-grid-cell', 'Modify').click();
- cy.cGet('#annotation-modify-textarea-1').type(', some other text');
+ cy.cGet('#annotation-modify-textarea-1').type('{end}, some other text');
cy.cGet('#map').focus();
cy.cGet('.annotation-button-autosaved').should('be.visible');
cy.cGet('.annotation-button-delete').should('be.visible');
@@ -258,7 +258,7 @@ describe(['tagmultiuser'], 'Multiuser Annotation Tests', function () {
cy.cGet('#annotation-content-area-1').should('have.text','some text0');
cy.cGet('#comment-annotation-menu-1').click();
cy.cGet('body').contains('.ui-combobox-entry.jsdialog.ui-grid-cell', 'Modify').click();
- cy.cGet('#annotation-modify-textarea-1').type(', some other text');
+ cy.cGet('#annotation-modify-textarea-1').type('{end}, some other text');
cy.cGet('#map').focus();
cy.cGet('.annotation-button-autosaved').should('be.visible');

"Mohit Marathe (via cogerrit)"

unread,
May 15, 2026, 8:13:00 AM (10 days ago) May 15
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer1/annotation_spec.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit 928ffb1d38fc8b659881199bea8926a55c4c8347
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Fri May 15 17:35:55 2026 +0530
Commit: Mohit Marathe <mohit....@collabora.com>
CommitDate: Fri May 15 12:12:09 2026 +0000

cypress: temporarily disable Visibility at Different Window Widths due to a bug

Change-Id: Ibd64bf1d8918c7c475a9c15de536fbeb6ec06117
Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2682
Reviewed-by: printfdebugging <sahil....@collabora.com>

diff --git a/cypress_test/integration_tests/desktop/writer1/annotation_spec.js b/cypress_test/integration_tests/desktop/writer1/annotation_spec.js
index 54ce62401d1e..ba70c8b277f2 100644
--- a/cypress_test/integration_tests/desktop/writer1/annotation_spec.js
+++ b/cypress_test/integration_tests/desktop/writer1/annotation_spec.js
@@ -161,7 +161,7 @@ describe(['tagdesktop'], 'Annotation Tests', function() {
cy.cGet('#comment-container-1').should('be.not.visible');
});

- it('Visibility at Different Window Widths (increasing)', function () {
+ it.skip('Visibility at Different Window Widths (increasing)', function () {
/*
1. start with collapsed comment and increase window width
2. cy.viewport(1400, 600); at 150% comment is collapsed

"Caolán McNamara (via cogerrit)"

unread,
May 16, 2026, 4:18:09 PM (9 days ago) May 16
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer4/top_toolbar_apply_spec.js | 190 ++++++++++
cypress_test/integration_tests/desktop/writer4/top_toolbar_spec.js | 173 ---------
2 files changed, 194 insertions(+), 169 deletions(-)

New commits:
commit 983cc442e266972b513645cdc07193f9bcfe39ac
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Fri May 15 21:17:23 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Sat May 16 20:17:16 2026 +0000

cypress: split top_toolbar_spec.js Apply tests into their own file

writer4/top_toolbar_spec.js had 39 tests at 189s and is the longest
cypress test. Split this so the 17 tests whose action is to apply
a formatting attribute to the selection are in their own separate
test, so we can get more work done in parallel for ci.

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

diff --git a/cypress_test/integration_tests/desktop/writer4/top_toolbar_apply_spec.js b/cypress_test/integration_tests/desktop/writer4/top_toolbar_apply_spec.js
new file mode 100644
index 000000000000..d440c75a1727
--- /dev/null
+++ b/cypress_test/integration_tests/desktop/writer4/top_toolbar_apply_spec.js
@@ -0,0 +1,190 @@
+/* global describe it cy beforeEach require Cypress */
+
+var helper = require('../../common/helper');
+var desktopHelper = require('../../common/desktop_helper');
+var writerHelper = require('../../common/writer_helper');
+
+describe(['tagdesktop'], 'Top toolbar apply tests.', function() {
+
+ beforeEach(function() {
+ cy.viewport(1920,1080);
+ helper.setupAndLoadDocument('writer/top_toolbar.odt');
+ desktopHelper.switchUIToNotebookbar();
+
+ if (Cypress.env('INTEGRATION') === 'nextcloud') {
+ desktopHelper.showSidebar();
+ }
+ cy.getFrameWindow().then((win) => {
+ this.win = win;
+ })
+
+ writerHelper.selectAllTextOfDoc();
+ });
+
+ function refreshCopyPasteContainer() {
+ helper.typeIntoDocument('{rightArrow}');
+ writerHelper.selectAllTextOfDoc();
+ }
+
+ it('Apply highlight color.', function() {
+ helper.setDummyClipboardForCopy();
+ desktopHelper.getNbIconArrow('CharBackColor', 'Home').click();
+ desktopHelper.selectColorFromPalette('FFB66C');
+ writerHelper.selectAllTextOfDoc();
+ helper.copy();
+ cy.cGet('#copy-paste-container p font span')
+ .should('have.attr', 'style', 'background: #ffb66c');
+ });
+
+ it('Apply transparent highlight color.', function() {
+ helper.setDummyClipboardForCopy();
+ desktopHelper.getNbIcon('CharBackColor', 'Home').first().click();
+ writerHelper.selectAllTextOfDoc();
+ helper.copy();
+ cy.cGet('#copy-paste-container p font span')
+ .should('have.attr', 'style', 'background: transparent');
+ desktopHelper.getNbIcon('CharBackColor').find('.selected-color')
+ .should('have.attr', 'style', 'background-color: transparent; border-color: var(--color-border);');
+ });
+
+ it('Apply font color.', function() {
+ helper.setDummyClipboardForCopy();
+ desktopHelper.getNbIconArrow('FontColor', 'Home').click();
+ desktopHelper.selectColorFromPalette('3FAF46');
+ writerHelper.selectAllTextOfDoc();
+ helper.copy();
+ cy.cGet('#copy-paste-container p font').should('have.attr', 'color', '#3faf46');
+ });
+
+ it('Apply style.', function() {
+ helper.setDummyClipboardForCopy();
+ cy.cGet('#stylesview').scrollTo('bottom');
+ cy.cGet('#stylesview .notebookbar.ui-iconview-entry img[title=Title]').first().scrollIntoView().should('be.visible').click();
+ refreshCopyPasteContainer();
+ helper.copy();
+ cy.cGet('#copy-paste-container p font font').should('have.attr', 'style', 'font-size: 28pt');
+ });
+
+ it('Apply font name.', function() {
+ helper.setDummyClipboardForCopy();
+ desktopHelper.actionOnSelector('fontName', (selector) => { cy.cGet(selector).click(); });
+ cy.cGet('[id$="-dropdown"].modalpopup span').contains('Alef').scrollIntoView();
+ desktopHelper.selectFromJSDialogListbox('Alef', true);
+ refreshCopyPasteContainer();
+ helper.copy();
+ cy.cGet('#copy-paste-container p font').should('have.attr', 'face', 'Alef');
+ });
+
+ it('Apply bold font.', function() {
+ helper.setDummyClipboardForCopy();
+ desktopHelper.getNbIcon('Bold').click();
+ writerHelper.selectAllTextOfDoc();
+ helper.copy();
+ cy.cGet('#copy-paste-container p b').should('exist');
+ });
+
+ it('Apply italic font.', function() {
+ helper.setDummyClipboardForCopy();
+ desktopHelper.getNbIcon('Italic').click();
+ writerHelper.selectAllTextOfDoc();
+ helper.copy();
+ cy.cGet('#copy-paste-container p i').should('exist');
+ });
+
+ it('Apply underline.', function() {
+ helper.setDummyClipboardForCopy();
+ desktopHelper.getNbIcon('Underline').click();
+ writerHelper.selectAllTextOfDoc();
+ helper.copy();
+ cy.cGet('#copy-paste-container p u').should('exist');
+ });
+
+ it('Apply strikethrough.', function() {
+ helper.setDummyClipboardForCopy();
+ desktopHelper.getNbIcon('Strikeout').click();
+ writerHelper.selectAllTextOfDoc();
+ helper.copy();
+ cy.cGet('#copy-paste-container p strike').should('exist');
+ });
+
+ it('Apply font size', function() {
+ helper.setDummyClipboardForCopy();
+ desktopHelper.actionOnSelector('fontSize', (selector) => { cy.cGet(selector).click(); });
+ desktopHelper.selectFromJSDialogListbox('72', false);
+ refreshCopyPasteContainer();
+ helper.copy();
+ cy.cGet('#copy-paste-container p font').should('have.attr', 'style', 'font-size: 72pt');
+ });
+
+ it('Apply left/right alignment.', function() {
+ desktopHelper.getNbIcon('Bold').click();
+ writerHelper.selectAllTextOfDoc();
+ //cy.cGet('#copy-paste-container p').should('have.attr', 'align', 'right');
+ desktopHelper.getNbIcon('RightPara', 'Home').click();
+ writerHelper.selectAllTextOfDoc();
+ //cy.cGet('#copy-paste-container p').should('have.attr', 'align', 'left');
+ });
+
+ it('Apply center alignment.', function() {
+ desktopHelper.getNbIcon('CenterPara', 'Home').click();
+ writerHelper.selectAllTextOfDoc();
+ //cy.cGet('#copy-paste-container p').should('have.attr', 'align', 'center');
+ });
+
+ it('Apply justified.', function() {
+ helper.setDummyClipboardForCopy();
+ desktopHelper.getNbIcon('JustifyPara', 'Home').click();
+ writerHelper.selectAllTextOfDoc();
+ helper.copy();
+ cy.cGet('#copy-paste-container p').should('have.attr', 'align', 'justify');
+ });
+
+ function selectLineSpacing(entry) {
+ desktopHelper.getNbIcon('LineSpacing').click();
+ desktopHelper.getDropdown('home-line-spacing').contains('.ui-combobox-entry', entry).click();
+ }
+
+ it('Apply Line spacing: 1 and 1.5', function() {
+ helper.setDummyClipboardForCopy();
+
+ selectLineSpacing('Line Spacing: 1.5');
+
+ writerHelper.selectAllTextOfDoc();
+ helper.copy();
+ cy.cGet('#copy-paste-container p').should('have.attr', 'style').should('contain', 'line-height: 150%');
+
+ selectLineSpacing('Line Spacing: 1');
+
+ writerHelper.selectAllTextOfDoc();
+ helper.copy();
+ cy.cGet('#copy-paste-container p').should('have.attr', 'style').should('contain', 'line-height: 100%');
+ });
+
+ it('Apply Line spacing: 2', function() {
+ helper.setDummyClipboardForCopy();
+ selectLineSpacing('Line Spacing: 2');
+ writerHelper.selectAllTextOfDoc();
+ helper.copy();
+ cy.cGet('#copy-paste-container p').should('have.attr', 'style').should('contain', 'line-height: 200%');
+ });
+
+ it('Apply superscript.', function() {
+ helper.setDummyClipboardForCopy();
+ writerHelper.selectAllTextOfDoc();
+ desktopHelper.getNbIcon('SuperScript').click();
+ cy.cGet('#document-container').click('center');
+ writerHelper.selectAllTextOfDoc();
+ helper.copy();
+ cy.cGet('#copy-paste-container p sup').should('exist');
+ });
+
+ it('Apply subscript.', function() {
+ helper.setDummyClipboardForCopy();
+ writerHelper.selectAllTextOfDoc();
+ desktopHelper.getNbIcon('SubScript').click();
+ cy.cGet('#document-container').click('center');
+ writerHelper.selectAllTextOfDoc();
+ helper.copy();
+ cy.cGet('#copy-paste-container p sub').should('exist');
+ });
+});
diff --git a/cypress_test/integration_tests/desktop/writer4/top_toolbar_spec.js b/cypress_test/integration_tests/desktop/writer4/top_toolbar_spec.js
index 52f0075916ec..726f70ceb44b 100644
--- a/cypress_test/integration_tests/desktop/writer4/top_toolbar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer4/top_toolbar_spec.js
@@ -22,101 +22,6 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {
writerHelper.selectAllTextOfDoc();
});

- function refreshCopyPasteContainer() {
- helper.typeIntoDocument('{rightArrow}');
- writerHelper.selectAllTextOfDoc();
- }
-
- it('Apply highlight color.', function() {
- helper.setDummyClipboardForCopy();
- desktopHelper.getNbIconArrow('CharBackColor', 'Home').click();
- desktopHelper.selectColorFromPalette('FFB66C');
- writerHelper.selectAllTextOfDoc();
- helper.copy();
- cy.cGet('#copy-paste-container p font span')
- .should('have.attr', 'style', 'background: #ffb66c');
- });
-
- it('Apply transparent highlight color.', function() {
- helper.setDummyClipboardForCopy();
- desktopHelper.getNbIcon('CharBackColor', 'Home').first().click();
- writerHelper.selectAllTextOfDoc();
- helper.copy();
- cy.cGet('#copy-paste-container p font span')
- .should('have.attr', 'style', 'background: transparent');
- desktopHelper.getNbIcon('CharBackColor').find('.selected-color')
- .should('have.attr', 'style', 'background-color: transparent; border-color: var(--color-border);');
- });
-
- it('Apply font color.', function() {
- helper.setDummyClipboardForCopy();
- desktopHelper.getNbIconArrow('FontColor', 'Home').click();
- desktopHelper.selectColorFromPalette('3FAF46');
- writerHelper.selectAllTextOfDoc();
- helper.copy();
- cy.cGet('#copy-paste-container p font').should('have.attr', 'color', '#3faf46');
- });
-
- it('Apply style.', function() {
- helper.setDummyClipboardForCopy();
- cy.cGet('#stylesview').scrollTo('bottom');
- cy.cGet('#stylesview .notebookbar.ui-iconview-entry img[title=Title]').first().scrollIntoView().should('be.visible').click();
- refreshCopyPasteContainer();
- helper.copy();
- cy.cGet('#copy-paste-container p font font').should('have.attr', 'style', 'font-size: 28pt');
- });
-
- it('Apply font name.', function() {
- helper.setDummyClipboardForCopy();
- desktopHelper.actionOnSelector('fontName', (selector) => { cy.cGet(selector).click(); });
- cy.cGet('[id$="-dropdown"].modalpopup span').contains('Alef').scrollIntoView();
- desktopHelper.selectFromJSDialogListbox('Alef', true);
- refreshCopyPasteContainer();
- helper.copy();
- cy.cGet('#copy-paste-container p font').should('have.attr', 'face', 'Alef');
- });
-
- it('Apply bold font.', function() {
- helper.setDummyClipboardForCopy();
- desktopHelper.getNbIcon('Bold').click();
- writerHelper.selectAllTextOfDoc();
- helper.copy();
- cy.cGet('#copy-paste-container p b').should('exist');
- });
-
- it('Apply italic font.', function() {
- helper.setDummyClipboardForCopy();
- desktopHelper.getNbIcon('Italic').click();
- writerHelper.selectAllTextOfDoc();
- helper.copy();
- cy.cGet('#copy-paste-container p i').should('exist');
- });
-
- it('Apply underline.', function() {
- helper.setDummyClipboardForCopy();
- desktopHelper.getNbIcon('Underline').click();
- writerHelper.selectAllTextOfDoc();
- helper.copy();
- cy.cGet('#copy-paste-container p u').should('exist');
- });
-
- it('Apply strikethrough.', function() {
- helper.setDummyClipboardForCopy();
- desktopHelper.getNbIcon('Strikeout').click();
- writerHelper.selectAllTextOfDoc();
- helper.copy();
- cy.cGet('#copy-paste-container p strike').should('exist');
- });
-
- it('Apply font size', function() {
- helper.setDummyClipboardForCopy();
- desktopHelper.actionOnSelector('fontSize', (selector) => { cy.cGet(selector).click(); });
- desktopHelper.selectFromJSDialogListbox('72', false);
- refreshCopyPasteContainer();
- helper.copy();
- cy.cGet('#copy-paste-container p font').should('have.attr', 'style', 'font-size: 72pt');
- });
-
it('Clear direct formatting', function() {
helper.setDummyClipboardForCopy();
desktopHelper.getNbIcon('Bold').click();
@@ -129,61 +34,10 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {
cy.cGet('#copy-paste-container p b').should('not.exist');
});

- it('Apply left/right alignment.', function() {
- desktopHelper.getNbIcon('Bold').click();
- writerHelper.selectAllTextOfDoc();
- //cy.cGet('#copy-paste-container p').should('have.attr', 'align', 'right');
- desktopHelper.getNbIcon('RightPara', 'Home').click();
- writerHelper.selectAllTextOfDoc();
- //cy.cGet('#copy-paste-container p').should('have.attr', 'align', 'left');
- });
-
- it('Apply center alignment.', function() {
- desktopHelper.getNbIcon('CenterPara', 'Home').click();
- writerHelper.selectAllTextOfDoc();
- //cy.cGet('#copy-paste-container p').should('have.attr', 'align', 'center');
- });
-
- it('Apply justified.', function() {
- helper.setDummyClipboardForCopy();
- desktopHelper.getNbIcon('JustifyPara', 'Home').click();
- writerHelper.selectAllTextOfDoc();
- helper.copy();
- cy.cGet('#copy-paste-container p').should('have.attr', 'align', 'justify');
- });
-
- function selectLineSpacing(entry) {
- desktopHelper.getNbIcon('LineSpacing').click();
- desktopHelper.getDropdown('home-line-spacing').contains('.ui-combobox-entry', entry).click();
- }
-
- it('Apply Line spacing: 1 and 1.5', function() {
- helper.setDummyClipboardForCopy();
-
- selectLineSpacing('Line Spacing: 1.5');
-
- writerHelper.selectAllTextOfDoc();
- helper.copy();
- cy.cGet('#copy-paste-container p').should('have.attr', 'style').should('contain', 'line-height: 150%');
-
- selectLineSpacing('Line Spacing: 1');
-
- writerHelper.selectAllTextOfDoc();
- helper.copy();
- cy.cGet('#copy-paste-container p').should('have.attr', 'style').should('contain', 'line-height: 100%');
- });
-
- it('Apply Line spacing: 2', function() {
- helper.setDummyClipboardForCopy();
- selectLineSpacing('Line Spacing: 2');
- writerHelper.selectAllTextOfDoc();
- helper.copy();
- cy.cGet('#copy-paste-container p').should('have.attr', 'style').should('contain', 'line-height: 200%');
- });
-
it('Increase/Decrease Paragraph spacing', function() {
helper.setDummyClipboardForCopy();
- selectLineSpacing('Increase Paragraph Spacing');
+ desktopHelper.getNbIcon('LineSpacing').click();
+ desktopHelper.getDropdown('home-line-spacing').contains('.ui-combobox-entry', 'Increase Paragraph Spacing').click();

writerHelper.selectAllTextOfDoc();
helper.copy();
@@ -193,7 +47,8 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {

writerHelper.selectAllTextOfDoc();

- selectLineSpacing('Decrease Paragraph Spacing');
+ desktopHelper.getNbIcon('LineSpacing').click();
+ desktopHelper.getDropdown('home-line-spacing').contains('.ui-combobox-entry', 'Decrease Paragraph Spacing').click();

writerHelper.selectAllTextOfDoc();
helper.copy();
@@ -530,26 +385,6 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {
//});
});

- it('Apply superscript.', function() {
- helper.setDummyClipboardForCopy();
- writerHelper.selectAllTextOfDoc();
- desktopHelper.getNbIcon('SuperScript').click();
- cy.cGet('#document-container').click('center');
- writerHelper.selectAllTextOfDoc();
- helper.copy();
- cy.cGet('#copy-paste-container p sup').should('exist');
- });
-
- it('Apply subscript.', function() {
- helper.setDummyClipboardForCopy();
- writerHelper.selectAllTextOfDoc();
- desktopHelper.getNbIcon('SubScript').click();
- cy.cGet('#document-container').click('center');
- writerHelper.selectAllTextOfDoc();
- helper.copy();
- cy.cGet('#copy-paste-container p sub').should('exist');
- });
-
it('Delete Text', function() {
helper.setDummyClipboardForCopy();
helper.selectAllText();

"Caolán McNamara (via cogerrit)"

unread,
May 17, 2026, 11:42:17 AM (8 days ago) May 17
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/helper.js | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)

New commits:
commit dfbf117ceb51ccc26bedd72b1318a75c956d2236
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Sun May 17 15:57:01 2026 +0100
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Sun May 17 15:41:38 2026 +0000

cypress: use consistent timeouts here

Timed out retrying after 10000ms: Expected to find element:
`#stylesview.notebookbar .icon-view-item-container img`, but never
found it.
cypress_test/integration_tests/common/helper.js:360:22
358 | doIfInWriter(() => {
359 | cy.cGet('#stylesview.notebookbar .icon-view-item-container img')
> 360 | .should('exist');

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I320a6e9a255f0681effe8d6bb1a48a544d00bad8
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2746
Reviewed-by: Noel Grandin <noel.g...@collabora.com>

diff --git a/cypress_test/integration_tests/common/helper.js b/cypress_test/integration_tests/common/helper.js
index 64868a067c50..5cc044be7cb5 100644
--- a/cypress_test/integration_tests/common/helper.js
+++ b/cypress_test/integration_tests/common/helper.js
@@ -405,7 +405,7 @@ function documentChecks(skipInitializedCheck = false) {
if (Cypress.env('INTEGRATION') !== 'nextcloud') {
doIfOnDesktop(function() {
if (Cypress.env('pdf-view') !== true)
- cy.cGet('#sidebar-panel', { timeout: 20000 }).should('be.visible').should('not.be.empty');
+ cy.cGet('#sidebar-panel', {timeout: Cypress.config('defaultCommandTimeout') * 2.0}).should('be.visible').should('not.be.empty');

// Check that the document does not take the whole window width.
cy.window()
@@ -419,10 +419,13 @@ function documentChecks(skipInitializedCheck = false) {
});
});

- // In Writer wait for styles to appear in notebookbar
+ // In Writer wait for styles to appear in notebookbar. The img only
+ // exists after the on-demand renderer round-trips with core for at
+ // least one entry, so use the same 20s timeout as the other
+ // document-load checks rather than the default 10s.
doIfOnDesktop(() => {
doIfInWriter(() => {
- cy.cGet('#stylesview.notebookbar .icon-view-item-container img')
+ cy.cGet('#stylesview.notebookbar .icon-view-item-container img', {timeout: Cypress.config('defaultCommandTimeout') * 2.0})
.should('exist');
});
});

"Caolán McNamara (via cogerrit)"

unread,
May 17, 2026, 12:09:22 PM (8 days ago) May 17
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer4/track_changes_spec.js | 1 +
1 file changed, 1 insertion(+)

New commits:
commit 45b6c210c682c237f974d63cfe37a6d6f9f437ad
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Sun May 17 15:30:55 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Sun May 17 16:09:11 2026 +0000

cypress: track_changes: sync with core after manage-changes row click

The accept/reject button state arrives via a follow-up jsdialog
update from core after the row selection. Under heavy CI load the
default 10s retry runs out before the update arrives:

Timed out retrying after 10000ms: expected
'<button#accept-button.ui-pushbutton.jsdialog>' to have attribute
'disabled'
cypress_test/integration_tests/desktop/writer4/track_changes_spec.js:433:35
431 | // has IsUserRestricted=true and Test_RestrictedCommandList containing
432 | // the accept/reject UNO commands, all four buttons must be disabled
> 433 | cy.cGet('#accept-button').should('have.attr', 'disabled');

Sync with core before reading button state.

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

diff --git a/cypress_test/integration_tests/desktop/writer4/track_changes_spec.js b/cypress_test/integration_tests/desktop/writer4/track_changes_spec.js
index ef01b59c76b4..5094164af4d8 100644
--- a/cypress_test/integration_tests/desktop/writer4/track_changes_spec.js
+++ b/cypress_test/integration_tests/desktop/writer4/track_changes_spec.js
@@ -480,6 +480,7 @@ describe(['tagdesktop'], 'Restricted user tracked changes dialog button state',
desktopHelper.getNbIcon('AcceptTrackedChanges', 'Review').click();
cy.cGet('#AcceptRejectChangesDialog').should('be.visible');
cy.cGet('#writerchanges .ui-treeview-entry').first().click();
+ cy.getFrameWindow().then((win) => helper.processToIdle(win));
}

it('Accept and reject buttons are disabled for restricted user', function() {

"Caolán McNamara (via cogerrit)"

unread,
May 17, 2026, 12:37:28 PM (8 days ago) May 17
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer2/image_operation_spec.js | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)

New commits:
commit 092117032e4a3055a7f8f1e9832fdd48698b0a0d
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Sun May 17 15:48:32 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Sun May 17 16:36:50 2026 +0000

cypress: writer2/image_operation: wait for auto-fit-width to land

The viewport change in beforeEach fires the map 'resize' event,
which triggers CanvasTileLayer._fitWidthZoom and an async clientzoom.

Under heavy CI load it can arrive after the test's own selectZoomLevel
call, overwriting it:

expected the zoom label to have text '50', but the text was '170'
cypress_test/integration_tests/common/desktop_helper.js:128
126 | function shouldHaveZoomLevel(zoomLevel) {
127 | cy.log('>> shouldHaveZoomLevel - start');
> 128 | cy.cGet(...).should('have.text', zoomLevel);

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

diff --git a/cypress_test/integration_tests/desktop/writer2/image_operation_spec.js b/cypress_test/integration_tests/desktop/writer2/image_operation_spec.js
index 68404b208cbb..8c1fe3f546aa 100644
--- a/cypress_test/integration_tests/desktop/writer2/image_operation_spec.js
+++ b/cypress_test/integration_tests/desktop/writer2/image_operation_spec.js
@@ -10,7 +10,14 @@ describe(['tagdesktop'], 'Image Operation Tests', function() {
helper.setupAndLoadDocument('writer/image_operation.odt');
desktopHelper.switchUIToNotebookbar();
cy.viewport(1920,1080);
-
+ // The viewport change fires map 'resize' which triggers
+ // CanvasTileLayer._fitWidthZoom and sends an async clientzoom
+ // Wait for that to settle so the test's own selectZoomLevel
+ // call isn't overwritten by the late arrival.
+ cy.getFrameWindow().then((win) => {
+ this.win = win;
+ return helper.processToIdle(win);
+ });
});

it('Insert Image',function() {

"Caolán McNamara (via cogerrit)"

unread,
May 17, 2026, 12:45:48 PM (8 days ago) May 17
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/impress/slideshow_spec.js | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)

New commits:
commit 294619ff39f19f323263ae14b87d92cc915c7863
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Sun May 17 16:04:55 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Sun May 17 16:45:22 2026 +0000

cypress: slideshow_spec: replace blind wait with waitForSlideShowIdle

On heavy CI load the cy.wait(1000) before compareSnapshot was
sometimes not enough and the screenshot got ahead of the slideshow
canvas's initial render. The cypress-visual-regression task then
failed reading the actual snapshot:

`cy.task('compareSnapshots')` failed with the following error:
> no such file or directory, open
'.../snapshots/actual/slideshow_spec.js/integration_tests/desktop/impress/slideshow_spec.js/slideshow.png'
cypress-visual-regression/dist/command.js:126

Use impressHelper.waitForSlideShowIdle to wait for the slideshow
navigator to set currentSlideIndex and for its update timers to
drain before screenshotting.

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I91bc000cce5a385056f23430c6e9eb05be0ef68c
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2756

diff --git a/cypress_test/integration_tests/desktop/impress/slideshow_spec.js b/cypress_test/integration_tests/desktop/impress/slideshow_spec.js
index 4eab81c108a6..2d0f00d7d438 100644
--- a/cypress_test/integration_tests/desktop/impress/slideshow_spec.js
+++ b/cypress_test/integration_tests/desktop/impress/slideshow_spec.js
@@ -1,6 +1,7 @@
/* global describe it cy require beforeEach */

var helper = require('../../common/helper');
+var impressHelper = require('../../common/impress_helper');

function getSlideShowContent() {
return cy.cGet('#slideshow-cypress-iframe');
@@ -11,12 +12,17 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Some app', function() {
helper.setupAndLoadDocument('impress/slideshow.odp');
cy.cGet('.notebookbar #Slideshow-tab-label').click();
cy.cGet('.notebookbar #slide-fullscreen-presentation-button').click();
+ cy.getFrameWindow().then((win) => {
+ this.win = win;
+ });
});

it('Should see an empty slideshow', function () {
getSlideShowContent().should('be.visible');
- //FIXME: remove explicit wait. I tried to assert slideshow's canvas but for some reason cypress can't find slideshow iframe
- cy.wait(1000);
+ // Wait for the slideshow navigator to set currentSlideIndex and
+ // for slideshowupdate timers to drain, so compareSnapshot does
+ // not race the canvas's initial render.
+ impressHelper.waitForSlideShowIdle(this.win);
getSlideShowContent().compareSnapshot('slideshow', 0.15);
});
});

"Caolán McNamara (via cogerrit)"

unread,
May 17, 2026, 2:36:22 PM (8 days ago) May 17
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/impress/slide_sections_spec.js | 15 +++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)

New commits:
commit 3ca06ad5ab0dc8f922d95bf2d5f5671dc204078f
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Sun May 17 16:56:36 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Sun May 17 18:35:53 2026 +0000

cypress: slide_sections: wait for sections data and retry final check

The "Section slide selection" test could fail under high CI load
(captured: 1-minute load average 91, 15-minute 245). Slide 4 ended
up selected, slides 5-10 did not:

expected false to be true
cypress_test/integration_tests/desktop/impress/slide_sections_spec.js:99:62
97 | // Slides in Section-2 (indices 4-10) should be selected.
98 | for (var i = 4; i <= 10; i++)
> 99 | expect(impress.isSlideSelected(i)).to.be.true;

Wait for sections and partList to be as expected before clicking, and
use should() so the final check retries if the state is wrong for a
moment.

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I31ee11540e3ea2bb7f0f3cadb022730930d907dd
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2759
Reviewed-by: Noel Grandin <noel.g...@collabora.com>

diff --git a/cypress_test/integration_tests/desktop/impress/slide_sections_spec.js b/cypress_test/integration_tests/desktop/impress/slide_sections_spec.js
index f7093d9f6305..4c96960012fc 100644
--- a/cypress_test/integration_tests/desktop/impress/slide_sections_spec.js
+++ b/cypress_test/integration_tests/desktop/impress/slide_sections_spec.js
@@ -121,12 +121,25 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Slide sections', function(
// 3 sections: Section-1 (slides 1-4), Section-2 (5-11), Section-3 (12-13).
assertSectionHeaders(['Section-1', 'Section-2', 'Section-3']);

+ // Wait until that the has the expected shape before clicking.
+ // The section header DOM can be present while the sections array is
+ // still being filled in from the late-arriving .uno:SlideSections state.
+ cy.window().should((win) => {
+ var sections = win['0'].app.impress.sections;
+ expect(sections).to.have.length(3);
+ expect(sections[0].startIndex).to.equal(0);
+ expect(sections[1].startIndex).to.equal(4);
+ expect(sections[2].startIndex).to.equal(11);
+ expect(win['0'].app.impress.partList).to.have.length(13);
+ });
+
// Click the body of Section-2's header (anywhere that isn't the toggle).
cy.cGet('.slide-section-header').eq(1)
.find('.slide-section-name').click();
helper.processToIdle(this.win);

- cy.window().then((win) => {
+ // Use should() so the assertion block retries.
+ cy.window().should((win) => {
var impress = win['0'].app.impress;
// Slides in Section-2 (indices 4-10) should be selected.
for (var i = 4; i <= 10; i++)

"Caolán McNamara (via cogerrit)"

unread,
May 17, 2026, 3:14:45 PM (8 days ago) May 17
to collaboraon...@googlegroups.com
cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_added.png |binary
cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_initial.png |binary
cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_sidebar_context_menu.png |binary
3 files changed

New commits:
commit 02f02d90b5b4c44515dc17c0bbe8334c144acc49
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Sun May 17 18:03:42 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Sun May 17 19:14:27 2026 +0000

cypress: stylebar_spec: regenerate stale screenshot baselines

The three base snapshots for this spec were captured before later
changes to the beforeEach (UI tweaks, addition of a "Filter" label
above the styles dropdown)

The 'style_sidebar_context_menu' image is different.
Threshold limit of '0.1' exceeded: '0.10'
cypress-visual-regression/dist/command.js:171

Captured fresh bases with CYPRESS_visualRegressionType=base.

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I1edcc9d79eef9c3fc180cf4f399bafbed905d417
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2761

diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_added.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_added.png
index a5707e2fb14f..d25ce6035a78 100644
Binary files a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_added.png and b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_added.png differ
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_initial.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_initial.png
index 762418dbe8dc..a38d13104871 100644
Binary files a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_initial.png and b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_initial.png differ
diff --git a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_sidebar_context_menu.png b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_sidebar_context_menu.png
index f426ce8efcba..099604fefc66 100644
Binary files a/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_sidebar_context_menu.png and b/cypress_test/integration_tests/snapshots/base/integration_tests/desktop/writer4/stylebar_spec.js/style_sidebar_context_menu.png differ

"Szymon Kłos (via cogerrit)"

unread,
May 18, 2026, 7:24:41 AM (7 days ago) May 18
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/impress/a11y_dialog_spec.js | 7 -------
cypress_test/integration_tests/desktop/writer1/aichat_sidebar_spec.js | 2 +-
cypress_test/integration_tests/desktop/writer3/spinfield_spec.js | 2 +-
cypress_test/integration_tests/mobile/writer/focus_spec.js | 2 +-
4 files changed, 3 insertions(+), 10 deletions(-)

New commits:
commit 9669948e038e302d34f95bc88c04e21398568a5f
Author: Szymon Kłos <szymo...@collabora.com>
AuthorDate: Mon May 18 06:33:01 2026 +0000
Commit: Mohit Marathe <mohit....@collabora.com>
CommitDate: Mon May 18 11:23:44 2026 +0000

cypress: drop unused variables and globals

Removes the dead escLevel helper in a11y_dialog_spec.js, the unused
expect globals in aichat_sidebar_spec.js and focus_spec.js, and the
unused val arg in spinfield_spec.js.

Signed-off-by: Szymon Kłos <szymo...@collabora.com>
Change-Id: I358caced124de20f9090c3897e80a4061904a6a4
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2786
Tested-by: Mohit Marathe <mohit....@collabora.com>
Reviewed-by: Mohit Marathe <mohit....@collabora.com>

diff --git a/cypress_test/integration_tests/desktop/impress/a11y_dialog_spec.js b/cypress_test/integration_tests/desktop/impress/a11y_dialog_spec.js
index 7c406902a10b..e4c7dee668e6 100644
--- a/cypress_test/integration_tests/desktop/impress/a11y_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/impress/a11y_dialog_spec.js
@@ -101,13 +101,6 @@ describe(['tagdesktop'], 'Accessibility Impress Dialog Tests', { testIsolation:
});
}

- 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>
diff --git a/cypress_test/integration_tests/desktop/writer1/aichat_sidebar_spec.js b/cypress_test/integration_tests/desktop/writer1/aichat_sidebar_spec.js
index 2e27e584ee15..1b503490fa5c 100644
--- a/cypress_test/integration_tests/desktop/writer1/aichat_sidebar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer1/aichat_sidebar_spec.js
@@ -1,4 +1,4 @@
-/* global describe it cy beforeEach expect require */
+/* global describe it cy beforeEach require */

var helper = require('../../common/helper');
var aichatHelper = require('../../common/aichat_helper');
diff --git a/cypress_test/integration_tests/desktop/writer3/spinfield_spec.js b/cypress_test/integration_tests/desktop/writer3/spinfield_spec.js
index ea1e5376cd83..31363e259aed 100644
--- a/cypress_test/integration_tests/desktop/writer3/spinfield_spec.js
+++ b/cypress_test/integration_tests/desktop/writer3/spinfield_spec.js
@@ -60,7 +60,7 @@ describe(['tagdesktop'], 'Spinfield unit and button tests', function () {
});

// Unit persists after arrow key change
- cy.cGet('#leftmf-input').invoke('val').then(function (val) {
+ cy.cGet('#leftmf-input').invoke('val').then(function () {
cy.cGet('#leftmf-input').focus();
cy.cGet('#leftmf-input').type('{uparrow}');

diff --git a/cypress_test/integration_tests/mobile/writer/focus_spec.js b/cypress_test/integration_tests/mobile/writer/focus_spec.js
index c8163cf901f4..34421e88fb91 100644
--- a/cypress_test/integration_tests/mobile/writer/focus_spec.js
+++ b/cypress_test/integration_tests/mobile/writer/focus_spec.js
@@ -1,4 +1,4 @@
-/* global describe it cy beforeEach require expect*/
+/* global describe it cy beforeEach require */

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

"Caolán McNamara (via cogerrit)"

unread,
May 18, 2026, 7:33:03 AM (7 days ago) May 18
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/desktop_helper.js | 13 ++++++++++
cypress_test/integration_tests/desktop/writer1/annotation_spec.js | 2 -
2 files changed, 14 insertions(+), 1 deletion(-)

New commits:
commit c9c9939e9342be074869610be33ce175a6d378d0
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Sun May 17 19:23:53 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Mon May 18 11:32:33 2026 +0000

cypress: writer1/annotation: ensure sidebar hidden after reloadDocument

Under heavy CI load:

`cy.click()` failed because this element is being covered by
another element:
`<div class="deck jsdialog sidebar" id="PropertyDeck">...</div>`
annotation_spec.js:577:41
575 | helper.reloadDocument(newFilePath);
576 | desktopHelper.sidebarToggle();
> 577 | cy.cGet('.cool-annotation-img').click();

Add an ensureSidebarHidden helper that reads the current dock state and
only clicks the toggle when needed.

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Ie655dda9080f274319b5cdc4c45e01ea7e3a8b83
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2763
Reviewed-by: Mohit Marathe <mohit....@collabora.com>
Tested-by: Jenkins CPCI <rel...@collaboraoffice.com>

diff --git a/cypress_test/integration_tests/common/desktop_helper.js b/cypress_test/integration_tests/common/desktop_helper.js
index 82ba3ce58625..851c3ad0d614 100644
--- a/cypress_test/integration_tests/common/desktop_helper.js
+++ b/cypress_test/integration_tests/common/desktop_helper.js
@@ -49,6 +49,18 @@ function sidebarToggle() {
cy.cGet('#optionscontainer [id^="SidebarDeck.PropertyDeck"] button').click();
}

+// Ensure the sidebar dock is hidden, regardless of starting state.
+function ensureSidebarHidden() {
+ cy.log('>> ensureSidebarHidden');
+ cy.cGet('#sidebar-dock-wrapper').then(function($dock) {
+ if ($dock.is(':visible')) {
+ cy.cGet('#optionscontainer [id^="SidebarDeck.PropertyDeck"] button').click();
+ }
+ });
+ cy.cGet('#sidebar-dock-wrapper').should('not.be.visible');
+ cy.log('<< ensureSidebarHidden - end');
+}
+
// Wait for the sidebar to reshow and grab focus to its first focusable
// element via the 'sidebarstealfocus' timer scheduled in
// Control.Sidebar.ts.
@@ -654,6 +666,7 @@ module.exports.updateFollowingUsers = updateFollowingUsers;
module.exports.assertVisiblePage = assertVisiblePage;
module.exports.closeNavigatorSidebar = closeNavigatorSidebar;
module.exports.sidebarToggle = sidebarToggle;
+module.exports.ensureSidebarHidden = ensureSidebarHidden;
module.exports.assertSidebarStealsFocus = assertSidebarStealsFocus;
module.exports.getCompactIcon = getCompactIcon;
module.exports.getNbIcon = getNbIcon;
diff --git a/cypress_test/integration_tests/desktop/writer1/annotation_spec.js b/cypress_test/integration_tests/desktop/writer1/annotation_spec.js
index ba70c8b277f2..3583297ff07e 100644
--- a/cypress_test/integration_tests/desktop/writer1/annotation_spec.js
+++ b/cypress_test/integration_tests/desktop/writer1/annotation_spec.js
@@ -673,7 +673,7 @@ describe(['tagdesktop'], 'Collapsed Annotation Tests', function() {
cy.cGet('.cool-annotation-info-collapsed').should('be.not.visible');

helper.reloadDocument(newFilePath);
- desktopHelper.sidebarToggle();
+ desktopHelper.ensureSidebarHidden();
cy.cGet('.cool-annotation-img').click();
cy.cGet('.cool-annotation-content-wrapper').should('exist');

"Caolán McNamara (via cogerrit)"

unread,
May 19, 2026, 3:27:07 AM (7 days ago) May 19
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/impress/annotation_spec.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit d5073f38216a155a1baa5a01d84b322c7e78680d
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Mon May 18 19:05:22 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Tue May 19 07:26:29 2026 +0000

cypress: impress/annotation: stabilize collapsed annotation reload test

Under load the PropertyDeck sidebar can show up after reloadDocument
and cover the annotation in the document area, so cy.click() on the
annotation aborts with 'covered by another element'. scrollIntoView
moves the canvas so the annotation center is in view before the click.

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Id808c02b0c4ac03a060f52e806f1df23b82cbad1
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2859
Reviewed-by: Noel Grandin <noel.g...@collabora.com>

diff --git a/cypress_test/integration_tests/desktop/impress/annotation_spec.js b/cypress_test/integration_tests/desktop/impress/annotation_spec.js
index 0af1f6fe253f..b5c943f6b832 100644
--- a/cypress_test/integration_tests/desktop/impress/annotation_spec.js
+++ b/cypress_test/integration_tests/desktop/impress/annotation_spec.js
@@ -205,7 +205,7 @@ describe(['tagdesktop'], 'Collapsed Annotation Tests', function() {
helper.reloadDocument(newFilePath);
desktopHelper.closeNavigatorSidebar();
desktopHelper.getNbIcon('ModifyPage.selected').click();
- cy.cGet('.cool-annotation-img').click();
+ cy.cGet('.cool-annotation-img').scrollIntoView().click();
cy.cGet('.cool-annotation-content-wrapper').should('exist');
cy.cGet('[id^=annotation-content-area-]').should('have.text','some text0');

"Szymon Kłos (via cogerrit)"

unread,
May 19, 2026, 4:41:28 AM (7 days ago) May 19
to collaboraon...@googlegroups.com
cypress_test/integration_tests/mobile/calc/bottom_toolbar_spec.js | 3 +++
1 file changed, 3 insertions(+)

New commits:
commit 3237e1f42873dd30892e741d317dc2ef788a99da
Author: Szymon Kłos <szymo...@collabora.com>
AuthorDate: Mon May 18 07:20:39 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Tue May 19 08:41:18 2026 +0000

cypress: stabilise the calc bottom-toolbar tests

Wait for the state updates which can still be propagating
into the toolbar when the test starts.

Signed-off-by: Szymon Kłos <szymo...@collabora.com>
Change-Id: I14e68c032832a517e0f4c90c4755c302b8b30ff2
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2787
Tested-by: Caolán McNamara <caolan....@collabora.com>
Reviewed-by: Caolán McNamara <caolan....@collabora.com>

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 a053627e1aa6..876203a55d20 100644
--- a/cypress_test/integration_tests/mobile/calc/bottom_toolbar_spec.js
+++ b/cypress_test/integration_tests/mobile/calc/bottom_toolbar_spec.js
@@ -19,6 +19,9 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Interact with bottom toolba
cy.getFrameWindow().then(function(win) {
this.win = win;
});
+
+ // Wait for the cell state to fully switch
+ cy.cGet('#toolbar-down .unoBold').should('not.have.attr', 'disabled');
});

function getTextEndPosForFirstCell() {

"Szymon Kłos (via cogerrit)"

unread,
May 19, 2026, 4:42:34 AM (7 days ago) May 19
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/mobile_helper.js | 9 +++++++++
1 file changed, 9 insertions(+)

New commits:
commit 1014616a98c2a6d2d2151ab6768b24920fe579ec
Author: Szymon Kłos <szymo...@collabora.com>
AuthorDate: Mon May 18 07:21:22 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Tue May 19 08:42:13 2026 +0000

cypress: drain core after attachFile in insertImage

attachFile triggers an asynchronous upload + insert round-trip in
core. The default 10s wait on '#document-container svg g' is enough
when the spec runs alone but intermittently times out under full
mobile-suite CPU load. Run processToIdle between the upload and the
DOM assertion so the test waits for core to finish rather than
relying on the SVG appearing within the default timeout.

Signed-off-by: Szymon Kłos <szymo...@collabora.com>
Change-Id: Ib6697ad1dd2d7f861155cf42f232c35d149857b8
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2788
Tested-by: Jenkins CPCI <rel...@collaboraoffice.com>
Reviewed-by: Caolán McNamara <caolan....@collabora.com>
Tested-by: Caolán McNamara <caolan....@collabora.com>

diff --git a/cypress_test/integration_tests/common/mobile_helper.js b/cypress_test/integration_tests/common/mobile_helper.js
index a064331bd04d..3ab198918ed7 100644
--- a/cypress_test/integration_tests/common/mobile_helper.js
+++ b/cypress_test/integration_tests/common/mobile_helper.js
@@ -339,6 +339,15 @@ function insertImage() {
cy.cGet('#insertgraphic[type=file]')
.attachFile('/mobile/writer/image_to_insert.png');

+ // The upload + insert round-trip is asynchronous.
+ // CPU load the default 10s wait on the SVG might be not enough
+
+ cy.wait(1000);
+
+ cy.getFrameWindow().then(function(win) {
+ helper.processToIdle(win);
+ });
+
cy.cGet('#document-container svg g')
.should('exist');


"Caolán McNamara (via cogerrit)"

unread,
May 19, 2026, 10:02:35 AM (6 days ago) May 19
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer1/a11y_sidebar_spec.js | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)

New commits:
commit e14461cdb1a1a0e0fc3b3223cf31df8fcc3cd49a
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Mon May 18 16:16:49 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Tue May 19 14:02:18 2026 +0000

enable the writer a11y sidebar coverage check

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I4c1471f943a04ca521032a9f1d1fac49664f2f8e
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2855
Tested-by: Jenkins CPCI <rel...@collaboraoffice.com>
Reviewed-by: Parth Raiyani <parth....@collabora.com>

diff --git a/cypress_test/integration_tests/desktop/writer1/a11y_sidebar_spec.js b/cypress_test/integration_tests/desktop/writer1/a11y_sidebar_spec.js
index 018b17670ed8..fb2eb4c19dff 100644
--- a/cypress_test/integration_tests/desktop/writer1/a11y_sidebar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer1/a11y_sidebar_spec.js
@@ -35,8 +35,7 @@ describe(['tagdesktop'], 'Accessibility Writer Sidebar Tests', { testIsolation:

cy.get('@uicoverageResult').then(result => {
expect(result.used, `used .ui files`).to.not.be.empty;
- // TODO, make this true
- // expect(result.CompleteWriterSidebarCoverage, `complete writer sidebar coverage`).to.be.true;
+ expect(result.CompleteWriterSidebarCoverage, `complete writer sidebar coverage`).to.be.true;
});
});


"Szymon Kłos (via cogerrit)"

unread,
May 19, 2026, 10:22:35 AM (6 days ago) May 19
to collaboraon...@googlegroups.com
cypress_test/integration_tests/mobile/calc/apply_font_spec.js | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)

New commits:
commit ca18c91b70c8b2e9b6c71236ea36caf4dcf9bbbe
Author: Szymon Kłos <szymo...@collabora.com>
AuthorDate: Mon May 18 09:06:14 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Tue May 19 14:22:14 2026 +0000

cypress: scope calc mobile apply_font selectors to the wizard

openMobileWizard might wait long enough for the toolbar-down's
bold/italic/underline/strikeout/shadowed icons to be
fully rendered before the wizard hides toolbar-down.
cy.cGet('.unoBold:visible') then matches two elements
and cy.click fails with "subject contained 2 elements".

Signed-off-by: Szymon Kłos <szymo...@collabora.com>
Change-Id: I4092d04acb3bc3b916bd7f1d4d103512ed0ecd25
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2789
Reviewed-by: Caolán McNamara <caolan....@collabora.com>

diff --git a/cypress_test/integration_tests/mobile/calc/apply_font_spec.js b/cypress_test/integration_tests/mobile/calc/apply_font_spec.js
index f9a7ded082ac..1ed6015988cc 100644
--- a/cypress_test/integration_tests/mobile/calc/apply_font_spec.js
+++ b/cypress_test/integration_tests/mobile/calc/apply_font_spec.js
@@ -20,7 +20,7 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Apply font changes.', funct

it('Apply bold.', function() {
helper.setDummyClipboardForCopy();
- cy.cGet('.unoBold:visible').click();
+ cy.cGet('#mobile-wizard .unoBold').click();
calcHelper.selectEntireSheet();
helper.copy();
cy.cGet('#copy-paste-container table td b').should('exist');
@@ -28,7 +28,7 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Apply font changes.', funct

it('Apply italic.', function() {
helper.setDummyClipboardForCopy();
- cy.cGet('.unoItalic:visible').click();
+ cy.cGet('#mobile-wizard .unoItalic').click();
calcHelper.selectEntireSheet();
helper.copy();
cy.cGet('#copy-paste-container table td i').should('exist');
@@ -36,7 +36,7 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Apply font changes.', funct

it('Apply underline.', function() {
helper.setDummyClipboardForCopy();
- cy.cGet('.unoUnderline:visible').click();
+ cy.cGet('#mobile-wizard .unoUnderline').click();

calcHelper.selectEntireSheet();
helper.copy();
@@ -47,7 +47,7 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Apply font changes.', funct

it('Apply strikeout.', function() {
helper.setDummyClipboardForCopy();
- cy.cGet('.unoStrikeout:visible').click();
+ cy.cGet('#mobile-wizard .unoStrikeout').click();

calcHelper.selectEntireSheet();
helper.copy();
@@ -57,7 +57,7 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Apply font changes.', funct
});

it('Apply shadowed.', function() {
- cy.cGet('.unoShadowed:visible').click();
+ cy.cGet('#mobile-wizard .unoShadowed').click();

calcHelper.selectEntireSheet();


"Szymon Kłos (via cogerrit)"

unread,
May 19, 2026, 10:23:45 AM (6 days ago) May 19
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/mobile_helper.js | 12 ++++++++++++
1 file changed, 12 insertions(+)

New commits:
commit 766b3195f407ca59f46a7b2a0a7abbcbb10485e1
Author: Szymon Kłos <szymo...@collabora.com>
AuthorDate: Mon May 18 09:01:11 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Tue May 19 14:23:20 2026 +0000

cypress: drain core before opening the mobile wizard

cy.cGet('#toolbar-up #mobile_wizard').click() and the equivalent for
the insertion wizard race against any in-flight sidebar update. With
the previous patches removed the legacy refresh-sidebar pathway,
the wizard's panel content occasionally raced the toggle so that
subsequent clicks (e.g. into a listbox dropdown) saw stale entries,
or the toggle was eaten by an autodismiss.

Call helper.processToIdle before the toggle in openMobileWizard and
openInsertionWizard so the wizard always opens from a quiesced state.

Signed-off-by: Szymon Kłos <szymo...@collabora.com>
Change-Id: I09679e111a53fbf224c777ff57e8feca78bcad53
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2791
Reviewed-by: Caolán McNamara <caolan....@collabora.com>

diff --git a/cypress_test/integration_tests/common/mobile_helper.js b/cypress_test/integration_tests/common/mobile_helper.js
index 3ab198918ed7..47bcfeda475f 100644
--- a/cypress_test/integration_tests/common/mobile_helper.js
+++ b/cypress_test/integration_tests/common/mobile_helper.js
@@ -109,6 +109,12 @@ function closeHamburgerMenu() {
function openMobileWizard() {
cy.log('>> openMobileWizard - start');

+ // Drain any in-flight core work first so the toggle isn't racing
+ // against a pending sidebar update.
+ cy.getFrameWindow().then(function(win) {
+ helper.processToIdle(win);
+ });
+
// Open mobile wizard
cy.cGet('#toolbar-up #mobile_wizard')
.should('not.have.class', 'disabled')
@@ -143,6 +149,12 @@ function closeMobileWizard() {
function openInsertionWizard() {
cy.log('>> openInsertionWizard - start');

+ // Drain any in-flight core work first so the toggle isn't racing
+ // against a pending update.
+ cy.getFrameWindow().then(function(win) {
+ helper.processToIdle(win);
+ });
+
cy.cGet('#toolbar-up #insertion_mobile_wizard')
.should('not.have.class', 'disabled');


"Mohit Marathe (via cogerrit)"

unread,
May 19, 2026, 10:32:33 AM (6 days ago) May 19
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/calc1/a11y_dialog_spec.js | 4 +-
cypress_test/integration_tests/desktop/calc1/cell_cursor_spec.js | 2 -
cypress_test/integration_tests/desktop/writer2/file_properties_spec.js | 8 ++---
cypress_test/integration_tests/desktop/writer2/jsdialog_widgets_spec.js | 14 +++++-----
cypress_test/integration_tests/desktop/writer4/top_toolbar_spec.js | 2 -
5 files changed, 15 insertions(+), 15 deletions(-)

New commits:
commit 5425e6884380b83399d8d4e040f3e593d68c3da5
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Wed Feb 25 18:33:25 2026 +0530
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Tue May 19 14:32:08 2026 +0000

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

This reverts commit 8505f493923e3deaf715cb78e898285a7930b9b8.

Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Change-Id: Ia7293b06a7d059c60e562a3a7a28c02638482c3a
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/1910
Reviewed-by: Caolán McNamara <caolan....@collabora.com>
Tested-by: Caolán McNamara <caolan....@collabora.com>

diff --git a/cypress_test/integration_tests/desktop/calc1/a11y_dialog_spec.js b/cypress_test/integration_tests/desktop/calc1/a11y_dialog_spec.js
index 5974656fbe9b..142236e5e5b8 100644
--- a/cypress_test/integration_tests/desktop/calc1/a11y_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/calc1/a11y_dialog_spec.js
@@ -131,7 +131,7 @@ describe(['tagdesktop'], 'Accessibility Calc Dialog Tests', { testIsolation: fal
} else if (buggyCalcDialogs.includes(command)) {
it.skip(`Dialog ${command} (buggy)`, function () {});
} 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();
@@ -268,7 +268,7 @@ describe(['tagdesktop'], 'Accessibility Calc Dialog Tests', { testIsolation: fal
a11yHelper.handleDialog(win, 1, '', true);
});

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

diff --git a/cypress_test/integration_tests/desktop/calc1/cell_cursor_spec.js b/cypress_test/integration_tests/desktop/calc1/cell_cursor_spec.js
index bb9ed81be659..d104e5984841 100644
--- a/cypress_test/integration_tests/desktop/calc1/cell_cursor_spec.js
+++ b/cypress_test/integration_tests/desktop/calc1/cell_cursor_spec.js
@@ -255,7 +255,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Test triple click content
});
});

- it.skip('Triple click should select the cell content.', function() {
+ it('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/writer2/file_properties_spec.js b/cypress_test/integration_tests/desktop/writer2/file_properties_spec.js
index 039186373b51..23cc277fda5c 100644
--- a/cypress_test/integration_tests/desktop/writer2/file_properties_spec.js
+++ b/cypress_test/integration_tests/desktop/writer2/file_properties_spec.js
@@ -16,7 +16,7 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'File Property Tests', func
});
});

- it.skip('Add File Description.', function() {
+ it('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.skip('Add Custom Property.', function() {
+ it('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.skip('Add Custom Duration Property.', function() {
+ it('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.skip('Add Custom Yes/No Property.', function() {
+ it('Add Custom Yes/No Property.', function() {
writerHelper.openFileProperties(this.win);

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

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

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

- it.skip('Checkbox', function() {
+ it('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.skip('Radio button', function() {
+ it('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.skip('Treelistbox no-headers', function() {
+ it('Treelistbox no-headers', function() {
cy.cGet('#contenttree').compareSnapshot('treeview_no_headers', 0.05);
});

- it.skip('Treelistbox focus', function() {
+ it('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.skip('Treelistbox with-headers', function() {
+ it('Treelistbox with-headers', function() {
cy.cGet('#contenttree2').compareSnapshot('treeview_headers', 0.12);

// use sort feature
diff --git a/cypress_test/integration_tests/desktop/writer4/top_toolbar_spec.js b/cypress_test/integration_tests/desktop/writer4/top_toolbar_spec.js
index 726f70ceb44b..5c3214d5b8c0 100644
--- a/cypress_test/integration_tests/desktop/writer4/top_toolbar_spec.js
+++ b/cypress_test/integration_tests/desktop/writer4/top_toolbar_spec.js
@@ -139,7 +139,7 @@ describe(['tagdesktop'], 'Top toolbar tests.', function() {
cy.cGet('#copy-paste-container p a').should('have.attr', 'href', 'http://www.something.com/');
});

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

cy.cGet('#Insert-tab-label').click();

"Samuel Mehrbrodt (via cogerrit)"

unread,
May 20, 2026, 4:31:05 AM (6 days ago) May 20
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer/backstage_spec.js | 146 ++++++++++
1 file changed, 146 insertions(+)

New commits:
commit 7a6d2cde2695c216686f79f51849228bfa230fdf
Author: Samuel Mehrbrodt <samuel.m...@collabora.com>
AuthorDate: Mon May 4 11:38:27 2026 +0200
Commit: Szymon Kłos <szymo...@collabora.com>
CommitDate: Wed May 20 08:29:53 2026 +0000

Add cypress spec for backstage

Change-Id: I71d69f13459574eae371ca00d851f3a1f4e6527c
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/1909
Tested-by: Jenkins CPCI <rel...@collaboraoffice.com>
Reviewed-by: Szymon Kłos <szymo...@collabora.com>

diff --git a/cypress_test/integration_tests/desktop/writer/backstage_spec.js b/cypress_test/integration_tests/desktop/writer/backstage_spec.js
new file mode 100644
index 000000000000..b2fbb9c89be4
--- /dev/null
+++ b/cypress_test/integration_tests/desktop/writer/backstage_spec.js
@@ -0,0 +1,146 @@
+/* -*- js-indent-level: 8 -*- */
+/* global describe it cy beforeEach afterEach require */
+
+var helper = require('../../common/helper');
+
+// Backstage view is normally instantiated only by UIManager when running
+// inside a CODA app (mode.isCODesktop()). In a regular browser Cypress
+// run, app.map.backstageView is undefined. We construct one explicitly so
+// the templates exercise the same code path they would in CODA.
+function ensureBackstage(win) {
+ if (!win.app.map.backstageView) {
+ win.app.map.backstageView = new win.L.Control.BackstageView(win.app.map);
+ }
+ return win.app.map.backstageView;
+}
+
+describe(['tagdesktop'], 'Backstage View Tests', function() {
+
+ beforeEach(function() {
+ cy.viewport(1400, 1000);
+ helper.setupAndLoadDocument('writer/help_dialog.odt');
+ cy.getFrameWindow().then((win) => {
+ this.win = win;
+ });
+ });
+
+ afterEach(function() {
+ // Hide the backstage view in case a test fails partway through, so
+ // document container is restored for subsequent tests.
+ cy.then(() => {
+ if (this.win.app.map.backstageView) {
+ this.win.app.map.backstageView.hide();
+ }
+ });
+ });
+
+ it('Shows backstage chrome with sidebar tabs and content area', function() {
+ cy.then(() => {
+ ensureBackstage(this.win).show();
+ });
+
+ cy.cGet('.backstage-view').should('be.visible');
+ cy.cGet('.backstage-view').should('not.have.class', 'hidden');
+ cy.cGet('.backstage-header').should('be.visible');
+ cy.cGet('.backstage-header-title').should('contain.text', 'Collabora Office');
+ cy.cGet('.backstage-sidebar').should('be.visible');
+ cy.cGet('.backstage-content').should('be.visible');
+
+ // Tabs that should always exist when not in starter mode.
+ cy.cGet('#backstage-home').should('exist');
+ cy.cGet('#backstage-new').should('exist');
+ cy.cGet('#backstage-open').should('exist');
+ cy.cGet('#backstage-info').should('exist');
+ cy.cGet('#backstage-export').should('exist');
+ cy.cGet('#backstage-about').should('exist');
+
+ // Home tab is active by default.
+ cy.cGet('#backstage-home').should('have.class', 'active');
+ });
+
+ it('Switches between view tabs', function() {
+ cy.then(() => {
+ ensureBackstage(this.win).show();
+ });
+
+ cy.cGet('#backstage-new').click();
+ cy.cGet('#backstage-new').should('have.class', 'active');
+ cy.cGet('#backstage-home').should('not.have.class', 'active');
+ cy.cGet('.backstage-template-explorer').should('exist');
+
+ cy.cGet('#backstage-info').click();
+ cy.cGet('#backstage-info').should('have.class', 'active');
+ cy.cGet('.backstage-info-properties').should('be.visible');
+ cy.cGet('.backstage-properties-list').should('be.visible');
+ cy.cGet('.backstage-property-item').should('have.length.at.least', 1);
+
+ cy.cGet('#backstage-export').click();
+ cy.cGet('#backstage-export').should('have.class', 'active');
+ // Export grid only renders when the notebookbar builder reports
+ // download formats. We still expect the section header to appear
+ // when at least one format is available; if none are, the content
+ // area may be empty. Just assert that no other view is leaking.
+ cy.cGet('.backstage-info-properties').should('not.exist');
+ cy.cGet('.backstage-template-explorer').should('not.exist');
+
+ cy.cGet('#backstage-home').click();
+ cy.cGet('#backstage-home').should('have.class', 'active');
+ });
+
+ it('Filters templates via the search input', function() {
+ cy.then(() => {
+ ensureBackstage(this.win).show();
+ });
+
+ cy.cGet('#backstage-new').click();
+ cy.cGet('.backstage-template-explorer').should('exist');
+
+ // Type a query that almost certainly matches no template name.
+ cy.cGet('.template-search-input').type('zzz_no_such_template_xyz');
+ cy.cGet('.template-grid-empty')
+ .should('be.visible')
+ .and('contain.text', 'No templates match your search');
+
+ // Clearing the search should remove the empty-state message.
+ cy.cGet('.template-search-input').clear();
+ cy.cGet('.template-grid-empty').should('not.exist');
+ });
+
+ it('Closes via the header close button', function() {
+ cy.then(() => {
+ ensureBackstage(this.win).show();
+ });
+
+ cy.cGet('.backstage-view').should('not.have.class', 'hidden');
+ cy.cGet('.backstage-header-close').click();
+ cy.cGet('.backstage-view').should('have.class', 'hidden');
+ });
+
+ it('Closes via the sidebar back button', function() {
+ cy.then(() => {
+ ensureBackstage(this.win).show();
+ });
+
+ cy.cGet('.backstage-view').should('not.have.class', 'hidden');
+ cy.cGet('.backstage-sidebar-back').click();
+ cy.cGet('.backstage-view').should('have.class', 'hidden');
+ });
+
+ it('Toggles via the public API', function() {
+ cy.then(() => {
+ const bv = ensureBackstage(this.win);
+ bv.show();
+ });
+ cy.cGet('.backstage-view').should('not.have.class', 'hidden');
+
+ cy.then(() => {
+ this.win.app.map.backstageView.hide();
+ });
+ cy.cGet('.backstage-view').should('have.class', 'hidden');
+
+ cy.then(() => {
+ this.win.app.map.backstageView.toggle();
+ });
+ cy.cGet('.backstage-view').should('not.have.class', 'hidden');
+ });
+});

"Caolán McNamara (via cogerrit)"

unread,
May 20, 2026, 4:40:44 AM (6 days ago) May 20
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer4/stylesview_spec.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

New commits:
commit d5aa338dbc830c200e9bcbd98edd5615aa26db41
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Tue May 19 20:57:59 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Wed May 20 08:40:25 2026 +0000

cypress: writer4: scroll target into view before visibility check

Under heavy CI load the selected #stylesview_0 entry can sit clipped
by its overflow:hidden iconview parent at test start, so
should('be.visible') times out. scrollIntoView before the check moves
the iconview such that the entry is in view.

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I57317fbe640c5ac7ff4e83240e41dcd4b50dad79
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2965
Reviewed-by: Mohit Marathe <mohit....@collabora.com>

diff --git a/cypress_test/integration_tests/desktop/writer4/stylesview_spec.js b/cypress_test/integration_tests/desktop/writer4/stylesview_spec.js
index 81dfe81becb4..6b2751edc3a3 100644
--- a/cypress_test/integration_tests/desktop/writer4/stylesview_spec.js
+++ b/cypress_test/integration_tests/desktop/writer4/stylesview_spec.js
@@ -23,12 +23,12 @@ describe(['tagdesktop'], 'Stylesview Iconview Tests', function() {
it('Scroll Up/Down Buttons', function() {
cy.cGet('#stylesview-iconview-list-scroll-up').should('exist').should('be.visible');
cy.cGet('#stylesview-iconview-list-scroll-down').should('exist').should('be.visible');
- cy.cGet('#stylesview_0').should('exist').should('be.visible');
+ cy.cGet('#stylesview_0').should('exist').scrollIntoView().should('be.visible');

cy.cGet('#stylesview-iconview-list-scroll-down').click();
cy.cGet('#stylesview_0').should('exist').should('not.be.visible');
cy.cGet('#stylesview-iconview-list-scroll-up').click();
- cy.cGet('#stylesview_0').should('exist').should('be.visible');
+ cy.cGet('#stylesview_0').should('exist').scrollIntoView().should('be.visible');
});

it('Expander Button', function() {

"Szymon Kłos (via cogerrit)"

unread,
May 21, 2026, 1:37:31 AM (5 days ago) May 21
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/calc1/clipboard_spec.js | 12 +++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)

New commits:
commit 11d13d48b00662ccdfef97b230886376573a7b1f
Author: Szymon Kłos <szymo...@collabora.com>
AuthorDate: Wed May 20 10:49:20 2026 +0000
Commit: Mohit Marathe <mohit....@collabora.com>
CommitDate: Thu May 21 05:36:55 2026 +0000

cypress: stabilize hyperlink test

Signed-off-by: Szymon Kłos <szymo...@collabora.com>
Change-Id: I1afcd9ff921dbfa4989e8cd767639fb72f36cb5d
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2979
Reviewed-by: Mohit Marathe <mohit....@collabora.com>
Tested-by: Jenkins CPCI <rel...@collaboraoffice.com>

diff --git a/cypress_test/integration_tests/desktop/calc1/clipboard_spec.js b/cypress_test/integration_tests/desktop/calc1/clipboard_spec.js
index 73d2558fdaf3..4b4abd8a75db 100644
--- a/cypress_test/integration_tests/desktop/calc1/clipboard_spec.js
+++ b/cypress_test/integration_tests/desktop/calc1/clipboard_spec.js
@@ -194,7 +194,12 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Calc clipboard tests.', fu
helper.setDummyClipboardForCopy();

calcHelper.dblClickOnFirstCell();
- cy.cGet('.ui-custom-textarea-text-layer').should('not.have.text', '');
+ // Wait for the inline cell editor to be active (blinking cursor over
+ // the cell). The formula bar shares .ui-custom-textarea-text-layer
+ // with the cell editor, so the previous assertion could pass while
+ // the cell was not yet in edit mode and the subsequent keystrokes
+ // would then move the cell selection instead of editing A1.
+ cy.cGet('.cursor-overlay .blinking-cursor').should('be.visible');

let url = 'http://www.example.com/';
helper.typeIntoDocument('{rightArrow}{backspace}' + url + '{enter}');
@@ -207,6 +212,11 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Calc clipboard tests.', fu

calcHelper.clickOnFirstCell();
cy.cGet('.hyperlink-pop-up-container').should('be.visible');
+ // Confirm the popup belongs to our URL (not a stale popup left over
+ // from an earlier click) and that the kit considers A1 the current
+ // selection: the formula bar reflects the active cell's value.
+ cy.cGet('#hyperlink-pop-up').should('have.text', url);
+ cy.cGet('#sc_input_window.formulabar .ui-custom-textarea-text-layer').should('have.text', url);

helper.processToIdle(this.win);
cy.cGet('#hyperlink-pop-up-copy').click();

"Mike Kaganski (via cogerrit)"

unread,
May 21, 2026, 3:24:11 AM (5 days ago) May 21
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer1/a11y_dialog_spec.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit b3cfd05bc2d1624c734a1c7cc3fc968fbb69d98d
Author: Mike Kaganski <mike.k...@collabora.com>
AuthorDate: Thu May 21 06:52:31 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Thu May 21 07:23:54 2026 +0000

cypress: a11y_dialog_spec: avoid the check for now

Test fail ever since 7f87ecf946505600842c90e33b53c6daa2976ee3,
likely because 37af74b8f108e4414ee9c8ef148b24f5ee35c652 dropped
setting CompleteWriterDialogCoverage.

Change-Id: I3850faa037a82ed6ba367698a961cb7f7da73c46
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/3024
Tested-by: Caolán McNamara <caolan....@collabora.com>
Reviewed-by: Caolán McNamara <caolan....@collabora.com>

diff --git a/cypress_test/integration_tests/desktop/writer1/a11y_dialog_spec.js b/cypress_test/integration_tests/desktop/writer1/a11y_dialog_spec.js
index fbdd9a76b992..ace7782b5e50 100644
--- a/cypress_test/integration_tests/desktop/writer1/a11y_dialog_spec.js
+++ b/cypress_test/integration_tests/desktop/writer1/a11y_dialog_spec.js
@@ -77,7 +77,7 @@ describe(['tagdesktop'], 'Accessibility Writer Dialog Tests', { testIsolation: f

cy.get('@uicoverageResult').then(result => {
expect(result.used, `used .ui files`).to.not.be.empty;
- expect(result.CompleteWriterDialogCoverage, `complete writer dialog coverage`).to.be.true;
+ // expect(result.CompleteWriterDialogCoverage, `complete writer dialog coverage`).to.be.true;
// TODO: make this true
// expect(result.CompleteCommonDialogCoverage, `complete common dialog coverage`).to.be.true;
});

"Szymon Kłos (via cogerrit)"

unread,
May 21, 2026, 4:20:59 AM (5 days ago) May 21
to collaboraon...@googlegroups.com
cypress_test/integration_tests/mobile/writer/insert_object_spec.js | 5 +++++
1 file changed, 5 insertions(+)

New commits:
commit d6aa04b3f8f7f2fc0b6762dd80398cc5919bef73
Author: Szymon Kłos <szymo...@collabora.com>
AuthorDate: Mon May 18 12:44:25 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Thu May 21 08:20:16 2026 +0000

cypress: drain core after inserting tables in insert_object

Same race as delete_objects_spec.js: the .table-column-resize-marker
appears before the new cells are in the document model, so the
immediate ctrl+a / copy selects nothing and #copy-paste-container
ends up empty. processToIdle between the marker assertion and the
ctrl+a in both the default and custom table tests.

Signed-off-by: Szymon Kłos <szymo...@collabora.com>
Change-Id: I29ef2592f43e4233ccb570111ef11d80fa094249
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2809
Reviewed-by: Mohit Marathe <mohit....@collabora.com>
Tested-by: Caolán McNamara <caolan....@collabora.com>
Reviewed-by: Caolán McNamara <caolan....@collabora.com>

diff --git a/cypress_test/integration_tests/mobile/writer/insert_object_spec.js b/cypress_test/integration_tests/mobile/writer/insert_object_spec.js
index 465172396c77..1749ad1d8ce9 100644
--- a/cypress_test/integration_tests/mobile/writer/insert_object_spec.js
+++ b/cypress_test/integration_tests/mobile/writer/insert_object_spec.js
@@ -45,6 +45,9 @@ describe(['tagmobile', 'tagnextcloud'], 'Insert objects via insertion wizard.',
cy.cGet('.inserttablecontrols button').should('be.visible').click();
// Table is inserted with the markers shown
cy.cGet('.table-column-resize-marker').should('exist');
+ // The marker can render before the table cells are in the document
+ // model, so a bare ctrl+a/copy sequence selects nothing.
+ helper.processToIdle(this.win);
helper.typeIntoDocument('{ctrl}a');
helper.copy();
// Two rows
@@ -66,6 +69,8 @@ describe(['tagmobile', 'tagnextcloud'], 'Insert objects via insertion wizard.',
cy.cGet('.inserttablecontrols button').should('be.visible').click();
// Table is inserted with the markers shown
cy.cGet('.table-column-resize-marker').should('exist');
+ // Same insert-then-select race as 'Insert default table'.
+ helper.processToIdle(this.win);
helper.typeIntoDocument('{ctrl}a');
helper.copy();
// Three rows

"Szymon Kłos (via cogerrit)"

unread,
May 21, 2026, 6:04:39 PM (4 days ago) May 21
to collaboraon...@googlegroups.com
cypress_test/integration_tests/mobile/writer/mobile_wizard_state_spec.js | 20 ++++++++++
1 file changed, 20 insertions(+)

New commits:
commit de3e3e1e6827e0aa7a2e27bd0765728b78b1ea8b
Author: Szymon Kłos <szymo...@collabora.com>
AuthorDate: Tue May 19 08:16:14 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Thu May 21 22:04:13 2026 +0000

cypress: add explicit single-click regression for mobile wizard reopen

The existing "Close mobile wizard by hamburger menu." test exercises
the reopen path through mobileHelper.openMobileWizard, which begins
with a processToIdle and so masks any race in the toggle itself.

Add a sibling test that clicks the toolbar button once after the
hamburger menu round-trip and asserts the wizard opens (content
populated and the button gains the 'selected' class). With the
legacy refresh-sidebar pathway removed, this scenario would no-op
the first click if core's sidebar state and the browser's mobile
wizard state ever fell out of sync.

Signed-off-by: Szymon Kłos <szymo...@collabora.com>
Change-Id: Ifd3c0811347bf0cbf8c4d804013bb68ff9a6147a
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2932
Tested-by: Caolán McNamara <caolan....@collabora.com>
Reviewed-by: Caolán McNamara <caolan....@collabora.com>

diff --git a/cypress_test/integration_tests/mobile/writer/mobile_wizard_state_spec.js b/cypress_test/integration_tests/mobile/writer/mobile_wizard_state_spec.js
index 0811bf496b53..fecca0c1b6d6 100644
--- a/cypress_test/integration_tests/mobile/writer/mobile_wizard_state_spec.js
+++ b/cypress_test/integration_tests/mobile/writer/mobile_wizard_state_spec.js
@@ -32,6 +32,26 @@ describe(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Mobile wizard state tests',
mobileHelper.openMobileWizard();
});

+ // Regression: after closing the hamburger menu, a single click on
+ // the mobile wizard toolbar button must reopen the wizard. With the
+ // legacy refresh-sidebar pathway removed, core's sidebar state
+ // could fall out of sync with the browser's after the hamburger
+ // menu took it over, and the first reopen click would no-op
+ // (forcing the user to click twice).
+ it('Mobile wizard reopens on first click after hamburger menu.', function() {
+ mobileHelper.enableEditingMobile();
+ mobileHelper.openMobileWizard();
+ mobileHelper.openHamburgerMenu();
+ mobileHelper.closeHamburgerMenu();
+ // Single click - not through openMobileWizard which would
+ // drain core and mask the race.
+ cy.cGet('#toolbar-up #mobile_wizard')
+ .should('not.have.class', 'disabled')
+ .click();
+ cy.cGet('#mobile-wizard-content').should('not.be.empty');
+ cy.cGet('#toolbar-up #mobile_wizard').should('have.class', 'selected');
+ });
+
it('Close mobile wizard by context wizard.', function() {
// Click on edit button
mobileHelper.enableEditingMobile();

"Mohit Marathe (via cogerrit)"

unread,
May 21, 2026, 6:11:04 PM (4 days ago) May 21
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/impress/table_operation_spec.js | 4 ++++
cypress_test/integration_tests/mobile/impress/table_operation_spec.js | 4 ++++
2 files changed, 8 insertions(+)

New commits:
commit 7754c9a72d46581779fc3bd924a175264ce222d6
Author: Mohit Marathe <mohit....@collabora.com>
AuthorDate: Wed May 20 17:28:26 2026 +0530
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Thu May 21 22:10:10 2026 +0000

cypress: wait for idle after table SVG retrigger

retriggerNewSvgForTableInTheCenter typed ctrl+a then let the
caller assertion run, so under CI load the impress Merge Row /
Merge Column path-count was evaluated before the new
shapeselectioncontent reply landed. Drain via processToIdle.

Signed-off-by: Mohit Marathe <mohit....@collabora.com>
Change-Id: I635f056da1331d0d5d796418729bb1c0c6c2abb2
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/2988
Tested-by: Caolán McNamara <caolan....@collabora.com>
Reviewed-by: Caolán McNamara <caolan....@collabora.com>

diff --git a/cypress_test/integration_tests/desktop/impress/table_operation_spec.js b/cypress_test/integration_tests/desktop/impress/table_operation_spec.js
index 47d2b7fb7e86..2299685fceeb 100644
--- a/cypress_test/integration_tests/desktop/impress/table_operation_spec.js
+++ b/cypress_test/integration_tests/desktop/impress/table_operation_spec.js
@@ -21,6 +21,10 @@ describe(['tagdesktop'], 'Table operations', function() {
impressHelper.removeShapeSelection();

helper.typeIntoDocument('{ctrl}{a}');
+
+ cy.getFrameWindow().then(function(win) {
+ helper.processToIdle(win);
+ });
}

function selectFullTable(win) {
diff --git a/cypress_test/integration_tests/mobile/impress/table_operation_spec.js b/cypress_test/integration_tests/mobile/impress/table_operation_spec.js
index ccefdde855a9..edba1bbb4cc1 100644
--- a/cypress_test/integration_tests/mobile/impress/table_operation_spec.js
+++ b/cypress_test/integration_tests/mobile/impress/table_operation_spec.js
@@ -20,6 +20,10 @@ describe.skip(['tagmobile', 'tagnextcloud', 'tagproxy'], 'Table Operation', func
impressHelper.removeShapeSelection();

helper.typeIntoDocument('{ctrl}{a}');
+
+ cy.getFrameWindow().then(function(win) {
+ helper.processToIdle(win);
+ });
}

function selectFullTable() {

"Caolán McNamara (via cogerrit)"

unread,
May 22, 2026, 4:31:59 AM (4 days ago) May 22
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/impress_helper.js | 18 ++++++
cypress_test/integration_tests/multiuser/impress/follow_me_slideshow_spec.js | 30 +++++-----
2 files changed, 33 insertions(+), 15 deletions(-)

New commits:
commit 7e431abc5cc71a7ef8990748b5b8ea4dad81e17f
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Wed May 20 22:54:21 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Fri May 22 08:31:24 2026 +0000

cypress: multiuser/impress/follow_me_slideshow: show controls before nav click

The slideshow nav container hides itself 3 seconds after the last
_showSlideControls call. Under heavy CI load the gap between cypress
steps exceeds that, then the next click on a nav-container button
fails with "visibility: hidden".

Add a helper that calls the presenter's _showSlideControls before
each click, which resets both the visibility and the 3 second hide
timer.

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I3cef9f3e074832d3175665b8df68dc7e8a1ed47a
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/3027

diff --git a/cypress_test/integration_tests/common/impress_helper.js b/cypress_test/integration_tests/common/impress_helper.js
index 8fef58b03989..387a4f7b1446 100644
--- a/cypress_test/integration_tests/common/impress_helper.js
+++ b/cypress_test/integration_tests/common/impress_helper.js
@@ -270,6 +270,23 @@ function waitForSlideShowIdle(win) {
helper.waitForTimers(win, 'slideshowupdate');
}

+// Click a slideshow-nav-container button. The nav container auto-hides
+// after 3s of inactivity via _showSlideControls' setTimeout - under
+// heavy CI load the gap between cypress steps can exceed that and the
+// click then fails with "visibility: hidden". Call the presenter's
+// _showSlideControls first to reset the timer and make the controls
+// visible before the click.
+function clickSlideShowNav(win, buttonSelector) {
+ cy.then(function () {
+ var presenter = win.app && win.app.map && win.app.map.slideShowPresenter;
+ if (presenter && presenter._showSlideControls)
+ presenter._showSlideControls();
+ });
+ getSlideShowContent()
+ .find('.slideshow-nav-container ' + buttonSelector)
+ .click();
+}
+
module.exports.assertNotInTextEditMode = assertNotInTextEditMode;
module.exports.assertInTextEditMode = assertInTextEditMode;
module.exports.typeTextAndVerify = typeTextAndVerify;
@@ -287,3 +304,4 @@ module.exports.getSlideShow = getSlideShow;
module.exports.getSlideShowContent = getSlideShowContent;
module.exports.getSlideShowCanvas = getSlideShowCanvas;
module.exports.waitForSlideShowIdle = waitForSlideShowIdle;
+module.exports.clickSlideShowNav = clickSlideShowNav;
diff --git a/cypress_test/integration_tests/multiuser/impress/follow_me_slideshow_spec.js b/cypress_test/integration_tests/multiuser/impress/follow_me_slideshow_spec.js
index 06d9d8507f27..94fd20573068 100644
--- a/cypress_test/integration_tests/multiuser/impress/follow_me_slideshow_spec.js
+++ b/cypress_test/integration_tests/multiuser/impress/follow_me_slideshow_spec.js
@@ -31,7 +31,7 @@ describe(['tagmultiuser'], 'Follow me slide show', function() {

cy.cSetActiveFrame('#iframe2');
getSlideShow().should('be.visible');
- getSlideShowContent().find(".slideshow-nav-container #endshow").click();
+ impressHelper.clickSlideShowNav(win2, '#endshow');
getSlideShow().should('not.exist');
cy.cGet('.notebookbar #slide-presentation-follow-me').should('be.not.visible');
cy.cGet('.notebookbar #slide-presentation-follow').should('be.visible');
@@ -60,7 +60,7 @@ describe(['tagmultiuser'], 'Follow me slide show', function() {

//move to nextslide last effect
for (let i = 0; i < 5; i++) {
- getSlideShowContent().find(".slideshow-nav-container #next").click();
+ impressHelper.clickSlideShowNav(win2, '#next');
impressHelper.waitForSlideShowIdle(win2);
impressHelper.waitForSlideShowIdle(win1);
}
@@ -73,7 +73,7 @@ describe(['tagmultiuser'], 'Follow me slide show', function() {

// go to previous effect
cy.cSetActiveFrame('#iframe2');
- getSlideShowContent().find(".slideshow-nav-container #previous").click();
+ impressHelper.clickSlideShowNav(win2, '#previous');
impressHelper.waitForSlideShowIdle(win2);
impressHelper.waitForSlideShowIdle(win1);
getSlideShowCanvas().compareSnapshot('slide2_effect2', 0.05);
@@ -84,7 +84,7 @@ describe(['tagmultiuser'], 'Follow me slide show', function() {
//go to previous effect
cy.cSetActiveFrame('#iframe2');
for (let i = 0; i < 3; i++) {
- getSlideShowContent().find(".slideshow-nav-container #previous").click();
+ impressHelper.clickSlideShowNav(win2, '#previous');
impressHelper.waitForSlideShowIdle(win2);
impressHelper.waitForSlideShowIdle(win1);
}
@@ -103,7 +103,7 @@ describe(['tagmultiuser'], 'Follow me slide show', function() {

//move to nextslide last effect
for (let i = 0; i < 4; i++) {
- getSlideShowContent().find(".slideshow-nav-container #next").click();
+ impressHelper.clickSlideShowNav(win2, '#next');
impressHelper.waitForSlideShowIdle(win2);
impressHelper.waitForSlideShowIdle(win1);
}
@@ -116,7 +116,7 @@ describe(['tagmultiuser'], 'Follow me slide show', function() {

//unfollow by going 1 slide backward
for (let i = 0; i < 3; i++) {
- getSlideShowContent().find(".slideshow-nav-container #previous").click();
+ impressHelper.clickSlideShowNav(win1, '#previous');
impressHelper.waitForSlideShowIdle(win1);
}
// higher tolerance due to difference in state of navigation buttons
@@ -130,7 +130,7 @@ describe(['tagmultiuser'], 'Follow me slide show', function() {
getSlideShowCanvas().compareSnapshot('slide2_effect2', 0.07);

cy.cSetActiveFrame('#iframe2');
- getSlideShowContent().find(".slideshow-nav-container #next").click();
+ impressHelper.clickSlideShowNav(win2, '#next');
impressHelper.waitForSlideShowIdle(win2);
impressHelper.waitForSlideShowIdle(win1);
getSlideShowCanvas().compareSnapshot('slide2_effect3', 0.07);
@@ -145,7 +145,7 @@ describe(['tagmultiuser'], 'Follow me slide show', function() {

//move to nextslide last effect
for (let i = 0; i < 4; i++) {
- getSlideShowContent().find(".slideshow-nav-container #next").click();
+ impressHelper.clickSlideShowNav(win2, '#next');
impressHelper.waitForSlideShowIdle(win2);
impressHelper.waitForSlideShowIdle(win1);
}
@@ -153,7 +153,7 @@ describe(['tagmultiuser'], 'Follow me slide show', function() {

cy.cSetActiveFrame('#iframe1');
impressHelper.waitForSlideShowIdle(win1);
- getSlideShowContent().find(".slideshow-nav-container #endshow").click();
+ impressHelper.clickSlideShowNav(win1, '#endshow');
getSlideShow().should('not.exist');
// Wait for the _windowCloseInterval cleanup to complete before clicking follow.
helper.waitForTimers(win1, 'slideshowwindowclose');
@@ -189,7 +189,7 @@ describe(['tagmultiuser'], 'Follow me slide show', function() {
getSlideShow().should('be.visible');
impressHelper.waitForSlideShowIdle(win2);
impressHelper.waitForSlideShowIdle(win1);
- getSlideShowContent().find('.slideshow-nav-container #next').click();
+ impressHelper.clickSlideShowNav(win2, '#next');
impressHelper.waitForSlideShowIdle(win2);
impressHelper.waitForSlideShowIdle(win1);

@@ -214,7 +214,7 @@ describe(['tagmultiuser'], 'Follow me slide show', function() {
impressHelper.waitForSlideShowIdle(win2);
impressHelper.waitForSlideShowIdle(win1);
for (let i = 0; i < 4; i++) {
- getSlideShowContent().find('.slideshow-nav-container #next').click();
+ impressHelper.clickSlideShowNav(win2, '#next');
impressHelper.waitForSlideShowIdle(win2);
impressHelper.waitForSlideShowIdle(win1);
}
@@ -226,9 +226,9 @@ describe(['tagmultiuser'], 'Follow me slide show', function() {
impressHelper.waitForSlideShowIdle(win1);

// Follower goes backward 2 times on slide 2 to rewind effects
- getSlideShowContent().find('.slideshow-nav-container #previous').click();
+ impressHelper.clickSlideShowNav(win1, '#previous');
impressHelper.waitForSlideShowIdle(win1);
- getSlideShowContent().find('.slideshow-nav-container #previous').click();
+ impressHelper.clickSlideShowNav(win1, '#previous');
impressHelper.waitForSlideShowIdle(win1);

// Follower presses PageDown - should skip only to leader's 2 effects, not all 3
@@ -244,7 +244,7 @@ describe(['tagmultiuser'], 'Follow me slide show', function() {
getSlideShow().should('be.visible');
impressHelper.waitForSlideShowIdle(win2);
impressHelper.waitForSlideShowIdle(win1);
- getSlideShowContent().find(".slideshow-nav-container #next").click();
+ impressHelper.clickSlideShowNav(win2, '#next');
impressHelper.waitForSlideShowIdle(win2);
impressHelper.waitForSlideShowIdle(win1);

@@ -255,7 +255,7 @@ describe(['tagmultiuser'], 'Follow me slide show', function() {
getSlideShowCanvas().compareSnapshot('effect1', 0.05);

cy.cSetActiveFrame('#iframe2');
- getSlideShowContent().find(".slideshow-nav-container #endshow").click();
+ impressHelper.clickSlideShowNav(win2, '#endshow');
getSlideShow().should('not.exist');
cy.cSetActiveFrame('#iframe1');
getSlideShow().should('not.exist');

"Szymon Kłos (via cogerrit)"

unread,
May 22, 2026, 8:41:53 AM (3 days ago) May 22
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/desktop_helper.js | 2 ++
1 file changed, 2 insertions(+)

New commits:
commit e2e3589b3ac729d1b2ca806eaa0283b5c0de718c
Author: Szymon Kłos <szymo...@collabora.com>
AuthorDate: Thu May 21 18:10:51 2026 +0000
Commit: Szymon Kłos <szymo...@collabora.com>
CommitDate: Fri May 22 12:41:35 2026 +0000

cypress: stabilize zoom selector

Signed-off-by: Szymon Kłos <szymo...@collabora.com>
Change-Id: Ifaf6580a101ff0896f8a8df033f2be337e528e99
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/3091
Tested-by: Jenkins CPCI <rel...@collaboraoffice.com>

diff --git a/cypress_test/integration_tests/common/desktop_helper.js b/cypress_test/integration_tests/common/desktop_helper.js
index a2deec26b3b1..51a05417eb8c 100644
--- a/cypress_test/integration_tests/common/desktop_helper.js
+++ b/cypress_test/integration_tests/common/desktop_helper.js
@@ -242,6 +242,8 @@ function selectZoomLevel(zoomLevel, makeZoomVisible = true) {
if (makeZoomVisible)
makeZoomItemsVisible();
cy.cGet('#toolbar-down #zoom .arrowbackground').click();
+ // wait for fade-in animation end
+ cy.cGet('#zoom-dropdown').should('have.css', 'opacity', '1');
cy.cGet('#zoom-dropdown').contains('.ui-combobox-entry', zoomLevel).click();
shouldHaveZoomLevel(zoomLevel);


"Caolán McNamara (via cogerrit)"

unread,
May 22, 2026, 2:06:29 PM (3 days ago) May 22
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/writer3/scrolling_spec.js | 14 +++++++---
1 file changed, 10 insertions(+), 4 deletions(-)

New commits:
commit ea83c73237e0de0598b6c8326e977f4a71f0940b
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Thu May 21 20:54:29 2026 +0000
Commit: Noel Grandin <noel.g...@collabora.com>
CommitDate: Fri May 22 18:05:12 2026 +0000

cypress: writer3/scrolling: re-fire realMouseMove until isMouseInside is true

Under heavy CI load a single realMouseMove can race the section
container's mouse handler and silently disappear, leaving
isMouseInside false for the entire 10s retry window. The prior
should() loop only re-evaluated the assertion, not the move.
Poll-and-re-fire so at least one move event arrives before the
mousedown.

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: Icc354883112186d49c652b6b82a96f12530b8b65
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/3100
Tested-by: Jenkins CPCI <rel...@collaboraoffice.com>
Reviewed-by: Noel Grandin <noel.g...@collabora.com>

diff --git a/cypress_test/integration_tests/desktop/writer3/scrolling_spec.js b/cypress_test/integration_tests/desktop/writer3/scrolling_spec.js
index 45ecbd035071..5f3eac7b5481 100644
--- a/cypress_test/integration_tests/desktop/writer3/scrolling_spec.js
+++ b/cypress_test/integration_tests/desktop/writer3/scrolling_spec.js
@@ -103,10 +103,16 @@ describe(['tagdesktop', 'tagnextcloud', 'tagproxy'], 'Scroll through document',
var sidebarX = Math.floor(rect.right + 80);

// Hover the canvas so mouseIsInside is true on mousedown.
- cy.cGet('body').realMouseMove(barX, barY);
- cy.wrap(null).should(function() {
- expect(win.app.sectionContainer.isMouseInside()).to.be.true;
- });
+ // Under heavy CI load a single realMouseMove can race the
+ // section container's mouseenter handler, so re-fire on a
+ // polling loop until the flag flips.
+ cy.waitUntil(function() {
+ cy.cGet('body').realMouseMove(barX, barY);
+ return cy.wrap(null).then(function() {
+ return win.app.sectionContainer.isMouseInside();
+ });
+ }, { interval: 500,
+ errorMsg: 'mouse never registered as inside section container' });

cy.cGet('body').realMouseDown({
pointer: 'mouse', button: 'left',

"Szymon Kłos (via cogerrit)"

unread,
May 22, 2026, 2:49:19 PM (3 days ago) May 22
to collaboraon...@googlegroups.com
cypress_test/integration_tests/desktop/impress/image_operation_spec.js | 9 +++++++++
1 file changed, 9 insertions(+)

New commits:
commit e1e2050ca0d09e23be044143f8464d4c13a2302b
Author: Szymon Kłos <szymo...@collabora.com>
AuthorDate: Fri May 22 12:51:04 2026 +0000
Commit: Caolán McNamara <caolan....@collabora.com>
CommitDate: Fri May 22 18:48:59 2026 +0000

cypress: stabilize impress/image_operation_spec.js

Signed-off-by: Szymon Kłos <szymo...@collabora.com>
Change-Id: I69fc75fc4b59cd9bcf9663c9edeab713398c39ee
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/3128
Reviewed-by: Caolán McNamara <caolan....@collabora.com>
Tested-by: Jenkins CPCI <rel...@collaboraoffice.com>

diff --git a/cypress_test/integration_tests/desktop/impress/image_operation_spec.js b/cypress_test/integration_tests/desktop/impress/image_operation_spec.js
index a2c58309dc16..099ba31d499b 100644
--- a/cypress_test/integration_tests/desktop/impress/image_operation_spec.js
+++ b/cypress_test/integration_tests/desktop/impress/image_operation_spec.js
@@ -10,9 +10,17 @@ describe(['tagdesktop'], 'Image Operation Tests', function() {
helper.setupAndLoadDocument('impress/image_operation.odp');
desktopHelper.switchUIToNotebookbar();
cy.viewport(1920,1080);
+
+ // give some time to open fully the app
+ cy.wait(1000);
+
+ cy.getFrameWindow().then((win) => {
+ this.win = win;
+ });
});

it('Insert/Delete image',function() {
+ helper.processToIdle(this.win);
desktopHelper.insertImage();

//make sure that image is in focus
@@ -23,6 +31,7 @@ describe(['tagdesktop'], 'Image Operation Tests', function() {
});

it("Insert multimedia", function () {
+ helper.processToIdle(this.win);
desktopHelper.insertVideo();

// The video foreignObject lives inside a nested <svg> wrapper.

"Caolán McNamara (via cogerrit)"

unread,
4:20 AM (13 hours ago) 4:20 AM
to collaboraon...@googlegroups.com
cypress_test/integration_tests/common/impress_helper.js | 28 +++++++++-------
1 file changed, 16 insertions(+), 12 deletions(-)

New commits:
commit 1b0967b0236ae3c022c68f3a10a2d63f1b2287c8
Author: Caolán McNamara <caolan....@collabora.com>
AuthorDate: Thu May 21 23:07:57 2026 +0000
Commit: Mohit Marathe <mohit....@collabora.com>
CommitDate: Mon May 25 08:19:07 2026 +0000

cypress: clickSlideShowNav: re-call _showSlideControls inside the retry loop

The slideshow nav container auto-hides 3s after the last
_showSlideControls call. Calling _showSlideControls once before the
click is not enough on a slow runner because cypress's own retry
loop on .click() only re-checks visibility, never re-calls the
timer reset. Drive the loop ourselves: each iteration re-calls
_showSlideControls and clicks as soon as the button is visible.

Signed-off-by: Caolán McNamara <caolan....@collabora.com>
Change-Id: I2f26c0301bb90eb3438c8ac6e70e7d7f186d777b
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/3102
Tested-by: Jenkins CPCI <rel...@collaboraoffice.com>
Reviewed-by: Mohit Marathe <mohit....@collabora.com>

diff --git a/cypress_test/integration_tests/common/impress_helper.js b/cypress_test/integration_tests/common/impress_helper.js
index 41f4e9c7d76e..0f1716c92c01 100644
--- a/cypress_test/integration_tests/common/impress_helper.js
+++ b/cypress_test/integration_tests/common/impress_helper.js
@@ -270,21 +270,25 @@ function waitForSlideShowIdle(win) {
helper.waitForTimers(win, 'slideshowupdate');
}

-// Click a slideshow-nav-container button. The nav container auto-hides
-// after 3s of inactivity via _showSlideControls' setTimeout - under
-// heavy CI load the gap between cypress steps can exceed that and the
-// click then fails with "visibility: hidden". Call the presenter's
-// _showSlideControls first to reset the timer and make the controls
-// visible before the click.
+// Click a slideshow-nav-container button. The nav container auto-hides after
+// 3s of inactivity via _showSlideControls' setTimeout. Under heavy CI load the
+// gap between cypress steps can be more than that and cypress's own retry
+// doesn't know about the auto-hide timer.
+// So re-call _showSlideControls each iteration and click as soon as the button
+// is visible.
function clickSlideShowNav(win, buttonSelector) {
- cy.then(function () {
- var presenter = win.app && win.app.map && win.app.map.slideShowPresenter;
+ var presenter = win.app && win.app.map && win.app.map.slideShowPresenter;
+ cy.waitUntil(function () {
if (presenter && presenter._showSlideControls)
presenter._showSlideControls();
- });
- getSlideShowContent()
- .find('.slideshow-nav-container ' + buttonSelector)
- .click();
+ return getSlideShowContent()
+ .find('.slideshow-nav-container ' + buttonSelector)
+ .then(function ($el) {
+ if (!Cypress.dom.isVisible($el)) return false;
+ return cy.wrap($el).click().then(function () { return true; });
+ });
+ }, { interval: 500,
+ errorMsg: 'slideshow nav button "' + buttonSelector + '" never reachable' });
}

module.exports.assertNotInTextEditMode = assertNotInTextEditMode;

Reply all
Reply to author
Forward
0 new messages