HtmlUnit in 2025
As we step into 2026, it’s time to look back. Let me share some highlights from this journey.
HtmlUnit Releases
Throughout 2025, I released 13 versions of HtmlUnit (from 4.10. 0 to 4.21.0). Here are some of the major milestones:
Major Features & Improvements
I kept pace with the rapidly evolving browser landscape:
- Chrome/Edge: Updated support from version 133 through 143
- Firefox: Maintained compatibility from version 135 to 146
- Firefox ESR: Updated to version 140
New Sister Project: I launched jsoup-bridge, expanding HtmlUnit’s ecosystem and providing better integration options.
Migration of the entire test suite to JUnit 5
Developer Experience
- Published comprehensive SBOM (Software Bill of Materials) in CycloneDX format
- Created separate developer documentation to help new contributors
- Migrated to Sonatype central-publishing for snapshots and releases
- Reduced dependencies (Apache commons-codec is no longer a runtime dependency)
Neko HTML Parser:
- Better spec conformance for comment end detection
- Improved handling of formatting elements
- EOF handling refactored from exceptions to return codes
- Performance optimizations
Beyond these highlights, each release included continuous minor improvements, browser compatibility updates, and bug fixes.
The Rhino Revolution: Over 130 Improvements
Perhaps the most exciting area of progress was our JavaScript engine. Thanks to the outstanding Rhino Team and their exceptional collaboration, we achieved more than 130 improvements in our core-js implementation. The synergy with the Rhino team has been nothing short of amazing. I’m particularly proud of contributing more than 55 commits to Rhino myself.
RegExp Support: A Complete Overhaul
The regular expression support received massive attention:
- Named capture groups: Finally supported for modern JavaScript patterns
- RegExp lookbehind: Completing the lookaround support
- Unicode mode: Better handling of Unicode in regular expressions
- Complete reimplementation of
String.prototype.search,replace,replaceAll, andsplit- much closer to spec now - Sticky flag behavior fixed
- Symbol.match implemented
We switched back from our custom RegExp translation to using core Rhino’s significantly improved implementation.
Modern JavaScript Support
- Spread operator: Support for spread in arrays and object literals
- Rest parameters: Handling of unimplemented rest parameters in destructuring
- Destructuring: Improved support including in catch blocks and for-loops
- Generator improvements: Symbol.toStringTag, default parameter evaluation ordering
- Symbol enhancements: Better global symbol registry handling
- ES2025 Features: Promise.try(), Promise.withResolvers(), ArrayBuffer.transfer() , ArrayBuffer.transferToFixedLength() and the Set methods intersection(), union(), difference(), symmetricDifference(), isSubsetOf(), isSupersetOf(), and isDisjointFrom()
Performance & Architecture
- Interpreter performance: Massive improvements by avoiding the need for activation frames
- Lambda-based refactoring: Converted numerous core classes (NativeObject, NativeArray, NativeString, NativeGlobal, Function, BigInt, Boolean, Number, Map, Set, and many more) from IdScriptableObject to lambda-based implementations
- Optimizations: SlotMap handling, ‘undefined’ lookup, and function name inference
- Schubfach algorithm: Replaced NumberToString implementation for better performance
Jenkins Collaboration: Real-World Impact
- CSS Selector Support (#20): Implementation of modern
:has(),:is(), and:where()pseudo-selectors. - Background JavaScript Optimization (#946): We introduced
waitForBackgroundJavaScriptStartingBefore(long, long)combining overall timeout with waiting for tasks starting before a specific time. This single improvement reduced the Jenkins team’s overall test execution time by 1 hour - a significant productivity boost. - JavaScript ‘caller’ Handling (#1064): Improved the ‘caller’ property support to better match browser behavior, modernizing the approach and making it a function prototype property.
The Numbers
Since September 2025, I’ve been tracking download statistics through Scarf.
| Month | neko-htmlunit | htmlunit | jsoup-bridge |
|---|---|---|---|
| 2025-09 | 2,235,968 | 1,227,070 | 204 |
| 2025-10 | 3,577,443 | 1,820,794 | 490 |
| 2025-11 | 2,918,966 | 1,512,739 | 542 |
| 2025-12 | 2,495,485 | 1,381,064 | 807 |
Seeing more than a million downloads every month still makes me speakless and growth of the new jsoup-bridge project is encouraging.
My Open Source Activities
Over 1,800 commits throughout the year - averaging about 5 commits per day, every day. Looking back at the numbers, I’m a bit shocked myself by how many changes I’ve committed over the year.
Looking Ahead
As I move into 2026, I’m already working on version 5.0.0 with an important change: HtmlUnit will require JDK 17 as the minimum version. This will help modernize the codebase and take advantage of modern Java features to improve performance and maintainability.
Support HtmlUnit
HtmlUnit is and will always be free and open source. However, maintaining and developing HtmlUnit requires significant time and effort. If your company benefit from HtmlUnit, please consider supporting the projec via GitHub Sponsors page.
Your support helps ensure HtmlUnit’s continued development and keeps the project sustainable for the entire community.
Thank You All!
— RBRi
Resources:
- Changes Report - Detailed release notes
- HtmlUnit Homepage - Project information
- Maven Central - Download
- GitHub Repository - Source code
