From 420739c5da35242f45cae6debcd79e8ce646b0f4 Mon Sep 17 00:00:00 2001 From: Nedunchezhiyan-M Date: Wed, 8 Apr 2026 11:06:40 +0530 Subject: [PATCH] Fix URLSearchParams.keys() returning only unique keys The WHATWG URL spec states that URLSearchParams.keys() must yield one entry per name-value pair, meaning duplicate names appear multiple times. The previous implementation returned Map.keys() directly, which yields each key only once regardless of how many values are stored under it. This caused keys() to be inconsistent with values() and entries(), both of which already handle duplicates correctly. Updated keys() to use a generator that yields each key once per associated value, matching the approach already used by values() and entries(). Test plan: Added a test asserting that keys() on URLSearchParams with duplicate key entries ('key1', 'key1', 'key2') returns all three names. Changelog: [General] [Fixed] - Fix URLSearchParams.keys() returning only unique keys instead of all name-value pair names --- packages/react-native/Libraries/Blob/URLSearchParams.js | 9 ++++++++- .../react-native/Libraries/Blob/__tests__/URL-test.js | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/react-native/Libraries/Blob/URLSearchParams.js b/packages/react-native/Libraries/Blob/URLSearchParams.js index d325f7bb25a8..416c5509940a 100644 --- a/packages/react-native/Libraries/Blob/URLSearchParams.js +++ b/packages/react-native/Libraries/Blob/URLSearchParams.js @@ -77,7 +77,14 @@ export class URLSearchParams { } keys(): Iterator { - return this._searchParams.keys(); + function* generateKeys(params: Map): Iterator { + for (const [key, values] of params) { + for (let i = 0; i < values.length; i++) { + yield key; + } + } + } + return generateKeys(this._searchParams); } values(): Iterator { diff --git a/packages/react-native/Libraries/Blob/__tests__/URL-test.js b/packages/react-native/Libraries/Blob/__tests__/URL-test.js index 72467dc08ebb..8585f1789e2e 100644 --- a/packages/react-native/Libraries/Blob/__tests__/URL-test.js +++ b/packages/react-native/Libraries/Blob/__tests__/URL-test.js @@ -114,6 +114,10 @@ describe('URL', function () { expect(paramsFromArray.getAll('key1')).toEqual(['value1', 'value2']); expect(paramsFromArray.get('key2')).toBe('value3'); + // keys() should yield one entry per name-value pair, including duplicates + const keysArray = Array.from(paramsFromArray.keys()); + expect(keysArray).toEqual(['key1', 'key1', 'key2']); + // Manipulating existing search params in the URL const urlParams = url.searchParams; expect(urlParams.get('query')).toBe('testQuery');