diff options
author | 迷渡 <justjavac@gmail.com> | 2019-06-14 23:46:07 +0800 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2019-06-14 08:46:07 -0700 |
commit | 52448f351d7b0882ac67e2974b93c1e730f5dbb3 (patch) | |
tree | 57a67c325eae79b63d395dbea325959baec0ae2f | |
parent | dc60fe9f300043f191286ef804a365e16e455f87 (diff) |
feat: URLSearchParams should work with custom iterator (#2512)
-rw-r--r-- | js/url_search_params.ts | 7 | ||||
-rw-r--r-- | js/url_search_params_test.ts | 10 | ||||
-rw-r--r-- | js/util.ts | 13 |
3 files changed, 29 insertions, 1 deletions
diff --git a/js/url_search_params.ts b/js/url_search_params.ts index 85f4c0619..666ba6951 100644 --- a/js/url_search_params.ts +++ b/js/url_search_params.ts @@ -1,6 +1,6 @@ // Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. import { URL } from "./url"; -import { requiredArguments } from "./util"; +import { requiredArguments, isIterable } from "./util"; export class URLSearchParams { private params: Array<[string, string]> = []; @@ -17,6 +17,11 @@ export class URLSearchParams { return; } + if (isIterable(init)) { + this.params = [...init]; + return; + } + if (Object(init) !== init) { return; } diff --git a/js/url_search_params_test.ts b/js/url_search_params_test.ts index d37b55497..e270dd7ff 100644 --- a/js/url_search_params_test.ts +++ b/js/url_search_params_test.ts @@ -217,3 +217,13 @@ test(function urlSearchParamsDeletingAppendedMultiple(): void { params.delete("first"); assertEquals(params.has("first"), false); }); + +// ref: https://github.com/web-platform-tests/wpt/blob/master/url/urlsearchparams-constructor.any.js#L176-L182 +test(function urlSearchParamsCustomSymbolIterator(): void { + const params = new URLSearchParams(); + params[Symbol.iterator] = function*(): IterableIterator<[string, string]> { + yield ["a", "b"]; + }; + const params1 = new URLSearchParams((params as unknown) as string[][]); + assertEquals(params1.get("a"), "b"); +}); diff --git a/js/util.ts b/js/util.ts index a035d761a..da56465a2 100644 --- a/js/util.ts +++ b/js/util.ts @@ -122,6 +122,19 @@ export function isObject(o: unknown): o is object { return o != null && typeof o === "object"; } +// Returns whether o is iterable. +export function isIterable<T, P extends keyof T, K extends T[P]>( + o: T +): o is T & Iterable<[P, K]> { + // checks for null and undefined + if (o == null) { + return false; + } + return ( + typeof ((o as unknown) as Iterable<[P, K]>)[Symbol.iterator] === "function" + ); +} + // @internal export function requiredArguments( name: string, |