My attention was brought to this issue on Twitter.
Possible solutions:
Disabling text selection via CSS
Registering context menu click events as well.
And then some...
It is unfortunate that Android has this behavior by default. Also, I'm using Android 10 and this issue seldom occurs, only if I deliberately want to reproduce, whilst the reporter of the issue consistently experience this.
Currently, if let's say the eraser is used once the level is completed, a) the block that was used on is marked permanently (carried over to the next level), b) the eraser is "used up" so its not available on the next level.
I didn't check the teleport tunnel. Could be similarly buggy.
This has been bugging me for the last few days. In theory local storage is widespread now in modern browsers. But what is the guarantee that its enabled, available or otherwise readily usable?
Instead of blindly using the local storage in CachedJSONData, it should be verified that its indeed available.
If its not available, then the data should be loaded to the memory.
If its not available, then persistent user data (e.g. score, level) should be saved to a cookie.
Now, cookies are deemed to be the enemy these days, so another fallback may be needed, like:
Informing the user that all attempts failed to persistently save their data, so pretty please enable the local storage or cookies - otherwise they need to start the game from level 1 every time. :)