Skip to content

Commit 546f113

Browse files
committed
Read [data-turbo-action] during Form Submissions
Closes hotwired/turbo-ios#44 Follow-up to #231 --- This commit follows-up [#231][], which added `[data-turbo-action]` support for idempotent form submissions to maintain parity with `<a>`-initiated Visits. These changes re-use the existent `Navigator.getActionForFormSubmission` function to determine the value for the `VisitOptions.action` options. [#231]: #231
1 parent acb003d commit 546f113

File tree

3 files changed

+34
-7
lines changed

3 files changed

+34
-7
lines changed

src/core/drive/navigator.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,9 @@ export class Navigator {
9292
this.view.clearSnapshotCache()
9393
}
9494

95+
const action = this.getActionForFormSubmission(formSubmission)
9596
const { statusCode } = fetchResponse
96-
const visitOptions = { response: { statusCode, responseHTML } }
97+
const visitOptions = { action, response: { statusCode, responseHTML } }
9798
this.proposeVisit(fetchResponse.location, visitOptions)
9899
}
99100
}

src/tests/fixtures/navigation.html

+14-2
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,20 @@ <h1>Navigation</h1>
3535
<p><a id="same-origin-unannotated-link" href="/src/tests/fixtures/one.html">Same-origin unannotated link</a></p>
3636
<p><form id="same-origin-unannotated-form" method="get" action="/src/tests/fixtures/one.html"><button>Same-origin unannotated form</button></form></p>
3737
<p><a id="same-origin-replace-link" href="/src/tests/fixtures/one.html" data-turbo-action="replace">Same-origin data-turbo-action=replace link</a></p>
38-
<p><form id="same-origin-replace-form" method="get" action="/src/tests/fixtures/one.html" data-turbo-action="replace"><button>Same-origin data-turbo-action=replace form</button></form></p>
39-
<p><form id="same-origin-replace-form-submitter" method="get" action="/src/tests/fixtures/one.html"><button data-turbo-action="replace">Same-origin data-turbo-action=replace form</button></form></p>
38+
<p><form id="same-origin-replace-form-get" action="/src/tests/fixtures/one.html" data-turbo-action="replace"><button>Same-origin data-turbo-action=replace form</button></form></p>
39+
<p><form id="same-origin-replace-form-submitter-get" action="/src/tests/fixtures/one.html"><button data-turbo-action="replace">Same-origin data-turbo-action=replace form</button></form></p>
40+
<p>
41+
<form id="same-origin-replace-form-post" method="post" action="/__turbo/redirect" data-turbo-action="replace">
42+
<input type="hidden" name="path" value="/src/tests/fixtures/one.html">
43+
<button>Same-origin form[method="post"][data-turbo-action=replace]</button>
44+
</form>
45+
</p>
46+
<p>
47+
<form id="same-origin-replace-form-submitter-post" method="post" action="/__turbo/redirect">
48+
<input type="hidden" name="path" value="/src/tests/fixtures/one.html">
49+
<button data-turbo-action="replace">Same-origin form[method="post"] button[data-turbo-action=replace]</button>
50+
</form>
51+
</p>
4052
<p><a id="same-origin-false-link" href="/src/tests/fixtures/one.html" data-turbo="false">Same-origin data-turbo=false link</a></p>
4153
<p data-turbo="false"><a id="same-origin-unannotated-link-inside-false-container" href="/src/tests/fixtures/one.html">Same-origin unannotated link inside data-turbo=false container</a></p>
4254
<p data-turbo="false"><a id="same-origin-true-link-inside-false-container" href="/src/tests/fixtures/one.html" data-turbo="true">Same-origin data-turbo=true link inside data-turbo=false container</a></p>

src/tests/functional/navigation_tests.ts

+18-4
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,29 @@ export class NavigationTests extends TurboDriveTestCase {
6363
this.assert.equal(await this.visitAction, "replace")
6464
}
6565

66-
async "test following a same-origin data-turbo-action=replace form[method=GET]"() {
67-
this.clickSelector("#same-origin-replace-form button")
66+
async "test following a same-origin GET form[data-turbo-action=replace]"() {
67+
this.clickSelector("#same-origin-replace-form-get button")
6868
await this.nextBody
6969
this.assert.equal(await this.pathname, "/src/tests/fixtures/one.html")
7070
this.assert.equal(await this.visitAction, "replace")
7171
}
7272

73-
async "test following a same-origin form with button[data-turbo-action=replace]"() {
74-
this.clickSelector("#same-origin-replace-form-submitter button")
73+
async "test following a same-origin GET form button[data-turbo-action=replace]"() {
74+
this.clickSelector("#same-origin-replace-form-submitter-get button")
75+
await this.nextBody
76+
this.assert.equal(await this.pathname, "/src/tests/fixtures/one.html")
77+
this.assert.equal(await this.visitAction, "replace")
78+
}
79+
80+
async "test following a same-origin POST form[data-turbo-action=replace]"() {
81+
this.clickSelector("#same-origin-replace-form-post button")
82+
await this.nextBody
83+
this.assert.equal(await this.pathname, "/src/tests/fixtures/one.html")
84+
this.assert.equal(await this.visitAction, "replace")
85+
}
86+
87+
async "test following a same-origin POST form button[data-turbo-action=replace]"() {
88+
this.clickSelector("#same-origin-replace-form-submitter-post button")
7589
await this.nextBody
7690
this.assert.equal(await this.pathname, "/src/tests/fixtures/one.html")
7791
this.assert.equal(await this.visitAction, "replace")

0 commit comments

Comments
 (0)