From c85a3769020e4bc38273b622700e319851aabf9d Mon Sep 17 00:00:00 2001 From: Ian K Smith Date: Fri, 16 Jun 2023 17:03:20 -0600 Subject: [PATCH 1/5] Fix TypeError related to 'useSearchParams' in Firefox web extensions --- packages/react-router-dom/dom.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/react-router-dom/dom.ts b/packages/react-router-dom/dom.ts index cf0700edeb..261c9b479d 100644 --- a/packages/react-router-dom/dom.ts +++ b/packages/react-router-dom/dom.ts @@ -97,13 +97,18 @@ export function getSearchParamsForLocation( let searchParams = createSearchParams(locationSearch); if (defaultSearchParams) { - for (let key of defaultSearchParams.keys()) { + // Use `defaultSearchParams.forEach(...)` here instead of iterating of + // `defaultSearchParams.keys()` to work-around a bug in Firefox related to + // web extensions. Relevant Bugzilla tickets: + // https://bugzilla.mozilla.org/show_bug.cgi?id=1414602 + // https://bugzilla.mozilla.org/show_bug.cgi?id=1023984 + defaultSearchParams.forEach((key) => { if (!searchParams.has(key)) { defaultSearchParams.getAll(key).forEach((value) => { searchParams.append(key, value); }); } - } + }); } return searchParams; From c1cdf8d1a0cfc065d2298e4aba3c449b78139477 Mon Sep 17 00:00:00 2001 From: Ian K Smith Date: Fri, 16 Jun 2023 17:05:17 -0600 Subject: [PATCH 2/5] add smithki to contributors.yml --- contributors.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/contributors.yml b/contributors.yml index c32eacce01..a672db769a 100644 --- a/contributors.yml +++ b/contributors.yml @@ -219,3 +219,4 @@ - yuleicul - zheng-chuang - holynewbie +- smithki From d66bd170cfed55914bc97de55925298fa85b97c0 Mon Sep 17 00:00:00 2001 From: Ian K Smith Date: Fri, 16 Jun 2023 17:18:50 -0600 Subject: [PATCH 3/5] add changeset --- .changeset/firefox-addons-and-web-extensions-bug.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/firefox-addons-and-web-extensions-bug.md diff --git a/.changeset/firefox-addons-and-web-extensions-bug.md b/.changeset/firefox-addons-and-web-extensions-bug.md new file mode 100644 index 0000000000..668cc6cdac --- /dev/null +++ b/.changeset/firefox-addons-and-web-extensions-bug.md @@ -0,0 +1,5 @@ +--- +"react-router-dom": patch +--- + +Fixes an edge-case affecting web extensions in Firefox that use `URLSearchParams` and the `useSearchParams` hook. From 5bd74e9f65d35d12fe62a44a4ff54164eba6eaf6 Mon Sep 17 00:00:00 2001 From: Ian K Smith Date: Wed, 21 Jun 2023 13:32:25 -0600 Subject: [PATCH 4/5] use correct type signature for 'URLSearchParams#forEach' --- packages/react-router-dom/dom.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-router-dom/dom.ts b/packages/react-router-dom/dom.ts index 261c9b479d..ed3706629f 100644 --- a/packages/react-router-dom/dom.ts +++ b/packages/react-router-dom/dom.ts @@ -102,7 +102,7 @@ export function getSearchParamsForLocation( // web extensions. Relevant Bugzilla tickets: // https://bugzilla.mozilla.org/show_bug.cgi?id=1414602 // https://bugzilla.mozilla.org/show_bug.cgi?id=1023984 - defaultSearchParams.forEach((key) => { + defaultSearchParams.forEach((_, key) => { if (!searchParams.has(key)) { defaultSearchParams.getAll(key).forEach((value) => { searchParams.append(key, value); From e51c18d609a151bf38f72441c513921a9fd18d0c Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Thu, 13 Jul 2023 10:38:15 -0400 Subject: [PATCH 5/5] Add test --- .../__tests__/search-params-test.tsx | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/packages/react-router-dom/__tests__/search-params-test.tsx b/packages/react-router-dom/__tests__/search-params-test.tsx index 298914fbec..6ad317670c 100644 --- a/packages/react-router-dom/__tests__/search-params-test.tsx +++ b/packages/react-router-dom/__tests__/search-params-test.tsx @@ -161,4 +161,25 @@ describe("useSearchParams", () => { expect(node.innerHTML).toMatch(/The current value is ""/); }); + + it("returns initial default values in search params", () => { + function SearchPage() { + let [searchParams] = useSearchParams({ a: "1", b: "2" }); + return

{searchParams.toString()}

; + } + + act(() => { + ReactDOM.createRoot(node).render( + + + } /> + + + ); + }); + + expect(node.innerHTML).toMatchInlineSnapshot( + `"

value=initial&a=1&b=2

"` + ); + }); });