question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

Angular apps not working in Safari v15 due to `ReferenceError`

See original GitHub issue

Which @angular/* package(s) are the source of the bug?

Don’t known / other

Is this a regression?

No

Description

When we open angular.io website in safari browser in mac then it giving blank page and if we do refresh that page than also it’s giving blank page and when we open inspect element from developer open in safari browser and do refresh that page then it open perfectly so it’s an issue I have provided screenshot.

  • This when I open angular.io link in Safari browser in Mac. Screenshot 2022-11-30 at 6 37 28 PM

  • This when I open inspect element of safari browser and still website is not working. Screenshot 2022-11-30 at 6 39 15 PM

  • And at last this after opening Inspect element I refresh the page then website is working properly. Screenshot 2022-11-30 at 6 39 27 PM

Please provide a link to a minimal reproduction of the bug

https://angular.io

Please provide the exception or error you saw

No response

Please provide the environment you discovered this bug in (run ng version)

No response

Anything else?

No response

Issue Analytics

  • State:closed
  • Created 10 months ago
  • Comments:8 (2 by maintainers)

github_iconTop GitHub Comments

16reactions
devversioncommented, Dec 1, 2022

Hi all, I’ve tracked down the root cause. It’s a very subtle bug that got fixed in Safari v16. And yes, the bug doesn’t reproduce when the devtools are opened. Here is how I tracked it down:

  1. Initially loaded the page with devtools closed, saw an error message like in https://github.com/angular/angular-cli/issues/24355. The stack did not point to anything useful- especially since source maps can hide issues.
  2. Disabled source maps, closed dev-tools and re-freshed. Now the error looked like this: image
    • The error did not point to something useful either. Not even close to something with $o. Safari stack trace was incorrect.
  3. Rebuilt angular.io with optimization: false. Fortunately the issue was reproducable even with unoptimized build (making debugging easier):
    • image
  4. Now that the culprit JS code was finally visible- more investigation was possible.
    • The variable accessed is clearly in scope. See notification_component_c0.
    • There is some weird syntax for the static fields generated by the Angular compiler. e.g. notice static #_ = this.ecmp = X
  5. I initially thought the private identifier static fields are the problem, so I tried to understand where these are coming from:
    • Looked through Angular CLI’s compilation pipeline and looked for Babel plugins.
    • There is a Babel plugin generating these for older browsers not supporting static {} blocks.
    • Surprisingly Angular compiler does not generate static {} blocks- but static fields.
    • Turned out TypeScript converts static fields to static blocks if useDefineForClassFields = false (which is the case in Angular v15 w/ target: 2022)
    • I’ve tried to isolate the problem and create a minimal reproduction, but couldn’t reproduce. Since the issue was already very hard to track down (given devtools cannot being opened)- I’ve still assumed something odd could go on in Safari…
    • Looked through WebKit bug tracker and commits but couldn’t find anything- except for private identifier methods fix in the parser— could have been related.
    • Ultimately I concluded that static private identifier fields are not the issue.
  6. I’ve tried to “tamper” the main bundle and modify parts to see what the issue could be, slowly removing parts of the code snippet in (3).
    • Tracked it down to “still” happen when there is code like (0, x).method() in the static field initializer. In other scenarios, the error quickly was gone- almost seeming like it’s non-deterministic.
    • My assumption was that it’s a scope tracking issue in the WebKit JS parsing.
    • Looked through Webkit commits and found a fix (in the reasonable time frame of Safari v15.6 -> v16)
    • Issue description seems very similar/matching: https://github.com/WebKit/WebKit/commit/e8788a34b3d5f5b4edd7ff6450b80936bff396f2
    • https://bugs.webkit.org/show_bug.cgi?id=236843
    • TypeScript will generate such expressions to ensure correct this context when it invokes methods. e.g. for animations
    • image

TL;DR: Angular emits valid JavaScript that is subject to a bug in Safari that got fixed in Safari v16. The issue does not reproduce when devtools are opened- and the Safari bug is related to scope tracking in the WebKit JS parsing. https://github.com/WebKit/WebKit/commit/e8788a34b3d5f5b4edd7ff6450b80936bff396f2. All Angular applications could be affected, but hard to notice/narrow down

We will look into downleveling static fields for Safari <16 so that Angular apps remain compatible with that browser, if selected via browserslist (or the default one).

1reaction
kbrillacommented, Nov 30, 2022

Same hapenning on iOS 15.4. Don’t know about devtools though. But we had similar issue and It was connected to app being PWA - the issue that it did work when dev tools were open.

Read more comments on GitHub >

github_iconTop Results From Across the Web

fix(@angular-devkit/build-angular): downlevel class properties ...
Successfully merging this pull request may close these issues. Angular apps not working in Safari v15 due to ReferenceError. 3 ...
Read more >
Angular app not working on Firefox and Safari - Stack Overflow
My Angular app is not working in Firefox and Safari after build, But it is fine with Chrome. I tried by loading web...
Read more >
Tweets with replies by Emma Twersky (@twerske) / Twitter
Angular apps not working in Safari v15 due to `ReferenceError` · Issue #24355 · angular/angular-cli. Which @angular/* package(s) are the source of the...
Read more >
Browser support - Angular
Angular is built on the latest standards of the web platform. Targeting such a wide range of browsers is challenging because they do...
Read more >
How to debug Angular App in Chrome | BrowserStack
If you're having trouble debugging your Angular app in Chrome, this guide will show you how to do it so you can get...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found