Open Source in Action #18: An Extension API, Android Test Builds, and 8,000 Commits

This week, extensions gained real reach into the UI, covering menus, toolbars, notebookbar tabs and keyboard shortcuts. The first Android test builds went up for public download, and the codebase crossed 8,000 all-time commits. Here’s the roundup.

The Numbers

This week: 406 commits merged by 36 contributors, with 300 open changes on online/main. All-time since April 2nd: 8,477 commits merged from 74 contributors, crossing the 8,000 milestone in under five months.

Top reviewers this week: Caolán McNamara (74), Noel Grandin (60), Szymon Kłos (53), Stephan Bergmann (39), Michael Stahl (37), Tomaž Vajngerl (26), Mike Kaganski (24), Miklos Vajna (11), Skyler Grey (4), Andras Timar (3).

Thank you to every reviewer. Caolán led the way with 74, and the top three between them carried nearly 190 reviews.

A warm welcome to this week’s new contributors, AlexYang, Ermahan Qarabai, Graweeld, Tom Haelbich and tigran54. Thank you for your first contributions!

Android Test Builds Are Here

Following the iOS TestFlight, Android snapshot builds are now available for download. Skyler got the Android build working for releases, with nightly builds planned once the current patch series lands. Both platforms are open for testing:

There’s also a dedicated mobile branch now, distro/collabora/co-26.04-mobile. If you have mobile patches, cherry-pick them there and assign Skyler for review.

What Developers Are Building

406 commits, and several long-running efforts reached the finish line at once.

Extensions: A Real API

Extensions gained first-class access to the UI this week.

  • Menus, toolbars and shortcuts. Samuel Mehrbrodt’s patches covered the whole surface of the extensions API: notebookbar tabs, the context menu, the classic menu, buttons on the context toolbar, and an extension’s own keyboard shortcuts. notebookbar tabs · keyboard shortcuts

  • Presentations API. Mohit Marathe grew the scriptinterop API for presentations and added a deck-builder demo extension showing what it can do. deck-builder demo

  • Compatibility and safety. Stephan Bergmann made extensions load UNO types by their older names from JavaScript (cool#15927), with Noel Grandin doing the same for Python and Basic. Stephan also disabled extensions in restricted modes so the new capability doesn’t widen the attack surface. restricted modes

Thank you all. This turns extensions from a hook into a platform.

The Browser Engine: Retiring the Map Element

A very large body of work from Gökay Şatır merged this week, finally retiring the map element and its lat/lng coordinate system from the browser.

  • All three applications moved onto the ViewLayout classes. Calc, Writer and Impress no longer depend on the map element. free Calc from the map element · move Writer to ViewLayoutNewBase

  • Zoom moved into documentbase. The map’s wheel-scroll handler and zoom animation are gone. zoom into ViewLayout

  • A long tail of dead code went with it. maxBounds, the collapsed-comments branch, the desktop Calc zoom helpers, and the usesZoomControl gate. Coordinate math in the comments list is simpler too.

Inheriting a geographic mapping library’s coordinate model for a document editor was always going to cost something, and unwinding it across three applications without breaking them is patient, high-risk work. Thank you Gökay, and thank you to Szymon Kłos for shepherding it through review.

Gökay also fixed the Calc editing area size, aligned the dark-mode cell cursor to the same coordinate space, corrected the Impress selection rectangle, disabled automatic view scrolling in multipage view, and made resolved comments show in Writer when the toggle is on. editing area · resolved comments

A Leaner UI Codebase

  • Tools > Options and Tools > Customize are gone. Andras Timar removed both dialogs and everything behind them: the Writer, Calc, Impress and Draw option pages, the sfx2 hooks the dialog reached the modules through, the slot ids, and the translatable strings. The aim is to drop UI that Collabora Online and the desktop app don’t use, which means less code to maintain and fewer strings for translators to carry. More of this is coming. options dialog · customize dialog

  • Configuration replaced the dialog as the way in. Module measurement units now stay in step with the configuration directly, and the uitests set options through configuration instead of driving a dialog. measurement units

  • Other cleanup. Andras collapsed the dual-mode UI branches onto the COKit path, removed the sidebar dock and undock entries and the system colour picker option, and made jsdialog send button icon names in place of base64 bitmaps. icon names

Document Signing on macOS

  • Keychain support. Andras added macOS Keychain signing through the Security framework. Keychain signing

  • Signing from the session. The session signing certificate now goes on the view for PDF export, the PDF export signature tab is enabled where a certificate is reachable, and the certificate chooser no longer appears when the certificate already comes from the session. signature tab

  • Dialog polish. The Select Certificate dialog got its layout and visual glitches fixed for COKit rendering. certificate dialog

Calc: Live Table Styles

  • Table styles apply live (cool#16081). Samuel resolves the formatting on the fly, dispatches UNO commands to apply a style, and renders real preview thumbnails in the style gallery. Previously the formatting was baked in at apply time. live table styles · style thumbnails

  • A run of Calc fixes from Samuel. Sheet order stays stable under rapid Insert-sheet clicks (cool#7348), frozen columns work when leading columns are hidden (cool#13295), Ctrl+Home resets scroll correctly with a frozen row (cool#7839), and OLE objects appear in Calc’s link targets (cool#6231). frozen columns

  • Formulas by name. Rashesh Padia added .uno:SetCellFormula to set a cell from an English formula string and had .uno:CalcFunctionList return English function names, then wired the AI assistant’s formulas through the new command. That replaces a good deal of fragile string handling. SetCellFormula

  • Smaller wins. Gülşah Köse made Text to Column warn before overwriting existing cell data, and Banobe Pascal anchored the autofilter popup to its own column instead of the selection. Caolán tightened the xlsx export path, collecting a row’s areas before making cell records and skipping blank cells that get dropped again. autofilter anchor · xlsx export

Writer

  • Layout fixes. Mohit Marathe counted only paragraphs when widening an automatic-width frame, used a manually aligned table’s width for the fly auto width, left a table in place beside a fly it doesn’t reach, and gave a VML textbox with wrap style none a variable frame width. fly auto width

  • Rendering correctness. Aron Budea fixed a background fly clipped over a page obscuring text (cool#16118), and Samuel kept table borders visible on a dark background (cool#15645). dark table borders

  • Find & Replace cleanup. Miklos Vajna replaced only pure deletions in redline mode (tdf#36582), disabled Replace when “Current selection only” is set (tdf#90558), and removed a non-working Page Style entry (tdf#74078). redline replace

  • Also. Miklos continued the cross-document paste-special asyncness work (cool#16013), and Mike Kaganski saved the form control label font and alignment (tdf#165609). paste special async

Impress & Draw

  • PPTX masters. Mike Kaganski gave the slide master the shapes its layouts share and kept a layout’s own shapes off the master (cool#16080). slide master shapes

  • SmartArt. Armin Le Grand pushed the refactor through two steps, first the add and remove of DataNodes in the Diagram and then the layout, and made LineAttributes survive the ODF to PPTX round-trip, with Regina Henschel reviewing throughout. Thank you both. SmartArt interoperability is one of the hardest corners of OOXML and it’s steadily getting better. SmartArt layout · LineAttributes

  • Slide handling. Samuel let Return insert a new slide when the slide panel is focused (cool#16119), Caolán fixed inserting a slide from the sorter leaving the following slide current, and Năstasie Raul-Ionuț fixed multislide selection. multislide selection

  • Media and editing. Banobe made a pasted GIF insert as a file so it animates, and Shlok fixed table cell typing and pasting after the slide pane takes focus. pasted GIF

  • Slideshow and comments. Sahil Gautam tidied the full-screen slideshow handling so the presentation only claims and reacts to the full-screen changes it caused, and Pedro Silva fixed overlay stacking in the comments full view. slideshow full screen

  • Charts. Kurt Nordback followed last week’s funnel charts with axis and rendering fixes. funnel axis

Accessibility

  • Reading the accessibility tree in tests. Henry Castro built something that will pay off for a long time: Cypress can now read the accessibility tree over CDP, so a test can assert what a screen reader reports rather than inspecting the DOM. A test like that fails when a control stops being announced, so regressions get caught before users hit them. a11y tree over CDP

  • Draw covered end to end. Henry tested the notebookbar tabs, dialogs, property deck, bars, the F6 region ring, and toggle and pressed states. Draw a11y tree

  • What the tests now check. That a Calc cell is announced with its address and content, that the caret and selection reach readable content, and that the focus cycle wraps on a dialog’s own focusables. Calc cell announcement

  • The browser side. Henry named the F6 focus ring’s regions, made the classic toolbar a stop in that ring, named an overflow group’s button after the group, explained what the status bar’s zoom number means, kept invisible widgets out of the focusable list, stopped a tab page with no focusable widget taking focus, and gave Draw’s duplicate notebookbar shortcuts their own keys. Thank you Henry. F6 region names · status bar zoom

  • Screen reader behaviour. Năstasie Raul-Ionuț changed the order screen objects are read in Impress, removed a spurious “text entry area, blank” announcement after an object announcement, fixed slide announcements on macOS, and fixed input behaviour in the Insert Symbol dialog. Impress read order

Settings & Zoom

  • Default document zoom. Sahil Gautam made it settable both server-side through coolwsd.xml and per user, with View > Zoom > More now opening the Zoom Behaviour tab directly. zoom behaviour tab · server-side default zoom

  • Settings usability. Sahil gave the zoom settings their own section, lined the scrolled-to section up with the top of the list, let any checkbox carry a line of explanation, showed unchangeable checkboxes as greyed out, and let a user hand the zoom choice back to the server. He also made the file type icons in the desktop applications open the templates. settings sections

  • Sidebar layout. Szymon Kłos kept a vertical stack of sidebar elements with non-uniform height in order, and Andras kept the vertical tab rail visible when a page is empty, a fix Sahil followed up on after the design meeting. vertical stack

Security & Hardening

  • Protocols default-deny. Noel switched INetURLObject::IsExoticProtocol to default-deny, which is the right direction for a protocol allowlist. default-deny protocols

  • Bounded and validated input. Caolán kept header field names and values to the bytes RFC 9110 allows, let a caller cap how large a fetched HTTP response body may grow and applied that limit across the settings fetches, limited the cool: URL exemption to the src attribute alone, and stopped exotic filters being asked about content when the setting is off. body size cap · RFC 9110 header bytes

  • Configurable TLS floor. Samuel made the minimum TLS protocol version settable in coolwsd.xml (cool#1595). minimum TLS

  • No implicit defaults. Caolán gave every libxslt preference and transformation option an explicit value, worked through a long run of Coverity findings, and kept the modelling file in git so the next pass starts from a known state. libxslt options

Build & Performance

  • Windows builds went from 37 minutes to the low twenties. Caolán got there by building nss through its own gyp and ninja in place of the recursive make path, letting cairo and pixman join make’s job server so externals stay inside the overall job limit, disabling dependency tracking in the externals and icu, skipping msbuild file tracking, stopping msbuild reusing worker processes between builds, and skipping the python KillPython step so two Windows builds don’t race over it. Thank you Caolán. Every contributor on Windows gets that time back, every build. nss via gyp · shared job server

  • Platform builds. Tor Lillqvist fixed the ARM64 Windows build of nss, and Thorsten Behrens fixed the pdfium build with system abseil and worked around a clang -fpch-debuginfo issue. pdfium abseil

  • Engine modernisation. Noel continued the SAL_CALL removal through sal, rtl, osl, registry and salhelper, the map to unordered_map conversions, and the COKit std::string and std::vector migration. Mike Kaganski dropped OUString::operator!= and the operator+= taking OUStringBuffer. SAL_CALL in sal

  • Better debugging for extension authors. Stephan improved source information for exceptions thrown from cool.callRemote code and propagated console.* calls from there to the browser console. Small changes, and they take a lot of guesswork out of debugging extension code. console propagation

Elsewhere

  • iOS clipboard. Jan Holesovsky switched iOS copy and paste to the clipboard provider, matching the desktop apps, and taught it to paste an image another app copied as a URL. iOS clipboard

  • Mobile fixes. Karthik Godha added a keyboard-dismissal listener on iOS, a password dialog for documents with an edit password, and fixed a long-press on the Calc tab activating a menu entry. edit password dialog

  • Comments in the author’s timezone. Dennis Francis made comments stamp correctly across Writer, Calc and Impress. comment timezone

  • Clearer session expiry. Vivek reworded the messages and made them show the time left. session expiry

  • A document launcher page. Tomaž Vajngerl added a web page listing the documents you can open with Collabora Online, replacing the URL list that used to scroll past in the build output. launcher page

  • Also. Méven made FileUtil read a file of unknown size in steps, and Andras served the /livez and /readyz health checks through the reverse proxy. health checks

The Forum

The =PY() and NumPy thread is still going, now at seventeen replies and one of the longest-running technical discussions on the forum. The mobile testing call went out as its own announcement. If you have an Android or iOS device, that’s the thread to follow.

Elsewhere: a detailed macOS report on Export and Save As, a German-language thread on changing document templates in Writer on Linux, and a build question on the desktop app that got worked through in the replies. Heiko is also gathering input on Base, so if you have thoughts, the development category is open.

Design Meeting

Design system. Ivana proposed two additions: a dark mode toggle so contributors can check icons against a dark background, and having the icon set update automatically as new buttons arrive.

Floating onboarding. Continued discussion on the style of the floating introductory component, building on last week’s edit-mode discoverability thread.

Impress mobile. Ivana has defined all the user flows and prepared proposed changes derived from the desktop UX.

Dialog navigation. Banobe resumed the side-navigation work for dialogs with three or more primary tabs, now that Pedro has provided a mockup, and is adding a checkbox on the Background and Area tabs that triggers None.

Pedro’s Mockup for slide properties and Options dialog

Settings. Sahil’s default document zoom work merged, and he fixed the vertical tab rail collapsing on an empty tab page.

Community Calls

  • TC Meeting. Release engineering, patch review, CI, and what’s cooking: Stephan’s Google Apps Script-inspired extension API, Regina finishing HSL colour interpolation and reviewing Armin’s SmartArt patches, Miklos on cross-document paste special asyncness, Szymon on editeng content as HTML contenteditable, Caolán on the Windows build speedup and Landlock jail setup, Andras on the options dialog removal and macOS Keychain signing

  • Collabora Online Weekly Meeting #270 . Android snapshot builds live and the mobile branch announced, the issue count under 1,000, Banobe on GIF image controls and dialog navigation, Bayram on DOCX equation formatting, Attila on backports and AI assistant fixes, Ivana on Impress mobile research

  • UX/UI Design Meeting . Design system, floating onboarding, Impress mobile, dialog navigation

All minutes on the forum under meeting-minutes.

Get Involved

74 contributors, 8,477 commits, and mobile builds on both platforms in testers’ hands. Whether you write code, translate, test, design, or document, there’s a place for you.

See you in the code.

Leave a Reply

Get the latest updates to your inbox