[Aurelia 1] Bindings non-functional in Safari 26.x

Hi everyone! Our team maintains an app that was written in Aurelia 1 about 3-4 years ago. With the latest release of MacOS and Safari 26.x (Tahoe) some of the bindings have broken down completely, rendering the application unusable. This happens only in Safari - all other browsers are perfectly fine, including Chrome on MacOS.

What I’ve managed to investigate so far points to the bindings that use DirtyChecker not being tracked. We use some custom elements from our company-wide component library, and whenever the value on them gets updated, the binding does not resolve this change. It is neither reflected in the bound property in the view-model, nor does it trigger getters decorated with @computedFrom().

Registering those elements with EventManager so that the bindings trigger upon relevant change events seems to help, but given the wide scope of this problem I am unsure whether we will manage to find and fix all occurrences. My best guess at this point is that due to some changes in Safari internal workings (perhaps timings?) those dirty checked bindings are not being registered correctly and simply get lost after initial setup.

Any help, clues, or direction to look at would be greatly appreciated. Or, at this point, even the confirmation that anyone else noticed similar problems on the latest Safari would be comforting :slight_smile:

1 Like

Maybe paste some part of the code that is not working here? How the property looks like how the template looks like and whats not working when you did what?

1 Like

Hi @bigopon, thanks for responding! Last week was hectic, but I found some time to create a simple reproduction of the issue in starter project :slight_smile: Here is repository link.

Below is a screenshot from Chrome version 146.0.7680.80 running on Windows:

This is the exact same app, running from the same dev server at the same time, and accessed from two different machines. As far as I can tell, on latest Safari versions DirtyCheckProperty bindings in some cases do not fire change events at all. For other observer strategies, everything seems to be working. There are also circumstances where dirty checking works as well - for example, after wrapping web component in some other tag, it suddenly starts working. Perhaps there is some issue with registering dirty checked properties that are bound at root level of the view? I don’t know enough about inner workings of the binding engine to make any better guess :slight_smile: Hope this helps!