url-constructor-detection.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536
  1. var fails = require('../internals/fails');
  2. var wellKnownSymbol = require('../internals/well-known-symbol');
  3. var DESCRIPTORS = require('../internals/descriptors');
  4. var IS_PURE = require('../internals/is-pure');
  5. var ITERATOR = wellKnownSymbol('iterator');
  6. module.exports = !fails(function () {
  7. // eslint-disable-next-line unicorn/relative-url-style -- required for testing
  8. var url = new URL('b?a=1&b=2&c=3', 'http://a');
  9. var searchParams = url.searchParams;
  10. var result = '';
  11. url.pathname = 'c%20d';
  12. searchParams.forEach(function (value, key) {
  13. searchParams['delete']('b');
  14. result += key + value;
  15. });
  16. return (IS_PURE && !url.toJSON)
  17. || (!searchParams.size && (IS_PURE || !DESCRIPTORS))
  18. || !searchParams.sort
  19. || url.href !== 'http://a/c%20d?a=1&c=3'
  20. || searchParams.get('c') !== '3'
  21. || String(new URLSearchParams('?a=1')) !== 'a=1'
  22. || !searchParams[ITERATOR]
  23. // throws in Edge
  24. || new URL('https://a@b').username !== 'a'
  25. || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'
  26. // not punycoded in Edge
  27. || new URL('http://тест').host !== 'xn--e1aybc'
  28. // not escaped in Chrome 62-
  29. || new URL('http://a#б').hash !== '#%D0%B1'
  30. // fails in Chrome 66-
  31. || result !== 'a1c3'
  32. // throws in Safari
  33. || new URL('http://x', undefined).host !== 'x';
  34. });