set-method-accept-set-like.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. 'use strict';
  2. var getBuiltIn = require('../internals/get-built-in');
  3. var createSetLike = function (size) {
  4. return {
  5. size: size,
  6. has: function () {
  7. return false;
  8. },
  9. keys: function () {
  10. return {
  11. next: function () {
  12. return { done: true };
  13. }
  14. };
  15. }
  16. };
  17. };
  18. var createSetLikeWithInfinitySize = function (size) {
  19. return {
  20. size: size,
  21. has: function () {
  22. return true;
  23. },
  24. keys: function () {
  25. throw new Error('e');
  26. }
  27. };
  28. };
  29. module.exports = function (name, callback) {
  30. var Set = getBuiltIn('Set');
  31. try {
  32. new Set()[name](createSetLike(0));
  33. try {
  34. // late spec change, early WebKit ~ Safari 17 implementation does not pass it
  35. // https://github.com/tc39/proposal-set-methods/pull/88
  36. // also covered engines with
  37. // https://bugs.webkit.org/show_bug.cgi?id=272679
  38. new Set()[name](createSetLike(-1));
  39. return false;
  40. } catch (error2) {
  41. if (!callback) return true;
  42. // early V8 implementation bug
  43. // https://issues.chromium.org/issues/351332634
  44. try {
  45. new Set()[name](createSetLikeWithInfinitySize(-Infinity));
  46. return false;
  47. } catch (error) {
  48. var set = new Set();
  49. set.add(1);
  50. set.add(2);
  51. return callback(set[name](createSetLikeWithInfinitySize(Infinity)));
  52. }
  53. }
  54. } catch (error) {
  55. return false;
  56. }
  57. };