Skip to content

Commit 02f08c7

Browse files
authored
Fix _target not being correctly decoded (#3720)
After #3688, the _target parameter was decoded too early, as it is now sent in the extra values that are merged into the form values. Fixes #3719.
1 parent 0b31deb commit 02f08c7

File tree

4 files changed

+44
-1
lines changed

4 files changed

+44
-1
lines changed

lib/phoenix_live_view/channel.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -781,8 +781,8 @@ defmodule Phoenix.LiveView.Channel do
781781
defp decode_event_type("form", url_encoded, raw_payload) do
782782
url_encoded
783783
|> Plug.Conn.Query.decode()
784-
|> decode_merge_target()
785784
|> maybe_merge_meta(raw_payload)
785+
|> decode_merge_target()
786786
end
787787

788788
defp decode_event_type(_, value, _raw_payload), do: value
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
defmodule Phoenix.LiveViewTest.E2E.Issue3719Live do
2+
# https://github.com/phoenixframework/phoenix_live_view/issues/3719
3+
use Phoenix.LiveView
4+
5+
def mount(_params, _session, socket) do
6+
{:ok, assign(socket, :target, nil)}
7+
end
8+
9+
def handle_event("inc", %{"_target" => target}, socket) do
10+
{:noreply, assign(socket, :target, target)}
11+
end
12+
13+
def render(assigns) do
14+
~H"""
15+
<form phx-change="inc">
16+
<input id="a" type="text" name="foo" />
17+
<input id="b" type="text" name="foo[bar]" />
18+
</form>
19+
<span id="target">{inspect(@target)}</span>
20+
"""
21+
end
22+
end

test/e2e/test_helper.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ defmodule Phoenix.LiveViewTest.E2E.Router do
165165
live "/3684", Issue3684Live
166166
live "/3709", Issue3709Live
167167
live "/3709/:id", Issue3709Live
168+
live "/3719", Issue3719Live
168169
end
169170
end
170171

test/e2e/tests/issues/3719.spec.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const {test, expect} = require("../../test-fixtures")
2+
const {syncLV} = require("../../utils")
3+
4+
// https://github.com/phoenixframework/phoenix_live_view/issues/3719
5+
test("target is properly decoded", async ({page}) => {
6+
const logs = []
7+
page.on("console", (e) => logs.push(e.text()))
8+
9+
await page.goto("/issues/3719")
10+
await syncLV(page)
11+
await page.locator("#a").fill("foo")
12+
await syncLV(page)
13+
await expect(page.locator("#target")).toHaveText("[\"foo\"]")
14+
15+
await page.locator("#b").fill("foo")
16+
await syncLV(page)
17+
await expect(page.locator("#target")).toHaveText("[\"foo\", \"bar\"]")
18+
19+
expect(logs).not.toEqual(expect.arrayContaining([expect.stringMatching("view crashed")]))
20+
})

0 commit comments

Comments
 (0)