Skip to content

Conversation

@klevo
Copy link
Contributor

@klevo klevo commented Apr 21, 2024

There is a race condition with Turbo 8 refreshes and regular navigation through the application, caused by passing the URL to be refreshed into the debounced function.

If user visits another page, in between the page refresh arriving and the debounced refresh execution, the stale URL in the debounced refresh will navigate back to the page the user just came from.

This behavior is most apparent when there is a steady stream of turbo refreshes coming in and user is navigating through pages that receive these refreshes, but could happen at any (low) volume of page refreshes, if the timing is right.

Here's a video of the issue:

turbo-refresh-overriding-user-visit.mov
  • At the end you can observe I click on "Show this item" of the item named "Two", yet I remain on the index page. You can notice the desired page blinked in and out for a few microseconds too.
  • The cause is visible in the console: The second to last turbo visit to /items/2 is my user initiated action.
  • The following (last) entry in the console is the turbo refresh of the current /items page that just executed after the default debounce delay (you can see the Updated at times changed from from :05 to :06). This refresh essentially hijacked my click and resulted in me being returned to the index page.

This is on Safari 17.4.1. I also replicated the same issue in latest Chrome.

I created a simple Rails 7.1 app to demonstrate the issue that is used in the above video with full instructions.

@brunoprietog
Copy link
Collaborator

This would still produce two requests, right? That's how I understand it. Shouldn't we cancel the page refresh in that case?

@klevo
Copy link
Contributor Author

klevo commented Apr 23, 2024

This would still produce two requests, right? That's how I understand it. Shouldn't we cancel the page refresh in that case?

That's correct. I haven't thought about a cancelling solution, but indeed that should be easy with the previous implementation, and comparing the passed URL with current URL and if they don't match, not performing a visit... I'll look into it in a bit.

@klevo
Copy link
Contributor Author

klevo commented Apr 23, 2024

  • Implemented approach to not issue a refresh visit if stale URL is detected.
  • Test case added.

@klevo
Copy link
Contributor Author

klevo commented Jun 29, 2024

@brunoprietog I rebased against main and tested everything again. It's good to go. 🤞

klevo added a commit to klevo/turbo-rails that referenced this pull request Jun 29, 2024
Copy link
Collaborator

@brunoprietog brunoprietog left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @klevo!

@brunoprietog brunoprietog merged commit 9f953ed into hotwired:main Dec 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants