From c39c2236d186cf7fc7f90f55b70155137975ca54 Mon Sep 17 00:00:00 2001
From: Dom Christie <christiedom@gmail.com>
Date: Thu, 28 Sep 2023 18:42:32 +0100
Subject: [PATCH] Add data-turbo-visit-direction to html element

---
 src/core/session.js                 | 2 ++
 src/core/view.js                    | 8 ++++++++
 src/tests/functional/visit_tests.js | 4 +++-
 3 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/core/session.js b/src/core/session.js
index 868804c59..39fe8377c 100644
--- a/src/core/session.js
+++ b/src/core/session.js
@@ -186,6 +186,7 @@ export class Session {
   visitStarted(visit) {
     if (!visit.acceptsStreamResponse) {
       markAsBusy(document.documentElement)
+      this.view.markVisitDirection(visit.direction)
     }
     extendURLWithDeprecatedProperties(visit.location)
     if (!visit.silent) {
@@ -194,6 +195,7 @@ export class Session {
   }
 
   visitCompleted(visit) {
+    this.view.unmarkVisitDirection()
     clearBusyState(document.documentElement)
     this.notifyApplicationAfterPageLoad(visit.getTimingMetrics())
   }
diff --git a/src/core/view.js b/src/core/view.js
index ca81e8bdb..5c62259f1 100644
--- a/src/core/view.js
+++ b/src/core/view.js
@@ -99,6 +99,14 @@ export class View {
     }
   }
 
+  markVisitDirection(direction) {
+    this.element.setAttribute("data-turbo-visit-direction", direction)
+  }
+
+  unmarkVisitDirection() {
+    this.element.removeAttribute("data-turbo-visit-direction")
+  }
+
   async renderSnapshot(renderer) {
     await renderer.render()
   }
diff --git a/src/tests/functional/visit_tests.js b/src/tests/functional/visit_tests.js
index e3bac99c7..2ab405965 100644
--- a/src/tests/functional/visit_tests.js
+++ b/src/tests/functional/visit_tests.js
@@ -13,6 +13,7 @@ import {
   readEventLogs,
   scrollToSelector,
   visitAction,
+  waitUntilSelector,
   willChangeBody
 } from "../helpers/page"
 
@@ -221,7 +222,8 @@ test("test Visit with network error", async ({ page }) => {
 })
 
 test("test turbo:visit direction details", async ({ page }) => {
-  await page.click("#same-origin-link")
+  page.click("#same-origin-link")
+  await waitUntilSelector(page, "[data-turbo-visit-direction='forward']")
   let details = await nextEventNamed(page, "turbo:visit")
   assert.equal(details.direction, "forward")