core-js 3.18.2 → 3.19.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/date/to-primitive.js +2 -3
- package/es/date/to-string.js +2 -4
- package/es/instance/at.js +6 -5
- package/es/instance/bind.js +3 -2
- package/es/instance/code-point-at.js +4 -3
- package/es/instance/concat.js +3 -2
- package/es/instance/copy-within.js +3 -2
- package/es/instance/ends-with.js +4 -3
- package/es/instance/entries.js +3 -2
- package/es/instance/every.js +3 -2
- package/es/instance/fill.js +3 -2
- package/es/instance/filter.js +3 -2
- package/es/instance/find-index.js +3 -2
- package/es/instance/find.js +3 -2
- package/es/instance/flags.js +2 -1
- package/es/instance/flat-map.js +3 -2
- package/es/instance/flat.js +3 -2
- package/es/instance/for-each.js +3 -2
- package/es/instance/includes.js +6 -5
- package/es/instance/index-of.js +3 -2
- package/es/instance/keys.js +3 -2
- package/es/instance/last-index-of.js +3 -2
- package/es/instance/map.js +3 -2
- package/es/instance/match-all.js +4 -3
- package/es/instance/pad-end.js +4 -3
- package/es/instance/pad-start.js +4 -3
- package/es/instance/reduce-right.js +3 -2
- package/es/instance/reduce.js +3 -2
- package/es/instance/repeat.js +4 -3
- package/es/instance/replace-all.js +4 -3
- package/es/instance/reverse.js +3 -2
- package/es/instance/slice.js +3 -2
- package/es/instance/some.js +3 -2
- package/es/instance/sort.js +3 -2
- package/es/instance/splice.js +3 -2
- package/es/instance/starts-with.js +4 -3
- package/es/instance/trim-end.js +4 -3
- package/es/instance/trim-left.js +4 -3
- package/es/instance/trim-right.js +4 -3
- package/es/instance/trim-start.js +4 -3
- package/es/instance/trim.js +4 -3
- package/es/instance/values.js +3 -2
- package/es/json/stringify.js +4 -3
- package/es/promise/all-settled.js +2 -1
- package/es/promise/any.js +2 -1
- package/es/regexp/flags.js +3 -4
- package/es/regexp/match.js +2 -1
- package/es/regexp/replace.js +2 -1
- package/es/regexp/search.js +2 -1
- package/es/regexp/split.js +2 -1
- package/es/regexp/test.js +2 -3
- package/es/regexp/to-string.js +2 -3
- package/es/string/iterator.js +2 -5
- package/features/instance/at.js +6 -5
- package/features/instance/code-points.js +4 -3
- package/features/instance/filter-out.js +3 -2
- package/features/instance/filter-reject.js +3 -2
- package/features/instance/find-last-index.js +3 -2
- package/features/instance/find-last.js +3 -2
- package/features/instance/group-by.js +3 -2
- package/features/instance/unique-by.js +3 -2
- package/features/map/from.js +3 -2
- package/features/map/group-by.js +2 -1
- package/features/map/key-by.js +2 -1
- package/features/map/of.js +3 -2
- package/features/promise/try.js +2 -1
- package/features/set/from.js +3 -2
- package/features/set/of.js +3 -2
- package/features/weak-map/from.js +3 -2
- package/features/weak-map/of.js +3 -2
- package/features/weak-set/from.js +3 -2
- package/features/weak-set/of.js +3 -2
- package/internals/a-callable.js +3 -0
- package/internals/a-constructor.js +3 -0
- package/internals/a-possible-prototype.js +5 -1
- package/internals/an-instance.js +8 -3
- package/internals/an-object.js +4 -0
- package/internals/array-buffer-native.js +1 -1
- package/internals/array-buffer-non-extensible.js +10 -0
- package/internals/array-buffer-view-core.js +3 -2
- package/internals/array-buffer.js +29 -16
- package/internals/array-from-async.js +1 -1
- package/internals/array-from.js +6 -2
- package/internals/array-group-by.js +6 -3
- package/internals/array-iteration-from-last.js +1 -1
- package/internals/array-iteration.js +5 -4
- package/internals/array-last-index-of.js +2 -1
- package/internals/array-reduce.js +3 -0
- package/internals/array-slice-simple.js +17 -0
- package/internals/array-slice.js +3 -0
- package/internals/array-sort.js +10 -11
- package/internals/array-species-constructor.js +2 -0
- package/internals/array-unique-by.js +13 -9
- package/internals/async-from-sync-iterator.js +4 -3
- package/internals/async-iterator-create-proxy.js +4 -3
- package/internals/async-iterator-iteration.js +5 -2
- package/internals/classof-raw.js +5 -2
- package/internals/classof.js +3 -0
- package/internals/clear-error-stack.js +20 -0
- package/internals/collection-add-all.js +3 -2
- package/internals/collection-delete-all.js +3 -2
- package/internals/collection-from.js +7 -4
- package/internals/collection-of.js +3 -4
- package/internals/collection-strong.js +11 -9
- package/internals/collection-weak.js +10 -6
- package/internals/collection.js +8 -7
- package/internals/composite-key.js +9 -2
- package/internals/create-html.js +3 -1
- package/internals/date-to-iso-string.js +23 -13
- package/internals/date-to-primitive.js +3 -0
- package/internals/define-iterator.js +2 -1
- package/internals/engine-v8-version.js +10 -4
- package/internals/entry-unbind.js +3 -5
- package/internals/error-stack-installable.js +10 -0
- package/internals/export.js +1 -1
- package/internals/fix-regexp-well-known-symbol-logic.js +5 -3
- package/internals/flatten-into-array.js +4 -1
- package/internals/function-apply.js +9 -0
- package/internals/function-bind-context.js +5 -17
- package/internals/function-bind.js +15 -9
- package/internals/function-call.js +5 -0
- package/internals/function-uncurry-this.js +12 -0
- package/internals/get-async-iterator.js +2 -1
- package/internals/get-iterator.js +7 -2
- package/internals/get-map-iterator.js +3 -1
- package/internals/get-set-iterator.js +3 -1
- package/internals/get-substitution.js +10 -7
- package/internals/has-own-property.js +3 -2
- package/internals/host-report-errors.js +1 -1
- package/internals/ieee754.js +24 -6
- package/internals/indexed-object.js +5 -2
- package/internals/inspect-source.js +3 -2
- package/internals/install-error-cause.js +1 -1
- package/internals/internal-metadata.js +4 -7
- package/internals/internal-state.js +9 -7
- package/internals/is-callable.js +1 -1
- package/internals/is-constructor.js +6 -4
- package/internals/is-iterable.js +4 -2
- package/internals/is-object.js +1 -1
- package/internals/is-symbol.js +6 -2
- package/internals/iterate.js +14 -6
- package/internals/iterator-close.js +2 -1
- package/internals/iterator-create-proxy.js +4 -3
- package/internals/map-emplace.js +8 -3
- package/internals/map-upsert.js +12 -4
- package/internals/math-scale.js +9 -12
- package/internals/microtask.js +6 -4
- package/internals/normalize-string-argument.js +5 -0
- package/internals/not-a-regexp.js +3 -0
- package/internals/number-parse-float.js +8 -6
- package/internals/number-parse-int.js +4 -2
- package/internals/numeric-range-iterator.js +4 -0
- package/internals/object-assign.js +5 -2
- package/internals/object-define-properties.js +3 -1
- package/internals/object-define-property.js +2 -0
- package/internals/object-get-own-property-descriptor.js +2 -1
- package/internals/object-get-own-property-names-external.js +4 -4
- package/internals/object-get-prototype-of.js +2 -1
- package/internals/object-is-extensible.js +16 -0
- package/internals/object-is-prototype-of.js +3 -0
- package/internals/object-keys-internal.js +5 -2
- package/internals/object-set-prototype-of.js +4 -3
- package/internals/object-to-array.js +7 -3
- package/internals/ordinary-to-primitive.js +7 -3
- package/internals/own-keys.js +4 -1
- package/internals/reflect-metadata.js +9 -3
- package/internals/regexp-exec-abstract.js +6 -2
- package/internals/regexp-exec.js +20 -16
- package/internals/regexp-sticky-helpers.js +14 -2
- package/internals/require-object-coercible.js +4 -0
- package/internals/set-global.js +4 -2
- package/internals/shared.js +1 -1
- package/internals/string-multibyte.js +13 -4
- package/internals/string-pad.js +6 -3
- package/internals/string-punycode-to-ascii.js +34 -20
- package/internals/string-repeat.js +3 -0
- package/internals/string-trim.js +4 -2
- package/internals/task.js +11 -11
- package/internals/this-number-value.js +2 -4
- package/internals/to-index.js +3 -0
- package/internals/to-object.js +3 -0
- package/internals/to-offset.js +3 -0
- package/internals/to-positive-integer.js +3 -0
- package/internals/to-primitive.js +4 -1
- package/internals/to-property-key.js +1 -1
- package/internals/to-string.js +3 -0
- package/internals/try-to-string.js +4 -0
- package/internals/typed-array-constructor.js +10 -6
- package/internals/typed-array-from.js +4 -3
- package/internals/uid.js +4 -1
- package/internals/well-known-symbol.js +5 -1
- package/modules/es.aggregate-error.js +27 -11
- package/modules/es.array-buffer.slice.js +8 -4
- package/modules/es.array.concat.js +2 -0
- package/modules/es.array.index-of.js +7 -5
- package/modules/es.array.join.js +3 -2
- package/modules/es.array.of.js +3 -1
- package/modules/es.array.reduce.js +2 -1
- package/modules/es.array.reverse.js +3 -2
- package/modules/es.array.slice.js +4 -2
- package/modules/es.array.sort.js +7 -4
- package/modules/es.array.splice.js +2 -0
- package/modules/es.date.get-year.js +3 -2
- package/modules/es.date.now.js +6 -1
- package/modules/es.date.set-year.js +6 -4
- package/modules/es.date.to-primitive.js +2 -1
- package/modules/es.date.to-string.js +5 -4
- package/modules/es.escape.js +12 -5
- package/modules/es.function.has-instance.js +3 -2
- package/modules/es.function.name.js +5 -3
- package/modules/es.json.stringify.js +18 -7
- package/modules/es.map.js +1 -1
- package/modules/es.number.constructor.js +12 -7
- package/modules/es.number.to-fixed.js +19 -13
- package/modules/es.number.to-precision.js +6 -5
- package/modules/es.object.is-extensible.js +4 -10
- package/modules/es.object.is-frozen.js +6 -2
- package/modules/es.object.is-sealed.js +6 -2
- package/modules/es.promise.all-settled.js +2 -2
- package/modules/es.promise.any.js +5 -4
- package/modules/es.promise.js +22 -18
- package/modules/es.reflect.apply.js +4 -10
- package/modules/es.reflect.construct.js +10 -5
- package/modules/es.reflect.get.js +2 -1
- package/modules/es.reflect.is-extensible.js +2 -4
- package/modules/es.reflect.set.js +2 -1
- package/modules/es.regexp.constructor.js +26 -16
- package/modules/es.regexp.dot-all.js +5 -1
- package/modules/es.regexp.flags.js +4 -2
- package/modules/es.regexp.sticky.js +7 -3
- package/modules/es.regexp.test.js +7 -3
- package/modules/es.regexp.to-string.js +8 -5
- package/modules/es.set.js +1 -1
- package/modules/es.string.at-alternative.js +4 -1
- package/modules/es.string.ends-with.js +6 -4
- package/modules/es.string.from-code-point.js +7 -4
- package/modules/es.string.includes.js +8 -2
- package/modules/es.string.match-all.js +25 -19
- package/modules/es.string.match.js +2 -1
- package/modules/es.string.raw.js +6 -6
- package/modules/es.string.replace-all.js +19 -13
- package/modules/es.string.replace.js +19 -12
- package/modules/es.string.search.js +2 -1
- package/modules/es.string.split.js +23 -16
- package/modules/es.string.starts-with.js +6 -4
- package/modules/es.string.substr.js +3 -2
- package/modules/es.symbol.description.js +20 -12
- package/modules/es.symbol.js +34 -21
- package/modules/es.typed-array.copy-within.js +4 -2
- package/modules/es.typed-array.fill.js +9 -2
- package/modules/es.typed-array.iterator.js +7 -6
- package/modules/es.typed-array.join.js +3 -3
- package/modules/es.typed-array.last-index-of.js +3 -2
- package/modules/es.typed-array.reduce-right.js +2 -1
- package/modules/es.typed-array.reduce.js +2 -1
- package/modules/es.typed-array.set.js +2 -0
- package/modules/es.typed-array.slice.js +2 -2
- package/modules/es.typed-array.sort.js +13 -28
- package/modules/es.typed-array.to-locale-string.js +7 -2
- package/modules/es.typed-array.to-string.js +3 -2
- package/modules/es.unescape.js +14 -9
- package/modules/es.weak-map.js +15 -15
- package/modules/esnext.array.is-template-object.js +1 -1
- package/modules/esnext.async-iterator.as-indexed-pairs.js +2 -1
- package/modules/esnext.async-iterator.constructor.js +1 -1
- package/modules/esnext.async-iterator.drop.js +2 -1
- package/modules/esnext.async-iterator.filter.js +2 -1
- package/modules/esnext.async-iterator.flat-map.js +3 -2
- package/modules/esnext.async-iterator.from.js +4 -4
- package/modules/esnext.async-iterator.map.js +2 -1
- package/modules/esnext.async-iterator.reduce.js +4 -1
- package/modules/esnext.async-iterator.take.js +4 -2
- package/modules/esnext.composite-key.js +5 -1
- package/modules/esnext.composite-symbol.js +3 -2
- package/modules/esnext.iterator.as-indexed-pairs.js +2 -1
- package/modules/esnext.iterator.constructor.js +1 -1
- package/modules/esnext.iterator.drop.js +4 -2
- package/modules/esnext.iterator.filter.js +2 -1
- package/modules/esnext.iterator.flat-map.js +7 -3
- package/modules/esnext.iterator.from.js +4 -4
- package/modules/esnext.iterator.map.js +2 -1
- package/modules/esnext.iterator.reduce.js +3 -0
- package/modules/esnext.iterator.take.js +2 -1
- package/modules/esnext.map.delete-all.js +2 -4
- package/modules/esnext.map.emplace.js +2 -2
- package/modules/esnext.map.every.js +1 -1
- package/modules/esnext.map.filter.js +5 -4
- package/modules/esnext.map.find-key.js +1 -1
- package/modules/esnext.map.find.js +1 -1
- package/modules/esnext.map.group-by.js +6 -2
- package/modules/esnext.map.includes.js +1 -1
- package/modules/esnext.map.key-by.js +2 -1
- package/modules/esnext.map.map-keys.js +5 -4
- package/modules/esnext.map.map-values.js +5 -4
- package/modules/esnext.map.reduce.js +3 -0
- package/modules/esnext.map.some.js +1 -1
- package/modules/esnext.map.update-or-insert.js +2 -2
- package/modules/esnext.map.update.js +11 -4
- package/modules/esnext.map.upsert.js +2 -2
- package/modules/esnext.math.seeded-prng.js +3 -1
- package/modules/esnext.number.from-string.js +12 -3
- package/modules/esnext.observable.js +14 -9
- package/modules/esnext.reflect.get-metadata-keys.js +5 -10
- package/modules/esnext.set.add-all.js +2 -4
- package/modules/esnext.set.delete-all.js +2 -4
- package/modules/esnext.set.difference.js +3 -2
- package/modules/esnext.set.every.js +1 -1
- package/modules/esnext.set.filter.js +4 -3
- package/modules/esnext.set.find.js +1 -1
- package/modules/esnext.set.intersection.js +3 -2
- package/modules/esnext.set.is-disjoint-from.js +3 -2
- package/modules/esnext.set.is-subset-of.js +3 -2
- package/modules/esnext.set.is-superset-of.js +3 -2
- package/modules/esnext.set.join.js +9 -4
- package/modules/esnext.set.map.js +5 -4
- package/modules/esnext.set.reduce.js +3 -0
- package/modules/esnext.set.some.js +1 -1
- package/modules/esnext.set.symmetric-difference.js +3 -2
- package/modules/esnext.typed-array.from-async.js +0 -1
- package/modules/esnext.typed-array.unique-by.js +4 -2
- package/modules/esnext.weak-map.delete-all.js +2 -4
- package/modules/esnext.weak-map.emplace.js +2 -2
- package/modules/esnext.weak-map.upsert.js +2 -2
- package/modules/esnext.weak-set.add-all.js +2 -4
- package/modules/esnext.weak-set.delete-all.js +2 -4
- package/modules/web.timers.js +5 -4
- package/modules/web.url-search-params.js +122 -104
- package/modules/web.url.js +664 -628
- package/modules/web.url.to-json.js +2 -1
- package/package.json +2 -2
- package/stable/instance/entries.js +6 -4
- package/stable/instance/for-each.js +6 -4
- package/stable/instance/keys.js +6 -4
- package/stable/instance/values.js +6 -4
package/modules/web.url.js
CHANGED
|
@@ -5,12 +5,15 @@ var $ = require('../internals/export');
|
|
|
5
5
|
var DESCRIPTORS = require('../internals/descriptors');
|
|
6
6
|
var USE_NATIVE_URL = require('../internals/native-url');
|
|
7
7
|
var global = require('../internals/global');
|
|
8
|
+
var bind = require('../internals/function-bind-context');
|
|
9
|
+
var uncurryThis = require('../internals/function-uncurry-this');
|
|
8
10
|
var defineProperties = require('../internals/object-define-properties');
|
|
9
11
|
var redefine = require('../internals/redefine');
|
|
10
12
|
var anInstance = require('../internals/an-instance');
|
|
11
13
|
var hasOwn = require('../internals/has-own-property');
|
|
12
14
|
var assign = require('../internals/object-assign');
|
|
13
15
|
var arrayFrom = require('../internals/array-from');
|
|
16
|
+
var arraySlice = require('../internals/array-slice-simple');
|
|
14
17
|
var codeAt = require('../internals/string-multibyte').codeAt;
|
|
15
18
|
var toASCII = require('../internals/string-punycode-to-ascii');
|
|
16
19
|
var $toString = require('../internals/to-string');
|
|
@@ -18,27 +21,42 @@ var setToStringTag = require('../internals/set-to-string-tag');
|
|
|
18
21
|
var URLSearchParamsModule = require('../modules/web.url-search-params');
|
|
19
22
|
var InternalStateModule = require('../internals/internal-state');
|
|
20
23
|
|
|
21
|
-
var NativeURL = global.URL;
|
|
22
|
-
var URLSearchParams = URLSearchParamsModule.URLSearchParams;
|
|
23
|
-
var getInternalSearchParamsState = URLSearchParamsModule.getState;
|
|
24
24
|
var setInternalState = InternalStateModule.set;
|
|
25
25
|
var getInternalURLState = InternalStateModule.getterFor('URL');
|
|
26
|
+
var URLSearchParams = URLSearchParamsModule.URLSearchParams;
|
|
27
|
+
var getInternalSearchParamsState = URLSearchParamsModule.getState;
|
|
28
|
+
|
|
29
|
+
var NativeURL = global.URL;
|
|
30
|
+
var TypeError = global.TypeError;
|
|
31
|
+
var parseInt = global.parseInt;
|
|
26
32
|
var floor = Math.floor;
|
|
27
33
|
var pow = Math.pow;
|
|
34
|
+
var charAt = uncurryThis(''.charAt);
|
|
35
|
+
var exec = uncurryThis(/./.exec);
|
|
36
|
+
var join = uncurryThis([].join);
|
|
37
|
+
var numberToString = uncurryThis(1.0.toString);
|
|
38
|
+
var pop = uncurryThis([].pop);
|
|
39
|
+
var push = uncurryThis([].push);
|
|
40
|
+
var replace = uncurryThis(''.replace);
|
|
41
|
+
var shift = uncurryThis([].shift);
|
|
42
|
+
var split = uncurryThis(''.split);
|
|
43
|
+
var stringSlice = uncurryThis(''.slice);
|
|
44
|
+
var toLowerCase = uncurryThis(''.toLowerCase);
|
|
45
|
+
var unshift = uncurryThis([].unshift);
|
|
28
46
|
|
|
29
47
|
var INVALID_AUTHORITY = 'Invalid authority';
|
|
30
48
|
var INVALID_SCHEME = 'Invalid scheme';
|
|
31
49
|
var INVALID_HOST = 'Invalid host';
|
|
32
50
|
var INVALID_PORT = 'Invalid port';
|
|
33
51
|
|
|
34
|
-
var ALPHA = /[
|
|
52
|
+
var ALPHA = /[a-z]/i;
|
|
35
53
|
// eslint-disable-next-line regexp/no-obscure-range -- safe
|
|
36
|
-
var ALPHANUMERIC = /[\d+-.
|
|
54
|
+
var ALPHANUMERIC = /[\d+-.a-z]/i;
|
|
37
55
|
var DIGIT = /\d/;
|
|
38
56
|
var HEX_START = /^0x/i;
|
|
39
57
|
var OCT = /^[0-7]+$/;
|
|
40
58
|
var DEC = /^\d+$/;
|
|
41
|
-
var HEX = /^[\
|
|
59
|
+
var HEX = /^[\da-f]+$/i;
|
|
42
60
|
/* eslint-disable regexp/no-control-character -- safe */
|
|
43
61
|
var FORBIDDEN_HOST_CODE_POINT = /[\0\t\n\r #%/:<>?@[\\\]^|]/;
|
|
44
62
|
var FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\0\t\n\r #/:<>?@[\\\]^|]/;
|
|
@@ -47,36 +65,12 @@ var TAB_AND_NEW_LINE = /[\t\n\r]/g;
|
|
|
47
65
|
/* eslint-enable regexp/no-control-character -- safe */
|
|
48
66
|
var EOF;
|
|
49
67
|
|
|
50
|
-
|
|
51
|
-
var result, codePoints, index;
|
|
52
|
-
if (input.charAt(0) == '[') {
|
|
53
|
-
if (input.charAt(input.length - 1) != ']') return INVALID_HOST;
|
|
54
|
-
result = parseIPv6(input.slice(1, -1));
|
|
55
|
-
if (!result) return INVALID_HOST;
|
|
56
|
-
url.host = result;
|
|
57
|
-
// opaque host
|
|
58
|
-
} else if (!isSpecial(url)) {
|
|
59
|
-
if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;
|
|
60
|
-
result = '';
|
|
61
|
-
codePoints = arrayFrom(input);
|
|
62
|
-
for (index = 0; index < codePoints.length; index++) {
|
|
63
|
-
result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);
|
|
64
|
-
}
|
|
65
|
-
url.host = result;
|
|
66
|
-
} else {
|
|
67
|
-
input = toASCII(input);
|
|
68
|
-
if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;
|
|
69
|
-
result = parseIPv4(input);
|
|
70
|
-
if (result === null) return INVALID_HOST;
|
|
71
|
-
url.host = result;
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
|
|
68
|
+
// https://url.spec.whatwg.org/#ipv4-number-parser
|
|
75
69
|
var parseIPv4 = function (input) {
|
|
76
|
-
var parts =
|
|
70
|
+
var parts = split(input, '.');
|
|
77
71
|
var partsLength, numbers, index, part, radix, number, ipv4;
|
|
78
72
|
if (parts.length && parts[parts.length - 1] == '') {
|
|
79
|
-
parts.
|
|
73
|
+
parts.length--;
|
|
80
74
|
}
|
|
81
75
|
partsLength = parts.length;
|
|
82
76
|
if (partsLength > 4) return input;
|
|
@@ -85,17 +79,17 @@ var parseIPv4 = function (input) {
|
|
|
85
79
|
part = parts[index];
|
|
86
80
|
if (part == '') return input;
|
|
87
81
|
radix = 10;
|
|
88
|
-
if (part.length > 1 &&
|
|
89
|
-
radix = HEX_START
|
|
90
|
-
part = part
|
|
82
|
+
if (part.length > 1 && charAt(part, 0) == '0') {
|
|
83
|
+
radix = exec(HEX_START, part) ? 16 : 8;
|
|
84
|
+
part = stringSlice(part, radix == 8 ? 1 : 2);
|
|
91
85
|
}
|
|
92
86
|
if (part === '') {
|
|
93
87
|
number = 0;
|
|
94
88
|
} else {
|
|
95
|
-
if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX
|
|
89
|
+
if (!exec(radix == 10 ? DEC : radix == 8 ? OCT : HEX, part)) return input;
|
|
96
90
|
number = parseInt(part, radix);
|
|
97
91
|
}
|
|
98
|
-
|
|
92
|
+
push(numbers, number);
|
|
99
93
|
}
|
|
100
94
|
for (index = 0; index < partsLength; index++) {
|
|
101
95
|
number = numbers[index];
|
|
@@ -103,13 +97,14 @@ var parseIPv4 = function (input) {
|
|
|
103
97
|
if (number >= pow(256, 5 - partsLength)) return null;
|
|
104
98
|
} else if (number > 255) return null;
|
|
105
99
|
}
|
|
106
|
-
ipv4 =
|
|
100
|
+
ipv4 = pop(numbers);
|
|
107
101
|
for (index = 0; index < numbers.length; index++) {
|
|
108
102
|
ipv4 += numbers[index] * pow(256, 3 - index);
|
|
109
103
|
}
|
|
110
104
|
return ipv4;
|
|
111
105
|
};
|
|
112
106
|
|
|
107
|
+
// https://url.spec.whatwg.org/#concept-ipv6-parser
|
|
113
108
|
// eslint-disable-next-line max-statements -- TODO
|
|
114
109
|
var parseIPv6 = function (input) {
|
|
115
110
|
var address = [0, 0, 0, 0, 0, 0, 0, 0];
|
|
@@ -119,11 +114,11 @@ var parseIPv6 = function (input) {
|
|
|
119
114
|
var value, length, numbersSeen, ipv4Piece, number, swaps, swap;
|
|
120
115
|
|
|
121
116
|
var chr = function () {
|
|
122
|
-
return
|
|
117
|
+
return charAt(input, pointer);
|
|
123
118
|
};
|
|
124
119
|
|
|
125
120
|
if (chr() == ':') {
|
|
126
|
-
if (
|
|
121
|
+
if (charAt(input, 1) != ':') return;
|
|
127
122
|
pointer += 2;
|
|
128
123
|
pieceIndex++;
|
|
129
124
|
compress = pieceIndex;
|
|
@@ -138,7 +133,7 @@ var parseIPv6 = function (input) {
|
|
|
138
133
|
continue;
|
|
139
134
|
}
|
|
140
135
|
value = length = 0;
|
|
141
|
-
while (length < 4 && HEX
|
|
136
|
+
while (length < 4 && exec(HEX, chr())) {
|
|
142
137
|
value = value * 16 + parseInt(chr(), 16);
|
|
143
138
|
pointer++;
|
|
144
139
|
length++;
|
|
@@ -154,8 +149,8 @@ var parseIPv6 = function (input) {
|
|
|
154
149
|
if (chr() == '.' && numbersSeen < 4) pointer++;
|
|
155
150
|
else return;
|
|
156
151
|
}
|
|
157
|
-
if (!DIGIT
|
|
158
|
-
while (DIGIT
|
|
152
|
+
if (!exec(DIGIT, chr())) return;
|
|
153
|
+
while (exec(DIGIT, chr())) {
|
|
159
154
|
number = parseInt(chr(), 10);
|
|
160
155
|
if (ipv4Piece === null) ipv4Piece = number;
|
|
161
156
|
else if (ipv4Piece == 0) return;
|
|
@@ -213,15 +208,16 @@ var findLongestZeroSequence = function (ipv6) {
|
|
|
213
208
|
return maxIndex;
|
|
214
209
|
};
|
|
215
210
|
|
|
211
|
+
// https://url.spec.whatwg.org/#host-serializing
|
|
216
212
|
var serializeHost = function (host) {
|
|
217
213
|
var result, index, compress, ignore0;
|
|
218
214
|
// ipv4
|
|
219
215
|
if (typeof host == 'number') {
|
|
220
216
|
result = [];
|
|
221
217
|
for (index = 0; index < 4; index++) {
|
|
222
|
-
|
|
218
|
+
unshift(result, host % 256);
|
|
223
219
|
host = floor(host / 256);
|
|
224
|
-
} return
|
|
220
|
+
} return join(result, '.');
|
|
225
221
|
// ipv6
|
|
226
222
|
} else if (typeof host == 'object') {
|
|
227
223
|
result = '';
|
|
@@ -233,7 +229,7 @@ var serializeHost = function (host) {
|
|
|
233
229
|
result += index ? ':' : '::';
|
|
234
230
|
ignore0 = true;
|
|
235
231
|
} else {
|
|
236
|
-
result += host[index]
|
|
232
|
+
result += numberToString(host[index], 16);
|
|
237
233
|
if (index < 7) result += ':';
|
|
238
234
|
}
|
|
239
235
|
}
|
|
@@ -257,6 +253,7 @@ var percentEncode = function (chr, set) {
|
|
|
257
253
|
return code > 0x20 && code < 0x7F && !hasOwn(set, chr) ? chr : encodeURIComponent(chr);
|
|
258
254
|
};
|
|
259
255
|
|
|
256
|
+
// https://url.spec.whatwg.org/#special-scheme
|
|
260
257
|
var specialSchemes = {
|
|
261
258
|
ftp: 21,
|
|
262
259
|
file: null,
|
|
@@ -266,46 +263,30 @@ var specialSchemes = {
|
|
|
266
263
|
wss: 443
|
|
267
264
|
};
|
|
268
265
|
|
|
269
|
-
|
|
270
|
-
return hasOwn(specialSchemes, url.scheme);
|
|
271
|
-
};
|
|
272
|
-
|
|
273
|
-
var includesCredentials = function (url) {
|
|
274
|
-
return url.username != '' || url.password != '';
|
|
275
|
-
};
|
|
276
|
-
|
|
277
|
-
var cannotHaveUsernamePasswordPort = function (url) {
|
|
278
|
-
return !url.host || url.cannotBeABaseURL || url.scheme == 'file';
|
|
279
|
-
};
|
|
280
|
-
|
|
266
|
+
// https://url.spec.whatwg.org/#windows-drive-letter
|
|
281
267
|
var isWindowsDriveLetter = function (string, normalized) {
|
|
282
268
|
var second;
|
|
283
|
-
return string.length == 2 && ALPHA
|
|
284
|
-
&& ((second =
|
|
269
|
+
return string.length == 2 && exec(ALPHA, charAt(string, 0))
|
|
270
|
+
&& ((second = charAt(string, 1)) == ':' || (!normalized && second == '|'));
|
|
285
271
|
};
|
|
286
272
|
|
|
273
|
+
// https://url.spec.whatwg.org/#start-with-a-windows-drive-letter
|
|
287
274
|
var startsWithWindowsDriveLetter = function (string) {
|
|
288
275
|
var third;
|
|
289
|
-
return string.length > 1 && isWindowsDriveLetter(string
|
|
276
|
+
return string.length > 1 && isWindowsDriveLetter(stringSlice(string, 0, 2)) && (
|
|
290
277
|
string.length == 2 ||
|
|
291
|
-
((third =
|
|
278
|
+
((third = charAt(string, 2)) === '/' || third === '\\' || third === '?' || third === '#')
|
|
292
279
|
);
|
|
293
280
|
};
|
|
294
281
|
|
|
295
|
-
|
|
296
|
-
var path = url.path;
|
|
297
|
-
var pathSize = path.length;
|
|
298
|
-
if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {
|
|
299
|
-
path.pop();
|
|
300
|
-
}
|
|
301
|
-
};
|
|
302
|
-
|
|
282
|
+
// https://url.spec.whatwg.org/#single-dot-path-segment
|
|
303
283
|
var isSingleDot = function (segment) {
|
|
304
|
-
return segment === '.' ||
|
|
284
|
+
return segment === '.' || toLowerCase(segment) === '%2e';
|
|
305
285
|
};
|
|
306
286
|
|
|
287
|
+
// https://url.spec.whatwg.org/#double-dot-path-segment
|
|
307
288
|
var isDoubleDot = function (segment) {
|
|
308
|
-
segment =
|
|
289
|
+
segment = toLowerCase(segment);
|
|
309
290
|
return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';
|
|
310
291
|
};
|
|
311
292
|
|
|
@@ -332,655 +313,716 @@ var CANNOT_BE_A_BASE_URL_PATH = {};
|
|
|
332
313
|
var QUERY = {};
|
|
333
314
|
var FRAGMENT = {};
|
|
334
315
|
|
|
335
|
-
|
|
336
|
-
var
|
|
337
|
-
var
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
url.host = null;
|
|
350
|
-
url.port = null;
|
|
351
|
-
url.path = [];
|
|
352
|
-
url.query = null;
|
|
353
|
-
url.fragment = null;
|
|
354
|
-
url.cannotBeABaseURL = false;
|
|
355
|
-
input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');
|
|
316
|
+
var URLState = function (url, isBase, base) {
|
|
317
|
+
var urlString = $toString(url);
|
|
318
|
+
var baseState, failure, searchParams;
|
|
319
|
+
if (isBase) {
|
|
320
|
+
failure = this.parse(urlString);
|
|
321
|
+
if (failure) throw TypeError(failure);
|
|
322
|
+
this.searchParams = null;
|
|
323
|
+
} else {
|
|
324
|
+
if (base !== undefined) baseState = new URLState(base, true);
|
|
325
|
+
failure = this.parse(urlString, null, baseState);
|
|
326
|
+
if (failure) throw TypeError(failure);
|
|
327
|
+
searchParams = getInternalSearchParamsState(new URLSearchParams());
|
|
328
|
+
searchParams.bindURL(this);
|
|
329
|
+
this.searchParams = searchParams;
|
|
356
330
|
}
|
|
331
|
+
};
|
|
357
332
|
|
|
358
|
-
|
|
333
|
+
URLState.prototype = {
|
|
334
|
+
type: 'URL',
|
|
335
|
+
// https://url.spec.whatwg.org/#url-parsing
|
|
336
|
+
// eslint-disable-next-line max-statements -- TODO
|
|
337
|
+
parse: function (input, stateOverride, base) {
|
|
338
|
+
var url = this;
|
|
339
|
+
var state = stateOverride || SCHEME_START;
|
|
340
|
+
var pointer = 0;
|
|
341
|
+
var buffer = '';
|
|
342
|
+
var seenAt = false;
|
|
343
|
+
var seenBracket = false;
|
|
344
|
+
var seenPasswordToken = false;
|
|
345
|
+
var codePoints, chr, bufferCodePoints, failure;
|
|
346
|
+
|
|
347
|
+
input = $toString(input);
|
|
348
|
+
|
|
349
|
+
if (!stateOverride) {
|
|
350
|
+
url.scheme = '';
|
|
351
|
+
url.username = '';
|
|
352
|
+
url.password = '';
|
|
353
|
+
url.host = null;
|
|
354
|
+
url.port = null;
|
|
355
|
+
url.path = [];
|
|
356
|
+
url.query = null;
|
|
357
|
+
url.fragment = null;
|
|
358
|
+
url.cannotBeABaseURL = false;
|
|
359
|
+
input = replace(input, LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');
|
|
360
|
+
}
|
|
359
361
|
|
|
360
|
-
|
|
362
|
+
input = replace(input, TAB_AND_NEW_LINE, '');
|
|
361
363
|
|
|
362
|
-
|
|
363
|
-
chr = codePoints[pointer];
|
|
364
|
-
switch (state) {
|
|
365
|
-
case SCHEME_START:
|
|
366
|
-
if (chr && ALPHA.test(chr)) {
|
|
367
|
-
buffer += chr.toLowerCase();
|
|
368
|
-
state = SCHEME;
|
|
369
|
-
} else if (!stateOverride) {
|
|
370
|
-
state = NO_SCHEME;
|
|
371
|
-
continue;
|
|
372
|
-
} else return INVALID_SCHEME;
|
|
373
|
-
break;
|
|
374
|
-
|
|
375
|
-
case SCHEME:
|
|
376
|
-
if (chr && (ALPHANUMERIC.test(chr) || chr == '+' || chr == '-' || chr == '.')) {
|
|
377
|
-
buffer += chr.toLowerCase();
|
|
378
|
-
} else if (chr == ':') {
|
|
379
|
-
if (stateOverride && (
|
|
380
|
-
(isSpecial(url) != hasOwn(specialSchemes, buffer)) ||
|
|
381
|
-
(buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||
|
|
382
|
-
(url.scheme == 'file' && !url.host)
|
|
383
|
-
)) return;
|
|
384
|
-
url.scheme = buffer;
|
|
385
|
-
if (stateOverride) {
|
|
386
|
-
if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;
|
|
387
|
-
return;
|
|
388
|
-
}
|
|
389
|
-
buffer = '';
|
|
390
|
-
if (url.scheme == 'file') {
|
|
391
|
-
state = FILE;
|
|
392
|
-
} else if (isSpecial(url) && base && base.scheme == url.scheme) {
|
|
393
|
-
state = SPECIAL_RELATIVE_OR_AUTHORITY;
|
|
394
|
-
} else if (isSpecial(url)) {
|
|
395
|
-
state = SPECIAL_AUTHORITY_SLASHES;
|
|
396
|
-
} else if (codePoints[pointer + 1] == '/') {
|
|
397
|
-
state = PATH_OR_AUTHORITY;
|
|
398
|
-
pointer++;
|
|
399
|
-
} else {
|
|
400
|
-
url.cannotBeABaseURL = true;
|
|
401
|
-
url.path.push('');
|
|
402
|
-
state = CANNOT_BE_A_BASE_URL_PATH;
|
|
403
|
-
}
|
|
404
|
-
} else if (!stateOverride) {
|
|
405
|
-
buffer = '';
|
|
406
|
-
state = NO_SCHEME;
|
|
407
|
-
pointer = 0;
|
|
408
|
-
continue;
|
|
409
|
-
} else return INVALID_SCHEME;
|
|
410
|
-
break;
|
|
364
|
+
codePoints = arrayFrom(input);
|
|
411
365
|
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
366
|
+
while (pointer <= codePoints.length) {
|
|
367
|
+
chr = codePoints[pointer];
|
|
368
|
+
switch (state) {
|
|
369
|
+
case SCHEME_START:
|
|
370
|
+
if (chr && exec(ALPHA, chr)) {
|
|
371
|
+
buffer += toLowerCase(chr);
|
|
372
|
+
state = SCHEME;
|
|
373
|
+
} else if (!stateOverride) {
|
|
374
|
+
state = NO_SCHEME;
|
|
375
|
+
continue;
|
|
376
|
+
} else return INVALID_SCHEME;
|
|
421
377
|
break;
|
|
422
|
-
}
|
|
423
|
-
state = base.scheme == 'file' ? FILE : RELATIVE;
|
|
424
|
-
continue;
|
|
425
|
-
|
|
426
|
-
case SPECIAL_RELATIVE_OR_AUTHORITY:
|
|
427
|
-
if (chr == '/' && codePoints[pointer + 1] == '/') {
|
|
428
|
-
state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
|
|
429
|
-
pointer++;
|
|
430
|
-
} else {
|
|
431
|
-
state = RELATIVE;
|
|
432
|
-
continue;
|
|
433
|
-
} break;
|
|
434
378
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
379
|
+
case SCHEME:
|
|
380
|
+
if (chr && (exec(ALPHANUMERIC, chr) || chr == '+' || chr == '-' || chr == '.')) {
|
|
381
|
+
buffer += toLowerCase(chr);
|
|
382
|
+
} else if (chr == ':') {
|
|
383
|
+
if (stateOverride && (
|
|
384
|
+
(url.isSpecial() != hasOwn(specialSchemes, buffer)) ||
|
|
385
|
+
(buffer == 'file' && (url.includesCredentials() || url.port !== null)) ||
|
|
386
|
+
(url.scheme == 'file' && !url.host)
|
|
387
|
+
)) return;
|
|
388
|
+
url.scheme = buffer;
|
|
389
|
+
if (stateOverride) {
|
|
390
|
+
if (url.isSpecial() && specialSchemes[url.scheme] == url.port) url.port = null;
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
buffer = '';
|
|
394
|
+
if (url.scheme == 'file') {
|
|
395
|
+
state = FILE;
|
|
396
|
+
} else if (url.isSpecial() && base && base.scheme == url.scheme) {
|
|
397
|
+
state = SPECIAL_RELATIVE_OR_AUTHORITY;
|
|
398
|
+
} else if (url.isSpecial()) {
|
|
399
|
+
state = SPECIAL_AUTHORITY_SLASHES;
|
|
400
|
+
} else if (codePoints[pointer + 1] == '/') {
|
|
401
|
+
state = PATH_OR_AUTHORITY;
|
|
402
|
+
pointer++;
|
|
403
|
+
} else {
|
|
404
|
+
url.cannotBeABaseURL = true;
|
|
405
|
+
push(url.path, '');
|
|
406
|
+
state = CANNOT_BE_A_BASE_URL_PATH;
|
|
407
|
+
}
|
|
408
|
+
} else if (!stateOverride) {
|
|
409
|
+
buffer = '';
|
|
410
|
+
state = NO_SCHEME;
|
|
411
|
+
pointer = 0;
|
|
412
|
+
continue;
|
|
413
|
+
} else return INVALID_SCHEME;
|
|
438
414
|
break;
|
|
439
|
-
} else {
|
|
440
|
-
state = PATH;
|
|
441
|
-
continue;
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
case RELATIVE:
|
|
445
|
-
url.scheme = base.scheme;
|
|
446
|
-
if (chr == EOF) {
|
|
447
|
-
url.username = base.username;
|
|
448
|
-
url.password = base.password;
|
|
449
|
-
url.host = base.host;
|
|
450
|
-
url.port = base.port;
|
|
451
|
-
url.path = base.path.slice();
|
|
452
|
-
url.query = base.query;
|
|
453
|
-
} else if (chr == '/' || (chr == '\\' && isSpecial(url))) {
|
|
454
|
-
state = RELATIVE_SLASH;
|
|
455
|
-
} else if (chr == '?') {
|
|
456
|
-
url.username = base.username;
|
|
457
|
-
url.password = base.password;
|
|
458
|
-
url.host = base.host;
|
|
459
|
-
url.port = base.port;
|
|
460
|
-
url.path = base.path.slice();
|
|
461
|
-
url.query = '';
|
|
462
|
-
state = QUERY;
|
|
463
|
-
} else if (chr == '#') {
|
|
464
|
-
url.username = base.username;
|
|
465
|
-
url.password = base.password;
|
|
466
|
-
url.host = base.host;
|
|
467
|
-
url.port = base.port;
|
|
468
|
-
url.path = base.path.slice();
|
|
469
|
-
url.query = base.query;
|
|
470
|
-
url.fragment = '';
|
|
471
|
-
state = FRAGMENT;
|
|
472
|
-
} else {
|
|
473
|
-
url.username = base.username;
|
|
474
|
-
url.password = base.password;
|
|
475
|
-
url.host = base.host;
|
|
476
|
-
url.port = base.port;
|
|
477
|
-
url.path = base.path.slice();
|
|
478
|
-
url.path.pop();
|
|
479
|
-
state = PATH;
|
|
480
|
-
continue;
|
|
481
|
-
} break;
|
|
482
415
|
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
416
|
+
case NO_SCHEME:
|
|
417
|
+
if (!base || (base.cannotBeABaseURL && chr != '#')) return INVALID_SCHEME;
|
|
418
|
+
if (base.cannotBeABaseURL && chr == '#') {
|
|
419
|
+
url.scheme = base.scheme;
|
|
420
|
+
url.path = arraySlice(base.path);
|
|
421
|
+
url.query = base.query;
|
|
422
|
+
url.fragment = '';
|
|
423
|
+
url.cannotBeABaseURL = true;
|
|
424
|
+
state = FRAGMENT;
|
|
425
|
+
break;
|
|
426
|
+
}
|
|
427
|
+
state = base.scheme == 'file' ? FILE : RELATIVE;
|
|
494
428
|
continue;
|
|
495
|
-
} break;
|
|
496
429
|
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
430
|
+
case SPECIAL_RELATIVE_OR_AUTHORITY:
|
|
431
|
+
if (chr == '/' && codePoints[pointer + 1] == '/') {
|
|
432
|
+
state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
|
|
433
|
+
pointer++;
|
|
434
|
+
} else {
|
|
435
|
+
state = RELATIVE;
|
|
436
|
+
continue;
|
|
437
|
+
} break;
|
|
502
438
|
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
if (chr == '@') {
|
|
511
|
-
if (seenAt) buffer = '%40' + buffer;
|
|
512
|
-
seenAt = true;
|
|
513
|
-
bufferCodePoints = arrayFrom(buffer);
|
|
514
|
-
for (var i = 0; i < bufferCodePoints.length; i++) {
|
|
515
|
-
var codePoint = bufferCodePoints[i];
|
|
516
|
-
if (codePoint == ':' && !seenPasswordToken) {
|
|
517
|
-
seenPasswordToken = true;
|
|
518
|
-
continue;
|
|
519
|
-
}
|
|
520
|
-
var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);
|
|
521
|
-
if (seenPasswordToken) url.password += encodedCodePoints;
|
|
522
|
-
else url.username += encodedCodePoints;
|
|
523
|
-
}
|
|
524
|
-
buffer = '';
|
|
525
|
-
} else if (
|
|
526
|
-
chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
|
|
527
|
-
(chr == '\\' && isSpecial(url))
|
|
528
|
-
) {
|
|
529
|
-
if (seenAt && buffer == '') return INVALID_AUTHORITY;
|
|
530
|
-
pointer -= arrayFrom(buffer).length + 1;
|
|
531
|
-
buffer = '';
|
|
532
|
-
state = HOST;
|
|
533
|
-
} else buffer += chr;
|
|
534
|
-
break;
|
|
535
|
-
|
|
536
|
-
case HOST:
|
|
537
|
-
case HOSTNAME:
|
|
538
|
-
if (stateOverride && url.scheme == 'file') {
|
|
539
|
-
state = FILE_HOST;
|
|
540
|
-
continue;
|
|
541
|
-
} else if (chr == ':' && !seenBracket) {
|
|
542
|
-
if (buffer == '') return INVALID_HOST;
|
|
543
|
-
failure = parseHost(url, buffer);
|
|
544
|
-
if (failure) return failure;
|
|
545
|
-
buffer = '';
|
|
546
|
-
state = PORT;
|
|
547
|
-
if (stateOverride == HOSTNAME) return;
|
|
548
|
-
} else if (
|
|
549
|
-
chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
|
|
550
|
-
(chr == '\\' && isSpecial(url))
|
|
551
|
-
) {
|
|
552
|
-
if (isSpecial(url) && buffer == '') return INVALID_HOST;
|
|
553
|
-
if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;
|
|
554
|
-
failure = parseHost(url, buffer);
|
|
555
|
-
if (failure) return failure;
|
|
556
|
-
buffer = '';
|
|
557
|
-
state = PATH_START;
|
|
558
|
-
if (stateOverride) return;
|
|
559
|
-
continue;
|
|
560
|
-
} else {
|
|
561
|
-
if (chr == '[') seenBracket = true;
|
|
562
|
-
else if (chr == ']') seenBracket = false;
|
|
563
|
-
buffer += chr;
|
|
564
|
-
} break;
|
|
565
|
-
|
|
566
|
-
case PORT:
|
|
567
|
-
if (DIGIT.test(chr)) {
|
|
568
|
-
buffer += chr;
|
|
569
|
-
} else if (
|
|
570
|
-
chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
|
|
571
|
-
(chr == '\\' && isSpecial(url)) ||
|
|
572
|
-
stateOverride
|
|
573
|
-
) {
|
|
574
|
-
if (buffer != '') {
|
|
575
|
-
var port = parseInt(buffer, 10);
|
|
576
|
-
if (port > 0xFFFF) return INVALID_PORT;
|
|
577
|
-
url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;
|
|
578
|
-
buffer = '';
|
|
439
|
+
case PATH_OR_AUTHORITY:
|
|
440
|
+
if (chr == '/') {
|
|
441
|
+
state = AUTHORITY;
|
|
442
|
+
break;
|
|
443
|
+
} else {
|
|
444
|
+
state = PATH;
|
|
445
|
+
continue;
|
|
579
446
|
}
|
|
580
|
-
if (stateOverride) return;
|
|
581
|
-
state = PATH_START;
|
|
582
|
-
continue;
|
|
583
|
-
} else return INVALID_PORT;
|
|
584
|
-
break;
|
|
585
447
|
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
if (chr == '/' || chr == '\\') state = FILE_SLASH;
|
|
589
|
-
else if (base && base.scheme == 'file') {
|
|
448
|
+
case RELATIVE:
|
|
449
|
+
url.scheme = base.scheme;
|
|
590
450
|
if (chr == EOF) {
|
|
451
|
+
url.username = base.username;
|
|
452
|
+
url.password = base.password;
|
|
591
453
|
url.host = base.host;
|
|
592
|
-
url.
|
|
454
|
+
url.port = base.port;
|
|
455
|
+
url.path = arraySlice(base.path);
|
|
593
456
|
url.query = base.query;
|
|
457
|
+
} else if (chr == '/' || (chr == '\\' && url.isSpecial())) {
|
|
458
|
+
state = RELATIVE_SLASH;
|
|
594
459
|
} else if (chr == '?') {
|
|
460
|
+
url.username = base.username;
|
|
461
|
+
url.password = base.password;
|
|
595
462
|
url.host = base.host;
|
|
596
|
-
url.
|
|
463
|
+
url.port = base.port;
|
|
464
|
+
url.path = arraySlice(base.path);
|
|
597
465
|
url.query = '';
|
|
598
466
|
state = QUERY;
|
|
599
467
|
} else if (chr == '#') {
|
|
468
|
+
url.username = base.username;
|
|
469
|
+
url.password = base.password;
|
|
600
470
|
url.host = base.host;
|
|
601
|
-
url.
|
|
471
|
+
url.port = base.port;
|
|
472
|
+
url.path = arraySlice(base.path);
|
|
602
473
|
url.query = base.query;
|
|
603
474
|
url.fragment = '';
|
|
604
475
|
state = FRAGMENT;
|
|
605
476
|
} else {
|
|
606
|
-
|
|
477
|
+
url.username = base.username;
|
|
478
|
+
url.password = base.password;
|
|
479
|
+
url.host = base.host;
|
|
480
|
+
url.port = base.port;
|
|
481
|
+
url.path = arraySlice(base.path);
|
|
482
|
+
url.path.length--;
|
|
483
|
+
state = PATH;
|
|
484
|
+
continue;
|
|
485
|
+
} break;
|
|
486
|
+
|
|
487
|
+
case RELATIVE_SLASH:
|
|
488
|
+
if (url.isSpecial() && (chr == '/' || chr == '\\')) {
|
|
489
|
+
state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
|
|
490
|
+
} else if (chr == '/') {
|
|
491
|
+
state = AUTHORITY;
|
|
492
|
+
} else {
|
|
493
|
+
url.username = base.username;
|
|
494
|
+
url.password = base.password;
|
|
495
|
+
url.host = base.host;
|
|
496
|
+
url.port = base.port;
|
|
497
|
+
state = PATH;
|
|
498
|
+
continue;
|
|
499
|
+
} break;
|
|
500
|
+
|
|
501
|
+
case SPECIAL_AUTHORITY_SLASHES:
|
|
502
|
+
state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
|
|
503
|
+
if (chr != '/' || charAt(buffer, pointer + 1) != '/') continue;
|
|
504
|
+
pointer++;
|
|
505
|
+
break;
|
|
506
|
+
|
|
507
|
+
case SPECIAL_AUTHORITY_IGNORE_SLASHES:
|
|
508
|
+
if (chr != '/' && chr != '\\') {
|
|
509
|
+
state = AUTHORITY;
|
|
510
|
+
continue;
|
|
511
|
+
} break;
|
|
512
|
+
|
|
513
|
+
case AUTHORITY:
|
|
514
|
+
if (chr == '@') {
|
|
515
|
+
if (seenAt) buffer = '%40' + buffer;
|
|
516
|
+
seenAt = true;
|
|
517
|
+
bufferCodePoints = arrayFrom(buffer);
|
|
518
|
+
for (var i = 0; i < bufferCodePoints.length; i++) {
|
|
519
|
+
var codePoint = bufferCodePoints[i];
|
|
520
|
+
if (codePoint == ':' && !seenPasswordToken) {
|
|
521
|
+
seenPasswordToken = true;
|
|
522
|
+
continue;
|
|
523
|
+
}
|
|
524
|
+
var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);
|
|
525
|
+
if (seenPasswordToken) url.password += encodedCodePoints;
|
|
526
|
+
else url.username += encodedCodePoints;
|
|
527
|
+
}
|
|
528
|
+
buffer = '';
|
|
529
|
+
} else if (
|
|
530
|
+
chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
|
|
531
|
+
(chr == '\\' && url.isSpecial())
|
|
532
|
+
) {
|
|
533
|
+
if (seenAt && buffer == '') return INVALID_AUTHORITY;
|
|
534
|
+
pointer -= arrayFrom(buffer).length + 1;
|
|
535
|
+
buffer = '';
|
|
536
|
+
state = HOST;
|
|
537
|
+
} else buffer += chr;
|
|
538
|
+
break;
|
|
539
|
+
|
|
540
|
+
case HOST:
|
|
541
|
+
case HOSTNAME:
|
|
542
|
+
if (stateOverride && url.scheme == 'file') {
|
|
543
|
+
state = FILE_HOST;
|
|
544
|
+
continue;
|
|
545
|
+
} else if (chr == ':' && !seenBracket) {
|
|
546
|
+
if (buffer == '') return INVALID_HOST;
|
|
547
|
+
failure = url.parseHost(buffer);
|
|
548
|
+
if (failure) return failure;
|
|
549
|
+
buffer = '';
|
|
550
|
+
state = PORT;
|
|
551
|
+
if (stateOverride == HOSTNAME) return;
|
|
552
|
+
} else if (
|
|
553
|
+
chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
|
|
554
|
+
(chr == '\\' && url.isSpecial())
|
|
555
|
+
) {
|
|
556
|
+
if (url.isSpecial() && buffer == '') return INVALID_HOST;
|
|
557
|
+
if (stateOverride && buffer == '' && (url.includesCredentials() || url.port !== null)) return;
|
|
558
|
+
failure = url.parseHost(buffer);
|
|
559
|
+
if (failure) return failure;
|
|
560
|
+
buffer = '';
|
|
561
|
+
state = PATH_START;
|
|
562
|
+
if (stateOverride) return;
|
|
563
|
+
continue;
|
|
564
|
+
} else {
|
|
565
|
+
if (chr == '[') seenBracket = true;
|
|
566
|
+
else if (chr == ']') seenBracket = false;
|
|
567
|
+
buffer += chr;
|
|
568
|
+
} break;
|
|
569
|
+
|
|
570
|
+
case PORT:
|
|
571
|
+
if (exec(DIGIT, chr)) {
|
|
572
|
+
buffer += chr;
|
|
573
|
+
} else if (
|
|
574
|
+
chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
|
|
575
|
+
(chr == '\\' && url.isSpecial()) ||
|
|
576
|
+
stateOverride
|
|
577
|
+
) {
|
|
578
|
+
if (buffer != '') {
|
|
579
|
+
var port = parseInt(buffer, 10);
|
|
580
|
+
if (port > 0xFFFF) return INVALID_PORT;
|
|
581
|
+
url.port = (url.isSpecial() && port === specialSchemes[url.scheme]) ? null : port;
|
|
582
|
+
buffer = '';
|
|
583
|
+
}
|
|
584
|
+
if (stateOverride) return;
|
|
585
|
+
state = PATH_START;
|
|
586
|
+
continue;
|
|
587
|
+
} else return INVALID_PORT;
|
|
588
|
+
break;
|
|
589
|
+
|
|
590
|
+
case FILE:
|
|
591
|
+
url.scheme = 'file';
|
|
592
|
+
if (chr == '/' || chr == '\\') state = FILE_SLASH;
|
|
593
|
+
else if (base && base.scheme == 'file') {
|
|
594
|
+
if (chr == EOF) {
|
|
595
|
+
url.host = base.host;
|
|
596
|
+
url.path = arraySlice(base.path);
|
|
597
|
+
url.query = base.query;
|
|
598
|
+
} else if (chr == '?') {
|
|
607
599
|
url.host = base.host;
|
|
608
|
-
url.path = base.path
|
|
609
|
-
|
|
600
|
+
url.path = arraySlice(base.path);
|
|
601
|
+
url.query = '';
|
|
602
|
+
state = QUERY;
|
|
603
|
+
} else if (chr == '#') {
|
|
604
|
+
url.host = base.host;
|
|
605
|
+
url.path = arraySlice(base.path);
|
|
606
|
+
url.query = base.query;
|
|
607
|
+
url.fragment = '';
|
|
608
|
+
state = FRAGMENT;
|
|
609
|
+
} else {
|
|
610
|
+
if (!startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) {
|
|
611
|
+
url.host = base.host;
|
|
612
|
+
url.path = arraySlice(base.path);
|
|
613
|
+
url.shortenPath();
|
|
614
|
+
}
|
|
615
|
+
state = PATH;
|
|
616
|
+
continue;
|
|
610
617
|
}
|
|
618
|
+
} else {
|
|
611
619
|
state = PATH;
|
|
612
620
|
continue;
|
|
621
|
+
} break;
|
|
622
|
+
|
|
623
|
+
case FILE_SLASH:
|
|
624
|
+
if (chr == '/' || chr == '\\') {
|
|
625
|
+
state = FILE_HOST;
|
|
626
|
+
break;
|
|
627
|
+
}
|
|
628
|
+
if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) {
|
|
629
|
+
if (isWindowsDriveLetter(base.path[0], true)) push(url.path, base.path[0]);
|
|
630
|
+
else url.host = base.host;
|
|
613
631
|
}
|
|
614
|
-
} else {
|
|
615
632
|
state = PATH;
|
|
616
633
|
continue;
|
|
617
|
-
} break;
|
|
618
634
|
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
635
|
+
case FILE_HOST:
|
|
636
|
+
if (chr == EOF || chr == '/' || chr == '\\' || chr == '?' || chr == '#') {
|
|
637
|
+
if (!stateOverride && isWindowsDriveLetter(buffer)) {
|
|
638
|
+
state = PATH;
|
|
639
|
+
} else if (buffer == '') {
|
|
640
|
+
url.host = '';
|
|
641
|
+
if (stateOverride) return;
|
|
642
|
+
state = PATH_START;
|
|
643
|
+
} else {
|
|
644
|
+
failure = url.parseHost(buffer);
|
|
645
|
+
if (failure) return failure;
|
|
646
|
+
if (url.host == 'localhost') url.host = '';
|
|
647
|
+
if (stateOverride) return;
|
|
648
|
+
buffer = '';
|
|
649
|
+
state = PATH_START;
|
|
650
|
+
} continue;
|
|
651
|
+
} else buffer += chr;
|
|
622
652
|
break;
|
|
623
|
-
}
|
|
624
|
-
if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {
|
|
625
|
-
if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);
|
|
626
|
-
else url.host = base.host;
|
|
627
|
-
}
|
|
628
|
-
state = PATH;
|
|
629
|
-
continue;
|
|
630
653
|
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
if (!stateOverride && isWindowsDriveLetter(buffer)) {
|
|
654
|
+
case PATH_START:
|
|
655
|
+
if (url.isSpecial()) {
|
|
634
656
|
state = PATH;
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
state =
|
|
639
|
-
} else {
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
657
|
+
if (chr != '/' && chr != '\\') continue;
|
|
658
|
+
} else if (!stateOverride && chr == '?') {
|
|
659
|
+
url.query = '';
|
|
660
|
+
state = QUERY;
|
|
661
|
+
} else if (!stateOverride && chr == '#') {
|
|
662
|
+
url.fragment = '';
|
|
663
|
+
state = FRAGMENT;
|
|
664
|
+
} else if (chr != EOF) {
|
|
665
|
+
state = PATH;
|
|
666
|
+
if (chr != '/') continue;
|
|
667
|
+
} break;
|
|
668
|
+
|
|
669
|
+
case PATH:
|
|
670
|
+
if (
|
|
671
|
+
chr == EOF || chr == '/' ||
|
|
672
|
+
(chr == '\\' && url.isSpecial()) ||
|
|
673
|
+
(!stateOverride && (chr == '?' || chr == '#'))
|
|
674
|
+
) {
|
|
675
|
+
if (isDoubleDot(buffer)) {
|
|
676
|
+
url.shortenPath();
|
|
677
|
+
if (chr != '/' && !(chr == '\\' && url.isSpecial())) {
|
|
678
|
+
push(url.path, '');
|
|
679
|
+
}
|
|
680
|
+
} else if (isSingleDot(buffer)) {
|
|
681
|
+
if (chr != '/' && !(chr == '\\' && url.isSpecial())) {
|
|
682
|
+
push(url.path, '');
|
|
683
|
+
}
|
|
684
|
+
} else {
|
|
685
|
+
if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {
|
|
686
|
+
if (url.host) url.host = '';
|
|
687
|
+
buffer = charAt(buffer, 0) + ':'; // normalize windows drive letter
|
|
688
|
+
}
|
|
689
|
+
push(url.path, buffer);
|
|
690
|
+
}
|
|
644
691
|
buffer = '';
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
case PATH_START:
|
|
651
|
-
if (isSpecial(url)) {
|
|
652
|
-
state = PATH;
|
|
653
|
-
if (chr != '/' && chr != '\\') continue;
|
|
654
|
-
} else if (!stateOverride && chr == '?') {
|
|
655
|
-
url.query = '';
|
|
656
|
-
state = QUERY;
|
|
657
|
-
} else if (!stateOverride && chr == '#') {
|
|
658
|
-
url.fragment = '';
|
|
659
|
-
state = FRAGMENT;
|
|
660
|
-
} else if (chr != EOF) {
|
|
661
|
-
state = PATH;
|
|
662
|
-
if (chr != '/') continue;
|
|
663
|
-
} break;
|
|
664
|
-
|
|
665
|
-
case PATH:
|
|
666
|
-
if (
|
|
667
|
-
chr == EOF || chr == '/' ||
|
|
668
|
-
(chr == '\\' && isSpecial(url)) ||
|
|
669
|
-
(!stateOverride && (chr == '?' || chr == '#'))
|
|
670
|
-
) {
|
|
671
|
-
if (isDoubleDot(buffer)) {
|
|
672
|
-
shortenURLsPath(url);
|
|
673
|
-
if (chr != '/' && !(chr == '\\' && isSpecial(url))) {
|
|
674
|
-
url.path.push('');
|
|
692
|
+
if (url.scheme == 'file' && (chr == EOF || chr == '?' || chr == '#')) {
|
|
693
|
+
while (url.path.length > 1 && url.path[0] === '') {
|
|
694
|
+
shift(url.path);
|
|
695
|
+
}
|
|
675
696
|
}
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
697
|
+
if (chr == '?') {
|
|
698
|
+
url.query = '';
|
|
699
|
+
state = QUERY;
|
|
700
|
+
} else if (chr == '#') {
|
|
701
|
+
url.fragment = '';
|
|
702
|
+
state = FRAGMENT;
|
|
679
703
|
}
|
|
680
704
|
} else {
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
url.path.push(buffer);
|
|
686
|
-
}
|
|
687
|
-
buffer = '';
|
|
688
|
-
if (url.scheme == 'file' && (chr == EOF || chr == '?' || chr == '#')) {
|
|
689
|
-
while (url.path.length > 1 && url.path[0] === '') {
|
|
690
|
-
url.path.shift();
|
|
691
|
-
}
|
|
692
|
-
}
|
|
705
|
+
buffer += percentEncode(chr, pathPercentEncodeSet);
|
|
706
|
+
} break;
|
|
707
|
+
|
|
708
|
+
case CANNOT_BE_A_BASE_URL_PATH:
|
|
693
709
|
if (chr == '?') {
|
|
694
710
|
url.query = '';
|
|
695
711
|
state = QUERY;
|
|
696
712
|
} else if (chr == '#') {
|
|
697
713
|
url.fragment = '';
|
|
698
714
|
state = FRAGMENT;
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
url.fragment = '';
|
|
718
|
-
state = FRAGMENT;
|
|
719
|
-
} else if (chr != EOF) {
|
|
720
|
-
if (chr == "'" && isSpecial(url)) url.query += '%27';
|
|
721
|
-
else if (chr == '#') url.query += '%23';
|
|
722
|
-
else url.query += percentEncode(chr, C0ControlPercentEncodeSet);
|
|
723
|
-
} break;
|
|
724
|
-
|
|
725
|
-
case FRAGMENT:
|
|
726
|
-
if (chr != EOF) url.fragment += percentEncode(chr, fragmentPercentEncodeSet);
|
|
727
|
-
break;
|
|
728
|
-
}
|
|
715
|
+
} else if (chr != EOF) {
|
|
716
|
+
url.path[0] += percentEncode(chr, C0ControlPercentEncodeSet);
|
|
717
|
+
} break;
|
|
718
|
+
|
|
719
|
+
case QUERY:
|
|
720
|
+
if (!stateOverride && chr == '#') {
|
|
721
|
+
url.fragment = '';
|
|
722
|
+
state = FRAGMENT;
|
|
723
|
+
} else if (chr != EOF) {
|
|
724
|
+
if (chr == "'" && url.isSpecial()) url.query += '%27';
|
|
725
|
+
else if (chr == '#') url.query += '%23';
|
|
726
|
+
else url.query += percentEncode(chr, C0ControlPercentEncodeSet);
|
|
727
|
+
} break;
|
|
728
|
+
|
|
729
|
+
case FRAGMENT:
|
|
730
|
+
if (chr != EOF) url.fragment += percentEncode(chr, fragmentPercentEncodeSet);
|
|
731
|
+
break;
|
|
732
|
+
}
|
|
729
733
|
|
|
730
|
-
|
|
734
|
+
pointer++;
|
|
735
|
+
}
|
|
736
|
+
},
|
|
737
|
+
// https://url.spec.whatwg.org/#host-parsing
|
|
738
|
+
parseHost: function (input) {
|
|
739
|
+
var result, codePoints, index;
|
|
740
|
+
if (charAt(input, 0) == '[') {
|
|
741
|
+
if (charAt(input, input.length - 1) != ']') return INVALID_HOST;
|
|
742
|
+
result = parseIPv6(stringSlice(input, 1, -1));
|
|
743
|
+
if (!result) return INVALID_HOST;
|
|
744
|
+
this.host = result;
|
|
745
|
+
// opaque host
|
|
746
|
+
} else if (!this.isSpecial()) {
|
|
747
|
+
if (exec(FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT, input)) return INVALID_HOST;
|
|
748
|
+
result = '';
|
|
749
|
+
codePoints = arrayFrom(input);
|
|
750
|
+
for (index = 0; index < codePoints.length; index++) {
|
|
751
|
+
result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);
|
|
752
|
+
}
|
|
753
|
+
this.host = result;
|
|
754
|
+
} else {
|
|
755
|
+
input = toASCII(input);
|
|
756
|
+
if (exec(FORBIDDEN_HOST_CODE_POINT, input)) return INVALID_HOST;
|
|
757
|
+
result = parseIPv4(input);
|
|
758
|
+
if (result === null) return INVALID_HOST;
|
|
759
|
+
this.host = result;
|
|
760
|
+
}
|
|
761
|
+
},
|
|
762
|
+
// https://url.spec.whatwg.org/#cannot-have-a-username-password-port
|
|
763
|
+
cannotHaveUsernamePasswordPort: function () {
|
|
764
|
+
return !this.host || this.cannotBeABaseURL || this.scheme == 'file';
|
|
765
|
+
},
|
|
766
|
+
// https://url.spec.whatwg.org/#include-credentials
|
|
767
|
+
includesCredentials: function () {
|
|
768
|
+
return this.username != '' || this.password != '';
|
|
769
|
+
},
|
|
770
|
+
// https://url.spec.whatwg.org/#is-special
|
|
771
|
+
isSpecial: function () {
|
|
772
|
+
return hasOwn(specialSchemes, this.scheme);
|
|
773
|
+
},
|
|
774
|
+
// https://url.spec.whatwg.org/#shorten-a-urls-path
|
|
775
|
+
shortenPath: function () {
|
|
776
|
+
var path = this.path;
|
|
777
|
+
var pathSize = path.length;
|
|
778
|
+
if (pathSize && (this.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {
|
|
779
|
+
path.length--;
|
|
780
|
+
}
|
|
781
|
+
},
|
|
782
|
+
// https://url.spec.whatwg.org/#concept-url-serializer
|
|
783
|
+
serialize: function () {
|
|
784
|
+
var url = this;
|
|
785
|
+
var scheme = url.scheme;
|
|
786
|
+
var username = url.username;
|
|
787
|
+
var password = url.password;
|
|
788
|
+
var host = url.host;
|
|
789
|
+
var port = url.port;
|
|
790
|
+
var path = url.path;
|
|
791
|
+
var query = url.query;
|
|
792
|
+
var fragment = url.fragment;
|
|
793
|
+
var output = scheme + ':';
|
|
794
|
+
if (host !== null) {
|
|
795
|
+
output += '//';
|
|
796
|
+
if (url.includesCredentials()) {
|
|
797
|
+
output += username + (password ? ':' + password : '') + '@';
|
|
798
|
+
}
|
|
799
|
+
output += serializeHost(host);
|
|
800
|
+
if (port !== null) output += ':' + port;
|
|
801
|
+
} else if (scheme == 'file') output += '//';
|
|
802
|
+
output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : '';
|
|
803
|
+
if (query !== null) output += '?' + query;
|
|
804
|
+
if (fragment !== null) output += '#' + fragment;
|
|
805
|
+
return output;
|
|
806
|
+
},
|
|
807
|
+
// https://url.spec.whatwg.org/#dom-url-href
|
|
808
|
+
setHref: function (href) {
|
|
809
|
+
var failure = this.parse(href);
|
|
810
|
+
if (failure) throw TypeError(failure);
|
|
811
|
+
this.searchParams.update();
|
|
812
|
+
},
|
|
813
|
+
// https://url.spec.whatwg.org/#dom-url-origin
|
|
814
|
+
getOrigin: function () {
|
|
815
|
+
var scheme = this.scheme;
|
|
816
|
+
var port = this.port;
|
|
817
|
+
if (scheme == 'blob') try {
|
|
818
|
+
return new URLConstructor(scheme.path[0]).origin;
|
|
819
|
+
} catch (error) {
|
|
820
|
+
return 'null';
|
|
821
|
+
}
|
|
822
|
+
if (scheme == 'file' || !this.isSpecial()) return 'null';
|
|
823
|
+
return scheme + '://' + serializeHost(this.host) + (port !== null ? ':' + port : '');
|
|
824
|
+
},
|
|
825
|
+
// https://url.spec.whatwg.org/#dom-url-protocol
|
|
826
|
+
getProtocol: function () {
|
|
827
|
+
return this.scheme + ':';
|
|
828
|
+
},
|
|
829
|
+
setProtocol: function (protocol) {
|
|
830
|
+
this.parse($toString(protocol) + ':', SCHEME_START);
|
|
831
|
+
},
|
|
832
|
+
// https://url.spec.whatwg.org/#dom-url-username
|
|
833
|
+
getUsername: function () {
|
|
834
|
+
return this.username;
|
|
835
|
+
},
|
|
836
|
+
setUsername: function (username) {
|
|
837
|
+
var codePoints = arrayFrom($toString(username));
|
|
838
|
+
if (this.cannotHaveUsernamePasswordPort()) return;
|
|
839
|
+
this.username = '';
|
|
840
|
+
for (var i = 0; i < codePoints.length; i++) {
|
|
841
|
+
this.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);
|
|
842
|
+
}
|
|
843
|
+
},
|
|
844
|
+
// https://url.spec.whatwg.org/#dom-url-password
|
|
845
|
+
getPassword: function () {
|
|
846
|
+
return this.password;
|
|
847
|
+
},
|
|
848
|
+
setPassword: function (password) {
|
|
849
|
+
var codePoints = arrayFrom($toString(password));
|
|
850
|
+
if (this.cannotHaveUsernamePasswordPort()) return;
|
|
851
|
+
this.password = '';
|
|
852
|
+
for (var i = 0; i < codePoints.length; i++) {
|
|
853
|
+
this.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);
|
|
854
|
+
}
|
|
855
|
+
},
|
|
856
|
+
// https://url.spec.whatwg.org/#dom-url-host
|
|
857
|
+
getHost: function () {
|
|
858
|
+
var host = this.host;
|
|
859
|
+
var port = this.port;
|
|
860
|
+
return host === null ? ''
|
|
861
|
+
: port === null ? serializeHost(host)
|
|
862
|
+
: serializeHost(host) + ':' + port;
|
|
863
|
+
},
|
|
864
|
+
setHost: function (host) {
|
|
865
|
+
if (this.cannotBeABaseURL) return;
|
|
866
|
+
this.parse(host, HOST);
|
|
867
|
+
},
|
|
868
|
+
// https://url.spec.whatwg.org/#dom-url-hostname
|
|
869
|
+
getHostname: function () {
|
|
870
|
+
var host = this.host;
|
|
871
|
+
return host === null ? '' : serializeHost(host);
|
|
872
|
+
},
|
|
873
|
+
setHostname: function (hostname) {
|
|
874
|
+
if (this.cannotBeABaseURL) return;
|
|
875
|
+
this.parse(hostname, HOSTNAME);
|
|
876
|
+
},
|
|
877
|
+
// https://url.spec.whatwg.org/#dom-url-port
|
|
878
|
+
getPort: function () {
|
|
879
|
+
var port = this.port;
|
|
880
|
+
return port === null ? '' : $toString(port);
|
|
881
|
+
},
|
|
882
|
+
setPort: function (port) {
|
|
883
|
+
if (this.cannotHaveUsernamePasswordPort()) return;
|
|
884
|
+
port = $toString(port);
|
|
885
|
+
if (port == '') this.port = null;
|
|
886
|
+
else this.parse(port, PORT);
|
|
887
|
+
},
|
|
888
|
+
// https://url.spec.whatwg.org/#dom-url-pathname
|
|
889
|
+
getPathname: function () {
|
|
890
|
+
var path = this.path;
|
|
891
|
+
return this.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : '';
|
|
892
|
+
},
|
|
893
|
+
setPathname: function (pathname) {
|
|
894
|
+
if (this.cannotBeABaseURL) return;
|
|
895
|
+
this.path = [];
|
|
896
|
+
this.parse(pathname, PATH_START);
|
|
897
|
+
},
|
|
898
|
+
// https://url.spec.whatwg.org/#dom-url-search
|
|
899
|
+
getSearch: function () {
|
|
900
|
+
var query = this.query;
|
|
901
|
+
return query ? '?' + query : '';
|
|
902
|
+
},
|
|
903
|
+
setSearch: function (search) {
|
|
904
|
+
search = $toString(search);
|
|
905
|
+
if (search == '') {
|
|
906
|
+
this.query = null;
|
|
907
|
+
} else {
|
|
908
|
+
if ('?' == charAt(search, 0)) search = stringSlice(search, 1);
|
|
909
|
+
this.query = '';
|
|
910
|
+
this.parse(search, QUERY);
|
|
911
|
+
}
|
|
912
|
+
this.searchParams.update();
|
|
913
|
+
},
|
|
914
|
+
// https://url.spec.whatwg.org/#dom-url-searchparams
|
|
915
|
+
getSearchParams: function () {
|
|
916
|
+
return this.searchParams.facade;
|
|
917
|
+
},
|
|
918
|
+
// https://url.spec.whatwg.org/#dom-url-hash
|
|
919
|
+
getHash: function () {
|
|
920
|
+
var fragment = this.fragment;
|
|
921
|
+
return fragment ? '#' + fragment : '';
|
|
922
|
+
},
|
|
923
|
+
setHash: function (hash) {
|
|
924
|
+
hash = $toString(hash);
|
|
925
|
+
if (hash == '') {
|
|
926
|
+
this.fragment = null;
|
|
927
|
+
return;
|
|
928
|
+
}
|
|
929
|
+
if ('#' == charAt(hash, 0)) hash = stringSlice(hash, 1);
|
|
930
|
+
this.fragment = '';
|
|
931
|
+
this.parse(hash, FRAGMENT);
|
|
932
|
+
},
|
|
933
|
+
update: function () {
|
|
934
|
+
this.query = this.searchParams.serialize() || null;
|
|
731
935
|
}
|
|
732
936
|
};
|
|
733
937
|
|
|
734
938
|
// `URL` constructor
|
|
735
939
|
// https://url.spec.whatwg.org/#url-class
|
|
736
940
|
var URLConstructor = function URL(url /* , base */) {
|
|
737
|
-
var that = anInstance(this,
|
|
941
|
+
var that = anInstance(this, URLPrototype);
|
|
738
942
|
var base = arguments.length > 1 ? arguments[1] : undefined;
|
|
739
|
-
var
|
|
740
|
-
var state = setInternalState(that, { type: 'URL' });
|
|
741
|
-
var baseState, failure;
|
|
742
|
-
if (base !== undefined) {
|
|
743
|
-
if (base instanceof URLConstructor) baseState = getInternalURLState(base);
|
|
744
|
-
else {
|
|
745
|
-
failure = parseURL(baseState = {}, $toString(base));
|
|
746
|
-
if (failure) throw TypeError(failure);
|
|
747
|
-
}
|
|
748
|
-
}
|
|
749
|
-
failure = parseURL(state, urlString, null, baseState);
|
|
750
|
-
if (failure) throw TypeError(failure);
|
|
751
|
-
var searchParams = state.searchParams = new URLSearchParams();
|
|
752
|
-
var searchParamsState = getInternalSearchParamsState(searchParams);
|
|
753
|
-
searchParamsState.updateSearchParams(state.query);
|
|
754
|
-
searchParamsState.updateURL = function () {
|
|
755
|
-
state.query = String(searchParams) || null;
|
|
756
|
-
};
|
|
943
|
+
var state = setInternalState(that, new URLState(url, false, base));
|
|
757
944
|
if (!DESCRIPTORS) {
|
|
758
|
-
that.href =
|
|
759
|
-
that.origin = getOrigin
|
|
760
|
-
that.protocol = getProtocol
|
|
761
|
-
that.username = getUsername
|
|
762
|
-
that.password = getPassword
|
|
763
|
-
that.host = getHost
|
|
764
|
-
that.hostname = getHostname
|
|
765
|
-
that.port = getPort
|
|
766
|
-
that.pathname = getPathname
|
|
767
|
-
that.search = getSearch
|
|
768
|
-
that.searchParams = getSearchParams
|
|
769
|
-
that.hash = getHash
|
|
945
|
+
that.href = state.serialize();
|
|
946
|
+
that.origin = state.getOrigin();
|
|
947
|
+
that.protocol = state.getProtocol();
|
|
948
|
+
that.username = state.getUsername();
|
|
949
|
+
that.password = state.getPassword();
|
|
950
|
+
that.host = state.getHost();
|
|
951
|
+
that.hostname = state.getHostname();
|
|
952
|
+
that.port = state.getPort();
|
|
953
|
+
that.pathname = state.getPathname();
|
|
954
|
+
that.search = state.getSearch();
|
|
955
|
+
that.searchParams = state.getSearchParams();
|
|
956
|
+
that.hash = state.getHash();
|
|
770
957
|
}
|
|
771
958
|
};
|
|
772
959
|
|
|
773
960
|
var URLPrototype = URLConstructor.prototype;
|
|
774
961
|
|
|
775
|
-
var serializeURL = function () {
|
|
776
|
-
var url = getInternalURLState(this);
|
|
777
|
-
var scheme = url.scheme;
|
|
778
|
-
var username = url.username;
|
|
779
|
-
var password = url.password;
|
|
780
|
-
var host = url.host;
|
|
781
|
-
var port = url.port;
|
|
782
|
-
var path = url.path;
|
|
783
|
-
var query = url.query;
|
|
784
|
-
var fragment = url.fragment;
|
|
785
|
-
var output = scheme + ':';
|
|
786
|
-
if (host !== null) {
|
|
787
|
-
output += '//';
|
|
788
|
-
if (includesCredentials(url)) {
|
|
789
|
-
output += username + (password ? ':' + password : '') + '@';
|
|
790
|
-
}
|
|
791
|
-
output += serializeHost(host);
|
|
792
|
-
if (port !== null) output += ':' + port;
|
|
793
|
-
} else if (scheme == 'file') output += '//';
|
|
794
|
-
output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';
|
|
795
|
-
if (query !== null) output += '?' + query;
|
|
796
|
-
if (fragment !== null) output += '#' + fragment;
|
|
797
|
-
return output;
|
|
798
|
-
};
|
|
799
|
-
|
|
800
|
-
var getOrigin = function () {
|
|
801
|
-
var url = getInternalURLState(this);
|
|
802
|
-
var scheme = url.scheme;
|
|
803
|
-
var port = url.port;
|
|
804
|
-
if (scheme == 'blob') try {
|
|
805
|
-
return new URLConstructor(scheme.path[0]).origin;
|
|
806
|
-
} catch (error) {
|
|
807
|
-
return 'null';
|
|
808
|
-
}
|
|
809
|
-
if (scheme == 'file' || !isSpecial(url)) return 'null';
|
|
810
|
-
return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');
|
|
811
|
-
};
|
|
812
|
-
|
|
813
|
-
var getProtocol = function () {
|
|
814
|
-
return getInternalURLState(this).scheme + ':';
|
|
815
|
-
};
|
|
816
|
-
|
|
817
|
-
var getUsername = function () {
|
|
818
|
-
return getInternalURLState(this).username;
|
|
819
|
-
};
|
|
820
|
-
|
|
821
|
-
var getPassword = function () {
|
|
822
|
-
return getInternalURLState(this).password;
|
|
823
|
-
};
|
|
824
|
-
|
|
825
|
-
var getHost = function () {
|
|
826
|
-
var url = getInternalURLState(this);
|
|
827
|
-
var host = url.host;
|
|
828
|
-
var port = url.port;
|
|
829
|
-
return host === null ? ''
|
|
830
|
-
: port === null ? serializeHost(host)
|
|
831
|
-
: serializeHost(host) + ':' + port;
|
|
832
|
-
};
|
|
833
|
-
|
|
834
|
-
var getHostname = function () {
|
|
835
|
-
var host = getInternalURLState(this).host;
|
|
836
|
-
return host === null ? '' : serializeHost(host);
|
|
837
|
-
};
|
|
838
|
-
|
|
839
|
-
var getPort = function () {
|
|
840
|
-
var port = getInternalURLState(this).port;
|
|
841
|
-
return port === null ? '' : String(port);
|
|
842
|
-
};
|
|
843
|
-
|
|
844
|
-
var getPathname = function () {
|
|
845
|
-
var url = getInternalURLState(this);
|
|
846
|
-
var path = url.path;
|
|
847
|
-
return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';
|
|
848
|
-
};
|
|
849
|
-
|
|
850
|
-
var getSearch = function () {
|
|
851
|
-
var query = getInternalURLState(this).query;
|
|
852
|
-
return query ? '?' + query : '';
|
|
853
|
-
};
|
|
854
|
-
|
|
855
|
-
var getSearchParams = function () {
|
|
856
|
-
return getInternalURLState(this).searchParams;
|
|
857
|
-
};
|
|
858
|
-
|
|
859
|
-
var getHash = function () {
|
|
860
|
-
var fragment = getInternalURLState(this).fragment;
|
|
861
|
-
return fragment ? '#' + fragment : '';
|
|
862
|
-
};
|
|
863
|
-
|
|
864
962
|
var accessorDescriptor = function (getter, setter) {
|
|
865
|
-
return {
|
|
963
|
+
return {
|
|
964
|
+
get: function () {
|
|
965
|
+
return getInternalURLState(this)[getter]();
|
|
966
|
+
},
|
|
967
|
+
set: setter && function (value) {
|
|
968
|
+
return getInternalURLState(this)[setter](value);
|
|
969
|
+
},
|
|
970
|
+
configurable: true,
|
|
971
|
+
enumerable: true
|
|
972
|
+
};
|
|
866
973
|
};
|
|
867
974
|
|
|
868
975
|
if (DESCRIPTORS) {
|
|
869
976
|
defineProperties(URLPrototype, {
|
|
870
977
|
// `URL.prototype.href` accessors pair
|
|
871
978
|
// https://url.spec.whatwg.org/#dom-url-href
|
|
872
|
-
href: accessorDescriptor(
|
|
873
|
-
var url = getInternalURLState(this);
|
|
874
|
-
var urlString = $toString(href);
|
|
875
|
-
var failure = parseURL(url, urlString);
|
|
876
|
-
if (failure) throw TypeError(failure);
|
|
877
|
-
getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);
|
|
878
|
-
}),
|
|
979
|
+
href: accessorDescriptor('serialize', 'setHref'),
|
|
879
980
|
// `URL.prototype.origin` getter
|
|
880
981
|
// https://url.spec.whatwg.org/#dom-url-origin
|
|
881
|
-
origin: accessorDescriptor(getOrigin),
|
|
982
|
+
origin: accessorDescriptor('getOrigin'),
|
|
882
983
|
// `URL.prototype.protocol` accessors pair
|
|
883
984
|
// https://url.spec.whatwg.org/#dom-url-protocol
|
|
884
|
-
protocol: accessorDescriptor(getProtocol,
|
|
885
|
-
var url = getInternalURLState(this);
|
|
886
|
-
parseURL(url, $toString(protocol) + ':', SCHEME_START);
|
|
887
|
-
}),
|
|
985
|
+
protocol: accessorDescriptor('getProtocol', 'setProtocol'),
|
|
888
986
|
// `URL.prototype.username` accessors pair
|
|
889
987
|
// https://url.spec.whatwg.org/#dom-url-username
|
|
890
|
-
username: accessorDescriptor(getUsername,
|
|
891
|
-
var url = getInternalURLState(this);
|
|
892
|
-
var codePoints = arrayFrom($toString(username));
|
|
893
|
-
if (cannotHaveUsernamePasswordPort(url)) return;
|
|
894
|
-
url.username = '';
|
|
895
|
-
for (var i = 0; i < codePoints.length; i++) {
|
|
896
|
-
url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);
|
|
897
|
-
}
|
|
898
|
-
}),
|
|
988
|
+
username: accessorDescriptor('getUsername', 'setUsername'),
|
|
899
989
|
// `URL.prototype.password` accessors pair
|
|
900
990
|
// https://url.spec.whatwg.org/#dom-url-password
|
|
901
|
-
password: accessorDescriptor(getPassword,
|
|
902
|
-
var url = getInternalURLState(this);
|
|
903
|
-
var codePoints = arrayFrom($toString(password));
|
|
904
|
-
if (cannotHaveUsernamePasswordPort(url)) return;
|
|
905
|
-
url.password = '';
|
|
906
|
-
for (var i = 0; i < codePoints.length; i++) {
|
|
907
|
-
url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);
|
|
908
|
-
}
|
|
909
|
-
}),
|
|
991
|
+
password: accessorDescriptor('getPassword', 'setPassword'),
|
|
910
992
|
// `URL.prototype.host` accessors pair
|
|
911
993
|
// https://url.spec.whatwg.org/#dom-url-host
|
|
912
|
-
host: accessorDescriptor(getHost,
|
|
913
|
-
var url = getInternalURLState(this);
|
|
914
|
-
if (url.cannotBeABaseURL) return;
|
|
915
|
-
parseURL(url, $toString(host), HOST);
|
|
916
|
-
}),
|
|
994
|
+
host: accessorDescriptor('getHost', 'setHost'),
|
|
917
995
|
// `URL.prototype.hostname` accessors pair
|
|
918
996
|
// https://url.spec.whatwg.org/#dom-url-hostname
|
|
919
|
-
hostname: accessorDescriptor(getHostname,
|
|
920
|
-
var url = getInternalURLState(this);
|
|
921
|
-
if (url.cannotBeABaseURL) return;
|
|
922
|
-
parseURL(url, $toString(hostname), HOSTNAME);
|
|
923
|
-
}),
|
|
997
|
+
hostname: accessorDescriptor('getHostname', 'setHostname'),
|
|
924
998
|
// `URL.prototype.port` accessors pair
|
|
925
999
|
// https://url.spec.whatwg.org/#dom-url-port
|
|
926
|
-
port: accessorDescriptor(getPort,
|
|
927
|
-
var url = getInternalURLState(this);
|
|
928
|
-
if (cannotHaveUsernamePasswordPort(url)) return;
|
|
929
|
-
port = $toString(port);
|
|
930
|
-
if (port == '') url.port = null;
|
|
931
|
-
else parseURL(url, port, PORT);
|
|
932
|
-
}),
|
|
1000
|
+
port: accessorDescriptor('getPort', 'setPort'),
|
|
933
1001
|
// `URL.prototype.pathname` accessors pair
|
|
934
1002
|
// https://url.spec.whatwg.org/#dom-url-pathname
|
|
935
|
-
pathname: accessorDescriptor(getPathname,
|
|
936
|
-
var url = getInternalURLState(this);
|
|
937
|
-
if (url.cannotBeABaseURL) return;
|
|
938
|
-
url.path = [];
|
|
939
|
-
parseURL(url, $toString(pathname), PATH_START);
|
|
940
|
-
}),
|
|
1003
|
+
pathname: accessorDescriptor('getPathname', 'setPathname'),
|
|
941
1004
|
// `URL.prototype.search` accessors pair
|
|
942
1005
|
// https://url.spec.whatwg.org/#dom-url-search
|
|
943
|
-
search: accessorDescriptor(getSearch,
|
|
944
|
-
var url = getInternalURLState(this);
|
|
945
|
-
search = $toString(search);
|
|
946
|
-
if (search == '') {
|
|
947
|
-
url.query = null;
|
|
948
|
-
} else {
|
|
949
|
-
if ('?' == search.charAt(0)) search = search.slice(1);
|
|
950
|
-
url.query = '';
|
|
951
|
-
parseURL(url, search, QUERY);
|
|
952
|
-
}
|
|
953
|
-
getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);
|
|
954
|
-
}),
|
|
1006
|
+
search: accessorDescriptor('getSearch', 'setSearch'),
|
|
955
1007
|
// `URL.prototype.searchParams` getter
|
|
956
1008
|
// https://url.spec.whatwg.org/#dom-url-searchparams
|
|
957
|
-
searchParams: accessorDescriptor(getSearchParams),
|
|
1009
|
+
searchParams: accessorDescriptor('getSearchParams'),
|
|
958
1010
|
// `URL.prototype.hash` accessors pair
|
|
959
1011
|
// https://url.spec.whatwg.org/#dom-url-hash
|
|
960
|
-
hash: accessorDescriptor(getHash,
|
|
961
|
-
var url = getInternalURLState(this);
|
|
962
|
-
hash = $toString(hash);
|
|
963
|
-
if (hash == '') {
|
|
964
|
-
url.fragment = null;
|
|
965
|
-
return;
|
|
966
|
-
}
|
|
967
|
-
if ('#' == hash.charAt(0)) hash = hash.slice(1);
|
|
968
|
-
url.fragment = '';
|
|
969
|
-
parseURL(url, hash, FRAGMENT);
|
|
970
|
-
})
|
|
1012
|
+
hash: accessorDescriptor('getHash', 'setHash')
|
|
971
1013
|
});
|
|
972
1014
|
}
|
|
973
1015
|
|
|
974
1016
|
// `URL.prototype.toJSON` method
|
|
975
1017
|
// https://url.spec.whatwg.org/#dom-url-tojson
|
|
976
1018
|
redefine(URLPrototype, 'toJSON', function toJSON() {
|
|
977
|
-
return
|
|
1019
|
+
return getInternalURLState(this).serialize();
|
|
978
1020
|
}, { enumerable: true });
|
|
979
1021
|
|
|
980
1022
|
// `URL.prototype.toString` method
|
|
981
1023
|
// https://url.spec.whatwg.org/#URL-stringification-behavior
|
|
982
1024
|
redefine(URLPrototype, 'toString', function toString() {
|
|
983
|
-
return
|
|
1025
|
+
return getInternalURLState(this).serialize();
|
|
984
1026
|
}, { enumerable: true });
|
|
985
1027
|
|
|
986
1028
|
if (NativeURL) {
|
|
@@ -988,16 +1030,10 @@ if (NativeURL) {
|
|
|
988
1030
|
var nativeRevokeObjectURL = NativeURL.revokeObjectURL;
|
|
989
1031
|
// `URL.createObjectURL` method
|
|
990
1032
|
// https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
|
|
991
|
-
|
|
992
|
-
if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {
|
|
993
|
-
return nativeCreateObjectURL.apply(NativeURL, arguments);
|
|
994
|
-
});
|
|
1033
|
+
if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', bind(nativeCreateObjectURL, NativeURL));
|
|
995
1034
|
// `URL.revokeObjectURL` method
|
|
996
1035
|
// https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL
|
|
997
|
-
|
|
998
|
-
if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {
|
|
999
|
-
return nativeRevokeObjectURL.apply(NativeURL, arguments);
|
|
1000
|
-
});
|
|
1036
|
+
if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', bind(nativeRevokeObjectURL, NativeURL));
|
|
1001
1037
|
}
|
|
1002
1038
|
|
|
1003
1039
|
setToStringTag(URLConstructor, 'URL');
|