docs

Changelog (2.0.0-beta.2)

Changes since 2.0.0-beta.1.

On this page

Last updated: October 2nd, 2026

📘 See the full changelog for 2.0.0

These are the changes since 2.0.0-beta.1 (released August 28th, 2026). For all changes since v1.4, see the 2.0.0 changelog.

Highlights

Upgrading from beta.1

Recompile everything against the beta.2 headers. Then check the two lists below.

Changes the compiler won't catch

Some of the API behavior has changed, make sure to be aware of the following changes:

Object lifetimes:

Logging and diagnostics:

Custom surfaces:

JavaScript:

AppCore:

Data bindings:

Changes the compiler will catch

When you rebuild the compiler should flag each of these changes. In the tables below, the left column is beta.1 code and the right column is the equivalent in beta.2.

View:

beta.1 beta.2
view->GetDocument() view->GetDOMDocument()
view->AttachAPI(api) view->AttachJSAPI(api)
view->DetachAPI(api) view->DetachJSAPI(api)
view->SetAPIInjectionFilter(...) view->SetJSAPIInjectionFilter(...)
view->AttachDOMListeners(listeners) view->AttachDOMTriggers(triggers)
view->DetachDOMListeners(listeners) view->DetachDOMTriggers(triggers)
view->SetDOMListenersInjectionFilter(...) view->SetDOMTriggersInjectionFilter(...)

JavaScript (ultralight::js):

beta.1 beta.2
api.AttachTo(view, flags, rules) api.AttachTo(view, { .flags = flags, .origin_rules = rules })
js::Value::Undefined(ctx) context.Make(js::undefined)
js::Value::Null(ctx) context.Make(js::null)
js::Value::Boolean(ctx, true) context.Make(true)
js::Value::Number(ctx, 1.5) context.Make(1.5)
js::Value::String(ctx, "text") context.Make("text")
js::Value::Object(ctx) context.MakeObject()
js::ArrayBuffer::Create(ctx, buffer) context.MakeArrayBuffer(buffer)
js::TypedArray<T>::Create(ctx, length) context.MakeTypedArray<T>(length)
js::TypedArray<T>::View(buffer, offset, length) js::TypedArray<T>::Create(buffer, offset, length)
co_await js::OnWorker(fn) co_await js::RunOnWorker(fn)
co_await js::Async<T>(promise) co_await js::Await<T>(promise)
co_await js::CallAsync<T>(fn, this_value, args...) co_await js::Await<T>(fn.InvokeOn(this_value, args...))
error.is_context_dead() error.is_page_gone()
api.Describe() api.schema()
js::HolderTraits<H> ultralight::HolderTraits<H>
#include <Ultralight/js/CoreInterop.h> #include <Ultralight/JS.h>

DOM (ultralight::dom):

beta.1 beta.2
dom::Listeners dom::Triggers
#include <Ultralight/dom/Listeners.h> #include <Ultralight/dom/Triggers.h>
dom::ErrorCode dom::ErrorType
error.code() error.type()
el.addEventListener(type, fn, true) el.addEventListener(type, fn, { .capture = true })
doc.window() doc.defaultView()
listener.Detach() listener.Release()

These members changed type:

Member beta.1 type beta.2 type
selectedIndex int (-1 means none) std::optional<size_t> (std::nullopt means none)
selectionStart, selectionEnd long long std::optional<size_t>
scrollTop, scrollLeft int double
Window::scrollX(), scrollY() int double

Data bindings (ultralight::dom::data):

beta.1 beta.2
ctx.AttachTo(*view); if (!ctx.AttachTo(view)) { /* handle the failure */ }
ctx.DetachFrom(*view); ctx.DetachFrom(view);
binding.EmitAction<"name">() binding.PostAction<"name">()
ctx.EmitAction("binding.action", payload) ctx.PostAction("binding.action", payload)
ctx.DescribeSchemas() ctx.schema()
#include <Ultralight/dom/data/Descriptors.h> #include <Ultralight/dom/data/Context.h>

C API:

beta.1 beta.2
ULDOMListeners ULDOMTriggers
ulCreateDOMListeners(), ulDOMListenersOn(), ... ulCreateDOMTriggers(), ulDOMTriggersOn(), ...
ulViewAttachDOMListeners() ulViewAttachDOMTriggers()
ulViewAttachDOMDataContextWithRules() ulViewAttachDOMDataContext()
ulDOMDataContextEmitAction() ulDOMDataContextPostAction()
ulDOMDataContextDescribeSchemas() ulDOMDataContextGetSchema()
ulJSAPIDescribe() ulJSAPIGetSchema()
ulDOMElementGetParent() ulDOMElementGetParentElement()
ulDOMElementGetFirstChild() ulDOMElementGetFirstElementChild()
ulDOMElementGetLastChild() ulDOMElementGetLastElementChild()
ulDOMElementGetNextSibling() ulDOMElementGetNextElementSibling()
ulDOMElementGetPreviousSibling() ulDOMElementGetPreviousElementSibling()
ulDOMElementGetChildCount() ulDOMElementGetChildElementCount()
ULDestroyJSUserDataCallback ULUserDataDestroyCallback
ULDOMUserDataDestroyCallback ULUserDataDestroyCallback
ULDOMDataDestroyCallback ULUserDataDestroyCallback

Platform interfaces:

What's New

Rendering:

APIs:

AppCore:

SDK:

Notable Fixes

Known Issues